summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorStephen Finucane <sfinucan@redhat.com>2020-11-18 11:27:30 +0000
committerStephen Finucane <sfinucan@redhat.com>2021-01-08 18:01:29 +0000
commit2b073c2034acdabb8d4097b7f2c0408e53fe2d63 (patch)
tree78bf2a9c9ee1a2a2a50fa6d3ffca7a67ca62f3ea /openstackclient
parent64c2a1a453fce8f4e2e7e8441692af007c176459 (diff)
downloadpython-openstackclient-2b073c2034acdabb8d4097b7f2c0408e53fe2d63.tar.gz
Add 'server unshelve --wait' option
This was recently added to the 'server shelve' command. Add it now for the 'unshelve' command. Change-Id: I633dd85b60cf70b4f8610f414d82669dd6a53111 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py61
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py80
2 files changed, 96 insertions, 45 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 33545a74..59fc4b7d 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -4131,25 +4131,54 @@ class UnshelveServer(command.Command):
'SHELVED_OFFLOADED server (supported by '
'--os-compute-api-version 2.77 or above)'),
)
+ parser.add_argument(
+ '--wait',
+ action='store_true',
+ default=False,
+ help=_('Wait for unshelve operation to complete'),
+ )
return parser
def take_action(self, parsed_args):
+
+ def _show_progress(progress):
+ if progress:
+ self.app.stdout.write('\rProgress: %s' % progress)
+ self.app.stdout.flush()
+
compute_client = self.app.client_manager.compute
- support_az = compute_client.api_version >= api_versions.APIVersion(
- '2.77')
- if not support_az and parsed_args.availability_zone:
- msg = _("--os-compute-api-version 2.77 or greater is required "
- "to support the '--availability-zone' option.")
- raise exceptions.CommandError(msg)
+ kwargs = {}
+
+ if parsed_args.availability_zone:
+ if compute_client.api_version < api_versions.APIVersion('2.77'):
+ msg = _(
+ '--os-compute-api-version 2.77 or greater is required '
+ 'to support the --availability-zone option'
+ )
+ raise exceptions.CommandError(msg)
+
+ kwargs['availability_zone'] = parsed_args.availability_zone
for server in parsed_args.server:
- if support_az:
- utils.find_resource(
- compute_client.servers,
- server
- ).unshelve(availability_zone=parsed_args.availability_zone)
- else:
- utils.find_resource(
- compute_client.servers,
- server,
- ).unshelve()
+ server_obj = utils.find_resource(
+ compute_client.servers,
+ server,
+ )
+
+ if server_obj.status.lower() not in (
+ 'shelved', 'shelved_offloaded',
+ ):
+ continue
+
+ server_obj.unshelve(**kwargs)
+
+ if parsed_args.wait:
+ if not utils.wait_for_status(
+ compute_client.servers.get, server_obj.id,
+ success_status=('active', 'shutoff'),
+ callback=_show_progress,
+ ):
+ LOG.error(_('Error unshelving server %s'), server_obj.id)
+ self.app.stdout.write(
+ _('Error unshelving server: %s\n') % server_obj.id)
+ raise SystemExit
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 9ad6d155..2c0cadfc 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -6969,6 +6969,9 @@ class TestServerUnshelve(TestServer):
self.methods = {
'unshelve': None,
}
+ self.attrs = {
+ 'status': 'SHELVED',
+ }
def test_unshelve_one_server(self):
self.run_method_with_servers('unshelve', 1)
@@ -6976,55 +6979,74 @@ class TestServerUnshelve(TestServer):
def test_unshelve_multi_servers(self):
self.run_method_with_servers('unshelve', 3)
- def test_unshelve_server_with_specified_az(self):
- server = compute_fakes.FakeServer.create_one_server()
+ def test_unshelve_with_specified_az(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.77')
+
+ server = compute_fakes.FakeServer.create_one_server(
+ attrs=self.attrs, methods=self.methods)
+ self.servers_mock.get.return_value = server
arglist = [
- server.id,
'--availability-zone', "foo-az",
+ server.id,
]
verifylist = [
('availability_zone', "foo-az"),
('server', [server.id])
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- ex = self.assertRaises(exceptions.CommandError,
- self.cmd.take_action,
- parsed_args)
- self.assertIn(
- '--os-compute-api-version 2.77 or greater is required', str(ex))
-
-class TestServerUnshelveV277(TestServerUnshelve):
-
- def setUp(self):
- super(TestServerUnshelveV277, self).setUp()
-
- self.server = compute_fakes.FakeServer.create_one_server(
- methods=self.methods)
-
- # This is the return value for utils.find_resource()
- self.servers_mock.get.return_value = self.server
+ self.cmd.take_action(parsed_args)
- # Get the command object to test
- self.cmd = server.UnshelveServer(self.app, None)
+ self.servers_mock.get.assert_called_with(server.id)
+ server.unshelve.assert_called_with(availability_zone="foo-az")
- def test_specified_az_to_unshelve_with_v277(self):
- self.app.client_manager.compute.api_version = api_versions.APIVersion(
- '2.77')
+ def test_unshelve_with_specified_az_pre_v277(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.76')
+ server = compute_fakes.FakeServer.create_one_server(
+ attrs=self.attrs, methods=self.methods)
arglist = [
+ server.id,
'--availability-zone', "foo-az",
- self.server.id,
]
verifylist = [
('availability_zone', "foo-az"),
- ('server', [self.server.id])
+ ('server', [server.id])
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+ self.assertIn(
+ '--os-compute-api-version 2.77 or greater is required', str(ex))
- self.cmd.take_action(parsed_args)
- self.servers_mock.get.assert_called_with(self.server.id)
- self.server.unshelve.assert_called_with(availability_zone="foo-az")
+ @mock.patch.object(common_utils, 'wait_for_status', return_value=True)
+ def test_unshelve_with_wait(self, mock_wait_for_status):
+ server = compute_fakes.FakeServer.create_one_server(
+ attrs=self.attrs, methods=self.methods)
+ self.servers_mock.get.return_value = server
+
+ arglist = ['--wait', server.name]
+ verifylist = [
+ ('server', [server.name]),
+ ('wait', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.assertIsNone(result)
+
+ self.servers_mock.get.assert_called_once_with(server.name)
+ server.unshelve.assert_called_once_with()
+ mock_wait_for_status.assert_called_once_with(
+ self.servers_mock.get,
+ server.id,
+ callback=mock.ANY,
+ success_status=('active', 'shutoff'),
+ )
class TestServerGeneral(TestServer):