Merge "Fix for unmanage and manage snapshot"
diff --git a/releasenotes/notes/add-manage-snapshot-ref-config-option-67efd04897335b67.yaml b/releasenotes/notes/add-manage-snapshot-ref-config-option-67efd04897335b67.yaml
new file mode 100644
index 0000000..bc7bcc8
--- /dev/null
+++ b/releasenotes/notes/add-manage-snapshot-ref-config-option-67efd04897335b67.yaml
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    A new config option 'manage_snapshot_ref' is added in the volume section,
+    to specify snapshot ref parameter for different storage backend drivers
+    when managing an existing snapshot. By default it is set to fit the LVM
+    driver.
diff --git a/tempest/api/volume/admin/test_snapshot_manage.py b/tempest/api/volume/admin/test_snapshot_manage.py
index 9f96194..6c09042 100644
--- a/tempest/api/volume/admin/test_snapshot_manage.py
+++ b/tempest/api/volume/admin/test_snapshot_manage.py
@@ -13,8 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import testtools
-
 from tempest.api.volume import base
 from tempest.common import waiters
 from tempest import config
@@ -32,9 +30,18 @@
      managed by Cinder from a storage back end to Cinder
     """
 
+    @classmethod
+    def skip_checks(cls):
+        super(SnapshotManageAdminTest, cls).skip_checks()
+
+        if not CONF.volume_feature_enabled.manage_snapshot:
+            raise cls.skipException("Manage snapshot tests are disabled")
+
+        if len(CONF.volume.manage_snapshot_ref) != 2:
+            raise cls.skipException("Manage snapshot ref is not correctly "
+                                    "configured")
+
     @decorators.idempotent_id('0132f42d-0147-4b45-8501-cc504bbf7810')
-    @testtools.skipUnless(CONF.volume_feature_enabled.manage_snapshot,
-                          "Manage snapshot tests are disabled")
     def test_unmanage_manage_snapshot(self):
         # Create a volume
         volume = self.create_volume()
@@ -48,15 +55,13 @@
         self.admin_snapshots_client.unmanage_snapshot(snapshot['id'])
         self.admin_snapshots_client.wait_for_resource_deletion(snapshot['id'])
 
-        # Fetch snapshot ids
-        snapshot_list = [
-            snap['id'] for snap in
-            self.snapshots_client.list_snapshots()['snapshots']
-        ]
+        # Verify the original snapshot does not exist in snapshot list
+        params = {'all_tenants': 1}
+        all_snapshots = self.admin_snapshots_client.list_snapshots(
+            detail=True, params=params)['snapshots']
+        self.assertNotIn(snapshot['id'], [v['id'] for v in all_snapshots])
 
-        # Verify snapshot does not exist in snapshot list
-        self.assertNotIn(snapshot['id'], snapshot_list)
-
+        # Manage the snapshot
         name = data_utils.rand_name(self.__class__.__name__ +
                                     '-Managed-Snapshot')
         description = data_utils.rand_name(self.__class__.__name__ +
@@ -64,12 +69,16 @@
         metadata = {"manage-snap-meta1": "value1",
                     "manage-snap-meta2": "value2",
                     "manage-snap-meta3": "value3"}
-
-        # Manage the snapshot
-        snapshot_ref = '_snapshot-%s' % snapshot['id']
+        snapshot_ref = {
+            'volume_id': volume['id'],
+            'ref': {CONF.volume.manage_snapshot_ref[0]:
+                    CONF.volume.manage_snapshot_ref[1] % snapshot['id']},
+            'name': name,
+            'description': description,
+            'metadata': metadata
+        }
         new_snapshot = self.admin_snapshot_manage_client.manage_snapshot(
-            volume_id=volume['id'], ref={'source-name': snapshot_ref},
-            name=name, description=description, metadata=metadata)['snapshot']
+            **snapshot_ref)['snapshot']
         self.addCleanup(self.delete_snapshot, new_snapshot['id'],
                         self.admin_snapshots_client)
 
@@ -80,9 +89,8 @@
 
         # Verify the managed snapshot has the expected parent volume
         # and the expected field values.
-        new_snap_info = self.admin_snapshots_client.show_snapshot(
+        new_snapshot_info = self.admin_snapshots_client.show_snapshot(
             new_snapshot['id'])['snapshot']
-        self.assertEqual(volume['id'], new_snap_info['volume_id'])
-        self.assertEqual(name, new_snap_info['name'])
-        self.assertEqual(description, new_snap_info['description'])
-        self.assertEqual(metadata, new_snap_info['metadata'])
+        self.assertEqual(snapshot['size'], new_snapshot_info['size'])
+        for key in ['volume_id', 'name', 'description', 'metadata']:
+            self.assertEqual(snapshot_ref[key], new_snapshot_info[key])
diff --git a/tempest/config.py b/tempest/config.py
index 989d53a..fbe0a1b 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -768,6 +768,12 @@
                      "It contains two elements, the first is ref type "
                      "(like 'source-name', 'source-id', etc), the second is "
                      "volume name template used in storage backend"),
+    cfg.ListOpt('manage_snapshot_ref',
+                default=['source-name', '_snapshot-%s'],
+                help="A reference to existing snapshot for snapshot manage. "
+                     "It contains two elements, the first is ref type "
+                     "(like 'source-name', 'source-id', etc), the second is "
+                     "snapshot name template used in storage backend"),
     cfg.StrOpt('min_microversion',
                default=None,
                help="Lower version of the test target microversion range. "