Skip to content

Commit 205d6e4

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Refactor Extension show and list command"
2 parents 3fabbe9 + acc2d10 commit 205d6e4

4 files changed

Lines changed: 112 additions & 53 deletions

File tree

openstackclient/common/extension.py

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
"""Extension action implementations"""
1717

18-
import itertools
1918
import logging
2019

2120
from osc_lib.command import command
@@ -66,8 +65,8 @@ def get_parser(self, prog_name):
6665

6766
def take_action(self, parsed_args):
6867
if parsed_args.long:
69-
columns = ('Name', 'Namespace', 'Description',
70-
'Alias', 'Updated', 'Links')
68+
columns = ('Name', 'Alias', 'Description',
69+
'Namespace', 'Updated', 'Links')
7170
else:
7271
columns = ('Name', 'Alias', 'Description')
7372

@@ -104,35 +103,22 @@ def take_action(self, parsed_args):
104103
"Block Storage API")
105104
LOG.warning(message)
106105

107-
# Resource classes for the above
106+
if parsed_args.network or show_all:
107+
network_client = self.app.client_manager.network
108+
try:
109+
data += network_client.extensions()
110+
except Exception:
111+
message = _("Failed to retrieve extensions list "
112+
"from Network API")
113+
LOG.warning(message)
114+
108115
extension_tuples = (
109116
utils.get_item_properties(
110117
s,
111118
columns,
112-
formatters={},
113119
) for s in data
114120
)
115121

116-
# Dictionaries for the below
117-
if parsed_args.network or show_all:
118-
network_client = self.app.client_manager.network
119-
try:
120-
data = network_client.extensions()
121-
dict_tuples = (
122-
utils.get_item_properties(
123-
s,
124-
columns,
125-
formatters={},
126-
) for s in data
127-
)
128-
extension_tuples = itertools.chain(
129-
extension_tuples,
130-
dict_tuples
131-
)
132-
except Exception:
133-
message = _("Extensions list not supported by Network API")
134-
LOG.warning(message)
135-
136122
return (columns, extension_tuples)
137123

138124

@@ -152,14 +138,7 @@ def get_parser(self, prog_name):
152138

153139
def take_action(self, parsed_args):
154140
client = self.app.client_manager.network
155-
columns = ('Alias', 'Description', 'Links', 'Name',
156-
'Namespace', 'Updated')
157141
ext = str(parsed_args.extension)
158-
obj = client.find_extension(ext)
159-
dict_tuples = (utils.get_item_properties(
160-
obj,
161-
columns,
162-
formatters={},)
163-
)
164-
165-
return columns, dict_tuples
142+
obj = client.find_extension(ext, ignore_missing=False).to_dict()
143+
144+
return zip(*sorted(obj.items()))

openstackclient/tests/functional/common/test_extension.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import json
1717

18+
from tempest.lib import exceptions as tempest_exc
19+
1820
from openstackclient.tests.functional import base
1921

2022

@@ -23,7 +25,6 @@ class ExtensionTests(base.TestCase):
2325

2426
@classmethod
2527
def setUpClass(cls):
26-
# super(NetworkTests, cls).setUp()
2728
cls.haz_network = base.is_service_enabled('network')
2829

2930
def test_extension_list_compute(self):
@@ -38,6 +39,18 @@ def test_extension_list_compute(self):
3839
name_list,
3940
)
4041

42+
def test_extension_list_volume(self):
43+
"""Test volume extension list"""
44+
json_output = json.loads(self.openstack(
45+
'extension list -f json ' +
46+
'--volume'
47+
))
48+
name_list = [item.get('Name') for item in json_output]
49+
self.assertIn(
50+
'TypesManage',
51+
name_list,
52+
)
53+
4154
def test_extension_list_network(self):
4255
"""Test network extension list"""
4356
if not self.haz_network:
@@ -79,5 +92,19 @@ def test_extension_show_network(self):
7992
))
8093
self.assertEqual(
8194
name,
82-
json_output.get('Alias'),
95+
json_output.get('alias'),
8396
)
97+
98+
def test_extension_show_not_exist(self):
99+
"""Test extension show with not existed name"""
100+
if not self.haz_network:
101+
self.skipTest("No Network service present")
102+
103+
name = 'not_existed_ext'
104+
try:
105+
self.openstack('extension show ' + name)
106+
except tempest_exc.CommandFailed as e:
107+
self.assertIn('ResourceNotFound', str(e))
108+
self.assertIn(name, str(e))
109+
else:
110+
self.fail('CommandFailed should be raised')

openstackclient/tests/unit/common/test_extension.py

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def setUp(self):
6767
class TestExtensionList(TestExtension):
6868

6969
columns = ('Name', 'Alias', 'Description')
70-
long_columns = ('Name', 'Namespace', 'Description', 'Alias', 'Updated',
70+
long_columns = ('Name', 'Alias', 'Description', 'Namespace', 'Updated',
7171
'Links')
7272

7373
volume_extension = volume_fakes.FakeExtension.create_one_extension()
@@ -145,33 +145,33 @@ def test_extension_list_long(self):
145145
datalist = (
146146
(
147147
self.identity_extension.name,
148-
self.identity_extension.namespace,
149-
self.identity_extension.description,
150148
self.identity_extension.alias,
149+
self.identity_extension.description,
150+
self.identity_extension.namespace,
151151
self.identity_extension.updated,
152152
self.identity_extension.links,
153153
),
154154
(
155155
self.compute_extension.name,
156-
self.compute_extension.namespace,
157-
self.compute_extension.description,
158156
self.compute_extension.alias,
157+
self.compute_extension.description,
158+
self.compute_extension.namespace,
159159
self.compute_extension.updated,
160160
self.compute_extension.links,
161161
),
162162
(
163163
self.volume_extension.name,
164-
self.volume_extension.namespace,
165-
self.volume_extension.description,
166164
self.volume_extension.alias,
165+
self.volume_extension.description,
166+
self.volume_extension.namespace,
167167
self.volume_extension.updated,
168168
self.volume_extension.links,
169169
),
170170
(
171171
self.network_extension.name,
172-
self.network_extension.namespace,
173-
self.network_extension.description,
174172
self.network_extension.alias,
173+
self.network_extension.description,
174+
self.network_extension.namespace,
175175
self.network_extension.updated,
176176
self.network_extension.links,
177177
),
@@ -214,6 +214,27 @@ def test_extension_list_network(self):
214214
self._test_extension_list_helper(arglist, verifylist, datalist)
215215
self.network_extensions_mock.assert_called_with()
216216

217+
def test_extension_list_network_with_long(self):
218+
arglist = [
219+
'--network',
220+
'--long',
221+
]
222+
verifylist = [
223+
('network', True),
224+
('long', True),
225+
]
226+
datalist = ((
227+
self.network_extension.name,
228+
self.network_extension.alias,
229+
self.network_extension.description,
230+
self.network_extension.namespace,
231+
self.network_extension.updated,
232+
self.network_extension.links,
233+
), )
234+
self._test_extension_list_helper(arglist, verifylist, datalist,
235+
long=True)
236+
self.network_extensions_mock.assert_called_with()
237+
217238
def test_extension_list_compute(self):
218239
arglist = [
219240
'--compute',
@@ -229,6 +250,31 @@ def test_extension_list_compute(self):
229250
self._test_extension_list_helper(arglist, verifylist, datalist)
230251
self.compute_extensions_mock.show_all.assert_called_with()
231252

253+
def test_extension_list_compute_and_network(self):
254+
arglist = [
255+
'--compute',
256+
'--network',
257+
]
258+
verifylist = [
259+
('compute', True),
260+
('network', True),
261+
]
262+
datalist = (
263+
(
264+
self.compute_extension.name,
265+
self.compute_extension.alias,
266+
self.compute_extension.description,
267+
),
268+
(
269+
self.network_extension.name,
270+
self.network_extension.alias,
271+
self.network_extension.description,
272+
),
273+
)
274+
self._test_extension_list_helper(arglist, verifylist, datalist)
275+
self.compute_extensions_mock.show_all.assert_called_with()
276+
self.network_extensions_mock.assert_called_with()
277+
232278
def test_extension_list_volume(self):
233279
arglist = [
234280
'--volume',
@@ -251,12 +297,12 @@ class TestExtensionShow(TestExtension):
251297
)
252298

253299
columns = (
254-
'Alias',
255-
'Description',
256-
'Links',
257-
'Name',
258-
'Namespace',
259-
'Updated'
300+
'alias',
301+
'description',
302+
'links',
303+
'name',
304+
'namespace',
305+
'updated',
260306
)
261307

262308
data = (
@@ -296,7 +342,7 @@ def test_show_all_options(self):
296342
columns, data = self.cmd.take_action(parsed_args)
297343

298344
self.app.client_manager.network.find_extension.assert_called_with(
299-
self.extension_details.alias)
345+
self.extension_details.alias, ignore_missing=False)
300346

301347
self.assertEqual(self.columns, columns)
302348
self.assertEqual(self.data, data)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
fixes:
3+
- |
4+
Raise exact exception when extension don't exist in ``extension show``
5+
command, and keep the column display order consist in ``extension list``
6+
with and without ``--long`` option.
7+
[Bug `1689233 <https://bugs.launchpad.net/python-openstackclient/+bug/1689233>`_]

0 commit comments

Comments
 (0)