From aaeda25e28ba27c7e5d1870eba448e94e4a8aa1b Mon Sep 17 00:00:00 2001 From: whoami-rajat Date: Tue, 16 May 2023 17:34:20 +0530 Subject: Migrate 'volume revert' command to SDK This patch modifies the existing revert volume to snapshot call from cinderclient to SDK. Change-Id: Iaa9708ebae5d6ab3dfc73e4e2376af32ed098688 --- .../tests/unit/volume/v3/test_volume.py | 56 +++++++++++++++------- openstackclient/volume/v3/volume.py | 19 ++++---- ...rate-volume-revert-to-sdk-1e399853d80ba5f8.yaml | 4 ++ 3 files changed, 55 insertions(+), 24 deletions(-) create mode 100644 releasenotes/notes/migrate-volume-revert-to-sdk-1e399853d80ba5f8.yaml diff --git a/openstackclient/tests/unit/volume/v3/test_volume.py b/openstackclient/tests/unit/volume/v3/test_volume.py index 507edc42..1b298678 100644 --- a/openstackclient/tests/unit/volume/v3/test_volume.py +++ b/openstackclient/tests/unit/volume/v3/test_volume.py @@ -16,9 +16,9 @@ import copy from unittest import mock from cinderclient import api_versions +from openstack import utils as sdk_utils from osc_lib.cli import format_columns from osc_lib import exceptions -from osc_lib import utils from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes from openstackclient.volume.v3 import volume @@ -128,18 +128,36 @@ class TestVolumeRevertToSnapshot(volume_fakes.TestVolume): def setUp(self): super().setUp() - self.volumes_mock = self.app.client_manager.volume.volumes - self.volumes_mock.reset_mock() - self.snapshots_mock = self.app.client_manager.volume.volume_snapshots - self.snapshots_mock.reset_mock() + self.app.client_manager.sdk_connection = mock.Mock() + self.app.client_manager.sdk_connection.volume = mock.Mock() + self.sdk_client = self.app.client_manager.sdk_connection.volume + self.sdk_client.reset_mock() + + patcher = mock.patch.object( + sdk_utils, 'supports_microversion', return_value=True + ) + self.addCleanup(patcher.stop) + self.supports_microversion_mock = patcher.start() + self._set_mock_microversion( + self.app.client_manager.volume.api_version.get_string() + ) + self.mock_volume = volume_fakes.create_one_volume() self.mock_snapshot = volume_fakes.create_one_snapshot( - attrs={'volume_id': self.volumes_mock.id} + attrs={'volume_id': self.mock_volume.id} ) # Get the command object to test self.cmd = volume.VolumeRevertToSnapshot(self.app, None) + def _set_mock_microversion(self, mock_v): + """Set a specific microversion for the mock supports_microversion().""" + self.supports_microversion_mock.reset_mock(return_value=True) + self.supports_microversion_mock.side_effect = ( + lambda _, v: api_versions.APIVersion(v) + <= api_versions.APIVersion(mock_v) + ) + def test_volume_revert_to_snapshot_pre_340(self): arglist = [ self.mock_snapshot.id, @@ -157,9 +175,7 @@ class TestVolumeRevertToSnapshot(volume_fakes.TestVolume): ) def test_volume_revert_to_snapshot(self): - self.app.client_manager.volume.api_version = api_versions.APIVersion( - '3.40' - ) + self._set_mock_microversion('3.40') arglist = [ self.mock_snapshot.id, ] @@ -168,14 +184,22 @@ class TestVolumeRevertToSnapshot(volume_fakes.TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - find_mock_result = [self.mock_snapshot, self.mock_volume] with mock.patch.object( - utils, 'find_resource', side_effect=find_mock_result - ) as find_mock: + self.sdk_client, 'find_volume', return_value=self.mock_volume + ), mock.patch.object( + self.sdk_client, 'find_snapshot', return_value=self.mock_snapshot + ): self.cmd.take_action(parsed_args) - self.volumes_mock.revert_to_snapshot.assert_called_once_with( - volume=self.mock_volume, - snapshot=self.mock_snapshot, + self.sdk_client.revert_volume_to_snapshot.assert_called_once_with( + self.mock_volume, + self.mock_snapshot, + ) + self.sdk_client.find_volume.assert_called_with( + self.mock_volume.id, + ignore_missing=False, + ) + self.sdk_client.find_snapshot.assert_called_with( + self.mock_snapshot.id, + ignore_missing=False, ) - self.assertEqual(2, find_mock.call_count) diff --git a/openstackclient/volume/v3/volume.py b/openstackclient/volume/v3/volume.py index f02053f0..0f2d3c1d 100644 --- a/openstackclient/volume/v3/volume.py +++ b/openstackclient/volume/v3/volume.py @@ -17,6 +17,7 @@ import logging from cinderclient import api_versions +from openstack import utils as sdk_utils from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions @@ -96,20 +97,22 @@ class VolumeRevertToSnapshot(command.Command): return parser def take_action(self, parsed_args): - volume_client = self.app.client_manager.volume + volume_client = self.app.client_manager.sdk_connection.volume - if volume_client.api_version < api_versions.APIVersion('3.40'): + if not sdk_utils.supports_microversion(volume_client, '3.40'): msg = _( "--os-volume-api-version 3.40 or greater is required to " "support the 'volume revert snapshot' command" ) raise exceptions.CommandError(msg) - snapshot = utils.find_resource( - volume_client.volume_snapshots, parsed_args.snapshot + snapshot = volume_client.find_snapshot( + parsed_args.snapshot, + ignore_missing=False, ) - volume = utils.find_resource(volume_client.volumes, snapshot.volume_id) - - volume_client.volumes.revert_to_snapshot( - volume=volume, snapshot=snapshot + volume = volume_client.find_volume( + snapshot.volume_id, + ignore_missing=False, ) + + volume_client.revert_volume_to_snapshot(volume, snapshot) diff --git a/releasenotes/notes/migrate-volume-revert-to-sdk-1e399853d80ba5f8.yaml b/releasenotes/notes/migrate-volume-revert-to-sdk-1e399853d80ba5f8.yaml new file mode 100644 index 00000000..30f12e80 --- /dev/null +++ b/releasenotes/notes/migrate-volume-revert-to-sdk-1e399853d80ba5f8.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + The ``volume revert`` command has been migrated to SDK. -- cgit v1.2.1