Skip to content

Commit b51310a

Browse files
committed
Introduce neutron flavor associate, disassociate to OSC
This patch introduces network flavor associate and disassociate to OSC. The following neutron equivalent commands are implemented in OSC: - neutron flavor-associate - neutron flavor-disassociate Change-Id: Icba4dbf7300a36353142586359059cd6784049dc
1 parent b2ceb58 commit b51310a

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
@@ -369,9 +369,11 @@ openstack.network.v2 =
369369
network_auto_allocated_topology_create = openstackclient.network.v2.network_auto_allocated_topology:CreateAutoAllocatedTopology
370370
network_auto_allocated_topology_delete = openstackclient.network.v2.network_auto_allocated_topology:DeleteAutoAllocatedTopology
371371

372+
network_flavor_add_profile = openstackclient.network.v2.network_flavor:AddNetworkFlavorToProfile
372373
network_flavor_create = openstackclient.network.v2.network_flavor:CreateNetworkFlavor
373374
network_flavor_delete = openstackclient.network.v2.network_flavor:DeleteNetworkFlavor
374375
network_flavor_list = openstackclient.network.v2.network_flavor:ListNetworkFlavor
376+
network_flavor_remove_profile = openstackclient.network.v2.network_flavor:RemoveNetworkFlavorFromProfile
375377
network_flavor_set = openstackclient.network.v2.network_flavor:SetNetworkFlavor
376378
network_flavor_show = openstackclient.network.v2.network_flavor:ShowNetworkFlavor
377379

0 commit comments

Comments
 (0)