Skip to content

Commit 136c1fd

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "volume: Migrate 'block storage cleanup' to SDK"
2 parents 0b6890c + 2fdd42c commit 136c1fd

2 files changed

Lines changed: 78 additions & 47 deletions

File tree

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

Lines 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,

openstackclient/volume/v3/block_storage_cleanup.py

Lines 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)