X Tutup
Skip to content

Commit 2d5f60b

Browse files
committed
Fix microversion 2.96
This change fixes missing conditional logic for microversion 2.96 which adds `pinned_availability_zone` field to `openstack server list` output. Conflicts: Resolved the conflict because of missing change Ia5a4e0047b5123f2fb063cfc9ab1f58b2844308f Change-Id: I1e398bb3379fa6443b0a44db76baaf6241a945e7 Signed-off-by: Rajesh Tailor <ratailor@redhat.com> (cherry picked from commit dbddbf9) (cherry picked from commit 9b137bfcea42ad3714f9af7d13afd435d68c7419)
1 parent da91173 commit 2d5f60b

File tree

2 files changed

+163
-20
lines changed

2 files changed

+163
-20
lines changed

openstackclient/compute/v2/server.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,12 @@ def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
183183
'updated_at': 'updated',
184184
'user_data': 'OS-EXT-SRV-ATTR:user_data',
185185
'vm_state': 'OS-EXT-STS:vm_state',
186-
'pinned_availability_zone': 'pinned_availability_zone',
187186
}
187+
# NOTE(ratailor): microversion 2.96 introduces
188+
# pinned_availability_zone support
189+
if sdk_utils.supports_microversion(compute_client, '2.96'):
190+
column_map['pinned_availability_zone'] = 'pinned_availability_zone'
191+
188192
# Some columns returned by openstacksdk should not be shown because they're
189193
# either irrelevant or duplicates
190194
ignored_columns = {
@@ -235,6 +239,11 @@ def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
235239

236240
info = data
237241

242+
# NOTE(ratailor): microversion 2.96 introduces
243+
# pinned_availability_zone support
244+
if not sdk_utils.supports_microversion(compute_client, '2.96'):
245+
info.pop('pinned_availability_zone', None)
246+
238247
# Convert the image blob to a name
239248
image_info = info.get('image', {})
240249
if image_info and any(image_info.values()):
@@ -2870,16 +2879,17 @@ def take_action(self, parsed_args):
28702879
if parsed_args.long:
28712880
columns += (
28722881
'availability_zone',
2873-
'pinned_availability_zone',
28742882
'hypervisor_hostname',
28752883
'metadata',
28762884
)
28772885
column_headers += (
28782886
'Availability Zone',
2879-
'Pinned Availability Zone',
28802887
'Host',
28812888
'Properties',
28822889
)
2890+
if sdk_utils.supports_microversion(compute_client, '2.96'):
2891+
columns += ('pinned_availability_zone',)
2892+
column_headers += ('Pinned Availability Zone',)
28832893

28842894
# support for additional columns
28852895
if parsed_args.columns:
@@ -2913,10 +2923,11 @@ def take_action(self, parsed_args):
29132923
column_headers += ('Availability Zone',)
29142924
if c in (
29152925
'pinned_availability_zone',
2916-
"Pinned Availability Zone",
2926+
'Pinned Availability Zone',
29172927
):
2918-
columns += ('Pinned Availability Zone',)
2919-
column_headers += ('Pinned Availability Zone',)
2928+
if sdk_utils.supports_microversion(compute_client, '2.96'):
2929+
columns += ('pinned_availability_zone',)
2930+
column_headers += ('Pinned Availability Zone',)
29202931
if c in ('Host', "host"):
29212932
columns += ('hypervisor_hostname',)
29222933
column_headers += ('Host',)

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

Lines changed: 146 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,7 +1227,6 @@ class TestServerCreate(TestServer):
12271227
'locked',
12281228
'locked_reason',
12291229
'name',
1230-
'pinned_availability_zone',
12311230
'progress',
12321231
'project_id',
12331232
'properties',
@@ -1276,7 +1275,6 @@ def datalist(self):
12761275
None, # locked
12771276
None, # locked_reason
12781277
self.server.name,
1279-
None, # pinned_availability_zone
12801278
None, # progress
12811279
None, # project_id
12821280
format_columns.DictColumn({}), # properties
@@ -4600,7 +4598,6 @@ class _TestServerList(TestServer):
46004598
'Flavor Name',
46014599
'Flavor ID',
46024600
'Availability Zone',
4603-
'Pinned Availability Zone',
46044601
'Host',
46054602
'Properties',
46064603
)
@@ -4739,7 +4736,6 @@ def test_server_list_long_option(self):
47394736
self.flavor.name,
47404737
s.flavor['id'],
47414738
getattr(s, 'availability_zone'),
4742-
getattr(s, 'pinned_availability_zone', ''),
47434739
server.HostColumn(getattr(s, 'hypervisor_hostname')),
47444740
format_columns.DictColumn(s.metadata),
47454741
)
@@ -4785,8 +4781,6 @@ def test_server_list_column_option(self):
47854781
'-c',
47864782
'Availability Zone',
47874783
'-c',
4788-
'Pinned Availability Zone',
4789-
'-c',
47904784
'Host',
47914785
'-c',
47924786
'Properties',
@@ -4809,7 +4803,6 @@ def test_server_list_column_option(self):
48094803
self.assertIn('Image ID', columns)
48104804
self.assertIn('Flavor ID', columns)
48114805
self.assertIn('Availability Zone', columns)
4812-
self.assertIn('Pinned Availability Zone', columns)
48134806
self.assertIn('Host', columns)
48144807
self.assertIn('Properties', columns)
48154808
self.assertCountEqual(columns, set(columns))
@@ -5222,7 +5215,6 @@ def test_server_list_long_with_host_status_v216(self):
52225215
self.flavor.name,
52235216
s.flavor['id'],
52245217
getattr(s, 'availability_zone'),
5225-
getattr(s, 'pinned_availability_zone', ''),
52265218
server.HostColumn(getattr(s, 'hypervisor_hostname')),
52275219
format_columns.DictColumn(s.metadata),
52285220
)
@@ -5277,7 +5269,6 @@ def test_server_list_long_with_host_status_v216(self):
52775269
self.flavor.name,
52785270
s.flavor['id'],
52795271
getattr(s, 'availability_zone'),
5280-
getattr(s, 'pinned_availability_zone', ''),
52815272
server.HostColumn(getattr(s, 'hypervisor_hostname')),
52825273
format_columns.DictColumn(s.metadata),
52835274
s.host_status,
@@ -5314,7 +5305,6 @@ class TestServerListV273(_TestServerList):
53145305
'Image ID',
53155306
'Flavor',
53165307
'Availability Zone',
5317-
'Pinned Availability Zone',
53185308
'Host',
53195309
'Properties',
53205310
)
@@ -5513,6 +5503,152 @@ def test_server_list_v269_with_partial_constructs(self):
55135503
self.assertEqual(expected_row, partial_server)
55145504

55155505

5506+
class TestServerListV296(_TestServerList):
5507+
columns = (
5508+
'ID',
5509+
'Name',
5510+
'Status',
5511+
'Networks',
5512+
'Image',
5513+
'Flavor',
5514+
)
5515+
columns_long = (
5516+
'ID',
5517+
'Name',
5518+
'Status',
5519+
'Task State',
5520+
'Power State',
5521+
'Networks',
5522+
'Image Name',
5523+
'Image ID',
5524+
'Flavor',
5525+
'Availability Zone',
5526+
'Host',
5527+
'Properties',
5528+
'Pinned Availability Zone',
5529+
)
5530+
5531+
def setUp(self):
5532+
super().setUp()
5533+
self.set_compute_api_version('2.96')
5534+
5535+
Image = collections.namedtuple('Image', 'id name')
5536+
self.image_client.images.return_value = [
5537+
Image(id=s.image['id'], name=self.image.name)
5538+
# Image will be an empty string if boot-from-volume
5539+
for s in self.servers
5540+
if s.image
5541+
]
5542+
5543+
Flavor = collections.namedtuple('Flavor', 'id name')
5544+
self.compute_sdk_client.flavors.return_value = [
5545+
Flavor(id=s.flavor['id'], name=self.flavor.name)
5546+
for s in self.servers
5547+
]
5548+
5549+
self.data = tuple(
5550+
(
5551+
s.id,
5552+
s.name,
5553+
s.status,
5554+
server.AddressesColumn(s.addresses),
5555+
# Image will be an empty string if boot-from-volume
5556+
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
5557+
self.flavor.name,
5558+
)
5559+
for s in self.servers
5560+
)
5561+
5562+
def test_server_list_long_option(self):
5563+
self.data = tuple(
5564+
(
5565+
s.id,
5566+
s.name,
5567+
s.status,
5568+
getattr(s, 'task_state'),
5569+
server.PowerStateColumn(getattr(s, 'power_state')),
5570+
server.AddressesColumn(s.addresses),
5571+
# Image will be an empty string if boot-from-volume
5572+
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
5573+
s.image['id'] if s.image else server.IMAGE_STRING_FOR_BFV,
5574+
self.flavor.name,
5575+
getattr(s, 'availability_zone'),
5576+
server.HostColumn(getattr(s, 'hypervisor_hostname')),
5577+
format_columns.DictColumn(s.metadata),
5578+
getattr(s, 'pinned_availability_zone', ''),
5579+
)
5580+
for s in self.servers
5581+
)
5582+
arglist = [
5583+
'--long',
5584+
]
5585+
verifylist = [
5586+
('all_projects', False),
5587+
('long', True),
5588+
]
5589+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5590+
5591+
columns, data = self.cmd.take_action(parsed_args)
5592+
self.compute_sdk_client.servers.assert_called_with(**self.kwargs)
5593+
image_ids = {s.image['id'] for s in self.servers if s.image}
5594+
self.image_client.images.assert_called_once_with(
5595+
id=f'in:{",".join(image_ids)}',
5596+
)
5597+
self.compute_sdk_client.flavors.assert_called_once_with(is_public=None)
5598+
self.assertEqual(self.columns_long, columns)
5599+
self.assertEqual(self.data, tuple(data))
5600+
5601+
def test_server_list_column_option(self):
5602+
arglist = [
5603+
'-c',
5604+
'Project ID',
5605+
'-c',
5606+
'User ID',
5607+
'-c',
5608+
'Created At',
5609+
'-c',
5610+
'Security Groups',
5611+
'-c',
5612+
'Task State',
5613+
'-c',
5614+
'Power State',
5615+
'-c',
5616+
'Image ID',
5617+
'-c',
5618+
'Flavor ID',
5619+
'-c',
5620+
'Availability Zone',
5621+
'-c',
5622+
'Host',
5623+
'-c',
5624+
'Properties',
5625+
'-c',
5626+
'Pinned Availability Zone',
5627+
'--long',
5628+
]
5629+
verifylist = [
5630+
('long', True),
5631+
]
5632+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5633+
5634+
columns, data = self.cmd.take_action(parsed_args)
5635+
5636+
self.compute_sdk_client.servers.assert_called_with(**self.kwargs)
5637+
self.assertIn('Project ID', columns)
5638+
self.assertIn('User ID', columns)
5639+
self.assertIn('Created At', columns)
5640+
self.assertIn('Security Groups', columns)
5641+
self.assertIn('Task State', columns)
5642+
self.assertIn('Power State', columns)
5643+
self.assertIn('Image ID', columns)
5644+
self.assertIn('Flavor ID', columns)
5645+
self.assertIn('Availability Zone', columns)
5646+
self.assertIn('Pinned Availability Zone', columns)
5647+
self.assertIn('Host', columns)
5648+
self.assertIn('Properties', columns)
5649+
self.assertCountEqual(columns, set(columns))
5650+
5651+
55165652
class TestServerAction(compute_fakes.TestComputev2):
55175653
def run_method_with_sdk_servers(self, method_name, server_count):
55185654
servers = compute_fakes.create_sdk_servers(count=server_count)
@@ -8443,7 +8579,6 @@ def setUp(self):
84438579
'locked',
84448580
'locked_reason',
84458581
'name',
8446-
'pinned_availability_zone',
84478582
'progress',
84488583
'project_id',
84498584
'properties',
@@ -8493,7 +8628,6 @@ def setUp(self):
84938628
None, # locked
84948629
None, # locked_reason
84958630
self.server.name,
8496-
None, # pinned_availability_zone
84978631
None, # progress
84988632
'tenant-id-xxx', # project_id
84998633
format_columns.DictColumn({}), # properties
@@ -9444,7 +9578,6 @@ def test_prep_server_detail(self):
94449578
'locked': None,
94459579
'locked_reason': None,
94469580
'name': _server.name,
9447-
'pinned_availability_zone': None,
94489581
'progress': None,
94499582
'project_id': 'tenant-id-xxx',
94509583
'properties': format_columns.DictColumn({}),
@@ -9531,7 +9664,6 @@ def test_prep_server_detail_v247(self):
95319664
'locked': None,
95329665
'locked_reason': None,
95339666
'name': _server.name,
9534-
'pinned_availability_zone': None,
95359667
'progress': None,
95369668
'project_id': 'tenant-id-xxx',
95379669
'properties': format_columns.DictColumn({}),

0 commit comments

Comments
 (0)
X Tutup