diff options
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/compute/v2/server.py | 8 | ||||
| -rw-r--r-- | openstackclient/network/v2/floating_ip.py | 74 | ||||
| -rw-r--r-- | openstackclient/network/v2/port.py | 32 | ||||
| -rw-r--r-- | openstackclient/network/v2/router.py | 12 | ||||
| -rw-r--r-- | openstackclient/tests/functional/network/v2/test_floating_ip.py | 76 | ||||
| -rw-r--r-- | openstackclient/tests/unit/compute/v2/test_server.py | 20 | ||||
| -rw-r--r-- | openstackclient/tests/unit/network/v2/fakes.py | 2 | ||||
| -rw-r--r-- | openstackclient/tests/unit/network/v2/test_floating_ip.py | 186 | ||||
| -rw-r--r-- | openstackclient/tests/unit/network/v2/test_port.py | 60 | ||||
| -rw-r--r-- | openstackclient/tests/unit/network/v2/test_router.py | 15 |
10 files changed, 444 insertions, 41 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index edb06603..ae839677 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -206,6 +206,11 @@ class AddFixedIP(command.Command): "Network to allocate the fixed IP address from (name or ID)" ), ) + parser.add_argument( + "--fixed-ip-address", + metavar="<ip-address>", + help=_("Requested fixed IP address"), + ) return parser def take_action(self, parsed_args): @@ -217,7 +222,8 @@ class AddFixedIP(command.Command): network = utils.find_resource( compute_client.networks, parsed_args.network) - server.add_fixed_ip(network.id) + server.interface_attach(port_id=None, net_id=network.id, + fixed_ip=parsed_args.fixed_ip_address) class AddFloatingIP(command.Command): diff --git a/openstackclient/network/v2/floating_ip.py b/openstackclient/network/v2/floating_ip.py index bc347b72..eaf27420 100644 --- a/openstackclient/network/v2/floating_ip.py +++ b/openstackclient/network/v2/floating_ip.py @@ -17,6 +17,7 @@ import logging from openstack import exceptions as sdk_exceptions from openstack.network.v2 import floating_ip as _floating_ip +from osc_lib.command import command from osc_lib import utils from openstackclient.i18n import _ @@ -446,6 +447,47 @@ class ListIPFloating(ListFloatingIP): client, parsed_args) +class SetFloatingIP(command.Command): + _description = _("Set floating IP Properties") + + def get_parser(self, prog_name): + parser = super(SetFloatingIP, self).get_parser(prog_name) + parser.add_argument( + 'floating_ip', + metavar='<floating-ip>', + help=_("Floating IP to associate (IP address or ID)")) + parser.add_argument( + '--port', + metavar='<port>', + required=True, + help=_("Assocaite the floating IP with port (name or ID)")), + parser.add_argument( + '--fixed-ip-address', + metavar='<ip-address>', + dest='fixed_ip_address', + help=_("Fixed IP of the port " + "(required only if port has multiple IPs)") + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + attrs = {} + # TODO(sindhu) Use client.find_ip() once SDK 0.9.15 is released + obj = _find_floating_ip( + self.app.client_manager.sdk_connection.session, + parsed_args.floating_ip, + ignore_missing=False, + ) + port = client.find_port(parsed_args.port, + ignore_missing=False) + attrs['port_id'] = port.id + if parsed_args.fixed_ip_address: + attrs['fixed_ip_address'] = parsed_args.fixed_ip_address + + client.update_ip(obj, **attrs) + + class ShowFloatingIP(common.NetworkAndComputeShowOne): _description = _("Display floating IP details") @@ -499,3 +541,35 @@ class ShowIPFloating(ShowFloatingIP): 'Please use "floating ip show" instead.')) return super(ShowIPFloating, self).take_action_compute( client, parsed_args) + + +class UnsetFloatingIP(command.Command): + _description = _("Unset floating IP Properties") + + def get_parser(self, prog_name): + parser = super(UnsetFloatingIP, self).get_parser(prog_name) + parser.add_argument( + 'floating_ip', + metavar='<floating-ip>', + help=_("Floating IP to disassociate (IP address or ID)")) + parser.add_argument( + '--port', + action='store_true', + default=False, + help=_("Disassociate any port associated with the floating IP") + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + # TODO(sindhu) Use client.find_ip() once SDK 0.9.15 is released + obj = _find_floating_ip( + self.app.client_manager.sdk_connection.session, + parsed_args.floating_ip, + ignore_missing=False, + ) + if parsed_args.port: + attrs = { + 'port_id': None, + } + client.update_ip(obj, **attrs) diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py index 9d598fab..3a32916b 100644 --- a/openstackclient/network/v2/port.py +++ b/openstackclient/network/v2/port.py @@ -155,6 +155,13 @@ def _get_attrs(client_manager, parsed_args): if parsed_args.enable_port_security: attrs['port_security_enabled'] = True + if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy: + attrs['qos_policy_id'] = None + + if parsed_args.qos_policy: + attrs['qos_policy_id'] = client_manager.network.find_qos_policy( + parsed_args.qos_policy, ignore_missing=False).id + return attrs @@ -337,7 +344,7 @@ class CreatePort(command.ShowOne): help=_("Name of this port") ) # TODO(singhj): Add support for extended options: - # qos,dhcp + # dhcp secgroups = parser.add_mutually_exclusive_group() secgroups.add_argument( '--security-group', @@ -353,6 +360,11 @@ class CreatePort(command.ShowOne): action='store_true', help=_("Associate no security groups with this port") ) + parser.add_argument( + '--qos-policy', + metavar='<qos-policy>', + help=_("Attach QoS policy to this port (name or ID)") + ) port_security = parser.add_mutually_exclusive_group() port_security.add_argument( '--enable-port-security', @@ -403,6 +415,9 @@ class CreatePort(command.ShowOne): attrs['allowed_address_pairs'] = ( _convert_address_pairs(parsed_args)) + if parsed_args.qos_policy: + attrs['qos_policy_id'] = client.find_qos_policy( + parsed_args.qos_policy, ignore_missing=False).id obj = client.create_port(**attrs) display_columns, columns = _get_columns(obj) data = utils.get_item_properties(obj, columns, formatters=_formatters) @@ -620,6 +635,11 @@ class SetPort(command.Command): "to overwrite the current binding:profile information.") ) parser.add_argument( + '--qos-policy', + metavar='<qos-policy>', + help=_("Attach QoS policy to this port (name or ID)") + ) + parser.add_argument( 'port', metavar="<port>", help=_("Port to modify (name or ID)") @@ -675,8 +695,8 @@ class SetPort(command.Command): client = self.app.client_manager.network _prepare_fixed_ips(self.app.client_manager, parsed_args) - attrs = _get_attrs(self.app.client_manager, parsed_args) obj = client.find_port(parsed_args.port, ignore_missing=False) + attrs = _get_attrs(self.app.client_manager, parsed_args) if parsed_args.no_binding_profile: attrs['binding:profile'] = {} @@ -794,6 +814,12 @@ class UnsetPort(command.Command): "[,mac-address=<mac-address>] (repeat option to set " "multiple allowed-address pairs)") ) + parser.add_argument( + '--qos-policy', + action='store_true', + default=False, + help=_("Remove the QoS policy attached to the port") + ) return parser @@ -843,6 +869,8 @@ class UnsetPort(command.Command): msg = _("Port does not contain allowed-address-pair %s") % addr raise exceptions.CommandError(msg) attrs['allowed_address_pairs'] = tmp_addr_pairs + if parsed_args.qos_policy: + attrs['qos_policy_id'] = None if attrs: client.update_port(obj, **attrs) diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index f46c8696..f322d5d1 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -183,11 +183,17 @@ class CreateRouter(command.ShowOne): default=False, help=_("Create a distributed router") ) - parser.add_argument( + ha_group = parser.add_mutually_exclusive_group() + ha_group.add_argument( '--ha', action='store_true', help=_("Create a highly available router") ) + ha_group.add_argument( + '--no-ha', + action='store_true', + help=_("Create a legacy router") + ) parser.add_argument( '--description', metavar='<description>', @@ -216,7 +222,9 @@ class CreateRouter(command.ShowOne): attrs = _get_attrs(self.app.client_manager, parsed_args) if parsed_args.ha: - attrs['ha'] = parsed_args.ha + attrs['ha'] = True + if parsed_args.no_ha: + attrs['ha'] = False obj = client.create_router(**attrs) display_columns, columns = _get_columns(obj) diff --git a/openstackclient/tests/functional/network/v2/test_floating_ip.py b/openstackclient/tests/functional/network/v2/test_floating_ip.py index 8fbec3d5..5da0e474 100644 --- a/openstackclient/tests/functional/network/v2/test_floating_ip.py +++ b/openstackclient/tests/functional/network/v2/test_floating_ip.py @@ -21,6 +21,10 @@ class FloatingIpTests(base.TestCase): """Functional tests for floating ip""" SUBNET_NAME = uuid.uuid4().hex NETWORK_NAME = uuid.uuid4().hex + PRIVATE_NETWORK_NAME = uuid.uuid4().hex + PRIVATE_SUBNET_NAME = uuid.uuid4().hex + ROUTER = uuid.uuid4().hex + PORT_NAME = uuid.uuid4().hex @classmethod def setUpClass(cls): @@ -30,6 +34,8 @@ class FloatingIpTests(base.TestCase): cls.re_fixed_ip = re.compile("fixed_ip_address\s+\|\s+(\S+)") cls.re_description = re.compile("description\s+\|\s+([^|]+?)\s+\|") cls.re_network_id = re.compile("floating_network_id\s+\|\s+(\S+)") + cls.re_port_id = re.compile("\s+id\s+\|\s+(\S+)") + cls.re_fp_port_id = re.compile("\s+port_id\s+\|\s+(\S+)") # Create a network for the floating ip raw_output = cls.openstack( @@ -37,6 +43,12 @@ class FloatingIpTests(base.TestCase): ) cls.network_id = re.search(cls.re_id, raw_output).group(1) + # Create a private network for the port + raw_output = cls.openstack( + 'network create ' + cls.PRIVATE_NETWORK_NAME + ) + cls.private_network_id = re.search(cls.re_id, raw_output).group(1) + # Try random subnet range for subnet creating # Because we can not determine ahead of time what subnets are already # in use, possibly by another test running in parallel, try 4 times @@ -46,6 +58,10 @@ class FloatingIpTests(base.TestCase): str, (random.randint(0, 223) for _ in range(3)) )) + ".0/26" + cls.private_subnet = ".".join(map( + str, + (random.randint(0, 223) for _ in range(3)) + )) + ".0/26" try: # Create a subnet for the network raw_output = cls.openstack( @@ -54,6 +70,13 @@ class FloatingIpTests(base.TestCase): '--subnet-range ' + cls.subnet + ' ' + cls.SUBNET_NAME ) + # Create a subnet for the private network + priv_raw_output = cls.openstack( + 'subnet create ' + + '--network ' + cls.PRIVATE_NETWORK_NAME + ' ' + + '--subnet-range ' + cls.private_subnet + ' ' + + cls.PRIVATE_SUBNET_NAME + ) except Exception: if (i == 3): # raise the exception at the last time @@ -64,13 +87,19 @@ class FloatingIpTests(base.TestCase): break cls.subnet_id = re.search(cls.re_id, raw_output).group(1) + cls.private_subnet_id = re.search(cls.re_id, priv_raw_output).group(1) @classmethod def tearDownClass(cls): raw_output = cls.openstack('subnet delete ' + cls.SUBNET_NAME) cls.assertOutput('', raw_output) + raw_output = cls.openstack('subnet delete ' + cls.PRIVATE_SUBNET_NAME) + cls.assertOutput('', raw_output) raw_output = cls.openstack('network delete ' + cls.NETWORK_NAME) cls.assertOutput('', raw_output) + raw_output = cls.openstack( + 'network delete ' + cls.PRIVATE_NETWORK_NAME) + cls.assertOutput('', raw_output) def test_floating_ip_delete(self): """Test create, delete multiple""" @@ -168,3 +197,50 @@ class FloatingIpTests(base.TestCase): # re.search(self.re_floating_ip, raw_output).group(1), # ) self.assertIsNotNone(re.search(self.re_network_id, raw_output)) + + def test_floating_ip_set_and_unset_port(self): + """Test Floating IP Set and Unset port""" + raw_output = self.openstack( + 'floating ip create ' + + '--description shosho ' + + self.NETWORK_NAME + ) + re_ip = re.search(self.re_floating_ip, raw_output) + fp_ip = re_ip.group(1) + self.addCleanup(self.openstack, 'floating ip delete ' + fp_ip) + self.assertIsNotNone(fp_ip) + + raw_output1 = self.openstack( + 'port create --network ' + self.PRIVATE_NETWORK_NAME + + ' --fixed-ip subnet=' + self.PRIVATE_SUBNET_NAME + + ' ' + self.PORT_NAME + ) + re_port_id = re.search(self.re_port_id, raw_output1) + self.assertIsNotNone(re_port_id) + port_id = re_port_id.group(1) + + router = self.openstack('router create ' + self.ROUTER) + self.assertIsNotNone(router) + self.addCleanup(self.openstack, 'router delete ' + self.ROUTER) + + self.openstack('router add port ' + self.ROUTER + + ' ' + port_id) + self.openstack('router set --external-gateway ' + self.NETWORK_NAME + + ' ' + self.ROUTER) + + self.addCleanup(self.openstack, 'router unset --external-gateway ' + + self.ROUTER) + self.addCleanup(self.openstack, 'router remove port ' + self.ROUTER + + ' ' + port_id) + + raw_output = self.openstack( + 'floating ip set ' + + fp_ip + ' --port ' + port_id) + self.addCleanup(self.openstack, 'floating ip unset --port ' + fp_ip) + + show_output = self.openstack( + 'floating ip show ' + fp_ip) + + self.assertEqual( + port_id, + re.search(self.re_fp_port_id, show_output).group(1)) diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 0e3bb28f..fed847f1 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -104,10 +104,10 @@ class TestServerAddFixedIP(TestServer): # Set add_fixed_ip method to be tested. self.methods = { - 'add_fixed_ip': None, + 'interface_attach': None, } - def test_server_add_fixed_ip(self): + def _test_server_add_fixed_ip(self, extralist, fixed_ip_address): servers = self.setup_servers_mock(count=1) network = compute_fakes.FakeNetwork.create_one_network() self.networks_mock.get.return_value = network @@ -115,20 +115,28 @@ class TestServerAddFixedIP(TestServer): arglist = [ servers[0].id, network.id, - ] + ] + extralist verifylist = [ ('server', servers[0].id), - ('network', network.id) + ('network', network.id), + ('fixed_ip_address', fixed_ip_address) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) - servers[0].add_fixed_ip.assert_called_once_with( - network.id, + servers[0].interface_attach.assert_called_once_with( + port_id=None, net_id=network.id, fixed_ip=fixed_ip_address ) self.assertIsNone(result) + def test_server_add_fixed_ip(self): + self._test_server_add_fixed_ip([], None) + + def test_server_add_specific_fixed_ip(self): + extralist = ['--fixed-ip-address', '5.6.7.8'] + self._test_server_add_fixed_ip(extralist, '5.6.7.8') + class TestServerAddFloatingIP(TestServer): diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py index d3685409..9a289941 100644 --- a/openstackclient/tests/unit/network/v2/fakes.py +++ b/openstackclient/tests/unit/network/v2/fakes.py @@ -572,6 +572,7 @@ class FakePort(object): 'security_group_ids': [], 'status': 'ACTIVE', 'tenant_id': 'project-id-' + uuid.uuid4().hex, + 'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex, } # Overwrite default attributes. @@ -590,6 +591,7 @@ class FakePort(object): port.is_port_security_enabled = port_attrs['port_security_enabled'] port.project_id = port_attrs['tenant_id'] port.security_group_ids = port_attrs['security_group_ids'] + port.qos_policy_id = port_attrs['qos_policy_id'] return port diff --git a/openstackclient/tests/unit/network/v2/test_floating_ip.py b/openstackclient/tests/unit/network/v2/test_floating_ip.py index 0b3fd888..69fb1419 100644 --- a/openstackclient/tests/unit/network/v2/test_floating_ip.py +++ b/openstackclient/tests/unit/network/v2/test_floating_ip.py @@ -16,7 +16,7 @@ from mock import call from osc_lib import exceptions -from openstackclient.network.v2 import floating_ip +from openstackclient.network.v2 import floating_ip as fip from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3 from openstackclient.tests.unit.network.v2 import fakes as network_fakes @@ -92,7 +92,7 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork): self.network.find_port = mock.Mock(return_value=self.port) # Get the command object to test - self.cmd = floating_ip.CreateFloatingIP(self.app, self.namespace) + self.cmd = fip.CreateFloatingIP(self.app, self.namespace) def test_create_no_options(self): arglist = [] @@ -210,12 +210,9 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork): self.network.delete_ip = mock.Mock(return_value=None) # Get the command object to test - self.cmd = floating_ip.DeleteFloatingIP(self.app, self.namespace) + self.cmd = fip.DeleteFloatingIP(self.app, self.namespace) - @mock.patch( - "openstackclient.tests.unit.network.v2.test_floating_ip." + - "floating_ip._find_floating_ip" - ) + @mock.patch.object(fip, '_find_floating_ip') def test_floating_ip_delete(self, find_floating_ip_mock): find_floating_ip_mock.side_effect = [ self.floating_ips[0], @@ -239,10 +236,7 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork): self.network.delete_ip.assert_called_once_with(self.floating_ips[0]) self.assertIsNone(result) - @mock.patch( - "openstackclient.tests.unit.network.v2.test_floating_ip." + - "floating_ip._find_floating_ip" - ) + @mock.patch.object(fip, '_find_floating_ip') def test_floating_ip_delete_multi(self, find_floating_ip_mock): find_floating_ip_mock.side_effect = [ self.floating_ips[0], @@ -280,10 +274,7 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork): self.network.delete_ip.assert_has_calls(calls) self.assertIsNone(result) - @mock.patch( - "openstackclient.tests.unit.network.v2.test_floating_ip." + - "floating_ip._find_floating_ip" - ) + @mock.patch.object(fip, '_find_floating_ip') def test_floating_ip_delete_multi_exception(self, find_floating_ip_mock): find_floating_ip_mock.side_effect = [ self.floating_ips[0], @@ -380,7 +371,7 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork): self.network.find_router = mock.Mock(return_value=self.fake_router) # Get the command object to test - self.cmd = floating_ip.ListFloatingIP(self.app, self.namespace) + self.cmd = fip.ListFloatingIP(self.app, self.namespace) def test_floating_ip_list(self): arglist = [] @@ -572,12 +563,9 @@ class TestShowFloatingIPNetwork(TestFloatingIPNetwork): self.network.find_ip = mock.Mock(return_value=self.floating_ip) # Get the command object to test - self.cmd = floating_ip.ShowFloatingIP(self.app, self.namespace) + self.cmd = fip.ShowFloatingIP(self.app, self.namespace) - @mock.patch( - "openstackclient.tests.unit.network.v2.test_floating_ip." + - "floating_ip._find_floating_ip" - ) + @mock.patch.object(fip, '_find_floating_ip') def test_floating_ip_show(self, find_floating_ip_mock): find_floating_ip_mock.return_value = self.floating_ip arglist = [ @@ -599,6 +587,154 @@ class TestShowFloatingIPNetwork(TestFloatingIPNetwork): self.assertEqual(self.data, data) +class TestSetFloatingIP(TestFloatingIPNetwork): + + # Fake data for option tests. + floating_network = network_fakes.FakeNetwork.create_one_network() + subnet = network_fakes.FakeSubnet.create_one_subnet() + port = network_fakes.FakePort.create_one_port() + + # The floating ip to be deleted. + floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip( + attrs={ + 'floating_network_id': floating_network.id, + 'port_id': port.id, + } + ) + + def setUp(self): + super(TestSetFloatingIP, self).setUp() + self.network.find_ip = mock.Mock(return_value=self.floating_ip) + self.network.find_port = mock.Mock(return_value=self.port) + self.network.update_ip = mock.Mock(return_value=None) + + # Get the command object to test + self.cmd = fip.SetFloatingIP(self.app, self.namespace) + + @mock.patch( + "openstackclient.tests.unit.network.v2.test_floating_ip." + + "fip._find_floating_ip" + ) + def test_port_option(self, find_floating_ip_mock): + find_floating_ip_mock.side_effect = [ + self.floating_ip, + ] + arglist = [ + self.floating_ip.id, + '--port', self.floating_ip.port_id, + ] + verifylist = [ + ('floating_ip', self.floating_ip.id), + ('port', self.floating_ip.port_id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + attrs = { + 'port_id': self.floating_ip.port_id, + } + + find_floating_ip_mock.assert_called_once_with( + mock.ANY, + self.floating_ip.id, + ignore_missing=False, + ) + + self.network.update_ip.assert_called_once_with( + self.floating_ip, **attrs) + + @mock.patch( + "openstackclient.tests.unit.network.v2.test_floating_ip." + + "fip._find_floating_ip" + ) + def test_fixed_ip_option(self, find_floating_ip_mock): + find_floating_ip_mock.side_effect = [ + self.floating_ip, + ] + arglist = [ + self.floating_ip.id, + '--port', self.floating_ip.port_id, + "--fixed-ip-address", self.floating_ip.fixed_ip_address, + ] + verifylist = [ + ('floating_ip', self.floating_ip.id), + ('port', self.floating_ip.port_id), + ('fixed_ip_address', self.floating_ip.fixed_ip_address), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + attrs = { + 'port_id': self.floating_ip.port_id, + 'fixed_ip_address': self.floating_ip.fixed_ip_address, + } + find_floating_ip_mock.assert_called_once_with( + mock.ANY, + self.floating_ip.id, + ignore_missing=False, + ) + self.network.update_ip.assert_called_once_with( + self.floating_ip, **attrs) + + +class TestUnsetFloatingIP(TestFloatingIPNetwork): + + floating_network = network_fakes.FakeNetwork.create_one_network() + subnet = network_fakes.FakeSubnet.create_one_subnet() + port = network_fakes.FakePort.create_one_port() + + # The floating ip to be deleted. + floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip( + attrs={ + 'floating_network_id': floating_network.id, + 'port_id': port.id, + } + ) + + def setUp(self): + super(TestUnsetFloatingIP, self).setUp() + self.network.find_ip = mock.Mock(return_value=self.floating_ip) + self.network.update_ip = mock.Mock(return_value=None) + + # Get the command object to test + self.cmd = fip.UnsetFloatingIP(self.app, self.namespace) + + @mock.patch( + "openstackclient.tests.unit.network.v2.test_floating_ip." + + "fip._find_floating_ip" + ) + def test_floating_ip_unset_port(self, find_floating_ip_mock): + find_floating_ip_mock.side_effect = [ + self.floating_ip, + ] + arglist = [ + self.floating_ip.id, + "--port", + ] + verifylist = [ + ('floating_ip', self.floating_ip.id), + ('port', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + attrs = { + 'port_id': None, + } + find_floating_ip_mock.assert_called_once_with( + mock.ANY, + self.floating_ip.id, + ignore_missing=False, + ) + self.network.update_ip.assert_called_once_with( + self.floating_ip, **attrs) + + self.assertIsNone(result) + + # Tests for Nova network # class TestFloatingIPCompute(compute_fakes.TestComputev2): @@ -639,7 +775,7 @@ class TestCreateFloatingIPCompute(TestFloatingIPCompute): self.compute.floating_ips.create.return_value = self.floating_ip # Get the command object to test - self.cmd = floating_ip.CreateFloatingIP(self.app, None) + self.cmd = fip.CreateFloatingIP(self.app, None) def test_create_no_options(self): arglist = [] @@ -682,7 +818,7 @@ class TestDeleteFloatingIPCompute(TestFloatingIPCompute): compute_fakes.FakeFloatingIP.get_floating_ips(self.floating_ips)) # Get the command object to test - self.cmd = floating_ip.DeleteFloatingIP(self.app, None) + self.cmd = fip.DeleteFloatingIP(self.app, None) def test_floating_ip_delete(self): arglist = [ @@ -782,7 +918,7 @@ class TestListFloatingIPCompute(TestFloatingIPCompute): self.compute.floating_ips.list.return_value = self.floating_ips # Get the command object to test - self.cmd = floating_ip.ListFloatingIP(self.app, None) + self.cmd = fip.ListFloatingIP(self.app, None) def test_floating_ip_list(self): arglist = [] @@ -826,7 +962,7 @@ class TestShowFloatingIPCompute(TestFloatingIPCompute): self.compute.floating_ips.get.return_value = self.floating_ip # Get the command object to test - self.cmd = floating_ip.ShowFloatingIP(self.app, None) + self.cmd = fip.ShowFloatingIP(self.app, None) def test_floating_ip_show(self): arglist = [ diff --git a/openstackclient/tests/unit/network/v2/test_port.py b/openstackclient/tests/unit/network/v2/test_port.py index 701af879..851bf25a 100644 --- a/openstackclient/tests/unit/network/v2/test_port.py +++ b/openstackclient/tests/unit/network/v2/test_port.py @@ -57,6 +57,7 @@ class TestPort(network_fakes.TestNetworkV2): 'network_id', 'port_security_enabled', 'project_id', + 'qos_policy_id', 'security_group_ids', 'status', ) @@ -82,6 +83,7 @@ class TestPort(network_fakes.TestNetworkV2): fake_port.network_id, fake_port.port_security_enabled, fake_port.project_id, + fake_port.qos_policy_id, utils.format_list(fake_port.security_group_ids), fake_port.status, ) @@ -422,6 +424,35 @@ class TestCreatePort(TestPort): self.assertEqual(ref_columns, columns) self.assertEqual(ref_data, data) + def test_create_port_with_qos(self): + qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy() + self.network.find_qos_policy = mock.Mock(return_value=qos_policy) + arglist = [ + '--network', self._port.network_id, + '--qos-policy', qos_policy.id, + 'test-port', + ] + verifylist = [ + ('network', self._port.network_id,), + ('enable', True), + ('qos_policy', qos_policy.id), + ('name', 'test-port'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = (self.cmd.take_action(parsed_args)) + + self.network.create_port.assert_called_once_with(**{ + 'admin_state_up': True, + 'network_id': self._port.network_id, + 'qos_policy_id': qos_policy.id, + 'name': 'test-port', + }) + + ref_columns, ref_data = self._get_common_cols_data(self._port) + self.assertEqual(ref_columns, columns) + self.assertEqual(ref_data, data) + def test_create_port_security_enabled(self): arglist = [ '--network', self._port.network_id, @@ -1316,6 +1347,30 @@ class TestSetPort(TestPort): 'port_security_enabled': False, }) + def test_set_port_with_qos(self): + qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy() + self.network.find_qos_policy = mock.Mock(return_value=qos_policy) + _testport = network_fakes.FakePort.create_one_port( + {'qos_policy_id': None}) + self.network.find_port = mock.Mock(return_value=_testport) + arglist = [ + '--qos-policy', qos_policy.id, + _testport.name, + ] + verifylist = [ + ('qos_policy', qos_policy.id), + ('port', _testport.name), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + attrs = { + 'qos_policy_id': qos_policy.id, + } + self.network.update_port.assert_called_once_with(_testport, **attrs) + self.assertIsNone(result) + class TestShowPort(TestPort): @@ -1379,6 +1434,7 @@ class TestUnsetPort(TestPort): '--fixed-ip', 'subnet=042eb10a-3a18-4658-ab-cf47c8d03152,ip-address=1.0.0.0', '--binding-profile', 'Superman', + '--qos-policy', self._testport.name, ] verifylist = [ @@ -1386,6 +1442,7 @@ class TestUnsetPort(TestPort): 'subnet': '042eb10a-3a18-4658-ab-cf47c8d03152', 'ip-address': '1.0.0.0'}]), ('binding_profile', ['Superman']), + ('qos_policy', True), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -1395,7 +1452,8 @@ class TestUnsetPort(TestPort): 'fixed_ips': [{ 'subnet_id': '042eb10a-3a18-4658-ab-cf47c8d03152', 'ip_address': '0.0.0.1'}], - 'binding:profile': {'batman': 'Joker'} + 'binding:profile': {'batman': 'Joker'}, + 'qos_policy_id': None } self.network.update_port.assert_called_once_with( self._testport, **attrs) diff --git a/openstackclient/tests/unit/network/v2/test_router.py b/openstackclient/tests/unit/network/v2/test_router.py index b837afd1..a4f91997 100644 --- a/openstackclient/tests/unit/network/v2/test_router.py +++ b/openstackclient/tests/unit/network/v2/test_router.py @@ -181,16 +181,17 @@ class TestCreateRouter(TestRouter): self.assertEqual(self.columns, columns) self.assertEqual(self.data, data) - def test_create_with_ha_option(self): + def _test_create_with_ha_options(self, option, ha): arglist = [ - '--ha', + option, self.new_router.name, ] verifylist = [ ('name', self.new_router.name), ('enable', True), ('distributed', False), - ('ha', True), + ('ha', ha), + ('no_ha', not ha), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -199,11 +200,17 @@ class TestCreateRouter(TestRouter): self.network.create_router.assert_called_once_with(**{ 'admin_state_up': True, 'name': self.new_router.name, - 'ha': True, + 'ha': ha, }) self.assertEqual(self.columns, columns) self.assertEqual(self.data, data) + def test_create_with_ha_option(self): + self._test_create_with_ha_options('--ha', True) + + def test_create_with_no_ha_option(self): + self._test_create_with_ha_options('--no-ha', False) + def test_create_with_AZ_hints(self): arglist = [ self.new_router.name, |
