Skip to content

Commit aaeda25

Browse files
committed
Migrate 'volume revert' command to SDK
This patch modifies the existing revert volume to snapshot call from cinderclient to SDK. Change-Id: Iaa9708ebae5d6ab3dfc73e4e2376af32ed098688
1 parent 3c9afe6 commit aaeda25

3 files changed

Lines changed: 55 additions & 24 deletions

File tree

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

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
from unittest import mock
1717

1818
from cinderclient import api_versions
19+
from openstack import utils as sdk_utils
1920
from osc_lib.cli import format_columns
2021
from osc_lib import exceptions
21-
from osc_lib import utils
2222

2323
from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
2424
from openstackclient.volume.v3 import volume
@@ -128,18 +128,36 @@ class TestVolumeRevertToSnapshot(volume_fakes.TestVolume):
128128
def setUp(self):
129129
super().setUp()
130130

131-
self.volumes_mock = self.app.client_manager.volume.volumes
132-
self.volumes_mock.reset_mock()
133-
self.snapshots_mock = self.app.client_manager.volume.volume_snapshots
134-
self.snapshots_mock.reset_mock()
131+
self.app.client_manager.sdk_connection = mock.Mock()
132+
self.app.client_manager.sdk_connection.volume = mock.Mock()
133+
self.sdk_client = self.app.client_manager.sdk_connection.volume
134+
self.sdk_client.reset_mock()
135+
136+
patcher = mock.patch.object(
137+
sdk_utils, 'supports_microversion', return_value=True
138+
)
139+
self.addCleanup(patcher.stop)
140+
self.supports_microversion_mock = patcher.start()
141+
self._set_mock_microversion(
142+
self.app.client_manager.volume.api_version.get_string()
143+
)
144+
135145
self.mock_volume = volume_fakes.create_one_volume()
136146
self.mock_snapshot = volume_fakes.create_one_snapshot(
137-
attrs={'volume_id': self.volumes_mock.id}
147+
attrs={'volume_id': self.mock_volume.id}
138148
)
139149

140150
# Get the command object to test
141151
self.cmd = volume.VolumeRevertToSnapshot(self.app, None)
142152

153+
def _set_mock_microversion(self, mock_v):
154+
"""Set a specific microversion for the mock supports_microversion()."""
155+
self.supports_microversion_mock.reset_mock(return_value=True)
156+
self.supports_microversion_mock.side_effect = (
157+
lambda _, v: api_versions.APIVersion(v)
158+
<= api_versions.APIVersion(mock_v)
159+
)
160+
143161
def test_volume_revert_to_snapshot_pre_340(self):
144162
arglist = [
145163
self.mock_snapshot.id,
@@ -157,9 +175,7 @@ def test_volume_revert_to_snapshot_pre_340(self):
157175
)
158176

159177
def test_volume_revert_to_snapshot(self):
160-
self.app.client_manager.volume.api_version = api_versions.APIVersion(
161-
'3.40'
162-
)
178+
self._set_mock_microversion('3.40')
163179
arglist = [
164180
self.mock_snapshot.id,
165181
]
@@ -168,14 +184,22 @@ def test_volume_revert_to_snapshot(self):
168184
]
169185
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
170186

171-
find_mock_result = [self.mock_snapshot, self.mock_volume]
172187
with mock.patch.object(
173-
utils, 'find_resource', side_effect=find_mock_result
174-
) as find_mock:
188+
self.sdk_client, 'find_volume', return_value=self.mock_volume
189+
), mock.patch.object(
190+
self.sdk_client, 'find_snapshot', return_value=self.mock_snapshot
191+
):
175192
self.cmd.take_action(parsed_args)
176193

177-
self.volumes_mock.revert_to_snapshot.assert_called_once_with(
178-
volume=self.mock_volume,
179-
snapshot=self.mock_snapshot,
194+
self.sdk_client.revert_volume_to_snapshot.assert_called_once_with(
195+
self.mock_volume,
196+
self.mock_snapshot,
197+
)
198+
self.sdk_client.find_volume.assert_called_with(
199+
self.mock_volume.id,
200+
ignore_missing=False,
201+
)
202+
self.sdk_client.find_snapshot.assert_called_with(
203+
self.mock_snapshot.id,
204+
ignore_missing=False,
180205
)
181-
self.assertEqual(2, find_mock.call_count)

openstackclient/volume/v3/volume.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import logging
1818

1919
from cinderclient import api_versions
20+
from openstack import utils as sdk_utils
2021
from osc_lib.cli import format_columns
2122
from osc_lib.command import command
2223
from osc_lib import exceptions
@@ -96,20 +97,22 @@ def get_parser(self, prog_name):
9697
return parser
9798

9899
def take_action(self, parsed_args):
99-
volume_client = self.app.client_manager.volume
100+
volume_client = self.app.client_manager.sdk_connection.volume
100101

101-
if volume_client.api_version < api_versions.APIVersion('3.40'):
102+
if not sdk_utils.supports_microversion(volume_client, '3.40'):
102103
msg = _(
103104
"--os-volume-api-version 3.40 or greater is required to "
104105
"support the 'volume revert snapshot' command"
105106
)
106107
raise exceptions.CommandError(msg)
107108

108-
snapshot = utils.find_resource(
109-
volume_client.volume_snapshots, parsed_args.snapshot
109+
snapshot = volume_client.find_snapshot(
110+
parsed_args.snapshot,
111+
ignore_missing=False,
110112
)
111-
volume = utils.find_resource(volume_client.volumes, snapshot.volume_id)
112-
113-
volume_client.volumes.revert_to_snapshot(
114-
volume=volume, snapshot=snapshot
113+
volume = volume_client.find_volume(
114+
snapshot.volume_id,
115+
ignore_missing=False,
115116
)
117+
118+
volume_client.revert_volume_to_snapshot(volume, snapshot)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
features:
3+
- |
4+
The ``volume revert`` command has been migrated to SDK.

0 commit comments

Comments
 (0)