diff options
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/compute/v2/server.py | 35 | ||||
| -rw-r--r-- | openstackclient/compute/v2/server_group.py | 5 | ||||
| -rw-r--r-- | openstackclient/network/client.py | 27 | ||||
| -rw-r--r-- | openstackclient/network/common.py | 2 | ||||
| -rw-r--r-- | openstackclient/network/v2/router.py | 21 | ||||
| -rw-r--r-- | openstackclient/tests/functional/common/test_module.py | 1 | ||||
| -rw-r--r-- | openstackclient/tests/unit/compute/v2/test_server.py | 51 | ||||
| -rw-r--r-- | openstackclient/tests/unit/compute/v2/test_server_group.py | 4 | ||||
| -rw-r--r-- | openstackclient/tests/unit/network/v2/test_router.py | 23 |
9 files changed, 149 insertions, 20 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 03419982..78c56788 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -1542,6 +1542,41 @@ class RemovePort(command.Command): server.interface_detach(port_id) +class RemoveNetwork(command.Command): + _description = _("Remove all ports of a network from server") + + def get_parser(self, prog_name): + parser = super(RemoveNetwork, self).get_parser(prog_name) + parser.add_argument( + "server", + metavar="<server>", + help=_("Server to remove the port from (name or ID)"), + ) + parser.add_argument( + "network", + metavar="<network>", + help=_("Network to remove from the server (name or ID)"), + ) + return parser + + def take_action(self, parsed_args): + compute_client = self.app.client_manager.compute + + server = utils.find_resource( + compute_client.servers, parsed_args.server) + + if self.app.client_manager.is_network_endpoint_enabled(): + network_client = self.app.client_manager.network + net_id = network_client.find_network( + parsed_args.network, ignore_missing=False).id + else: + net_id = parsed_args.network + + for inf in server.interface_list(): + if inf.net_id == net_id: + server.interface_detach(inf.port_id) + + class RemoveServerSecurityGroup(command.Command): _description = _("Remove security group from server") diff --git a/openstackclient/compute/v2/server_group.py b/openstackclient/compute/v2/server_group.py index c6e2161f..c49a552f 100644 --- a/openstackclient/compute/v2/server_group.py +++ b/openstackclient/compute/v2/server_group.py @@ -55,11 +55,12 @@ class CreateServerGroup(command.ShowOne): parser.add_argument( '--policy', metavar='<policy>', - choices=['affinity', 'anti-affinity'], default='affinity', help=_("Add a policy to <name> " "('affinity' or 'anti-affinity', " - "default to 'affinity')") + "defaults to 'affinity'). Specify --os-compute-api-version " + "2.15 or higher for the 'soft-affinity' or " + "'soft-anti-affinity' policy.") ) return parser diff --git a/openstackclient/network/client.py b/openstackclient/network/client.py index 9525b947..3566bfe5 100644 --- a/openstackclient/network/client.py +++ b/openstackclient/network/client.py @@ -14,7 +14,10 @@ import logging from openstack import connection -from openstack import profile +try: + from openstack import profile +except ImportError: + profile = None from osc_lib import utils from openstackclient.i18n import _ @@ -33,14 +36,20 @@ API_VERSIONS = { def make_client(instance): """Returns a network proxy""" - prof = profile.Profile() - prof.set_region(API_NAME, instance.region_name) - prof.set_version(API_NAME, instance._api_version[API_NAME]) - prof.set_interface(API_NAME, instance.interface) - conn = connection.Connection(authenticator=instance.session.auth, - verify=instance.session.verify, - cert=instance.session.cert, - profile=prof) + if profile is None: + # New SDK + conn = connection.Connection( + cloud_config=instance._cli_options, + session=instance.session) + else: + prof = profile.Profile() + prof.set_region(API_NAME, instance.region_name) + prof.set_version(API_NAME, instance._api_version[API_NAME]) + prof.set_interface(API_NAME, instance.interface) + conn = connection.Connection(authenticator=instance.session.auth, + verify=instance.session.verify, + cert=instance.session.cert, + profile=prof) LOG.debug('Connection: %s', conn) LOG.debug('Network client initialized using OpenStack SDK: %s', conn.network) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index a2e700be..eca0de3c 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -191,6 +191,8 @@ class NetworkAndComputeShowOne(command.ShowOne): self.app.client_manager.compute, parsed_args) except openstack.exceptions.HttpException as exc: msg = _("Error while executing command: %s") % exc.message + if exc.details: + msg += ", " + six.text_type(exc.details) raise exceptions.CommandError(msg) def get_parser(self, prog_name): diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index 4f908537..caf3236a 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -36,7 +36,7 @@ def _format_admin_state(state): return 'UP' if state else 'DOWN' -def _format_external_gateway_info(info): +def _format_router_info(info): try: return json.dumps(info) except (TypeError, KeyError): @@ -54,7 +54,7 @@ def _format_routes(routes): _formatters = { 'admin_state_up': _format_admin_state, 'is_admin_state_up': _format_admin_state, - 'external_gateway_info': _format_external_gateway_info, + 'external_gateway_info': _format_router_info, 'availability_zones': utils.format_list, 'availability_zone_hints': utils.format_list, 'routes': _format_routes, @@ -69,6 +69,8 @@ def _get_columns(item): 'is_distributed': 'distributed', 'is_admin_state_up': 'admin_state_up', } + if hasattr(item, 'interfaces_info'): + column_map['interfaces_info'] = 'interfaces_info' return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map) @@ -657,7 +659,22 @@ class ShowRouter(command.ShowOne): def take_action(self, parsed_args): client = self.app.client_manager.network obj = client.find_router(parsed_args.router, ignore_missing=False) + interfaces_info = [] + filters = {} + filters['device_id'] = obj.id + for port in client.ports(**filters): + if port.device_owner != "network:router_gateway": + for ip_spec in port.fixed_ips: + int_info = { + 'port_id': port.id, + 'ip_address': ip_spec.get('ip_address'), + 'subnet_id': ip_spec.get('subnet_id') + } + interfaces_info.append(int_info) + + setattr(obj, 'interfaces_info', interfaces_info) display_columns, columns = _get_columns(obj) + _formatters['interfaces_info'] = _format_router_info data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) diff --git a/openstackclient/tests/functional/common/test_module.py b/openstackclient/tests/functional/common/test_module.py index e9e4ee3a..d589f19c 100644 --- a/openstackclient/tests/functional/common/test_module.py +++ b/openstackclient/tests/functional/common/test_module.py @@ -27,7 +27,6 @@ class ModuleTest(base.TestCase): 'openstack'] LIBS = ['osc_lib', - 'os_client_config', 'keystoneauth1'] def test_module_list(self): diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index ad52e232..20b9532a 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -2380,6 +2380,57 @@ class TestServerRemovePort(TestServer): self.find_port.assert_not_called() +class TestServerRemoveNetwork(TestServer): + + def setUp(self): + super(TestServerRemoveNetwork, self).setUp() + + # Get the command object to test + self.cmd = server.RemoveNetwork(self.app, None) + + # Set method to be tested. + self.fake_inf = mock.Mock() + self.methods = { + 'interface_list': [self.fake_inf], + 'interface_detach': None, + } + + self.find_network = mock.Mock() + self.app.client_manager.network.find_network = self.find_network + + def _test_server_remove_network(self, network_id): + self.fake_inf.net_id = network_id + self.fake_inf.port_id = 'fake-port' + servers = self.setup_servers_mock(count=1) + network = 'fake-network' + + arglist = [ + servers[0].id, + network, + ] + verifylist = [ + ('server', servers[0].id), + ('network', network), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + servers[0].interface_list.assert_called_once_with() + servers[0].interface_detach.assert_called_once_with('fake-port') + self.assertIsNone(result) + + def test_server_remove_network(self): + self._test_server_remove_network(self.find_network.return_value.id) + self.find_network.assert_called_once_with( + 'fake-network', ignore_missing=False) + + def test_server_remove_network_no_neutron(self): + self.app.client_manager.network_endpoint_enabled = False + self._test_server_remove_network('fake-network') + self.find_network.assert_not_called() + + @mock.patch( 'openstackclient.api.compute_v2.APIv2.security_group_find' ) diff --git a/openstackclient/tests/unit/compute/v2/test_server_group.py b/openstackclient/tests/unit/compute/v2/test_server_group.py index 088497da..dc924e24 100644 --- a/openstackclient/tests/unit/compute/v2/test_server_group.py +++ b/openstackclient/tests/unit/compute/v2/test_server_group.py @@ -63,11 +63,11 @@ class TestServerGroupCreate(TestServerGroup): def test_server_group_create(self): arglist = [ - '--policy', 'anti-affinity', + '--policy', 'soft-anti-affinity', 'affinity_group', ] verifylist = [ - ('policy', 'anti-affinity'), + ('policy', 'soft-anti-affinity'), ('name', 'affinity_group'), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/unit/network/v2/test_router.py b/openstackclient/tests/unit/network/v2/test_router.py index 2248db9a..f383c1dd 100644 --- a/openstackclient/tests/unit/network/v2/test_router.py +++ b/openstackclient/tests/unit/network/v2/test_router.py @@ -137,7 +137,7 @@ class TestCreateRouter(TestRouter): osc_utils.format_list(new_router.availability_zones), new_router.description, new_router.distributed, - router._format_external_gateway_info(new_router.external_gateway_info), + router._format_router_info(new_router.external_gateway_info), new_router.ha, new_router.id, new_router.name, @@ -448,7 +448,7 @@ class TestListRouter(TestRouter): data_long.append( data[i] + ( router._format_routes(r.routes), - router._format_external_gateway_info(r.external_gateway_info), + router._format_router_info(r.external_gateway_info), osc_utils.format_list(r.availability_zones), osc_utils.format_list(r.tags), ) @@ -459,7 +459,7 @@ class TestListRouter(TestRouter): data_long_no_az.append( data[i] + ( router._format_routes(r.routes), - router._format_external_gateway_info(r.external_gateway_info), + router._format_router_info(r.external_gateway_info), osc_utils.format_list(r.tags), ) ) @@ -1118,6 +1118,15 @@ class TestShowRouter(TestRouter): # The router to set. _router = network_fakes.FakeRouter.create_one_router() + _port = network_fakes.FakePort.create_one_port({ + 'device_owner': 'network:router_interface', + 'device_id': _router.id + }) + setattr(_router, + 'interfaces_info', + [{'port_id': _port.id, + 'ip_address': _port.fixed_ips[0]['ip_address'], + 'subnet_id': _port.fixed_ips[0]['subnet_id']}]) columns = ( 'admin_state_up', @@ -1128,6 +1137,7 @@ class TestShowRouter(TestRouter): 'external_gateway_info', 'ha', 'id', + 'interfaces_info', 'name', 'project_id', 'routes', @@ -1140,9 +1150,10 @@ class TestShowRouter(TestRouter): osc_utils.format_list(_router.availability_zones), _router.description, _router.distributed, - router._format_external_gateway_info(_router.external_gateway_info), + router._format_router_info(_router.external_gateway_info), _router.ha, _router.id, + router._format_router_info(_router.interfaces_info), _router.name, _router.tenant_id, router._format_routes(_router.routes), @@ -1154,6 +1165,7 @@ class TestShowRouter(TestRouter): super(TestShowRouter, self).setUp() self.network.find_router = mock.Mock(return_value=self._router) + self.network.ports = mock.Mock(return_value=[self._port]) # Get the command object to test self.cmd = router.ShowRouter(self.app, self.namespace) @@ -1178,6 +1190,9 @@ class TestShowRouter(TestRouter): self.network.find_router.assert_called_once_with( self._router.name, ignore_missing=False) + self.network.ports.assert_called_with(**{ + 'device_id': self._router.id + }) self.assertEqual(self.columns, columns) self.assertEqual(self.data, data) |
