Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 2fdd42c

Browse filesBrowse files
committed
volume: Migrate 'block storage cleanup' to SDK
Change-Id: Ifdceeff74d01fbaba48fa241c3652c0878ec972d Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
1 parent 8fa2a88 commit 2fdd42c
Copy full SHA for 2fdd42c

2 files changed

+78-47Lines changed: 78 additions & 47 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎openstackclient/tests/unit/volume/v3/test_block_storage_cleanup.py‎

Copy file name to clipboardExpand all lines: openstackclient/tests/unit/volume/v3/test_block_storage_cleanup.py
+58-37Lines changed: 58 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,36 @@
1717
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
1818
from openstackclient.volume.v3 import block_storage_cleanup
1919

20-
21-
class TestBlockStorage(volume_fakes.TestVolume):
22-
def setUp(self):
23-
super().setUp()
24-
25-
# Get a shortcut to the BlockStorageWorkerManager Mock
26-
self.worker_mock = self.volume_client.workers
27-
self.worker_mock.reset_mock()
28-
29-
30-
class TestBlockStorageCleanup(TestBlockStorage):
31-
cleaning, unavailable = volume_fakes.create_cleanup_records()
32-
20+
FAKE_CLEANING = [
21+
{
22+
'id': 1,
23+
'host': 'devstack@fakedriver-1',
24+
'binary': 'cinder-volume',
25+
'cluster_name': 'fake_cluster',
26+
}
27+
]
28+
FAKE_UNAVAILABLE = [
29+
{
30+
'id': 2,
31+
'host': 'devstack@fakedriver-2',
32+
'binary': 'cinder-scheduler',
33+
'cluster_name': 'new_cluster',
34+
}
35+
]
36+
FAKE_CLEANUP_RESPONSE = {
37+
'cleaning': FAKE_CLEANING,
38+
'unavailable': FAKE_UNAVAILABLE,
39+
}
40+
41+
42+
class TestBlockStorageCleanup(volume_fakes.TestVolume):
3343
def setUp(self):
3444
super().setUp()
3545

36-
self.worker_mock.clean.return_value = (self.cleaning, self.unavailable)
46+
self.volume_sdk_client.cleanup_service_workers.return_value = (
47+
FAKE_CLEANUP_RESPONSE
48+
)
3749

38-
# Get the command object to test
3950
self.cmd = block_storage_cleanup.BlockStorageCleanup(self.app, None)
4051

4152
def test_cleanup(self):
@@ -55,24 +66,28 @@ def test_cleanup(self):
5566
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
5667

5768
expected_columns = ('ID', 'Cluster Name', 'Host', 'Binary', 'Status')
58-
cleaning_data = tuple(
59-
(obj.id, obj.cluster_name, obj.host, obj.binary, 'Cleaning')
60-
for obj in self.cleaning
69+
expected_data = (
70+
(
71+
1,
72+
'fake_cluster',
73+
'devstack@fakedriver-1',
74+
'cinder-volume',
75+
'Cleaning',
76+
),
77+
(
78+
2,
79+
'new_cluster',
80+
'devstack@fakedriver-2',
81+
'cinder-scheduler',
82+
'Unavailable',
83+
),
6184
)
62-
unavailable_data = tuple(
63-
(obj.id, obj.cluster_name, obj.host, obj.binary, 'Unavailable')
64-
for obj in self.unavailable
65-
)
66-
expected_data = cleaning_data + unavailable_data
6785
columns, data = self.cmd.take_action(parsed_args)
6886

6987
self.assertEqual(expected_columns, columns)
7088
self.assertEqual(expected_data, tuple(data))
7189

72-
# checking if proper call was made to cleanup resources
73-
# Since we ignore all parameters with None value, we don't
74-
# have any arguments passed to the API
75-
self.worker_mock.clean.assert_called_once_with()
90+
self.volume_sdk_client.cleanup_service_workers.assert_called_once_with()
7691

7792
def test_block_storage_cleanup_pre_324(self):
7893
arglist = []
@@ -132,22 +147,28 @@ def test_cleanup_with_args(self):
132147
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
133148

134149
expected_columns = ('ID', 'Cluster Name', 'Host', 'Binary', 'Status')
135-
cleaning_data = tuple(
136-
(obj.id, obj.cluster_name, obj.host, obj.binary, 'Cleaning')
137-
for obj in self.cleaning
138-
)
139-
unavailable_data = tuple(
140-
(obj.id, obj.cluster_name, obj.host, obj.binary, 'Unavailable')
141-
for obj in self.unavailable
150+
expected_data = (
151+
(
152+
1,
153+
'fake_cluster',
154+
'devstack@fakedriver-1',
155+
'cinder-volume',
156+
'Cleaning',
157+
),
158+
(
159+
2,
160+
'new_cluster',
161+
'devstack@fakedriver-2',
162+
'cinder-scheduler',
163+
'Unavailable',
164+
),
142165
)
143-
expected_data = cleaning_data + unavailable_data
144166
columns, data = self.cmd.take_action(parsed_args)
145167

146168
self.assertEqual(expected_columns, columns)
147169
self.assertEqual(expected_data, tuple(data))
148170

149-
# checking if proper call was made to cleanup resources
150-
self.worker_mock.clean.assert_called_once_with(
171+
self.volume_sdk_client.cleanup_service_workers.assert_called_once_with(
151172
cluster_name=fake_cluster,
152173
host=fake_host,
153174
binary=fake_binary,
Collapse file

‎openstackclient/volume/v3/block_storage_cleanup.py‎

Copy file name to clipboardExpand all lines: openstackclient/volume/v3/block_storage_cleanup.py
+20-10Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from collections.abc import Iterable
1515
from typing import Any
1616

17-
from cinderclient import api_versions
17+
from openstack import utils as sdk_utils
1818
from osc_lib import exceptions
1919

2020
from openstackclient import command
@@ -33,15 +33,21 @@ def _format_cleanup_response(
3333
)
3434
combined_data = []
3535
for obj in cleaning:
36-
details = (obj.id, obj.cluster_name, obj.host, obj.binary, 'Cleaning')
36+
details = (
37+
obj['id'],
38+
obj['cluster_name'],
39+
obj['host'],
40+
obj['binary'],
41+
'Cleaning',
42+
)
3743
combined_data.append(details)
3844

3945
for obj in unavailable:
4046
details = (
41-
obj.id,
42-
obj.cluster_name,
43-
obj.host,
44-
obj.binary,
47+
obj['id'],
48+
obj['cluster_name'],
49+
obj['host'],
50+
obj['binary'],
4551
'Unavailable',
4652
)
4753
combined_data.append(details)
@@ -136,9 +142,11 @@ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
136142
def take_action(
137143
self, parsed_args: argparse.Namespace
138144
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
139-
volume_client = self.app.client_manager.volume
145+
volume_client = sdk_utils.ensure_service_version(
146+
self.app.client_manager.sdk_connection.volume, '3'
147+
)
140148

141-
if volume_client.api_version < api_versions.APIVersion('3.24'):
149+
if not sdk_utils.supports_microversion(volume_client, '3.24'):
142150
msg = _(
143151
"--os-volume-api-version 3.24 or greater is required to "
144152
"support the 'block storage cleanup' command"
@@ -157,5 +165,7 @@ def take_action(
157165
}
158166

159167
filters = {k: v for k, v in filters.items() if v is not None}
160-
cleaning, unavailable = volume_client.workers.clean(**filters)
161-
return _format_cleanup_response(cleaning, unavailable)
168+
result = volume_client.cleanup_service_workers(**filters)
169+
return _format_cleanup_response(
170+
result['cleaning'], result['unavailable']
171+
)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.