Skip to content

Commit 78ef2f5

Browse files
committed
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> (cherry picked from commit e755460)
1 parent f2c9fbf commit 78ef2f5

File tree

2 files changed

+173
-16
lines changed

2 files changed

+173
-16
lines changed

openstackclient/compute/v2/server.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,13 @@ def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
184184
'user_data': 'OS-EXT-SRV-ATTR:user_data',
185185
'vm_state': 'OS-EXT-STS:vm_state',
186186
'pinned_availability_zone': 'pinned_availability_zone',
187-
'scheduler_hints': 'scheduler_hints',
188187
}
188+
189+
# NOTE(ratailor): microversion 2.100 introduces
190+
# scheduler_hints support
191+
if sdk_utils.supports_microversion(compute_client, '2.100'):
192+
column_map['scheduler_hints'] = 'scheduler_hints'
193+
189194
# Some columns returned by openstacksdk should not be shown because they're
190195
# either irrelevant or duplicates
191196
ignored_columns = {
@@ -326,10 +331,11 @@ def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
326331
info['OS-EXT-STS:power_state']
327332
)
328333

329-
if 'scheduler_hints' in info:
330-
info['scheduler_hints'] = format_columns.DictListColumn(
331-
info.pop('scheduler_hints', {}),
332-
)
334+
if sdk_utils.supports_microversion(compute_client, '2.100'):
335+
if 'scheduler_hints' in info:
336+
info['scheduler_hints'] = format_columns.DictListColumn(
337+
info.pop('scheduler_hints', {}),
338+
)
333339

334340
return info
335341

@@ -2841,16 +2847,18 @@ def take_action(self, parsed_args):
28412847
'pinned_availability_zone',
28422848
'hypervisor_hostname',
28432849
'metadata',
2844-
'scheduler_hints',
28452850
)
28462851
column_headers += (
28472852
'Availability Zone',
28482853
'Pinned Availability Zone',
28492854
'Host',
28502855
'Properties',
2851-
'Scheduler Hints',
28522856
)
28532857

2858+
if sdk_utils.supports_microversion(compute_client, '2.100'):
2859+
columns += ('scheduler_hints',)
2860+
column_headers += ('Scheduler Hints',)
2861+
28542862
if parsed_args.all_projects:
28552863
columns += ('project_id',)
28562864
column_headers += ('Project ID',)
@@ -2901,8 +2909,11 @@ def take_action(self, parsed_args):
29012909
'scheduler_hints',
29022910
"Scheduler Hints",
29032911
):
2904-
columns += ('scheduler_hints',)
2905-
column_headers += ('Scheduler Hints',)
2912+
if sdk_utils.supports_microversion(
2913+
compute_client, '2.100'
2914+
):
2915+
columns += ('scheduler_hints',)
2916+
column_headers += ('Scheduler Hints',)
29062917

29072918
# remove duplicates
29082919
column_headers = tuple(dict.fromkeys(column_headers))

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

Lines changed: 153 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4587,7 +4587,6 @@ class _TestServerList(TestServer):
45874587
'Pinned Availability Zone',
45884588
'Host',
45894589
'Properties',
4590-
'Scheduler Hints',
45914590
)
45924591
columns_all_projects = (
45934592
'ID',
@@ -4738,7 +4737,6 @@ def test_server_list_long_option(self):
47384737
getattr(s, 'pinned_availability_zone', ''),
47394738
server.HostColumn(getattr(s, 'hypervisor_hostname')),
47404739
format_columns.DictColumn(s.metadata),
4741-
format_columns.DictListColumn(None),
47424740
)
47434741
for s in self.servers
47444742
)
@@ -4817,8 +4815,6 @@ def test_server_list_column_option(self):
48174815
'Host',
48184816
'-c',
48194817
'Properties',
4820-
'-c',
4821-
'Scheduler Hints',
48224818
'--long',
48234819
]
48244820
verifylist = [
@@ -4841,7 +4837,6 @@ def test_server_list_column_option(self):
48414837
self.assertIn('Pinned Availability Zone', columns)
48424838
self.assertIn('Host', columns)
48434839
self.assertIn('Properties', columns)
4844-
self.assertIn('Scheduler Hints', columns)
48454840
self.assertCountEqual(columns, set(columns))
48464841

48474842
def test_server_list_no_name_lookup_option(self):
@@ -5255,7 +5250,6 @@ def test_server_list_long_with_host_status_v216(self):
52555250
getattr(s, 'pinned_availability_zone', ''),
52565251
server.HostColumn(getattr(s, 'hypervisor_hostname')),
52575252
format_columns.DictColumn(s.metadata),
5258-
format_columns.DictListColumn(s.scheduler_hints),
52595253
)
52605254
for s in self.servers
52615255
)
@@ -5312,7 +5306,6 @@ def test_server_list_long_with_host_status_v216(self):
53125306
getattr(s, 'pinned_availability_zone', ''),
53135307
server.HostColumn(getattr(s, 'hypervisor_hostname')),
53145308
format_columns.DictColumn(s.metadata),
5315-
format_columns.DictListColumn(s.scheduler_hints),
53165309
s.host_status,
53175310
)
53185311
for s in servers
@@ -5546,6 +5539,159 @@ def test_server_list_v269_with_partial_constructs(self):
55465539
self.assertEqual(expected_row, partial_server)
55475540

55485541

5542+
class TestServerListV2100(_TestServerList):
5543+
columns = (
5544+
'ID',
5545+
'Name',
5546+
'Status',
5547+
'Networks',
5548+
'Image',
5549+
'Flavor',
5550+
)
5551+
columns_long = (
5552+
'ID',
5553+
'Name',
5554+
'Status',
5555+
'Task State',
5556+
'Power State',
5557+
'Networks',
5558+
'Image Name',
5559+
'Image ID',
5560+
'Flavor',
5561+
'Availability Zone',
5562+
'Pinned Availability Zone',
5563+
'Host',
5564+
'Properties',
5565+
'Scheduler Hints',
5566+
)
5567+
5568+
def setUp(self):
5569+
super().setUp()
5570+
self.set_compute_api_version('2.100')
5571+
5572+
self.image_client.images.return_value = [
5573+
sdk_fakes.generate_fake_resource(
5574+
_image.Image, id=s.image['id'], name=self.image.name
5575+
)
5576+
# Image will be an empty string if boot-from-volume
5577+
for s in self.servers
5578+
if s.image
5579+
]
5580+
5581+
self.compute_client.flavors.return_value = [
5582+
sdk_fakes.generate_fake_resource(
5583+
_flavor.Flavor, id=s.flavor['id'], name=self.flavor.name
5584+
)
5585+
for s in self.servers
5586+
]
5587+
5588+
self.data = tuple(
5589+
(
5590+
s.id,
5591+
s.name,
5592+
s.status,
5593+
server.AddressesColumn(s.addresses),
5594+
# Image will be an empty string if boot-from-volume
5595+
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
5596+
self.flavor.name,
5597+
)
5598+
for s in self.servers
5599+
)
5600+
5601+
def test_server_list_long_option(self):
5602+
self.data = tuple(
5603+
(
5604+
s.id,
5605+
s.name,
5606+
s.status,
5607+
getattr(s, 'task_state'),
5608+
server.PowerStateColumn(getattr(s, 'power_state')),
5609+
server.AddressesColumn(s.addresses),
5610+
# Image will be an empty string if boot-from-volume
5611+
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
5612+
s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
5613+
self.flavor.name,
5614+
getattr(s, 'availability_zone'),
5615+
getattr(s, 'pinned_availability_zone', ''),
5616+
server.HostColumn(getattr(s, 'hypervisor_hostname')),
5617+
format_columns.DictColumn(s.metadata),
5618+
format_columns.DictListColumn(None),
5619+
)
5620+
for s in self.servers
5621+
)
5622+
arglist = [
5623+
'--long',
5624+
]
5625+
verifylist = [
5626+
('all_projects', False),
5627+
('long', True),
5628+
]
5629+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5630+
5631+
columns, data = self.cmd.take_action(parsed_args)
5632+
self.compute_client.servers.assert_called_with(**self.kwargs)
5633+
image_ids = {s.image['id'] for s in self.servers if s.image}
5634+
self.image_client.images.assert_called_once_with(
5635+
id=f'in:{",".join(image_ids)}',
5636+
)
5637+
self.compute_client.flavors.assert_called_once_with(is_public=None)
5638+
self.assertEqual(self.columns_long, columns)
5639+
self.assertEqual(self.data, tuple(data))
5640+
5641+
def test_server_list_column_option(self):
5642+
arglist = [
5643+
'-c',
5644+
'Project ID',
5645+
'-c',
5646+
'User ID',
5647+
'-c',
5648+
'Created At',
5649+
'-c',
5650+
'Security Groups',
5651+
'-c',
5652+
'Task State',
5653+
'-c',
5654+
'Power State',
5655+
'-c',
5656+
'Image ID',
5657+
'-c',
5658+
'Flavor ID',
5659+
'-c',
5660+
'Availability Zone',
5661+
'-c',
5662+
'Pinned Availability Zone',
5663+
'-c',
5664+
'Host',
5665+
'-c',
5666+
'Properties',
5667+
'-c',
5668+
'Scheduler Hints',
5669+
'--long',
5670+
]
5671+
verifylist = [
5672+
('long', True),
5673+
]
5674+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5675+
5676+
columns, data = self.cmd.take_action(parsed_args)
5677+
5678+
self.compute_client.servers.assert_called_with(**self.kwargs)
5679+
self.assertIn('Project ID', columns)
5680+
self.assertIn('User ID', columns)
5681+
self.assertIn('Created At', columns)
5682+
self.assertIn('Security Groups', columns)
5683+
self.assertIn('Task State', columns)
5684+
self.assertIn('Power State', columns)
5685+
self.assertIn('Image ID', columns)
5686+
self.assertIn('Flavor ID', columns)
5687+
self.assertIn('Availability Zone', columns)
5688+
self.assertIn('Pinned Availability Zone', columns)
5689+
self.assertIn('Host', columns)
5690+
self.assertIn('Properties', columns)
5691+
self.assertIn('Scheduler Hints', columns)
5692+
self.assertCountEqual(columns, set(columns))
5693+
5694+
55495695
class TestServerAction(compute_fakes.TestComputev2):
55505696
def run_method_with_sdk_servers(self, method_name, server_count):
55515697
servers = compute_fakes.create_servers(count=server_count)

0 commit comments

Comments
 (0)