Merge "Introduce neutron flavor associate, disassociate to OSC"
This commit is contained in:
commit
8a1f4b6592
@ -8,6 +8,28 @@ service flavors.
|
|||||||
|
|
||||||
Network v2
|
Network v2
|
||||||
|
|
||||||
|
network flavor add profile
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Add network flavor to service profile
|
||||||
|
|
||||||
|
.. program:: network flavor add profile
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
openstack network flavor add profile
|
||||||
|
<flavor>
|
||||||
|
<service-profile-id>
|
||||||
|
|
||||||
|
.. describe:: <flavor>
|
||||||
|
|
||||||
|
Flavor to which service profile is added. (Name or ID)
|
||||||
|
|
||||||
|
.. describe:: <service-profile-id>
|
||||||
|
|
||||||
|
Service profile to be added to flavor. (ID only)
|
||||||
|
|
||||||
|
.. _network_flavor_add_profile:
|
||||||
|
|
||||||
network flavor create
|
network flavor create
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
@ -85,6 +107,28 @@ List network flavors
|
|||||||
|
|
||||||
.. _network_flavor_list:
|
.. _network_flavor_list:
|
||||||
|
|
||||||
|
network flavor remove profile
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
Remove network flavor from service profile
|
||||||
|
|
||||||
|
.. program:: network flavor remove profile
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
openstack network flavor remove profile
|
||||||
|
<flavor>
|
||||||
|
<service-profile-id>
|
||||||
|
|
||||||
|
.. describe:: <flavor>
|
||||||
|
|
||||||
|
Flavor from which service profile is removed. (Name or ID)
|
||||||
|
|
||||||
|
.. describe:: <service-profile-id>
|
||||||
|
|
||||||
|
Service profile to be removed from flavor. (ID only)
|
||||||
|
|
||||||
|
.. _network_flavor_remove_profile:
|
||||||
|
|
||||||
network flavor set
|
network flavor set
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
@ -58,6 +58,34 @@ def _get_attrs(client_manager, parsed_args):
|
|||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
|
|
||||||
|
class AddNetworkFlavorToProfile(command.Command):
|
||||||
|
_description = _("Add a service profile to a network flavor")
|
||||||
|
|
||||||
|
def get_parser(self, prog_name):
|
||||||
|
parser = super(
|
||||||
|
AddNetworkFlavorToProfile, self).get_parser(prog_name)
|
||||||
|
parser.add_argument(
|
||||||
|
'flavor',
|
||||||
|
metavar="<flavor>",
|
||||||
|
help=_("Network flavor (name or ID)")
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'service_profile',
|
||||||
|
metavar="<service-profile>",
|
||||||
|
help=_("Service profile (ID only)")
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def take_action(self, parsed_args):
|
||||||
|
client = self.app.client_manager.network
|
||||||
|
obj_flavor = client.find_flavor(
|
||||||
|
parsed_args.flavor, ignore_missing=False)
|
||||||
|
obj_service_profile = client.find_service_profile(
|
||||||
|
parsed_args.service_profile, ignore_missing=False)
|
||||||
|
client.associate_flavor_with_service_profile(
|
||||||
|
obj_flavor, obj_service_profile)
|
||||||
|
|
||||||
|
|
||||||
# TODO(dasanind): Use the SDK resource mapped attribute names once the
|
# TODO(dasanind): Use the SDK resource mapped attribute names once the
|
||||||
# OSC minimum requirements include SDK 1.0.
|
# OSC minimum requirements include SDK 1.0.
|
||||||
class CreateNetworkFlavor(command.ShowOne):
|
class CreateNetworkFlavor(command.ShowOne):
|
||||||
@ -175,6 +203,35 @@ class ListNetworkFlavor(command.Lister):
|
|||||||
) for s in data))
|
) for s in data))
|
||||||
|
|
||||||
|
|
||||||
|
class RemoveNetworkFlavorFromProfile(command.Command):
|
||||||
|
_description = _(
|
||||||
|
"Remove service profile from network flavor")
|
||||||
|
|
||||||
|
def get_parser(self, prog_name):
|
||||||
|
parser = super(
|
||||||
|
RemoveNetworkFlavorFromProfile, self).get_parser(prog_name)
|
||||||
|
parser.add_argument(
|
||||||
|
'flavor',
|
||||||
|
metavar="<flavor>",
|
||||||
|
help=_("Network flavor (name or ID)")
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'service_profile',
|
||||||
|
metavar="<service-profile>",
|
||||||
|
help=_("Service profile (ID only)")
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def take_action(self, parsed_args):
|
||||||
|
client = self.app.client_manager.network
|
||||||
|
obj_flavor = client.find_flavor(
|
||||||
|
parsed_args.flavor, ignore_missing=False)
|
||||||
|
obj_service_profile = client.find_service_profile(
|
||||||
|
parsed_args.service_profile, ignore_missing=False)
|
||||||
|
client.disassociate_flavor_from_service_profile(
|
||||||
|
obj_flavor, obj_service_profile)
|
||||||
|
|
||||||
|
|
||||||
# TODO(dasanind): Use only the SDK resource mapped attribute names once the
|
# TODO(dasanind): Use only the SDK resource mapped attribute names once the
|
||||||
# OSC minimum requirements include SDK 1.0.
|
# OSC minimum requirements include SDK 1.0.
|
||||||
class SetNetworkFlavor(command.Command):
|
class SetNetworkFlavor(command.Command):
|
||||||
|
@ -20,6 +20,57 @@ from openstackclient.tests.functional import base
|
|||||||
class NetworkFlavorTests(base.TestCase):
|
class NetworkFlavorTests(base.TestCase):
|
||||||
"""Functional tests for network flavor."""
|
"""Functional tests for network flavor."""
|
||||||
|
|
||||||
|
def test_add_remove_network_flavor_profile(self):
|
||||||
|
"""Test add and remove network flavor to/from profile"""
|
||||||
|
|
||||||
|
# Create Flavor
|
||||||
|
name1 = uuid.uuid4().hex
|
||||||
|
cmd_output1 = json.loads(self.openstack(
|
||||||
|
'network flavor create -f json --description testdescription '
|
||||||
|
'--enable --service-type L3_ROUTER_NAT ' + name1,
|
||||||
|
))
|
||||||
|
flavor_id = cmd_output1.get('id')
|
||||||
|
|
||||||
|
# Create Service Flavor
|
||||||
|
cmd_output2 = json.loads(self.openstack(
|
||||||
|
'network flavor profile create -f json --description '
|
||||||
|
+ 'fakedescription' + ' --enable --metainfo ' + 'Extrainfo'
|
||||||
|
))
|
||||||
|
service_profile_id = cmd_output2.get('id')
|
||||||
|
|
||||||
|
self.addCleanup(self.openstack, 'network flavor delete ' +
|
||||||
|
flavor_id)
|
||||||
|
self.addCleanup(self.openstack, 'network flavor profile delete ' +
|
||||||
|
service_profile_id)
|
||||||
|
# Add flavor to service profile
|
||||||
|
self.openstack(
|
||||||
|
'network flavor add profile ' +
|
||||||
|
flavor_id + ' ' + service_profile_id
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd_output4 = json.loads(self.openstack(
|
||||||
|
'network flavor show -f json ' + flavor_id
|
||||||
|
))
|
||||||
|
service_profile_ids1 = cmd_output4.get('service_profile_ids')
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
self.assertIn(service_profile_id, service_profile_ids1)
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
# Remove flavor from service profile
|
||||||
|
self.openstack(
|
||||||
|
'network flavor remove profile ' +
|
||||||
|
flavor_id + ' ' + service_profile_id
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd_output6 = json.loads(self.openstack(
|
||||||
|
'network flavor show -f json ' + flavor_id
|
||||||
|
))
|
||||||
|
service_profile_ids2 = cmd_output6.get('service_profile_ids')
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
self.assertNotIn(service_profile_id, service_profile_ids2)
|
||||||
|
|
||||||
def test_network_flavor_delete(self):
|
def test_network_flavor_delete(self):
|
||||||
"""Test create, delete multiple"""
|
"""Test create, delete multiple"""
|
||||||
name1 = uuid.uuid4().hex
|
name1 = uuid.uuid4().hex
|
||||||
|
@ -37,6 +37,48 @@ class TestNetworkFlavor(network_fakes.TestNetworkV2):
|
|||||||
self.domains_mock = self.app.client_manager.identity.domains
|
self.domains_mock = self.app.client_manager.identity.domains
|
||||||
|
|
||||||
|
|
||||||
|
class TestAddNetworkFlavorToProfile(TestNetworkFlavor):
|
||||||
|
|
||||||
|
network_flavor = \
|
||||||
|
network_fakes.FakeNetworkFlavor.create_one_network_flavor()
|
||||||
|
service_profile = \
|
||||||
|
network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestAddNetworkFlavorToProfile, self).setUp()
|
||||||
|
self.network.find_flavor = mock.Mock(return_value=self.network_flavor)
|
||||||
|
self.network.find_service_profile = mock.Mock(
|
||||||
|
return_value=self.service_profile)
|
||||||
|
self.network.associate_flavor_with_service_profile = mock.Mock()
|
||||||
|
|
||||||
|
self.cmd = network_flavor.AddNetworkFlavorToProfile(
|
||||||
|
self.app, self.namespace)
|
||||||
|
|
||||||
|
def test_show_no_options(self):
|
||||||
|
arglist = []
|
||||||
|
verifylist = []
|
||||||
|
|
||||||
|
# Missing required args should bail here
|
||||||
|
self.assertRaises(tests_utils.ParserException, self.check_parser,
|
||||||
|
self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
def test_add_flavor_to_service_profile(self):
|
||||||
|
arglist = [
|
||||||
|
self.network_flavor.id,
|
||||||
|
self.service_profile.id
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('flavor', self.network_flavor.id),
|
||||||
|
('service_profile', self.service_profile.id),
|
||||||
|
]
|
||||||
|
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
self.network.associate_flavor_with_service_profile.\
|
||||||
|
assert_called_once_with(self.network_flavor, self.service_profile)
|
||||||
|
|
||||||
|
|
||||||
class TestCreateNetworkFlavor(TestNetworkFlavor):
|
class TestCreateNetworkFlavor(TestNetworkFlavor):
|
||||||
|
|
||||||
project = identity_fakes_v3.FakeProject.create_one_project()
|
project = identity_fakes_v3.FakeProject.create_one_project()
|
||||||
@ -281,6 +323,48 @@ class TestListNetworkFlavor(TestNetworkFlavor):
|
|||||||
self.assertEqual(self.data, list(data))
|
self.assertEqual(self.data, list(data))
|
||||||
|
|
||||||
|
|
||||||
|
class TestRemoveNetworkFlavorFromProfile(TestNetworkFlavor):
|
||||||
|
|
||||||
|
network_flavor = \
|
||||||
|
network_fakes.FakeNetworkFlavor.create_one_network_flavor()
|
||||||
|
service_profile = \
|
||||||
|
network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestRemoveNetworkFlavorFromProfile, self).setUp()
|
||||||
|
self.network.find_flavor = mock.Mock(return_value=self.network_flavor)
|
||||||
|
self.network.find_service_profile = mock.Mock(
|
||||||
|
return_value=self.service_profile)
|
||||||
|
self.network.disassociate_flavor_from_service_profile = mock.Mock()
|
||||||
|
|
||||||
|
self.cmd = network_flavor.RemoveNetworkFlavorFromProfile(
|
||||||
|
self.app, self.namespace)
|
||||||
|
|
||||||
|
def test_show_no_options(self):
|
||||||
|
arglist = []
|
||||||
|
verifylist = []
|
||||||
|
|
||||||
|
# Missing required args should bail here
|
||||||
|
self.assertRaises(tests_utils.ParserException, self.check_parser,
|
||||||
|
self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
def test_remove_flavor_from_service_profile(self):
|
||||||
|
arglist = [
|
||||||
|
self.network_flavor.id,
|
||||||
|
self.service_profile.id
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('flavor', self.network_flavor.id),
|
||||||
|
('service_profile', self.service_profile.id),
|
||||||
|
]
|
||||||
|
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
self.network.disassociate_flavor_from_service_profile.\
|
||||||
|
assert_called_once_with(self.network_flavor, self.service_profile)
|
||||||
|
|
||||||
|
|
||||||
class TestShowNetworkFlavor(TestNetworkFlavor):
|
class TestShowNetworkFlavor(TestNetworkFlavor):
|
||||||
|
|
||||||
# The network flavor to show.
|
# The network flavor to show.
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Add ``network flavor add profile`` and ``network flavor remove profile`` commands.
|
||||||
|
[Blueprint :oscbp:`neutron-client-flavors`]
|
@ -371,9 +371,11 @@ openstack.network.v2 =
|
|||||||
network_auto_allocated_topology_create = openstackclient.network.v2.network_auto_allocated_topology:CreateAutoAllocatedTopology
|
network_auto_allocated_topology_create = openstackclient.network.v2.network_auto_allocated_topology:CreateAutoAllocatedTopology
|
||||||
network_auto_allocated_topology_delete = openstackclient.network.v2.network_auto_allocated_topology:DeleteAutoAllocatedTopology
|
network_auto_allocated_topology_delete = openstackclient.network.v2.network_auto_allocated_topology:DeleteAutoAllocatedTopology
|
||||||
|
|
||||||
|
network_flavor_add_profile = openstackclient.network.v2.network_flavor:AddNetworkFlavorToProfile
|
||||||
network_flavor_create = openstackclient.network.v2.network_flavor:CreateNetworkFlavor
|
network_flavor_create = openstackclient.network.v2.network_flavor:CreateNetworkFlavor
|
||||||
network_flavor_delete = openstackclient.network.v2.network_flavor:DeleteNetworkFlavor
|
network_flavor_delete = openstackclient.network.v2.network_flavor:DeleteNetworkFlavor
|
||||||
network_flavor_list = openstackclient.network.v2.network_flavor:ListNetworkFlavor
|
network_flavor_list = openstackclient.network.v2.network_flavor:ListNetworkFlavor
|
||||||
|
network_flavor_remove_profile = openstackclient.network.v2.network_flavor:RemoveNetworkFlavorFromProfile
|
||||||
network_flavor_set = openstackclient.network.v2.network_flavor:SetNetworkFlavor
|
network_flavor_set = openstackclient.network.v2.network_flavor:SetNetworkFlavor
|
||||||
network_flavor_show = openstackclient.network.v2.network_flavor:ShowNetworkFlavor
|
network_flavor_show = openstackclient.network.v2.network_flavor:ShowNetworkFlavor
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user