summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py62
-rw-r--r--openstackclient/tests/functional/compute/v2/test_server.py13
-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
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):