diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 5b563a4839..ba24b2b656 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -1335,10 +1335,19 @@ class CreateServer(command.ShowOne): '(supported by --os-compute-api-version 2.74 or above)' ), ) + parser.add_argument( + '--server-group', + metavar='', + help=_( + "Server group to create the server within " + "(this is an alias for '--hint group=')" + ), + ) parser.add_argument( '--hint', metavar='', action=parseractions.KeyValueAppendAction, + dest='hints', default={}, help=_('Hints for the scheduler'), ) @@ -1857,13 +1866,20 @@ class CreateServer(command.ShowOne): security_group_names.append(sg['name']) hints = {} - for key, values in parsed_args.hint.items(): + for key, values in parsed_args.hints.items(): # only items with multiple values will result in a list if len(values) == 1: hints[key] = values[0] else: hints[key] = values + if parsed_args.server_group: + server_group_obj = utils.find_resource( + compute_client.server_groups, + parsed_args.server_group, + ) + hints['group'] = server_group_obj.id + 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 diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 03237e90f5..b145fb85fb 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -1447,6 +1447,8 @@ class TestServerCreate(TestServer): 'a=b', '--hint', 'a=c', + '--server-group', + 'servergroup', self.new_server.name, ] verifylist = [ @@ -1455,22 +1457,26 @@ class TestServerCreate(TestServer): ('key_name', 'keyname'), ('properties', {'Beta': 'b'}), ('security_group', ['securitygroup']), - ('hint', {'a': ['b', 'c']}), + ('hints', {'a': ['b', 'c']}), + ('server_group', 'servergroup'), ('config_drive', True), ('password', 'passw0rd'), ('server_name', self.new_server.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # In base command class ShowOne in cliff, abstract method take_action() - # returns a two-part tuple with a tuple of column names and a tuple of - # data to be shown. + fake_server_group = compute_fakes.create_one_server_group() + self.compute_client.server_groups.get.return_value = fake_server_group + fake_sg = network_fakes.FakeSecurityGroup.create_security_groups() mock_find_sg = network_fakes.FakeSecurityGroup.get_security_groups( fake_sg ) self.app.client_manager.network.find_security_group = mock_find_sg + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) mock_find_sg.assert_called_once_with( @@ -1490,7 +1496,7 @@ class TestServerCreate(TestServer): admin_pass='passw0rd', block_device_mapping_v2=[], nics=[], - scheduler_hints={'a': ['b', 'c']}, + scheduler_hints={'a': ['b', 'c'], 'group': fake_server_group.id}, config_drive=True, ) # ServerManager.create(name, image, flavor, **kwargs) diff --git a/releasenotes/notes/server-create-server-group-a5b630f2a64de28d.yaml b/releasenotes/notes/server-create-server-group-a5b630f2a64de28d.yaml new file mode 100644 index 0000000000..f9aaf4b46d --- /dev/null +++ b/releasenotes/notes/server-create-server-group-a5b630f2a64de28d.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + The ``server create`` command now accepts a new option, ``--server-group``, + which is a shortcut for configuring the ``group`` scheduler hint.