Skip to content

Commit fcd46ac

Browse files
1049965823mriedem
authored andcommitted
Microversion 2.77: Support Specifying AZ to unshelve
This patch adds a new parameter ``--availability-zone`` to ``openstack server unshelve`` command. This can help users to specify an ``availability_zone`` to unshelve a shelve offloaded server from 2.77 microversion. Depends-On: https://review.opendev.org/679295 Implements: blueprint support-specifying-az-when-restore-shelved-server Change-Id: Ia431e27c2a17fe16466707cc362532860ecf22df
1 parent 7549d26 commit fcd46ac

5 files changed

Lines changed: 87 additions & 6 deletions

File tree

lower-constraints.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ python-mimeparse==1.6.0
9999
python-mistralclient==3.1.0
100100
python-muranoclient==0.8.2
101101
python-neutronclient==6.7.0
102-
python-novaclient==14.2.0
102+
python-novaclient==15.0.0
103103
python-octaviaclient==1.3.0
104104
python-rsdclient==0.1.0
105105
python-saharaclient==1.4.0

openstackclient/compute/v2/server.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2811,12 +2811,32 @@ def get_parser(self, prog_name):
28112811
nargs='+',
28122812
help=_('Server(s) to unshelve (name or ID)'),
28132813
)
2814+
parser.add_argument(
2815+
'--availability-zone',
2816+
default=None,
2817+
help=_('Name of the availability zone in which to unshelve a '
2818+
'SHELVED_OFFLOADED server (supported by '
2819+
'--os-compute-api-version 2.77 or above)'),
2820+
)
28142821
return parser
28152822

28162823
def take_action(self, parsed_args):
28172824
compute_client = self.app.client_manager.compute
2825+
support_az = compute_client.api_version >= api_versions.APIVersion(
2826+
'2.77')
2827+
if not support_az and parsed_args.availability_zone:
2828+
msg = _("--os-compute-api-version 2.77 or greater is required "
2829+
"to support the '--availability-zone' option.")
2830+
raise exceptions.CommandError(msg)
2831+
28182832
for server in parsed_args.server:
2819-
utils.find_resource(
2820-
compute_client.servers,
2821-
server,
2822-
).unshelve()
2833+
if support_az:
2834+
utils.find_resource(
2835+
compute_client.servers,
2836+
server
2837+
).unshelve(availability_zone=parsed_args.availability_zone)
2838+
else:
2839+
utils.find_resource(
2840+
compute_client.servers,
2841+
server,
2842+
).unshelve()

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ def run_method_with_servers(self, method_name, server_count):
109109
version = self.app.client_manager.compute.api_version
110110
if version >= api_versions.APIVersion('2.73'):
111111
method.assert_called_with(reason=None)
112+
elif method_name == 'unshelve':
113+
version = self.app.client_manager.compute.api_version
114+
if version >= api_versions.APIVersion('2.77'):
115+
method.assert_called_with(availability_zone=None)
112116
else:
113117
method.assert_called_with()
114118
else:
@@ -4777,6 +4781,56 @@ def test_unshelve_one_server(self):
47774781
def test_unshelve_multi_servers(self):
47784782
self.run_method_with_servers('unshelve', 3)
47794783

4784+
def test_unshelve_server_with_specified_az(self):
4785+
server = compute_fakes.FakeServer.create_one_server()
4786+
arglist = [
4787+
server.id,
4788+
'--availability-zone', "foo-az",
4789+
]
4790+
verifylist = [
4791+
('availability_zone', "foo-az"),
4792+
('server', [server.id])
4793+
]
4794+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4795+
ex = self.assertRaises(exceptions.CommandError,
4796+
self.cmd.take_action,
4797+
parsed_args)
4798+
self.assertIn(
4799+
'--os-compute-api-version 2.77 or greater is required', str(ex))
4800+
4801+
4802+
class TestServerUnshelveV277(TestServerUnshelve):
4803+
4804+
def setUp(self):
4805+
super(TestServerUnshelveV277, self).setUp()
4806+
4807+
self.server = compute_fakes.FakeServer.create_one_server(
4808+
methods=self.methods)
4809+
4810+
# This is the return value for utils.find_resource()
4811+
self.servers_mock.get.return_value = self.server
4812+
4813+
# Get the command object to test
4814+
self.cmd = server.UnshelveServer(self.app, None)
4815+
4816+
def test_specified_az_to_unshelve_with_v277(self):
4817+
self.app.client_manager.compute.api_version = api_versions.APIVersion(
4818+
'2.77')
4819+
4820+
arglist = [
4821+
'--availability-zone', "foo-az",
4822+
self.server.id,
4823+
]
4824+
verifylist = [
4825+
('availability_zone', "foo-az"),
4826+
('server', [self.server.id])
4827+
]
4828+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4829+
4830+
self.cmd.take_action(parsed_args)
4831+
self.servers_mock.get.assert_called_with(self.server.id)
4832+
self.server.unshelve.assert_called_with(availability_zone="foo-az")
4833+
47804834

47814835
class TestServerGeneral(TestServer):
47824836
OLD = {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
features:
3+
- Add ``--availability-zone`` option to ``server unshelve``
4+
command to enable users to specify an availability zone during
5+
unshelve of a shelved offloaded server. Note that it requires
6+
``--os-compute-api-version 2.77`` or greater.
7+
[Blueprint ` <https://blueprints.launchpad.net/nova/+spec/support-specifying-az-when-restore-shelved-server`_]

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ oslo.i18n>=3.15.3 # Apache-2.0
1313
oslo.utils>=3.33.0 # Apache-2.0
1414
python-glanceclient>=2.8.0 # Apache-2.0
1515
python-keystoneclient>=3.17.0 # Apache-2.0
16-
python-novaclient>=14.2.0 # Apache-2.0
16+
python-novaclient>=15.0.0 # Apache-2.0
1717
python-cinderclient>=3.3.0 # Apache-2.0

0 commit comments

Comments
 (0)