summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2019-07-23 01:32:32 +0000
committerGerrit Code Review <review@openstack.org>2019-07-23 01:32:32 +0000
commitc4743199096e77bdc89423dc37f632ac24acdba1 (patch)
tree963931ec78731b091abadee0bebfb756e04168a5 /openstackclient
parentc609b98c408d521cdd34884c912aeb8f64257753 (diff)
parent340f25fa14d42205a4134ce4cba47792764b8542 (diff)
downloadpython-openstackclient-c4743199096e77bdc89423dc37f632ac24acdba1.tar.gz
Merge "Add host and hypervisor_hostname to create servers"
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py29
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py231
2 files changed, 260 insertions, 0 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index a4216e65..ea87d9ce 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -554,6 +554,20 @@ class CreateServer(command.ShowOne):
help=_('Select an availability zone for the server'),
)
parser.add_argument(
+ '--host',
+ metavar='<host>',
+ help=_('Requested host to create servers. Admin only '
+ 'by default. (supported by --os-compute-api-version 2.74 '
+ 'or above)'),
+ )
+ parser.add_argument(
+ '--hypervisor-hostname',
+ metavar='<hypervisor-hostname>',
+ help=_('Requested hypervisor hostname to create servers. Admin '
+ 'only by default. (supported by --os-compute-api-version '
+ '2.74 or above)'),
+ )
+ parser.add_argument(
'--block-device-mapping',
metavar='<dev-name=mapping>',
action=parseractions.KeyValueAction,
@@ -927,6 +941,21 @@ class CreateServer(command.ShowOne):
if parsed_args.description:
boot_kwargs['description'] = parsed_args.description
+ if parsed_args.host:
+ if compute_client.api_version < api_versions.APIVersion("2.74"):
+ msg = _("Specifying --host is not supported for "
+ "--os-compute-api-version less than 2.74")
+ raise exceptions.CommandError(msg)
+ boot_kwargs['host'] = parsed_args.host
+
+ if parsed_args.hypervisor_hostname:
+ if compute_client.api_version < api_versions.APIVersion("2.74"):
+ msg = _("Specifying --hypervisor-hostname is not supported "
+ "for --os-compute-api-version less than 2.74")
+ raise exceptions.CommandError(msg)
+ boot_kwargs['hypervisor_hostname'] = (
+ parsed_args.hypervisor_hostname)
+
LOG.debug('boot_args: %s', boot_args)
LOG.debug('boot_kwargs: %s', boot_kwargs)
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 713bf07a..cd12db06 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -1940,6 +1940,237 @@ class TestServerCreate(TestServer):
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
parsed_args)
+ def test_server_create_with_host_v274(self):
+
+ # Explicit host is supported for nova api version 2.74 or above
+ self.app.client_manager.compute.api_version = 2.74
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--host', 'host1',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', 'flavor1'),
+ ('host', 'host1'),
+ ('config_drive', False),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ with mock.patch.object(api_versions,
+ 'APIVersion',
+ return_value=2.74):
+ # 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)
+
+ # Set expected values
+ kwargs = dict(
+ meta=None,
+ files={},
+ reservation_id=None,
+ min_count=1,
+ max_count=1,
+ security_groups=[],
+ userdata=None,
+ key_name=None,
+ availability_zone=None,
+ block_device_mapping_v2=[],
+ nics='auto',
+ scheduler_hints={},
+ config_drive=None,
+ host='host1',
+ )
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+ self.assertFalse(self.images_mock.called)
+ self.assertFalse(self.flavors_mock.called)
+
+ def test_server_create_with_host_pre_v274(self):
+
+ # Host is not supported for nova api version below 2.74
+ self.app.client_manager.compute.api_version = 2.73
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--host', 'host1',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', 'flavor1'),
+ ('host', 'host1'),
+ ('config_drive', False),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ with mock.patch.object(api_versions,
+ 'APIVersion',
+ return_value=2.74):
+ self.assertRaises(exceptions.CommandError, self.cmd.take_action,
+ parsed_args)
+
+ def test_server_create_with_hypervisor_hostname_v274(self):
+
+ # Explicit hypervisor_hostname is supported for nova api version
+ # 2.74 or above
+ self.app.client_manager.compute.api_version = 2.74
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--hypervisor-hostname', 'node1',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', 'flavor1'),
+ ('hypervisor_hostname', 'node1'),
+ ('config_drive', False),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ with mock.patch.object(api_versions,
+ 'APIVersion',
+ return_value=2.74):
+ # 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)
+
+ # Set expected values
+ kwargs = dict(
+ meta=None,
+ files={},
+ reservation_id=None,
+ min_count=1,
+ max_count=1,
+ security_groups=[],
+ userdata=None,
+ key_name=None,
+ availability_zone=None,
+ block_device_mapping_v2=[],
+ nics='auto',
+ scheduler_hints={},
+ config_drive=None,
+ hypervisor_hostname='node1',
+ )
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+ self.assertFalse(self.images_mock.called)
+ self.assertFalse(self.flavors_mock.called)
+
+ def test_server_create_with_hypervisor_hostname_pre_v274(self):
+
+ # Hypervisor_hostname is not supported for nova api version below 2.74
+ self.app.client_manager.compute.api_version = 2.73
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--hypervisor-hostname', 'node1',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', 'flavor1'),
+ ('hypervisor_hostname', 'node1'),
+ ('config_drive', False),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ with mock.patch.object(api_versions,
+ 'APIVersion',
+ return_value=2.74):
+ self.assertRaises(exceptions.CommandError, self.cmd.take_action,
+ parsed_args)
+
+ def test_server_create_with_host_and_hypervisor_hostname_v274(self):
+
+ # Explicit host and hypervisor_hostname is supported for nova api
+ # version 2.74 or above
+ self.app.client_manager.compute.api_version = 2.74
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--host', 'host1',
+ '--hypervisor-hostname', 'node1',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', 'flavor1'),
+ ('host', 'host1'),
+ ('hypervisor_hostname', 'node1'),
+ ('config_drive', False),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ with mock.patch.object(api_versions,
+ 'APIVersion',
+ return_value=2.74):
+ # 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)
+
+ # Set expected values
+ kwargs = dict(
+ meta=None,
+ files={},
+ reservation_id=None,
+ min_count=1,
+ max_count=1,
+ security_groups=[],
+ userdata=None,
+ key_name=None,
+ availability_zone=None,
+ block_device_mapping_v2=[],
+ nics='auto',
+ scheduler_hints={},
+ config_drive=None,
+ host='host1',
+ hypervisor_hostname='node1',
+ )
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+ self.assertFalse(self.images_mock.called)
+ self.assertFalse(self.flavors_mock.called)
+
class TestServerDelete(TestServer):