summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py33
-rw-r--r--openstackclient/network/v2/network_agent.py3
-rw-r--r--openstackclient/network/v2/network_qos_rule_type.py31
-rw-r--r--openstackclient/network/v2/network_rbac.py23
-rw-r--r--openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py7
-rw-r--r--openstackclient/tests/unit/common/test_command.py2
-rw-r--r--openstackclient/tests/unit/common/test_logs.py3
-rw-r--r--openstackclient/tests/unit/common/test_parseractions.py3
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py132
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_agent.py23
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py55
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_rbac.py24
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,