Skip to content

Commit 876c120

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Migrate 'extension list' to SDK"
2 parents 5ab1b13 + b87b575 commit 876c120

7 files changed

Lines changed: 124 additions & 148 deletions

File tree

openstackclient/common/extension.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,24 @@
2222

2323
from openstackclient.i18n import _
2424

25-
2625
LOG = logging.getLogger(__name__)
2726

2827

28+
def _get_extension_columns(item):
29+
column_map = {
30+
'updated': 'updated_at',
31+
}
32+
hidden_columns = ['id', 'links', 'location']
33+
return utils.get_osc_show_columns_for_sdk_resource(
34+
item, column_map, hidden_columns
35+
)
36+
37+
2938
class ListExtension(command.Lister):
3039
_description = _("List API extensions")
3140

3241
def get_parser(self, prog_name):
33-
parser = super(ListExtension, self).get_parser(prog_name)
42+
parser = super().get_parser(prog_name)
3443
parser.add_argument(
3544
'--compute',
3645
action='store_true',
@@ -70,7 +79,7 @@ def take_action(self, parsed_args):
7079
'Alias',
7180
'Description',
7281
'Namespace',
73-
'Updated',
82+
'Updated At',
7483
'Links',
7584
)
7685
else:
@@ -105,12 +114,12 @@ def take_action(self, parsed_args):
105114
LOG.warning(message)
106115

107116
if parsed_args.volume or show_all:
108-
volume_client = self.app.client_manager.volume
117+
volume_client = self.app.client_manager.sdk_connection.volume
109118
try:
110-
data += volume_client.list_extensions.show_all()
119+
data += volume_client.extensions()
111120
except Exception:
112121
message = _(
113-
"Extensions list not supported by " "Block Storage API"
122+
"Extensions list not supported by Block Storage API"
114123
)
115124
LOG.warning(message)
116125

@@ -120,7 +129,7 @@ def take_action(self, parsed_args):
120129
data += network_client.extensions()
121130
except Exception:
122131
message = _(
123-
"Failed to retrieve extensions list " "from Network API"
132+
"Failed to retrieve extensions list from Network API"
124133
)
125134
LOG.warning(message)
126135

@@ -153,7 +162,12 @@ def get_parser(self, prog_name):
153162

154163
def take_action(self, parsed_args):
155164
client = self.app.client_manager.network
156-
ext = str(parsed_args.extension)
157-
obj = client.find_extension(ext, ignore_missing=False).to_dict()
158165

159-
return zip(*sorted(obj.items()))
166+
extension = client.find_extension(
167+
parsed_args.extension,
168+
ignore_missing=False,
169+
)
170+
171+
display_columns, columns = _get_extension_columns(extension)
172+
data = utils.get_dict_properties(extension, columns)
173+
return display_columns, data

openstackclient/tests/unit/common/test_extension.py

Lines changed: 29 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from openstackclient.tests.unit.network.v2 import fakes as network_fakes
2121
from openstackclient.tests.unit import utils
2222
from openstackclient.tests.unit import utils as tests_utils
23-
from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
23+
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
2424

2525

2626
class TestExtension(utils.TestCommand):
@@ -37,26 +37,16 @@ def setUp(self):
3737

3838
sdk_connection = mock.Mock()
3939
self.app.client_manager.sdk_connection = sdk_connection
40+
4041
self.compute_extensions_mock = sdk_connection.compute.extensions
4142
self.compute_extensions_mock.reset_mock()
4243

43-
volume_client = volume_fakes.FakeVolumeClient(
44-
endpoint=fakes.AUTH_URL,
45-
token=fakes.AUTH_TOKEN,
46-
)
47-
self.app.client_manager.volume = volume_client
48-
volume_client.list_extensions = mock.Mock()
49-
self.volume_extensions_mock = volume_client.list_extensions
44+
self.volume_extensions_mock = sdk_connection.volume.extensions
5045
self.volume_extensions_mock.reset_mock()
5146

52-
network_client = network_fakes.FakeNetworkV2Client(
53-
endpoint=fakes.AUTH_URL,
54-
token=fakes.AUTH_TOKEN,
55-
)
56-
self.app.client_manager.network = network_client
57-
network_client.extensions = mock.Mock()
58-
self.network_extensions_mock = network_client.extensions
59-
self.network_extensions_mock.reset_mock()
47+
self.app.client_manager.network = mock.Mock()
48+
self.network_client = self.app.client_manager.network
49+
self.network_client.extensions = mock.Mock()
6050

6151

6252
class TestExtensionList(TestExtension):
@@ -66,14 +56,14 @@ class TestExtensionList(TestExtension):
6656
'Alias',
6757
'Description',
6858
'Namespace',
69-
'Updated',
59+
'Updated At',
7060
'Links',
7161
)
7262

7363
volume_extension = volume_fakes.create_one_extension()
7464
identity_extension = identity_fakes.FakeExtension.create_one_extension()
7565
compute_extension = compute_fakes.create_one_extension()
76-
network_extension = network_fakes.FakeExtension.create_one_extension()
66+
network_extension = network_fakes.create_one_extension()
7767

7868
def setUp(self):
7969
super().setUp()
@@ -82,10 +72,8 @@ def setUp(self):
8272
self.identity_extension
8373
]
8474
self.compute_extensions_mock.return_value = [self.compute_extension]
85-
self.volume_extensions_mock.show_all.return_value = [
86-
self.volume_extension
87-
]
88-
self.network_extensions_mock.return_value = [self.network_extension]
75+
self.volume_extensions_mock.return_value = [self.volume_extension]
76+
self.network_client.extensions.return_value = [self.network_extension]
8977

9078
# Get the command object to test
9179
self.cmd = extension.ListExtension(self.app, None)
@@ -134,8 +122,8 @@ def test_extension_list_no_options(self):
134122
self._test_extension_list_helper(arglist, verifylist, datalist)
135123
self.identity_extensions_mock.list.assert_called_with()
136124
self.compute_extensions_mock.assert_called_with()
137-
self.volume_extensions_mock.show_all.assert_called_with()
138-
self.network_extensions_mock.assert_called_with()
125+
self.volume_extensions_mock.assert_called_with()
126+
self.network_client.extensions.assert_called_with()
139127

140128
def test_extension_list_long(self):
141129
arglist = [
@@ -150,39 +138,39 @@ def test_extension_list_long(self):
150138
self.identity_extension.alias,
151139
self.identity_extension.description,
152140
self.identity_extension.namespace,
153-
self.identity_extension.updated,
141+
'',
154142
self.identity_extension.links,
155143
),
156144
(
157145
self.compute_extension.name,
158146
self.compute_extension.alias,
159147
self.compute_extension.description,
160148
self.compute_extension.namespace,
161-
self.compute_extension.updated,
149+
self.compute_extension.updated_at,
162150
self.compute_extension.links,
163151
),
164152
(
165153
self.volume_extension.name,
166154
self.volume_extension.alias,
167155
self.volume_extension.description,
168-
self.volume_extension.namespace,
169-
self.volume_extension.updated,
156+
'',
157+
self.volume_extension.updated_at,
170158
self.volume_extension.links,
171159
),
172160
(
173161
self.network_extension.name,
174162
self.network_extension.alias,
175163
self.network_extension.description,
176-
self.network_extension.namespace,
177-
self.network_extension.updated,
164+
'',
165+
self.network_extension.updated_at,
178166
self.network_extension.links,
179167
),
180168
)
181169
self._test_extension_list_helper(arglist, verifylist, datalist, True)
182170
self.identity_extensions_mock.list.assert_called_with()
183171
self.compute_extensions_mock.assert_called_with()
184-
self.volume_extensions_mock.show_all.assert_called_with()
185-
self.network_extensions_mock.assert_called_with()
172+
self.volume_extensions_mock.assert_called_with()
173+
self.network_client.extensions.assert_called_with()
186174

187175
def test_extension_list_identity(self):
188176
arglist = [
@@ -216,7 +204,7 @@ def test_extension_list_network(self):
216204
),
217205
)
218206
self._test_extension_list_helper(arglist, verifylist, datalist)
219-
self.network_extensions_mock.assert_called_with()
207+
self.network_client.extensions.assert_called_with()
220208

221209
def test_extension_list_network_with_long(self):
222210
arglist = [
@@ -232,15 +220,15 @@ def test_extension_list_network_with_long(self):
232220
self.network_extension.name,
233221
self.network_extension.alias,
234222
self.network_extension.description,
235-
self.network_extension.namespace,
236-
self.network_extension.updated,
223+
'',
224+
self.network_extension.updated_at,
237225
self.network_extension.links,
238226
),
239227
)
240228
self._test_extension_list_helper(
241229
arglist, verifylist, datalist, long=True
242230
)
243-
self.network_extensions_mock.assert_called_with()
231+
self.network_client.extensions.assert_called_with()
244232

245233
def test_extension_list_compute(self):
246234
arglist = [
@@ -282,7 +270,7 @@ def test_extension_list_compute_and_network(self):
282270
)
283271
self._test_extension_list_helper(arglist, verifylist, datalist)
284272
self.compute_extensions_mock.assert_called_with()
285-
self.network_extensions_mock.assert_called_with()
273+
self.network_client.extensions.assert_called_with()
286274

287275
def test_extension_list_volume(self):
288276
arglist = [
@@ -299,28 +287,24 @@ def test_extension_list_volume(self):
299287
),
300288
)
301289
self._test_extension_list_helper(arglist, verifylist, datalist)
302-
self.volume_extensions_mock.show_all.assert_called_with()
290+
self.volume_extensions_mock.assert_called_with()
303291

304292

305293
class TestExtensionShow(TestExtension):
306-
extension_details = network_fakes.FakeExtension.create_one_extension()
294+
extension_details = network_fakes.create_one_extension()
307295

308296
columns = (
309297
'alias',
310298
'description',
311-
'links',
312299
'name',
313-
'namespace',
314-
'updated',
300+
'updated_at',
315301
)
316302

317303
data = (
318304
extension_details.alias,
319305
extension_details.description,
320-
extension_details.links,
321306
extension_details.name,
322-
extension_details.namespace,
323-
extension_details.updated,
307+
extension_details.updated_at,
324308
)
325309

326310
def setUp(self):

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

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from novaclient import api_versions
2222
from openstack.compute.v2 import aggregate as _aggregate
2323
from openstack.compute.v2 import availability_zone as _availability_zone
24+
from openstack.compute.v2 import extension as _extension
2425
from openstack.compute.v2 import flavor as _flavor
2526
from openstack.compute.v2 import hypervisor as _hypervisor
2627
from openstack.compute.v2 import keypair as _keypair
@@ -288,35 +289,33 @@ def create_agents(attrs=None, count=2):
288289
def create_one_extension(attrs=None):
289290
"""Create a fake extension.
290291
291-
:param dict attrs:
292-
A dictionary with all attributes
293-
:return:
294-
A FakeResource object with name, namespace, etc.
292+
:param dict attrs: A dictionary with all attributes
293+
:return: A fake openstack.compute.v2.extension.Extension object
295294
"""
296295
attrs = attrs or {}
297296

298297
# Set default attributes.
299298
extension_info = {
299+
'alias': 'NMN',
300+
'description': 'description-' + uuid.uuid4().hex,
301+
'links': [
302+
{
303+
"href": "https://github.com/openstack/compute-api",
304+
"type": "text/html",
305+
"rel": "describedby",
306+
}
307+
],
300308
'name': 'name-' + uuid.uuid4().hex,
301309
'namespace': (
302310
'http://docs.openstack.org/compute/ext/multinic/api/v1.1'
303311
),
304-
'description': 'description-' + uuid.uuid4().hex,
305-
'updated': '2014-01-07T12:00:0-00:00',
306-
'alias': 'NMN',
307-
'links': (
308-
'[{"href":'
309-
'"https://github.com/openstack/compute-api", "type":'
310-
' "text/html", "rel": "describedby"}]'
311-
),
312+
'updated_at': '2014-01-07T12:00:0-00:00',
312313
}
313314

314315
# Overwrite default attributes.
315316
extension_info.update(attrs)
316317

317-
extension = fakes.FakeResource(
318-
info=copy.deepcopy(extension_info), loaded=True
319-
)
318+
extension = _extension.Extension(**extension_info)
320319
return extension
321320

322321

0 commit comments

Comments
 (0)