1
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
3
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4
# not use this file except in compliance with the License. You may obtain
5
# a copy of the License at
7
# http://www.apache.org/licenses/LICENSE-2.0
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
# License for the specific language governing permissions and limitations
19
from neutron.api import extensions
20
from neutron.common import config
21
from neutron.common import constants as n_consts
22
from neutron import context
23
import neutron.extensions
24
from neutron.extensions import metering
25
from neutron.plugins.common import constants
26
from neutron.services.metering import metering_plugin
27
from neutron.tests.unit.db import test_db_base_plugin_v2
29
DB_METERING_PLUGIN_KLASS = (
30
"neutron.services.metering."
31
"metering_plugin.MeteringPlugin"
34
extensions_path = ':'.join(neutron.extensions.__path__)
37
class MeteringPluginDbTestCaseMixin(object):
38
def _create_metering_label(self, fmt, name, description, **kwargs):
39
data = {'metering_label': {'name': name,
40
'tenant_id': kwargs.get('tenant_id',
42
'shared': kwargs.get('shared', False),
43
'description': description}}
44
req = self.new_create_request('metering-labels', data,
47
if kwargs.get('set_context') and 'tenant_id' in kwargs:
48
# create a specific auth context for this request
49
req.environ['neutron.context'] = (
50
context.Context('', kwargs['tenant_id'],
51
is_admin=kwargs.get('is_admin', True)))
53
return req.get_response(self.ext_api)
55
def _make_metering_label(self, fmt, name, description, **kwargs):
56
res = self._create_metering_label(fmt, name, description, **kwargs)
57
if res.status_int >= 400:
58
raise webob.exc.HTTPClientError(code=res.status_int)
59
return self.deserialize(fmt, res)
61
def _create_metering_label_rule(self, fmt, metering_label_id, direction,
62
remote_ip_prefix, excluded, **kwargs):
63
data = {'metering_label_rule':
64
{'metering_label_id': metering_label_id,
65
'tenant_id': kwargs.get('tenant_id', 'test-tenant'),
66
'direction': direction,
68
'remote_ip_prefix': remote_ip_prefix}}
69
req = self.new_create_request('metering-label-rules',
72
if kwargs.get('set_context') and 'tenant_id' in kwargs:
73
# create a specific auth context for this request
74
req.environ['neutron.context'] = (
75
context.Context('', kwargs['tenant_id']))
77
return req.get_response(self.ext_api)
79
def _make_metering_label_rule(self, fmt, metering_label_id, direction,
80
remote_ip_prefix, excluded, **kwargs):
81
res = self._create_metering_label_rule(fmt, metering_label_id,
82
direction, remote_ip_prefix,
84
if res.status_int >= 400:
85
raise webob.exc.HTTPClientError(code=res.status_int)
86
return self.deserialize(fmt, res)
88
@contextlib.contextmanager
89
def metering_label(self, name='label', description='desc',
93
metering_label = self._make_metering_label(fmt, name,
94
description, **kwargs)
97
@contextlib.contextmanager
98
def metering_label_rule(self, metering_label_id=None, direction='ingress',
99
remote_ip_prefix='10.0.0.0/24',
100
excluded='false', fmt=None):
103
metering_label_rule = self._make_metering_label_rule(fmt,
108
yield metering_label_rule
111
class MeteringPluginDbTestCase(
112
test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
113
MeteringPluginDbTestCaseMixin):
116
resource_prefix_map = dict(
117
(k.replace('_', '-'), constants.COMMON_PREFIXES[constants.METERING])
118
for k in metering.RESOURCE_ATTRIBUTE_MAP.keys()
121
def setUp(self, plugin=None):
122
service_plugins = {'metering_plugin_name': DB_METERING_PLUGIN_KLASS}
124
super(MeteringPluginDbTestCase, self).setUp(
126
service_plugins=service_plugins
129
self.plugin = metering_plugin.MeteringPlugin()
130
ext_mgr = extensions.PluginAwareExtensionManager(
132
{constants.METERING: self.plugin}
134
app = config.load_paste_app('extensions_test_app')
135
self.ext_api = extensions.ExtensionMiddleware(app, ext_mgr=ext_mgr)
138
class TestMetering(MeteringPluginDbTestCase):
139
def test_create_metering_label(self):
141
description = 'my metering label'
142
keys = [('name', name,), ('description', description)]
143
with self.metering_label(name, description) as metering_label:
145
self.assertEqual(metering_label['metering_label'][k], v)
147
def test_create_metering_label_shared(self):
149
description = 'my metering label'
151
keys = [('name', name,), ('description', description),
153
with self.metering_label(name, description,
154
shared=shared) as metering_label:
156
self.assertEqual(metering_label['metering_label'][k], v)
158
def test_delete_metering_label(self):
160
description = 'my metering label'
162
with self.metering_label(name, description) as metering_label:
163
metering_label_id = metering_label['metering_label']['id']
164
self._delete('metering-labels', metering_label_id, 204)
166
def test_list_metering_label(self):
168
description = 'my metering label'
170
with contextlib.nested(
171
self.metering_label(name, description),
172
self.metering_label(name, description)) as metering_label:
174
self._test_list_resources('metering-label', metering_label)
176
def test_create_metering_label_rule(self):
178
description = 'my metering label'
180
with self.metering_label(name, description) as metering_label:
181
metering_label_id = metering_label['metering_label']['id']
184
remote_ip_prefix = '192.168.0.0/24'
187
keys = [('metering_label_id', metering_label_id),
188
('direction', direction),
189
('excluded', excluded),
190
('remote_ip_prefix', remote_ip_prefix)]
191
with self.metering_label_rule(metering_label_id,
194
excluded) as label_rule:
196
self.assertEqual(label_rule['metering_label_rule'][k], v)
198
def test_delete_metering_label_rule(self):
200
description = 'my metering label'
202
with self.metering_label(name, description) as metering_label:
203
metering_label_id = metering_label['metering_label']['id']
206
remote_ip_prefix = '192.168.0.0/24'
209
with self.metering_label_rule(metering_label_id,
212
excluded) as label_rule:
213
rule_id = label_rule['metering_label_rule']['id']
214
self._delete('metering-label-rules', rule_id, 204)
216
def test_list_metering_label_rule(self):
218
description = 'my metering label'
220
with self.metering_label(name, description) as metering_label:
221
metering_label_id = metering_label['metering_label']['id']
224
remote_ip_prefix = '192.168.0.0/24'
227
with contextlib.nested(
228
self.metering_label_rule(metering_label_id,
232
self.metering_label_rule(metering_label_id,
235
excluded)) as metering_label_rule:
237
self._test_list_resources('metering-label-rule',
240
def test_create_metering_label_rules(self):
242
description = 'my metering label'
244
with self.metering_label(name, description) as metering_label:
245
metering_label_id = metering_label['metering_label']['id']
248
remote_ip_prefix = '192.168.0.0/24'
251
with contextlib.nested(
252
self.metering_label_rule(metering_label_id,
256
self.metering_label_rule(metering_label_id,
259
False)) as metering_label_rule:
261
self._test_list_resources('metering-label-rule',
264
def test_create_overlap_metering_label_rules(self):
266
description = 'my metering label'
268
with self.metering_label(name, description) as metering_label:
269
metering_label_id = metering_label['metering_label']['id']
272
remote_ip_prefix1 = '192.168.0.0/24'
273
remote_ip_prefix2 = '192.168.0.0/16'
276
with self.metering_label_rule(metering_label_id,
280
res = self._create_metering_label_rule(self.fmt,
285
self.assertEqual(webob.exc.HTTPConflict.code, res.status_int)
287
def test_create_metering_label_rule_two_labels(self):
290
description = 'my metering label'
292
with self.metering_label(name1, description) as metering_label1:
293
metering_label_id1 = metering_label1['metering_label']['id']
295
with self.metering_label(name2, description) as metering_label2:
296
metering_label_id2 = metering_label2['metering_label']['id']
299
remote_ip_prefix = '192.168.0.0/24'
302
with contextlib.nested(
303
self.metering_label_rule(metering_label_id1,
307
self.metering_label_rule(metering_label_id2,
310
excluded)) as metering_label_rule:
312
self._test_list_resources('metering-label-rule',