Merge "Remove experimental flag from share replication feature"
diff --git a/manila_tempest_tests/common/remote_client.py b/manila_tempest_tests/common/remote_client.py
index 45f85d8..9970b0b 100644
--- a/manila_tempest_tests/common/remote_client.py
+++ b/manila_tempest_tests/common/remote_client.py
@@ -10,15 +10,14 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import six
 import sys
 
 from oslo_log import log
-
+import six
 from tempest import config
 from tempest.lib.common import ssh
 from tempest.lib.common.utils import test_utils
-import tempest.lib.exceptions
+from tempest.lib import exceptions
 
 CONF = config.CONF
 
@@ -30,7 +29,7 @@
     def wrapper(self, *args, **kwargs):
         try:
             return function(self, *args, **kwargs)
-        except tempest.lib.exceptions.SSHTimeout:
+        except exceptions.SSHTimeout:
             try:
                 original_exception = sys.exc_info()
                 caller = test_utils.find_test_caller() or "not found"
diff --git a/manila_tempest_tests/config.py b/manila_tempest_tests/config.py
index 7f2be76..2b6cfd4 100644
--- a/manila_tempest_tests/config.py
+++ b/manila_tempest_tests/config.py
@@ -290,5 +290,11 @@
                help="Default size in GB for shares created by share tests."),
     cfg.BoolOpt("run_ipv6_tests",
                 default=False,
-                help="Enable or disable running IPv6 tests."),
+                help="Enable or disable running IPv6 NFS scenario tests. "
+                     "These tests validate that IPv6 export locations work, "
+                     "and that access can be provided to IPv6 clients. When "
+                     "you do not specify a storage_network, the tests will "
+                     "attempt to create an IPv6 subnet on the project network "
+                     "they create for ping and SSH to the client test VM "
+                     "where data path testing is performed."),
 ]
diff --git a/manila_tempest_tests/services/share/json/shares_client.py b/manila_tempest_tests/services/share/json/shares_client.py
index 150c1e0..87d7e47 100644
--- a/manila_tempest_tests/services/share/json/shares_client.py
+++ b/manila_tempest_tests/services/share/json/shares_client.py
@@ -18,7 +18,6 @@
 
 import six
 from six.moves.urllib import parse as urlparse
-
 from tempest import config
 from tempest.lib.common import rest_client
 from tempest.lib.common.utils import data_utils
@@ -26,6 +25,7 @@
 
 from manila_tempest_tests import share_exceptions
 
+
 CONF = config.CONF
 
 
diff --git a/manila_tempest_tests/services/share/v2/json/shares_client.py b/manila_tempest_tests/services/share/v2/json/shares_client.py
index 502ba82..050642b 100644
--- a/manila_tempest_tests/services/share/v2/json/shares_client.py
+++ b/manila_tempest_tests/services/share/v2/json/shares_client.py
@@ -15,9 +15,9 @@
 
 import json
 import re
-import six
 import time
 
+import six
 from six.moves.urllib import parse
 from tempest import config
 from tempest.lib.common.utils import data_utils
diff --git a/manila_tempest_tests/tests/api/admin/test_admin_actions.py b/manila_tempest_tests/tests/api/admin/test_admin_actions.py
index c6e21d7..57b97e3 100644
--- a/manila_tempest_tests/tests/api/admin/test_admin_actions.py
+++ b/manila_tempest_tests/tests/api/admin/test_admin_actions.py
@@ -14,11 +14,12 @@
 #    under the License.
 
 import ddt
+from tempest import config
+from tempest.lib import decorators
 import testtools
+from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
-from tempest import config
-from testtools import testcase as tc
 
 CONF = config.CONF
 
@@ -48,6 +49,7 @@
             resource_id, s_type=resource_type, status="available")
         self._wait_for_resource_status(resource_id, resource_type[:-1])
 
+    @decorators.idempotent_id('4f8c6ae9-0656-445f-a911-fbf98fe761d0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data("error", "available", "error_deleting", "deleting", "creating")
     def test_reset_share_state(self, status):
@@ -55,6 +57,7 @@
         self.shares_v2_client.wait_for_share_status(self.sh["id"], status)
         self.addCleanup(self._reset_resource_available, self.sh["id"])
 
+    @decorators.idempotent_id('13075b2d-fe83-41bf-b6ef-99cfcc00257d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data("error", "available", "error_deleting", "deleting", "creating")
     def test_reset_share_instance_state(self, status):
@@ -68,6 +71,7 @@
         self.addCleanup(self._reset_resource_available,
                         share_instance_id, "share_instances")
 
+    @decorators.idempotent_id('3e16d990-fa19-45e9-893f-e0b7a90127bd')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -81,6 +85,7 @@
         self.addCleanup(self._reset_resource_available,
                         snapshot["id"], "snapshots")
 
+    @decorators.idempotent_id('2e8fee75-6b7f-4b69-8f68-0646ce6a96e9')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_force_delete_share(self):
         share = self.create_share(share_type_id=self.share_type_id)
@@ -96,6 +101,7 @@
         self.shares_v2_client.force_delete(share["id"])
         self.shares_v2_client.wait_for_resource_deletion(share_id=share["id"])
 
+    @decorators.idempotent_id('382fca90-746e-4ad1-a509-b82a643d4a03')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_force_delete_share_instance(self):
         share = self.create_share(share_type_id=self.share_type_id,
@@ -120,6 +126,7 @@
         self.shares_v2_client.wait_for_resource_deletion(
             share_instance_id=instance["id"])
 
+    @decorators.idempotent_id('d5a48182-ecd7-463e-a31a-148c81d3c5ed')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -138,6 +145,7 @@
         self.shares_v2_client.force_delete(sn["id"], s_type="snapshots")
         self.shares_v2_client.wait_for_resource_deletion(snapshot_id=sn["id"])
 
+    @decorators.idempotent_id('49a576eb-733a-4299-aa6f-918fe7c67a6a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.22")
     def test_reset_share_task_state(self):
diff --git a/manila_tempest_tests/tests/api/admin/test_admin_actions_negative.py b/manila_tempest_tests/tests/api/admin/test_admin_actions_negative.py
index c74bd4e..dd64af5 100644
--- a/manila_tempest_tests/tests/api/admin/test_admin_actions_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_admin_actions_negative.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -44,12 +45,14 @@
             cls.sn = cls.create_snapshot_wait_for_active(
                 cls.sh["id"], client=cls.admin_client)
 
+    @decorators.idempotent_id('f730c395-a501-44cf-90d9-a3273771b895')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_reset_share_state_to_unacceptable_state(self):
         self.assertRaises(lib_exc.BadRequest,
                           self.admin_client.reset_state,
                           self.sh["id"], status="fake")
 
+    @decorators.idempotent_id('3bfa9555-9c7e-45a2-b5bd-384329cb6fda')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_reset_share_instance_state_to_unacceptable_state(self):
         self.assertRaises(
@@ -60,6 +63,7 @@
             status="fake"
         )
 
+    @decorators.idempotent_id('02e0d0d5-ac66-4d24-9aa7-568f75944a05')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -68,6 +72,7 @@
                           self.admin_client.reset_state,
                           self.sn["id"], s_type="snapshots", status="fake")
 
+    @decorators.idempotent_id('3b525c29-b657-493f-aa41-b17676a95fd2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_reset_share_state_with_member(self):
         # Even if member from another tenant, it should be unauthorized
@@ -75,6 +80,7 @@
                           self.member_client.reset_state,
                           self.sh["id"])
 
+    @decorators.idempotent_id('d4abddba-1c20-49e1-85b1-5452f0faceb0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_reset_share_instance_state_with_member(self):
         # Even if member from another tenant, it should be unauthorized
@@ -82,6 +88,7 @@
                           self.member_client.reset_state,
                           self.sh_instance["id"], s_type="share_instances")
 
+    @decorators.idempotent_id('48dfb1ec-6db6-4022-8a41-2eb2883e0988')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -91,6 +98,7 @@
                           self.member_client.reset_state,
                           self.sn["id"], s_type="snapshots")
 
+    @decorators.idempotent_id('7cd0b48e-2815-4f8c-8718-3c071ff9701f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_force_delete_share_with_member(self):
         # If a non-admin tries to do force_delete, it should be unauthorized
@@ -98,6 +106,7 @@
                           self.member_client.force_delete,
                           self.sh["id"])
 
+    @decorators.idempotent_id('257da3e0-9460-4d97-8a56-c86c0427cc64')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_force_delete_share_instance_with_member(self):
         # If a non-admin tries to do force_delete, it should be unauthorized
@@ -105,6 +114,7 @@
                           self.member_client.force_delete,
                           self.sh_instance["id"], s_type="share_instances")
 
+    @decorators.idempotent_id('c9a1894f-d58f-4885-86ba-736e9ab8428a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -114,6 +124,7 @@
                           self.member_client.force_delete,
                           self.sn["id"], s_type="snapshots")
 
+    @decorators.idempotent_id('821da7c8-3501-44ba-9ffe-45f485a6e573')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_get_share_instance_with_member(self):
         # If a non-admin tries to get instance, it should be unauthorized
@@ -121,6 +132,7 @@
                           self.member_client.get_share_instance,
                           self.sh_instance["id"])
 
+    @decorators.idempotent_id('ab361521-adc9-4fe3-9699-a5ccc49b579b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_get_instances_of_share_with_member(self):
         # If a non-admin tries to list instances of given share, it should be
@@ -129,6 +141,7 @@
                           self.member_client.get_instances_of_share,
                           self.sh['id'])
 
+    @decorators.idempotent_id('d662457c-2b84-4f13-aee7-5ffafe2552f1')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.22")
     def test_reset_task_state_invalid_state(self):
@@ -146,12 +159,14 @@
         cls.admin_client = cls.admin_shares_v2_client
         cls.member_client = cls.shares_v2_client
 
+    @decorators.idempotent_id('1c928920-1538-400a-ab28-c58dd75503c3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_share_instance_with_member(self):
         # If a non-admin tries to list instances, it should be unauthorized
         self.assertRaises(lib_exc.Forbidden,
                           self.member_client.list_share_instances)
 
+    @decorators.idempotent_id('aba8638c-bfed-4c3e-994b-5309fcd912b2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.22")
     def test_reset_task_state_share_not_found(self):
@@ -159,6 +174,7 @@
             lib_exc.NotFound, self.admin_client.reset_task_state,
             'fake_share', 'migration_error')
 
+    @decorators.idempotent_id('e31d2d7b-7202-4699-9423-72f710e72181')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -168,11 +184,13 @@
                           "fake",
                           s_type="snapshots")
 
+    @decorators.idempotent_id('dedca5c1-151d-40f7-bb7f-8913d51c05a9')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_force_delete_nonexistent_share(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_client.force_delete, "fake")
 
+    @decorators.idempotent_id('7cbfc035-12ea-4e2c-8da1-baf261e45f03')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_force_delete_nonexistent_share_instance(self):
         self.assertRaises(lib_exc.NotFound,
@@ -180,16 +198,19 @@
                           "fake",
                           s_type="share_instances")
 
+    @decorators.idempotent_id('17e7eb3c-dbe6-4667-b838-663211365d44')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_reset_nonexistent_share_state(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_client.reset_state, "fake")
 
+    @decorators.idempotent_id('26ce6f02-98eb-435a-9065-2e5bbcac87c5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_reset_nonexistent_share_instance_state(self):
         self.assertRaises(lib_exc.NotFound, self.admin_client.reset_state,
                           "fake", s_type="share_instances")
 
+    @decorators.idempotent_id('7e07f684-b68f-4b0e-89cc-05d70a67dd69')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -197,6 +218,7 @@
         self.assertRaises(lib_exc.NotFound, self.admin_client.reset_state,
                           "fake", s_type="snapshots")
 
+    @decorators.idempotent_id('59b09ad2-d405-4762-a253-d7b7cf56f0a5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data('migrate_share', 'migration_complete', 'reset_task_state',
               'migration_get_progress', 'migration_cancel')
diff --git a/manila_tempest_tests/tests/api/admin/test_export_locations.py b/manila_tempest_tests/tests/api/admin/test_export_locations.py
index 96a0d9d..dc1e2fa 100644
--- a/manila_tempest_tests/tests/api/admin/test_export_locations.py
+++ b/manila_tempest_tests/tests/api/admin/test_export_locations.py
@@ -18,6 +18,7 @@
 from oslo_utils import uuidutils
 import six
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -109,6 +110,7 @@
                     # it making assertion that it has proper date value.
                     timeutils.parse_strtime(time)
 
+    @decorators.idempotent_id('dfcb05af-369a-44c9-a06a-67d12a2a0917')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.13')
     def test_list_share_export_locations(self):
@@ -118,6 +120,7 @@
         self._verify_export_location_structure(export_locations,
                                                version='2.13')
 
+    @decorators.idempotent_id('032173d7-3ddf-4730-8524-d1a96a2a9e16')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.14')
     def test_list_share_export_locations_with_preferred_flag(self):
@@ -127,6 +130,7 @@
         self._verify_export_location_structure(export_locations,
                                                version='2.14')
 
+    @decorators.idempotent_id('814da2ce-2909-4b02-a92e-12bc1b640580')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_export_location(self):
         export_locations = self.admin_client.list_share_export_locations(
@@ -137,6 +141,7 @@
                 self.share['id'], export_location['id'])
             self._verify_export_location_structure(el, format='detail')
 
+    @decorators.idempotent_id('397969c6-7fc8-4bf8-86c7-300b96857c54')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_export_locations_by_member(self):
         export_locations = self.member_client.list_share_export_locations(
@@ -144,6 +149,7 @@
 
         self._verify_export_location_structure(export_locations, role='member')
 
+    @decorators.idempotent_id('66cef86f-5da8-4cb4-bc21-91f6c1e27cb5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_export_location_by_member(self):
         export_locations = self.admin_client.list_share_export_locations(
@@ -157,6 +163,7 @@
             self._verify_export_location_structure(el, role='member',
                                                    format='detail')
 
+    @decorators.idempotent_id('06ea2636-1c9f-4889-8b5f-e10c2c2572cb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.13')
     def test_list_share_instance_export_locations(self):
@@ -167,6 +174,7 @@
             self._verify_export_location_structure(export_locations,
                                                    version='2.13')
 
+    @decorators.idempotent_id('b93e4cba-ea98-4b1c-90f8-e0a8763033a3')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.14')
     def test_list_share_instance_export_locations_with_preferred_flag(self):
@@ -177,6 +185,7 @@
             self._verify_export_location_structure(export_locations,
                                                    version='2.14')
 
+    @decorators.idempotent_id('59421c43-293f-41fd-8ac6-e856deeceac9')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_instance_export_location(self):
         for share_instance in self.share_instances:
@@ -188,6 +197,7 @@
                     share_instance['id'], el['id'])
                 self._verify_export_location_structure(el, format='detail')
 
+    @decorators.idempotent_id('581acd8d-b89d-4684-8310-b910b46acc7a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_share_contains_all_export_locations_of_all_share_instances(self):
         share_export_locations = self.admin_client.list_share_export_locations(
diff --git a/manila_tempest_tests/tests/api/admin/test_export_locations_negative.py b/manila_tempest_tests/tests/api/admin/test_export_locations_negative.py
index ef4f80b..065013d 100644
--- a/manila_tempest_tests/tests/api/admin/test_export_locations_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_export_locations_negative.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -49,6 +50,7 @@
         cls.share_instances = cls.admin_client.get_instances_of_share(
             cls.share['id'])
 
+    @decorators.idempotent_id('8eac1355-f272-4913-8a49-1a8a9cb086bd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_inexistent_share_export_location(self):
         self.assertRaises(
@@ -58,6 +60,7 @@
             "fake-inexistent-share-instance-id",
         )
 
+    @decorators.idempotent_id('064a18dd-1a00-42f1-84c0-5a3e3b46fb39')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_inexistent_share_instance_export_location(self):
         for share_instance in self.share_instances:
@@ -68,6 +71,7 @@
                 "fake-inexistent-share-instance-id",
             )
 
+    @decorators.idempotent_id('6d0b9d1b-fc87-4b7f-add5-919b0ddcda90')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_instance_export_locations_as_member(self):
         for share_instance in self.share_instances:
@@ -76,6 +80,7 @@
                 self.admin_member_client.list_share_instance_export_locations,
                 share_instance['id'])
 
+    @decorators.idempotent_id('abde4357-a26c-4adb-88a6-ece6b0e15b5e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_instance_export_locations_as_member(self):
         for share_instance in self.share_instances:
@@ -88,6 +93,7 @@
                                    get_share_instance_export_location),
                                   share_instance['id'], el['id'])
 
+    @decorators.idempotent_id('a3c3d16b-5f62-4089-8f86-efc660592986')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_export_locations_by_different_project_user(self):
         self.assertRaises(
@@ -95,6 +101,7 @@
             self.different_project_client.list_share_export_locations,
             self.share['id'])
 
+    @decorators.idempotent_id('0f6823a5-3929-4025-9cd4-b5198b4384dd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_export_location_by_different_project_user(self):
         export_locations = self.admin_client.list_share_export_locations(
@@ -115,6 +122,7 @@
         super(ExportLocationsAPIOnlyNegativeTest, cls).skip_checks()
         utils.check_skip_if_microversion_lt("2.9")
 
+    @decorators.idempotent_id('4b5b4e89-0c80-4383-b272-62d5e0419d9a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_export_locations_by_nonexistent_share(self):
         self.assertRaises(
@@ -123,6 +131,7 @@
             "fake-inexistent-share-id",
         )
 
+    @decorators.idempotent_id('21ba5111-91a8-4ec3-86dc-689fc2fa90e6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_export_locations_by_nonexistent_share_instance(self):
         self.assertRaises(
diff --git a/manila_tempest_tests/tests/api/admin/test_migration.py b/manila_tempest_tests/tests/api/admin/test_migration.py
index d1f7c54..25e7213 100644
--- a/manila_tempest_tests/tests/api/admin/test_migration.py
+++ b/manila_tempest_tests/tests/api/admin/test_migration.py
@@ -17,6 +17,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -361,6 +362,7 @@
 class MigrationCancelNFSTest(MigrationBase):
     protocol = "nfs"
 
+    @decorators.idempotent_id('d39dfa1b-6e91-4efc-84f1-76f878b51f2a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @ddt.data(True, False)
@@ -398,6 +400,7 @@
             dest_pool, share, constants.TASK_STATE_MIGRATION_CANCELLED,
             complete=False)
 
+    @decorators.idempotent_id('640dce56-2084-488d-8dea-456840ff397e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @testtools.skipUnless(
@@ -433,6 +436,7 @@
 class MigrationOppositeDriverModesNFSTest(MigrationBase):
     protocol = "nfs"
 
+    @decorators.idempotent_id('d8cce50d-e8da-4fbc-8f94-0827bf277b6c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @ddt.data(True, False)
@@ -500,6 +504,7 @@
 class MigrationTwoPhaseNFSTest(MigrationBase):
     protocol = "nfs"
 
+    @decorators.idempotent_id('e6cf0e4d-bdf3-49c1-b6ba-56d1ad6c81d2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @ddt.data(True, False)
@@ -551,6 +556,7 @@
 class MigrationWithShareExtendingNFSTest(MigrationBase):
     protocol = "nfs"
 
+    @decorators.idempotent_id('0e3d75e0-385a-4f7a-889f-2a3db79db8c2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @testtools.skipUnless(
@@ -564,6 +570,7 @@
 class MigrationWithShareShrinkingNFSTest(MigrationBase):
     protocol = "nfs"
 
+    @decorators.idempotent_id('58c72e51-d217-48bc-8155-5a010912312e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @testtools.skipUnless(
@@ -577,6 +584,7 @@
 class MigrationOfShareWithSnapshotNFSTest(MigrationBase):
     protocol = "nfs"
 
+    @decorators.idempotent_id('a95eb701-626a-4175-967b-4880d3716857')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @testtools.skipUnless(
@@ -618,6 +626,7 @@
 class MigrationWithDifferentSnapshotSupportNFSTest(MigrationBase):
     protocol = "nfs"
 
+    @decorators.idempotent_id('a18b3637-2070-4a1b-acd9-c392eb7963b5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
@@ -630,6 +639,7 @@
         self._validate_share_migration_with_different_snapshot_capability_type(
             force_host_assisted, True)
 
+    @decorators.idempotent_id('59313673-6576-4163-ab96-41bafcdad63a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
diff --git a/manila_tempest_tests/tests/api/admin/test_migration_negative.py b/manila_tempest_tests/tests/api/admin/test_migration_negative.py
index e8a22b6..12e3fb0 100644
--- a/manila_tempest_tests/tests/api/admin/test_migration_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_migration_negative.py
@@ -17,6 +17,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -79,6 +80,7 @@
             cleanup_in_class=True,
             extra_specs=utils.get_configured_extra_specs(variation='invalid'))
 
+    @decorators.idempotent_id('8aa1f2a0-bc44-4df5-a556-161590e594a3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.22")
     def test_migration_cancel_invalid(self):
@@ -86,6 +88,7 @@
             lib_exc.BadRequest, self.shares_v2_client.migration_cancel,
             self.share['id'])
 
+    @decorators.idempotent_id('6d0dfb2e-51a0-4cb7-8c69-6135a49c6057')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.22")
     def test_migration_get_progress_None(self):
@@ -96,6 +99,7 @@
             lib_exc.BadRequest, self.shares_v2_client.migration_get_progress,
             self.share['id'])
 
+    @decorators.idempotent_id('2ab1fc82-bc13-4c99-8324-c6b23530e8a4')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.22")
     def test_migration_complete_invalid(self):
@@ -103,6 +107,7 @@
             lib_exc.BadRequest, self.shares_v2_client.migration_complete,
             self.share['id'])
 
+    @decorators.idempotent_id('8ef562b4-7704-4a78-973f-9bf8d2b6f6a6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.22")
     def test_migration_cancel_not_found(self):
@@ -110,6 +115,7 @@
             lib_exc.NotFound, self.shares_v2_client.migration_cancel,
             'invalid_share_id')
 
+    @decorators.idempotent_id('044c792b-63e0-42c3-9f44-dc2280e2af08')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.22")
     def test_migration_get_progress_not_found(self):
@@ -117,6 +123,7 @@
             lib_exc.NotFound, self.shares_v2_client.migration_get_progress,
             'invalid_share_id')
 
+    @decorators.idempotent_id('a509871a-3f3a-4618-bb60-9661732dd371')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.22")
     def test_migration_complete_not_found(self):
@@ -124,6 +131,7 @@
             lib_exc.NotFound, self.shares_v2_client.migration_complete,
             'invalid_share_id')
 
+    @decorators.idempotent_id('6276bea6-6939-4569-930f-218d99c0fa56')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
@@ -138,6 +146,7 @@
         self.shares_v2_client.wait_for_resource_deletion(snapshot_id=snap[
             "id"])
 
+    @decorators.idempotent_id('78670c24-c4ee-45b5-b166-2d053c333144')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @ddt.data(True, False)
@@ -155,6 +164,7 @@
         # NOTE(ganso): No need to assert, it is already waiting for correct
         # status (migration_success).
 
+    @decorators.idempotent_id('af17204f-ffab-4ba8-8cb6-032e49216f67')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     def test_migrate_share_host_invalid(self):
@@ -162,6 +172,7 @@
             lib_exc.NotFound, self.shares_v2_client.migrate_share,
             self.share['id'], 'invalid_host')
 
+    @decorators.idempotent_id('0558e9c4-0416-41d2-b28a-803d4b81521a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @ddt.data({'writable': False, 'preserve_metadata': False,
@@ -183,6 +194,7 @@
             preserve_metadata=preserve_metadata, nondisruptive=nondisruptive,
             preserve_snapshots=preserve_snapshots)
 
+    @decorators.idempotent_id('ee57024c-d00e-4def-8eec-cbc62bae327f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     def test_migrate_share_change_type_no_valid_host(self):
@@ -201,6 +213,7 @@
             self.share['id'], self.dest_pool,
             constants.TASK_STATE_MIGRATION_ERROR)
 
+    @decorators.idempotent_id('e2bd0cca-c091-4785-a9dc-7f42d2bb95a5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     def test_migrate_share_not_found(self):
@@ -208,6 +221,7 @@
             lib_exc.NotFound, self.shares_v2_client.migrate_share,
             'invalid_share_id', self.dest_pool)
 
+    @decorators.idempotent_id('86b427a7-27c0-4cd5-8f52-9688b339980b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     def test_migrate_share_not_available(self):
@@ -223,6 +237,7 @@
         self.shares_client.wait_for_share_status(self.share['id'],
                                                  constants.STATUS_AVAILABLE)
 
+    @decorators.idempotent_id('e8f1e491-697a-4941-bf51-4d37f0a93fa5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     def test_migrate_share_invalid_share_network(self):
@@ -231,6 +246,7 @@
             self.share['id'], self.dest_pool,
             new_share_network_id='invalid_net_id')
 
+    @decorators.idempotent_id('be262d44-2ca2-4b9c-be3a-5a6a98ed871b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     def test_migrate_share_invalid_share_type(self):
@@ -239,6 +255,7 @@
             self.share['id'], self.dest_pool,
             new_share_type_id='invalid_type_id')
 
+    @decorators.idempotent_id('16c72693-6f9e-4cb4-a166-c60accd3479b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     def test_migrate_share_opposite_type_share_network_invalid(self):
@@ -264,6 +281,7 @@
             new_share_type_id=new_type_opposite['share_type']['id'],
             new_share_network_id=new_share_network_id)
 
+    @decorators.idempotent_id('1f529b09-e404-4f0e-9423-bb4b117b5522')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.48")
     def test_share_type_azs_share_migrate_unsupported_az(self):
@@ -277,6 +295,7 @@
             self.share['id'], self.dest_pool,
             new_share_type_id=new_share_type['share_type']['id'])
 
+    @decorators.idempotent_id('90cf0ae4-4251-4142-bfa8-41f67a9e5b23')
     @testtools.skipUnless(CONF.share.run_driver_assisted_migration_tests,
                           "Driver-assisted migration tests are disabled.")
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
@@ -284,6 +303,7 @@
     def test_create_snapshot_during_share_migration(self):
         self._test_share_actions_during_share_migration('create_snapshot', [])
 
+    @decorators.idempotent_id('20121039-bb11-45d8-9972-d2daff7a779c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @ddt.data(('extend_share', [CONF.share.share_size + 2]),
@@ -301,6 +321,7 @@
         if not property_to_evaluate[method_name]:
             raise self.skipException(method_name + 'tests are disabled.')
 
+    @decorators.idempotent_id('6e83fc25-4e3e-49a7-93e8-db4e6b355a91')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     def test_add_access_rule_during_migration(self):
diff --git a/manila_tempest_tests/tests/api/admin/test_multi_backend.py b/manila_tempest_tests/tests/api/admin/test_multi_backend.py
index 79c9c19..cfa9baa 100644
--- a/manila_tempest_tests/tests/api/admin/test_multi_backend.py
+++ b/manila_tempest_tests/tests/api/admin/test_multi_backend.py
@@ -15,6 +15,7 @@
 
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -56,6 +57,7 @@
         # Create shares using precreated share types
         cls.shares = cls.create_shares(share_data_list)
 
+    @decorators.idempotent_id('888add9d-4ad0-4d88-a62f-af7ee1d9f9ab')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_share_backend_name_reporting(self):
         # Share's 'host' should be like "hostname@backend_name"
@@ -63,6 +65,7 @@
             get = self.shares_client.get_share(share['id'])
             self.assertEqual(2, len(get["host"].split("@")))
 
+    @decorators.idempotent_id('691fbcef-6d8d-4ad9-b493-501bbb3dcf3c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_share_share_type(self):
         # Share type should be the same as provided with share creation
@@ -71,6 +74,7 @@
                                                   version="2.5")
             self.assertEqual(self.sts[i]["name"], get["share_type"])
 
+    @decorators.idempotent_id('f25e0cb0-d656-4f16-a761-ec23992cd9e7')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_share_share_type_v_2_6(self):
         # Share type should be the same as provided with share creation
@@ -80,6 +84,7 @@
             self.assertEqual(self.sts[i]["id"], get["share_type"])
             self.assertEqual(self.sts[i]["name"], get["share_type_name"])
 
+    @decorators.idempotent_id('bfa0c056-0a15-40e1-bdff-f1e10b95736c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_share_backend_name_distinction(self):
         # Different share backends should have different host records
diff --git a/manila_tempest_tests/tests/api/admin/test_quotas.py b/manila_tempest_tests/tests/api/admin/test_quotas.py
index 116180e..25f43a4 100644
--- a/manila_tempest_tests/tests/api/admin/test_quotas.py
+++ b/manila_tempest_tests/tests/api/admin/test_quotas.py
@@ -16,6 +16,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -46,6 +47,7 @@
         cls.share_type = cls._create_share_type()
         cls.share_type_id = cls.share_type['id']
 
+    @decorators.idempotent_id('f62c48e3-9736-4f0c-9f9b-f139f393ac0a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_default_quotas(self):
         quotas = self.client.default_quotas(self.tenant_id)
@@ -61,6 +63,7 @@
             self.assertGreater(int(quotas["share_replicas"]), -2)
             self.assertGreater(int(quotas["replica_gigabytes"]), -2)
 
+    @decorators.idempotent_id('1ff57cfa-cd8d-495f-86eb-9fead307428e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_show_quotas(self):
         quotas = self.client.show_quotas(self.tenant_id)
@@ -76,6 +79,7 @@
             self.assertGreater(int(quotas["share_replicas"]), -2)
             self.assertGreater(int(quotas["replica_gigabytes"]), -2)
 
+    @decorators.idempotent_id('9b96dd45-7c0d-41ee-88e4-600185f61358')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_show_quotas_for_user(self):
         quotas = self.client.show_quotas(
@@ -92,6 +96,7 @@
             self.assertGreater(int(quotas["share_replicas"]), -2)
             self.assertGreater(int(quotas["replica_gigabytes"]), -2)
 
+    @decorators.idempotent_id('2e98a13e-b2ed-4977-bafe-47ea48b504f2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported(PRE_SHARE_GROUPS_MICROVERSION)
     def test_show_sg_quotas_using_too_old_microversion(self):
@@ -101,6 +106,7 @@
         for key in ('share_groups', 'share_group_snapshots'):
             self.assertNotIn(key, quotas)
 
+    @decorators.idempotent_id('b8bcbc04-68fb-4c8f-9f4c-a3b6c6b8911c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported(PRE_SHARE_GROUPS_MICROVERSION)
     def test_show_sg_quotas_for_user_using_too_old_microversion(self):
@@ -111,6 +117,7 @@
         for key in ('share_groups', 'share_group_snapshots'):
             self.assertNotIn(key, quotas)
 
+    @decorators.idempotent_id('19fe431b-e83e-4c4e-acb8-018d7a470c8b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported(
         PRE_SHARE_REPLICA_QUOTAS_MICROVERSION)
@@ -127,6 +134,7 @@
         ('name', False),
     )
     @ddt.unpack
+    @decorators.idempotent_id('836e1725-2853-4d54-b281-8173773d8527')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_show_share_type_quotas(self, share_type_key, is_st_public):
@@ -197,6 +205,7 @@
         cls.tenant_id = cls.client.tenant_id
         cls.user_id = cls.client.user_id
 
+    @decorators.idempotent_id('da16e906-e8e6-4aa0-9fc1-76ed48cfd428')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_tenant_quota_shares(self):
         # get current quotas
@@ -212,6 +221,7 @@
         "share_groups",
         "share_group_snapshots",
     )
+    @decorators.idempotent_id('cb09de7e-94e9-401a-b82b-8b2de210f8b9')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @testtools.skipUnless(
         CONF.share.run_share_group_tests, 'Share Group tests disabled.')
@@ -226,6 +236,7 @@
 
         self.assertEqual(new_quota, int(updated[quota_key]))
 
+    @decorators.idempotent_id('2c7f9e19-268d-4420-a046-a7faf21174a1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_user_quota_shares(self):
         # get current quotas
@@ -243,6 +254,7 @@
         "share_groups",
         "share_group_snapshots",
     )
+    @decorators.idempotent_id('c32a716b-f971-4855-97ea-f30d4423d03d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @testtools.skipUnless(
         CONF.share.run_share_group_tests, 'Share Group tests disabled.')
@@ -265,6 +277,7 @@
               ("replica_gigabytes", True),
               )
     @ddt.unpack
+    @decorators.idempotent_id('af16dc89-c93d-43de-8902-2c88c75f107f')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported(SHARE_REPLICA_QUOTAS_MICROVERSION)
     def test_update_user_quota_replica_related(self, quota_key, use_user_id):
@@ -289,6 +302,7 @@
         ('name', False),
     )
     @ddt.unpack
+    @decorators.idempotent_id('155ea3de-b3b5-4aa0-be8b-eebcc19ce874')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_update_share_type_quota(self, share_type_key, is_st_public):
@@ -326,6 +340,7 @@
         for q in quota_keys:
             self.assertEqual(int(quotas[q]) - 1, current_quotas[q])
 
+    @decorators.idempotent_id('78957d97-afad-4371-a21e-79641fff83f6')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_tenant_quota_snapshots(self):
         # get current quotas
@@ -337,6 +352,7 @@
 
         self.assertEqual(new_quota, int(updated["snapshots"]))
 
+    @decorators.idempotent_id('53f4fd79-39aa-42be-82ce-e423ebffe837')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_user_quota_snapshots(self):
         # get current quotas
@@ -350,6 +366,7 @@
 
         self.assertEqual(new_quota, int(updated["snapshots"]))
 
+    @decorators.idempotent_id('37ee5bd2-db07-4817-b71a-7c3e78634399')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_tenant_quota_gigabytes(self):
         # get current quotas
@@ -363,6 +380,7 @@
 
         self.assertEqual(gigabytes, int(updated["gigabytes"]))
 
+    @decorators.idempotent_id('284a2e95-48a1-4f1b-b952-f734b1b6238a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_tenant_quota_snapshot_gigabytes(self):
         # get current quotas
@@ -378,6 +396,7 @@
         self.assertEqual(snapshot_gigabytes,
                          int(updated["snapshot_gigabytes"]))
 
+    @decorators.idempotent_id('75977d53-f06b-41a2-8365-0ce549e4a51a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_user_quota_gigabytes(self):
         # get current quotas
@@ -393,6 +412,7 @@
 
         self.assertEqual(gigabytes, int(updated["gigabytes"]))
 
+    @decorators.idempotent_id('00a189fc-93ed-44c2-b9dc-1d9b6c26d005')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_user_quota_snapshot_gigabytes(self):
         # get current quotas
@@ -409,6 +429,7 @@
         self.assertEqual(snapshot_gigabytes,
                          int(updated["snapshot_gigabytes"]))
 
+    @decorators.idempotent_id('da7f3179-f2f3-402e-82c2-e6855774a99a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_tenant_quota_share_networks(self):
         # get current quotas
@@ -420,6 +441,7 @@
 
         self.assertEqual(new_quota, int(updated["share_networks"]))
 
+    @decorators.idempotent_id('f75f01a0-5921-44ab-b373-bb9e070f87eb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_user_quota_share_networks(self):
         # get current quotas
@@ -434,6 +456,7 @@
 
         self.assertEqual(new_quota, int(updated["share_networks"]))
 
+    @decorators.idempotent_id('84e24c32-ee78-461e-ac1f-f9e4d99f88e2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_reset_tenant_quotas(self):
         # Get default_quotas
@@ -522,6 +545,7 @@
         ('name', False),
     )
     @ddt.unpack
+    @decorators.idempotent_id('15e57302-5a14-4be4-8720-95b639c2bfad')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_reset_share_type_quotas(self, share_type_key, is_st_public):
@@ -582,6 +606,7 @@
             self.assertNotEqual(default_quotas[key], current_st_quota[key])
             self.assertEqual(current_p_quota[key], current_st_quota[key])
 
+    @decorators.idempotent_id('d4bba375-7111-4b93-b6dd-4f0532febc3e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_quota_for_shares(self):
         self.update_quotas(self.tenant_id, shares=-1)
@@ -590,6 +615,7 @@
 
         self.assertEqual(-1, quotas.get('shares'))
 
+    @decorators.idempotent_id('756ffd0e-a476-49af-ac85-9bb4ce5e29b7')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_user_quota_for_shares(self):
         self.update_quotas(self.tenant_id, user_id=self.user_id, shares=-1)
@@ -598,6 +624,7 @@
 
         self.assertEqual(-1, quotas.get('shares'))
 
+    @decorators.idempotent_id('9779d166-09d3-4745-8acc-2243eadec3ea')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_quota_for_snapshots(self):
         self.update_quotas(self.tenant_id, snapshots=-1)
@@ -606,6 +633,7 @@
 
         self.assertEqual(-1, quotas.get('snapshots'))
 
+    @decorators.idempotent_id('245b3bf3-09ef-4b6d-8643-f156bf1bf23c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_user_quota_for_snapshots(self):
         self.update_quotas(self.tenant_id, user_id=self.user_id, snapshots=-1)
@@ -614,6 +642,7 @@
 
         self.assertEqual(-1, quotas.get('snapshots'))
 
+    @decorators.idempotent_id('b6a94e87-091a-48dc-9b51-13d81541869c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_quota_for_gigabytes(self):
         self.update_quotas(self.tenant_id, gigabytes=-1)
@@ -622,6 +651,7 @@
 
         self.assertEqual(-1, quotas.get('gigabytes'))
 
+    @decorators.idempotent_id('0d044db4-ae5b-416d-aa51-098afb72cd6c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_quota_for_snapshot_gigabytes(self):
         self.update_quotas(self.tenant_id, snapshot_gigabytes=-1)
@@ -630,6 +660,7 @@
 
         self.assertEqual(-1, quotas.get('snapshot_gigabytes'))
 
+    @decorators.idempotent_id('2de4b7cf-9189-413f-858b-860ecf5fd18b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_user_quota_for_gigabytes(self):
         self.update_quotas(self.tenant_id, user_id=self.user_id, gigabytes=-1)
@@ -638,6 +669,7 @@
 
         self.assertEqual(-1, quotas.get('gigabytes'))
 
+    @decorators.idempotent_id('cbe63027-1108-4779-9fd3-22f41f60d6bb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_user_quota_for_snapshot_gigabytes(self):
         self.update_quotas(self.tenant_id,
@@ -648,6 +680,7 @@
 
         self.assertEqual(-1, quotas.get('snapshot_gigabytes'))
 
+    @decorators.idempotent_id('e35455f5-92db-4669-ac21-9daf170df248')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_quota_for_share_networks(self):
         self.update_quotas(self.tenant_id, share_networks=-1)
@@ -656,6 +689,7 @@
 
         self.assertEqual(-1, quotas.get('share_networks'))
 
+    @decorators.idempotent_id('66b04887-e611-4d4f-a40b-c8b14766b6af')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_unlimited_user_quota_for_share_networks(self):
         self.update_quotas(self.tenant_id,
@@ -666,6 +700,7 @@
 
         self.assertEqual(-1, quotas.get('share_networks'))
 
+    @decorators.idempotent_id('7c2cd2d4-4352-4811-9e39-70f56e6297c2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @testtools.skipUnless(
         CONF.share.run_share_group_tests, 'Share Group tests disabled.')
@@ -677,6 +712,7 @@
 
         self.assertEqual(-1, quotas.get('share_groups'))
 
+    @decorators.idempotent_id('76d270d5-f314-47cb-9c3f-409f8ff12ce2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @testtools.skipUnless(
         CONF.share.run_share_group_tests, 'Share Group tests disabled.')
@@ -691,6 +727,7 @@
         self.assertEqual(-1, quotas.get('share_group_snapshots'))
 
     @ddt.data("share_replicas", "replica_gigabytes")
+    @decorators.idempotent_id('15aa5df5-b2ae-4a3a-acb8-efbbc84581be')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @utils.skip_if_microversion_not_supported(
         SHARE_REPLICA_QUOTAS_MICROVERSION)
@@ -703,6 +740,7 @@
         self.assertEqual(-1, quotas.get(quota_key))
 
     @ddt.data("share_replicas", "replica_gigabytes")
+    @decorators.idempotent_id('84b99731-f748-44fe-a291-162d05da9e25')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @utils.skip_if_microversion_not_supported(
         SHARE_REPLICA_QUOTAS_MICROVERSION)
@@ -715,6 +753,7 @@
         self.assertEqual(-1, quotas.get(quota_key))
 
     @ddt.data(11, -1)
+    @decorators.idempotent_id('43f58705-3cad-46bc-816c-41e8fa55dd8d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_user_quotas_bigger_than_project_quota(self, user_quota):
         self.update_quotas(self.tenant_id, shares=10)
@@ -725,6 +764,7 @@
                            shares=user_quota)
 
     @ddt.data(11, -1)
+    @decorators.idempotent_id('315cb76f-920d-4cb9-ac7d-16be8e95e1b2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_update_share_type_quotas_bigger_than_project_quota(self, st_q):
@@ -740,6 +780,7 @@
                            cleanup=False,
                            shares=st_q)
 
+    @decorators.idempotent_id('c95be1eb-6331-4c37-9fac-ed6c36270457')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_set_share_type_quota_bigger_than_users_quota(self):
@@ -761,6 +802,7 @@
                            cleanup=False,
                            shares=12)
 
+    @decorators.idempotent_id('4687eb25-17b3-4995-ace2-62f8bda29c57')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.39")
     def test_quotas_usages(self):
@@ -853,6 +895,7 @@
         self._check_sgs_usages(p_quotas, sgs_in_use)
         self._check_sgs_usages(u_quotas, sgs_in_use)
 
+    @decorators.idempotent_id('fe357398-12d4-4a63-b5ae-0d5091ba3442')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_share_group_tests, 'Share Group tests disabled.')
diff --git a/manila_tempest_tests/tests/api/admin/test_quotas_negative.py b/manila_tempest_tests/tests/api/admin/test_quotas_negative.py
index e039045..e1e033f 100644
--- a/manila_tempest_tests/tests/api/admin/test_quotas_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_quotas_negative.py
@@ -14,13 +14,15 @@
 #    under the License.
 
 import ddt
-import manila_tempest_tests.tests.api.test_replication_negative as rep_neg_test
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
+from manila_tempest_tests.tests.api import test_replication_negative as \
+    rep_neg_test
 from manila_tempest_tests import utils
 
 CONF = config.CONF
@@ -60,11 +62,13 @@
         cls.share_group_type = cls._create_share_group_type()
         cls.share_group_type_id = cls.share_group_type['id']
 
+    @decorators.idempotent_id('c7174059-7172-4cc8-9121-aefe509ef14c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_quotas_with_empty_tenant_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.client.show_quotas, "")
 
+    @decorators.idempotent_id('0fbcbfad-fdb5-42d6-b005-041dc4ddea64')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_reset_quotas_with_empty_tenant_id(self):
         self.assertRaises(lib_exc.NotFound,
@@ -77,6 +81,7 @@
         {"snapshot_gigabytes": -2},
         {"share_networks": -2},
     )
+    @decorators.idempotent_id('07d3e69a-7cda-4ca7-9fea-c32f6830fdd3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_update_quota_with_wrong_data(self, kwargs):
         # -1 is acceptable value as unlimited
@@ -89,6 +94,7 @@
         {"share_groups": -2},
         {"share_group_snapshots": -2},
     )
+    @decorators.idempotent_id('b11c5d5f-2b58-4a5f-8469-b22ea51709c0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @testtools.skipUnless(
         CONF.share.run_share_group_tests, 'Share Group tests disabled.')
@@ -104,6 +110,7 @@
         {"share_replicas": -2},
         {"replica_gigabytes": -2},
     )
+    @decorators.idempotent_id('d070ccc6-6685-4f49-a8e5-9b891790881e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @utils.skip_if_microversion_not_supported(
         SHARE_REPLICA_QUOTAS_MICROVERSION)
@@ -114,6 +121,7 @@
                           self.tenant_id,
                           **kwargs)
 
+    @decorators.idempotent_id('75d39eda-a2b5-4271-a61d-9e2c86370b3e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_with_size_bigger_than_quota(self):
         quotas = self.client.show_quotas(self.tenant_id)
@@ -124,6 +132,7 @@
                           self.create_share,
                           size=overquota)
 
+    @decorators.idempotent_id('37dd40a8-375e-454b-8b80-229cb0eecb01')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @testtools.skipUnless(
         CONF.share.run_share_group_tests, 'Share Group tests disabled.')
@@ -138,6 +147,7 @@
                           share_type_ids=[self.share_type_id],
                           cleanup_in_class=False)
 
+    @decorators.idempotent_id('e039535c-dc4e-497a-ac09-30b3395ba95b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_user_quota_shares_bigger_than_tenant_quota(self):
 
@@ -153,6 +163,7 @@
                           force=False,
                           shares=bigger_value)
 
+    @decorators.idempotent_id('57495588-d645-402e-9b89-0ab63a58ce3e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_user_quota_snaps_bigger_than_tenant_quota(self):
 
@@ -168,6 +179,7 @@
                           force=False,
                           snapshots=bigger_value)
 
+    @decorators.idempotent_id('6187050f-f262-48cf-bdd6-32982f860fba')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_user_quota_gigabytes_bigger_than_tenant_quota(self):
 
@@ -183,6 +195,7 @@
                           force=False,
                           gigabytes=bigger_value)
 
+    @decorators.idempotent_id('8eb4aed8-c239-49d3-aee1-d63d043aa3d1')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_user_quota_snap_gigabytes_bigger_than_tenant_quota(self):
         # get current quotas for tenant
@@ -197,6 +210,7 @@
                           force=False,
                           snapshot_gigabytes=bigger_value)
 
+    @decorators.idempotent_id('a272a24b-21a6-4f6c-917c-cbe103203a11')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_user_quota_share_networks_bigger_than_tenant_quota(self):
 
@@ -213,6 +227,7 @@
                           share_networks=bigger_value)
 
     @ddt.data("share_replicas", "replica_gigabytes")
+    @decorators.idempotent_id('40dabf7d-98da-48a9-bb62-285098d5acb4')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @utils.skip_if_microversion_not_supported(
         SHARE_REPLICA_QUOTAS_MICROVERSION)
@@ -245,6 +260,7 @@
         ('os-quota-sets', '2.7', 'update_quotas'),
     )
     @ddt.unpack
+    @decorators.idempotent_id('ed38ab0a-694c-48ea-bce5-5c264f485d5b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported("2.7")
     def test_show_quotas_with_wrong_versions(self, url, version, method_name):
@@ -254,6 +270,7 @@
                           version=version,
                           url=url)
 
+    @decorators.idempotent_id('50af5d8c-0b30-4e8d-93bf-bb975db58516')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_show_quota_detail_with_wrong_versions(self):
         version = '2.24'
@@ -266,6 +283,7 @@
                           url=url)
 
     @ddt.data('show', 'reset', 'update')
+    @decorators.idempotent_id('cf45eb7d-7330-4b2d-8214-e4149eb4a398')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_share_type_quotas_using_nonexistent_share_type(self, op):
@@ -281,6 +299,7 @@
                           **kwargs)
 
     @ddt.data('id', 'name')
+    @decorators.idempotent_id('2ba641a1-100b-417e-80e2-d3f717fd3c7c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_try_update_share_type_quota_for_share_networks(self, key):
@@ -295,6 +314,7 @@
                           share_networks=int(tenant_quotas["share_networks"]))
 
     @ddt.data('share_groups', 'share_group_snapshots')
+    @decorators.idempotent_id('5eb6ce15-1172-4bcb-9c7b-91543bf714e8')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_lt(SHARE_GROUPS_MICROVERSION)
     def test_try_update_share_type_quota_for_share_groups(self, quota_name):
@@ -308,6 +328,7 @@
                           **{quota_name: int(tenant_quotas[quota_name])})
 
     @ddt.data('share_groups', 'share_group_snapshots')
+    @decorators.idempotent_id('1b504c74-2ce9-40f6-87fb-9e643b1b5906')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported(PRE_SHARE_GROUPS_MICROVERSION)
     @base.skip_if_microversion_not_supported(SHARE_GROUPS_MICROVERSION)
@@ -325,6 +346,7 @@
                           **kwargs)
 
     @ddt.data("share_replicas", "replica_gigabytes")
+    @decorators.idempotent_id('66f22d42-37bc-4f9b-8e0b-a679341e1e88')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported(SHARE_REPLICA_QUOTAS_MICROVERSION)
     def test_share_replica_quotas_using_too_old_microversion(self, quota_key):
@@ -341,6 +363,7 @@
                           **kwargs)
 
     @ddt.data('show', 'reset', 'update')
+    @decorators.idempotent_id('acc609c2-f314-4540-984c-33e93d048f6c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.38")
     def test_share_type_quotas_using_too_old_microversion(self, op):
@@ -356,6 +379,7 @@
                           **kwargs)
 
     @ddt.data('show', 'reset', 'update')
+    @decorators.idempotent_id('719768d1-d313-40e9-9127-c5777840ecbd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_quotas_providing_share_type_and_user_id(self, op):
@@ -371,6 +395,7 @@
                           **kwargs)
 
     @ddt.data(11, -1)
+    @decorators.idempotent_id('82256511-aa46-4b99-a6e5-8b400534e96d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.39")
     def test_update_share_type_quotas_bigger_than_project_quota(self, st_q):
@@ -384,6 +409,7 @@
                           force=False,
                           shares=st_q)
 
+    @decorators.idempotent_id('6396daab-ba73-4140-8a0a-8eef0a01804d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_share_over_quota_limit(self):
         self.create_share(share_type_id=self.share_type_id)
@@ -433,6 +459,7 @@
         # Make sure that the new value was properly set
         self.assertEqual(new_limit, updated_quota[quota_key])
 
+    @decorators.idempotent_id('ad19eaa5-bacd-4bc5-9592-622b0c856cdd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(('share_replicas', 2), ('replica_gigabytes', None))
     @ddt.unpack
@@ -454,6 +481,7 @@
                           self.share1['id'],
                           availability_zone=self.replica_zone)
 
+    @decorators.idempotent_id('0006f1ff-69c0-40b7-8437-55cc0a08a195')
     @testtools.skipUnless(
         CONF.share.run_extend_tests,
         "Share extend tests are disabled.")
diff --git a/manila_tempest_tests/tests/api/admin/test_replication.py b/manila_tempest_tests/tests/api/admin/test_replication.py
index 738ece1..a7bbad2 100644
--- a/manila_tempest_tests/tests/api/admin/test_replication.py
+++ b/manila_tempest_tests/tests/api/admin/test_replication.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
@@ -80,6 +81,7 @@
         return [replica['id'] for replica in replica_list
                 if replica['replica_state'] == r_state]
 
+    @decorators.idempotent_id('0213cdfd-6a0f-4f24-a154-69796888a64a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_REPLICATION_VERSION,
@@ -140,6 +142,7 @@
             replica_list, constants.REPLICATION_STATE_ACTIVE)
         self.assertEqual(1, len(new_active_replicas))
 
+    @decorators.idempotent_id('22a199b7-f4f6-4ede-b09f-8047a9d01cad')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_REPLICATION_VERSION,
@@ -161,6 +164,7 @@
                                                      version=version)
         self.admin_client.wait_for_resource_deletion(replica_id=replica['id'])
 
+    @decorators.idempotent_id('16bd90f0-c478-4a99-8633-b18703ff56fa')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_REPLICATION_VERSION,
@@ -180,6 +184,7 @@
         self.admin_client.wait_for_share_replica_status(
             replica['id'], constants.STATUS_ERROR)
 
+    @decorators.idempotent_id('258844da-a853-42b6-87db-b16e616018c6')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_REPLICATION_VERSION,
@@ -199,6 +204,7 @@
         self.admin_client.wait_for_share_replica_status(
             replica['id'], constants.STATUS_ERROR, status_attr='replica_state')
 
+    @decorators.idempotent_id('2969565a-85e8-4c61-9dfb-cc7f7ca9f6dd')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_REPLICATION_VERSION,
diff --git a/manila_tempest_tests/tests/api/admin/test_replication_actions.py b/manila_tempest_tests/tests/api/admin/test_replication_actions.py
index 428229c..5ceb818 100644
--- a/manila_tempest_tests/tests/api/admin/test_replication_actions.py
+++ b/manila_tempest_tests/tests/api/admin/test_replication_actions.py
@@ -11,6 +11,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -76,6 +77,7 @@
         cls.replica = cls.admin_client.list_share_replicas(
             share_id=cls.share['id'])[0]
 
+    @decorators.idempotent_id('b39f319e-2515-42c0-85c4-21c2fb2123bf')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_extend_tests,
                           'Extend share tests are disabled.')
@@ -88,6 +90,7 @@
         share = self.admin_client.get_share(self.share["id"])
         self.assertEqual(new_size, int(share["size"]))
 
+    @decorators.idempotent_id('743bfb8e-a314-4e8e-92b5-079bd3eae72d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_shrink_tests,
                           'Shrink share tests are disabled.')
@@ -99,6 +102,7 @@
         shrink_share = self.admin_client.get_share(self.share["id"])
         self.assertEqual(new_size, int(shrink_share["size"]))
 
+    @decorators.idempotent_id('84150cd6-2777-4806-8aa3-51359f16816e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(CONF.share.run_manage_unmanage_tests,
                           'Manage/Unmanage Tests are disabled.')
@@ -135,6 +139,7 @@
         self.create_share_replica(managed_share['id'], self.replica_zone,
                                   cleanup=True, client=self.admin_client)
 
+    @decorators.idempotent_id('cbbe2650-47bb-456b-8b41-74c66270ea97')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_manage_unmanage_tests,
                           'Manage/Unmanage Tests are disabled.')
@@ -148,6 +153,7 @@
             self.admin_client.unmanage_share,
             share_id=self.share['id'])
 
+    @decorators.idempotent_id('796fb2a8-1ac3-4eee-b12e-da511eb52e87')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(CONF.share.run_manage_unmanage_tests,
                           'Manage/Unmanage Tests are disabled.')
@@ -161,6 +167,7 @@
         self.admin_client.unmanage_share(share['id'])
         self.admin_client.wait_for_resource_deletion(share_id=share['id'])
 
+    @decorators.idempotent_id('93220873-c6c4-40f7-840d-d0ff02e7cd7e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_manage_unmanage_snapshot_tests,
                           'Manage/Unmanage Snapshot Tests are disabled.')
@@ -176,6 +183,7 @@
             provider_location="127.0.0.1:/fake_provider_location/"
                               "manila_share_9dc61f49_fbc8_48d7_9337_2f9593d9")
 
+    @decorators.idempotent_id('0b0cd350-8691-477b-adb1-5e79b92e3759')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_manage_unmanage_snapshot_tests,
                           'Manage/Unmanage Snapshot Tests are disabled.')
diff --git a/manila_tempest_tests/tests/api/admin/test_scheduler_stats.py b/manila_tempest_tests/tests/api/admin/test_scheduler_stats.py
index 6adf9c8..1d0b873 100644
--- a/manila_tempest_tests/tests/api/admin/test_scheduler_stats.py
+++ b/manila_tempest_tests/tests/api/admin/test_scheduler_stats.py
@@ -15,6 +15,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -45,6 +46,7 @@
         super(SchedulerStatsAdminTest, cls).resource_setup()
         cls.admin_client = cls.shares_v2_client
 
+    @decorators.idempotent_id('dab6d654-7d1c-4bc0-8017-1c4c072b49a1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_pool_list(self):
 
@@ -58,6 +60,7 @@
         actual_keys = set(pool.keys())
         self.assertTrue(actual_keys.issuperset(required_keys))
 
+    @decorators.idempotent_id('8f4582c4-df82-4b64-be79-a8c6fdc58eac')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_pool_list_with_filters(self):
 
@@ -87,6 +90,7 @@
         for k, v in search_opts.items():
             self.assertEqual(v[1:-1], filtered_pool_list[0][k])
 
+    @decorators.idempotent_id('1c2f1b0f-c509-4676-8335-bb6b10debea2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_pool_list_with_filters_negative(self):
 
@@ -103,6 +107,7 @@
         # Ensure we got no pools
         self.assertEmpty(pool_list)
 
+    @decorators.idempotent_id('b6fdd156-3923-495a-ab01-f94bfb5d7040')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_pool_list_detail(self):
 
@@ -116,6 +121,7 @@
         actual_keys = set(pool.keys())
         self.assertTrue(actual_keys.issuperset(required_keys))
 
+    @decorators.idempotent_id('071a1e47-959e-47df-ad19-335064bb25ff')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_pool_list_detail_with_filters(self):
 
@@ -145,6 +151,7 @@
         for k, v in search_opts.items():
             self.assertEqual(v[1:-1], filtered_pool_list[0][k])
 
+    @decorators.idempotent_id('56f04711-7b57-4d2a-a4f3-96c82845208e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_pool_list_detail_with_filters_negative(self):
 
@@ -161,6 +168,7 @@
         # Ensure we got no pools
         self.assertEmpty(pool_list)
 
+    @decorators.idempotent_id('f027fb62-1ec3-4f52-a782-e9dd9db34fda')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.23")
     @ddt.data((True, "name"), (True, "id"), (False, "name"), (False, "id"))
@@ -186,6 +194,7 @@
             self.assertIn("pool", pool_keys)
             self.assertIs(detail, "capabilities" in pool_keys)
 
+    @decorators.idempotent_id('31cb2c99-3abf-4dce-8e66-7fd30b168300')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.23")
     @ddt.data((True, "name"), (True, "id"), (False, "name"), (False, "id"))
diff --git a/manila_tempest_tests/tests/api/admin/test_security_services.py b/manila_tempest_tests/tests/api/admin/test_security_services.py
index 3b29e26..bb3c103 100644
--- a/manila_tempest_tests/tests/api/admin/test_security_services.py
+++ b/manila_tempest_tests/tests/api/admin/test_security_services.py
@@ -13,6 +13,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -46,6 +47,7 @@
             'kerberos',
             **ss_kerberos_data)
 
+    @decorators.idempotent_id('6f843a0a-21da-4a83-ae3b-3831f99b3678')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_security_services_all_tenants(self):
         listed = self.shares_client.list_security_services(
@@ -57,6 +59,7 @@
         keys = ["name", "id", "status", "type", ]
         [self.assertIn(key, s_s.keys()) for s_s in listed for key in keys]
 
+    @decorators.idempotent_id('fe515fa7-0275-4190-adc7-5321e1047dad')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_security_services_invalid_filters(self):
         listed = self.shares_client.list_security_services(
diff --git a/manila_tempest_tests/tests/api/admin/test_services.py b/manila_tempest_tests/tests/api/admin/test_services.py
index bda4bb4..7e70dc2 100644
--- a/manila_tempest_tests/tests/api/admin/test_services.py
+++ b/manila_tempest_tests/tests/api/admin/test_services.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 import ddt
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -26,6 +27,7 @@
         super(ServicesAdminTest, self).setUp()
         self.services = self.shares_client.list_services()
 
+    @decorators.idempotent_id('74cd12ab-a1f5-40fb-9110-d9035b4b20c5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_list_services(self, client_name):
@@ -35,6 +37,7 @@
         for service in services:
             self.assertIsNotNone(service['id'])
 
+    @decorators.idempotent_id('e80f4b89-7280-47eb-9cbf-01a09e04c2d8')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_get_services_by_host_name(self, client_name):
@@ -45,6 +48,7 @@
         for service in services:
             self.assertEqual(host, service["host"])
 
+    @decorators.idempotent_id('1dd4d799-b900-4476-9e51-ad9db6ee4435')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_get_services_by_binary_name(self, client_name):
@@ -55,6 +59,7 @@
         for service in services:
             self.assertEqual(binary, service["binary"])
 
+    @decorators.idempotent_id('d12ea678-025f-46b4-95c5-3a03b3e440d7')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_get_services_by_availability_zone(self, client_name):
@@ -65,6 +70,7 @@
         for service in services:
             self.assertEqual(zone, service["zone"])
 
+    @decorators.idempotent_id('e82921a7-6c98-4c9c-a47b-34a0badc3b59')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_get_services_by_status(self, client_name):
@@ -75,6 +81,7 @@
         for service in services:
             self.assertEqual(status, service["status"])
 
+    @decorators.idempotent_id('c30234f0-1331-4560-93a7-cbda7d00eb53')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_get_services_by_state(self, client_name):
@@ -85,6 +92,7 @@
         for service in services:
             self.assertEqual(state, service["state"])
 
+    @decorators.idempotent_id('b77c4bc4-57d5-4181-9e95-e230ab682b32')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_get_services_by_all_filters(self, client_name):
diff --git a/manila_tempest_tests/tests/api/admin/test_services_negative.py b/manila_tempest_tests/tests/api/admin/test_services_negative.py
index 04ff803..d74c609 100644
--- a/manila_tempest_tests/tests/api/admin/test_services_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_services_negative.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 import ddt
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -29,11 +30,13 @@
         cls.admin_client = cls.admin_shares_v2_client
         cls.member_client = cls.shares_v2_client
 
+    @decorators.idempotent_id('59ab1a7d-817d-42e5-a1b9-adfc2912e08c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_services_with_non_admin_user(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.member_client.list_services)
 
+    @decorators.idempotent_id('04f59090-069d-4cae-b028-e004ff29126c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_service_by_invalid_params(self):
         # All services are expected if send the request with invalid parameter
@@ -54,36 +57,42 @@
                                 key=lambda service: service['id']),
                          msg)
 
+    @decorators.idempotent_id('386dc131-39f9-4d5f-af87-edf76e3d0e71')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_service_by_invalid_host(self):
         params = {'host': 'fake_host'}
         services_fake = self.admin_client.list_services(params)
         self.assertEqual(0, len(services_fake))
 
+    @decorators.idempotent_id('766461b0-e89a-4113-8229-24c4d11d585a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_service_by_invalid_binary(self):
         params = {'binary': 'fake_binary'}
         services_fake = self.admin_client.list_services(params)
         self.assertEqual(0, len(services_fake))
 
+    @decorators.idempotent_id('ac570fde-690d-4448-9cce-ce35e0a14b88')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_service_by_invalid_zone(self):
         params = {'zone': 'fake_zone'}
         services_fake = self.admin_client.list_services(params)
         self.assertEqual(0, len(services_fake))
 
+    @decorators.idempotent_id('da0fef1d-c4d3-4c33-a836-5f836e85df69')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_service_by_invalid_status(self):
         params = {'status': 'fake_status'}
         services_fake = self.admin_client.list_services(params)
         self.assertEqual(0, len(services_fake))
 
+    @decorators.idempotent_id('41936575-3a96-455b-8069-7f6563abf0e2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_service_by_invalid_state(self):
         params = {'state': 'fake_state'}
         services_fake = self.admin_client.list_services(params)
         self.assertEqual(0, len(services_fake))
 
+    @decorators.idempotent_id('3c72227b-7fa1-4294-bdf4-413ec4c324e5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data(
         ('os-services', '2.7'),
diff --git a/manila_tempest_tests/tests/api/admin/test_share_group_types.py b/manila_tempest_tests/tests/api/admin/test_share_group_types.py
index d05c079..3666079 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_group_types.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_group_types.py
@@ -13,16 +13,19 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import ddt
 import itertools
+
+import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 
 LATEST_MICROVERSION = CONF.share.max_api_microversion
@@ -54,6 +57,7 @@
         share_type = cls.create_share_type(name, extra_specs=extra_specs)
         cls.share_type2 = share_type['share_type']
 
+    @decorators.idempotent_id('e2ba1754-cecc-4178-ad39-eefbb59e4d6d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(
         *itertools.product(('id', 'name'), set(
@@ -93,6 +97,7 @@
         self.shares_v2_client.wait_for_resource_deletion(
             share_group_type_id=sg_type_r['id'])
 
+    @decorators.idempotent_id('65cf04d6-0620-4e0d-96f2-456946e8a552')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('id', 'name')
     def test_create_share_group_type_multiple_share_types_min(self, st_key):
@@ -109,6 +114,7 @@
             set(sg_type['share_types']),
             'Share types not applied correctly.')
 
+    @decorators.idempotent_id('6e103b7b-cd01-4edb-91e7-a16681781b36')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_create_share_group_type_with_one_spec_min(self):
         name = data_utils.rand_name("tempest-manila")
@@ -123,6 +129,7 @@
 
         self.assertDictMatch(group_specs, sg_type['group_specs'])
 
+    @decorators.idempotent_id('ec459ebb-5c45-4d4f-95f0-3bbf2974366c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_create_share_group_type_with_multiple_specs_min(self):
         name = data_utils.rand_name("tempest-manila")
@@ -137,6 +144,7 @@
 
         self.assertDictMatch(group_specs, sg_type['group_specs'])
 
+    @decorators.idempotent_id('15b44580-a34d-4e0d-a77b-0e76b45d6199')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -166,6 +174,7 @@
         self.assertEqual('value3', sg_type['group_specs']['key1'])
         self.assertEqual(group_specs['key2'], sg_type['group_specs']['key2'])
 
+    @decorators.idempotent_id('3ed054c5-d0ab-4a73-b704-994eb7f9c46c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_all_share_group_type_specs_min(self):
         name = data_utils.rand_name("tempest-manila")
@@ -190,6 +199,7 @@
             self.assertIn(k, sg_type['group_specs'])
             self.assertEqual(v, sg_type['group_specs'][k])
 
+    @decorators.idempotent_id('efddee69-ca23-4681-8247-94ded81c4c3a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -218,6 +228,7 @@
 
         self.assertDictMatch(group_specs, sg_type['group_specs'])
 
+    @decorators.idempotent_id('c2d34b42-e3ec-404e-8b7a-0fe9b1560507')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -278,6 +289,7 @@
             sgt_id, version=version)
         self.assertEmpty(access)
 
+    @decorators.idempotent_id('b8b20a96-cecc-4677-8a77-aae3b93e5b96')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(*set(('2.45', '2.46', LATEST_MICROVERSION)))
     def test_share_group_type_create_show_list_with_is_default_key(self,
diff --git a/manila_tempest_tests/tests/api/admin/test_share_group_types_negative.py b/manila_tempest_tests/tests/api/admin/test_share_group_types_negative.py
index 3cb5ed7..30ab384 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_group_types_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_group_types_negative.py
@@ -12,6 +12,7 @@
 
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -45,6 +46,7 @@
             share_types=[cls.share_type['share_type']['id']],
             client=cls.admin_shares_v2_client)
 
+    @decorators.idempotent_id('1f8e3f98-4df7-4383-94d6-4ad058ef79c1')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_group_type_without_name(self):
         self.assertRaises(
@@ -53,6 +55,7 @@
             name=None,
             share_types=data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('6c95f5b7-6e30-4e1e-b0fc-a0f05cf2982d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_group_type_with_nonexistent_share_type(self):
         self.assertRaises(
@@ -61,6 +64,7 @@
             name=data_utils.rand_name("sgt_name_should_have_not_been_created"),
             share_types=data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('ce6ba41b-4207-4866-8f70-7a89f64b4cd4')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_group_type_with_empty_name(self):
         self.assertRaises(
@@ -68,6 +72,7 @@
             self.create_share_group_type, '',
             client=self.admin_shares_v2_client)
 
+    @decorators.idempotent_id('77159ec6-adb7-4d35-9d4b-039d322f7852')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_group_type_with_too_big_name(self):
         self.assertRaises(
@@ -75,6 +80,7 @@
             self.create_share_group_type,
             "x" * 256, client=self.admin_shares_v2_client)
 
+    @decorators.idempotent_id('43ac388d-05e8-45d5-b633-631cc1f290af')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_group_type_with_wrong_value_for_group_specs(self):
         self.assertRaises(
@@ -84,6 +90,7 @@
             share_types=[self.share_type['share_type']['id']],
             group_specs="expecting_error_code_400")
 
+    @decorators.idempotent_id('8fb8bd73-0219-460d-993e-bff7ddec29e8')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_share_group_type_using_nonexistent_id(self):
         self.assertRaises(
@@ -91,6 +98,7 @@
             self.admin_shares_v2_client.get_share_group_type,
             data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('76b5c302-f492-45b4-b464-7be6efd373be')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_share_group_type_using_nonexistent_id(self):
         self.assertRaises(
@@ -98,6 +106,7 @@
             self.admin_shares_v2_client.delete_share_group_type,
             data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('081183cb-0f1c-4b67-8552-909935dc0be2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_duplicate_of_share_group_type(self):
         unique_name = data_utils.rand_name("unique_sgt_name")
@@ -119,6 +128,7 @@
             self.admin_shares_v2_client.delete_share_group_type(sg_type['id'])
         self.assertEqual(2, len(list_of_ids))
 
+    @decorators.idempotent_id('6c30989d-2e8a-48d3-809a-556dddae51bd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_project_access_to_public_share_group_type(self):
         self.assertRaises(
@@ -127,6 +137,7 @@
             self.share_group_type["id"],
             self.admin_shares_v2_client.tenant_id)
 
+    @decorators.idempotent_id('3375a1f8-7828-4cbe-89d7-fe11fcf30b21')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_remove_project_access_from_public_share_group_type(self):
         self.assertRaises(
@@ -135,6 +146,7 @@
             self.share_group_type["id"],
             self.admin_shares_v2_client.tenant_id)
 
+    @decorators.idempotent_id('68e3d7f9-fdc0-44a2-ae84-a72eba314e19')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_project_access_to_nonexistent_share_group_type(self):
         self.assertRaises(
@@ -143,6 +155,7 @@
             data_utils.rand_name("fake"),
             self.admin_shares_v2_client.tenant_id)
 
+    @decorators.idempotent_id('94f0c902-ab12-435e-abd5-e09a892db82a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_remove_project_access_from_nonexistent_share_group_type(self):
         self.assertRaises(
diff --git a/manila_tempest_tests/tests/api/admin/test_share_groups.py b/manila_tempest_tests/tests/api/admin/test_share_groups.py
index 541acbb..e88d5ce 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_groups.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_groups.py
@@ -16,6 +16,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions
 import testtools
 from testtools import testcase as tc
@@ -59,6 +60,7 @@
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
         cls.sg_type_id = cls.sg_type['id']
 
+    @decorators.idempotent_id('79eaa86f-4c8f-49fd-acb2-ec051aa6bf93')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -96,6 +98,7 @@
             'Expected %s, got %s' % (
                 share_group['id'], expected_share_types, actual_share_types))
 
+    @decorators.idempotent_id('ff6c17af-03ba-4506-923d-b6c229492d0e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_create_share_group_with_multiple_share_types_min(self):
         share_group = self.create_share_group(
@@ -129,6 +132,7 @@
             'Expected %s, got %s' % (
                 share_group['id'], expected_share_types, actual_share_types))
 
+    @decorators.idempotent_id('99f0471c-e978-42ac-b50b-848b16692eab')
     @testtools.skipUnless(
         CONF.share.default_share_type_name, "Only if defaults are defined.")
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
@@ -167,6 +171,7 @@
             'Expected %s, got %s' % (
                 share_group['id'], expected_sg_type, actual_sg_type))
 
+    @decorators.idempotent_id('8ca1f0a0-2a36-4adb-af6b-6741b00307c5')
     @testtools.skipUnless(
         CONF.share.multitenancy_enabled, "Only for multitenancy.")
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
@@ -201,6 +206,7 @@
         self.assertEqual(
             orig_sg['share_server_id'], new_sg['share_server_id'])
 
+    @decorators.idempotent_id('93fd4a97-a25a-4a17-b5ae-c8894c1adfc5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_with_sg_type_but_without_any_group_specs(self):
         # Create share group type not specifying any group specs
diff --git a/manila_tempest_tests/tests/api/admin/test_share_groups_negative.py b/manila_tempest_tests/tests/api/admin/test_share_groups_negative.py
index 8a226c4..dd66559 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_groups_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_groups_negative.py
@@ -15,6 +15,7 @@
 
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
@@ -36,6 +37,7 @@
         utils.check_skip_if_microversion_lt(
             constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('b90537b7-634d-4fca-b451-770fbcca7927')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_share_group_with_wrong_consistent_snapshot_spec(self):
         # Create valid share type for share group type
diff --git a/manila_tempest_tests/tests/api/admin/test_share_instances.py b/manila_tempest_tests/tests/api/admin/test_share_instances.py
index 4474ffd..14cdbab 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_instances.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_instances.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 import ddt
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -32,6 +33,7 @@
         # create share
         cls.share = cls.create_share(share_type_id=cls.share_type_id)
 
+    @decorators.idempotent_id('b5211759-17ab-4806-a58c-c65bc8a06087')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_instances_of_share_v2_3(self):
         """Test that we get only the 1 share instance back for the share."""
@@ -50,6 +52,7 @@
                                                    self.share['id'],
                                                    si['share_id']))
 
+    @decorators.idempotent_id('b2d8ccba-5973-4e72-b3df-52555ce40b4f')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_instances_v2_3(self):
         """Test that we list the share instance back."""
@@ -62,6 +65,7 @@
         msg = 'Share instance for share %s was not found.' % self.share['id']
         self.assertIn(self.share['id'], share_ids, msg)
 
+    @decorators.idempotent_id('d4b2544a-96ce-41ed-8b8e-e46ceef91462')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('2.3', '2.9', '2.10', '2.30', '2.54')
     def test_get_share_instance(self, version):
@@ -99,6 +103,7 @@
                              si['id'], expected_keys, actual_keys))
 
     @ddt.data('path', 'id')
+    @decorators.idempotent_id('c27b415d-341c-42f0-a269-2c94f69fbee1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.35")
     def test_list_share_instances_with_export_location_path_and_id(
diff --git a/manila_tempest_tests/tests/api/admin/test_share_instances_negative.py b/manila_tempest_tests/tests/api/admin/test_share_instances_negative.py
index 36f9558..ebf8364 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_instances_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_instances_negative.py
@@ -11,6 +11,7 @@
 #    under the License.
 
 import ddt
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -28,6 +29,7 @@
         # create share
         cls.share = cls.create_share(share_type_id=cls.share_type_id)
 
+    @decorators.idempotent_id('babe885e-a8ab-439d-8b95-e5422983a942')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.34")
     @ddt.data('path', 'id')
@@ -44,6 +46,7 @@
 
         self.assertGreater(len(share_instances), 0)
 
+    @decorators.idempotent_id('ce0d045c-e418-42fa-86e4-ead493fc0663')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.35")
     @ddt.data('path', 'id')
diff --git a/manila_tempest_tests/tests/api/admin/test_share_manage.py b/manila_tempest_tests/tests/api/admin/test_share_manage.py
index f5fd840..5cda130 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_manage.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_manage.py
@@ -16,13 +16,14 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
-
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 
 
@@ -142,21 +143,25 @@
             self._delete_share_server_and_wait(
                 managed_share['share_server_id'])
 
+    @decorators.idempotent_id('15b654d0-34ed-4154-9f5f-b96d2e4e9d1c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.5")
     def test_manage_with_os_share_manage_url(self):
         self._test_manage(version="2.5")
 
+    @decorators.idempotent_id('8c0beefb-19da-441e-b73f-d90eb8000ff3')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.8")
     def test_manage_with_is_public_True(self):
         self._test_manage(is_public=True, version="2.8")
 
+    @decorators.idempotent_id('da7b7a4f-6693-4460-bdb7-1f8d42032bc6')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.16")
     def test_manage_show_user_id(self):
         self._test_manage(version="2.16")
 
+    @decorators.idempotent_id('24ec7840-0174-484f-8b3a-8c6f162bf576')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_manage(self):
         self._test_manage(check_manage=True)
diff --git a/manila_tempest_tests/tests/api/admin/test_share_manage_negative.py b/manila_tempest_tests/tests/api/admin/test_share_manage_negative.py
index de7e1bf..cc97dd6 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_manage_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_manage_negative.py
@@ -15,6 +15,7 @@
 
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -90,6 +91,7 @@
 
         return valid_params
 
+    @decorators.idempotent_id('8267161e-4f55-44eb-9af5-30d1a3fb2606')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_manage_invalid_param_raises_exception(self):
         # Try to manage share with invalid parameters, it should not succeed
@@ -140,6 +142,7 @@
             self._delete_share_server_and_wait(
                 managed_share['share_server_id'])
 
+    @decorators.idempotent_id('01b36343-c503-4c14-bb74-71f131ae96b6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_manage_invalid_param_manage_error(self):
         # Try to manage share with invalid parameters, it should not succeed.
@@ -184,6 +187,7 @@
             self._delete_share_server_and_wait(
                 managed_share['share_server_id'])
 
+    @decorators.idempotent_id('832b1c4d-e6f2-4a75-9ea5-d99f780db743')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_manage_share_duplicate(self):
         share = self._create_share_for_manage()
@@ -216,6 +220,7 @@
             self._delete_share_server_and_wait(
                 managed_share['share_server_id'])
 
+    @decorators.idempotent_id('c2f28981-5758-46e8-9d90-5c3269461d94')
     @testtools.skipUnless(CONF.share.multitenancy_enabled,
                           'Multitenancy tests are disabled.')
     @utils.skip_if_microversion_not_supported("2.49")
@@ -244,6 +249,7 @@
             self._delete_share_server_and_wait(
                 managed_share['share_server_id'])
 
+    @decorators.idempotent_id('162b6b96-e801-40f4-b111-7e533cf8b943')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_share_in_manage_error(self):
         share = self._create_share_for_manage()
@@ -280,6 +286,7 @@
             self._delete_share_server_and_wait(
                 managed_share['share_server_id'])
 
+    @decorators.idempotent_id('7cad4763-8f78-46a5-aeeb-6ca174284d3d')
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           'Snapshot tests are disabled.')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
@@ -300,6 +307,7 @@
         self._delete_snapshot_and_wait(snap)
         self._delete_share_and_wait(share)
 
+    @decorators.idempotent_id('f71bcb3c-836e-4e9e-972a-50debeb8c285')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_unmanage_share_transitional_state(self):
         # A share in transitional state cannot be unmanaged
@@ -319,6 +327,7 @@
         # cleanup
         self._reset_state_and_delete_share(share)
 
+    @decorators.idempotent_id('916ca8e2-5635-4cc9-8ab6-36b7b53ecd0a')
     @testtools.skipUnless(CONF.share.multitenancy_enabled,
                           'Multitenancy tests are disabled.')
     @utils.skip_if_microversion_not_supported("2.48")
diff --git a/manila_tempest_tests/tests/api/admin/test_share_networks.py b/manila_tempest_tests/tests/api/admin/test_share_networks.py
index b4211bd..2ff9533 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_networks.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_networks.py
@@ -13,6 +13,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -74,6 +75,7 @@
             cls.sn_with_kerberos_ss["id"],
             cls.ss_kerberos["id"])
 
+    @decorators.idempotent_id('983fb22d-3057-402f-8988-62ce41a557fb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_share_networks_all_tenants(self):
         listed = self.admin_shares_v2_client.list_share_networks_with_detail(
@@ -83,6 +85,7 @@
         self.assertTrue(any(self.sn_with_kerberos_ss['id'] == sn['id']
                             for sn in listed))
 
+    @decorators.idempotent_id('36c26b6b-8984-4255-959b-74f6ef46c37b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_share_networks_filter_by_project_id(self):
         listed = self.admin_shares_v2_client.list_share_networks_with_detail(
diff --git a/manila_tempest_tests/tests/api/admin/test_share_servers.py b/manila_tempest_tests/tests/api/admin/test_share_servers.py
index 9ba8836..b5fe72c 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_servers.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_servers.py
@@ -18,6 +18,7 @@
 import ddt
 import six
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -69,6 +70,7 @@
         cls.date_re = re.compile("^([0-9]{4}-[0-9]{2}-[0-9]{2}[A-Z]{1}"
                                  "[0-9]{2}:[0-9]{2}:[0-9]{2}).*$")
 
+    @decorators.idempotent_id('3f821248-2c05-4323-a95f-a0216a537b0a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_servers_without_filters(self):
         servers = self.shares_v2_client.list_share_servers()
@@ -99,6 +101,7 @@
         # Server we used is present.
         any(s["share_network_name"] in self.sn_name_and_id for s in servers)
 
+    @decorators.idempotent_id('515e3332-cce9-4a28-ad2e-96dbb2cc672e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_servers_with_host_filter(self):
         # Get list of share servers and remember 'host' name
@@ -124,6 +127,7 @@
         for server in servers:
             self.assertEqual(server["host"], host)
 
+    @decorators.idempotent_id('77a5c1c5-db2f-4ff6-872c-ed73a575acd0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_servers_with_status_filter(self):
         search_opts = {"status": "active"}
@@ -135,6 +139,7 @@
         for server in servers:
             self.assertEqual(server["status"], "active")
 
+    @decorators.idempotent_id('ed671cbb-7732-4966-9f1e-b997b8aa05ff')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_servers_with_project_id_filter(self):
         search_opts = {"project_id": self.share_network["project_id"]}
@@ -145,6 +150,7 @@
             self.assertEqual(server["project_id"],
                              self.share_network["project_id"])
 
+    @decorators.idempotent_id('70064129-df97-4dba-9482-2819558111ec')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_servers_with_share_network_name_filter(self):
         search_opts = {"share_network": self.share_network["name"]}
@@ -155,6 +161,7 @@
             self.assertEqual(server["share_network_name"],
                              self.share_network["name"])
 
+    @decorators.idempotent_id('f64e8024-eb42-4a4c-be6b-97d35633a019')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_share_servers_with_share_network_id_filter(self):
         search_opts = {"share_network": self.share_network["id"]}
@@ -165,6 +172,7 @@
             self.assertIn(server["share_network_name"],
                           self.sn_name_and_id)
 
+    @decorators.idempotent_id('e1af24f4-bf63-467d-a857-3a402fa9b65b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_show_share_server(self):
         share = self.shares_v2_client.get_share(self.share["id"])
@@ -203,6 +211,7 @@
         # 'backend_details' should be a dict
         self.assertIsInstance(server["backend_details"], dict)
 
+    @decorators.idempotent_id('782d8f5f-2c02-44dd-8d43-e06b651a71be')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_show_share_server_details(self):
         share = self.shares_v2_client.get_share(self.share['id'])
@@ -214,6 +223,7 @@
             self.assertIsInstance(k, six.string_types)
             self.assertIsInstance(v, six.string_types)
 
+    @decorators.idempotent_id('2fdf8d29-3ab8-4424-b684-6253f45b9666')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(True, False)
     @testtools.skipIf(CONF.share.share_network_id != "",
@@ -280,6 +290,7 @@
                 self.shares_v2_client.wait_for_resource_deletion(
                     sn_id=new_sn["id"])
 
+    @decorators.idempotent_id('960d49c5-f8d6-42be-aaf4-b7890a55df03')
     @testtools.skipIf(CONF.share.share_network_id != "",
                       "This test is not suitable for pre-existing "
                       "share_network.")
diff --git a/manila_tempest_tests/tests/api/admin/test_share_servers_manage.py b/manila_tempest_tests/tests/api/admin/test_share_servers_manage.py
index 7b037b3..fa9966e 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_servers_manage.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_servers_manage.py
@@ -16,6 +16,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -53,6 +54,7 @@
             cleanup_in_class=True,
             extra_specs=cls.extra_specs)
 
+    @decorators.idempotent_id('2bbe564d-d314-474b-8060-ada30581d0cd')
     @testtools.skipIf(CONF.share.share_network_id != "",
                       "This test is not suitable for pre-existing "
                       "share_network.")
diff --git a/manila_tempest_tests/tests/api/admin/test_share_servers_manage_negative.py b/manila_tempest_tests/tests/api/admin/test_share_servers_manage_negative.py
index e3a5608..0b04511 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_servers_manage_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_servers_manage_negative.py
@@ -16,6 +16,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -81,6 +82,7 @@
         ('share_network_subnet_id', 'invalid_share_network_subnet_id'),
     )
     @ddt.unpack
+    @decorators.idempotent_id('60b94091-f35d-42ac-a25a-ca1f7e66bb44')
     @testtools.skipIf(CONF.share.share_network_id != "",
                       "This test is not suitable for pre-existing "
                       "share_network.")
@@ -131,6 +133,7 @@
         # delete share server
         self._delete_share_server_and_wait(managed_share_server['id'])
 
+    @decorators.idempotent_id('0f21aebe-e983-4112-a494-b287293112d2')
     @testtools.skipIf(CONF.share.share_network_id != "",
                       "This test is not suitable for pre-existing "
                       "share_network.")
@@ -172,6 +175,7 @@
         # delete share server
         self._delete_share_server_and_wait(share['share_server_id'])
 
+    @decorators.idempotent_id('84f9a808-8bff-4652-8877-4c9f0dfeed8a')
     @testtools.skipIf(CONF.share.share_network_id != "",
                       "This test is not suitable for pre-existing "
                       "share_network.")
@@ -213,6 +217,7 @@
         # delete share server
         self._delete_share_server_and_wait(share['share_server_id'])
 
+    @decorators.idempotent_id('fbe6cf2d-3e33-40d8-b420-b785d3cb7559')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_share_server_reset_state_invalid_state(self):
 
@@ -232,6 +237,7 @@
         # delete share
         self._delete_share_and_wait(share)
 
+    @decorators.idempotent_id('c0a13fc4-9f30-483a-b473-0f0ce533f645')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_unmanage_share_server_with_share(self):
 
@@ -250,6 +256,7 @@
         # delete share
         self._delete_share_and_wait(share)
 
+    @decorators.idempotent_id('d2feb338-5c78-4370-b5ba-c8b16df63b43')
     @testtools.skipIf(CONF.share.share_network_id != "",
                       "This test is not suitable for pre-existing "
                       "share_network.")
@@ -299,6 +306,7 @@
         # delete share server
         self._delete_share_server_and_wait(managed_share_server['id'])
 
+    @decorators.idempotent_id('30606085-4b01-4489-a18c-22e67ed0e221')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_manage_share_server_double_manage(self):
 
diff --git a/manila_tempest_tests/tests/api/admin/test_share_servers_negative.py b/manila_tempest_tests/tests/api/admin/test_share_servers_negative.py
index e281914..8f2110d 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_servers_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_servers_negative.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -28,65 +29,76 @@
         cls.admin_client = cls.admin_shares_v2_client
         cls.member_client = cls.shares_v2_client
 
+    @decorators.idempotent_id('6d55516f-9018-4372-8310-f725c4562961')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_share_servers_with_member(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.member_client.list_share_servers)
 
+    @decorators.idempotent_id('d9021f06-c146-4e76-852e-8a1ebb3fa92e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_show_share_server_with_member(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.member_client.show_share_server,
                           'fake_id')
 
+    @decorators.idempotent_id('16b6f911-487e-4c25-9241-75de2dbfc8ff')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_show_share_server_details_with_member(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.member_client.show_share_server_details,
                           'fake_id')
 
+    @decorators.idempotent_id('f7580ef6-f7bb-4b52-ba45-82d2d2d66dbe')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_show_share_server_with_inexistent_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_client.show_share_server,
                           'fake_id')
 
+    @decorators.idempotent_id('368c5404-483e-4eee-bb80-86206d153ea2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_show_share_server_details_with_inexistent_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_client.show_share_server_details,
                           'fake_id')
 
+    @decorators.idempotent_id('664b5201-7ba9-4e33-9534-5307fc003e44')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_share_servers_with_wrong_filter_key(self):
         search_opts = {'fake_filter_key': 'ACTIVE'}
         servers = self.admin_client.list_share_servers(search_opts)
         self.assertEqual(0, len(servers))
 
+    @decorators.idempotent_id('dcf169c9-1238-40cb-8a5c-ca6aca9d4d6b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_share_servers_with_wrong_filter_value(self):
         search_opts = {'host': 123}
         servers = self.admin_client.list_share_servers(search_opts)
         self.assertEqual(0, len(servers))
 
+    @decorators.idempotent_id('3e5d6007-5214-4fa2-bd33-dfd3bead67bf')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_share_servers_with_fake_status(self):
         search_opts = {"status": data_utils.rand_name("fake_status")}
         servers = self.admin_client.list_share_servers(search_opts)
         self.assertEqual(0, len(servers))
 
+    @decorators.idempotent_id('e893b32a-124f-4e5c-a425-58c8a4eac4a5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_share_servers_with_fake_host(self):
         search_opts = {"host": data_utils.rand_name("fake_host")}
         servers = self.admin_client.list_share_servers(search_opts)
         self.assertEqual(0, len(servers))
 
+    @decorators.idempotent_id('2f1162a8-bb52-4e2a-abc0-68d16f769e4f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_share_servers_with_fake_project(self):
         search_opts = {"project_id": data_utils.rand_name("fake_project_id")}
         servers = self.admin_client.list_share_servers(search_opts)
         self.assertEqual(0, len(servers))
 
+    @decorators.idempotent_id('ca23f385-56b2-4c02-9797-d88c3b7fb981')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_share_servers_with_fake_share_network(self):
         search_opts = {
@@ -95,12 +107,14 @@
         servers = self.admin_client.list_share_servers(search_opts)
         self.assertEqual(0, len(servers))
 
+    @decorators.idempotent_id('0acb9107-18b2-4e9d-8432-37fd0d4c79b3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_share_server_with_nonexistent_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_client.delete_share_server,
                           "fake_nonexistent_share_server_id")
 
+    @decorators.idempotent_id('65e12bf7-2ec6-4a5b-971b-b1ecb67b77b7')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_share_server_with_member(self):
         self.assertRaises(lib_exc.Forbidden,
diff --git a/manila_tempest_tests/tests/api/admin/test_share_snapshot_instances.py b/manila_tempest_tests/tests/api/admin/test_share_snapshot_instances.py
index b8b859f..d09b25f 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_snapshot_instances.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_snapshot_instances.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -46,6 +47,7 @@
         cls.snapshot = cls.shares_v2_client.get_snapshot(snap['id'])
 
     @ddt.data(True, False)
+    @decorators.idempotent_id('bcb29129-9713-4481-8e74-97682c62f218')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_snapshot_instances_by_snapshot(self, detail):
         """Test that we get only the 1 snapshot instance from snapshot."""
@@ -78,6 +80,7 @@
             self.assertIn(key, expected_keys)
         self.assertEqual(len(expected_keys), len(si))
 
+    @decorators.idempotent_id('1d0bd333-300d-4af2-81eb-176b550f2c36')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_snapshot_instances(self):
         """Test that we get at least the snapshot instance."""
@@ -89,6 +92,7 @@
                self.snapshot['id'])
         self.assertIn(self.snapshot['id'], snapshot_ids, msg)
 
+    @decorators.idempotent_id('d21bf82d-2b3b-4061-8db5-502b7376a44d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_snapshot_instance(self):
         instances = self.shares_v2_client.list_snapshot_instances(
@@ -110,6 +114,7 @@
         self.assertEqual(self.snapshot['provider_location'],
                          instance_detail['provider_location'])
 
+    @decorators.idempotent_id('c7724848-4e17-4d28-801d-2ec77dfcf502')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_reset_snapshot_instance_status_and_delete(self):
         """Test resetting a snapshot instance's status attribute."""
diff --git a/manila_tempest_tests/tests/api/admin/test_share_snapshot_instances_negative.py b/manila_tempest_tests/tests/api/admin/test_share_snapshot_instances_negative.py
index 17d9bcc..730ce8b 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_snapshot_instances_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_snapshot_instances_negative.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -47,6 +48,7 @@
         cls.snapshot = cls.create_snapshot_wait_for_active(
             cls.share["id"], client=cls.admin_client)
 
+    @decorators.idempotent_id('6e371aac-ff8b-4eac-abc9-b8d777448ff3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_list_snapshot_instances_with_snapshot_by_non_admin(self):
         self.assertRaises(
@@ -54,6 +56,7 @@
             self.member_client.list_snapshot_instances,
             snapshot_id=self.snapshot['id'])
 
+    @decorators.idempotent_id('d80331e4-8738-46c7-b726-1e716acef738')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_snapshot_instance_by_non_admin(self):
         instances = self.admin_client.list_snapshot_instances(
@@ -63,6 +66,7 @@
             self.member_client.get_snapshot_instance,
             instance_id=instances[0]['id'])
 
+    @decorators.idempotent_id('666a6caf-31b0-45d9-808c-e590250cffd4')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_reset_snapshot_instance_status_by_non_admin(self):
         instances = self.admin_client.list_snapshot_instances(
@@ -90,12 +94,14 @@
         cls.admin_client = cls.admin_shares_v2_client
         cls.member_client = cls.shares_v2_client
 
+    @decorators.idempotent_id('abded04d-40c0-4eb9-b2be-58b4efb16244')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_snapshot_instance_with_non_existent_instance(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_client.get_snapshot_instance,
                           instance_id="nonexistent_instance")
 
+    @decorators.idempotent_id('1609702b-de87-4d12-9a9c-78077d4676f3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_snapshot_instances_by_non_admin(self):
         self.assertRaises(
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types.py b/manila_tempest_tests/tests/api/admin/test_share_types.py
index a4a093b..370e014 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types.py
@@ -16,6 +16,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -30,6 +31,7 @@
 @ddt.ddt
 class ShareTypesAdminTest(base.BaseSharesAdminTest):
 
+    @decorators.idempotent_id('34000fb9-b595-4a10-8306-7465f9ebc45d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_share_type_create_delete(self):
         name = data_utils.rand_name("tempest-manila")
@@ -66,6 +68,7 @@
         else:
             self.assertNotIn('description', share_type)
 
+    @decorators.idempotent_id('228d8bab-0b31-433e-956f-9db9877e6573')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('2.0', '2.6', '2.7', '2.40', '2.41')
     def test_share_type_create_get(self, version):
@@ -99,6 +102,7 @@
         self.assertDictMatch(get["volume_type"], get["share_type"])
 
     @base.skip_if_microversion_lt("2.50")
+    @decorators.idempotent_id('a9af19e1-e789-4c4f-a39b-dd8df6ed00b1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(
         ('2.50', data_utils.rand_name("type_updated"),
@@ -147,6 +151,7 @@
                 updated_st["share_type"]["share_type_access:is_public"])
 
     @base.skip_if_microversion_lt("2.50")
+    @decorators.idempotent_id('9019dc61-b2b1-472d-9b15-a3986439d4c3')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(
         ('2.50', None, '', None),
@@ -176,6 +181,7 @@
 
         self._verify_description(None, updated_st['share_type'], version)
 
+    @decorators.idempotent_id('5cc4c2e5-d2a4-4bfc-9208-3455ac551f20')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('2.0', '2.6', '2.7', '2.40', '2.41')
     def test_share_type_create_list(self, version):
@@ -208,6 +214,7 @@
         for i in range(len(sts)):
             self.assertDictMatch(sts[i], vts[i])
 
+    @decorators.idempotent_id('4e2ad320-9f3d-4797-a3ad-bf800bcd1831')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_with_share_type(self):
 
@@ -238,6 +245,7 @@
         self.assertEqual(st_create["share_type"]["id"], get["share_type"])
         self.assertEqual(shr_type_name, get["share_type_name"])
 
+    @decorators.idempotent_id('d2261a27-d4a4-4237-9fad-f6fd8f27783a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_private_share_type_access(self):
         name = data_utils.rand_name("tempest-manila")
@@ -286,6 +294,7 @@
         access = self.shares_v2_client.list_access_to_share_type(st_id)
         self.assertEmpty(access)
 
+    @decorators.idempotent_id('90dca5c5-f28e-4f16-90ed-78f5d725664e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(*set(('2.45', '2.46', LATEST_MICROVERSION)))
     def test_share_type_create_show_list_with_is_default_key(self, version):
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs.py b/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs.py
index f4c21b8..1855713 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs.py
@@ -18,6 +18,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -46,6 +47,7 @@
         cls.shares_client.create_share_type_extra_specs(
             cls.st_id, cls.custom_extra_specs)
 
+    @decorators.idempotent_id('d4cae104-838b-4248-8c9c-125165710786')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_get_one_share_type_extra_spec(self):
         es_get_one = self.shares_client.get_share_type_extra_spec(
@@ -53,6 +55,7 @@
 
         self.assertEqual({"key1": self.custom_extra_specs["key1"]}, es_get_one)
 
+    @decorators.idempotent_id('508ceb85-5456-4db9-b33f-00620d7baea1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_get_all_share_type_extra_specs(self):
         es_get_all = self.shares_client.get_share_type_extra_specs(self.st_id)
@@ -79,6 +82,7 @@
         self.shares_client.create_share_type_extra_specs(
             self.st_id, self.custom_extra_specs)
 
+    @decorators.idempotent_id('baba776b-1b05-42ca-a002-bff1f8f14e13')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_one_share_type_extra_spec(self):
         self.custom_extra_specs["key1"] = "fake_value1_updated"
@@ -93,6 +97,7 @@
         expected_extra_specs.update(self.required_extra_specs)
         self.assertEqual(self.custom_extra_specs, get)
 
+    @decorators.idempotent_id('374e7ff5-0d26-4778-bbb5-4ffd28521ad9')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_all_share_type_extra_specs(self):
         self.custom_extra_specs["key2"] = "value2_updated"
@@ -107,6 +112,7 @@
         expected_extra_specs.update(self.required_extra_specs)
         self.assertEqual(self.custom_extra_specs, get)
 
+    @decorators.idempotent_id('129db0ce-9a4f-4a40-994f-e492174e0661')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_delete_one_share_type_extra_spec(self):
         # Delete one extra spec for share type
@@ -117,6 +123,7 @@
 
         self.assertNotIn('key1', get)
 
+    @decorators.idempotent_id('1b9f501d-8f34-46d0-b318-83bdfed571ec')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(*set(['2.24', LATEST_MICROVERSION]))
     def test_delete_snapshot_support_extra_spec(self, version):
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs_negative.py b/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs_negative.py
index 262e387..8d2893c 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs_negative.py
@@ -16,6 +16,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -37,6 +38,7 @@
             extra_specs=extra_specs,
             client=self.admin_shares_v2_client)["share_type"]
 
+    @decorators.idempotent_id('195c1cc6-249a-4f82-b420-4901d2557b3a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_extra_specs_with_user(self):
         st = self._create_share_type()
@@ -46,6 +48,7 @@
             st["id"],
             self.add_extra_specs_to_dict({"key": "new_value"}))
 
+    @decorators.idempotent_id('dc883ec3-1bae-4ed7-8bf5-2cdc7027e37b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_extra_specs_with_user(self):
         st = self._create_share_type()
@@ -54,6 +57,7 @@
             self.shares_v2_client.get_share_type_extra_specs,
             st["id"])
 
+    @decorators.idempotent_id('1d3e687e-b2fb-4b96-8428-324ff881eea2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_extra_spec_with_user(self):
         st = self._create_share_type()
@@ -62,6 +66,7 @@
             self.shares_v2_client.get_share_type_extra_spec,
             st["id"], "key")
 
+    @decorators.idempotent_id('4c9505d9-d4ef-42fa-8410-8ab88ec0c852')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_extra_specs_with_user(self):
         st = self._create_share_type()
@@ -70,6 +75,7 @@
             self.shares_v2_client.get_share_type_extra_specs,
             st["id"])
 
+    @decorators.idempotent_id('36c5ada4-9efd-4f6a-b58d-24f08a2433ce')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_read_extra_specs_on_share_type_with_user(self):
         st = self._create_share_type()
@@ -88,6 +94,7 @@
                          'Incorrect extra specs visible to non-admin user; '
                          'expected %s, got %s' % (expected_keys, actual_keys))
 
+    @decorators.idempotent_id('62a9b77a-f796-4bd9-baf9-7c24b3f55560')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_extra_spec_with_user(self):
         st = self._create_share_type()
@@ -96,6 +103,7 @@
             self.shares_v2_client.update_share_type_extra_spec,
             st["id"], "key", "new_value")
 
+    @decorators.idempotent_id('207cec3c-8ed9-4d6d-8fc8-3aecaacdff93')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_extra_specs_with_user(self):
         st = self._create_share_type()
@@ -104,6 +112,7 @@
             self.shares_v2_client.update_share_type_extra_specs,
             st["id"], {"key": "new_value"})
 
+    @decorators.idempotent_id('3f43c5d0-23c5-4b76-98c7-a3f9adb33c89')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_extra_specs_with_user(self):
         st = self._create_share_type()
@@ -112,6 +121,7 @@
             self.shares_v2_client.delete_share_type_extra_spec,
             st["id"], "key")
 
+    @decorators.idempotent_id('d82a7bcc-1dc5-4ef8-87cd-f8dff1574adc')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_too_long_key(self):
         too_big_key = "k" * 256
@@ -122,6 +132,7 @@
             st["id"],
             self.add_extra_specs_to_dict({too_big_key: "value"}))
 
+    @decorators.idempotent_id('210faa88-8f2f-45f5-9bcf-54ce81d03788')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_too_long_value_with_creation(self):
         too_big_value = "v" * 256
@@ -132,6 +143,7 @@
             st["id"],
             self.add_extra_specs_to_dict({"key": too_big_value}))
 
+    @decorators.idempotent_id('890dceaa-22c4-4d2c-99ca-16ac8cdda33c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_too_long_value_with_update(self):
         too_big_value = "v" * 256
@@ -145,6 +157,7 @@
             st["id"],
             self.add_extra_specs_to_dict({"key": too_big_value}))
 
+    @decorators.idempotent_id('c512437e-6cfd-4545-859f-554955bd0fc9')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_set_too_long_value_with_update_of_one_key(self):
         too_big_value = "v" * 256
@@ -157,12 +170,14 @@
             self.admin_shares_v2_client.update_share_type_extra_spec,
             st["id"], "key", too_big_value)
 
+    @decorators.idempotent_id('938115f7-512e-49c3-a16a-a6498d6069bb')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_es_with_empty_shr_type_id(self):
         self.assertRaises(
             lib_exc.NotFound,
             self.admin_shares_v2_client.get_share_type_extra_specs, "")
 
+    @decorators.idempotent_id('65c3c528-008f-43f5-b367-8bd77cfab4a7')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_es_with_invalid_shr_type_id(self):
         self.assertRaises(
@@ -170,6 +185,7 @@
             self.admin_shares_v2_client.get_share_type_extra_specs,
             data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('430e0bed-9073-4822-8d0b-a3c55a8dfa31')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_es_with_empty_shr_type_id(self):
         self.assertRaises(
@@ -177,6 +193,7 @@
             self.admin_shares_v2_client.create_share_type_extra_specs,
             "", {"key1": "value1", })
 
+    @decorators.idempotent_id('7b43025d-b014-460f-9c9d-1004433fb798')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_es_with_invalid_shr_type_id(self):
         self.assertRaises(
@@ -184,6 +201,7 @@
             self.admin_shares_v2_client.create_share_type_extra_specs,
             data_utils.rand_name("fake"), {"key1": "value1", })
 
+    @decorators.idempotent_id('7b9bee14-5ca5-4110-a56a-b3030b6b3948')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_es_with_empty_specs(self):
         st = self._create_share_type()
@@ -192,6 +210,7 @@
             self.admin_shares_v2_client.create_share_type_extra_specs,
             st["id"], "")
 
+    @decorators.idempotent_id('7f199925-44d2-4d92-bedc-2636c07621fb')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_es_with_invalid_specs(self):
         st = self._create_share_type()
@@ -200,6 +219,7 @@
             self.admin_shares_v2_client.create_share_type_extra_specs,
             st["id"], {"": "value_with_empty_key"})
 
+    @decorators.idempotent_id('51241ed9-350b-4218-bfb0-c446d660d70b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_extra_spec_with_empty_key(self):
         st = self._create_share_type()
@@ -208,6 +228,7 @@
             self.admin_shares_v2_client.get_share_type_extra_spec,
             st["id"], "")
 
+    @decorators.idempotent_id('271d825b-2c57-429a-8dca-2cb9dd140dd0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_extra_spec_with_invalid_key(self):
         st = self._create_share_type()
@@ -216,6 +237,7 @@
             self.admin_shares_v2_client.get_share_type_extra_spec,
             st["id"], data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('cf07e7bc-cd3a-4c85-a848-786a60ba1f7d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_extra_specs_with_empty_shr_type_id(self):
         self.assertRaises(
@@ -223,6 +245,7 @@
             self.admin_shares_v2_client.get_share_type_extra_specs,
             "")
 
+    @decorators.idempotent_id('dfe6e34b-c86a-4cf6-9bf3-19de3a886b67')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_extra_specs_with_invalid_shr_type_id(self):
         self.assertRaises(
@@ -230,6 +253,7 @@
             self.admin_shares_v2_client.get_share_type_extra_specs,
             data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('0b8f6b51-0583-4b59-a851-9189db657a05')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_es_key_with_empty_shr_type_id(self):
         self.assertRaises(
@@ -237,6 +261,7 @@
             self.admin_shares_v2_client.delete_share_type_extra_spec,
             "", "key", )
 
+    @decorators.idempotent_id('9aa8fb2a-28a5-44b7-848b-9b49e1e9d670')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_es_key_with_invalid_shr_type_id(self):
         self.assertRaises(
@@ -244,6 +269,7 @@
             self.admin_shares_v2_client.delete_share_type_extra_spec,
             data_utils.rand_name("fake"), "key", )
 
+    @decorators.idempotent_id('cd68d020-24d2-4f68-8691-782b4815c1b0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_with_invalid_key(self):
         st = self._create_share_type()
@@ -252,6 +278,7 @@
             self.admin_shares_v2_client.delete_share_type_extra_spec,
             st["id"], data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('1ed5cbc9-21a8-45b7-8069-b7c0aaeede21')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_spec_with_empty_shr_type_id(self):
         self.assertRaises(
@@ -259,6 +286,7 @@
             self.admin_shares_v2_client.update_share_type_extra_spec,
             "", "key", "new_value")
 
+    @decorators.idempotent_id('704087fa-0397-4d9d-98b7-f9b081f64c86')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_spec_with_invalid_shr_type_id(self):
         self.assertRaises(
@@ -266,6 +294,7 @@
             self.admin_shares_v2_client.update_share_type_extra_spec,
             data_utils.rand_name("fake"), "key", "new_value")
 
+    @decorators.idempotent_id('eab96e92-9b95-44b0-89a2-e907a103039d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_spec_with_empty_key(self):
         st = self._create_share_type()
@@ -274,6 +303,7 @@
             self.admin_shares_v2_client.update_share_type_extra_spec,
             st["id"], "", "new_value")
 
+    @decorators.idempotent_id('70af1a8a-ab3e-4c8b-862d-8a36c2d47cb3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_with_invalid_shr_type_id(self):
         self.assertRaises(
@@ -281,6 +311,7 @@
             self.admin_shares_v2_client.update_share_type_extra_specs,
             data_utils.rand_name("fake"), {"key": "new_value"})
 
+    @decorators.idempotent_id('d2595594-eaad-43dc-b847-0a009a17d854')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_with_invalid_specs(self):
         st = self._create_share_type()
@@ -289,6 +320,7 @@
             self.admin_shares_v2_client.update_share_type_extra_specs,
             st["id"], {"": "new_value"})
 
+    @decorators.idempotent_id('6849eada-89a8-4009-a91d-87367621f9aa')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_spec_driver_handles_share_servers(self):
         st = self._create_share_type()
@@ -300,6 +332,7 @@
             st["id"],
             "driver_handles_share_servers")
 
+    @decorators.idempotent_id('6ea50e81-2c93-4258-8358-6f8d354a339a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data('2.0', '2.23')
     def test_try_delete_required_spec_snapshot_support_version(self, version):
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types_negative.py b/manila_tempest_tests/tests/api/admin/test_share_types_negative.py
index c828d37..8bf4cb1 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types_negative.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -32,12 +33,14 @@
             extra_specs=extra_specs,
             client=self.admin_shares_v2_client)["share_type"]
 
+    @decorators.idempotent_id('0efe4ed6-9318-4174-aef7-fca4b6aa6444')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_with_nonexistent_share_type(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_shares_v2_client.create_share,
                           share_type_id=data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('a1cd6c4f-4dc4-4f45-813b-f1cd3527c614')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_type_with_empty_name(self):
         self.assertRaises(
@@ -45,6 +48,7 @@
             self.create_share_type, '',
             client=self.admin_shares_v2_client)
 
+    @decorators.idempotent_id('ca59430b-d1fb-4e8f-b1e3-6ab6a6b40984')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_type_with_too_big_name(self):
         self.assertRaises(lib_exc.BadRequest,
@@ -52,6 +56,7 @@
                           "x" * 256,
                           client=self.admin_shares_v2_client)
 
+    @decorators.idempotent_id('42f7777a-7ee4-4622-80f8-8726b467c4db')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data('2.0', '2.6', '2.40')
     def test_create_share_type_with_description_in_wrong_version(
@@ -64,18 +69,21 @@
                           version=version,
                           client=self.admin_shares_v2_client)
 
+    @decorators.idempotent_id('43b0ef5a-3a05-4f74-a08e-57efebb7e66e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_share_type_by_nonexistent_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_shares_v2_client.get_share_type,
                           data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('27e00ad7-edc8-4d50-b53e-4da41dd8a5d3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_share_type_by_nonexistent_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.admin_shares_v2_client.delete_share_type,
                           data_utils.rand_name("fake"))
 
+    @decorators.idempotent_id('1f481bab-5205-49ee-bf01-b1848a32f9ee')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_duplicate_of_share_type(self):
         st = self._create_share_type()
@@ -85,6 +93,7 @@
                           extra_specs=self.add_extra_specs_to_dict(),
                           client=self.admin_shares_v2_client)
 
+    @decorators.idempotent_id('c13f54eb-17a4-4403-be87-f6a3ca18de6e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_share_type_allowed_for_public(self):
         st = self._create_share_type()
@@ -93,6 +102,7 @@
                           st["id"],
                           self.admin_shares_v2_client.tenant_id)
 
+    @decorators.idempotent_id('bf1d68fb-b954-4b3b-af54-115f3b67b3b3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_remove_share_type_allowed_for_public(self):
         st = self._create_share_type()
@@ -102,6 +112,7 @@
             st["id"],
             self.admin_shares_v2_client.tenant_id)
 
+    @decorators.idempotent_id('3d9a7e9d-2b64-422e-b8b6-88c3088564f6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_share_type_by_nonexistent_id(self):
         self.assertRaises(lib_exc.NotFound,
@@ -109,6 +120,7 @@
                           data_utils.rand_name("fake"),
                           self.admin_shares_v2_client.tenant_id)
 
+    @decorators.idempotent_id('13d5c3cd-15cd-4c2e-ace6-46889cf9e0e2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_remove_share_type_by_nonexistent_id(self):
         self.assertRaises(
diff --git a/manila_tempest_tests/tests/api/admin/test_shares_actions.py b/manila_tempest_tests/tests/api/admin/test_shares_actions.py
index f4ccfa4..d6b9d22 100644
--- a/manila_tempest_tests/tests/api/admin/test_shares_actions.py
+++ b/manila_tempest_tests/tests/api/admin/test_shares_actions.py
@@ -16,6 +16,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -80,6 +81,7 @@
                     share_type_id=cls.share_type_id,
                 ))
 
+    @decorators.idempotent_id('5f61f5dd-891e-478f-b102-803096820882')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share(self):
 
@@ -107,6 +109,7 @@
             CONF.share.share_size, share["size"])
         self.assertEqual(CONF.share.share_size, int(share["size"]), msg)
 
+    @decorators.idempotent_id('60d34573-8452-47ab-9455-0067bdd3ed9c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares(self):
 
@@ -123,6 +126,7 @@
             msg = "expected id lists %s times in share list" % (len(gen))
             self.assertEqual(1, len(gen), msg)
 
+    @decorators.idempotent_id('85f9438d-d3f6-4f3a-8134-e89915373df3')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail(self):
 
@@ -143,6 +147,7 @@
             msg = "expected id lists %s times in share list" % (len(gen))
             self.assertEqual(1, len(gen), msg)
 
+    @decorators.idempotent_id('47dad08b-0c36-428f-8ab9-5eba92ffc995')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_metadata(self):
         filters = {'metadata': self.metadata}
@@ -158,6 +163,7 @@
         if CONF.share.capability_create_share_from_snapshot_support:
             self.assertFalse(self.shares[1]['id'] in [s['id'] for s in shares])
 
+    @decorators.idempotent_id('d884c91e-88f5-4e42-83d9-ec3b440af893')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_extra_specs(self):
         filters = {
@@ -191,6 +197,7 @@
             extra_specs = self.shares_client.get_share_type_extra_specs(st_id)
             self.assertDictContainsSubset(filters["extra_specs"], extra_specs)
 
+    @decorators.idempotent_id('76fbe8ba-f1d3-4446-b9b8-55617762a2c7')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_share_type_id(self):
         filters = {'share_type_id': self.share_type_id}
@@ -221,6 +228,7 @@
         for share in self.shares:
             self.assertIn(share['id'], share_ids)
 
+    @decorators.idempotent_id('04afc330-78ee-494f-a660-7670c877a440')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_host(self):
         base_share = self.shares_client.get_share(self.shares[0]['id'])
@@ -237,6 +245,7 @@
     @base.skip_if_microversion_lt("2.35")
     @ddt.data(('path', True), ('id', True), ('path', False), ('id', False))
     @ddt.unpack
+    @decorators.idempotent_id('a27e5e3f-451f-4200-af38-99a562ccbe86')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_or_with_detail_filter_by_export_location(
             self, export_location_type, enable_detail):
@@ -260,6 +269,7 @@
         self.assertEqual(1, len(shares))
         self.assertEqual(self.shares[0]['id'], shares[0]['id'])
 
+    @decorators.idempotent_id('4582de51-1dcd-4c44-b550-eca9a9685038')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -276,6 +286,7 @@
             self.assertEqual(
                 filters['share_network_id'], share['share_network_id'])
 
+    @decorators.idempotent_id('645aebc4-55ac-406d-b7ab-5614c4fc12e6')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.capability_create_share_from_snapshot_support,
@@ -292,6 +303,7 @@
             self.assertEqual(filters['snapshot_id'], share['snapshot_id'])
         self.assertFalse(self.shares[0]['id'] in [s['id'] for s in shares])
 
+    @decorators.idempotent_id('87659cee-4692-412a-9bfe-06fc97d30ba0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_with_asc_sorting(self):
         filters = {'sort_key': 'created_at', 'sort_dir': 'asc'}
@@ -304,6 +316,7 @@
         sorted_list = [share['created_at'] for share in shares]
         self.assertEqual(sorted(sorted_list), sorted_list)
 
+    @decorators.idempotent_id('631f4226-f1ea-47b1-a472-8f12da2d05c4')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_existed_name(self):
         # list shares by name, at least one share is expected
@@ -311,6 +324,7 @@
         shares = self.shares_client.list_shares_with_detail(params)
         self.assertEqual(self.share_name, shares[0]["name"])
 
+    @decorators.idempotent_id('d0dae9e5-a826-48e4-b7b7-24b08ad5a7cb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_fake_name(self):
         # list shares by fake name, no shares are expected
@@ -318,6 +332,7 @@
         shares = self.shares_client.list_shares_with_detail(params)
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('8eac9b63-666f-4c52-8c5f-58b1fdf201e2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_active_status(self):
         # list shares by active status, at least one share is expected
@@ -327,6 +342,7 @@
         for share in shares:
             self.assertEqual(params["status"], share["status"])
 
+    @decorators.idempotent_id('e94f41c0-f6c4-4d77-b4f9-2c796c27e348')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_fake_status(self):
         # list shares by fake status, no shares are expected
@@ -334,6 +350,7 @@
         shares = self.shares_client.list_shares_with_detail(params)
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('d24a438e-4622-48ac-993e-a30d04746745')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -364,6 +381,7 @@
                                           get["share_id"]))
         self.assertEqual(self.shares[0]["id"], get["share_id"], msg)
 
+    @decorators.idempotent_id('9fae88a5-dd95-40ba-96e2-ac3694cf455f')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -381,6 +399,7 @@
         msg = "expected id lists %s times in share list" % (len(gen))
         self.assertEqual(1, len(gen), msg)
 
+    @decorators.idempotent_id('84013334-5985-4067-8b54-4c633f6022f3')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
diff --git a/manila_tempest_tests/tests/api/admin/test_snapshot_export_locations.py b/manila_tempest_tests/tests/api/admin/test_snapshot_export_locations.py
index a7b8641..0d27e21 100644
--- a/manila_tempest_tests/tests/api/admin/test_snapshot_export_locations.py
+++ b/manila_tempest_tests/tests/api/admin/test_snapshot_export_locations.py
@@ -17,6 +17,7 @@
 from oslo_utils import uuidutils
 import six
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -95,6 +96,7 @@
                 self.assertTrue(uuidutils.is_uuid_like(
                     export_location['share_snapshot_instance_id']))
 
+    @decorators.idempotent_id('18287f50-0e12-463d-906f-5c7cba256288')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_snapshot_export_location(self):
         export_locations = (
@@ -104,6 +106,7 @@
         for el in export_locations:
             self._verify_export_location_structure(el)
 
+    @decorators.idempotent_id('6272b60b-31a1-41c1-86f5-af28926898e6')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_snapshot_export_location(self):
         export_locations = (
@@ -115,6 +118,7 @@
                 self.snapshot['id'], export_location['id'])
             self._verify_export_location_structure(el, detail=True)
 
+    @decorators.idempotent_id('03be6418-5ba3-4919-a798-89d7e5ffb925')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_snapshot_instance_export_location(self):
         for snapshot_instance in self.snapshot_instances:
@@ -126,6 +130,7 @@
                     snapshot_instance['id'], el['id'])
                 self._verify_export_location_structure(el, detail=True)
 
+    @decorators.idempotent_id('cdf444ea-95a3-4f7b-ae48-6b027a6b9529')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_snapshot_contains_all_export_locations_of_all_snapshot_instances(
             self):
diff --git a/manila_tempest_tests/tests/api/admin/test_snapshot_export_locations_negative.py b/manila_tempest_tests/tests/api/admin/test_snapshot_export_locations_negative.py
index 10d6193..2c3a8c7 100644
--- a/manila_tempest_tests/tests/api/admin/test_snapshot_export_locations_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_snapshot_export_locations_negative.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -56,6 +57,7 @@
         cls.snapshot_instances = cls.admin_client.list_snapshot_instances(
             snapshot_id=cls.snapshot['id'])
 
+    @decorators.idempotent_id('53f0f184-7398-4e7a-ac21-fa432570db7f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_inexistent_snapshot_export_location(self):
         self.assertRaises(
@@ -65,6 +67,7 @@
             "fake-inexistent-snapshot-export-location-id",
         )
 
+    @decorators.idempotent_id('43229517-bf93-4be7-9f89-a69034d2f03c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_list_snapshot_export_locations_by_different_project_user(self):
         self.assertRaises(
@@ -73,6 +76,7 @@
             self.snapshot['id']
         )
 
+    @decorators.idempotent_id('66839514-796a-4ee9-a8ed-7614521d01d5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_snapshot_export_location_by_different_project_user(self):
         export_locations = (
@@ -88,6 +92,7 @@
                 self.snapshot['id'],
                 export_location['id'])
 
+    @decorators.idempotent_id('52e0b807-7b29-4795-960a-518bcadc1503')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_inexistent_snapshot_instance_export_location(self):
         for snapshot_instance in self.snapshot_instances:
@@ -98,6 +103,7 @@
                 "fake-inexistent-snapshot-export-location-id",
             )
 
+    @decorators.idempotent_id('3f4e2a0e-1522-47fb-b770-9d7a0651dde2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_snapshot_instance_export_location_by_member(self):
         for snapshot_instance in self.snapshot_instances:
@@ -133,6 +139,7 @@
         cls.admin_member_client = (
             cls.admin_project_member_client.shares_v2_client)
 
+    @decorators.idempotent_id('37901216-b574-4786-9b1d-9b1ccdf123d2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_export_locations_by_nonexistent_snapshot(self):
         self.assertRaises(
@@ -141,6 +148,7 @@
             "fake-inexistent-snapshot-id",
         )
 
+    @decorators.idempotent_id('c2aa3770-c061-4b49-83ac-ab29773c2e0c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_export_locations_by_nonexistent_snapshot_instance(self):
         self.assertRaises(
@@ -149,6 +157,7 @@
             "fake-inexistent-snapshot-instance-id",
         )
 
+    @decorators.idempotent_id('74d5d46d-8161-4e17-acbc-812248d6d694')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_inexistent_snapshot_instance_export_locations_by_member(
             self):
diff --git a/manila_tempest_tests/tests/api/admin/test_snapshot_manage.py b/manila_tempest_tests/tests/api/admin/test_snapshot_manage.py
index 5c57aa9..8e97887 100644
--- a/manila_tempest_tests/tests/api/admin/test_snapshot_manage.py
+++ b/manila_tempest_tests/tests/api/admin/test_snapshot_manage.py
@@ -16,14 +16,15 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 
 
@@ -130,6 +131,7 @@
                           self.shares_v2_client.get_snapshot,
                           get_snapshot['id'])
 
+    @decorators.idempotent_id('5fb65a19-fb73-4b5a-9210-010f93e0304f')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data('2.12', '2.16', CONF.share.max_api_microversion)
     def test_manage_different_versions(self, version):
diff --git a/manila_tempest_tests/tests/api/admin/test_snapshot_manage_negative.py b/manila_tempest_tests/tests/api/admin/test_snapshot_manage_negative.py
index 287654e..68ed242 100644
--- a/manila_tempest_tests/tests/api/admin/test_snapshot_manage_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_snapshot_manage_negative.py
@@ -16,6 +16,7 @@
 import six
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -64,6 +65,7 @@
             share_protocol=cls.protocol
         )
 
+    @decorators.idempotent_id('df7ac126-2c13-4902-b9c0-d103c71680ee')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_manage_not_found(self):
         # Manage non-existing snapshot fails
@@ -74,6 +76,7 @@
             'fake-provider-location',
         )
 
+    @decorators.idempotent_id('645a88f7-1eec-49a2-a232-757dc2112dd8')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_manage_already_exists(self):
         # Manage already existing snapshot fails
@@ -95,6 +98,7 @@
         # Delete snapshot
         self._delete_snapshot_and_wait(snap)
 
+    @decorators.idempotent_id('e94706f4-9c72-41f1-9ed4-09eb93d0b36f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_manage_invalid_provider_location(self):
         # Manage a snapshot with wrong provider location fails
@@ -133,6 +137,7 @@
         )
         self._delete_snapshot_and_wait(managed_snap)
 
+    @decorators.idempotent_id('d0049626-a524-4c8a-a58a-006ae2cdfea5')
     @testtools.skipUnless(CONF.share.multitenancy_enabled,
                           'Multitenancy tests are disabled.')
     @utils.skip_if_microversion_not_supported("2.48")
diff --git a/manila_tempest_tests/tests/api/admin/test_user_messages.py b/manila_tempest_tests/tests/api/admin/test_user_messages.py
index 83c5e37..80c992c 100644
--- a/manila_tempest_tests/tests/api/admin/test_user_messages.py
+++ b/manila_tempest_tests/tests/api/admin/test_user_messages.py
@@ -52,6 +52,7 @@
         self.message = self.create_user_message()
 
     @decorators.attr(type=[base.TAG_POSITIVE, base.TAG_API])
+    @decorators.idempotent_id('37127e11-7aa7-46b2-ab05-e3bf36d94fd8')
     def test_list_messages(self):
         body = self.shares_v2_client.list_messages()
         self.assertIsInstance(body, list)
@@ -60,6 +61,7 @@
         self.assertEqual(set(MESSAGE_KEYS), set(message.keys()))
 
     @decorators.attr(type=[base.TAG_POSITIVE, base.TAG_API])
+    @decorators.idempotent_id('ff938d3e-9cdd-470a-b091-d389be7be755')
     def test_list_messages_sorted_and_paginated(self):
         self.create_user_message()
         self.create_user_message()
@@ -77,6 +79,7 @@
         self.assertEqual(ids, sorted(ids))
 
     @decorators.attr(type=[base.TAG_POSITIVE, base.TAG_API])
+    @decorators.idempotent_id('292b0a2c-f066-48a6-9492-8dede87ee7b4')
     def test_list_messages_filtered(self):
         self.create_user_message()
         params = {'resource_id': self.message['resource_id']}
@@ -86,6 +89,7 @@
         self.assertEqual([self.message['id']], ids)
 
     @decorators.attr(type=[base.TAG_POSITIVE, base.TAG_API])
+    @decorators.idempotent_id('a92971c5-a72a-4de2-8e9b-dc612b798a7a')
     def test_show_message(self):
         self.addCleanup(self.shares_v2_client.delete_message,
                         self.message['id'])
@@ -110,6 +114,7 @@
         self.assertEqual(set(MESSAGE_KEYS), set(message.keys()))
 
     @decorators.attr(type=[base.TAG_POSITIVE, base.TAG_API])
+    @decorators.idempotent_id('88b2db98-8e33-4552-9225-c19a3b6f18e0')
     def test_delete_message(self):
         self.shares_v2_client.delete_message(self.message['id'])
         self.shares_v2_client.wait_for_resource_deletion(
@@ -117,6 +122,7 @@
 
     @decorators.attr(type=[base.TAG_POSITIVE, base.TAG_API])
     @base.skip_if_microversion_not_supported(QUERY_BY_TIMESTAMP_MICROVERSION)
+    @decorators.idempotent_id('2ed0c40e-cdaa-471b-97d4-5ebe3fb040e9')
     def test_list_messages_with_since_and_before_filters(self):
         new_message = self.create_user_message()
         created_at_1 = timeutils.parse_strtime(self.message['created_at'])
diff --git a/manila_tempest_tests/tests/api/admin/test_user_messages_negative.py b/manila_tempest_tests/tests/api/admin/test_user_messages_negative.py
index 7d77eec..d8fcd5d 100644
--- a/manila_tempest_tests/tests/api/admin/test_user_messages_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_user_messages_negative.py
@@ -36,24 +36,28 @@
         self.message = self.create_user_message()
 
     @decorators.attr(type=[base.TAG_NEGATIVE, base.TAG_API])
+    @decorators.idempotent_id('cb6c0dbd-a3cb-404b-a358-7cec3596aff4')
     def test_show_message_of_other_tenants(self):
         self.assertRaises(lib_exc.NotFound,
                           self.alt_shares_v2_client.get_message,
                           self.message['id'])
 
     @decorators.attr(type=[base.TAG_NEGATIVE, base.TAG_API])
+    @decorators.idempotent_id('f493a1f9-43e1-4a85-a673-8520d5a81f68')
     def test_show_nonexistent_message(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_v2_client.get_message,
                           six.text_type(uuidutils.generate_uuid()))
 
     @decorators.attr(type=[base.TAG_NEGATIVE, base.TAG_API])
+    @decorators.idempotent_id('2f5be1aa-974b-4f6a-ae3a-084578e64f82')
     def test_delete_message_of_other_tenants(self):
         self.assertRaises(lib_exc.NotFound,
                           self.alt_shares_v2_client.delete_message,
                           self.message['id'])
 
     @decorators.attr(type=[base.TAG_NEGATIVE, base.TAG_API])
+    @decorators.idempotent_id('9029cc9f-b904-4e58-b268-adf7a93cc1f1')
     def test_delete_nonexistent_message(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_v2_client.delete_message,
@@ -61,6 +65,7 @@
 
     @decorators.attr(type=[base.TAG_NEGATIVE, base.TAG_API])
     @base.skip_if_microversion_not_supported(QUERY_BY_TIMESTAMP_MICROVERSION)
+    @decorators.idempotent_id('03e80563-1a36-408e-baa8-0e3ed46f7a0a')
     def test_list_messages_with_invalid_time_format(self):
         params_key = ['created_since', 'created_before']
         for key in params_key:
diff --git a/manila_tempest_tests/tests/api/base.py b/manila_tempest_tests/tests/api/base.py
index e90852b..6bdc8e0 100755
--- a/manila_tempest_tests/tests/api/base.py
+++ b/manila_tempest_tests/tests/api/base.py
@@ -19,7 +19,6 @@
 
 from oslo_log import log
 import six
-
 from tempest import config
 from tempest.lib.common import cred_client
 from tempest.lib.common.utils import data_utils
@@ -31,6 +30,7 @@
 from manila_tempest_tests import share_exceptions
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 LOG = log.getLogger(__name__)
 
diff --git a/manila_tempest_tests/tests/api/test_access_rules_metadata.py b/manila_tempest_tests/tests/api/test_access_rules_metadata.py
index 1c2db41..bb6f7cd 100644
--- a/manila_tempest_tests/tests/api/test_access_rules_metadata.py
+++ b/manila_tempest_tests/tests/api/test_access_rules_metadata.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
@@ -76,6 +77,7 @@
             cls.share["id"], cls.access_type,
             cls.access_to[cls.access_type].pop(), 'rw', metadata=cls.md1)
 
+    @decorators.idempotent_id('4c8e0236-2e7b-4337-be3c-17b51a738644')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_set_get_delete_access_metadata(self):
         data = {"key1": "v" * 255, "k" * 255: "value2"}
@@ -102,6 +104,7 @@
         self.shares_v2_client.wait_for_resource_deletion(
             rule_id=access["id"], share_id=self.share["id"])
 
+    @decorators.idempotent_id('8c294d7d-0702-49ce-b964-0945ec323370')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_update_metadata_by_key(self):
         md2 = {"key7": "value7", "key2": "value6_new"}
@@ -116,6 +119,7 @@
         self.md1.update(md2)
         self.assertEqual(self.md1, get_access['metadata'])
 
+    @decorators.idempotent_id('c97cc976-2c2f-4db3-ba07-cd04af29c9f4')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_access_filter_by_metadata(self):
         data = {"key3": "v3", "key4": "value4"}
diff --git a/manila_tempest_tests/tests/api/test_access_rules_metadata_negative.py b/manila_tempest_tests/tests/api/test_access_rules_metadata_negative.py
index 4383a84..2c11a26 100644
--- a/manila_tempest_tests/tests/api/test_access_rules_metadata_negative.py
+++ b/manila_tempest_tests/tests/api/test_access_rules_metadata_negative.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -67,6 +68,7 @@
             cls.share["id"], cls.access_type, cls.access_to,
             'rw', metadata={u"key1": u"value1"})
 
+    @decorators.idempotent_id('d2d41db8-ae00-4641-a5ec-499cee1877f1')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data({'data': {"": "value"}}, {'data': {"k" * 256: "value"}},
               {'data': {"key": "x" * 1024}})
@@ -76,6 +78,7 @@
                           self.shares_v2_client.update_access_metadata,
                           self.access["id"], data)
 
+    @decorators.idempotent_id('53dc2752-687d-4895-bc9e-518c3bed29d0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_delete_unexisting_access_metadata(self):
         self.assertRaises(lib_exc.NotFound,
diff --git a/manila_tempest_tests/tests/api/test_availability_zones.py b/manila_tempest_tests/tests/api/test_availability_zones.py
index 0d87036..842d9e1 100644
--- a/manila_tempest_tests/tests/api/test_availability_zones.py
+++ b/manila_tempest_tests/tests/api/test_availability_zones.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -28,6 +29,7 @@
             for key in keys:
                 self.assertIn(key, az)
 
+    @decorators.idempotent_id('202f20d3-1afa-40ea-a5e6-8b7bda40e6cf')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_availability_zones_legacy_url_api_v1(self):
         # NOTE(vponomaryov): remove this test with removal of availability zone
@@ -35,6 +37,7 @@
         azs = self.shares_client.list_availability_zones()
         self._list_availability_zones_assertions(azs)
 
+    @decorators.idempotent_id('7054f2f4-bc77-4d60-82a6-2f23b93d281e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported("2.6")
     def test_list_availability_zones_legacy_url_api_v2(self):
@@ -44,6 +47,7 @@
             url='os-availability-zone', version='2.6')
         self._list_availability_zones_assertions(azs)
 
+    @decorators.idempotent_id('4caadb86-2988-4adb-b705-aece99235c1e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported("2.7")
     def test_list_availability_zones(self):
diff --git a/manila_tempest_tests/tests/api/test_availability_zones_negative.py b/manila_tempest_tests/tests/api/test_availability_zones_negative.py
index 95aa2d7..825dc54 100644
--- a/manila_tempest_tests/tests/api/test_availability_zones_negative.py
+++ b/manila_tempest_tests/tests/api/test_availability_zones_negative.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -27,6 +28,7 @@
         super(AvailabilityZonesNegativeTest, cls).skip_checks()
         utils.check_skip_if_microversion_not_supported('2.7')
 
+    @decorators.idempotent_id('050fa9fb-4cc8-4064-9e91-bb169fca03db')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_availability_zones_api_not_found_with_legacy_url(self):
         # NOTE(vponomaryov): remove this test with removal of availability zone
@@ -38,6 +40,7 @@
             version='2.7',
         )
 
+    @decorators.idempotent_id('133ffc40-bff1-491a-a230-189cddd66e29')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_availability_zones_api_not_found(self):
         self.assertRaises(
diff --git a/manila_tempest_tests/tests/api/test_extensions.py b/manila_tempest_tests/tests/api/test_extensions.py
index d60b861..bf866e3 100644
--- a/manila_tempest_tests/tests/api/test_extensions.py
+++ b/manila_tempest_tests/tests/api/test_extensions.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -20,6 +21,7 @@
 
 class ExtensionsTest(base.BaseSharesTest):
 
+    @decorators.idempotent_id('befd2105-c9f6-4eca-a693-9900eb0fb37a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_extensions(self):
 
diff --git a/manila_tempest_tests/tests/api/test_limits.py b/manila_tempest_tests/tests/api/test_limits.py
index 5f1f33d..c5d500f 100644
--- a/manila_tempest_tests/tests/api/test_limits.py
+++ b/manila_tempest_tests/tests/api/test_limits.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -20,6 +21,7 @@
 
 class ShareLimitsTest(base.BaseSharesTest):
 
+    @decorators.idempotent_id('239903d2-f1cb-4bec-b456-d57456308244')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_limits_keys(self):
 
@@ -44,6 +46,7 @@
         ]
         [self.assertIn(key, limits["absolute"].keys()) for key in abs_keys]
 
+    @decorators.idempotent_id('fea1a10e-6bcb-46eb-bbba-f6f0a8d4f377')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_limits_values(self):
 
diff --git a/manila_tempest_tests/tests/api/test_metadata.py b/manila_tempest_tests/tests/api/test_metadata.py
index bcea697..00e5e5d 100644
--- a/manila_tempest_tests/tests/api/test_metadata.py
+++ b/manila_tempest_tests/tests/api/test_metadata.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -30,6 +31,7 @@
         # create share
         cls.share = cls.create_share(share_type_id=cls.share_type_id)
 
+    @decorators.idempotent_id('9070249f-6e94-4a38-a036-08debee547c3')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_set_metadata_in_share_creation(self):
 
@@ -46,6 +48,7 @@
         # verify metadata
         self.assertEqual(md, metadata)
 
+    @decorators.idempotent_id('2725ab8e-cc04-4032-9393-74726ba43eb7')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_set_get_delete_metadata(self):
 
@@ -72,6 +75,7 @@
         get_metadata = self.shares_client.get_metadata(share["id"])
         self.assertEqual({}, get_metadata)
 
+    @decorators.idempotent_id('c94851f4-2559-4712-9297-9912db1da7ff')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_set_and_update_metadata_by_key(self):
 
@@ -94,6 +98,7 @@
         # verify metadata
         self.assertEqual(md2, get_md)
 
+    @decorators.idempotent_id('698ba406-493f-4c69-a093-273676fed438')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_set_metadata_min_size_key(self):
         data = {"k": "value"}
@@ -103,6 +108,7 @@
         body_get = self.shares_client.get_metadata(self.share["id"])
         self.assertEqual(data['k'], body_get.get('k'))
 
+    @decorators.idempotent_id('34c5bd96-ced7-42ef-a114-570cc63cf81d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_set_metadata_max_size_key(self):
         max_key = "k" * 255
@@ -114,6 +120,7 @@
         self.assertIn(max_key, body_get)
         self.assertEqual(data[max_key], body_get.get(max_key))
 
+    @decorators.idempotent_id('c776ab40-f75e-4d9f-abcf-a8f628a25991')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_set_metadata_min_size_value(self):
         data = {"key": "v"}
@@ -123,6 +130,7 @@
         body_get = self.shares_client.get_metadata(self.share["id"])
         self.assertEqual(data['key'], body_get['key'])
 
+    @decorators.idempotent_id('759ec4ab-2537-44ad-852b-1af85c6ca933')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_set_metadata_max_size_value(self):
         max_value = "v" * 1023
@@ -133,6 +141,7 @@
         body_get = self.shares_client.get_metadata(self.share["id"])
         self.assertEqual(data['key'], body_get['key'])
 
+    @decorators.idempotent_id('c5ca19ba-3595-414a-8ff9-fbc88cd801ba')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_upd_metadata_min_size_key(self):
         data = {"k": "value"}
@@ -142,6 +151,7 @@
         body_get = self.shares_client.get_metadata(self.share["id"])
         self.assertEqual(data, body_get)
 
+    @decorators.idempotent_id('5eff5619-b7cd-42f1-85e0-47d3d47098dd')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_upd_metadata_max_size_key(self):
         max_key = "k" * 255
@@ -152,6 +162,7 @@
         body_get = self.shares_client.get_metadata(self.share["id"])
         self.assertEqual(data, body_get)
 
+    @decorators.idempotent_id('44a572f1-6b5c-49d0-8f2e-1583ec3428d8')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_upd_metadata_min_size_value(self):
         data = {"key": "v"}
@@ -161,6 +172,7 @@
         body_get = self.shares_client.get_metadata(self.share["id"])
         self.assertEqual(data, body_get)
 
+    @decorators.idempotent_id('694d95e1-ba8c-49fc-a888-6f9f0d51d77d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_upd_metadata_max_size_value(self):
         max_value = "v" * 1023
diff --git a/manila_tempest_tests/tests/api/test_metadata_negative.py b/manila_tempest_tests/tests/api/test_metadata_negative.py
index dd3b330..efed9f3 100644
--- a/manila_tempest_tests/tests/api/test_metadata_negative.py
+++ b/manila_tempest_tests/tests/api/test_metadata_negative.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 import ddt
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -23,6 +24,7 @@
 @ddt.ddt
 class SharesMetadataAPIOnlyNegativeTest(base.BaseSharesTest):
 
+    @decorators.idempotent_id('22aecf50-0d98-4b97-82b8-599559f7692f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data(True, False)
     def test_try_set_metadata_to_unexisting_share(self, is_v2_client):
@@ -32,6 +34,7 @@
                           client.set_metadata,
                           "wrong_share_id", md)
 
+    @decorators.idempotent_id('7df0acd7-03f8-45c4-8c72-eb6932af70b1')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data(True, False)
     def test_try_update_all_metadata_for_unexisting_share(self, is_v2_client):
@@ -54,18 +57,21 @@
         # create share
         cls.share = cls.create_share(share_type_id=cls.share_type_id)
 
+    @decorators.idempotent_id('0cb7f160-4fa4-4d30-8a46-373ddae5844d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_set_metadata_with_empty_key(self):
         self.assertRaises(lib_exc.BadRequest,
                           self.shares_client.set_metadata,
                           self.share["id"], {"": "value"})
 
+    @decorators.idempotent_id('759ca34d-1c87-43f3-8da2-8e1d373049ac')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_upd_metadata_with_empty_key(self):
         self.assertRaises(lib_exc.BadRequest,
                           self.shares_client.update_all_metadata,
                           self.share["id"], {"": "value"})
 
+    @decorators.idempotent_id('94c7ebb3-14c3-4ff1-9839-ae3acb318cd0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_set_metadata_with_too_big_key(self):
         too_big_key = "x" * 256
@@ -74,6 +80,7 @@
                           self.shares_client.set_metadata,
                           self.share["id"], md)
 
+    @decorators.idempotent_id('33ef3047-6ca3-4547-a681-b52314382dcb')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_upd_metadata_with_too_big_key(self):
         too_big_key = "x" * 256
@@ -82,6 +89,7 @@
                           self.shares_client.update_all_metadata,
                           self.share["id"], md)
 
+    @decorators.idempotent_id('1114970a-1b45-4c56-b20a-e13e1764e3c4')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_set_metadata_with_too_big_value(self):
         too_big_value = "x" * 1024
@@ -90,6 +98,7 @@
                           self.shares_client.set_metadata,
                           self.share["id"], md)
 
+    @decorators.idempotent_id('c2eddcf0-cf81-4f9f-b06d-c9165ab8553e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_upd_metadata_with_too_big_value(self):
         too_big_value = "x" * 1024
@@ -98,12 +107,14 @@
                           self.shares_client.update_all_metadata,
                           self.share["id"], md)
 
+    @decorators.idempotent_id('14df3262-5a2b-4de4-b335-422329b22b07')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_delete_unexisting_metadata(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.delete_metadata,
                           self.share["id"], "wrong_key")
 
+    @decorators.idempotent_id('c6c70d55-7ed0-439f-ae34-f19af55361f6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(("foo.xml", False), ("foo.json", False),
               ("foo.xml", True), ("foo.json", True))
diff --git a/manila_tempest_tests/tests/api/test_microversions.py b/manila_tempest_tests/tests/api/test_microversions.py
index d62d35b..b314ff8 100644
--- a/manila_tempest_tests/tests/api/test_microversions.py
+++ b/manila_tempest_tests/tests/api/test_microversions.py
@@ -15,6 +15,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -33,6 +34,7 @@
     Sends HTTP GET requests to the version API to validate microversions.
     """
 
+    @decorators.idempotent_id('1b20943e-a398-49dd-a69d-513ce6ea01b4')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_microversions_root_version(self):
 
@@ -55,6 +57,7 @@
         self.assertEqual(_MIN_API_VERSION, v2.get('min_version'))
         self.assertNotIn(v2.get('version'), [None, ''])
 
+    @decorators.idempotent_id('6ccaae5f-2382-45a5-a844-6d31837beba8')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_microversions_v1_no_version(self):
 
@@ -73,6 +76,7 @@
         self.assertEqual('', version_list[0].get('min_version'))
         self.assertEqual('', version_list[0].get('version'))
 
+    @decorators.idempotent_id('7b7e4ddf-08bb-4764-a94f-5f377da3b2cb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_microversions_v1_with_version(self):
 
@@ -91,6 +95,7 @@
         self.assertEqual('', version_list[0].get('min_version'))
         self.assertEqual('', version_list[0].get('version'))
 
+    @decorators.idempotent_id('9a8bd7fd-f9d0-4fc6-8e1c-0178d87ec7c1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_microversions_v2_no_version(self):
 
@@ -110,6 +115,7 @@
         self.assertEqual(_MIN_API_VERSION, version_list[0].get('min_version'))
         self.assertNotIn(version_list[0].get('version'), [None, ''])
 
+    @decorators.idempotent_id('101574fd-9d47-4bd6-97f6-cde219f089ca')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_microversions_v2_min_version(self):
 
@@ -129,6 +135,7 @@
         self.assertEqual(_MIN_API_VERSION, version_list[0].get('min_version'))
         self.assertNotIn(version_list[0].get('version'), [None, ''])
 
+    @decorators.idempotent_id('e0766a36-b57c-46f8-b474-a38b74f3b9ed')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_microversions_v2_max_version(self):
 
@@ -148,6 +155,7 @@
         self.assertEqual(_MIN_API_VERSION, version_list[0].get('min_version'))
         self.assertNotIn(version_list[0].get('version'), [None, ''])
 
+    @decorators.idempotent_id('038ff428-edde-43ff-ae29-1b18676b61d5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_microversions_v2_invalid_version(self):
 
@@ -156,6 +164,7 @@
 
         self.assertEqual(400, resp.status)
 
+    @decorators.idempotent_id('0d82fc0b-d24d-4d07-ab43-bd0895ec0c4c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_microversions_v2_unacceptable_version(self):
 
diff --git a/manila_tempest_tests/tests/api/test_quotas.py b/manila_tempest_tests/tests/api/test_quotas.py
index 97780ad..958cb63 100644
--- a/manila_tempest_tests/tests/api/test_quotas.py
+++ b/manila_tempest_tests/tests/api/test_quotas.py
@@ -13,13 +13,16 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import ddt
 import itertools
-from manila_tempest_tests import utils
+
+import ddt
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
+from manila_tempest_tests import utils
+
 
 CONF = config.CONF
 PRE_SHARE_REPLICAS_MICROVERSION = "2.52"
@@ -38,6 +41,7 @@
         cls.user_id = cls.shares_v2_client.user_id
         cls.tenant_id = cls.shares_v2_client.tenant_id
 
+    @decorators.idempotent_id('a4649f11-41d0-4e73-ab5a-1466f2339b2f')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_default_quotas(self, client_name):
@@ -52,6 +56,7 @@
             self.assertGreater(int(quotas["share_replicas"]), -2)
             self.assertGreater(int(quotas["replica_gigabytes"]), -2)
 
+    @decorators.idempotent_id('19525293-2b32-48c3-a7cd-cab279ac4631')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_show_quotas(self, client_name):
@@ -66,6 +71,7 @@
             self.assertGreater(int(quotas["share_replicas"]), -2)
             self.assertGreater(int(quotas["replica_gigabytes"]), -2)
 
+    @decorators.idempotent_id('1e670af7-9734-42a8-97b7-3080526f3aca')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_show_quotas_for_user(self, client_name):
@@ -86,6 +92,7 @@
             ["2.25", "2.53", CONF.share.max_api_microversion]), (True, False))
     )
     @ddt.unpack
+    @decorators.idempotent_id('795614f6-4a18-47d5-b817-0b294e9d4c48')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_show_quotas_detail(self, microversion, with_user):
         self.skip_if_microversion_not_supported(microversion)
@@ -106,6 +113,7 @@
                 self.assertIn(inner, outer_keys)
                 self.assertGreater(int(quotas[outer][inner]), -2)
 
+    @decorators.idempotent_id('7bd5ac42-9fcb-477f-a253-02cde2bde661')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_not_supported(PRE_SHARE_REPLICAS_MICROVERSION)
     def test_quota_detail_2_52_no_share_replica_quotas(self):
diff --git a/manila_tempest_tests/tests/api/test_quotas_negative.py b/manila_tempest_tests/tests/api/test_quotas_negative.py
index 2e850fb..6b6f1b2 100644
--- a/manila_tempest_tests/tests/api/test_quotas_negative.py
+++ b/manila_tempest_tests/tests/api/test_quotas_negative.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -33,17 +34,20 @@
             raise cls.skipException(msg)
         super(SharesQuotasNegativeTest, cls).resource_setup()
 
+    @decorators.idempotent_id('d0dfe81d-8e8c-4847-a55f-95ba8a3d922c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_quotas_with_empty_tenant_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_v2_client.show_quotas, "")
 
+    @decorators.idempotent_id('e7dbc580-1857-4f88-8886-988dc2f2c7b9')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_reset_quotas_with_user(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.shares_v2_client.reset_quotas,
                           self.shares_v2_client.tenant_id)
 
+    @decorators.idempotent_id('f1c8e16f-5406-4389-a29c-547cca8a56e0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_quotas_with_user(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -52,6 +56,7 @@
                           shares=9)
 
     @ddt.data("2.6", "2.7", "2.24")
+    @decorators.idempotent_id('0f0033b3-357e-42e6-9c94-cac650e1cd50')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_quotas_detail_with_wrong_version(self, microversion):
         self.assertRaises(lib_exc.NotFound,
diff --git a/manila_tempest_tests/tests/api/test_replication.py b/manila_tempest_tests/tests/api/test_replication.py
index 08f73d1..5eb5e2a 100644
--- a/manila_tempest_tests/tests/api/test_replication.py
+++ b/manila_tempest_tests/tests/api/test_replication.py
@@ -15,6 +15,7 @@
 
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -151,6 +152,7 @@
             raise self.skipException(
                 msg % ','.join(constants.REPLICATION_PROMOTION_CHOICES))
 
+    @decorators.idempotent_id('8858617f-292d-4e5c-9e15-794b7f1b2e3c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_add_delete_share_replica(self):
         # Create the replica
@@ -159,6 +161,7 @@
         # Delete the replica
         self.delete_share_replica(share_replica["id"])
 
+    @decorators.idempotent_id('58c3faf4-6c97-4fec-9a9b-7cff0d2035cd')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -181,6 +184,7 @@
         # Delete subnet
         self.shares_v2_client.delete_subnet(self.sn_id, subnet['id'])
 
+    @decorators.idempotent_id('00e12b41-b95d-494a-99be-e584aae10f5c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_add_access_rule_create_replica_delete_rule(self):
         # Add access rule to the share
@@ -204,6 +208,7 @@
         self.shares_v2_client.wait_for_resource_deletion(
             rule_id=rule["id"], share_id=self.shares[0]['id'])
 
+    @decorators.idempotent_id('3af3f19a-1195-464e-870b-1a3918914f1b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_create_replica_add_access_rule_delete_replica(self):
         access_type, access_to = self._get_access_rule_data_from_config()
@@ -221,6 +226,7 @@
         # Delete the replica
         self.delete_share_replica(share_replica["id"])
 
+    @decorators.idempotent_id('a542c179-ea41-4bc0-bd80-e06eaddf5253')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(CONF.share.run_multiple_share_replicas_tests,
                           'Multiple share replicas tests are disabled.')
@@ -252,6 +258,7 @@
         self.assertIn(share_replica1["id"], replica_ids)
         self.assertIn(share_replica2["id"], replica_ids)
 
+    @decorators.idempotent_id('98b7c1d6-02e8-425a-b697-db2d2671fa11')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_promote_in_sync_share_replica(self):
         # Test promote 'in_sync' share_replica to 'active' state
@@ -261,6 +268,7 @@
             share["id"])[0]
         self._verify_in_sync_replica_promotion(share, original_replica)
 
+    @decorators.idempotent_id('3af912f4-b5d7-4241-b2b3-bdf12ff398a4')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_add_rule_promote_share_replica_verify_rule(self):
         # Verify the access rule stays intact after share replica promotion
@@ -285,6 +293,7 @@
         self.assertEqual(access_to, rules_list[0]["access_to"])
         self.assertEqual('ro', rules_list[0]["access_level"])
 
+    @decorators.idempotent_id('7904e3c7-e6d0-472d-b9c9-c0772b4f9f1b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.48")
     def test_share_type_azs_share_replicas(self):
@@ -307,6 +316,7 @@
         self.assertIn(share['availability_zone'], self.zones)
         self.assertIn(replica['availability_zone'], self.zones)
 
+    @decorators.idempotent_id('b5ade58b-cb81-47eb-966b-28e6d85b5568')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_promote_and_promote_back(self):
         # Test promote back and forth between 2 share replicas
@@ -345,6 +355,7 @@
             new_replica['id'], constants.REPLICATION_STATE_IN_SYNC,
             status_attr='replica_state')
 
+    @decorators.idempotent_id('1452156b-75a5-4f3c-a921-834732a03b0a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_active_replication_state(self):
         # Verify the replica_state of first instance is set to active.
@@ -439,6 +450,7 @@
                 replica['id'], len(replica_id_list))
             self.assertEqual(1, len(replica_id_list), msg)
 
+    @decorators.idempotent_id('abe0e49d-0b94-4b81-a220-ab047712492d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_show_share_replica(self):
         replica = self.shares_v2_client.get_share_replica(self.replica1["id"])
@@ -450,6 +462,7 @@
                          'expected %s, got %s.' % (replica["id"],
                                                    detail_keys, actual_keys))
 
+    @decorators.idempotent_id('f5225fb7-fcbe-4825-bf5b-0e11c2d26e03')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_detail_list_share_replicas_for_share(self):
         # List replicas for share
@@ -462,6 +475,7 @@
         # Verify keys
         self._validate_replica_list(replica_list)
 
+    @decorators.idempotent_id('e39aeb5d-fe4b-4896-8615-e6e7290bcb56')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_detail_list_share_replicas_for_all_shares(self):
         # List replicas for all available shares
@@ -474,6 +488,7 @@
         # Verify keys
         self._validate_replica_list(replica_list)
 
+    @decorators.idempotent_id('8d11848a-7766-41e5-af09-6121e5bad447')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_summary_list_share_replicas_for_all_shares(self):
         # List replicas
diff --git a/manila_tempest_tests/tests/api/test_replication_export_locations.py b/manila_tempest_tests/tests/api/test_replication_export_locations.py
index a99ee55..55ea475 100644
--- a/manila_tempest_tests/tests/api/test_replication_export_locations.py
+++ b/manila_tempest_tests/tests/api/test_replication_export_locations.py
@@ -13,6 +13,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -118,6 +119,7 @@
         for export in expected_exports:
             self.assertIn(export['path'], share_export_paths)
 
+    @decorators.idempotent_id('da22cfb8-7dd8-4bf1-87fc-a1f7b51ebf8e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(*set(['2.46', '2.47', LATEST_MICROVERSION]))
     def test_replicated_share_export_locations(self, version):
@@ -135,6 +137,7 @@
                                                     primary_replica_exports,
                                                     share_exports, version)
 
+    @decorators.idempotent_id('58430f57-c6eb-44e2-9583-eecb1dd10594')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(*set(['2.46', '2.47', LATEST_MICROVERSION]))
     @testtools.skipUnless(
@@ -184,6 +187,7 @@
         # Delete the secondary (the 'active' replica before promotion)
         self.delete_share_replica(primary_replica['id'])
 
+    @decorators.idempotent_id('10ab6304-a1cd-4e60-90e3-7f9358b8808a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.47')
     def test_replica_export_locations(self):
diff --git a/manila_tempest_tests/tests/api/test_replication_export_locations_negative.py b/manila_tempest_tests/tests/api/test_replication_export_locations_negative.py
index 3d18fae..eb0530c 100644
--- a/manila_tempest_tests/tests/api/test_replication_export_locations_negative.py
+++ b/manila_tempest_tests/tests/api/test_replication_export_locations_negative.py
@@ -12,6 +12,7 @@
 
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -63,6 +64,7 @@
         cls.share_zone = cls.zones[0]
         cls.replica_zone = cls.zones[-1]
 
+    @decorators.idempotent_id('7a6318c2-71e9-45d2-aafe-5dcc0810a14a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.47')
     @testtools.skipUnless(
@@ -85,6 +87,7 @@
                               self.shares_v2_client.get_share_export_location,
                               share['id'], export['id'])
 
+    @decorators.idempotent_id('f1b89548-4da7-4ce1-a3c0-363a6c1ea726')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.47')
     def test_get_replica_export_location_for_non_replica(self):
@@ -101,6 +104,7 @@
                 self.shares_v2_client.list_share_replica_export_locations,
                 instance['id'])
 
+    @decorators.idempotent_id('f60d7eec-ec29-4767-985f-ff8c9e771cae')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @utils.skip_if_microversion_not_supported('2.47')
     def test_list_replica_export_locations_for_invalid_replica(self):
@@ -110,6 +114,7 @@
             self.shares_v2_client.list_share_replica_export_locations,
             'invalid-replica-id')
 
+    @decorators.idempotent_id('29ec890e-e324-4487-b2e3-f87642b6a58d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.47')
     def test_get_replica_export_location_for_invalid_export_id(self):
diff --git a/manila_tempest_tests/tests/api/test_replication_negative.py b/manila_tempest_tests/tests/api/test_replication_negative.py
index 2d66d38..c437737 100644
--- a/manila_tempest_tests/tests/api/test_replication_negative.py
+++ b/manila_tempest_tests/tests/api/test_replication_negative.py
@@ -15,6 +15,7 @@
 
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -89,6 +90,7 @@
             raise self.skipException(
                 msg % ','.join(constants.REPLICATION_PROMOTION_CHOICES))
 
+    @decorators.idempotent_id('90c5947d-b857-406c-b7dc-7010cbee6482')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_add_replica_to_share_with_no_replication_share_type(self):
         # Create share without replication type
@@ -103,6 +105,7 @@
                           share['id'],
                           self.replica_zone)
 
+    @decorators.idempotent_id('d14ba73e-4f13-451e-86d5-ffeb188e51b7')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_add_replica_to_share_with_error_state(self):
         # Set "error" state
@@ -116,12 +119,14 @@
                           self.share1['id'],
                           self.replica_zone)
 
+    @decorators.idempotent_id('94b41c28-e7a9-4f19-9315-4a57210141af')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_delete_last_active_replica(self):
         self.assertRaises(lib_exc.BadRequest,
                           self.shares_v2_client.delete_share_replica,
                           self.instance_id1)
 
+    @decorators.idempotent_id('6fbf984d-4efa-41d7-88bf-11ef2f078c02')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_try_delete_share_having_replica(self):
         self.create_share_replica(self.share1["id"], self.replica_zone,
@@ -130,6 +135,7 @@
                           self.shares_v2_client.delete_share,
                           self.share1["id"])
 
+    @decorators.idempotent_id('b9c2e57b-f1ae-475c-9d0b-df75dbe93b61')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_promote_out_of_sync_share_replica(self):
         # Test promoting an out_of_sync share_replica to active state
@@ -148,6 +154,7 @@
                           self.shares_v2_client.promote_share_replica,
                           replica['id'])
 
+    @decorators.idempotent_id('e525c3d0-9f45-489f-8e78-ed9e3ac540f7')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_promote_active_share_replica(self):
         # Test promote active share_replica
@@ -157,6 +164,7 @@
         self.shares_v2_client.promote_share_replica(self.instance_id1,
                                                     expected_status=200)
 
+    @decorators.idempotent_id('37dc3f7e-5a36-4020-ae1b-3c5e6771f024')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_promote_share_replica_for_writable_share_type(self):
         # Test promote active share_replica for writable share
@@ -174,6 +182,7 @@
         # Try promoting the replica
         self.shares_v2_client.promote_share_replica(replica['id'])
 
+    @decorators.idempotent_id('600a13d2-5cf0-482e-97af-9f598b55a407')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_add_access_rule_share_replica_error_status(self):
         access_type, access_to = self._get_access_rule_data_from_config()
@@ -190,6 +199,7 @@
                           self.admin_client.create_access_rule,
                           self.share1["id"], access_type, access_to, 'ro')
 
+    @decorators.idempotent_id('91b93b71-4048-412b-bb42-0fe88edfb987')
     @testtools.skipUnless(CONF.share.run_host_assisted_migration_tests or
                           CONF.share.run_driver_assisted_migration_tests,
                           "Share migration tests are disabled.")
@@ -211,6 +221,7 @@
             lib_exc.Conflict, self.admin_client.migrate_share,
             self.share1['id'], dest_host)
 
+    @decorators.idempotent_id('bf01bcfc-57cb-4e56-957f-8aa9f1b9be1b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.48")
     def test_try_add_replica_share_type_azs_unsupported_az(self):
@@ -224,6 +235,7 @@
                           self.share1['id'],
                           self.replica_zone)
 
+    @decorators.idempotent_id('97fc5ab3-c6e2-4da4-ae45-08d458a5ba0c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -255,12 +267,14 @@
 
         utils.check_skip_if_microversion_lt(_MIN_SUPPORTED_MICROVERSION)
 
+    @decorators.idempotent_id('72395c9b-4432-4a8b-84b4-60303e6bc962')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_replica_by_nonexistent_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_v2_client.get_share_replica,
                           data_utils.rand_uuid())
 
+    @decorators.idempotent_id('41d45772-e021-4404-a991-85f7a6e6431b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_replica_by_nonexistent_id(self):
         self.assertRaises(lib_exc.NotFound,
diff --git a/manila_tempest_tests/tests/api/test_replication_snapshots.py b/manila_tempest_tests/tests/api/test_replication_snapshots.py
index 605275c..a812679 100644
--- a/manila_tempest_tests/tests/api/test_replication_snapshots.py
+++ b/manila_tempest_tests/tests/api/test_replication_snapshots.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -66,6 +67,7 @@
         cls.share_zone = cls.zones[0]
         cls.replica_zone = cls.zones[-1]
 
+    @decorators.idempotent_id('67fce02a-1d46-4186-8260-69e30b26195d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_snapshot_after_share_replica(self):
         """Test the snapshot for replicated share.
@@ -100,6 +102,7 @@
                               snapshot_id=snapshot['id'],
                               share_network_id=self.sn_id)
 
+    @decorators.idempotent_id('ced8920b-6e3a-4bb4-9b3d-86e54377fcb7')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_snapshot_before_share_replica(self):
         """Test the snapshot for replicated share.
@@ -138,6 +141,7 @@
                               snapshot_id=snapshot['id'],
                               share_network_id=self.sn_id)
 
+    @decorators.idempotent_id('a5372844-69ad-40e1-bbf3-265eb66af123')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_snapshot_before_and_after_share_replica(self):
         """Test the snapshot for replicated share.
@@ -187,6 +191,7 @@
                               snapshot_id=snapshot2['id'],
                               share_network_id=self.sn_id)
 
+    @decorators.idempotent_id('b4cd376b-1eb8-4780-801a-64b0c3bee1e4')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_delete_snapshot_after_adding_replica(self):
         """Verify the snapshot delete.
@@ -208,6 +213,7 @@
         self.shares_v2_client.wait_for_resource_deletion(
             snapshot_id=snapshot["id"])
 
+    @decorators.idempotent_id('913056a7-d897-4a1b-a7be-b2b2cf5d9572')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(
         CONF.share.capability_create_share_from_snapshot_support,
diff --git a/manila_tempest_tests/tests/api/test_revert_to_snapshot.py b/manila_tempest_tests/tests/api/test_revert_to_snapshot.py
index ea9e5dd..6a915c6 100644
--- a/manila_tempest_tests/tests/api/test_revert_to_snapshot.py
+++ b/manila_tempest_tests/tests/api/test_revert_to_snapshot.py
@@ -14,9 +14,9 @@
 #    under the License.
 
 import ddt
-
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
@@ -24,6 +24,7 @@
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 
 
@@ -101,6 +102,7 @@
                     cls.shares_v2_client.share_network_id)
                 cls.sn_id = cls.share_network['id']
 
+    @decorators.idempotent_id('196f2bc5-e13a-4730-ac51-61e339068a06')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(
         *{constants.REVERT_TO_SNAPSHOT_MICROVERSION,
@@ -116,6 +118,7 @@
         self.shares_v2_client.wait_for_share_status(self.share['id'],
                                                     constants.STATUS_AVAILABLE)
 
+    @decorators.idempotent_id('09bd9942-7ef9-4d24-b2dd-f83bdda27b50')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(
         *{constants.REVERT_TO_SNAPSHOT_MICROVERSION,
@@ -137,6 +140,7 @@
         self.shares_v2_client.wait_for_share_status(self.share['id'],
                                                     constants.STATUS_AVAILABLE)
 
+    @decorators.idempotent_id('146de138-d351-49dc-a13a-5cdbed40b9ac')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @tc.skipUnless(CONF.share.run_replication_tests,
                    'Replication tests are disabled.')
diff --git a/manila_tempest_tests/tests/api/test_revert_to_snapshot_negative.py b/manila_tempest_tests/tests/api/test_revert_to_snapshot_negative.py
index 34b0530..bc01f00 100644
--- a/manila_tempest_tests/tests/api/test_revert_to_snapshot_negative.py
+++ b/manila_tempest_tests/tests/api/test_revert_to_snapshot_negative.py
@@ -14,9 +14,9 @@
 #    under the License.
 
 import ddt
-
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions
 from testtools import testcase as tc
 
@@ -24,6 +24,7 @@
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 
 
@@ -73,6 +74,7 @@
         cls.share = cls.create_share(share_type_id=cls.st_id)
         cls.share2 = cls.create_share(share_type_id=cls.st_id)
 
+    @decorators.idempotent_id('21dd8561-8913-42a2-a95c-74b536964c94')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *{constants.REVERT_TO_SNAPSHOT_MICROVERSION,
@@ -90,6 +92,7 @@
                           snapshot1['id'],
                           version=version)
 
+    @decorators.idempotent_id('7360ee16-ac7d-46ce-9c81-251d64fb7434')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *{constants.REVERT_TO_SNAPSHOT_MICROVERSION,
@@ -109,6 +112,7 @@
                           snapshot['id'],
                           version=version)
 
+    @decorators.idempotent_id('108a451e-a8e9-450f-8f75-53883d58c6be')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *{constants.REVERT_TO_SNAPSHOT_MICROVERSION,
@@ -133,6 +137,7 @@
                           snapshot['id'],
                           version=version)
 
+    @decorators.idempotent_id('29024057-dbbd-4cf6-a796-207dfbd4c3ff')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *{constants.REVERT_TO_SNAPSHOT_MICROVERSION,
@@ -145,6 +150,7 @@
                           self.share['id'],
                           version=version)
 
+    @decorators.idempotent_id('ef706fad-5ac4-41dc-af81-5aa0331560cf')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *{constants.REVERT_TO_SNAPSHOT_MICROVERSION,
diff --git a/manila_tempest_tests/tests/api/test_rules.py b/manila_tempest_tests/tests/api/test_rules.py
index 337eca8..71bdd06 100644
--- a/manila_tempest_tests/tests/api/test_rules.py
+++ b/manila_tempest_tests/tests/api/test_rules.py
@@ -13,10 +13,11 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import itertools
 
 import ddt
-import itertools
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -24,6 +25,7 @@
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 LATEST_MICROVERSION = CONF.share.max_api_microversion
 
@@ -101,6 +103,7 @@
         cls.access_type = "ip"
         cls.access_to = "2.2.2.2"
 
+    @decorators.idempotent_id('3390df2d-f6f8-4634-a562-87c1be994f6a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(*itertools.chain(
         itertools.product({'1.0', '2.9', '2.37', LATEST_MICROVERSION}, {4}),
@@ -155,6 +158,7 @@
             self.shares_v2_client.wait_for_resource_deletion(
                 rule_id=rule["id"], share_id=self.share['id'], version=version)
 
+    @decorators.idempotent_id('5d25168a-d646-443e-8cf1-3151eb7887f5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(*itertools.chain(
         itertools.product({'1.0', '2.9', '2.37', LATEST_MICROVERSION}, {4}),
@@ -207,6 +211,7 @@
             self.shares_v2_client.wait_for_resource_deletion(
                 rule_id=rule["id"], share_id=self.share['id'], version=version)
 
+    @decorators.idempotent_id('187a4fb0-ba1d-45b9-83c9-f0272e7e6f3e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipIf(
         "nfs" not in CONF.share.enable_ro_access_level_for_protocols,
@@ -220,6 +225,7 @@
 class ShareIpRulesForCIFSTest(ShareIpRulesForNFSTest):
     protocol = "cifs"
 
+    @decorators.idempotent_id('8fa0a15f-c04c-4521-91e7-020943bede8a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipIf(
         "cifs" not in CONF.share.enable_ro_access_level_for_protocols,
@@ -257,6 +263,7 @@
         cls.access_type = "user"
         cls.access_to = CONF.share.username_for_user_rules
 
+    @decorators.idempotent_id('1f87565f-c3d9-448d-b89a-387d6c2fdae6')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(*set(['1.0', '2.9', '2.27', '2.28', LATEST_MICROVERSION]))
     def test_create_delete_user_rule(self, version):
@@ -302,6 +309,7 @@
             self.shares_v2_client.wait_for_resource_deletion(
                 rule_id=rule["id"], share_id=self.share['id'], version=version)
 
+    @decorators.idempotent_id('ccb08342-b7ef-4dda-84ba-8de9879d8862')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipIf(
         "nfs" not in CONF.share.enable_ro_access_level_for_protocols,
@@ -315,6 +323,7 @@
 class ShareUserRulesForCIFSTest(ShareUserRulesForNFSTest):
     protocol = "cifs"
 
+    @decorators.idempotent_id('ee11084d-6c1d-4856-8044-9aa9e6c670fb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipIf(
         "cifs" not in CONF.share.enable_ro_access_level_for_protocols,
@@ -353,6 +362,7 @@
         # certificate that it possesses.
         cls.access_to = "client1.com"
 
+    @decorators.idempotent_id('775ebc55-4a4d-4012-a030-2eeb7b6d2ce8')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(*set(['1.0', '2.9', '2.27', '2.28', LATEST_MICROVERSION]))
     def test_create_delete_cert_rule(self, version):
@@ -398,6 +408,7 @@
             self.shares_v2_client.wait_for_resource_deletion(
                 rule_id=rule["id"], share_id=self.share['id'], version=version)
 
+    @decorators.idempotent_id('cdd93d8e-7255-4ed4-8ef0-929a62bb302c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipIf(
         "glusterfs" not in CONF.share.enable_ro_access_level_for_protocols,
@@ -473,6 +484,7 @@
         # Provide access to a client identified by a cephx auth id.
         cls.access_to = "bob"
 
+    @decorators.idempotent_id('4e636fd2-26ef-4b63-96eb-77860a8b6cdf')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data(*itertools.product(
         set(['2.13', '2.27', '2.28', LATEST_MICROVERSION]),
@@ -495,6 +507,7 @@
         self.shares_v2_client.wait_for_resource_deletion(
             rule_id=rule["id"], share_id=self.share['id'])
 
+    @decorators.idempotent_id('ad907303-a439-4fcb-8845-fe91ecab7dc2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_different_users_in_same_tenant_can_use_same_cephx_id(self):
         # Grant access to the share
@@ -555,6 +568,7 @@
         cls.share_type_id = cls.share_type['id']
         cls.share = cls.create_share(share_type_id=cls.share_type_id)
 
+    @decorators.idempotent_id('c52e95cc-d6ea-4d02-9b52-cd7c1913dfff')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(*set(
         ['1.0', '2.9', '2.27', '2.28', '2.45', LATEST_MICROVERSION]))
@@ -648,6 +662,7 @@
             self.shares_v2_client.wait_for_resource_deletion(
                 rule_id=rule["id"], share_id=self.share['id'], version=version)
 
+    @decorators.idempotent_id('b77bcbda-9754-48f0-9be6-79341ad1af64')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(*set(['1.0', '2.9', '2.27', '2.28', LATEST_MICROVERSION]))
     def test_access_rules_deleted_if_share_deleted(self, version):
diff --git a/manila_tempest_tests/tests/api/test_rules_negative.py b/manila_tempest_tests/tests/api/test_rules_negative.py
index 2f33ee1..63ffb91 100644
--- a/manila_tempest_tests/tests/api/test_rules_negative.py
+++ b/manila_tempest_tests/tests/api/test_rules_negative.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -54,6 +55,7 @@
             # create snapshot
             cls.snap = cls.create_snapshot_wait_for_active(cls.share["id"])
 
+    @decorators.idempotent_id('16781b45-d2bb-4891-aa97-c28c0769d5bd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('1.2.3.256',
               '1.1.1.-',
@@ -73,6 +75,7 @@
                               getattr(self, client_name).create_access_rule,
                               self.share["id"], "ip", ip_address)
 
+    @decorators.idempotent_id('e891deff-23d9-4872-911c-bd9b43dc797f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_with_wrong_level(self, client_name):
@@ -83,6 +86,7 @@
                           '2.2.2.2',
                           'su')
 
+    @decorators.idempotent_id('efd594aa-dd24-427e-acdf-10d124afb572')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('1.0', '2.9', LATEST_MICROVERSION)
     def test_create_duplicate_of_ip_rule(self, version):
@@ -132,6 +136,7 @@
             self.shares_v2_client.wait_for_resource_deletion(
                 rule_id=rule["id"], share_id=self.share["id"], version=version)
 
+    @decorators.idempotent_id('63932d1d-a60a-4af7-ba3b-7cf6c68aaee9')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data("10.20.30.40", "fd8c:b029:bba6:ac54::1",
               "fd2c:b029:bba6:df54::1/128", "10.10.30.40/32")
@@ -165,6 +170,7 @@
                           self.shares_v2_client.create_access_rule,
                           self.share["id"], "ip", access_to)
 
+    @decorators.idempotent_id('d2856c7d-9417-416d-8d08-e68376ee5b2e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_add_access_rule_on_share_with_no_host(self):
         access_type, access_to = self._get_access_rule_data_from_config()
@@ -211,6 +217,7 @@
             # create snapshot
             cls.snap = cls.create_snapshot_wait_for_active(cls.share["id"])
 
+    @decorators.idempotent_id('d6148911-3a0c-4e1f-afdb-fcf203fe4a5b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_user_with_wrong_input_2(self, client_name):
@@ -219,6 +226,7 @@
                           self.share["id"], "user",
                           "try+")
 
+    @decorators.idempotent_id('a4d8358d-dec0-4c2a-a544-182816a0ba6f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_user_with_empty_key(self, client_name):
@@ -226,6 +234,7 @@
                           getattr(self, client_name).create_access_rule,
                           self.share["id"], "user", "")
 
+    @decorators.idempotent_id('f5252e86-4767-48ad-8be5-43e12c93df79')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_user_with_too_little_key(self, client_name):
@@ -233,6 +242,7 @@
                           getattr(self, client_name).create_access_rule,
                           self.share["id"], "user", "abc")
 
+    @decorators.idempotent_id('f8f4d3ee-82b8-4d37-917d-a0cd72073df4')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_user_with_too_big_key(self, client_name):
@@ -240,6 +250,7 @@
                           getattr(self, client_name).create_access_rule,
                           self.share["id"], "user", "a" * 256)
 
+    @decorators.idempotent_id('21724a99-0790-49d5-a069-d1df43782965')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_user_with_wrong_input_1(self, client_name):
@@ -248,6 +259,7 @@
                           self.share["id"], "user",
                           "try+")
 
+    @decorators.idempotent_id('bc62ce96-36fe-4c9b-b6b9-4d5a661c8035')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
@@ -259,6 +271,7 @@
                           access_type="user",
                           access_to="fakeuser")
 
+    @decorators.idempotent_id('04d5b25f-b335-4574-82b0-f607c8b3bf25')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_user_with_wrong_share_id(self, client_name):
@@ -268,6 +281,7 @@
                           access_type="user",
                           access_to="fakeuser")
 
+    @decorators.idempotent_id('301bdbd5-4398-4320-b334-7370995369e9')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_with_wrong_level(self, client_name):
@@ -305,6 +319,7 @@
             # create snapshot
             cls.snap = cls.create_snapshot_wait_for_active(cls.share["id"])
 
+    @decorators.idempotent_id('a16d53d5-50d4-4015-912f-2850c5d62690')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_cert_with_empty_common_name(self, client_name):
@@ -312,6 +327,7 @@
                           getattr(self, client_name).create_access_rule,
                           self.share["id"], "cert", "")
 
+    @decorators.idempotent_id('7b5383d8-5bcd-47aa-955b-ed3757a5bdb4')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_cert_with_whitespace_common_name(self,
@@ -320,6 +336,7 @@
                           getattr(self, client_name).create_access_rule,
                           self.share["id"], "cert", " ")
 
+    @decorators.idempotent_id('1c25c134-92b4-4875-a061-88d394e28bcc')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_cert_with_too_big_common_name(self,
@@ -329,6 +346,7 @@
                           getattr(self, client_name).create_access_rule,
                           self.share["id"], "cert", "a" * 65)
 
+    @decorators.idempotent_id('dd85d5cd-aa83-4f44-8572-bd7e68a84fb2')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -340,6 +358,7 @@
                           access_type="cert",
                           access_to="fakeclient1.com")
 
+    @decorators.idempotent_id('eb47a511-7688-4689-a2ad-54ba85b39b07')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_cert_with_wrong_share_id(self, client_name):
@@ -371,6 +390,7 @@
         cls.access_type = "cephx"
         cls.access_to = "david"
 
+    @decorators.idempotent_id('7b33c073-353e-4952-97dc-c3948a3cd037')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('jane.doe', u"bj\u00F6rn")
     def test_create_access_rule_cephx_with_invalid_cephx_id(self, access_to):
@@ -378,6 +398,7 @@
                           self.shares_v2_client.create_access_rule,
                           self.share["id"], self.access_type, access_to)
 
+    @decorators.idempotent_id('dd8be44c-c7e8-42fe-b81c-095a1c66730c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_access_rule_cephx_with_wrong_level(self):
         self.assertRaises(lib_exc.BadRequest,
@@ -385,6 +406,7 @@
                           self.share["id"], self.access_type, self.access_to,
                           access_level="su")
 
+    @decorators.idempotent_id('4ffed391-d7cc-481b-bb74-9f3406ddd75f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_different_tenants_cannot_use_same_cephx_id(self):
         # Grant access to the share
@@ -406,6 +428,7 @@
             share2['id'])
         self.assertEqual('error', share_alt_updated['access_rules_status'])
 
+    @decorators.idempotent_id('1a9f46f0-d4e1-40ac-8726-aedd0320d583')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_can_apply_new_cephx_rules_when_one_is_in_error_state(self):
         # Create share on "primary" tenant
@@ -465,6 +488,7 @@
             # create snapshot
             cls.snap = cls.create_snapshot_wait_for_active(cls.share["id"])
 
+    @decorators.idempotent_id('84da9231-5c4b-4615-8500-8fc6d30ff7ea')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_delete_access_rule_with_wrong_id(self, client_name):
@@ -472,6 +496,7 @@
                           getattr(self, client_name).delete_access_rule,
                           self.share["id"], "wrong_rule_id")
 
+    @decorators.idempotent_id('13f9329f-12db-467d-9268-a9cca75997d9')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_ip_with_wrong_type(self, client_name):
@@ -479,6 +504,7 @@
                           getattr(self, client_name).create_access_rule,
                           self.share["id"], "wrong_type", "1.2.3.4")
 
+    @decorators.idempotent_id('fd6ede10-97d6-4ee8-a661-c516b7421c91')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('shares_client', 'shares_v2_client')
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
@@ -492,6 +518,7 @@
 @ddt.ddt
 class ShareRulesAPIOnlyNegativeTest(base.BaseSharesTest):
 
+    @decorators.idempotent_id('01279461-3ccc-49b2-a615-d7984dd0db8c')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data('shares_client', 'shares_v2_client')
     def test_create_access_rule_ip_with_wrong_share_id(self, client_name):
diff --git a/manila_tempest_tests/tests/api/test_scheduler_stats_negative.py b/manila_tempest_tests/tests/api/test_scheduler_stats_negative.py
index c7dc3f0..2423bc1 100644
--- a/manila_tempest_tests/tests/api/test_scheduler_stats_negative.py
+++ b/manila_tempest_tests/tests/api/test_scheduler_stats_negative.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -21,11 +22,13 @@
 
 class SchedulerStatsNegativeTest(base.BaseSharesTest):
 
+    @decorators.idempotent_id('33db76eb-7501-43f9-8c4f-8e6e35519a4d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_pools_with_user(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.shares_client.list_pools)
 
+    @decorators.idempotent_id('f89136cf-34a1-475b-8514-3114f9f159a5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_pools_detailed_with_user(self):
         self.assertRaises(lib_exc.Forbidden,
diff --git a/manila_tempest_tests/tests/api/test_security_services.py b/manila_tempest_tests/tests/api/test_security_services.py
index 366f8ec..b300973 100644
--- a/manila_tempest_tests/tests/api/test_security_services.py
+++ b/manila_tempest_tests/tests/api/test_security_services.py
@@ -17,6 +17,7 @@
 from oslo_log import log
 import six
 from tempest import config
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -31,6 +32,7 @@
 @ddt.ddt
 class SecurityServiceListMixin(object):
 
+    @decorators.idempotent_id('f6f5657c-a93c-49ed-86e3-b351a92734d5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_security_services(self):
         listed = self.shares_client.list_security_services()
@@ -42,6 +44,7 @@
         keys = ["name", "id", "status", "type", ]
         [self.assertIn(key, s_s.keys()) for s_s in listed for key in keys]
 
+    @decorators.idempotent_id('22b22937-7436-458c-ac22-8ff19feab253')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(*set(['1.0', '2.42', '2.44', LATEST_MICROVERSION]))
     def test_list_security_services_with_detail(self, version):
@@ -68,6 +71,7 @@
         for ss in listed:
             self.assertEqual(with_ou, 'ou' in ss.keys())
 
+    @decorators.idempotent_id('88f62835-0aee-4bed-a37f-ffd99430da8a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -95,6 +99,7 @@
         keys = ["name", "id", "status", "type", ]
         [self.assertIn(key, s_s.keys()) for s_s in listed for key in keys]
 
+    @decorators.idempotent_id('f055faad-dd36-4eed-9b50-61280931dea2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_security_services_detailed_filter_by_ss_attributes(self):
         search_opts = {
@@ -151,6 +156,7 @@
         self.ss_kerberos = self.create_security_service(
             'kerberos', **ss_kerberos_data)
 
+    @decorators.idempotent_id('70927e29-4a6a-431a-bbc1-76bc419e0579')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_create_delete_security_service(self):
         data = self.generate_security_service_data()
@@ -161,6 +167,7 @@
             self.assertEqual(ss_name, ss["type"])
             self.shares_client.delete_security_service(ss["id"])
 
+    @decorators.idempotent_id('bb052be4-0176-4613-b7d5-e12bef391ddb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @ddt.data(*set(['1.0', '2.43', '2.44', LATEST_MICROVERSION]))
     def test_get_security_service(self, version):
@@ -182,6 +189,7 @@
         self.assertDictContainsSubset(data, get)
         self.assertEqual(with_ou, 'ou' in get)
 
+    @decorators.idempotent_id('84d47747-13c8-4ab9-9fc4-a43fbb29ad18')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_security_service(self):
         data = self.generate_security_service_data()
@@ -206,6 +214,7 @@
             self.assertDictContainsSubset(upd_data_ou, updated_ou)
             self.assertDictContainsSubset(upd_data_ou, get_ou)
 
+    @decorators.idempotent_id('c3c04992-da11-4677-9098-eff3f4231a4b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -245,6 +254,7 @@
             ss["id"], **update_data)
         self.assertDictContainsSubset(update_data, updated)
 
+    @decorators.idempotent_id('8d9af272-df89-470d-9ff8-92ba774c9fff')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_security_services_filter_by_invalid_opt(self):
         listed = self.shares_client.list_security_services(
@@ -253,6 +263,7 @@
         self.assertTrue(any(self.ss_kerberos['id'] == ss['id']
                             for ss in listed))
 
+    @decorators.idempotent_id('d501710e-4710-4c13-a373-75ed6ababb13')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_try_list_security_services_all_tenants(self):
         listed = self.shares_client.list_security_services(
diff --git a/manila_tempest_tests/tests/api/test_security_services_mapping.py b/manila_tempest_tests/tests/api/test_security_services_mapping.py
index 1141c43..db0a8b7 100644
--- a/manila_tempest_tests/tests/api/test_security_services_mapping.py
+++ b/manila_tempest_tests/tests/api/test_security_services_mapping.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -45,6 +46,7 @@
         # Add security service to share network
         self.cl.add_sec_service_to_share_network(self.sn["id"], self.ss["id"])
 
+    @decorators.idempotent_id('e8c5b4d5-7ad2-4aa7-bab0-b454a2e150e9')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_map_ss_to_sn_and_list(self):
 
@@ -54,6 +56,7 @@
         for key in ["status", "id", "name"]:
             self.assertIn(self.ss[key], ls[0][key])
 
+    @decorators.idempotent_id('9dd352b2-6d47-4cab-aa61-52d8081f67a2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_map_ss_to_sn_and_delete(self):
 
@@ -61,6 +64,7 @@
         self.cl.remove_sec_service_from_share_network(
             self.sn["id"], self.ss["id"])
 
+    @decorators.idempotent_id('2b0bd5cc-eb35-430f-acfd-f80a2e467667')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_remap_ss_to_sn(self):
 
diff --git a/manila_tempest_tests/tests/api/test_security_services_mapping_negative.py b/manila_tempest_tests/tests/api/test_security_services_mapping_negative.py
index 744e5ac..f504e5c 100644
--- a/manila_tempest_tests/tests/api/test_security_services_mapping_negative.py
+++ b/manila_tempest_tests/tests/api/test_security_services_mapping_negative.py
@@ -16,6 +16,7 @@
 from oslo_log import log
 import six
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -42,6 +43,7 @@
         cls.share_type = cls._create_share_type()
         cls.share_type_id = cls.share_type['id']
 
+    @decorators.idempotent_id('e3d17444-8ed4-445e-bc65-c748dbc5d21f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_sec_service_twice_to_share_network(self):
         self.cl.add_sec_service_to_share_network(self.sn["id"], self.ss["id"])
@@ -49,54 +51,63 @@
                           self.cl.add_sec_service_to_share_network,
                           self.sn["id"], self.ss["id"])
 
+    @decorators.idempotent_id('3f7af51f-3afa-495c-94b7-e9d29f06cf1d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_nonexistant_sec_service_to_share_network(self):
         self.assertRaises(lib_exc.NotFound,
                           self.cl.add_sec_service_to_share_network,
                           self.sn["id"], "wrong_ss_id")
 
+    @decorators.idempotent_id('85dd5693-a89c-4d05-9416-0e11fbba23f5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_empty_sec_service_id_to_share_network(self):
         self.assertRaises(lib_exc.NotFound,
                           self.cl.add_sec_service_to_share_network,
                           self.sn["id"], "")
 
+    @decorators.idempotent_id('d9af5086-ace9-4be3-8119-e765699c0c91')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_sec_service_to_nonexistant_share_network(self):
         self.assertRaises(lib_exc.NotFound,
                           self.cl.add_sec_service_to_share_network,
                           "wrong_sn_id", self.ss["id"])
 
+    @decorators.idempotent_id('7272426d-ab58-4efb-a490-0c78c07fa7fe')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_sec_service_to_share_network_with_empty_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.cl.add_sec_service_to_share_network,
                           "", self.ss["id"])
 
+    @decorators.idempotent_id('f87aefa6-9681-477d-a118-603883849f4f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_sec_services_for_nonexistant_share_network(self):
         self.assertRaises(lib_exc.NotFound,
                           self.cl.list_sec_services_for_share_network,
                           "wrong_id")
 
+    @decorators.idempotent_id('7f8d7527-2d62-478a-ab19-213156777612')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_nonexistant_sec_service_from_share_network(self):
         self.assertRaises(lib_exc.NotFound,
                           self.cl.remove_sec_service_from_share_network,
                           self.sn["id"], "wrong_id")
 
+    @decorators.idempotent_id('be1c9c79-efa1-471e-920b-da4733ad383e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_sec_service_from_nonexistant_share_network(self):
         self.assertRaises(lib_exc.NotFound,
                           self.cl.remove_sec_service_from_share_network,
                           "wrong_id", self.ss["id"])
 
+    @decorators.idempotent_id('c7c2f66f-81f8-4984-b807-2b9520105a33')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_nonexistant_ss_from_nonexistant_sn(self):
         self.assertRaises(lib_exc.NotFound,
                           self.cl.remove_sec_service_from_share_network,
                           "wrong_id", "wrong_id")
 
+    @decorators.idempotent_id('eb66a8f7-b549-4cf1-8719-30844fb151b6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -130,6 +141,7 @@
                           fresh_sn["id"],
                           self.ss["id"])
 
+    @decorators.idempotent_id('6a15c8ff-eba3-40e5-8fa1-6eab52338672')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_map_two_ss_with_same_type_to_sn(self):
         # create share network
@@ -155,6 +167,7 @@
                           self.cl.add_sec_service_to_share_network,
                           sn["id"], security_services[1]["id"])
 
+    @decorators.idempotent_id('d422a15a-1f4c-4531-a092-9216b90c4179')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_ss_that_assigned_to_sn(self):
         # create share network
diff --git a/manila_tempest_tests/tests/api/test_security_services_negative.py b/manila_tempest_tests/tests/api/test_security_services_negative.py
index fe06416..3539634 100644
--- a/manila_tempest_tests/tests/api/test_security_services_negative.py
+++ b/manila_tempest_tests/tests/api/test_security_services_negative.py
@@ -16,6 +16,7 @@
 from oslo_log import log
 import six
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -35,51 +36,60 @@
         cls.share_type = cls._create_share_type()
         cls.share_type_id = cls.share_type['id']
 
+    @decorators.idempotent_id('f5cdf074-f5d4-4d9e-990b-c3d9385dfc2b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_security_service_with_empty_type(self):
         self.assertRaises(lib_exc.BadRequest,
                           self.shares_client.create_security_service, "")
 
+    @decorators.idempotent_id('6a7efebc-989a-42b3-a971-c28af1e209f5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_security_service_with_wrong_type(self):
         self.assertRaises(lib_exc.BadRequest,
                           self.shares_client.create_security_service,
                           "wrong_type")
 
+    @decorators.idempotent_id('2935de41-40b1-4907-8ab5-f4921f670bfd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_security_service_without_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.get_security_service, "")
 
+    @decorators.idempotent_id('34e923a4-e5b4-4375-88b4-8bb05e8f010d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_security_service_with_wrong_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.get_security_service,
                           "wrong_id")
 
+    @decorators.idempotent_id('887e0c2c-6658-442d-92e7-3b0c86a2dfcd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_security_service_without_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.delete_security_service, "")
 
+    @decorators.idempotent_id('c94eb229-5caf-4e81-b8a9-d73c0b63a93b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_security_service_with_wrong_type(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.delete_security_service,
                           "wrong_id")
 
+    @decorators.idempotent_id('60e51b95-af7f-463d-8d8e-6bca4ed3bec8')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_nonexistant_security_service(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.update_security_service,
                           "wrong_id", name="name")
 
+    @decorators.idempotent_id('e4554b3b-bc74-4204-8596-d502149bb408')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_security_service_with_empty_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.update_security_service,
                           "", name="name")
 
+    @decorators.idempotent_id('ab62240a-219c-4fa7-b1ca-08f91bec76f0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -116,6 +126,7 @@
                           ss["id"],
                           user="new_user")
 
+    @decorators.idempotent_id('288dbf42-ee22-4445-8363-7ebb1c3d89c9')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_deleted_security_service(self):
         data = self.generate_security_service_data()
diff --git a/manila_tempest_tests/tests/api/test_share_group_actions.py b/manila_tempest_tests/tests/api/test_share_group_actions.py
index c1f4e6f..3b2325a 100644
--- a/manila_tempest_tests/tests/api/test_share_group_actions.py
+++ b/manila_tempest_tests/tests/api/test_share_group_actions.py
@@ -17,6 +17,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
@@ -103,6 +104,7 @@
             description=cls.sg_snap_desc,
         )
 
+    @decorators.idempotent_id('1e359389-09a7-4235-84c9-7b5c83632fff')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -128,6 +130,7 @@
         self.assertEqual(self.share_group_name, share_group["name"])
         self.assertEqual(self.share_group_desc, share_group["description"])
 
+    @decorators.idempotent_id('45b77673-b1bb-43a1-b4b7-41351930adbd')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_min_supported_sg_microversion(self):
 
@@ -155,6 +158,7 @@
         self.assertEqual(self.share_size, int(share["size"]))
         self.assertEqual(self.share_group["id"], share["share_group_id"])
 
+    @decorators.idempotent_id('04fcd695-c5f8-4de7-ab09-131424e6bdfb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -185,6 +189,7 @@
             msg = ("Expected id %s exactly once in share group list" % sg_id)
             self.assertEqual(1, len(gen), msg)
 
+    @decorators.idempotent_id('16986c21-ecbc-429e-ab3d-8d1596a3eac4')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION, '2.36',
@@ -220,6 +225,7 @@
                    group_id)
             self.assertEqual(1, len(gen), msg)
 
+    @decorators.idempotent_id('e72be2f9-56db-467f-89d7-0dddbf7e37e9')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_filter_shares_by_share_group_id_min(self):
         shares = self.shares_v2_client.list_shares(
@@ -243,6 +249,7 @@
             'Share %s expected in returned list, but got %s' % (
                 self.shares[0]['id'], share_ids))
 
+    @decorators.idempotent_id('5d2ca4f5-04da-4528-af47-ec980b95e884')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -273,6 +280,7 @@
         self.assertEqual(self.sg_snap_name, sg_snapshot["name"])
         self.assertEqual(self.sg_snap_desc, sg_snapshot["description"])
 
+    @decorators.idempotent_id('67e8c099-f1c1-4972-9c51-bb7bfe1d7994')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_group_snapshot_members_min(self):
         sg_snapshot = self.shares_v2_client.get_share_group_snapshot(
@@ -297,6 +305,7 @@
                 if share['id'] == member['share_id']:
                     self.assertEqual(share['size'], member['size'])
 
+    @decorators.idempotent_id('650c5fa7-11f2-48bd-b012-fc2e32b6f446')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -401,6 +410,7 @@
             version=version,
         )
 
+    @decorators.idempotent_id('7f0a07ce-afdd-4c51-a29c-d8fe6cb5f6a5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
@@ -440,6 +450,7 @@
         # going to be reused
         self._rollback_share_group_update(version)
 
+    @decorators.idempotent_id('611b1555-df09-499b-8aef-e8261e3f6863')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         *set([constants.MIN_SHARE_GROUP_MICROVERSION,
diff --git a/manila_tempest_tests/tests/api/test_share_groups.py b/manila_tempest_tests/tests/api/test_share_groups.py
index 5b2ae9f..4c655e9 100644
--- a/manila_tempest_tests/tests/api/test_share_groups.py
+++ b/manila_tempest_tests/tests/api/test_share_groups.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -49,6 +50,7 @@
         cls.share_group_type = cls._create_share_group_type()
         cls.share_group_type_id = cls.share_group_type['id']
 
+    @decorators.idempotent_id('809d5e3d-5a4b-458a-a985-853d59800da5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_create_populate_delete_share_group_min(self):
         # Create a share group
@@ -93,6 +95,7 @@
         self.assertRaises(
             lib_exc.NotFound, self.shares_client.get_share, share['id'])
 
+    @decorators.idempotent_id('cf7984af-1e1d-4eaf-bf9a-d8ddf5cebd01')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_create_delete_empty_share_group_snapshot_min(self):
         # Create base share group
@@ -133,6 +136,7 @@
             sg_snapshot['id'],
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('727d9c69-4c3b-4375-a91b-8b3efd349976')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_create_share_group_from_empty_share_group_snapshot_min(self):
         # Create base share group
@@ -193,6 +197,7 @@
             msg)
 
     @base.skip_if_microversion_lt("2.34")
+    @decorators.idempotent_id('14fd6d88-87ff-4af2-ad17-f95dbd8dcd61')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(
         'sg', 'sg_and_share', 'none',
diff --git a/manila_tempest_tests/tests/api/test_share_groups_negative.py b/manila_tempest_tests/tests/api/test_share_groups_negative.py
index a0a6b4b..bfe07c6 100644
--- a/manila_tempest_tests/tests/api/test_share_groups_negative.py
+++ b/manila_tempest_tests/tests/api/test_share_groups_negative.py
@@ -15,14 +15,15 @@
 
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
-
 from testtools import testcase as tc
 
 from manila_tempest_tests.common import constants
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 
 
@@ -78,6 +79,7 @@
             description=cls.sg_snap_desc
         )
 
+    @decorators.idempotent_id('7ce3fb52-1bec-42b1-9b4f-671c8465764b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_with_invalid_source_sg_snapshot_id_value_min(self):
         self.assertRaises(
@@ -87,6 +89,7 @@
             cleanup_in_class=False,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('43c7a454-06b4-4c6e-8aaf-34709db64e28')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_with_nonexistent_source_sg_snapshot_id_value_min(self):
         self.assertRaises(
@@ -96,6 +99,7 @@
             cleanup_in_class=False,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('aae1b1db-ea04-4a53-88ad-e5ee648fe938')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_with_invalid_share_network_id_value_min(self):
         self.assertRaises(
@@ -105,6 +109,7 @@
             cleanup_in_class=False,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('ea817e28-08b9-40c1-bbab-a8820ec564ac')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_group_with_nonexistent_share_network_id_value_min(self):
         self.assertRaises(
@@ -114,6 +119,7 @@
             cleanup_in_class=False,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('8bc89858-61de-49f3-868c-394841a93503')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_with_invalid_share_type_id_value_min(self):
         self.assertRaises(
@@ -123,6 +129,7 @@
             cleanup_in_class=False,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('97183b15-d150-4c6b-b812-734c2500afe7')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_with_nonexistent_share_type_id_value_min(self):
         self.assertRaises(
@@ -132,6 +139,7 @@
             cleanup_in_class=False,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('25a829e2-be7d-4a4d-881e-bc0634515985')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_snapshot_with_invalid_sg_id_value_min(self):
         self.assertRaises(
@@ -141,6 +149,7 @@
             cleanup_in_class=False,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('16ad5a77-0ef7-4906-8e14-56703c2c9d71')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_snapshot_with_nonexistent_sg_id_value_min(self):
         self.assertRaises(
@@ -150,6 +159,7 @@
             cleanup_in_class=False,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('d486a184-1160-4664-ad9b-6f8974685343')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_sg_with_invalid_id_min(self):
         self.assertRaises(
@@ -158,6 +168,7 @@
             "invalid_share_group_id",
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('7a5dcec1-27cc-4bfe-a166-d8c1832a4dc7')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_get_sg_without_passing_group_id_min(self):
         self.assertRaises(
@@ -165,6 +176,7 @@
             self.shares_v2_client.get_share_group,
             '', version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('9127933a-1960-415e-bf21-8bcb5720e371')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_update_sg_with_invalid_id_min(self):
         self.assertRaises(
@@ -175,6 +187,7 @@
             description='new_description',
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('bf8f9865-a906-4d55-b233-fec57cf43b66')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_sg_with_invalid_id_min(self):
         self.assertRaises(
@@ -183,6 +196,7 @@
             "invalid_share_group_id",
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('16431501-800f-4695-bae6-6a4c715c2fbf')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_sg_without_passing_sg_id_min(self):
         self.assertRaises(
@@ -190,6 +204,7 @@
             self.shares_v2_client.delete_share_group,
             '', version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('18fe2dee-4a07-484e-8f0f-bbc238500dc3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_sg_in_use_by_sg_snapshot_min(self):
         self.assertRaises(
@@ -198,6 +213,7 @@
             self.share_group['id'],
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('d2a58f10-cc86-498d-a5e0-1468d4345852')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_share_in_use_by_sg_snapshot_min(self):
         params = {'share_group_id': self.share['share_group_id']}
@@ -208,6 +224,7 @@
             params=params,
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
+    @decorators.idempotent_id('c2225b19-d5f5-4d15-bb9a-de63bfce6760')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_sg_containing_a_share_min(self):
         self.assertRaises(
@@ -222,6 +239,7 @@
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
         self.assertEqual('available', sg['status'])
 
+    @decorators.idempotent_id('edd329b8-7188-481f-9445-8f6d913538fa')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_filter_shares_on_invalid_group_id_min(self):
         shares = self.shares_v2_client.list_shares(
@@ -231,6 +249,7 @@
         )
         self.assertEqual(0, len(shares), 'Incorrect number of shares returned')
 
+    @decorators.idempotent_id('5dc10968-cbff-46d9-a1aa-bafccc7a1905')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_filter_shares_on_nonexistent_group_id_min(self):
         shares = self.shares_v2_client.list_shares(
@@ -240,6 +259,7 @@
         )
         self.assertEqual(0, len(shares), 'Incorrect number of shares returned')
 
+    @decorators.idempotent_id('f805f683-fe05-4534-9f40-a74be42ff82b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_filter_shares_on_empty_share_group_id_min(self):
         share_group = self.create_share_group(
@@ -257,6 +277,7 @@
         )
         self.assertEqual(0, len(shares), 'Incorrect number of shares returned')
 
+    @decorators.idempotent_id('8fc20c22-082f-4851-bcc3-d2f3af57f027')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_with_nonexistent_az_min(self):
         self.assertRaises(
@@ -270,6 +291,7 @@
             version=constants.MIN_SHARE_GROUP_MICROVERSION)
 
     @base.skip_if_microversion_lt("2.34")
+    @decorators.idempotent_id('64527564-9cd6-42db-8897-910f4fc1a151')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_sg_and_share_with_different_azs(self):
         azs = self.shares_v2_client.list_availability_zones()
diff --git a/manila_tempest_tests/tests/api/test_share_network_subnets.py b/manila_tempest_tests/tests/api/test_share_network_subnets.py
index 5c90fd1..8387968 100644
--- a/manila_tempest_tests/tests/api/test_share_network_subnets.py
+++ b/manila_tempest_tests/tests/api/test_share_network_subnets.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -45,6 +46,7 @@
         cls.share_network = cls.create_share_network()
         cls.share_network_id = cls.share_network['id']
 
+    @decorators.idempotent_id('3e1e4da7-049f-404e-8673-142695a9a785')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_create_delete_subnet(self):
         share_network = self.shares_v2_client.create_share_network()
@@ -82,6 +84,7 @@
         # Delete the subnets
         self.shares_v2_client.delete_subnet(share_network['id'], created['id'])
 
+    @decorators.idempotent_id('51c6836a-c6d2-4b80-a992-cf91f9a4332b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_show_share_network_subnet(self):
         share_network = self.create_share_network()
@@ -107,6 +110,7 @@
         self.shares_v2_client.delete_subnet(share_network['id'],
                                             created['id'])
 
+    @decorators.idempotent_id('89ed6115-eb1d-4a7e-a0a3-9b4a239fadc1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -174,6 +178,7 @@
         # Delete the subnets
         self.shares_v2_client.delete_subnet(share_network['id'], subnet['id'])
 
+    @decorators.idempotent_id('043fbe02-466d-4344-8e2f-f02cb65132cb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
diff --git a/manila_tempest_tests/tests/api/test_share_network_subnets_negative.py b/manila_tempest_tests/tests/api/test_share_network_subnets_negative.py
index 4836e74..a374f4e 100644
--- a/manila_tempest_tests/tests/api/test_share_network_subnets_negative.py
+++ b/manila_tempest_tests/tests/api/test_share_network_subnets_negative.py
@@ -14,8 +14,8 @@
 #    under the License.
 
 import ddt
-
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -24,6 +24,7 @@
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 
 
@@ -46,6 +47,7 @@
         cls.az = cls.shares_v2_client.list_availability_zones()[0]
         cls.az_name = cls.az['name']
 
+    @decorators.idempotent_id('d20b6105-22d1-4fc0-8468-45dd019240c0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_share_network_subnet_share_network_not_found(self):
         data = self.generate_subnet_data()
@@ -54,6 +56,7 @@
                           'fake_inexistent_id',
                           **data)
 
+    @decorators.idempotent_id('68264ac2-57e5-47ea-aa71-198c020be975')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_share_network_subnet_az_not_found(self):
         data = {'availability_zone': 'non-existent-az'}
@@ -62,6 +65,7 @@
                           self.shares_v2_client.create_subnet,
                           self.share_network_id, **data)
 
+    @decorators.idempotent_id('13f397bf-5e3a-42b0-b4f9-9cd2dbbb0955')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data(True, False)
     def test_add_share_network_subnet_in_same_az_exists(self, is_default):
@@ -79,6 +83,7 @@
                           self.shares_v2_client.create_subnet,
                           share_network['id'], **data)
 
+    @decorators.idempotent_id('36e991c1-f09b-47dc-adc9-3da388b14612')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_add_share_network_subnet_missing_parameters(self):
         # Generate subnet data
@@ -90,6 +95,7 @@
                           self.shares_v2_client.create_subnet,
                           self.share_network_id, **data)
 
+    @decorators.idempotent_id('11e76b07-f3e3-401f-9469-256b93a768e6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_show_subnet_share_network_not_found(self):
         self.assertRaises(lib_exc.NotFound,
@@ -97,6 +103,7 @@
                           'fake-subnet',
                           'fake-sn')
 
+    @decorators.idempotent_id('22d4528b-39ae-4f97-b1b2-1b9d65146c97')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_show_subnet_not_found(self):
         self.assertRaises(lib_exc.NotFound,
@@ -104,6 +111,7 @@
                           'fake-subnet',
                           self.share_network_id)
 
+    @decorators.idempotent_id('9dfc6ba3-c7be-4a6d-b104-ce77d2337bb3')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_deleted_subnet(self):
         # Generate subnet data
@@ -130,6 +138,7 @@
                           subnet['id'],
                           self.share_network['id'])
 
+    @decorators.idempotent_id('bf9d63c4-37fb-4646-add7-905b196316f1')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(not CONF.share.multitenancy_enabled,
                       'Can run only with drivers that do handle share servers '
@@ -202,6 +211,7 @@
         self.shares_v2_client.delete_subnet(share_network_id,
                                             subnet['id'])
 
+    @decorators.idempotent_id('5088edfe-2800-4dec-a982-42c864bba954')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(not CONF.share.multitenancy_enabled,
                       'Can run only with drivers that do handle share servers '
@@ -271,6 +281,7 @@
         self.shares_v2_client.delete_subnet(share_network_id,
                                             subnet['id'])
 
+    @decorators.idempotent_id('1025b69b-f1fd-4e44-b749-33779545ffe8')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_subnet_share_network_not_found(self):
         self.assertRaises(lib_exc.NotFound,
@@ -278,6 +289,7 @@
                           'fake-sn',
                           'fake-subnet')
 
+    @decorators.idempotent_id('a5bdc817-0c34-4856-9732-f561e6ab5a83')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_subnet_not_found(self):
         self.assertRaises(lib_exc.NotFound,
diff --git a/manila_tempest_tests/tests/api/test_share_networks.py b/manila_tempest_tests/tests/api/test_share_networks.py
index b7cd0bf..db07591 100644
--- a/manila_tempest_tests/tests/api/test_share_networks.py
+++ b/manila_tempest_tests/tests/api/test_share_networks.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -25,6 +26,7 @@
 
 class ShareNetworkListMixin(object):
 
+    @decorators.idempotent_id('41c635b1-d9ef-4c05-9100-5e4b0034b523')
     @tc.attr("gate", "smoke", )
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_share_networks(self):
@@ -35,6 +37,7 @@
         keys = ["name", "id"]
         [self.assertIn(key, sn.keys()) for sn in listed for key in keys]
 
+    @decorators.idempotent_id('18fe9031-cefc-4df3-bbb0-6541f5fda12b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_try_list_share_networks_all_tenants(self):
         listed = self.shares_client.list_share_networks_with_detail(
@@ -45,6 +48,7 @@
         keys = ["name", "id"]
         [self.assertIn(key, sn.keys()) for sn in listed for key in keys]
 
+    @decorators.idempotent_id('caf6635a-ecb8-4981-9776-11dcfdf3cdbc')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_try_list_share_networks_project_id(self):
         listed = self.shares_client.list_share_networks_with_detail(
@@ -55,6 +59,7 @@
         keys = ["name", "id"]
         [self.assertIn(key, sn.keys()) for sn in listed for key in keys]
 
+    @decorators.idempotent_id('285c7a91-1703-42a5-86c8-2463edde60e2')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_share_networks_with_detail(self):
         listed = self.shares_v2_client.list_share_networks_with_detail()
@@ -91,6 +96,7 @@
 
         [self.assertIn(key, sn.keys()) for sn in listed for key in keys]
 
+    @decorators.idempotent_id('6d13a090-0855-40c0-85b1-424f6878c6ce')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_share_networks_filter_by_ss(self):
         listed = self.shares_client.list_share_networks_with_detail(
@@ -103,6 +109,7 @@
             self.assertTrue(any(ss['id'] == self.ss_ldap['id']
                                 for ss in ss_list))
 
+    @decorators.idempotent_id('bff1356e-70aa-4bbe-b398-cb4dadd8fcb1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     @base.skip_if_microversion_lt("2.36")
     def test_list_share_networks_like_filter(self):
@@ -119,6 +126,7 @@
             self.assertTrue(all(value in sn[key] for key, value in
                                 valid_filter_opts.items()))
 
+    @decorators.idempotent_id('27490442-60f8-4514-a10a-194a400b48bb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_list_share_networks_all_filter_opts(self):
         valid_filter_opts = {
@@ -204,6 +212,7 @@
             cls.sn_with_kerberos_ss["id"],
             cls.ss_kerberos["id"])
 
+    @decorators.idempotent_id('b998a594-f630-475d-b46f-e4143caf61fb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_create_delete_share_network(self):
         # generate data for share network
@@ -216,6 +225,7 @@
         # Delete share_network
         self.shares_client.delete_share_network(created["id"])
 
+    @decorators.idempotent_id('55990ec2-37f0-483f-9c67-76fd6f377cc1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_get_share_network(self):
         get = self.shares_client.get_share_network(self.sn_with_ldap_ss["id"])
@@ -224,6 +234,7 @@
         del data['created_at']
         self.assertDictContainsSubset(data, get)
 
+    @decorators.idempotent_id('1837fdd3-8068-4e88-bc50-9224498f84c0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_update_share_network(self):
         update_data = self.generate_share_network_data()
@@ -232,6 +243,7 @@
             **update_data)
         self.assertDictContainsSubset(update_data, updated)
 
+    @decorators.idempotent_id('198a5c08-3aaf-4623-9720-95d33ebe3376')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -246,6 +258,7 @@
             self.shares_client.share_network_id, **update_dict)
         self.assertDictContainsSubset(update_dict, updated)
 
+    @decorators.idempotent_id('7595a844-a28e-476c-89f1-4d3193ce9d5b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_recreate_share_network(self):
         # generate data for share network
@@ -265,6 +278,7 @@
         # Delete second share network
         self.shares_client.delete_share_network(sn2["id"])
 
+    @decorators.idempotent_id('be5f4f60-493e-47ea-a5bd-f16dfaa98c5c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API)
     def test_create_two_share_networks_with_same_net_and_subnet(self):
         # generate data for share network
@@ -278,6 +292,7 @@
         sn2 = self.create_share_network(**data)
         self.assertDictContainsSubset(data, sn2)
 
+    @decorators.idempotent_id('50bac743-7ca9-409b-827f-f277da67e32e')
     @testtools.skipUnless(CONF.share.create_networks_when_multitenancy_enabled,
                           "Only for setups with network creation.")
     @testtools.skipUnless(CONF.share.multitenancy_enabled,
@@ -301,6 +316,7 @@
         self.assertEqual(subnet_details['subnet']['gateway_ip'],
                          share_net_info['gateway'])
 
+    @decorators.idempotent_id('2dbf91da-04ae-4f9f-a7b9-0299c6b2e02c')
     @testtools.skipUnless(CONF.share.create_networks_when_multitenancy_enabled,
                           "Only for setups with network creation.")
     @testtools.skipUnless(CONF.share.multitenancy_enabled,
diff --git a/manila_tempest_tests/tests/api/test_share_networks_negative.py b/manila_tempest_tests/tests/api/test_share_networks_negative.py
index 0308ebc..0d9cbec 100644
--- a/manila_tempest_tests/tests/api/test_share_networks_negative.py
+++ b/manila_tempest_tests/tests/api/test_share_networks_negative.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -32,38 +33,45 @@
         cls.share_type = cls._create_share_type()
         cls.share_type_id = cls.share_type['id']
 
+    @decorators.idempotent_id('66289664-bf01-40dd-a76d-fd2c953bbceb')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_share_network_without_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.get_share_network, "")
 
+    @decorators.idempotent_id('80397850-2f64-48b3-b19b-79c4ac0bd58f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_share_network_with_wrong_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.get_share_network, "wrong_id")
 
+    @decorators.idempotent_id('fe6ac194-5003-404c-b372-7515a58ff969')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_share_network_without_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.delete_share_network, "")
 
+    @decorators.idempotent_id('7e22e8b9-a1ce-480c-89b3-b4edd807285a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_share_network_with_wrong_type(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.delete_share_network, "wrong_id")
 
+    @decorators.idempotent_id('a7c55dbe-c23e-403f-b8aa-4aa1128f32a4')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_nonexistant_share_network(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.update_share_network,
                           "wrong_id", name="name")
 
+    @decorators.idempotent_id('984349ca-df7d-4f85-a45f-948189debb65')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_update_share_network_with_empty_id(self):
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.update_share_network,
                           "", name="name")
 
+    @decorators.idempotent_id('211b64b4-4c2b-4b6b-b011-725f40a37b03')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -76,6 +84,7 @@
                           self.shares_client.share_network_id,
                           neutron_net_id="new_net_id")
 
+    @decorators.idempotent_id('9166b81c-d6ab-4592-bcf7-9410250e30dd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_get_deleted_share_network(self):
         data = self.generate_share_network_data()
@@ -89,6 +98,7 @@
                           self.shares_client.get_security_service,
                           sn["id"])
 
+    @decorators.idempotent_id('0d104b72-aab5-48b5-87f8-847d2155faa9')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_share_networks_wrong_created_since_value(self):
         self.assertRaises(
@@ -96,6 +106,7 @@
             self.shares_client.list_share_networks_with_detail,
             params={'created_since': '2014-10-23T08:31:58.000000'})
 
+    @decorators.idempotent_id('c96dacaf-4cea-4fe9-bbd7-c9b1001f5495')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_list_share_networks_wrong_created_before_value(self):
         self.assertRaises(
@@ -103,6 +114,7 @@
             self.shares_client.list_share_networks_with_detail,
             params={'created_before': '2014-10-23T08:31:58.000000'})
 
+    @decorators.idempotent_id('6e4912fd-ae85-4a43-81e8-e5b340099b64')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(not CONF.share.multitenancy_enabled,
                       'Can run only with drivers that do handle share servers '
@@ -129,6 +141,7 @@
             lib_exc.Conflict,
             self.shares_client.delete_share_network, new_sn['id'])
 
+    @decorators.idempotent_id('4e71de31-1064-40da-948d-a72063fbd647')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.35")
     def test_list_shares_with_like_filter_not_exist(self):
@@ -143,6 +156,7 @@
         self.assertEqual(0, len(share_networks))
 
     @base.skip_if_microversion_lt("2.51")
+    @decorators.idempotent_id('8a995305-ede9-4002-a9cd-f24ff4d71f63')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_share_network_contains_more_than_one_subnet(self):
         share_network = self.create_share_network()
@@ -171,6 +185,7 @@
         self.assertIsNone(default_subnet['availability_zone'])
 
     @base.skip_if_microversion_lt("2.51")
+    @decorators.idempotent_id('d84c3c5c-5913-42d4-9a66-0d5a78295adb')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_create_share_network_inexistent_az(self):
         self.assertRaises(
diff --git a/manila_tempest_tests/tests/api/test_share_type_availability_zones.py b/manila_tempest_tests/tests/api/test_share_type_availability_zones.py
index 177cb8c..da77d5f 100644
--- a/manila_tempest_tests/tests/api/test_share_type_availability_zones.py
+++ b/manila_tempest_tests/tests/api/test_share_type_availability_zones.py
@@ -13,6 +13,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 import testtools
 
 from manila_tempest_tests.tests.api import base
@@ -46,6 +47,7 @@
         cls.valid_azs_spec = ', '.join(cls.valid_azs)
         cls.invalid_azs_spec = ', '.join(cls.invalid_azs)
 
+    @decorators.idempotent_id('23005fad-59e1-4a4b-994c-7377e34b4ec6')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('az1,     az2, az 3  ', 'az1,az2,az 3', 'az1   ,az2,   az 3')
     def test_share_type_azs_create_and_get_share_type(self, spec):
@@ -64,6 +66,7 @@
         self.assertEqual(
             'az1,az2,az 3', share_type['extra_specs']['availability_zones'])
 
+    @decorators.idempotent_id('545f1742-39dc-4bfb-8a81-6ec941b58fef')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('az1', 'az2', 'az 3', 'az1,  az 3', 'az 3, az1',
               'az2, az 3, az1')
@@ -90,6 +93,7 @@
         self.assertIn(share_type_in_specific_azs['id'], share_type_ids)
         self.assertIn(share_type_no_az_spec['id'], share_type_ids)
 
+    @decorators.idempotent_id('00a3e4ab-00a5-4683-a773-166353a69f28')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_share_type_azs_old_version_api_ignores_spec(self):
         """< v2.48, configuring share type AZs shouldn't fail share creation"""
@@ -110,6 +114,7 @@
         # regardless of the 'availability_zones' extra-spec
         self.assertIn(share['availability_zone'], self.valid_azs)
 
+    @decorators.idempotent_id('3399c706-5dcb-41b2-9701-4550bf4f81cb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(True, False)
     def test_share_type_azs_shares_az_in_create_req(self, specify_az):
@@ -127,6 +132,7 @@
         else:
             self.assertIn(share['availability_zone'], self.valid_azs)
 
+    @decorators.idempotent_id('fa5618ad-c452-41bd-8dc3-cc85abd6cee5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data(True, False)
     def test_share_type_azs_share_groups_az_in_create_req(self, specify_az):
diff --git a/manila_tempest_tests/tests/api/test_share_type_availability_zones_negative.py b/manila_tempest_tests/tests/api/test_share_type_availability_zones_negative.py
index e756d1a..b98a98d 100644
--- a/manila_tempest_tests/tests/api/test_share_type_availability_zones_negative.py
+++ b/manila_tempest_tests/tests/api/test_share_type_availability_zones_negative.py
@@ -11,6 +11,7 @@
 #    under the License.
 import ddt
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -42,6 +43,7 @@
         cls.valid_azs_spec = ', '.join(cls.valid_azs)
         cls.invalid_azs_spec = ', '.join(cls.invalid_azs)
 
+    @decorators.idempotent_id('7a23af8d-a995-43ac-a381-2cd5c5f57f39')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data('az1,     az2, az 3,  ', 'az1,,az 3', ',az2,  az 3')
     def test_share_type_azs_create_with_invalid_az_spec(self, spec):
@@ -56,6 +58,7 @@
             extra_specs=extra_specs,
             client=self.admin_shares_v2_client)
 
+    @decorators.idempotent_id('78f1afba-6087-415c-aaa1-a880ae341bfc')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_share_type_azs_filter_by_invalid_azs_extra_spec(self):
         self.admin_shares_v2_client.update_share_type_extra_spec(
@@ -73,6 +76,7 @@
         self.assertNotIn(self.share_type_id, share_type_ids)
         self.assertIn(share_type_no_az_spec['id'], share_type_ids)
 
+    @decorators.idempotent_id('9285d7d5-cb40-462d-998c-891f0f934fdd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_share_type_azs_shares_unsupported_az(self):
         """Test using an AZ not supported by the share type."""
@@ -84,6 +88,7 @@
             availability_zone=self.valid_azs[0],
             cleanup_in_class=False)
 
+    @decorators.idempotent_id('5712abae-52a5-46ec-8850-46e732b18b06')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_share_type_azs_share_groups_unsupported(self):
         self.admin_shares_v2_client.update_share_type_extra_spec(
diff --git a/manila_tempest_tests/tests/api/test_share_types_negative.py b/manila_tempest_tests/tests/api/test_share_types_negative.py
index 7ba6f86..95cc41f 100644
--- a/manila_tempest_tests/tests/api/test_share_types_negative.py
+++ b/manila_tempest_tests/tests/api/test_share_types_negative.py
@@ -13,15 +13,18 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import ddt
 import random
+
+import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
 
+
 CONF = config.CONF
 
 LATEST_MICROVERSION = CONF.share.max_api_microversion
@@ -45,6 +48,7 @@
         cls.st = cls._create_share_type()
         cls.st2 = cls._create_share_type()
 
+    @decorators.idempotent_id('d6a6ac4d-6582-408d-ba55-6f5128eb940e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_create_share_type_with_user(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -52,12 +56,14 @@
                           data_utils.rand_name("used_user_creds"),
                           client=self.shares_client)
 
+    @decorators.idempotent_id('857c664f-e634-4865-ba05-bdcd4336725d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_delete_share_type_with_user(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.shares_client.delete_share_type,
                           self.st["id"])
 
+    @decorators.idempotent_id('06203276-f6a3-4a07-a014-8749763395d6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_add_access_to_share_type_with_user(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -65,6 +71,7 @@
                           self.st['id'],
                           self.shares_client.tenant_id)
 
+    @decorators.idempotent_id('08b2d093-2ad8-46aa-8112-81d50547f36d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_try_remove_access_from_share_type_with_user(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -73,6 +80,7 @@
                           self.shares_client.tenant_id)
 
     @base.skip_if_microversion_lt("2.50")
+    @decorators.idempotent_id('4a22945c-8988-43a1-88c9-eb86e6abcd8e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data(
         ('2.50', '', None, None),
@@ -93,6 +101,7 @@
                           version)
 
     @base.skip_if_microversion_lt("2.50")
+    @decorators.idempotent_id('7193465a-ed8e-44d5-9ca9-4e8a3c5958e0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @ddt.data('2.50', LATEST_MICROVERSION)
     def test_share_type_update_conflict(self, version):
diff --git a/manila_tempest_tests/tests/api/test_shares.py b/manila_tempest_tests/tests/api/test_shares.py
index fce8247..48461b1 100644
--- a/manila_tempest_tests/tests/api/test_shares.py
+++ b/manila_tempest_tests/tests/api/test_shares.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -41,6 +42,7 @@
         cls.share = cls.create_share(cls.protocol,
                                      share_type_id=cls.share_type_id)
 
+    @decorators.idempotent_id('21ad41fb-04cf-493c-bc2f-66c80220898b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_create_get_delete_share(self):
 
@@ -127,6 +129,7 @@
                           self.shares_v2_client.get_share,
                           share['id'])
 
+    @decorators.idempotent_id('775f8f87-5727-4bb7-b69f-9ce6b9bdb140')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -161,6 +164,7 @@
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.get_snapshot, snap['id'])
 
+    @decorators.idempotent_id('8a14831d-ad1f-447f-b5de-2b8a233b24c0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -192,6 +196,7 @@
                "source of share %s" % (snap["id"], get["snapshot_id"]))
         self.assertEqual(get["snapshot_id"], snap["id"], msg)
 
+    @decorators.idempotent_id('c609c0b2-d649-4ca3-8334-629b213f5c72')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipIf(not CONF.share.multitenancy_enabled,
                       "Only for multitenancy.")
diff --git a/manila_tempest_tests/tests/api/test_shares_actions.py b/manila_tempest_tests/tests/api/test_shares_actions.py
index 4829dfd..7f48ee1 100644
--- a/manila_tempest_tests/tests/api/test_shares_actions.py
+++ b/manila_tempest_tests/tests/api/test_shares_actions.py
@@ -17,6 +17,7 @@
 import six
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 import testtools
 from testtools import testcase as tc
 
@@ -130,50 +131,60 @@
             CONF.share.share_size, share["size"])
         self.assertEqual(CONF.share.share_size, int(share["size"]), msg)
 
+    @decorators.idempotent_id('188badb2-0ca3-44e5-abca-3029475d7f73')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_v2_1(self):
         self._get_share('2.1')
 
+    @decorators.idempotent_id('45ec8e36-cb8a-4a03-8c41-ba5d5dc2a5c5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_get_share_with_snapshot_support_key(self):
         self._get_share('2.2')
 
+    @decorators.idempotent_id('b803a076-593a-469d-ab75-7e67ac294dd5')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.6')
     def test_get_share_with_share_type_name_key(self):
         self._get_share('2.6')
 
+    @decorators.idempotent_id('c13c1cf5-c708-4e62-8b71-c47dbb45a7a0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.9')
     def test_get_share_export_locations_removed(self):
         self._get_share('2.9')
 
+    @decorators.idempotent_id('2c439716-c34e-46f1-b055-41e411fb4e66')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.10')
     def test_get_share_with_access_rules_status(self):
         self._get_share('2.10')
 
+    @decorators.idempotent_id('67c9ad27-f26d-4ff9-a528-a35b4c5a55c1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.11')
     def test_get_share_with_replication_type_key(self):
         self._get_share('2.11')
 
+    @decorators.idempotent_id('2a61703d-5a62-49c5-b143-fea0c9125cd9')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.16')
     def test_get_share_with_user_id(self):
         self._get_share('2.16')
 
+    @decorators.idempotent_id('2899055e-607d-4423-b1b7-27eefa6ce5f0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.24')
     def test_get_share_with_create_share_from_snapshot_support(self):
         self._get_share('2.24')
 
+    @decorators.idempotent_id('04c359b5-74b3-4a07-9f9e-f0ac1867d58d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported(
         constants.REVERT_TO_SNAPSHOT_MICROVERSION)
     def test_get_share_with_revert_to_snapshot_support(self):
         self._get_share(constants.REVERT_TO_SNAPSHOT_MICROVERSION)
 
+    @decorators.idempotent_id('7d61311a-81b0-481c-abb9-cfb0b4f82e29')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares(self):
 
@@ -228,44 +239,53 @@
             msg = "expected id lists %s times in share list" % (len(gen))
             self.assertEqual(1, len(gen), msg)
 
+    @decorators.idempotent_id('d88a157a-fe4d-456e-90ba-f0bd9e5d02ec')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_v2_1(self):
         self._list_shares_with_detail('2.1')
 
+    @decorators.idempotent_id('ee57db25-0fbf-40ce-8dc1-070845d245a7')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_and_snapshot_support_key(self):
         self._list_shares_with_detail('2.2')
 
+    @decorators.idempotent_id('38a4cf70-8ed9-4a82-a338-9f20463b1147')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.6')
     def test_list_shares_with_detail_share_type_name_key(self):
         self._list_shares_with_detail('2.6')
 
+    @decorators.idempotent_id('a313cd85-53e5-48b7-b4a7-14e9273e843d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.9')
     def test_list_shares_with_detail_export_locations_removed(self):
         self._list_shares_with_detail('2.9')
 
+    @decorators.idempotent_id('0de4dc84-bace-4b9a-8470-a40c4a9b14b4')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.10')
     def test_list_shares_with_detail_with_access_rules_status(self):
         self._list_shares_with_detail('2.10')
 
+    @decorators.idempotent_id('70097cf3-76b8-49d2-b1c7-ad59394dd978')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.11')
     def test_list_shares_with_detail_replication_type_key(self):
         self._list_shares_with_detail('2.11')
 
+    @decorators.idempotent_id('f8e57190-b105-4937-b96e-55725eb64739')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported('2.16')
     def test_list_shares_with_user_id(self):
         self._list_shares_with_detail('2.16')
 
+    @decorators.idempotent_id('21410324-e0b5-452a-8c7e-599a27267e1d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_and_create_share_from_snapshot_support(
             self):
         self._list_shares_with_detail('2.24')
 
+    @decorators.idempotent_id('45041fc9-bb0d-4dd6-ac0d-a40a22a91f3f')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @utils.skip_if_microversion_not_supported(
         constants.REVERT_TO_SNAPSHOT_MICROVERSION)
@@ -273,6 +293,7 @@
         self._list_shares_with_detail(
             constants.REVERT_TO_SNAPSHOT_MICROVERSION)
 
+    @decorators.idempotent_id('bc24dc42-050b-4105-a90a-f5649cbd8e49')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_metadata(self):
         filters = {'metadata': self.metadata}
@@ -288,6 +309,7 @@
         if CONF.share.capability_create_share_from_snapshot_support:
             self.assertFalse(self.shares[1]['id'] in [s['id'] for s in shares])
 
+    @decorators.idempotent_id('685286c7-1df6-48c3-839d-8162737446b8')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
@@ -304,6 +326,7 @@
             self.assertEqual(
                 filters['share_network_id'], share['share_network_id'])
 
+    @decorators.idempotent_id('fd87884d-71a4-4ca8-8b2b-07b4df2de3bd')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -322,6 +345,7 @@
             self.assertEqual(filters['snapshot_id'], share['snapshot_id'])
         self.assertFalse(self.shares[0]['id'] in [s['id'] for s in shares])
 
+    @decorators.idempotent_id('70a9d947-bd45-46db-b529-6c48c0ff8985')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_with_asc_sorting(self):
         filters = {'sort_key': 'created_at', 'sort_dir': 'asc'}
@@ -334,6 +358,7 @@
         sorted_list = [share['created_at'] for share in shares]
         self.assertEqual(sorted(sorted_list), sorted_list)
 
+    @decorators.idempotent_id('866194c6-3910-409e-ad81-2cff223cfaaf')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_existed_name(self):
         # list shares by name, at least one share is expected
@@ -341,6 +366,7 @@
         shares = self.shares_client.list_shares_with_detail(params)
         self.assertEqual(self.share_name, shares[0]["name"])
 
+    @decorators.idempotent_id('f446e8cb-5bef-45ac-8b87-f4136f44ca69')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.36")
     def test_list_shares_with_detail_filter_by_existed_description(self):
@@ -349,6 +375,7 @@
         shares = self.shares_v2_client.list_shares_with_detail(params)
         self.assertEqual(self.share_name, shares[0]["name"])
 
+    @decorators.idempotent_id('1276b97b-cf46-4953-973f-f995985a1ce4')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.36")
     def test_list_shares_with_detail_filter_by_inexact_name(self):
@@ -358,6 +385,7 @@
         for share in shares:
             self.assertIn('tempest-share', share["name"])
 
+    @decorators.idempotent_id('56416b95-949f-4b09-9a5e-377b674efd25')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_fake_name(self):
         # list shares by fake name, no shares are expected
@@ -365,6 +393,7 @@
         shares = self.shares_client.list_shares_with_detail(params)
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('708e3e2e-8761-4d16-b18d-a834ee7ca69e')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_active_status(self):
         # list shares by active status, at least one share is expected
@@ -374,6 +403,7 @@
         for share in shares:
             self.assertEqual(params["status"], share["status"])
 
+    @decorators.idempotent_id('5ec2fcf8-18d4-4790-95de-45c8a05582c7')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_fake_status(self):
         # list shares by fake status, no shares are expected
@@ -381,6 +411,7 @@
         shares = self.shares_client.list_shares_with_detail(params)
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('7609b7bb-613e-474d-a9b3-e41584842503')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_detail_filter_by_all_tenants(self):
         # non-admin user can get shares only from his project
@@ -394,6 +425,7 @@
         for share in shares:
             self.assertEqual(project_id, share["project_id"])
 
+    @decorators.idempotent_id('0019afa2-fae2-417f-a7e0-2af665a966b0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.42")
     def test_list_shares_with_detail_with_count(self):
@@ -402,6 +434,7 @@
         shares = self.shares_v2_client.list_shares_with_detail(params)
         self.assertGreater(shares["count"], 0)
 
+    @decorators.idempotent_id('557a0474-9e30-47b4-a766-19e2afb13e66')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_public_with_detail(self):
         public_share = self.create_share(
@@ -435,6 +468,7 @@
 
         self.assertFalse(any([s["id"] == private_share["id"] for s in shares]))
 
+    @decorators.idempotent_id('174829eb-fd3e-46ef-880b-f05c3d44d1fe')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -491,6 +525,7 @@
                                  'actual': snapshot['project_id'],
                                  'key': 'project_id'})
 
+    @decorators.idempotent_id('3d5d85ff-6158-4af2-a765-cfa07a46adde')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -508,6 +543,7 @@
         msg = "expected id lists %s times in share list" % (len(gen))
         self.assertEqual(1, len(gen), msg)
 
+    @decorators.idempotent_id('4d717665-e4ca-47df-b4b9-f6d096159779')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -539,6 +575,7 @@
         msg = "expected id lists %s times in share list" % (len(gen))
         self.assertEqual(1, len(gen), msg)
 
+    @decorators.idempotent_id('80497a21-7533-47b5-93aa-29e0f7924cb9')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -565,6 +602,7 @@
         self.assertEqual(1, len(snaps['snapshots']))
         self.assertEqual(self.snap['id'], snaps['snapshots'][0]['id'])
 
+    @decorators.idempotent_id('0a94e996-c4db-4fef-b486-4004ea65c11a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -581,6 +619,7 @@
             self.assertEqual(filters['status'], snap['status'])
             self.assertEqual(filters['name'], snap['name'])
 
+    @decorators.idempotent_id('f969aba1-d293-48e3-a638-a89785bb41ef')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -597,6 +636,7 @@
         for snap in snaps:
             self.assertEqual(filters['description'], snap['description'])
 
+    @decorators.idempotent_id('59968026-12af-4029-a3d0-42c291b7db96')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -612,6 +652,7 @@
         sorted_list = [snap['share_id'] for snap in snaps]
         self.assertEqual(sorted(sorted_list), sorted_list)
 
+    @decorators.idempotent_id('17e6f579-e0d7-4724-a639-4974e82bb5ed')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_extend_tests,
@@ -636,6 +677,7 @@
         )
         self.assertEqual(new_size, share_get['size'], msg)
 
+    @decorators.idempotent_id('8f64b930-9b4e-41d7-bbd6-82d9951931f3')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_shrink_tests,
@@ -689,6 +731,7 @@
             cls.snap = cls.create_snapshot_wait_for_active(
                 cls.share["id"], cls.snap_name, cls.snap_desc)
 
+    @decorators.idempotent_id('7661d042-8222-483c-9249-9f53931e7347')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     def test_update_share(self):
 
@@ -713,6 +756,7 @@
         self.assertEqual(new_desc, share["description"])
         self.assertTrue(share["is_public"])
 
+    @decorators.idempotent_id('20f299f6-2441-4629-b44e-d791d57f413c')
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
diff --git a/manila_tempest_tests/tests/api/test_shares_actions_negative.py b/manila_tempest_tests/tests/api/test_shares_actions_negative.py
index d427294..5195d14 100644
--- a/manila_tempest_tests/tests/api/test_shares_actions_negative.py
+++ b/manila_tempest_tests/tests/api/test_shares_actions_negative.py
@@ -16,6 +16,7 @@
 import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -50,6 +51,7 @@
             cls.snap = cls.create_snapshot_wait_for_active(
                 cls.share["id"], cls.snap_name, cls.snap_desc)
 
+    @decorators.idempotent_id('c4481ba3-0cff-448b-a728-69a9a34e3aa6')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_extend_tests,
@@ -68,6 +70,7 @@
                           self.share['id'],
                           new_size)
 
+    @decorators.idempotent_id('3448cd2b-34eb-453f-b72f-39fbea778e42')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_extend_tests,
@@ -81,6 +84,7 @@
                           self.share['id'],
                           new_size)
 
+    @decorators.idempotent_id('79f2304a-7959-4169-8a76-b67814e0733a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_extend_tests,
@@ -94,6 +98,7 @@
                           self.share['id'],
                           new_size)
 
+    @decorators.idempotent_id('067c4b10-4324-45ac-8365-5d446b66c18a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_extend_tests,
@@ -112,6 +117,7 @@
                           share['id'],
                           new_size)
 
+    @decorators.idempotent_id('99d42f94-8da1-4c04-ad5b-9738d6acc139')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_shrink_tests,
@@ -125,6 +131,7 @@
                           self.share['id'],
                           new_size)
 
+    @decorators.idempotent_id('3d4c8f34-49b8-4628-b1cb-652ae67473a5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_shrink_tests,
@@ -138,6 +145,7 @@
                           self.share['id'],
                           new_size)
 
+    @decorators.idempotent_id('d53ece5c-70e4-4953-a1d7-7d4384510519')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_shrink_tests,
@@ -158,6 +166,7 @@
                           share['id'],
                           new_size)
 
+    @decorators.idempotent_id('ff307c91-3bb9-48b5-926c-5a2747320151')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.34")
     @ddt.data('path', 'id')
@@ -174,6 +183,7 @@
 
         self.assertGreater(len(shares), 0)
 
+    @decorators.idempotent_id('ffc3dc76-2f92-4308-a125-1d3905ed72ba')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_lt("2.35")
     @ddt.data('path', 'id')
@@ -187,6 +197,7 @@
 
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('3dbcf17b-cc63-43ea-b45f-eae12300729e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.36")
     def test_list_shares_with_like_filter_and_invalid_version(self):
@@ -202,6 +213,7 @@
 
         self.assertGreater(len(shares), 0)
 
+    @decorators.idempotent_id('f41c6cd2-62cf-4bba-a26e-21a6e86eae15')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.36")
     def test_list_shares_with_like_filter_not_exist(self):
@@ -213,6 +225,7 @@
 
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('31e33495-5ec3-4658-bdef-d9d1e034705a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_list_shares_with_name_not_exist(self):
         filters = {
@@ -222,6 +235,7 @@
 
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('5b0ceae1-357f-4b51-81a6-88973ea20c16')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.36")
     def test_list_shares_with_description_not_exist(self):
@@ -232,6 +246,7 @@
 
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('061ee37a-96b2-4b4f-9cfe-2c8c80ed4370')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @base.skip_if_microversion_not_supported("2.36")
     def test_list_snapshots_with_description_not_exist(self):
@@ -243,6 +258,7 @@
 
         self.assertEqual(0, len(shares))
 
+    @decorators.idempotent_id('9d3c3158-1a92-4e37-b00f-a4a40b813109')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_list_snapshots_with_name_not_exist(self):
         filters = {
diff --git a/manila_tempest_tests/tests/api/test_shares_from_snapshot_across_pools.py b/manila_tempest_tests/tests/api/test_shares_from_snapshot_across_pools.py
index d71202d..f8c5255 100644
--- a/manila_tempest_tests/tests/api/test_shares_from_snapshot_across_pools.py
+++ b/manila_tempest_tests/tests/api/test_shares_from_snapshot_across_pools.py
@@ -16,6 +16,7 @@
 from collections import defaultdict
 
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
@@ -69,6 +70,7 @@
                 'disabled.')
         utils.check_skip_if_microversion_lt("2.54")
 
+    @decorators.idempotent_id('6f1fa7d0-94f2-4373-8730-b0986781cc88')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_create_share_from_snapshot_across_pools_within_backend(self):
         backends = [pool['backend'] for pool in self.pools]
@@ -133,6 +135,7 @@
                " source share %s" % pool_name_a)
         self.assertNotEqual(pool_name_a, pool_name_b, msg)
 
+    @decorators.idempotent_id('46f33338-d70d-4c9a-ae27-3dd5b7bd1531')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_share_from_snapshot_across_azs(self):
         azs = next((self.rep_domain_azs[rep] for rep in self.rep_domain_azs if
diff --git a/manila_tempest_tests/tests/api/test_shares_negative.py b/manila_tempest_tests/tests/api/test_shares_negative.py
index 09a45cd..9ee4202 100644
--- a/manila_tempest_tests/tests/api/test_shares_negative.py
+++ b/manila_tempest_tests/tests/api/test_shares_negative.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 import testtools
 from testtools import testcase as tc
@@ -42,12 +43,14 @@
             metadata={'key': 'value'}
         )
 
+    @decorators.idempotent_id('255011c0-4ed9-4174-bb13-8bbd06a62529')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_update_share_with_wrong_public_value(self):
         self.assertRaises(lib_exc.BadRequest,
                           self.shares_client.update_share, self.share["id"],
                           is_public="truebar")
 
+    @decorators.idempotent_id('b9bb8dee-0c7c-4e51-909c-028335b1a6a0')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -64,6 +67,7 @@
         self.assertRaises(lib_exc.Forbidden,
                           self.shares_client.delete_share, share["id"])
 
+    @decorators.idempotent_id('3df8e2d8-9b79-428d-9d8b-30bc66b5b40e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -96,6 +100,7 @@
                           snapshot_id=snap["id"],
                           cleanup_in_class=False)
 
+    @decorators.idempotent_id('3047fb1c-5acc-4ef2-8796-b2d2d49829b5')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(not CONF.share.multitenancy_enabled,
                       "Only for multitenancy.")
@@ -105,6 +110,7 @@
                           share_type_id=self.share_type_id,
                           share_network_id="wrong_sn_id")
 
+    @decorators.idempotent_id('e84ce567-a090-47c7-87c4-6ee427bdee7a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(not CONF.share.multitenancy_enabled,
                       "Only for multitenancy.")
@@ -148,6 +154,7 @@
             snapshot_id=snap["id"],
         )
 
+    @decorators.idempotent_id('3443493b-f56a-4faa-9968-e7cbb0d2802f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_update_other_tenants_public_share(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -155,12 +162,14 @@
                           self.share["id"],
                           name="new_name")
 
+    @decorators.idempotent_id('68d1f1bc-16e4-4086-8982-7e44ca6bdc4d')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_other_tenants_public_share(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.alt_shares_v2_client.delete_share,
                           self.share['id'])
 
+    @decorators.idempotent_id('1f9e5d84-0885-4a4b-9196-9031a1c01508')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_set_metadata_of_other_tenants_public_share(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -168,6 +177,7 @@
                           self.share['id'],
                           {'key': 'value'})
 
+    @decorators.idempotent_id('fed7a935-9699-43a1-854e-67b61ba6233e')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_update_metadata_of_other_tenants_public_share(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -175,6 +185,7 @@
                           self.share['id'],
                           {'key': 'value'})
 
+    @decorators.idempotent_id('bd62adeb-73c2-4b04-8812-80b479cd5c3b')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     def test_delete_metadata_of_other_tenants_public_share(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -192,12 +203,14 @@
         cls.share_type = cls._create_share_type()
         cls.share_type_id = cls.share_type['id']
 
+    @decorators.idempotent_id('75837f93-8c2c-40a4-bb9e-d76c53db07c7')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_unmanage_share_by_user(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.shares_client.unmanage_share,
                           'fake-id')
 
+    @decorators.idempotent_id('97a4dd2f-7c90-4eb7-bf74-d698c3060833')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_manage_share_by_user(self):
         self.assertRaises(lib_exc.Forbidden,
@@ -205,18 +218,21 @@
                           'fake-host', 'nfs', '/export/path',
                           'fake-type')
 
+    @decorators.idempotent_id('1a438374-8a91-4566-9cef-0386f6609445')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_by_user_with_host_filter(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.shares_v2_client.list_shares,
                           params={'host': 'fake_host'})
 
+    @decorators.idempotent_id('73f37f33-946d-4213-9d27-25cd4e9a0208')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_by_share_server_by_user(self):
         self.assertRaises(lib_exc.Forbidden,
                           self.shares_client.list_shares,
                           params={'share_server_id': 12345})
 
+    @decorators.idempotent_id('2f0df934-b2fb-4ebd-96f7-183cb699dcdd')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_non_existent_az(self):
         self.assertRaises(lib_exc.NotFound,
@@ -224,6 +240,7 @@
                           share_type_id=self.share_type_id,
                           availability_zone='fake_az')
 
+    @decorators.idempotent_id('5ae2ecd7-a694-4ba9-ae23-cca75580b9d8')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_with_zero_size(self):
         self.assertRaises(lib_exc.BadRequest,
@@ -231,6 +248,7 @@
                           share_type_id=self.share_type_id,
                           size=0)
 
+    @decorators.idempotent_id('3620a380-f9f9-4521-a468-473581637344')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_with_invalid_size(self):
         self.assertRaises(lib_exc.BadRequest,
@@ -238,6 +256,7 @@
                           share_type_id=self.share_type_id,
                           size="#$%")
 
+    @decorators.idempotent_id('26ed523d-a215-4661-a038-633b74c9cad7')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_with_out_passing_size(self):
         self.assertRaises(lib_exc.BadRequest,
@@ -245,6 +264,7 @@
                           share_type_id=self.share_type_id,
                           size="")
 
+    @decorators.idempotent_id('bf303b29-bbcb-4a96-96e9-270e12df58d1')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -253,6 +273,7 @@
                           self.shares_client.delete_snapshot,
                           "wrong_share_id")
 
+    @decorators.idempotent_id('08e5a9c7-45cb-414c-b375-28c335f20ff1')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     @testtools.skipUnless(CONF.share.run_snapshot_tests,
                           "Snapshot tests are disabled.")
@@ -261,6 +282,7 @@
                           self.shares_client.create_snapshot,
                           "wrong_share_id")
 
+    @decorators.idempotent_id('78e5e327-c68e-4910-82b2-27f5f4d150ac')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_with_invalid_protocol(self):
         self.assertRaises(lib_exc.BadRequest,
@@ -268,6 +290,7 @@
                           share_type_id=self.share_type_id,
                           share_protocol="nonexistent_protocol")
 
+    @decorators.idempotent_id('2b7c7ea8-c0e9-446c-a8e3-add765452c04')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_create_share_with_wrong_public_value(self):
         self.assertRaises(lib_exc.BadRequest,
@@ -275,17 +298,20 @@
                           share_type_id=self.share_type_id,
                           is_public='truebar')
 
+    @decorators.idempotent_id('f82d1667-ae39-43bb-b5aa-bfc9b2ec7292')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_share_with_wrong_id(self):
         self.assertRaises(lib_exc.NotFound, self.shares_client.get_share,
                           "wrong_share_id")
 
+    @decorators.idempotent_id('d03cf44e-6e69-415f-be36-25defb86df56')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_get_share_without_passing_share_id(self):
         # Should not be able to get share when empty ID is passed
         self.assertRaises(lib_exc.NotFound,
                           self.shares_client.get_share, '')
 
+    @decorators.idempotent_id('a9487254-606b-444f-ba6a-2f461bcaf474')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_list_shares_nonadmin_with_nonexistent_share_server_filter(self):
         # filtering by share server allowed only for admins by default
@@ -293,11 +319,13 @@
                           self.shares_client.list_shares_with_detail,
                           {'share_server_id': 'fake_share_server_id'})
 
+    @decorators.idempotent_id('9698d1a3-8ee8-46fa-a46b-1084d98e7149')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_share_with_wrong_id(self):
         self.assertRaises(lib_exc.NotFound, self.shares_client.delete_share,
                           "wrong_share_id")
 
+    @decorators.idempotent_id('b8097d56-067e-4d7c-8401-31bc7021fd24')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API)
     def test_delete_share_without_passing_share_id(self):
         # Should not be able to delete share when empty ID is passed
diff --git a/manila_tempest_tests/tests/api/test_snapshot_rules.py b/manila_tempest_tests/tests/api/test_snapshot_rules.py
index 0323916..e793843 100644
--- a/manila_tempest_tests/tests/api/test_snapshot_rules.py
+++ b/manila_tempest_tests/tests/api/test_snapshot_rules.py
@@ -13,15 +13,16 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import six
-
 import ddt
+import six
 from tempest import config
+from tempest.lib import decorators
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 
 
@@ -83,6 +84,7 @@
         super(ShareSnapshotIpRulesForNFSTest, cls).resource_setup()
         cls.access_type = "ip"
 
+    @decorators.idempotent_id('bdce2be8-80b9-4f68-bdc0-09a52ba0e6fd')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @ddt.data("1.1.1.1", "1.2.3.4/32")
     def test_create_delete_access_rules(self, access_to):
@@ -110,6 +112,7 @@
         super(ShareSnapshotUserRulesForCIFSTest, cls).resource_setup()
         cls.access_type = "user"
 
+    @decorators.idempotent_id('c2625cd2-4dc0-431d-b47b-8f097e22f16d')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_create_delete_access_rules(self):
         access_to = CONF.share.username_for_user_rules
diff --git a/manila_tempest_tests/tests/api/test_snapshot_rules_negative.py b/manila_tempest_tests/tests/api/test_snapshot_rules_negative.py
index f9670db..92bd639 100644
--- a/manila_tempest_tests/tests/api/test_snapshot_rules_negative.py
+++ b/manila_tempest_tests/tests/api/test_snapshot_rules_negative.py
@@ -15,6 +15,7 @@
 
 import ddt
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 from testtools import testcase as tc
 
@@ -56,6 +57,7 @@
                                      share_type_id=cls.share_type_id)
         cls.snap = cls.create_snapshot_wait_for_active(cls.share["id"])
 
+    @decorators.idempotent_id('a877276e-03d4-4fc5-b4b4-c8874d23f1dc')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data("1.2.3.256", "1.1.1.-", "1.2.3.4/33", "1.2.3.*", "1.2.3.*/23",
               "1.2.3.1|23", "1.2.3.1/", "1.2.3.1/-1",
@@ -67,6 +69,7 @@
                           self.shares_v2_client.create_snapshot_access_rule,
                           self.snap["id"], "ip", target)
 
+    @decorators.idempotent_id('dd93150f-8081-4533-abb3-f99a03652a87')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
     @ddt.data("1.2.3.4", "fd8c:b029:bba6:ac54::1",
               "fd8c:b029:bba6:ac54::1/128", "1.2.3.4/32")
diff --git a/manila_tempest_tests/tests/scenario/manager.py b/manila_tempest_tests/tests/scenario/manager.py
index c83dfe6..1fa03f4 100644
--- a/manila_tempest_tests/tests/scenario/manager.py
+++ b/manila_tempest_tests/tests/scenario/manager.py
@@ -21,7 +21,6 @@
 from oslo_utils import netutils
 from oslo_utils import uuidutils
 import six
-
 from tempest.common import compute
 from tempest.common import image as common_image
 from tempest.common.utils.linux import remote_client
@@ -32,14 +31,14 @@
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import exceptions as lib_exc
-import tempest.test
+from tempest import test
 
 CONF = config.CONF
 
 LOG = log.getLogger(__name__)
 
 
-class ScenarioTest(tempest.test.BaseTestCase):
+class ScenarioTest(test.BaseTestCase):
     """Base class for scenario tests. Uses tempest own clients. """
 
     credentials = ['primary']
diff --git a/manila_tempest_tests/tests/scenario/manager_share.py b/manila_tempest_tests/tests/scenario/manager_share.py
index 06bf6c2..7067e6b 100644
--- a/manila_tempest_tests/tests/scenario/manager_share.py
+++ b/manila_tempest_tests/tests/scenario/manager_share.py
@@ -13,9 +13,16 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempfile import mkstemp
+
 from oslo_log import log
 import six
 from six.moves.urllib.request import urlopen
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import exceptions
 
 from manila_tempest_tests.common import constants
 from manila_tempest_tests.common import remote_client
@@ -23,13 +30,6 @@
 from manila_tempest_tests.tests.scenario import manager
 from manila_tempest_tests import utils
 
-from tempest.common import waiters
-from tempest import config
-from tempest.lib.common.utils import data_utils
-from tempest.lib import exceptions
-
-from tempfile import mkstemp
-
 CONF = config.CONF
 LOG = log.getLogger(__name__)
 
@@ -98,17 +98,6 @@
                                             flavor=self.flavor_ref,
                                             ssh_user=self.ssh_user))
 
-        self.security_group = self._create_security_group()
-        self.network = self._create_network(namestart="manila-share")
-        self.subnet = self._create_subnet(
-            network=self.network,
-            namestart="manila-share-sub",
-            ip_version=self.ip_version,
-            use_default_subnetpool=self.ipv6_enabled)
-        router = self._get_router()
-        self._create_router_interface(subnet_id=self.subnet['id'],
-                                      router_id=router['id'])
-
         self.storage_network = (
             self._get_network_by_name_or_id(CONF.share.storage_network)
             if CONF.share.storage_network else None
@@ -117,6 +106,24 @@
             self.storage_network['name'] if self.storage_network else None
         )
 
+        # Tests need to be able to ssh into the VM - so we need
+        # a security group, and a tenant private network
+        self.security_group = self._create_security_group()
+        self.network = self._create_network(namestart="manila-share")
+        # When not using a "storage network" to connect shares to VMs,
+        # we need the subnet to match the IP version we're testing
+        subnet_ip_params = {} if self.storage_network else {
+            'ip_version': self.ip_version,
+            'use_default_subnetpool': self.ipv6_enabled
+        }
+        self.subnet = self._create_subnet(
+            network=self.network,
+            namestart="manila-share-sub",
+            **subnet_ip_params)
+        router = self._get_router()
+        self._create_router_interface(subnet_id=self.subnet['id'],
+                                      router_id=router['id'])
+
         if CONF.share.multitenancy_enabled:
             # Skip if DHSS=False
             self.share_network = self.create_share_network()
@@ -193,6 +200,24 @@
         self.share = self.shares_client.get_share(self.share['id'])
         return remote_client
 
+    def validate_ping_to_export_location(self, export, remote_client,
+                                         ping_timeout=None):
+        timeout = ping_timeout or CONF.validation.ping_timeout
+
+        def ping_to_export_location(export, remote_client):
+            ip, version = self.get_ip_and_version_from_export_location(export)
+            try:
+                remote_client.exec_command(
+                    "ping{} -c5 -w1 {}".format(
+                        '6' if version == 6 else '', ip))
+                return True
+            except exceptions.SSHExecCommandFailed:
+                return False
+
+        test_utils.call_until_true(ping_to_export_location,
+                                   timeout, 1, export=export,
+                                   remote_client=remote_client)
+
     def write_data_to_mounted_share(self, escaped_string, remote_client,
                                     mount_point='/mnt/t1'):
         remote_client.exec_command("echo \"{escaped_string}\" "
diff --git a/manila_tempest_tests/tests/scenario/test_share_basic_ops.py b/manila_tempest_tests/tests/scenario/test_share_basic_ops.py
index ef73919..c2f019e 100644
--- a/manila_tempest_tests/tests/scenario/test_share_basic_ops.py
+++ b/manila_tempest_tests/tests/scenario/test_share_basic_ops.py
@@ -14,9 +14,9 @@
 #    under the License.
 
 import ddt
-
 from oslo_log import log as logging
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions
 import testtools
 from testtools import testcase as tc
@@ -26,6 +26,7 @@
 from manila_tempest_tests.tests.scenario import manager_share as manager
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 LOG = logging.getLogger(__name__)
 
@@ -51,6 +52,7 @@
         else:
             remote_client.exec_command("ping -c 5 %s" % ip)
 
+    @decorators.idempotent_id('825be71c-cf14-4884-a0ad-cf47d511df9a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_mount_share_one_vm(self):
         instance = self.boot_instance(wait_until="BUILD")
@@ -65,6 +67,7 @@
             self.mount_share(location, remote_client)
             self.unmount_share(remote_client)
 
+    @decorators.idempotent_id('7cc61131-90e1-42fb-9f07-d3786efb338f')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_BACKEND)
     def test_write_with_ro_access(self):
         '''Test if an instance with ro access can write on the share.'''
@@ -96,6 +99,7 @@
                           self.write_data_to_mounted_share,
                           test_data, remote_client_inst)
 
+    @decorators.idempotent_id('5e184576-c7d1-4c16-9b7c-bc9bcd65ba58')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_read_write_two_vms(self):
         """Boots two vms and writes/reads data on it."""
@@ -133,6 +137,7 @@
         data = self.read_data_from_mounted_share(remote_client_inst2)
         self.assertEqual(test_data, data)
 
+    @decorators.idempotent_id('15d42949-545e-4ad8-b06e-bb2556c54375')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.29")
     @testtools.skipUnless(CONF.share.run_host_assisted_migration_tests or
@@ -241,6 +246,7 @@
         self.assertIn('1m4.bin', output)
         self.assertIn('1m5.bin', output)
 
+    @decorators.idempotent_id('87b803bf-679a-492b-a538-af4c9ff013c8')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(
         CONF.share.capability_create_share_from_snapshot_support,
@@ -323,6 +329,7 @@
         self.assertNotIn('file2', output)
         self.assertIn('file3', output)
 
+    @decorators.idempotent_id('c98e6876-3a4f-40e8-8b4f-023c94c242c3')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @base.skip_if_microversion_lt("2.32")
     @testtools.skipUnless(CONF.share.run_mount_snapshot_tests,
@@ -404,7 +411,7 @@
 
     def mount_share(self, location, remote_client, target_dir=None):
 
-        self._ping_host_from_export_location(location, remote_client)
+        self.validate_ping_to_export_location(location, remote_client)
 
         target_dir = target_dir or "/mnt"
         remote_client.exec_command(
@@ -428,7 +435,7 @@
 
     def mount_share(self, location, remote_client, target_dir=None):
 
-        self._ping_host_from_export_location(location, remote_client)
+        self.validate_ping_to_export_location(location, remote_client)
 
         location = location.replace("\\", "/")
         target_dir = target_dir or "/mnt"
@@ -436,17 +443,20 @@
             "sudo mount.cifs \"%s\" %s -o guest" % (location, target_dir)
         )
 
+    @decorators.idempotent_id('4344a47a-d316-496b-97a4-12a59297950a')
     @tc.attr(base.TAG_NEGATIVE, base.TAG_BACKEND)
     def test_write_with_ro_access(self):
         msg = ("Skipped for CIFS protocol because RO access is not "
                "supported for shares by IP.")
         raise self.skipException(msg)
 
+    @decorators.idempotent_id('a691332b-dd7a-4041-9bbd-3893e168aefa')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_read_mountable_snapshot(self):
         msg = "Skipped for CIFS protocol because of bug/1649573"
         raise self.skipException(msg)
 
+    @decorators.idempotent_id('8c936c3e-4793-49d2-8409-4038f03e7012')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_write_data_to_share_created_from_snapshot(self):
         msg = "Skipped for CIFS protocol because of bug/1649573"
@@ -456,16 +466,19 @@
 class TestShareBasicOpsCEPHFS(ShareBasicOpsBase, manager.BaseShareCEPHFSTest):
     protocol = "cephfs"
 
+    @decorators.idempotent_id('9fb12879-45b3-4042-acac-82be338dbde1')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_mount_share_one_vm_with_ceph_fuse_client(self):
         self.mount_client = 'fuse'
         super(TestShareBasicOpsCEPHFS, self).test_mount_share_one_vm()
 
+    @decorators.idempotent_id('a2a70b94-f5fc-438a-9dfa-53aa60ee3949')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_write_with_ro_access_with_ceph_fuse_client(self):
         self.mount_client = 'fuse'
         super(TestShareBasicOpsCEPHFS, self).test_write_with_ro_access()
 
+    @decorators.idempotent_id('c247f51f-0ffc-4a4f-894c-781647619faf')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_read_write_two_vms_with_ceph_fuse_client(self):
         self.mount_client = 'fuse'
diff --git a/manila_tempest_tests/tests/scenario/test_share_extend.py b/manila_tempest_tests/tests/scenario/test_share_extend.py
index e0a1e4a..a813112 100644
--- a/manila_tempest_tests/tests/scenario/test_share_extend.py
+++ b/manila_tempest_tests/tests/scenario/test_share_extend.py
@@ -11,11 +11,11 @@
 #    under the License.
 
 import ddt
-import six
-
 from oslo_log import log as logging
 from oslo_utils import units
+import six
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions
 from testtools import testcase as tc
 
@@ -23,6 +23,7 @@
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests.tests.scenario import manager_share as manager
 
+
 CONF = config.CONF
 LOG = logging.getLogger(__name__)
 
@@ -45,6 +46,7 @@
      * Terminate the instance
     """
 
+    @decorators.idempotent_id('e1c0d614-c8f2-43cf-9c49-25808b07ba4a')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_create_extend_and_write(self):
         default_share_size = CONF.share.share_size
@@ -159,6 +161,9 @@
             instance=kwargs['instance'], access_level=access_level)
 
     def mount_share(self, location, remote_client, target_dir=None):
+
+        self.validate_ping_to_export_location(location, remote_client)
+
         target_dir = target_dir or "/mnt"
         remote_client.exec_command(
             "sudo mount -vt nfs \"%s\" %s" % (location, target_dir)
@@ -181,6 +186,9 @@
             instance=kwargs['instance'], access_level=access_level)
 
     def mount_share(self, location, remote_client, target_dir=None):
+
+        self.validate_ping_to_export_location(location, remote_client)
+
         location = location.replace("\\", "/")
         target_dir = target_dir or "/mnt"
         remote_client.exec_command(
@@ -191,12 +199,17 @@
 class TestShareExtendCEPHFS(ShareExtendBase, manager.BaseShareCEPHFSTest):
     protocol = "cephfs"
 
+    @decorators.idempotent_id('9ca1e4a9-23e3-4da6-a63e-46e7919335e0')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_create_extend_and_write_with_ceph_fuse_client(self):
         self.mount_client = 'fuse'
         super(TestShareExtendCEPHFS, self).test_create_extend_and_write()
 
 
+class TestShareExtendNFSIPv6(TestShareExtendNFS):
+    ip_version = 6
+
+
 # NOTE(u_glide): this function is required to exclude ShareExtendBase
 # from executed test cases.
 # See: https://docs.python.org/3/library/unittest.html#load-tests-protocol
diff --git a/manila_tempest_tests/tests/scenario/test_share_manage_unmanage.py b/manila_tempest_tests/tests/scenario/test_share_manage_unmanage.py
index d58378c..7da1974 100644
--- a/manila_tempest_tests/tests/scenario/test_share_manage_unmanage.py
+++ b/manila_tempest_tests/tests/scenario/test_share_manage_unmanage.py
@@ -11,9 +11,9 @@
 #    under the License.
 
 import ddt
-
 from oslo_log import log as logging
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions
 import testtools
 from testtools import testcase as tc
@@ -22,6 +22,7 @@
 from manila_tempest_tests.tests.scenario import manager_share as manager
 from manila_tempest_tests import utils
 
+
 CONF = config.CONF
 LOG = logging.getLogger(__name__)
 
@@ -59,6 +60,7 @@
                        cls.protocol)
             raise cls.skipException(message)
 
+    @decorators.idempotent_id('165f22b4-9417-45ee-8e1d-2b8669ac2f00')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_manage_unmanage_tests,
@@ -178,6 +180,9 @@
     protocol = "nfs"
 
     def mount_share(self, location, remote_client, target_dir=None):
+
+        self.validate_ping_to_export_location(location, remote_client)
+
         target_dir = target_dir or "/mnt"
         remote_client.exec_command(
             "sudo mount -vt nfs \"%s\" %s" % (location, target_dir)
@@ -188,6 +193,9 @@
     protocol = "cifs"
 
     def mount_share(self, location, remote_client, target_dir=None):
+
+        self.validate_ping_to_export_location(location, remote_client)
+
         location = location.replace("\\", "/")
         target_dir = target_dir or "/mnt"
         remote_client.exec_command(
@@ -195,6 +203,10 @@
         )
 
 
+class ShareManageUnmanageNFSIPv6(ShareManageUnmanageNFS):
+    ip_version = 6
+
+
 # NOTE(u_glide): this function is required to exclude ShareManageUnmanageBase
 # from executed test cases.
 # See: https://docs.python.org/3/library/unittest.html#load-tests-protocol
diff --git a/manila_tempest_tests/tests/scenario/test_share_shrink.py b/manila_tempest_tests/tests/scenario/test_share_shrink.py
index 785c6ce..b6a8cda 100644
--- a/manila_tempest_tests/tests/scenario/test_share_shrink.py
+++ b/manila_tempest_tests/tests/scenario/test_share_shrink.py
@@ -10,11 +10,12 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import six
 import time
 
 from oslo_log import log as logging
+import six
 from tempest import config
+from tempest.lib import decorators
 from tempest.lib import exceptions
 import testtools
 from testtools import testcase as tc
@@ -23,6 +24,7 @@
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests.tests.scenario import manager_share as manager
 
+
 CONF = config.CONF
 LOG = logging.getLogger(__name__)
 
@@ -46,6 +48,7 @@
      * Terminate the instance
     """
 
+    @decorators.idempotent_id('ed0f9c0c-5302-4cc9-9f5d-f7641cc3b83b')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_shrink_tests, 'Shrink share tests are disabled.')
@@ -173,6 +176,9 @@
             instance=kwargs['instance'], access_level=access_level)
 
     def mount_share(self, location, ssh_client, target_dir=None):
+
+        self.validate_ping_to_export_location(location, ssh_client)
+
         target_dir = target_dir or "/mnt"
         ssh_client.exec_command(
             "sudo mount -vt nfs \"%s\" %s" % (location, target_dir)
@@ -195,6 +201,9 @@
             instance=kwargs['instance'], access_level=access_level)
 
     def mount_share(self, location, ssh_client, target_dir=None):
+
+        self.validate_ping_to_export_location(location, ssh_client)
+
         location = location.replace("\\", "/")
         target_dir = target_dir or "/mnt"
         ssh_client.exec_command(
@@ -205,12 +214,17 @@
 class TestShareShrinkCEPHFS(ShareShrinkBase, manager.BaseShareCEPHFSTest):
     protocol = "cephfs"
 
+    @decorators.idempotent_id('7fb324ed-7479-4bd9-b022-b3739dee9bcb')
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_create_shrink_and_write_with_ceph_fuse_client(self):
         self.mount_client = 'fuse'
         super(TestShareShrinkCEPHFS, self).test_create_shrink_and_write()
 
 
+class TestShareShrinkNFSIPv6(TestShareShrinkNFS):
+    ip_version = 6
+
+
 # NOTE(u_glide): this function is required to exclude ShareShrinkBase from
 # executed test cases.
 # See: https://docs.python.org/3/library/unittest.html#load-tests-protocol
diff --git a/manila_tempest_tests/utils.py b/manila_tempest_tests/utils.py
index e842a33..f30c0fc 100644
--- a/manila_tempest_tests/utils.py
+++ b/manila_tempest_tests/utils.py
@@ -13,10 +13,10 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from netaddr import ip
 import random
 import re
 
+from netaddr import ip
 import six
 from tempest import config
 import testtools
diff --git a/test-requirements.txt b/test-requirements.txt
index f230fa9..cf025c3 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -13,3 +13,4 @@
 openstackdocstheme>=1.31.2 # Apache-2.0
 # releasenotes
 reno>=2.5.0 # Apache-2.0
+flake8-import-order
diff --git a/tox.ini b/tox.ini
index a185fab..da879bf 100644
--- a/tox.ini
+++ b/tox.ini
@@ -20,7 +20,12 @@
 # commands = python setup.py test --slowest --testr-args='{posargs}'
 
 [testenv:pep8]
-commands = flake8 {posargs}
+commands =
+    flake8 {posargs}
+    check-uuid --package manila_tempest_tests
+
+[testenv:uuidgen]
+commands = check-uuid --fix --package manila_tempest_tests
 
 [testenv:venv]
 commands = {posargs}
@@ -43,3 +48,5 @@
 ignore = E123,E125,W503,W504
 builtins = _
 exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
+import-order-style = pep8
+application-import-names = manila_tempest_tests
diff --git a/zuul.d/manila-tempest-jobs.yaml b/zuul.d/manila-tempest-jobs.yaml
index 7c4c5e3..1dfe3f8 100644
--- a/zuul.d/manila-tempest-jobs.yaml
+++ b/zuul.d/manila-tempest-jobs.yaml
@@ -290,11 +290,7 @@
     vars:
       devstack_plugins:
         devstack-plugin-ceph: https://opendev.org/openstack/devstack-plugin-ceph
-      tempest_test_regex: manila_tempest_tests
-      # Those tests fail when using kernel client, because right now CephFS quotas
-      # is not supported. So for now those tests should be blacklisted.
-      # TODO(lkuchlan) un-blacklist those test when https://review.opendev.org/#/c/676722 will land.
-      tempest_black_regex: '(TestShareShrinkCEPHFS.test_create_shrink_and_write|TestShareExtendCEPHFS.test_create_extend_and_write)(\[.*\bbackend\b.*\])'
+      tempest_test_regex: manila_tempest_tests.tests
       devstack_localrc:
         SHARE_DRIVER: manila.share.drivers.cephfs.driver.CephFSDriver
         MANILA_ENABLED_BACKENDS: cephfsnative
@@ -304,8 +300,11 @@
         MANILA_OPTGROUP_cephfsnative_driver_handles_share_servers: false
         MANILA_OPTGROUP_cephfsnative_cephfs_conf_path: /etc/ceph/ceph.conf
         MANILA_OPTGROUP_cephfsnative_cephfs_auth_id: manila
-        MANILA_SERVICE_IMAGE_URL: https://tarballs.opendev.org/openstack/manila-image-elements/images/manila-service-image-cephfs-master.qcow2
-        MANILA_SERVICE_IMAGE_NAME: manila-service-image-cephfs-master
+        # NOTE(gouthamr): The following need to use the latest images, however, there's a bug
+        # with cephfs on Ubuntu 20.04 LTS: https://tracker.ceph.com/issues/47236
+        # the latest image is built as https://tarballs.opendev.org/openstack/manila-image-elements/images/manila-service-image-cephfs-master.qcow2
+        MANILA_SERVICE_IMAGE_URL: https://tarballs.opendev.org/openstack/manila-image-elements/images/manila-service-image-cephfs-1.3.0-58-g2859569.qcow2
+        MANILA_SERVICE_IMAGE_NAME: manila-service-image-cephfs-1.3.0-58-g2859569
       devstack_local_conf:
         test-config:
           $TEMPEST_CONFIG: