Skip to content

Commit 8a1f4b6

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Introduce neutron flavor associate, disassociate to OSC"
2 parents 16b822b + b51310a commit 8a1f4b6

6 files changed

Lines changed: 243 additions & 0 deletions

File tree

doc/source/command-objects/network-flavor.rst

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,28 @@ service flavors.
88

99
Network v2
1010

11+
network flavor add profile
12+
--------------------------
13+
14+
Add network flavor to service profile
15+
16+
.. program:: network flavor add profile
17+
.. code:: bash
18+
19+
openstack network flavor add profile
20+
<flavor>
21+
<service-profile-id>
22+
23+
.. describe:: <flavor>
24+
25+
Flavor to which service profile is added. (Name or ID)
26+
27+
.. describe:: <service-profile-id>
28+
29+
Service profile to be added to flavor. (ID only)
30+
31+
.. _network_flavor_add_profile:
32+
1133
network flavor create
1234
---------------------
1335

@@ -85,6 +107,28 @@ List network flavors
85107
86108
.. _network_flavor_list:
87109
110+
network flavor remove profile
111+
-----------------------------
112+
113+
Remove network flavor from service profile
114+
115+
.. program:: network flavor remove profile
116+
.. code:: bash
117+
118+
openstack network flavor remove profile
119+
<flavor>
120+
<service-profile-id>
121+
122+
.. describe:: <flavor>
123+
124+
Flavor from which service profile is removed. (Name or ID)
125+
126+
.. describe:: <service-profile-id>
127+
128+
Service profile to be removed from flavor. (ID only)
129+
130+
.. _network_flavor_remove_profile:
131+
88132
network flavor set
89133
------------------
90134

openstackclient/network/v2/network_flavor.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,34 @@ def _get_attrs(client_manager, parsed_args):
5858
return attrs
5959

6060

61+
class AddNetworkFlavorToProfile(command.Command):
62+
_description = _("Add a service profile to a network flavor")
63+
64+
def get_parser(self, prog_name):
65+
parser = super(
66+
AddNetworkFlavorToProfile, self).get_parser(prog_name)
67+
parser.add_argument(
68+
'flavor',
69+
metavar="<flavor>",
70+
help=_("Network flavor (name or ID)")
71+
)
72+
parser.add_argument(
73+
'service_profile',
74+
metavar="<service-profile>",
75+
help=_("Service profile (ID only)")
76+
)
77+
return parser
78+
79+
def take_action(self, parsed_args):
80+
client = self.app.client_manager.network
81+
obj_flavor = client.find_flavor(
82+
parsed_args.flavor, ignore_missing=False)
83+
obj_service_profile = client.find_service_profile(
84+
parsed_args.service_profile, ignore_missing=False)
85+
client.associate_flavor_with_service_profile(
86+
obj_flavor, obj_service_profile)
87+
88+
6189
# TODO(dasanind): Use the SDK resource mapped attribute names once the
6290
# OSC minimum requirements include SDK 1.0.
6391
class CreateNetworkFlavor(command.ShowOne):
@@ -175,6 +203,35 @@ def take_action(self, parsed_args):
175203
) for s in data))
176204

177205

206+
class RemoveNetworkFlavorFromProfile(command.Command):
207+
_description = _(
208+
"Remove service profile from network flavor")
209+
210+
def get_parser(self, prog_name):
211+
parser = super(
212+
RemoveNetworkFlavorFromProfile, self).get_parser(prog_name)
213+
parser.add_argument(
214+
'flavor',
215+
metavar="<flavor>",
216+
help=_("Network flavor (name or ID)")
217+
)
218+
parser.add_argument(
219+
'service_profile',
220+
metavar="<service-profile>",
221+
help=_("Service profile (ID only)")
222+
)
223+
return parser
224+
225+
def take_action(self, parsed_args):
226+
client = self.app.client_manager.network
227+
obj_flavor = client.find_flavor(
228+
parsed_args.flavor, ignore_missing=False)
229+
obj_service_profile = client.find_service_profile(
230+
parsed_args.service_profile, ignore_missing=False)
231+
client.disassociate_flavor_from_service_profile(
232+
obj_flavor, obj_service_profile)
233+
234+
178235
# TODO(dasanind): Use only the SDK resource mapped attribute names once the
179236
# OSC minimum requirements include SDK 1.0.
180237
class SetNetworkFlavor(command.Command):

openstackclient/tests/functional/network/v2/test_network_flavor.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,57 @@
2020
class NetworkFlavorTests(base.TestCase):
2121
"""Functional tests for network flavor."""
2222

23+
def test_add_remove_network_flavor_profile(self):
24+
"""Test add and remove network flavor to/from profile"""
25+
26+
# Create Flavor
27+
name1 = uuid.uuid4().hex
28+
cmd_output1 = json.loads(self.openstack(
29+
'network flavor create -f json --description testdescription '
30+
'--enable --service-type L3_ROUTER_NAT ' + name1,
31+
))
32+
flavor_id = cmd_output1.get('id')
33+
34+
# Create Service Flavor
35+
cmd_output2 = json.loads(self.openstack(
36+
'network flavor profile create -f json --description '
37+
+ 'fakedescription' + ' --enable --metainfo ' + 'Extrainfo'
38+
))
39+
service_profile_id = cmd_output2.get('id')
40+
41+
self.addCleanup(self.openstack, 'network flavor delete ' +
42+
flavor_id)
43+
self.addCleanup(self.openstack, 'network flavor profile delete ' +
44+
service_profile_id)
45+
# Add flavor to service profile
46+
self.openstack(
47+
'network flavor add profile ' +
48+
flavor_id + ' ' + service_profile_id
49+
)
50+
51+
cmd_output4 = json.loads(self.openstack(
52+
'network flavor show -f json ' + flavor_id
53+
))
54+
service_profile_ids1 = cmd_output4.get('service_profile_ids')
55+
56+
# Assert
57+
self.assertIn(service_profile_id, service_profile_ids1)
58+
59+
# Cleanup
60+
# Remove flavor from service profile
61+
self.openstack(
62+
'network flavor remove profile ' +
63+
flavor_id + ' ' + service_profile_id
64+
)
65+
66+
cmd_output6 = json.loads(self.openstack(
67+
'network flavor show -f json ' + flavor_id
68+
))
69+
service_profile_ids2 = cmd_output6.get('service_profile_ids')
70+
71+
# Assert
72+
self.assertNotIn(service_profile_id, service_profile_ids2)
73+
2374
def test_network_flavor_delete(self):
2475
"""Test create, delete multiple"""
2576
name1 = uuid.uuid4().hex

openstackclient/tests/unit/network/v2/test_network_flavor.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,48 @@ def setUp(self):
3737
self.domains_mock = self.app.client_manager.identity.domains
3838

3939

40+
class TestAddNetworkFlavorToProfile(TestNetworkFlavor):
41+
42+
network_flavor = \
43+
network_fakes.FakeNetworkFlavor.create_one_network_flavor()
44+
service_profile = \
45+
network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()
46+
47+
def setUp(self):
48+
super(TestAddNetworkFlavorToProfile, self).setUp()
49+
self.network.find_flavor = mock.Mock(return_value=self.network_flavor)
50+
self.network.find_service_profile = mock.Mock(
51+
return_value=self.service_profile)
52+
self.network.associate_flavor_with_service_profile = mock.Mock()
53+
54+
self.cmd = network_flavor.AddNetworkFlavorToProfile(
55+
self.app, self.namespace)
56+
57+
def test_show_no_options(self):
58+
arglist = []
59+
verifylist = []
60+
61+
# Missing required args should bail here
62+
self.assertRaises(tests_utils.ParserException, self.check_parser,
63+
self.cmd, arglist, verifylist)
64+
65+
def test_add_flavor_to_service_profile(self):
66+
arglist = [
67+
self.network_flavor.id,
68+
self.service_profile.id
69+
]
70+
verifylist = [
71+
('flavor', self.network_flavor.id),
72+
('service_profile', self.service_profile.id),
73+
]
74+
75+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
76+
self.cmd.take_action(parsed_args)
77+
78+
self.network.associate_flavor_with_service_profile.\
79+
assert_called_once_with(self.network_flavor, self.service_profile)
80+
81+
4082
class TestCreateNetworkFlavor(TestNetworkFlavor):
4183

4284
project = identity_fakes_v3.FakeProject.create_one_project()
@@ -281,6 +323,48 @@ def test_network_flavor_list(self):
281323
self.assertEqual(self.data, list(data))
282324

283325

326+
class TestRemoveNetworkFlavorFromProfile(TestNetworkFlavor):
327+
328+
network_flavor = \
329+
network_fakes.FakeNetworkFlavor.create_one_network_flavor()
330+
service_profile = \
331+
network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()
332+
333+
def setUp(self):
334+
super(TestRemoveNetworkFlavorFromProfile, self).setUp()
335+
self.network.find_flavor = mock.Mock(return_value=self.network_flavor)
336+
self.network.find_service_profile = mock.Mock(
337+
return_value=self.service_profile)
338+
self.network.disassociate_flavor_from_service_profile = mock.Mock()
339+
340+
self.cmd = network_flavor.RemoveNetworkFlavorFromProfile(
341+
self.app, self.namespace)
342+
343+
def test_show_no_options(self):
344+
arglist = []
345+
verifylist = []
346+
347+
# Missing required args should bail here
348+
self.assertRaises(tests_utils.ParserException, self.check_parser,
349+
self.cmd, arglist, verifylist)
350+
351+
def test_remove_flavor_from_service_profile(self):
352+
arglist = [
353+
self.network_flavor.id,
354+
self.service_profile.id
355+
]
356+
verifylist = [
357+
('flavor', self.network_flavor.id),
358+
('service_profile', self.service_profile.id),
359+
]
360+
361+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
362+
self.cmd.take_action(parsed_args)
363+
364+
self.network.disassociate_flavor_from_service_profile.\
365+
assert_called_once_with(self.network_flavor, self.service_profile)
366+
367+
284368
class TestShowNetworkFlavor(TestNetworkFlavor):
285369

286370
# The network flavor to show.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Add ``network flavor add profile`` and ``network flavor remove profile`` commands.
5+
[Blueprint :oscbp:`neutron-client-flavors`]

setup.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,9 +371,11 @@ openstack.network.v2 =
371371
network_auto_allocated_topology_create = openstackclient.network.v2.network_auto_allocated_topology:CreateAutoAllocatedTopology
372372
network_auto_allocated_topology_delete = openstackclient.network.v2.network_auto_allocated_topology:DeleteAutoAllocatedTopology
373373

374+
network_flavor_add_profile = openstackclient.network.v2.network_flavor:AddNetworkFlavorToProfile
374375
network_flavor_create = openstackclient.network.v2.network_flavor:CreateNetworkFlavor
375376
network_flavor_delete = openstackclient.network.v2.network_flavor:DeleteNetworkFlavor
376377
network_flavor_list = openstackclient.network.v2.network_flavor:ListNetworkFlavor
378+
network_flavor_remove_profile = openstackclient.network.v2.network_flavor:RemoveNetworkFlavorFromProfile
377379
network_flavor_set = openstackclient.network.v2.network_flavor:SetNetworkFlavor
378380
network_flavor_show = openstackclient.network.v2.network_flavor:ShowNetworkFlavor
379381

0 commit comments

Comments
 (0)