Add 'openstack server create --use-config-drive'

Despite what the help text for this options says, the nova API only
accepts boolean values for this value and has done so since at least the
introduction of the 2.1 microversioned API. While it would be nice to
convert '--config-drive' to a boolean flag, we'd need to be able to
retain temporary support for people passing arguments. 'nargs=?' [1]
looks promising but it has an annoying tendency to swallow a positional
argument following it [2]. Since that is not an option, we have to live
with a new config option, '--use-config-drive' and a '--no-config-drive'
counterpart.

[1] https://docs.python.org/3/library/argparse.html#nargs
[2] https://bugs.python.org/issue9338

Change-Id: If9cce0ad4094cc9cef1c9136b80c3b0f35a82c7a
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
Story: #2005468
Task: #30547
This commit is contained in:
Stephen Finucane 2020-07-22 10:39:47 +01:00
parent 82ebddca00
commit 12f1e56ebf
3 changed files with 44 additions and 14 deletions

View File

@ -693,12 +693,30 @@ class CreateServer(command.ShowOne):
default={},
help=_('Hints for the scheduler (optional extension)'),
)
parser.add_argument(
config_drive_group = parser.add_mutually_exclusive_group()
config_drive_group.add_argument(
'--use-config-drive',
action='store_true',
dest='config_drive',
help=_("Enable config drive."),
)
config_drive_group.add_argument(
'--no-config-drive',
action='store_false',
dest='config_drive',
help=_("Disable config drive."),
)
# TODO(stephenfin): Drop support in the next major version bump after
# Victoria
config_drive_group.add_argument(
'--config-drive',
metavar='<config-drive-volume>|True',
default=False,
help=_('Use specified volume as the config drive, '
'or \'True\' to use an ephemeral drive'),
help=_(
"**Deprecated** Use specified volume as the config drive, "
"or 'True' to use an ephemeral drive. Replaced by "
"'--use-config-drive'."
),
)
parser.add_argument(
'--min',
@ -991,16 +1009,19 @@ class CreateServer(command.ShowOne):
else:
hints[key] = values
# What does a non-boolean value for config-drive do?
# --config-drive argument is either a volume id or
# 'True' (or '1') to use an ephemeral volume
if str(parsed_args.config_drive).lower() in ("true", "1"):
config_drive = True
elif str(parsed_args.config_drive).lower() in ("false", "0",
"", "none"):
config_drive = None
if isinstance(parsed_args.config_drive, bool):
# NOTE(stephenfin): The API doesn't accept False as a value :'(
config_drive = parsed_args.config_drive or None
else:
config_drive = parsed_args.config_drive
# TODO(stephenfin): Remove when we drop support for
# '--config-drive'
if str(parsed_args.config_drive).lower() in ("true", "1"):
config_drive = True
elif str(parsed_args.config_drive).lower() in ("false", "0",
"", "none"):
config_drive = None
else:
config_drive = parsed_args.config_drive
boot_kwargs = dict(
meta=parsed_args.property,

View File

@ -857,6 +857,7 @@ class TestServerCreate(TestServer):
'--key-name', 'keyname',
'--property', 'Beta=b',
'--security-group', 'securitygroup',
'--use-config-drive',
'--hint', 'a=b',
'--hint', 'a=c',
self.new_server.name,
@ -868,7 +869,7 @@ class TestServerCreate(TestServer):
('property', {'Beta': 'b'}),
('security_group', ['securitygroup']),
('hint', {'a': ['b', 'c']}),
('config_drive', False),
('config_drive', True),
('server_name', self.new_server.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -900,7 +901,7 @@ class TestServerCreate(TestServer):
block_device_mapping_v2=[],
nics=[],
scheduler_hints={'a': ['b', 'c']},
config_drive=None,
config_drive=True,
)
# ServerManager.create(name, image, flavor, **kwargs)
self.servers_mock.create.assert_called_with(

View File

@ -0,0 +1,8 @@
---
deprecations:
- |
The ``--config-drive`` option on the ``openstack server create`` command
has been deprecated in favour of the ``--use-config-drive`` and
``--no-config-drive`` arguments. The ``--config-drive`` option expected
either a string or bool-like argument, but the nova API has only supported
boolean values since API v2.1 was introduced.