Skip to content

Commit bef6765

Browse files
Microversion 2.54 - Enable reset keypair while rebuild
Adds support for microversion 2.54 which adds resetting keypair and unsetting keypair in rebuild operation. Adds optional ``--key-name`` and ``--key-unset`` options in the ``nova rebuild`` command. The ``--key-name`` and ``--key-unset`` cannot be specified at the same time. Change-Id: Ie2a39bb29dd59c070adc94e79ea0f6473227a427 Implements: blueprint rebuild-keypair-reset
1 parent 5c8faaf commit bef6765

File tree

6 files changed

+107
-1
lines changed

6 files changed

+107
-1
lines changed

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.53")
28+
API_MAX_VERSION = api_versions.APIVersion("2.54")

novaclient/tests/unit/v2/test_servers.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,3 +1550,34 @@ def test_create_server_with_tags_pre_252_fails(self):
15501550
key_name="fakekey",
15511551
nics=self._get_server_create_default_nics(),
15521552
tags=['tag1', 'tag2'])
1553+
1554+
1555+
class ServersV254Test(ServersV252Test):
1556+
1557+
api_version = "2.54"
1558+
1559+
def test_rebuild_with_key_name(self):
1560+
s = self.cs.servers.get(1234)
1561+
ret = s.rebuild(image="1", key_name="test_keypair")
1562+
self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
1563+
self.assert_called('POST', '/servers/1234/action',
1564+
{'rebuild': {
1565+
'imageRef': '1',
1566+
'key_name': 'test_keypair'}})
1567+
1568+
def test_rebuild_with_key_name_none(self):
1569+
s = self.cs.servers.get(1234)
1570+
ret = s.rebuild(image="1", key_name=None)
1571+
self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
1572+
self.assert_called('POST', '/servers/1234/action',
1573+
{'rebuild': {
1574+
'key_name': None,
1575+
'imageRef': '1'}})
1576+
1577+
def test_rebuild_with_key_name_pre_254_fails(self):
1578+
self.cs.api_version = api_versions.APIVersion('2.53')
1579+
ex = self.assertRaises(exceptions.UnsupportedAttribute,
1580+
self.cs.servers.rebuild,
1581+
'1234', fakes.FAKE_IMAGE_UUID_1,
1582+
key_name='test_keypair')
1583+
self.assertIn('key_name', six.text_type(ex.message))

novaclient/tests/unit/v2/test_shell.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,38 @@ def test_rebuild_name_meta(self):
14941494
self.assert_called('GET', '/flavors/1', pos=4)
14951495
self.assert_called('GET', '/v2/images/%s' % FAKE_UUID_2, pos=5)
14961496

1497+
def test_rebuild_reset_keypair(self):
1498+
self.run_command('rebuild sample-server %s --key-name test_keypair' %
1499+
FAKE_UUID_1, api_version='2.54')
1500+
self.assert_called('GET', '/servers?name=sample-server', pos=0)
1501+
self.assert_called('GET', '/servers/1234', pos=1)
1502+
self.assert_called('GET', '/v2/images/%s' % FAKE_UUID_1, pos=2)
1503+
self.assert_called('POST', '/servers/1234/action',
1504+
{'rebuild': {'imageRef': FAKE_UUID_1,
1505+
'key_name': 'test_keypair',
1506+
'description': None}}, pos=3)
1507+
self.assert_called('GET', '/v2/images/%s' % FAKE_UUID_2, pos=4)
1508+
1509+
def test_rebuild_unset_keypair(self):
1510+
self.run_command('rebuild sample-server %s --key-unset' %
1511+
FAKE_UUID_1, api_version='2.54')
1512+
self.assert_called('GET', '/servers?name=sample-server', pos=0)
1513+
self.assert_called('GET', '/servers/1234', pos=1)
1514+
self.assert_called('GET', '/v2/images/%s' % FAKE_UUID_1, pos=2)
1515+
self.assert_called('POST', '/servers/1234/action',
1516+
{'rebuild': {'imageRef': FAKE_UUID_1,
1517+
'key_name': None,
1518+
'description': None}}, pos=3)
1519+
self.assert_called('GET', '/v2/images/%s' % FAKE_UUID_2, pos=4)
1520+
1521+
def test_rebuild_unset_keypair_with_key_name(self):
1522+
ex = self.assertRaises(
1523+
exceptions.CommandError, self.run_command,
1524+
'rebuild sample-server %s --key-unset --key-name test_keypair' %
1525+
FAKE_UUID_1, api_version='2.54')
1526+
self.assertIn("Cannot specify '--key-unset' with '--key-name'.",
1527+
six.text_type(ex))
1528+
14971529
def test_rebuild_with_incorrect_metadata(self):
14981530
cmd = 'rebuild sample-server %s --name asdf --meta foo' % FAKE_UUID_1
14991531
result = self.assertRaises(argparse.ArgumentTypeError,
@@ -3126,6 +3158,7 @@ def test_versions(self):
31263158
48, # There are no version-wrapped shell method changes for this.
31273159
51, # There are no version-wrapped shell method changes for this.
31283160
52, # There are no version-wrapped shell method changes for this.
3161+
54, # There are no version-wrapped shell method changes for this.
31293162
])
31303163
versions_supported = set(range(0,
31313164
novaclient.API_MAX_VERSION.ver_minor + 1))

novaclient/v2/servers.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,12 +1496,21 @@ def rebuild(self, server, image, password=None, disk_config=None,
14961496
and each file must be 10k or less.
14971497
:param description: optional description of the server (allowed since
14981498
microversion 2.19)
1499+
:param key_name: optional key pair name for rebuild operation; passing
1500+
None will unset the key for the server instance
1501+
(starting from microversion 2.54)
14991502
:returns: :class:`Server`
15001503
"""
15011504
descr_microversion = api_versions.APIVersion("2.19")
15021505
if "description" in kwargs and self.api_version < descr_microversion:
15031506
raise exceptions.UnsupportedAttribute("description", "2.19")
15041507

1508+
# Starting from microversion 2.54,
1509+
# the optional 'key_name' parameter has been added.
1510+
if ('key_name' in kwargs and
1511+
self.api_version < api_versions.APIVersion('2.54')):
1512+
raise exceptions.UnsupportedAttribute('key_name', '2.54')
1513+
15051514
body = {'imageRef': base.getid(image)}
15061515
if password is not None:
15071516
body['adminPass'] = password
@@ -1513,6 +1522,8 @@ def rebuild(self, server, image, password=None, disk_config=None,
15131522
body['name'] = name
15141523
if "description" in kwargs:
15151524
body["description"] = kwargs["description"]
1525+
if 'key_name' in kwargs:
1526+
body['key_name'] = kwargs['key_name']
15161527
if meta:
15171528
body['metadata'] = meta
15181529
if files:

novaclient/v2/shell.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1786,6 +1786,20 @@ def do_reboot(cs, args):
17861786
default=[],
17871787
help=_("Store arbitrary files from <src-path> locally to <dst-path> "
17881788
"on the new server. You may store up to 5 files."))
1789+
@utils.arg(
1790+
'--key-name',
1791+
metavar='<key-name>',
1792+
default=None,
1793+
help=_("Keypair name to set in the server. "
1794+
"Cannot be specified with the '--key-unset' option."),
1795+
start_version='2.54')
1796+
@utils.arg(
1797+
'--key-unset',
1798+
action='store_true',
1799+
default=False,
1800+
help=_("Unset keypair in the server. "
1801+
"Cannot be specified with the '--key-name' option."),
1802+
start_version='2.54')
17891803
def do_rebuild(cs, args):
17901804
"""Shutdown, re-image, and re-boot a server."""
17911805
server = _find_server(cs, args.server)
@@ -1819,6 +1833,16 @@ def do_rebuild(cs, args):
18191833
"form '--file "
18201834
"<dst-path=src-path>'") % f)
18211835
kwargs['files'] = files
1836+
1837+
if cs.api_version >= api_versions.APIVersion('2.54'):
1838+
if args.key_unset:
1839+
kwargs['key_name'] = None
1840+
if args.key_name:
1841+
raise exceptions.CommandError(
1842+
_("Cannot specify '--key-unset' with '--key-name'."))
1843+
elif args.key_name:
1844+
kwargs['key_name'] = args.key_name
1845+
18221846
server = server.rebuild(image, _password, **kwargs)
18231847
_print_server(cs, args, server)
18241848

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
features:
3+
- |
4+
Adds support for microversion 2.54 which adds resetting keypair and
5+
unsetting keypair in rebuild operation.
6+
Adds optional ``--key-name`` and ``--key-unset`` options
7+
in the ``nova rebuild`` command.

0 commit comments

Comments
 (0)