Skip to content

Commit 944333b

Browse files
author
Sylvain Afchain
committed
Client for metering extension
blueprint bandwidth-router-label Change-Id: I4d55c0f950d380c89e0d17c08facfe9ed078dd8e
1 parent a3f5d0a commit 944333b

File tree

5 files changed

+301
-2
lines changed

5 files changed

+301
-2
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# Copyright (C) 2013 eNovance SAS <[email protected]>
2+
#
3+
# Author: Sylvain Afchain <[email protected]>
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
6+
# not use this file except in compliance with the License. You may obtain
7+
# a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14+
# License for the specific language governing permissions and limitations
15+
# under the License.
16+
17+
import logging
18+
19+
from neutronclient.neutron import v2_0 as neutronv20
20+
21+
22+
class ListMeteringLabel(neutronv20.ListCommand):
23+
"""List metering labels that belong to a given tenant."""
24+
25+
resource = 'metering_label'
26+
log = logging.getLogger(__name__ + '.ListMeteringLabel')
27+
list_columns = ['id', 'name', 'description']
28+
pagination_support = True
29+
sorting_support = True
30+
31+
32+
class ShowMeteringLabel(neutronv20.ShowCommand):
33+
"""Show information of a given metering label."""
34+
35+
resource = 'metering_label'
36+
log = logging.getLogger(__name__ + '.ShowMeteringLabel')
37+
allow_names = True
38+
39+
40+
class CreateMeteringLabel(neutronv20.CreateCommand):
41+
"""Create a metering label for a given tenant."""
42+
43+
resource = 'metering_label'
44+
log = logging.getLogger(__name__ + '.CreateMeteringLabel')
45+
46+
def add_known_arguments(self, parser):
47+
parser.add_argument(
48+
'name', metavar='NAME',
49+
help='Name of metering label to create')
50+
parser.add_argument(
51+
'--description',
52+
help='description of metering label to create')
53+
54+
def args2body(self, parsed_args):
55+
body = {'metering_label': {
56+
'name': parsed_args.name}, }
57+
58+
if parsed_args.tenant_id:
59+
body['metering_label'].update({'tenant_id': parsed_args.tenant_id})
60+
if parsed_args.description:
61+
body['metering_label'].update(
62+
{'description': parsed_args.description})
63+
return body
64+
65+
66+
class DeleteMeteringLabel(neutronv20.DeleteCommand):
67+
"""Delete a given metering label."""
68+
69+
log = logging.getLogger(__name__ + '.DeleteMeteringLabel')
70+
resource = 'metering_label'
71+
allow_names = True
72+
73+
74+
class ListMeteringLabelRule(neutronv20.ListCommand):
75+
"""List metering labels that belong to a given label."""
76+
77+
resource = 'metering_label_rule'
78+
log = logging.getLogger(__name__ + '.ListMeteringLabelRule')
79+
list_columns = ['id', 'excluded', 'direction', 'remote_ip_prefix']
80+
pagination_support = True
81+
sorting_support = True
82+
83+
84+
class ShowMeteringLabelRule(neutronv20.ShowCommand):
85+
"""Show information of a given metering label rule."""
86+
87+
resource = 'metering_label_rule'
88+
log = logging.getLogger(__name__ + '.ShowMeteringLabelRule')
89+
90+
91+
class CreateMeteringLabelRule(neutronv20.CreateCommand):
92+
"""Create a metering label rule for a given label."""
93+
94+
resource = 'metering_label_rule'
95+
log = logging.getLogger(__name__ + '.CreateMeteringLabelRule')
96+
97+
def add_known_arguments(self, parser):
98+
parser.add_argument(
99+
'label_id', metavar='LABEL',
100+
help='Id or Name of the label')
101+
parser.add_argument(
102+
'remote_ip_prefix', metavar='REMOTE_IP_PREFIX',
103+
help='cidr to match on')
104+
parser.add_argument(
105+
'--direction',
106+
default='ingress', choices=['ingress', 'egress'],
107+
help='direction of traffic, default:ingress')
108+
parser.add_argument(
109+
'--excluded',
110+
action='store_true',
111+
help='exclude this cidr from the label, default:not excluded')
112+
113+
def args2body(self, parsed_args):
114+
neutron_client = self.get_client()
115+
neutron_client.format = parsed_args.request_format
116+
label_id = neutronv20.find_resourceid_by_name_or_id(
117+
neutron_client, 'metering_label', parsed_args.label_id)
118+
119+
body = {'metering_label_rule': {
120+
'metering_label_id': label_id,
121+
'remote_ip_prefix': parsed_args.remote_ip_prefix
122+
}}
123+
124+
if parsed_args.direction:
125+
body['metering_label_rule'].update(
126+
{'direction': parsed_args.direction})
127+
if parsed_args.excluded:
128+
body['metering_label_rule'].update(
129+
{'excluded': True})
130+
return body
131+
132+
133+
class DeleteMeteringLabelRule(neutronv20.DeleteCommand):
134+
"""Delete a given metering label."""
135+
136+
log = logging.getLogger(__name__ + '.DeleteMeteringLabelRule')
137+
resource = 'metering_label_rule'

neutronclient/shell.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
from neutronclient.neutron.v2_0.lb import member as lb_member
4343
from neutronclient.neutron.v2_0.lb import pool as lb_pool
4444
from neutronclient.neutron.v2_0.lb import vip as lb_vip
45+
from neutronclient.neutron.v2_0 import metering
4546
from neutronclient.neutron.v2_0 import network
4647
from neutronclient.neutron.v2_0 import networkprofile
4748
from neutronclient.neutron.v2_0 import nvp_qos_queue
@@ -250,6 +251,14 @@ def env(*_vars, **kwargs):
250251
'vpn-ikepolicy-create': ikepolicy.CreateIKEPolicy,
251252
'vpn-ikepolicy-update': ikepolicy.UpdateIKEPolicy,
252253
'vpn-ikepolicy-delete': ikepolicy.DeleteIKEPolicy,
254+
'meter-label-create': metering.CreateMeteringLabel,
255+
'meter-label-list': metering.ListMeteringLabel,
256+
'meter-label-show': metering.ShowMeteringLabel,
257+
'meter-label-delete': metering.DeleteMeteringLabel,
258+
'meter-label-rule-create': metering.CreateMeteringLabelRule,
259+
'meter-label-rule-list': metering.ListMeteringLabelRule,
260+
'meter-label-rule-show': metering.ShowMeteringLabelRule,
261+
'meter-label-rule-delete': metering.DeleteMeteringLabelRule,
253262
}
254263

255264
COMMANDS = {'2.0': COMMAND_V2}

neutronclient/tests/unit/test_cli20.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ def _test_create_resource(self, resource, cmd,
189189
'security_group_rule', 'qos_queue',
190190
'network_gateway', 'credential',
191191
'network_profile', 'policy_profile',
192-
'ikepolicy', 'ipsecpolicy']
192+
'ikepolicy', 'ipsecpolicy',
193+
'metering_label', 'metering_label_rule']
193194
if (resource in non_admin_status_resources):
194195
body = {resource: {}, }
195196
else:
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# Copyright (C) 2013 eNovance SAS <[email protected]>
2+
#
3+
# Author: Sylvain Afchain <[email protected]>
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
6+
# not use this file except in compliance with the License. You may obtain
7+
# a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14+
# License for the specific language governing permissions and limitations
15+
# under the License.
16+
17+
import sys
18+
19+
from neutronclient.neutron.v2_0 import metering
20+
from neutronclient.tests.unit import test_cli20
21+
22+
23+
class CLITestV20MeteringJSON(test_cli20.CLITestV20Base):
24+
def test_create_metering_label(self):
25+
"""Create a metering label."""
26+
resource = 'metering_label'
27+
cmd = metering.CreateMeteringLabel(
28+
test_cli20.MyApp(sys.stdout), None)
29+
name = 'my label'
30+
myid = 'myid'
31+
description = 'my description'
32+
args = [name, '--description', description]
33+
position_names = ['name', 'description']
34+
position_values = [name, description]
35+
self._test_create_resource(resource, cmd, name, myid, args,
36+
position_names, position_values)
37+
38+
def test_list_metering_labels(self):
39+
resources = "metering_labels"
40+
cmd = metering.ListMeteringLabel(
41+
test_cli20.MyApp(sys.stdout), None)
42+
self._test_list_resources(resources, cmd)
43+
44+
def test_delete_metering_label(self):
45+
"""Delete a metering label."""
46+
resource = 'metering_label'
47+
cmd = metering.DeleteMeteringLabel(
48+
test_cli20.MyApp(sys.stdout), None)
49+
myid = 'myid'
50+
args = [myid]
51+
self._test_delete_resource(resource, cmd, myid, args)
52+
53+
def test_show_metering_label(self):
54+
resource = 'metering_label'
55+
cmd = metering.ShowMeteringLabel(
56+
test_cli20.MyApp(sys.stdout), None)
57+
args = ['--fields', 'id', self.test_id]
58+
self._test_show_resource(resource, cmd, self.test_id,
59+
args, ['id'])
60+
61+
def test_create_metering_label_rule(self):
62+
resource = 'metering_label_rule'
63+
cmd = metering.CreateMeteringLabelRule(
64+
test_cli20.MyApp(sys.stdout), None)
65+
myid = 'myid'
66+
metering_label_id = 'aaa'
67+
remote_ip_prefix = '10.0.0.0/24'
68+
direction = 'ingress'
69+
args = [metering_label_id, remote_ip_prefix, '--direction', direction,
70+
'--excluded']
71+
position_names = ['metering_label_id', 'remote_ip_prefix', 'direction',
72+
'excluded']
73+
position_values = [metering_label_id, remote_ip_prefix,
74+
direction, True]
75+
self._test_create_resource(resource, cmd, metering_label_id,
76+
myid, args, position_names, position_values)
77+
78+
def test_list_metering_label_rules(self):
79+
resources = "metering_label_rules"
80+
cmd = metering.ListMeteringLabelRule(
81+
test_cli20.MyApp(sys.stdout), None)
82+
self._test_list_resources(resources, cmd)
83+
84+
def test_delete_metering_label_rule(self):
85+
resource = 'metering_label_rule'
86+
cmd = metering.DeleteMeteringLabelRule(
87+
test_cli20.MyApp(sys.stdout), None)
88+
myid = 'myid'
89+
args = [myid]
90+
self._test_delete_resource(resource, cmd, myid, args)
91+
92+
def test_show_metering_label_rule(self):
93+
resource = 'metering_label_rule'
94+
cmd = metering.ShowMeteringLabelRule(
95+
test_cli20.MyApp(sys.stdout), None)
96+
args = ['--fields', 'id', self.test_id]
97+
self._test_show_resource(resource, cmd, self.test_id,
98+
args, ['id'])
99+
100+
101+
class CLITestV20MeteringXML(CLITestV20MeteringJSON):
102+
format = 'xml'

neutronclient/v2_0/client.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,10 @@ class Client(object):
200200
policy_profiles_path = "/policy_profiles"
201201
policy_profile_path = "/policy_profiles/%s"
202202
policy_profile_bindings_path = "/policy_profile_bindings"
203-
203+
metering_labels_path = "/metering/metering-labels"
204+
metering_label_path = "/metering/metering-labels/%s"
205+
metering_label_rules_path = "/metering/metering-label-rules"
206+
metering_label_rule_path = "/metering/metering-label-rules/%s"
204207
DHCP_NETS = '/dhcp-networks'
205208
DHCP_AGENTS = '/dhcp-agents'
206209
L3_ROUTERS = '/l3-routers'
@@ -236,6 +239,8 @@ class Client(object):
236239
'firewall_rules': 'firewall_rule',
237240
'firewall_policies': 'firewall_policy',
238241
'firewalls': 'firewall',
242+
'metering_labels': 'metering_label',
243+
'metering_label_rules': 'metering_label_rule'
239244
}
240245
# 8192 Is the default max URI len for eventlet.wsgi.server
241246
MAX_URI_LEN = 8192
@@ -1057,6 +1062,51 @@ def update_policy_profile(self, profile, body=None):
10571062
"""Update a policy profile."""
10581063
return self.put(self.policy_profile_path % (profile), body=body)
10591064

1065+
@APIParamsCall
1066+
def create_metering_label(self, body=None):
1067+
"""Creates a metering label."""
1068+
return self.post(self.metering_labels_path, body=body)
1069+
1070+
@APIParamsCall
1071+
def delete_metering_label(self, label):
1072+
"""Deletes the specified metering label."""
1073+
return self.delete(self.metering_label_path % (label))
1074+
1075+
@APIParamsCall
1076+
def list_metering_labels(self, retrieve_all=True, **_params):
1077+
"""Fetches a list of all metering labels for a tenant."""
1078+
return self.list('metering_labels', self.metering_labels_path,
1079+
retrieve_all, **_params)
1080+
1081+
@APIParamsCall
1082+
def show_metering_label(self, metering_label, **_params):
1083+
"""Fetches information of a certain metering label."""
1084+
return self.get(self.metering_label_path %
1085+
(metering_label), params=_params)
1086+
1087+
@APIParamsCall
1088+
def create_metering_label_rule(self, body=None):
1089+
"""Creates a metering label rule."""
1090+
return self.post(self.metering_label_rules_path, body=body)
1091+
1092+
@APIParamsCall
1093+
def delete_metering_label_rule(self, rule):
1094+
"""Deletes the specified metering label rule."""
1095+
return self.delete(self.metering_label_rule_path % (rule))
1096+
1097+
@APIParamsCall
1098+
def list_metering_label_rules(self, retrieve_all=True, **_params):
1099+
"""Fetches a list of all metering label rules for a label."""
1100+
return self.list('metering_label_rules',
1101+
self.metering_label_rules_path, retrieve_all,
1102+
**_params)
1103+
1104+
@APIParamsCall
1105+
def show_metering_label_rule(self, metering_label_rule, **_params):
1106+
"""Fetches information of a certain metering label rule."""
1107+
return self.get(self.metering_label_rule_path %
1108+
(metering_label_rule), params=_params)
1109+
10601110
def __init__(self, **kwargs):
10611111
"""Initialize a new client for the Neutron v2.0 API."""
10621112
super(Client, self).__init__()

0 commit comments

Comments
 (0)