Skip to content

Commit 8a0f3fc

Browse files
committed
compute: Add missing options for 'server set'
Add a new '--no-password' option to unset the password on an existing server. In addition, add a new '--password' option that replaces the interactive '--root-password' option. This makes sense given no other commands uses interactive password options. Checks that rely on specific API microversions now run before we execute any action, to avoid situations where an update is only partially applied. Change-Id: Ibf8717efdd418a2d95215b4d9ab2acf0d57c4a70 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
1 parent 9a976ad commit 8a0f3fc

3 files changed

Lines changed: 87 additions & 17 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3472,18 +3472,35 @@ def get_parser(self, prog_name):
34723472
metavar='<new-name>',
34733473
help=_('New server name'),
34743474
)
3475-
parser.add_argument(
3475+
password_group = parser.add_mutually_exclusive_group()
3476+
password_group.add_argument(
3477+
'--password',
3478+
help=_('Set the server password'),
3479+
)
3480+
password_group.add_argument(
3481+
'--no-password',
3482+
action='store_true',
3483+
help=_(
3484+
'Clear the admin password for the server from the metadata '
3485+
'service; note that this action does not actually change the '
3486+
'server password'
3487+
),
3488+
)
3489+
# TODO(stephenfin): Remove this in a future major version
3490+
password_group.add_argument(
34763491
'--root-password',
34773492
action="store_true",
3478-
help=_('Set new root password (interactive only)'),
3493+
help=argparse.SUPPRESS,
34793494
)
34803495
parser.add_argument(
34813496
'--property',
34823497
metavar='<key=value>',
34833498
action=parseractions.KeyValueAction,
34843499
dest='properties',
3485-
help=_('Property to add/change for this server '
3486-
'(repeat option to set multiple properties)'),
3500+
help=_(
3501+
'Property to add/change for this server '
3502+
'(repeat option to set multiple properties)'
3503+
),
34873504
)
34883505
parser.add_argument(
34893506
'--state',
@@ -3494,8 +3511,10 @@ def get_parser(self, prog_name):
34943511
parser.add_argument(
34953512
'--description',
34963513
metavar='<description>',
3497-
help=_('New server description (supported by '
3498-
'--os-compute-api-version 2.19 or above)'),
3514+
help=_(
3515+
'New server description '
3516+
'(supported by --os-compute-api-version 2.19 or above)'
3517+
),
34993518
)
35003519
parser.add_argument(
35013520
'--tag',
@@ -3519,6 +3538,22 @@ def take_action(self, parsed_args):
35193538
parsed_args.server,
35203539
)
35213540

3541+
if parsed_args.description:
3542+
if server.api_version < api_versions.APIVersion("2.19"):
3543+
msg = _(
3544+
'--os-compute-api-version 2.19 or greater is required to '
3545+
'support the --description option'
3546+
)
3547+
raise exceptions.CommandError(msg)
3548+
3549+
if parsed_args.tags:
3550+
if server.api_version < api_versions.APIVersion('2.26'):
3551+
msg = _(
3552+
'--os-compute-api-version 2.26 or greater is required to '
3553+
'support the --tag option'
3554+
)
3555+
raise exceptions.CommandError(msg)
3556+
35223557
if parsed_args.name:
35233558
server.update(name=parsed_args.name)
35243559

@@ -3536,22 +3571,15 @@ def take_action(self, parsed_args):
35363571
else:
35373572
msg = _("Passwords do not match, password unchanged")
35383573
raise exceptions.CommandError(msg)
3574+
elif parsed_args.password:
3575+
server.change_password(parsed_args.password)
3576+
elif parsed_args.no_password:
3577+
server.clear_password()
35393578

35403579
if parsed_args.description:
3541-
if server.api_version < api_versions.APIVersion("2.19"):
3542-
msg = _("Description is not supported for "
3543-
"--os-compute-api-version less than 2.19")
3544-
raise exceptions.CommandError(msg)
35453580
server.update(description=parsed_args.description)
35463581

35473582
if parsed_args.tags:
3548-
if server.api_version < api_versions.APIVersion('2.26'):
3549-
msg = _(
3550-
'--os-compute-api-version 2.26 or greater is required to '
3551-
'support the --tag option'
3552-
)
3553-
raise exceptions.CommandError(msg)
3554-
35553583
for tag in parsed_args.tags:
35563584
server.add_tag(tag=tag)
35573585

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6207,6 +6207,7 @@ def setUp(self):
62076207
'update': None,
62086208
'reset_state': None,
62096209
'change_password': None,
6210+
'clear_password': None,
62106211
'add_tag': None,
62116212
'set_tags': None,
62126213
}
@@ -6290,6 +6291,37 @@ def test_server_set_with_property(self):
62906291
self.fake_servers[0], parsed_args.properties)
62916292
self.assertIsNone(result)
62926293

6294+
def test_server_set_with_password(self):
6295+
arglist = [
6296+
'--password', 'foo',
6297+
'foo_vm',
6298+
]
6299+
verifylist = [
6300+
('password', 'foo'),
6301+
('server', 'foo_vm'),
6302+
]
6303+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6304+
6305+
self.cmd.take_action(parsed_args)
6306+
6307+
self.fake_servers[0].change_password.assert_called_once_with('foo')
6308+
6309+
def test_server_set_with_no_password(self):
6310+
arglist = [
6311+
'--no-password',
6312+
'foo_vm',
6313+
]
6314+
verifylist = [
6315+
('no_password', True),
6316+
('server', 'foo_vm'),
6317+
]
6318+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
6319+
6320+
self.cmd.take_action(parsed_args)
6321+
6322+
self.fake_servers[0].clear_password.assert_called_once_with()
6323+
6324+
# TODO(stephenfin): Remove this in a future major version
62936325
@mock.patch.object(getpass, 'getpass',
62946326
return_value=mock.sentinel.fake_pass)
62956327
def test_server_set_with_root_password(self, mock_getpass):
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
features:
3+
- |
4+
Add ``--no-password`` option to ``server set`` command, allowing users
5+
to clear the admin password from the metadata service. Note that this does
6+
not actually change the server password.
7+
upgrade:
8+
- |
9+
The ``server set --root-password`` option has been deprecated in favour of
10+
a non-interactive ``--password`` option.

0 commit comments

Comments
 (0)