diff options
Diffstat (limited to 'openstackclient')
12 files changed, 311 insertions, 28 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index d4edf8c5..03419982 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -300,6 +300,39 @@ class AddPort(command.Command): server.interface_attach(port_id=port_id, net_id=None, fixed_ip=None) +class AddNetwork(command.Command): + _description = _("Add network to server") + + def get_parser(self, prog_name): + parser = super(AddNetwork, self).get_parser(prog_name) + parser.add_argument( + "server", + metavar="<server>", + help=_("Server to add the network to (name or ID)"), + ) + parser.add_argument( + "network", + metavar="<network>", + help=_("Network to add to 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 + + server.interface_attach(port_id=None, net_id=net_id, fixed_ip=None) + + class AddServerSecurityGroup(command.Command): _description = _("Add security group to server") diff --git a/openstackclient/network/v2/network_agent.py b/openstackclient/network/v2/network_agent.py index ed4970a4..ba2a2633 100644 --- a/openstackclient/network/v2/network_agent.py +++ b/openstackclient/network/v2/network_agent.py @@ -134,8 +134,7 @@ class DeleteNetworkAgent(command.Command): for agent in parsed_args.network_agent: try: - obj = client.get_agent(agent, ignore_missing=False) - client.delete_agent(obj) + client.delete_agent(agent, ignore_missing=False) except Exception as e: result += 1 LOG.error(_("Failed to delete network agent with " diff --git a/openstackclient/network/v2/network_qos_rule_type.py b/openstackclient/network/v2/network_qos_rule_type.py index 52f8e235..7b92c8ad 100644 --- a/openstackclient/network/v2/network_qos_rule_type.py +++ b/openstackclient/network/v2/network_qos_rule_type.py @@ -17,6 +17,17 @@ from osc_lib.command import command from osc_lib import utils from openstackclient.i18n import _ +from openstackclient.network import sdk_utils + + +def _get_columns(item): + column_map = { + "type": "rule_type_name", + "drivers": "drivers", + } + invisible_columns = ["id", "name"] + return sdk_utils.get_osc_show_columns_for_sdk_resource( + item, column_map, invisible_columns) class ListNetworkQosRuleType(command.Lister): @@ -36,3 +47,23 @@ class ListNetworkQosRuleType(command.Lister): (utils.get_item_properties( s, columns, formatters={}, ) for s in data)) + + +class ShowNetworkQosRuleType(command.ShowOne): + _description = _("Show details about supported QoS rule type") + + def get_parser(self, prog_name): + parser = super(ShowNetworkQosRuleType, self).get_parser(prog_name) + parser.add_argument( + 'rule_type', + metavar="<qos-rule-type-name>", + help=_("Name of QoS rule type") + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + obj = client.get_qos_rule_type(parsed_args.rule_type) + display_columns, columns = _get_columns(obj) + data = utils.get_item_properties(obj, columns) + return display_columns, data diff --git a/openstackclient/network/v2/network_rbac.py b/openstackclient/network/v2/network_rbac.py index 90754737..6cf82559 100644 --- a/openstackclient/network/v2/network_rbac.py +++ b/openstackclient/network/v2/network_rbac.py @@ -51,11 +51,14 @@ def _get_attrs(client_manager, parsed_args): attrs['object_id'] = object_id identity_client = client_manager.identity - project_id = identity_common.find_project( - identity_client, - parsed_args.target_project, - parsed_args.target_project_domain, - ).id + if parsed_args.target_project is not None: + project_id = identity_common.find_project( + identity_client, + parsed_args.target_project, + parsed_args.target_project_domain, + ).id + elif parsed_args.target_all_projects: + project_id = '*' attrs['target_tenant'] = project_id if parsed_args.project is not None: project_id = identity_common.find_project( @@ -96,13 +99,19 @@ class CreateNetworkRBAC(command.ShowOne): help=_('Action for the RBAC policy ' '("access_as_external" or "access_as_shared")') ) - parser.add_argument( + target_project_group = parser.add_mutually_exclusive_group( + required=True) + target_project_group.add_argument( '--target-project', - required=True, metavar="<target-project>", help=_('The project to which the RBAC policy ' 'will be enforced (name or ID)') ) + target_project_group.add_argument( + '--target-all-projects', + action='store_true', + help=_('Allow creating RBAC policy for all projects.') + ) parser.add_argument( '--target-project-domain', metavar='<target-project-domain>', diff --git a/openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py b/openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py index a6ee3e10..56cd8920 100644 --- a/openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py +++ b/openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py @@ -35,3 +35,10 @@ class NetworkQosRuleTypeTests(common.NetworkTests): 'network qos rule type list -f json')) for rule_type in self.AVAILABLE_RULE_TYPES: self.assertIn(rule_type, [x['Type'] for x in cmd_output]) + + def test_qos_rule_type_details(self): + for rule_type in self.AVAILABLE_RULE_TYPES: + cmd_output = json.loads(self.openstack( + 'network qos rule type show %s -f json' % rule_type)) + self.assertEqual(rule_type, cmd_output['rule_type_name']) + self.assertIn("drivers", cmd_output.keys()) diff --git a/openstackclient/tests/unit/common/test_command.py b/openstackclient/tests/unit/common/test_command.py index f24b290b..6ddb7c12 100644 --- a/openstackclient/tests/unit/common/test_command.py +++ b/openstackclient/tests/unit/common/test_command.py @@ -14,9 +14,9 @@ import mock +from osc_lib.command import command from osc_lib import exceptions -from openstackclient.common import command from openstackclient.tests.unit import fakes as test_fakes from openstackclient.tests.unit import utils as test_utils diff --git a/openstackclient/tests/unit/common/test_logs.py b/openstackclient/tests/unit/common/test_logs.py index b1e4d612..421234d6 100644 --- a/openstackclient/tests/unit/common/test_logs.py +++ b/openstackclient/tests/unit/common/test_logs.py @@ -18,7 +18,8 @@ import logging import mock -from openstackclient.common import logs +from osc_lib import logs + from openstackclient.tests.unit import utils diff --git a/openstackclient/tests/unit/common/test_parseractions.py b/openstackclient/tests/unit/common/test_parseractions.py index 1212ad23..d015da43 100644 --- a/openstackclient/tests/unit/common/test_parseractions.py +++ b/openstackclient/tests/unit/common/test_parseractions.py @@ -18,7 +18,8 @@ import argparse -from openstackclient.common import parseractions +from osc_lib.cli import parseractions + from openstackclient.tests.unit import utils diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index a1225c30..ad52e232 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -232,6 +232,53 @@ class TestServerAddPort(TestServer): self.find_port.assert_not_called() +class TestServerAddNetwork(TestServer): + + def setUp(self): + super(TestServerAddNetwork, self).setUp() + + # Get the command object to test + self.cmd = server.AddNetwork(self.app, None) + + # Set add_fixed_ip method to be tested. + self.methods = { + 'interface_attach': None, + } + + self.find_network = mock.Mock() + self.app.client_manager.network.find_network = self.find_network + + def _test_server_add_network(self, net_id): + 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_attach.assert_called_once_with( + port_id=None, net_id=net_id, fixed_ip=None) + self.assertIsNone(result) + + def test_server_add_network(self): + self._test_server_add_network(self.find_network.return_value.id) + self.find_network.assert_called_once_with( + 'fake-network', ignore_missing=False) + + def test_server_add_network_no_neutron(self): + self.app.client_manager.network_endpoint_enabled = False + self._test_server_add_network('fake-network') + self.find_network.assert_not_called() + + @mock.patch( 'openstackclient.api.compute_v2.APIv2.security_group_find' ) @@ -2170,6 +2217,91 @@ class TestServerRemoveFixedIP(TestServer): self.assertIsNone(result) +class TestServerRescue(TestServer): + + def setUp(self): + super(TestServerRescue, self).setUp() + + # Return value for utils.find_resource for image + self.image = image_fakes.FakeImage.create_one_image() + self.images_mock.get.return_value = self.image + + new_server = compute_fakes.FakeServer.create_one_server() + attrs = { + 'id': new_server.id, + 'image': { + 'id': self.image.id, + }, + 'networks': {}, + 'adminPass': 'passw0rd', + } + methods = { + 'rescue': new_server, + } + self.server = compute_fakes.FakeServer.create_one_server( + attrs=attrs, + methods=methods, + ) + + # Return value for utils.find_resource for server + self.servers_mock.get.return_value = self.server + + self.cmd = server.RescueServer(self.app, None) + + def test_rescue_with_current_image(self): + arglist = [ + self.server.id, + ] + verifylist = [ + ('server', self.server.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # Get the command object to test + self.cmd.take_action(parsed_args) + + self.servers_mock.get.assert_called_with(self.server.id) + self.server.rescue.assert_called_with(image=None, password=None) + + def test_rescue_with_new_image(self): + new_image = image_fakes.FakeImage.create_one_image() + self.images_mock.get.return_value = new_image + arglist = [ + '--image', new_image.id, + self.server.id, + ] + verifylist = [ + ('image', new_image.id), + ('server', self.server.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # Get the command object to test + self.cmd.take_action(parsed_args) + + self.servers_mock.get.assert_called_with(self.server.id) + self.images_mock.get.assert_called_with(new_image.id) + self.server.rescue.assert_called_with(image=new_image, password=None) + + def test_rescue_with_current_image_and_password(self): + password = 'password-xxx' + arglist = [ + '--password', password, + self.server.id, + ] + verifylist = [ + ('password', password), + ('server', self.server.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # Get the command object to test + self.cmd.take_action(parsed_args) + + self.servers_mock.get.assert_called_with(self.server.id) + self.server.rescue.assert_called_with(image=None, password=password) + + class TestServerRemoveFloatingIP(TestServer): def setUp(self): diff --git a/openstackclient/tests/unit/network/v2/test_network_agent.py b/openstackclient/tests/unit/network/v2/test_network_agent.py index 12e40cdb..709fb1c6 100644 --- a/openstackclient/tests/unit/network/v2/test_network_agent.py +++ b/openstackclient/tests/unit/network/v2/test_network_agent.py @@ -121,10 +121,6 @@ class TestDeleteNetworkAgent(TestNetworkAgent): def setUp(self): super(TestDeleteNetworkAgent, self).setUp() self.network.delete_agent = mock.Mock(return_value=None) - self.network.get_agent = ( - network_fakes.FakeNetworkAgent.get_network_agents( - agents=self.network_agents) - ) # Get the command object to test self.cmd = network_agent.DeleteNetworkAgent(self.app, self.namespace) @@ -140,10 +136,8 @@ class TestDeleteNetworkAgent(TestNetworkAgent): parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) - self.network.get_agent.assert_called_once_with( - self.network_agents[0].id, ignore_missing=False) self.network.delete_agent.assert_called_once_with( - self.network_agents[0]) + self.network_agents[0].id, ignore_missing=False) self.assertIsNone(result) def test_multi_network_agents_delete(self): @@ -160,7 +154,7 @@ class TestDeleteNetworkAgent(TestNetworkAgent): calls = [] for n in self.network_agents: - calls.append(call(n)) + calls.append(call(n.id, ignore_missing=False)) self.network.delete_agent.assert_has_calls(calls) self.assertIsNone(result) @@ -175,9 +169,9 @@ class TestDeleteNetworkAgent(TestNetworkAgent): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - find_mock_result = [self.network_agents[0], exceptions.CommandError] - self.network.get_agent = ( - mock.Mock(side_effect=find_mock_result) + delete_mock_result = [True, exceptions.CommandError] + self.network.delete_agent = ( + mock.Mock(side_effect=delete_mock_result) ) try: @@ -186,13 +180,10 @@ class TestDeleteNetworkAgent(TestNetworkAgent): except exceptions.CommandError as e: self.assertEqual('1 of 2 network agents failed to delete.', str(e)) - self.network.get_agent.assert_any_call( + self.network.delete_agent.assert_any_call( self.network_agents[0].id, ignore_missing=False) - self.network.get_agent.assert_any_call( + self.network.delete_agent.assert_any_call( 'unexist_network_agent', ignore_missing=False) - self.network.delete_agent.assert_called_once_with( - self.network_agents[0] - ) class TestListNetworkAgent(TestNetworkAgent): diff --git a/openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py b/openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py index b93abe80..80c52bf7 100644 --- a/openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +++ b/openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py @@ -17,6 +17,7 @@ import mock from openstackclient.network.v2 import network_qos_rule_type as _qos_rule_type from openstackclient.tests.unit.network.v2 import fakes as network_fakes +from openstackclient.tests.unit import utils as tests_utils class TestNetworkQosRuleType(network_fakes.TestNetworkV2): @@ -27,6 +28,60 @@ class TestNetworkQosRuleType(network_fakes.TestNetworkV2): self.network = self.app.client_manager.network +class TestShowNetworkQosRuleType(TestNetworkQosRuleType): + + attrs = { + 'drivers': [{ + 'name': 'driver 1', + 'supported_parameters': [] + }] + } + # The QoS policies to show. + qos_rule_type = ( + network_fakes.FakeNetworkQosRuleType.create_one_qos_rule_type(attrs)) + columns = ( + 'drivers', + 'rule_type_name' + ) + data = [ + qos_rule_type.drivers, + qos_rule_type.type + ] + + def setUp(self): + super(TestShowNetworkQosRuleType, self).setUp() + self.network.get_qos_rule_type = mock.Mock( + return_value=self.qos_rule_type) + + # Get the command object to test + self.cmd = _qos_rule_type.ShowNetworkQosRuleType(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_show_all_options(self): + arglist = [ + self.qos_rule_type.type, + ] + verifylist = [ + ('rule_type', self.qos_rule_type.type), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + self.network.get_qos_rule_type.assert_called_once_with( + self.qos_rule_type.type) + self.assertEqual(self.columns, columns) + self.assertEqual(list(self.data), list(data)) + + class TestListNetworkQosRuleType(TestNetworkQosRuleType): # The QoS policies to list up. diff --git a/openstackclient/tests/unit/network/v2/test_network_rbac.py b/openstackclient/tests/unit/network/v2/test_network_rbac.py index 935ce075..70c38528 100644 --- a/openstackclient/tests/unit/network/v2/test_network_rbac.py +++ b/openstackclient/tests/unit/network/v2/test_network_rbac.py @@ -163,6 +163,30 @@ class TestCreateNetworkRBAC(TestNetworkRBAC): self.assertEqual(self.columns, columns) self.assertEqual(self.data, list(data)) + def test_network_rbac_create_with_target_all_projects(self): + arglist = [ + '--type', self.rbac_policy.object_type, + '--action', self.rbac_policy.action, + '--target-all-projects', + self.rbac_policy.object_id, + ] + verifylist = [ + ('type', self.rbac_policy.object_type), + ('action', self.rbac_policy.action), + ('target_all_projects', True), + ('rbac_object', self.rbac_policy.object_id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.network.create_rbac_policy.assert_called_with(**{ + 'object_id': self.rbac_policy.object_id, + 'object_type': self.rbac_policy.object_type, + 'action': self.rbac_policy.action, + 'target_tenant': '*', + }) + def test_network_rbac_create_all_options(self): arglist = [ '--type', self.rbac_policy.object_type, |
