diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 93e9f966ae..54cfe770f2 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -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='|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, diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 7e4c71c50c..dc699c0f43 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -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( diff --git a/releasenotes/notes/story-2005468-server-use-config-drive-9fc68552365cfefa.yaml b/releasenotes/notes/story-2005468-server-use-config-drive-9fc68552365cfefa.yaml new file mode 100644 index 0000000000..786ede4f78 --- /dev/null +++ b/releasenotes/notes/story-2005468-server-use-config-drive-9fc68552365cfefa.yaml @@ -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.