Fix microversion 2.100
This change fixes missing conditional logic for microversion 2.100 which adds support for showing `scheduler_hints` field to `openstack server list --long` output. Change-Id: I2820e02a91deb73850f37dc737dbec79dea99e8d Signed-off-by: Rajesh Tailor <ratailor@redhat.com>
This commit is contained in:
@@ -183,13 +183,17 @@ def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
|
|||||||
'updated_at': 'updated',
|
'updated_at': 'updated',
|
||||||
'user_data': 'OS-EXT-SRV-ATTR:user_data',
|
'user_data': 'OS-EXT-SRV-ATTR:user_data',
|
||||||
'vm_state': 'OS-EXT-STS:vm_state',
|
'vm_state': 'OS-EXT-STS:vm_state',
|
||||||
'scheduler_hints': 'scheduler_hints',
|
|
||||||
}
|
}
|
||||||
# NOTE(ratailor): microversion 2.96 introduces
|
# NOTE(ratailor): microversion 2.96 introduces
|
||||||
# pinned_availability_zone support
|
# pinned_availability_zone support
|
||||||
if sdk_utils.supports_microversion(compute_client, '2.96'):
|
if sdk_utils.supports_microversion(compute_client, '2.96'):
|
||||||
column_map['pinned_availability_zone'] = 'pinned_availability_zone'
|
column_map['pinned_availability_zone'] = 'pinned_availability_zone'
|
||||||
|
|
||||||
|
# NOTE(ratailor): microversion 2.100 introduces
|
||||||
|
# scheduler_hints support
|
||||||
|
if sdk_utils.supports_microversion(compute_client, '2.100'):
|
||||||
|
column_map['scheduler_hints'] = 'scheduler_hints'
|
||||||
|
|
||||||
# Some columns returned by openstacksdk should not be shown because they're
|
# Some columns returned by openstacksdk should not be shown because they're
|
||||||
# either irrelevant or duplicates
|
# either irrelevant or duplicates
|
||||||
ignored_columns = {
|
ignored_columns = {
|
||||||
@@ -335,6 +339,7 @@ def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
|
|||||||
info['OS-EXT-STS:power_state']
|
info['OS-EXT-STS:power_state']
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if sdk_utils.supports_microversion(compute_client, '2.100'):
|
||||||
if 'scheduler_hints' in info:
|
if 'scheduler_hints' in info:
|
||||||
info['scheduler_hints'] = format_columns.DictListColumn(
|
info['scheduler_hints'] = format_columns.DictListColumn(
|
||||||
info.pop('scheduler_hints', {}),
|
info.pop('scheduler_hints', {}),
|
||||||
@@ -2849,18 +2854,20 @@ class ListServer(command.Lister):
|
|||||||
'availability_zone',
|
'availability_zone',
|
||||||
'hypervisor_hostname',
|
'hypervisor_hostname',
|
||||||
'metadata',
|
'metadata',
|
||||||
'scheduler_hints',
|
|
||||||
)
|
)
|
||||||
column_headers += (
|
column_headers += (
|
||||||
'Availability Zone',
|
'Availability Zone',
|
||||||
'Host',
|
'Host',
|
||||||
'Properties',
|
'Properties',
|
||||||
'Scheduler Hints',
|
|
||||||
)
|
)
|
||||||
if sdk_utils.supports_microversion(compute_client, '2.96'):
|
if sdk_utils.supports_microversion(compute_client, '2.96'):
|
||||||
columns += ('pinned_availability_zone',)
|
columns += ('pinned_availability_zone',)
|
||||||
column_headers += ('Pinned Availability Zone',)
|
column_headers += ('Pinned Availability Zone',)
|
||||||
|
|
||||||
|
if sdk_utils.supports_microversion(compute_client, '2.100'):
|
||||||
|
columns += ('scheduler_hints',)
|
||||||
|
column_headers += ('Scheduler Hints',)
|
||||||
|
|
||||||
if parsed_args.all_projects:
|
if parsed_args.all_projects:
|
||||||
columns += ('project_id',)
|
columns += ('project_id',)
|
||||||
column_headers += ('Project ID',)
|
column_headers += ('Project ID',)
|
||||||
@@ -2911,6 +2918,9 @@ class ListServer(command.Lister):
|
|||||||
if c in (
|
if c in (
|
||||||
'scheduler_hints',
|
'scheduler_hints',
|
||||||
"Scheduler Hints",
|
"Scheduler Hints",
|
||||||
|
):
|
||||||
|
if sdk_utils.supports_microversion(
|
||||||
|
compute_client, '2.100'
|
||||||
):
|
):
|
||||||
columns += ('scheduler_hints',)
|
columns += ('scheduler_hints',)
|
||||||
column_headers += ('Scheduler Hints',)
|
column_headers += ('Scheduler Hints',)
|
||||||
|
@@ -4584,7 +4584,6 @@ class _TestServerList(TestServer):
|
|||||||
'Availability Zone',
|
'Availability Zone',
|
||||||
'Host',
|
'Host',
|
||||||
'Properties',
|
'Properties',
|
||||||
'Scheduler Hints',
|
|
||||||
)
|
)
|
||||||
columns_all_projects = (
|
columns_all_projects = (
|
||||||
'ID',
|
'ID',
|
||||||
@@ -4734,7 +4733,6 @@ class TestServerList(_TestServerList):
|
|||||||
getattr(s, 'availability_zone'),
|
getattr(s, 'availability_zone'),
|
||||||
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
||||||
format_columns.DictColumn(s.metadata),
|
format_columns.DictColumn(s.metadata),
|
||||||
format_columns.DictListColumn(None),
|
|
||||||
)
|
)
|
||||||
for s in self.servers
|
for s in self.servers
|
||||||
)
|
)
|
||||||
@@ -4811,8 +4809,6 @@ class TestServerList(_TestServerList):
|
|||||||
'Host',
|
'Host',
|
||||||
'-c',
|
'-c',
|
||||||
'Properties',
|
'Properties',
|
||||||
'-c',
|
|
||||||
'Scheduler Hints',
|
|
||||||
'--long',
|
'--long',
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
@@ -4834,7 +4830,6 @@ class TestServerList(_TestServerList):
|
|||||||
self.assertIn('Availability Zone', columns)
|
self.assertIn('Availability Zone', columns)
|
||||||
self.assertIn('Host', columns)
|
self.assertIn('Host', columns)
|
||||||
self.assertIn('Properties', columns)
|
self.assertIn('Properties', columns)
|
||||||
self.assertIn('Scheduler Hints', columns)
|
|
||||||
self.assertCountEqual(columns, set(columns))
|
self.assertCountEqual(columns, set(columns))
|
||||||
|
|
||||||
def test_server_list_no_name_lookup_option(self):
|
def test_server_list_no_name_lookup_option(self):
|
||||||
@@ -5247,7 +5242,6 @@ class TestServerList(_TestServerList):
|
|||||||
getattr(s, 'availability_zone'),
|
getattr(s, 'availability_zone'),
|
||||||
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
||||||
format_columns.DictColumn(s.metadata),
|
format_columns.DictColumn(s.metadata),
|
||||||
format_columns.DictListColumn(s.scheduler_hints),
|
|
||||||
)
|
)
|
||||||
for s in self.servers
|
for s in self.servers
|
||||||
)
|
)
|
||||||
@@ -5303,7 +5297,6 @@ class TestServerList(_TestServerList):
|
|||||||
getattr(s, 'availability_zone'),
|
getattr(s, 'availability_zone'),
|
||||||
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
||||||
format_columns.DictColumn(s.metadata),
|
format_columns.DictColumn(s.metadata),
|
||||||
format_columns.DictListColumn(s.scheduler_hints),
|
|
||||||
s.host_status,
|
s.host_status,
|
||||||
)
|
)
|
||||||
for s in servers
|
for s in servers
|
||||||
@@ -5558,7 +5551,6 @@ class TestServerListV296(_TestServerList):
|
|||||||
'Availability Zone',
|
'Availability Zone',
|
||||||
'Host',
|
'Host',
|
||||||
'Properties',
|
'Properties',
|
||||||
'Scheduler Hints',
|
|
||||||
'Pinned Availability Zone',
|
'Pinned Availability Zone',
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -5611,7 +5603,6 @@ class TestServerListV296(_TestServerList):
|
|||||||
getattr(s, 'availability_zone'),
|
getattr(s, 'availability_zone'),
|
||||||
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
||||||
format_columns.DictColumn(s.metadata),
|
format_columns.DictColumn(s.metadata),
|
||||||
format_columns.DictListColumn(None),
|
|
||||||
getattr(s, 'pinned_availability_zone', ''),
|
getattr(s, 'pinned_availability_zone', ''),
|
||||||
)
|
)
|
||||||
for s in self.servers
|
for s in self.servers
|
||||||
@@ -5660,9 +5651,159 @@ class TestServerListV296(_TestServerList):
|
|||||||
'-c',
|
'-c',
|
||||||
'Properties',
|
'Properties',
|
||||||
'-c',
|
'-c',
|
||||||
|
'Pinned Availability Zone',
|
||||||
|
'--long',
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('long', True),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
self.compute_client.servers.assert_called_with(**self.kwargs)
|
||||||
|
self.assertIn('Project ID', columns)
|
||||||
|
self.assertIn('User ID', columns)
|
||||||
|
self.assertIn('Created At', columns)
|
||||||
|
self.assertIn('Security Groups', columns)
|
||||||
|
self.assertIn('Task State', columns)
|
||||||
|
self.assertIn('Power State', columns)
|
||||||
|
self.assertIn('Image ID', columns)
|
||||||
|
self.assertIn('Flavor ID', columns)
|
||||||
|
self.assertIn('Availability Zone', columns)
|
||||||
|
self.assertIn('Pinned Availability Zone', columns)
|
||||||
|
self.assertIn('Host', columns)
|
||||||
|
self.assertIn('Properties', columns)
|
||||||
|
self.assertCountEqual(columns, set(columns))
|
||||||
|
|
||||||
|
|
||||||
|
class TestServerListV2100(_TestServerList):
|
||||||
|
columns = (
|
||||||
|
'ID',
|
||||||
|
'Name',
|
||||||
|
'Status',
|
||||||
|
'Networks',
|
||||||
|
'Image',
|
||||||
|
'Flavor',
|
||||||
|
)
|
||||||
|
columns_long = (
|
||||||
|
'ID',
|
||||||
|
'Name',
|
||||||
|
'Status',
|
||||||
|
'Task State',
|
||||||
|
'Power State',
|
||||||
|
'Networks',
|
||||||
|
'Image Name',
|
||||||
|
'Image ID',
|
||||||
|
'Flavor',
|
||||||
|
'Availability Zone',
|
||||||
|
'Host',
|
||||||
|
'Properties',
|
||||||
|
'Pinned Availability Zone',
|
||||||
'Scheduler Hints',
|
'Scheduler Hints',
|
||||||
|
)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
self.set_compute_api_version('2.100')
|
||||||
|
|
||||||
|
self.image_client.images.return_value = [
|
||||||
|
sdk_fakes.generate_fake_resource(
|
||||||
|
_image.Image, id=s.image['id'], name=self.image.name
|
||||||
|
)
|
||||||
|
# Image will be an empty string if boot-from-volume
|
||||||
|
for s in self.servers
|
||||||
|
if s.image
|
||||||
|
]
|
||||||
|
|
||||||
|
self.compute_client.flavors.return_value = [
|
||||||
|
sdk_fakes.generate_fake_resource(
|
||||||
|
_flavor.Flavor, id=s.flavor['id'], name=self.flavor.name
|
||||||
|
)
|
||||||
|
for s in self.servers
|
||||||
|
]
|
||||||
|
|
||||||
|
self.data = tuple(
|
||||||
|
(
|
||||||
|
s.id,
|
||||||
|
s.name,
|
||||||
|
s.status,
|
||||||
|
server.AddressesColumn(s.addresses),
|
||||||
|
# Image will be an empty string if boot-from-volume
|
||||||
|
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
|
||||||
|
self.flavor.name,
|
||||||
|
)
|
||||||
|
for s in self.servers
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_server_list_long_option(self):
|
||||||
|
self.data = tuple(
|
||||||
|
(
|
||||||
|
s.id,
|
||||||
|
s.name,
|
||||||
|
s.status,
|
||||||
|
getattr(s, 'task_state'),
|
||||||
|
server.PowerStateColumn(getattr(s, 'power_state')),
|
||||||
|
server.AddressesColumn(s.addresses),
|
||||||
|
# Image will be an empty string if boot-from-volume
|
||||||
|
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
|
||||||
|
s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
|
||||||
|
self.flavor.name,
|
||||||
|
getattr(s, 'availability_zone'),
|
||||||
|
server.HostColumn(getattr(s, 'hypervisor_hostname')),
|
||||||
|
format_columns.DictColumn(s.metadata),
|
||||||
|
getattr(s, 'pinned_availability_zone', ''),
|
||||||
|
format_columns.DictListColumn(None),
|
||||||
|
)
|
||||||
|
for s in self.servers
|
||||||
|
)
|
||||||
|
arglist = [
|
||||||
|
'--long',
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('all_projects', False),
|
||||||
|
('long', True),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
self.compute_client.servers.assert_called_with(**self.kwargs)
|
||||||
|
image_ids = {s.image['id'] for s in self.servers if s.image}
|
||||||
|
self.image_client.images.assert_called_once_with(
|
||||||
|
id=f'in:{",".join(image_ids)}',
|
||||||
|
)
|
||||||
|
self.compute_client.flavors.assert_called_once_with(is_public=None)
|
||||||
|
self.assertEqual(self.columns_long, columns)
|
||||||
|
self.assertEqual(self.data, tuple(data))
|
||||||
|
|
||||||
|
def test_server_list_column_option(self):
|
||||||
|
arglist = [
|
||||||
|
'-c',
|
||||||
|
'Project ID',
|
||||||
|
'-c',
|
||||||
|
'User ID',
|
||||||
|
'-c',
|
||||||
|
'Created At',
|
||||||
|
'-c',
|
||||||
|
'Security Groups',
|
||||||
|
'-c',
|
||||||
|
'Task State',
|
||||||
|
'-c',
|
||||||
|
'Power State',
|
||||||
|
'-c',
|
||||||
|
'Image ID',
|
||||||
|
'-c',
|
||||||
|
'Flavor ID',
|
||||||
|
'-c',
|
||||||
|
'Availability Zone',
|
||||||
|
'-c',
|
||||||
|
'Host',
|
||||||
|
'-c',
|
||||||
|
'Properties',
|
||||||
'-c',
|
'-c',
|
||||||
'Pinned Availability Zone',
|
'Pinned Availability Zone',
|
||||||
|
'-c',
|
||||||
|
'Scheduler Hints',
|
||||||
'--long',
|
'--long',
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
|
Reference in New Issue
Block a user