Skip to content

Commit b87b575

Browse files
committed
Migrate 'extension list' to SDK
Migrate the block storage aspects of this command to SDK. This means the 'extension list' command, like the 'availability zone list' command previously, is now using SDK entirely. While we're here, we also make some fixes to the unit tests for the network and compute aspects of the command. While we migrated the network and compute extension commands from neutronclient and novaclient respectively some time back, we never fully updated the tests. Do this now. Change-Id: I631a6a09dfd9d614b1dd7b322dcee8490a52cc43 Signed-off-by: Stephen Finucane <stephenfin@redhat.com> Depends-On: https://review.opendev.org/c/openstack/openstacksdk/+/885132
1 parent 44cf963 commit b87b575

File tree

7 files changed

+124
-148
lines changed

7 files changed

+124
-148
lines changed

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)