Skip to content

Commit 1894a3c

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add --key-name and --key-unset option for server rebuild API."
2 parents 594eeae + f82c5b8 commit 1894a3c

5 files changed

Lines changed: 124 additions & 2 deletions

File tree

lower-constraints.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ python-mimeparse==1.6.0
100100
python-mistralclient==3.1.0
101101
python-muranoclient==0.8.2
102102
python-neutronclient==6.7.0
103-
python-novaclient==9.1.0
103+
python-novaclient==10.0.0
104104
python-octaviaclient==1.3.0
105105
python-rsdclient==0.1.0
106106
python-saharaclient==1.4.0

openstackclient/compute/v2/server.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,6 +1534,22 @@ def get_parser(self, prog_name):
15341534
action='store_true',
15351535
help=_('Wait for rebuild to complete'),
15361536
)
1537+
key_group = parser.add_mutually_exclusive_group()
1538+
key_group.add_argument(
1539+
'--key-name',
1540+
metavar='<key-name>',
1541+
help=_("Set the key name of key pair on the rebuilt instance."
1542+
" Cannot be specified with the '--key-unset' option."
1543+
" (Supported by API versions '2.54' - '2.latest')"),
1544+
)
1545+
key_group.add_argument(
1546+
'--key-unset',
1547+
action='store_true',
1548+
default=False,
1549+
help=_("Unset the key name of key pair on the rebuilt instance."
1550+
" Cannot be specified with the '--key-name' option."
1551+
" (Supported by API versions '2.54' - '2.latest')"),
1552+
)
15371553
return parser
15381554

15391555
def take_action(self, parsed_args):
@@ -1558,6 +1574,16 @@ def _show_progress(progress):
15581574
if parsed_args.property:
15591575
kwargs['meta'] = parsed_args.property
15601576

1577+
if parsed_args.key_name or parsed_args.key_unset:
1578+
if compute_client.api_version < api_versions.APIVersion('2.54'):
1579+
msg = _('--os-compute-api-version 2.54 or later is required')
1580+
raise exceptions.CommandError(msg)
1581+
1582+
if parsed_args.key_unset:
1583+
kwargs['key_name'] = None
1584+
if parsed_args.key_name:
1585+
kwargs['key_name'] = parsed_args.key_name
1586+
15611587
server = server.rebuild(image, parsed_args.password, **kwargs)
15621588
if parsed_args.wait:
15631589
if utils.wait_for_status(

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

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,6 +2566,96 @@ def test_rebuild_with_property(self):
25662566
self.server.rebuild.assert_called_with(
25672567
self.image, None, meta=expected_property)
25682568

2569+
def test_rebuild_with_keypair_name(self):
2570+
self.server.key_name = 'mykey'
2571+
arglist = [
2572+
self.server.id,
2573+
'--key-name', self.server.key_name,
2574+
]
2575+
verifylist = [
2576+
('server', self.server.id),
2577+
('key_name', self.server.key_name)
2578+
]
2579+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2580+
2581+
self.app.client_manager.compute.api_version = 2.54
2582+
with mock.patch.object(api_versions,
2583+
'APIVersion',
2584+
return_value=2.54):
2585+
self.cmd.take_action(parsed_args)
2586+
args = (
2587+
self.image,
2588+
None,
2589+
)
2590+
kwargs = dict(
2591+
key_name=self.server.key_name,
2592+
)
2593+
self.servers_mock.get.assert_called_with(self.server.id)
2594+
self.images_mock.get.assert_called_with(self.image.id)
2595+
self.server.rebuild.assert_called_with(*args, **kwargs)
2596+
2597+
def test_rebuild_with_keypair_name_older_version(self):
2598+
self.server.key_name = 'mykey'
2599+
arglist = [
2600+
self.server.id,
2601+
'--key-name', self.server.key_name,
2602+
]
2603+
verifylist = [
2604+
('server', self.server.id),
2605+
('key_name', self.server.key_name)
2606+
]
2607+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2608+
2609+
self.app.client_manager.compute.api_version = 2.53
2610+
with mock.patch.object(api_versions,
2611+
'APIVersion',
2612+
return_value=2.54):
2613+
self.assertRaises(exceptions.CommandError,
2614+
self.cmd.take_action,
2615+
parsed_args)
2616+
2617+
def test_rebuild_with_keypair_unset(self):
2618+
self.server.key_name = 'mykey'
2619+
arglist = [
2620+
self.server.id,
2621+
'--key-unset',
2622+
]
2623+
verifylist = [
2624+
('server', self.server.id),
2625+
]
2626+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2627+
2628+
self.app.client_manager.compute.api_version = 2.54
2629+
with mock.patch.object(api_versions,
2630+
'APIVersion',
2631+
return_value=2.54):
2632+
self.cmd.take_action(parsed_args)
2633+
args = (
2634+
self.image,
2635+
None,
2636+
)
2637+
kwargs = dict(
2638+
key_name=None,
2639+
)
2640+
self.servers_mock.get.assert_called_with(self.server.id)
2641+
self.images_mock.get.assert_called_with(self.image.id)
2642+
self.server.rebuild.assert_called_with(*args, **kwargs)
2643+
2644+
def test_rebuild_with_key_name_and_unset(self):
2645+
self.server.key_name = 'mykey'
2646+
arglist = [
2647+
self.server.id,
2648+
'--key-name', self.server.key_name,
2649+
'--key-unset',
2650+
]
2651+
verifylist = [
2652+
('server', self.server.id),
2653+
('key_name', self.server.key_name)
2654+
]
2655+
self.assertRaises(utils.ParserException,
2656+
self.check_parser,
2657+
self.cmd, arglist, verifylist)
2658+
25692659

25702660
class TestServerRemoveFixedIP(TestServer):
25712661

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- Add ``--key-name`` option to ``server rebuild`` command to set keypair of
4+
the server. Note that it requires --os-compute-api-version 2.54 or later.
5+
- Add ``--key-unset`` option to ``server rebuild`` command to unset
6+
keypair. Note that it requires --os-compute-api-version 2.54 or later.

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>=9.1.0 # Apache-2.0
16+
python-novaclient>=10.0.0 # Apache-2.0
1717
python-cinderclient>=3.3.0 # Apache-2.0

0 commit comments

Comments
 (0)