diff options
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/compute/v2/server.py | 62 | ||||
| -rw-r--r-- | openstackclient/tests/functional/compute/v2/test_server.py | 13 | ||||
| -rw-r--r-- | openstackclient/tests/unit/common/test_command.py | 2 | ||||
| -rw-r--r-- | openstackclient/tests/unit/common/test_logs.py | 3 | ||||
| -rw-r--r-- | openstackclient/tests/unit/common/test_parseractions.py | 3 | ||||
| -rw-r--r-- | openstackclient/tests/unit/compute/v2/test_server.py | 132 |
6 files changed, 206 insertions, 9 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 151c6783..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") @@ -1576,7 +1609,7 @@ class RemoveServerVolume(command.Command): ) -class RescueServer(command.ShowOne): +class RescueServer(command.Command): _description = _("Put server in rescue mode") def get_parser(self, prog_name): @@ -1586,16 +1619,35 @@ class RescueServer(command.ShowOne): metavar='<server>', help=_('Server (name or ID)'), ) + parser.add_argument( + '--image', + metavar='<image>', + help=_('Image (name or ID) to use for the rescue mode.' + ' Defaults to the currently used one.'), + ) + parser.add_argument( + '--password', + metavar='<password>', + help=_("Set the password on the rescued instance"), + ) return parser def take_action(self, parsed_args): - compute_client = self.app.client_manager.compute - _, body = utils.find_resource( + image_client = self.app.client_manager.image + + image = None + if parsed_args.image: + image = utils.find_resource( + image_client.images, + parsed_args.image, + ) + + utils.find_resource( compute_client.servers, parsed_args.server, - ).rescue() - return zip(*sorted(six.iteritems(body))) + ).rescue(image=image, + password=parsed_args.password) class ResizeServer(command.Command): diff --git a/openstackclient/tests/functional/compute/v2/test_server.py b/openstackclient/tests/functional/compute/v2/test_server.py index b7a25996..0b29fe5f 100644 --- a/openstackclient/tests/functional/compute/v2/test_server.py +++ b/openstackclient/tests/functional/compute/v2/test_server.py @@ -184,7 +184,18 @@ class ServerTests(common.ComputeTestCase): # rescue raw_output = self.openstack('server rescue ' + name) - self.assertNotEqual("", raw_output) + self.assertEqual("", raw_output) + self.wait_for_status(name, "RESCUE") + + # unrescue + raw_output = self.openstack('server unrescue ' + name) + self.assertEqual("", raw_output) + self.wait_for_status(name, "ACTIVE") + + # rescue with image + raw_output = self.openstack('server rescue --image ' + + self.image_name + ' ' + name) + self.assertEqual("", raw_output) self.wait_for_status(name, "RESCUE") # unrescue 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): |
