Skip to content

Commit c474319

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add host and hypervisor_hostname to create servers"
2 parents c609b98 + 340f25f commit c474319

5 files changed

Lines changed: 268 additions & 2 deletions

File tree

lower-constraints.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ python-mimeparse==1.6.0
100100
python-mistralclient==3.1.0
101101
python-muranoclient==0.8.2
102102
python-neutronclient==6.7.0
103-
python-novaclient==14.1.0
103+
python-novaclient==14.2.0
104104
python-octaviaclient==1.3.0
105105
python-rsdclient==0.1.0
106106
python-saharaclient==1.4.0

openstackclient/compute/v2/server.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,20 @@ def get_parser(self, prog_name):
553553
metavar='<zone-name>',
554554
help=_('Select an availability zone for the server'),
555555
)
556+
parser.add_argument(
557+
'--host',
558+
metavar='<host>',
559+
help=_('Requested host to create servers. Admin only '
560+
'by default. (supported by --os-compute-api-version 2.74 '
561+
'or above)'),
562+
)
563+
parser.add_argument(
564+
'--hypervisor-hostname',
565+
metavar='<hypervisor-hostname>',
566+
help=_('Requested hypervisor hostname to create servers. Admin '
567+
'only by default. (supported by --os-compute-api-version '
568+
'2.74 or above)'),
569+
)
556570
parser.add_argument(
557571
'--block-device-mapping',
558572
metavar='<dev-name=mapping>',
@@ -927,6 +941,21 @@ def _match_image(image_api, wanted_properties):
927941
if parsed_args.description:
928942
boot_kwargs['description'] = parsed_args.description
929943

944+
if parsed_args.host:
945+
if compute_client.api_version < api_versions.APIVersion("2.74"):
946+
msg = _("Specifying --host is not supported for "
947+
"--os-compute-api-version less than 2.74")
948+
raise exceptions.CommandError(msg)
949+
boot_kwargs['host'] = parsed_args.host
950+
951+
if parsed_args.hypervisor_hostname:
952+
if compute_client.api_version < api_versions.APIVersion("2.74"):
953+
msg = _("Specifying --hypervisor-hostname is not supported "
954+
"for --os-compute-api-version less than 2.74")
955+
raise exceptions.CommandError(msg)
956+
boot_kwargs['hypervisor_hostname'] = (
957+
parsed_args.hypervisor_hostname)
958+
930959
LOG.debug('boot_args: %s', boot_args)
931960
LOG.debug('boot_kwargs: %s', boot_kwargs)
932961

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

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1940,6 +1940,237 @@ def test_server_create_with_description_api_older(self):
19401940
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
19411941
parsed_args)
19421942

1943+
def test_server_create_with_host_v274(self):
1944+
1945+
# Explicit host is supported for nova api version 2.74 or above
1946+
self.app.client_manager.compute.api_version = 2.74
1947+
1948+
arglist = [
1949+
'--image', 'image1',
1950+
'--flavor', 'flavor1',
1951+
'--host', 'host1',
1952+
self.new_server.name,
1953+
]
1954+
verifylist = [
1955+
('image', 'image1'),
1956+
('flavor', 'flavor1'),
1957+
('host', 'host1'),
1958+
('config_drive', False),
1959+
('server_name', self.new_server.name),
1960+
]
1961+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1962+
1963+
with mock.patch.object(api_versions,
1964+
'APIVersion',
1965+
return_value=2.74):
1966+
# In base command class ShowOne in cliff, abstract method
1967+
# take_action() returns a two-part tuple with a tuple of
1968+
# column names and a tuple of data to be shown.
1969+
columns, data = self.cmd.take_action(parsed_args)
1970+
1971+
# Set expected values
1972+
kwargs = dict(
1973+
meta=None,
1974+
files={},
1975+
reservation_id=None,
1976+
min_count=1,
1977+
max_count=1,
1978+
security_groups=[],
1979+
userdata=None,
1980+
key_name=None,
1981+
availability_zone=None,
1982+
block_device_mapping_v2=[],
1983+
nics='auto',
1984+
scheduler_hints={},
1985+
config_drive=None,
1986+
host='host1',
1987+
)
1988+
# ServerManager.create(name, image, flavor, **kwargs)
1989+
self.servers_mock.create.assert_called_with(
1990+
self.new_server.name,
1991+
self.image,
1992+
self.flavor,
1993+
**kwargs
1994+
)
1995+
1996+
self.assertEqual(self.columns, columns)
1997+
self.assertEqual(self.datalist(), data)
1998+
self.assertFalse(self.images_mock.called)
1999+
self.assertFalse(self.flavors_mock.called)
2000+
2001+
def test_server_create_with_host_pre_v274(self):
2002+
2003+
# Host is not supported for nova api version below 2.74
2004+
self.app.client_manager.compute.api_version = 2.73
2005+
2006+
arglist = [
2007+
'--image', 'image1',
2008+
'--flavor', 'flavor1',
2009+
'--host', 'host1',
2010+
self.new_server.name,
2011+
]
2012+
verifylist = [
2013+
('image', 'image1'),
2014+
('flavor', 'flavor1'),
2015+
('host', 'host1'),
2016+
('config_drive', False),
2017+
('server_name', self.new_server.name),
2018+
]
2019+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2020+
2021+
with mock.patch.object(api_versions,
2022+
'APIVersion',
2023+
return_value=2.74):
2024+
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
2025+
parsed_args)
2026+
2027+
def test_server_create_with_hypervisor_hostname_v274(self):
2028+
2029+
# Explicit hypervisor_hostname is supported for nova api version
2030+
# 2.74 or above
2031+
self.app.client_manager.compute.api_version = 2.74
2032+
2033+
arglist = [
2034+
'--image', 'image1',
2035+
'--flavor', 'flavor1',
2036+
'--hypervisor-hostname', 'node1',
2037+
self.new_server.name,
2038+
]
2039+
verifylist = [
2040+
('image', 'image1'),
2041+
('flavor', 'flavor1'),
2042+
('hypervisor_hostname', 'node1'),
2043+
('config_drive', False),
2044+
('server_name', self.new_server.name),
2045+
]
2046+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2047+
2048+
with mock.patch.object(api_versions,
2049+
'APIVersion',
2050+
return_value=2.74):
2051+
# In base command class ShowOne in cliff, abstract method
2052+
# take_action() returns a two-part tuple with a tuple of
2053+
# column names and a tuple of data to be shown.
2054+
columns, data = self.cmd.take_action(parsed_args)
2055+
2056+
# Set expected values
2057+
kwargs = dict(
2058+
meta=None,
2059+
files={},
2060+
reservation_id=None,
2061+
min_count=1,
2062+
max_count=1,
2063+
security_groups=[],
2064+
userdata=None,
2065+
key_name=None,
2066+
availability_zone=None,
2067+
block_device_mapping_v2=[],
2068+
nics='auto',
2069+
scheduler_hints={},
2070+
config_drive=None,
2071+
hypervisor_hostname='node1',
2072+
)
2073+
# ServerManager.create(name, image, flavor, **kwargs)
2074+
self.servers_mock.create.assert_called_with(
2075+
self.new_server.name,
2076+
self.image,
2077+
self.flavor,
2078+
**kwargs
2079+
)
2080+
2081+
self.assertEqual(self.columns, columns)
2082+
self.assertEqual(self.datalist(), data)
2083+
self.assertFalse(self.images_mock.called)
2084+
self.assertFalse(self.flavors_mock.called)
2085+
2086+
def test_server_create_with_hypervisor_hostname_pre_v274(self):
2087+
2088+
# Hypervisor_hostname is not supported for nova api version below 2.74
2089+
self.app.client_manager.compute.api_version = 2.73
2090+
2091+
arglist = [
2092+
'--image', 'image1',
2093+
'--flavor', 'flavor1',
2094+
'--hypervisor-hostname', 'node1',
2095+
self.new_server.name,
2096+
]
2097+
verifylist = [
2098+
('image', 'image1'),
2099+
('flavor', 'flavor1'),
2100+
('hypervisor_hostname', 'node1'),
2101+
('config_drive', False),
2102+
('server_name', self.new_server.name),
2103+
]
2104+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2105+
2106+
with mock.patch.object(api_versions,
2107+
'APIVersion',
2108+
return_value=2.74):
2109+
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
2110+
parsed_args)
2111+
2112+
def test_server_create_with_host_and_hypervisor_hostname_v274(self):
2113+
2114+
# Explicit host and hypervisor_hostname is supported for nova api
2115+
# version 2.74 or above
2116+
self.app.client_manager.compute.api_version = 2.74
2117+
2118+
arglist = [
2119+
'--image', 'image1',
2120+
'--flavor', 'flavor1',
2121+
'--host', 'host1',
2122+
'--hypervisor-hostname', 'node1',
2123+
self.new_server.name,
2124+
]
2125+
verifylist = [
2126+
('image', 'image1'),
2127+
('flavor', 'flavor1'),
2128+
('host', 'host1'),
2129+
('hypervisor_hostname', 'node1'),
2130+
('config_drive', False),
2131+
('server_name', self.new_server.name),
2132+
]
2133+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2134+
2135+
with mock.patch.object(api_versions,
2136+
'APIVersion',
2137+
return_value=2.74):
2138+
# In base command class ShowOne in cliff, abstract method
2139+
# take_action() returns a two-part tuple with a tuple of
2140+
# column names and a tuple of data to be shown.
2141+
columns, data = self.cmd.take_action(parsed_args)
2142+
2143+
# Set expected values
2144+
kwargs = dict(
2145+
meta=None,
2146+
files={},
2147+
reservation_id=None,
2148+
min_count=1,
2149+
max_count=1,
2150+
security_groups=[],
2151+
userdata=None,
2152+
key_name=None,
2153+
availability_zone=None,
2154+
block_device_mapping_v2=[],
2155+
nics='auto',
2156+
scheduler_hints={},
2157+
config_drive=None,
2158+
host='host1',
2159+
hypervisor_hostname='node1',
2160+
)
2161+
# ServerManager.create(name, image, flavor, **kwargs)
2162+
self.servers_mock.create.assert_called_with(
2163+
self.new_server.name,
2164+
self.image,
2165+
self.flavor,
2166+
**kwargs
2167+
)
2168+
2169+
self.assertEqual(self.columns, columns)
2170+
self.assertEqual(self.datalist(), data)
2171+
self.assertFalse(self.images_mock.called)
2172+
self.assertFalse(self.flavors_mock.called)
2173+
19432174

19442175
class TestServerDelete(TestServer):
19452176

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- |
4+
Add ``--host`` and ``--hypervisor-hostname`` options to
5+
``server create`` command.
6+
[Blueprint `add-host-and-hypervisor-hostname-flag-to-create-server <https://blueprints.launchpad.net/nova/+spec/add-host-and-hypervisor-hostname-flag-to-create-server>`_]

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ oslo.i18n>=3.15.3 # Apache-2.0
1313
oslo.utils>=3.33.0 # Apache-2.0
1414
python-glanceclient>=2.8.0 # Apache-2.0
1515
python-keystoneclient>=3.17.0 # Apache-2.0
16-
python-novaclient>=14.1.0 # Apache-2.0
16+
python-novaclient>=14.2.0 # Apache-2.0
1717
python-cinderclient>=3.3.0 # Apache-2.0

0 commit comments

Comments
 (0)