summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py35
-rw-r--r--openstackclient/compute/v2/server_group.py5
-rw-r--r--openstackclient/network/client.py27
-rw-r--r--openstackclient/network/common.py2
-rw-r--r--openstackclient/network/v2/router.py21
-rw-r--r--openstackclient/tests/functional/common/test_module.py1
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py51
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server_group.py4
-rw-r--r--openstackclient/tests/unit/network/v2/test_router.py23
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)