Skip to content

Commit e43596c

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Microversion 2.77: Support Specifying AZ to unshelve"
2 parents 6aae5b2 + ecfa521 commit e43596c

File tree

9 files changed

+133
-4
lines changed

9 files changed

+133
-4
lines changed

doc/source/cli/nova.rst

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3722,7 +3722,7 @@ nova unshelve
37223722

37233723
.. code-block:: console
37243724
3725-
usage: nova unshelve <server>
3725+
usage: nova unshelve [--availability-zone <availability_zone>] <server>
37263726
37273727
Unshelve a server.
37283728

@@ -3731,6 +3731,12 @@ Unshelve a server.
37313731
``<server>``
37323732
Name or ID of server.
37333733

3734+
**Optional arguments:**
3735+
3736+
``--availability-zone <availability_zone>``
3737+
Name of the availability zone in which to unshelve a ``SHELVED_OFFLOADED``
3738+
server. (Supported by API versions '2.77' - '2.latest')
3739+
37343740
.. _nova_update:
37353741

37363742
nova update

novaclient/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@
2525
# when client supported the max version, and bumped sequentially, otherwise
2626
# the client may break due to server side new version may include some
2727
# backward incompatible change.
28-
API_MAX_VERSION = api_versions.APIVersion("2.76")
28+
API_MAX_VERSION = api_versions.APIVersion("2.77")

novaclient/tests/unit/fixture_data/servers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,8 @@ def post_servers_1234_action(self, request, context):
456456
return None
457457
elif action == 'lock':
458458
return None
459+
elif action == 'unshelve':
460+
return None
459461
elif action == 'rebuild':
460462
body = body[action]
461463
adminPass = body.get('adminPass', 'randompassword')

novaclient/tests/unit/v2/fakes.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ def delete_servers_1234_os_server_password(self, **kw):
775775
none_actions = ['revertResize', 'os-stop', 'os-start',
776776
'forceDelete', 'restore', 'pause', 'unpause', 'unlock',
777777
'unrescue', 'resume', 'suspend', 'shelve',
778-
'shelveOffload', 'unshelve', 'resetNetwork']
778+
'shelveOffload', 'resetNetwork']
779779
type_actions = ['os-getVNCConsole', 'os-getSPICEConsole',
780780
'os-getRDPConsole']
781781

@@ -852,6 +852,16 @@ def post_servers_1234_action(self, body, **kw):
852852
assert set(body[action].keys()) == expected
853853
else:
854854
assert body[action] is None
855+
elif action == 'unshelve':
856+
if self.api_version < api_versions.APIVersion("2.77"):
857+
assert body[action] is None
858+
else:
859+
# In 2.77 and above, we allow body to be one of these:
860+
# {'unshelve': None}
861+
# {'unshelve': {'availability_zone': 'foo-az'}}
862+
if body[action] is not None:
863+
assert set(body[action].keys()) == set(
864+
['availability_zone'])
855865
elif action == 'rebuild':
856866
body = body[action]
857867
adminPass = body.get('adminPass', 'randompassword')

novaclient/tests/unit/v2/test_servers.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1839,3 +1839,39 @@ def test_create_server_with_host_and_hypervisor_hostname_pre_274_fails(
18391839
hypervisor_hostname="new-host")
18401840
self.assertIn("'host' argument is only allowed since microversion "
18411841
"2.74", six.text_type(ex))
1842+
1843+
1844+
class ServersV277Test(ServersV274Test):
1845+
1846+
api_version = "2.77"
1847+
1848+
def test_unshelve_with_az(self):
1849+
s = self.cs.servers.get(1234)
1850+
# Test going through the Server object.
1851+
ret = s.unshelve(availability_zone='foo-az')
1852+
self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
1853+
self.assert_called('POST', '/servers/1234/action',
1854+
{'unshelve': {
1855+
'availability_zone': 'foo-az'}})
1856+
# Test going through the ServerManager directly.
1857+
ret = self.cs.servers.unshelve(s, availability_zone='foo-az')
1858+
self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
1859+
self.assert_called('POST', '/servers/1234/action',
1860+
{'unshelve': {
1861+
'availability_zone': 'foo-az'}})
1862+
1863+
def test_unshelve_server_pre_277_fails_with_specified_az(self):
1864+
self.cs.api_version = api_versions.APIVersion('2.76')
1865+
s = self.cs.servers.get(1234)
1866+
# Test going through the Server object.
1867+
ex = self.assertRaises(TypeError,
1868+
s.unshelve,
1869+
availability_zone='foo-az')
1870+
self.assertIn("unexpected keyword argument 'availability_zone'",
1871+
six.text_type(ex))
1872+
# Test going through the ServerManager directly.
1873+
ex = self.assertRaises(TypeError,
1874+
self.cs.servers.unshelve,
1875+
s, availability_zone='foo-az')
1876+
self.assertIn("unexpected keyword argument 'availability_zone'",
1877+
six.text_type(ex))

novaclient/tests/unit/v2/test_shell.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2258,6 +2258,27 @@ def test_unshelve(self):
22582258
self.run_command('unshelve sample-server')
22592259
self.assert_called('POST', '/servers/1234/action', {'unshelve': None})
22602260

2261+
def test_unshelve_pre_v277_with_az_fails(self):
2262+
"""Tests that trying to unshelve with an --availability-zone before
2263+
2.77 is an error.
2264+
"""
2265+
self.assertRaises(SystemExit,
2266+
self.run_command,
2267+
'unshelve --availability-zone foo-az sample-server',
2268+
api_version='2.76')
2269+
2270+
def test_unshelve_v277(self):
2271+
# Test backward compat without an AZ specified.
2272+
self.run_command('unshelve sample-server',
2273+
api_version='2.77')
2274+
self.assert_called('POST', '/servers/1234/action',
2275+
{'unshelve': None})
2276+
# Test with specifying an AZ.
2277+
self.run_command('unshelve --availability-zone foo-az sample-server',
2278+
api_version='2.77')
2279+
self.assert_called('POST', '/servers/1234/action',
2280+
{'unshelve': {'availability_zone': 'foo-az'}})
2281+
22612282
def test_migrate(self):
22622283
self.run_command('migrate sample-server')
22632284
self.assert_called('POST', '/servers/1234/action', {'migrate': None})
@@ -4277,6 +4298,7 @@ def test_versions(self):
42774298
74, # There are no version-wrapped shell method changes for this.
42784299
75, # There are no version-wrapped shell method changes for this.
42794300
76, # doesn't require any changes in novaclient.
4301+
77, # There are no version-wrapped shell method changes for this.
42804302
])
42814303
versions_supported = set(range(0,
42824304
novaclient.API_MAX_VERSION.ver_minor + 1))

novaclient/v2/servers.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ def shelve_offload(self):
291291
"""
292292
return self.manager.shelve_offload(self)
293293

294+
@api_versions.wraps("2.0", "2.76")
294295
def unshelve(self):
295296
"""
296297
Unshelve -- Unshelve the server.
@@ -299,6 +300,18 @@ def unshelve(self):
299300
"""
300301
return self.manager.unshelve(self)
301302

303+
@api_versions.wraps("2.77")
304+
def unshelve(self, availability_zone=None):
305+
"""
306+
Unshelve -- Unshelve the server.
307+
308+
:param availability_zone: The specified availability zone name
309+
(Optional)
310+
:returns: An instance of novaclient.base.TupleWithMeta
311+
"""
312+
return self.manager.unshelve(self,
313+
availability_zone=availability_zone)
314+
302315
def diagnostics(self):
303316
"""Diagnostics -- Retrieve server diagnostics."""
304317
return self.manager.diagnostics(self)
@@ -1222,6 +1235,7 @@ def shelve_offload(self, server):
12221235
"""
12231236
return self._action('shelveOffload', server, None)
12241237

1238+
@api_versions.wraps("2.0", "2.76")
12251239
def unshelve(self, server):
12261240
"""
12271241
Unshelve the server.
@@ -1231,6 +1245,21 @@ def unshelve(self, server):
12311245
"""
12321246
return self._action('unshelve', server, None)
12331247

1248+
@api_versions.wraps("2.77")
1249+
def unshelve(self, server, availability_zone=None):
1250+
"""
1251+
Unshelve the server.
1252+
1253+
:param server: The :class:`Server` (or its ID) to unshelve
1254+
:param availability_zone: The specified availability zone name
1255+
(Optional)
1256+
:returns: An instance of novaclient.base.TupleWithMeta
1257+
"""
1258+
info = None
1259+
if availability_zone:
1260+
info = {'availability_zone': availability_zone}
1261+
return self._action('unshelve', server, info)
1262+
12341263
def ips(self, server):
12351264
"""
12361265
Return IP Addresses associated with the server.

novaclient/v2/shell.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2285,9 +2285,25 @@ def do_shelve_offload(cs, args):
22852285

22862286

22872287
@utils.arg('server', metavar='<server>', help=_('Name or ID of server.'))
2288+
@utils.arg(
2289+
'--availability-zone',
2290+
metavar='<availability-zone>',
2291+
default=None,
2292+
dest='availability_zone',
2293+
help=_('Name of the availability zone in which to unshelve a '
2294+
'SHELVED_OFFLOADED server.'),
2295+
start_version='2.77')
22882296
def do_unshelve(cs, args):
22892297
"""Unshelve a server."""
2290-
_find_server(cs, args.server).unshelve()
2298+
update_kwargs = {}
2299+
# Microversion >= 2.77 will support user to specify an
2300+
# availability_zone to unshelve a shelve offloaded server.
2301+
if cs.api_version >= api_versions.APIVersion('2.77'):
2302+
if 'availability_zone' in args and args.availability_zone is not None:
2303+
update_kwargs['availability_zone'] = args.availability_zone
2304+
2305+
server = _find_server(cs, args.server)
2306+
server.unshelve(**update_kwargs)
22912307

22922308

22932309
@utils.arg('server', metavar='<server>', help=_('Name or ID of server.'))
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
features:
3+
- |
4+
Support has been added for `microversion 2.77`_. This microversion
5+
allows specifying an availability zone to unshelve a shelve
6+
offloaded server.
7+
8+
.. _microversion 2.77: https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#id69

0 commit comments

Comments
 (0)