diff --git a/cinder/tests/unit/volume/drivers/dell_emc/vnx/mocked_cinder.yaml b/cinder/tests/unit/volume/drivers/dell_emc/vnx/mocked_cinder.yaml index d633db12e54..d8cc606ee5e 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/vnx/mocked_cinder.yaml +++ b/cinder/tests/unit/volume/drivers/dell_emc/vnx/mocked_cinder.yaml @@ -207,6 +207,10 @@ test_create_snapshot_adapter: test_delete_snapshot_adapter: snapshot: *snapshot_base +test_restore_snapshot_adapter: + volume: *volume_base + snapshot: *snapshot_base + test_do_create_cgsnap: &cg_snap_and_snaps cg_snap: *cg_snapshot_base snap1: *snapshot_base diff --git a/cinder/tests/unit/volume/drivers/dell_emc/vnx/mocked_vnx.yaml b/cinder/tests/unit/volume/drivers/dell_emc/vnx/mocked_vnx.yaml index 9f7b78f0f53..5b97679d6aa 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/vnx/mocked_vnx.yaml +++ b/cinder/tests/unit/volume/drivers/dell_emc/vnx/mocked_vnx.yaml @@ -696,6 +696,15 @@ test_modify_snapshot: _methods: get_snap: *snap_modify +test_restore_snapshot: &test_restore_snapshot + lun: &lun_restore + _methods: + restore_snap: + + vnx: + _methods: + get_lun: *lun_restore + test_create_cg_snapshot: &test_create_cg_snapshot cg_snap: &cg_snap_exist _properties: @@ -1614,6 +1623,8 @@ test_create_snapshot_adapter: *test_create_snapshot test_delete_snapshot_adapter: *test_delete_snapshot +test_restore_snapshot_adapter: *test_restore_snapshot + test_create_cgsnapshot: *test_create_cg_snapshot test_do_create_cgsnap: *test_create_cg_snapshot diff --git a/cinder/tests/unit/volume/drivers/dell_emc/vnx/test_adapter.py b/cinder/tests/unit/volume/drivers/dell_emc/vnx/test_adapter.py index b801dfd570e..beaee2292af 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/vnx/test_adapter.py +++ b/cinder/tests/unit/volume/drivers/dell_emc/vnx/test_adapter.py @@ -619,6 +619,13 @@ class TestCommonAdapter(test.TestCase): mocked_input): common_adapter.delete_snapshot(mocked_input['snapshot']) + @res_mock.mock_driver_input + @res_mock.patch_common_adapter + def test_restore_snapshot_adapter(self, common_adapter, _ignore, + mocked_input): + common_adapter.restore_snapshot(mocked_input['volume'], + mocked_input['snapshot']) + @res_mock.patch_common_adapter def test_create_cgsnapshot(self, common_adapter, _): common_adapter.do_create_cgsnap = mock.Mock( diff --git a/cinder/tests/unit/volume/drivers/dell_emc/vnx/test_client.py b/cinder/tests/unit/volume/drivers/dell_emc/vnx/test_client.py index f4ac7322ae0..c76b1f2d8ec 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/vnx/test_client.py +++ b/cinder/tests/unit/volume/drivers/dell_emc/vnx/test_client.py @@ -309,6 +309,10 @@ class TestClient(test.TestCase): def test_modify_snapshot(self, client, mocked): client.modify_snapshot('snap_name', True, True) + @res_mock.patch_client + def test_restore_snapshot(self, client, mocked): + client.restore_snapshot('lun-id', 'snap_name') + @res_mock.patch_client def test_create_cg_snapshot(self, client, mocked): snap = client.create_cg_snapshot('cg_snap_name', 'cg_name') diff --git a/cinder/volume/drivers/dell_emc/vnx/adapter.py b/cinder/volume/drivers/dell_emc/vnx/adapter.py index 8b6ce6f7f46..bcd85f656d9 100644 --- a/cinder/volume/drivers/dell_emc/vnx/adapter.py +++ b/cinder/volume/drivers/dell_emc/vnx/adapter.py @@ -811,6 +811,11 @@ class CommonAdapter(replication.ReplicationAdapter): """Deletes a snapshot.""" self.client.delete_snapshot(snapshot.name) + def restore_snapshot(self, volume, snapshot): + """Restores a snapshot.""" + lun_id = self.client.get_lun_id(volume) + self.client.restore_snapshot(lun_id, snapshot.name) + def _get_referenced_lun(self, existing_ref): lun = None if 'source-id' in existing_ref: diff --git a/cinder/volume/drivers/dell_emc/vnx/client.py b/cinder/volume/drivers/dell_emc/vnx/client.py index 072bc9ece9f..d1c3dbbfce1 100644 --- a/cinder/volume/drivers/dell_emc/vnx/client.py +++ b/cinder/volume/drivers/dell_emc/vnx/client.py @@ -337,6 +337,10 @@ class Client(object): snap.modify(allow_rw=allow_rw, auto_delete=auto_delete, keep_for=None) + def restore_snapshot(self, lun_id, snap_name): + lun = self.get_lun(lun_id=lun_id) + lun.restore_snap(snap_name) + def create_consistency_group(self, cg_name, lun_id_list=None): try: cg = self.vnx.create_cg(name=cg_name, members=lun_id_list) diff --git a/cinder/volume/drivers/dell_emc/vnx/driver.py b/cinder/volume/drivers/dell_emc/vnx/driver.py index 9c4d02bf8cc..b3442848ca9 100644 --- a/cinder/volume/drivers/dell_emc/vnx/driver.py +++ b/cinder/volume/drivers/dell_emc/vnx/driver.py @@ -77,9 +77,10 @@ class VNXDriver(driver.ManageableVD, 10.1.0 - Add QoS support 10.2.0 - Add replication group support 11.0.0 - Fix failure of migration during cloning + 12.0.0 - Add `volume revert to snapshot` support """ - VERSION = '11.00.00' + VERSION = '12.00.00' VENDOR = 'Dell EMC' # ThirdPartySystems wiki page CI_WIKI_NAME = "EMC_VNX_CI" @@ -141,6 +142,10 @@ class VNXDriver(driver.ManageableVD, """Deletes a snapshot.""" self.adapter.delete_snapshot(snapshot) + def revert_to_snapshot(self, context, volume, snapshot): + """Reverts a volume to a snapshot""" + self.adapter.restore_snapshot(volume, snapshot) + def ensure_export(self, context, volume): """Driver entry point to get the export info for an existing volume.""" pass diff --git a/doc/source/configuration/block-storage/drivers/dell-emc-vnx-driver.rst b/doc/source/configuration/block-storage/drivers/dell-emc-vnx-driver.rst index afcb6fcbcb3..14dc8c05c76 100644 --- a/doc/source/configuration/block-storage/drivers/dell-emc-vnx-driver.rst +++ b/doc/source/configuration/block-storage/drivers/dell-emc-vnx-driver.rst @@ -39,6 +39,7 @@ Supported operations - Create a consistency group from consistency group snapshots. - Replication v2.1 support. - Generic Group support. +- Revert a volume to a snapshot. Preparation ~~~~~~~~~~~ diff --git a/driver-requirements.txt b/driver-requirements.txt index f004c3de993..0c7fdcc27a5 100644 --- a/driver-requirements.txt +++ b/driver-requirements.txt @@ -32,7 +32,7 @@ rados # LGPLv2.1 rbd # LGPLv2.1 # Dell EMC VNX -storops>=0.4.8 # Apache-2.0 +storops>=0.5.7 # Apache-2.0 # Violin vmemclient>=1.1.8 # Apache-2.0 diff --git a/releasenotes/notes/vnx-revert-to-snapshot-e5494b6fb5ad5a1e.yaml b/releasenotes/notes/vnx-revert-to-snapshot-e5494b6fb5ad5a1e.yaml new file mode 100644 index 00000000000..f67ab1a7857 --- /dev/null +++ b/releasenotes/notes/vnx-revert-to-snapshot-e5494b6fb5ad5a1e.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Added support to revert a volume to a snapshot with the Dell EMC VNX + driver.