Merge "Add scenario test: test instances with cinder volumes"
diff --git a/.coveragerc b/.coveragerc
index 449e62c..398755b 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -1,4 +1,4 @@
 [run]
 branch = True
 source = tempest
-omit = tempest/tests/*,tempest/scenario/test_*.py,tempest/api/*
+omit = tempest/tests/*,tempest/scenario/test_*.py,tempest/api/*,tempest/serial_tests/*
diff --git a/HACKING.rst b/HACKING.rst
index caf954b..23bc61b 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -184,7 +184,7 @@
 the ``slow`` attribute is leveraged to run slow tests on a selective basis,
 to keep total `Zuul`_ job runtime down to a reasonable time frame.
 
-.. _Zuul: https://docs.openstack.org/infra/zuul/
+.. _Zuul: https://zuul-ci.org/docs/zuul/latest/
 
 Smoke Attribute
 ^^^^^^^^^^^^^^^
@@ -488,7 +488,7 @@
 Otherwise the bug fix won't be able to land in the project.
 
 Handily, `Zuul's cross-repository dependencies
-<https://docs.openstack.org/infra/zuul/user/gating.html#cross-project-dependencies>`_.
+<https://zuul-ci.org/docs/zuul/latest/gating.html#cross-project-dependencies>`_.
 can be leveraged to do without step 2 and to have steps 3 and 4 happen
 "atomically". To do that, make the patch written in step 1 to depend (refer to
 Zuul's documentation above) on the patch written in step 4. The commit message
diff --git a/README.rst b/README.rst
index 3cde2bf..7880357 100644
--- a/README.rst
+++ b/README.rst
@@ -3,7 +3,6 @@
 ========================
 
 .. image:: https://governance.openstack.org/tc/badges/tempest.svg
-    :target: https://governance.openstack.org/tc/reference/tags/index.html
 
 .. Change things from this point on
 
diff --git a/doc/source/contributor/contributing.rst b/doc/source/contributor/contributing.rst
index 139f0b7..81a1874 100644
--- a/doc/source/contributor/contributing.rst
+++ b/doc/source/contributor/contributing.rst
@@ -14,8 +14,9 @@
 Communication
 ~~~~~~~~~~~~~
 * IRC channel ``#openstack-qa`` at OFTC
-* Mailing list (prefix subjects with ``[qa]`` for faster responses)
-  http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss
+* `Mailing list <https://lists.openstack.org/mailman3/lists/openstack-discuss.lists.openstack.org/>`_
+  (prefix subjects with ``[qa]`` for faster responses)
+
 
 Contacting the Core Team
 ~~~~~~~~~~~~~~~~~~~~~~~~
@@ -26,25 +27,29 @@
 ~~~~~~~~~~~~~~~~~~~~
 If you want to propose a new feature please read `Feature Proposal Process`_
 Tempest features are tracked on `Launchpad BP <https://blueprints.launchpad.net/tempest>`_.
+It also helps to bring the feature up during the next PTG and contact
+`the current PTL of QA project <https://governance.openstack.org/tc/reference/projects/>`_.
+Information about PTG is always posted on `the Mailing list
+<https://lists.openstack.org/mailman3/lists/openstack-discuss.lists.openstack.org/>`_.
 
 Task Tracking
 ~~~~~~~~~~~~~
 We track our tasks in `Launchpad <https://bugs.launchpad.net/tempest>`_.
 
-If you're looking for some smaller, easier work item to pick up and get started
+If you're looking for some smaller, easier work items to pick up and get started
 on, search for the 'low-hanging-fruit' tag.
 
 Reporting a Bug
 ~~~~~~~~~~~~~~~
-You found an issue and want to make sure we are aware of it? You can do so on
-`Launchpad <https://bugs.launchpad.net/tempest/+filebug>`__.
+Have you found an issue and want to make sure we are aware of it? You can do so
+on `Launchpad <https://bugs.launchpad.net/tempest/+filebug>`__.
 More info about Launchpad usage can be found on `OpenStack docs page
 <https://docs.openstack.org/contributors/common/task-tracking.html#launchpad>`_
 
 Getting Your Patch Merged
 ~~~~~~~~~~~~~~~~~~~~~~~~~
-All changes proposed to the Tempest require single ``Code-Review +2`` votes from
-Tempest core reviewers by giving ``Workflow +1`` vote. More detailed guidelines
+All changes proposed to the Tempest require a single ``Code-Review +2`` vote
+from a Tempest core followed by a ``Workflow +1`` vote. More detailed guidelines
 for reviewers are available at :doc:`../REVIEWING`.
 
 Project Team Lead Duties
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 2f29cf2..0340f8d 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -83,6 +83,7 @@
    :maxdepth: 2
 
    HACKING
+   serial_tests
    REVIEWING
    microversion_testing
    test_removal
diff --git a/doc/source/library/api_microversion_testing.rst b/doc/source/library/api_microversion_testing.rst
index 8be924d..e979683 100644
--- a/doc/source/library/api_microversion_testing.rst
+++ b/doc/source/library/api_microversion_testing.rst
@@ -9,9 +9,9 @@
 
 Many of the OpenStack components have implemented API microversions.
 It is important to test those microversions in Tempest or external plugins.
-Tempest now provides stable interfaces to support to test the API microversions.
+Tempest now provides stable interfaces to support testing the API microversions.
 Based on the microversion range coming from the combination of both configuration
-and each test case, APIs request will be made with selected microversion.
+and each test case, APIs requests will be made with the selected microversion.
 
 This document explains the interfaces needed for microversion testing.
 
diff --git a/doc/source/library/clients.rst b/doc/source/library/clients.rst
index 0f4ba4c..fe9f4ca 100644
--- a/doc/source/library/clients.rst
+++ b/doc/source/library/clients.rst
@@ -6,11 +6,11 @@
 Tests make requests against APIs using service clients. Service clients are
 specializations of the ``RestClient`` class. The service clients that cover the
 APIs exposed by a service should be grouped in a service clients module.
-A service clients module is python module where all service clients are
+A service clients module is a Python module where all service clients are
 defined. If major API versions are available, submodules should be defined,
 one for each version.
 
-The ``ClientsFactory`` class helps initializing all clients of a specific
+The ``ClientsFactory`` class helps to initialize all clients of a specific
 service client module from a set of shared parameters.
 
 The ``ServiceClients`` class provides a convenient way to get access to all
diff --git a/doc/source/library/credential_providers.rst b/doc/source/library/credential_providers.rst
index d25f85c..8c9a16a 100644
--- a/doc/source/library/credential_providers.rst
+++ b/doc/source/library/credential_providers.rst
@@ -4,12 +4,12 @@
 ====================
 
 These library interfaces are used to deal with allocating credentials on demand
-either dynamically by calling keystone to allocate new credentials, or from
+either dynamically by calling Keystone to allocate new credentials, or from
 a list of preprovisioned credentials. These 2 modules are implementations of
 the same abstract credential providers class and can be used interchangeably.
 However, each implementation has some additional parameters that are used to
 influence the behavior of the modules. The API reference at the bottom of this
-doc shows the interface definitions for both modules, however that may be a bit
+doc shows the interface definitions for both modules, however, that may be a bit
 opaque. You can see some examples of how to leverage this interface below.
 
 Initialization Example
@@ -30,7 +30,7 @@
       # If a test requires a new account to work, it can have it via forcing
       # dynamic credentials. A new account will be produced only for that test.
       # In case admin credentials are not available for the account creation,
-      # the test should be skipped else it would fail.
+      # the test should be skipped else it will fail.
       identity_version = identity_version or CONF.identity.auth_version
       if CONF.auth.use_dynamic_credentials or force_tenant_isolation:
           admin_creds = get_configured_admin_credentials(
@@ -81,12 +81,12 @@
 Once you have a credential provider object created the access patterns for
 allocating and removing credentials are the same across both the dynamic
 and preprovisioned credentials. These are defined in the abstract
-CredentialProvider class. At a high level the credentials provider enables
-you to get 3 basic types of credentials at once (per object): a primary, alt,
+CredentialProvider class. At a high level, the credentials provider enables
+you to get 3 basic types of credentials at once (per object): primary, alt,
 and admin. You're also able to allocate a credential by role. These credentials
-are tracked by the provider object and delete must manually be called otherwise
-the created resources will not be deleted (or returned to the pool in the case
-of preprovisioned creds)
+are tracked by the provider object and delete must be called manually,
+otherwise, the created resources will not be deleted (or returned to the pool
+in the case of preprovisioned creds).
 
 Examples
 ''''''''
diff --git a/doc/source/plugins/plugin.rst b/doc/source/plugins/plugin.rst
index 0771318..31aa134 100644
--- a/doc/source/plugins/plugin.rst
+++ b/doc/source/plugins/plugin.rst
@@ -80,30 +80,30 @@
 
 Since all that's required for a plugin to be detected by Tempest is a valid
 setuptools entry point in the proper namespace there is no difference from the
-Tempest perspective on either creating a separate python package to
-house the plugin or adding the code to an existing python project. However,
+Tempest perspective on either creating a separate Python package to
+house the plugin or adding the code to an existing Python project. However,
 there are tradeoffs to consider when deciding which approach to take when
 creating a new plugin.
 
-If you create a separate python project for your plugin this makes a lot of
+If you create a separate Python project for your plugin this makes a lot of
 things much easier. Firstly it makes packaging and versioning much simpler, you
 can easily decouple the requirements for the plugin from the requirements for
 the other project. It lets you version the plugin independently and maintain a
 single version of the test code across project release boundaries (see the
 `Branchless Tempest Spec`_ for more details on this). It also greatly
 simplifies the install time story for external users. Instead of having to
-install the right version of a project in the same python namespace as Tempest
+install the right version of a project in the same Python namespace as Tempest
 they simply need to pip install the plugin in that namespace. It also means
 that users don't have to worry about inadvertently installing a Tempest plugin
 when they install another package.
 
 .. _Branchless Tempest Spec: https://specs.openstack.org/openstack/qa-specs/specs/tempest/implemented/branchless-tempest.html
 
-The sole advantage to integrating a plugin into an existing python project is
+The sole advantage of integrating a plugin into an existing Python project is
 that it enables you to land code changes at the same time you land test changes
 in the plugin. This reduces some of the burden on contributors by not having
-to land 2 changes to add a new API feature and then test it and doing it as a
-single combined commit.
+to land 2 changes to add a new API feature and then test it, and do it as a
+single combined commit instead.
 
 
 Plugin Class
@@ -122,7 +122,7 @@
   class MyPlugin(plugins.TempestPlugin):
 
 Then you need to ensure you locally define all of the mandatory methods in the
-abstract class, you can refer to the api doc below for a reference of what that
+abstract class, you can refer to the API doc below for a reference of what that
 entails.
 
 Abstract Plugin Class
@@ -135,7 +135,7 @@
 ================
 While there are no hard and fast rules for the structure of a plugin, there are
 basically no constraints on what the plugin looks like as long as the 2 steps
-above are done. However,  there are some recommended patterns to follow to make
+above are done. However, there are some recommended patterns to follow to make
 it easy for people to contribute and work with your plugin. For example, if you
 create a directory structure with something like::
 
@@ -214,7 +214,7 @@
 Parameters:
 
 * **name**: Name of the attribute used to access the ``ClientsFactory`` from
-  the ``ServiceClients`` instance. See example below.
+  the ``ServiceClients`` instance. See the example below.
 * **service_version**: Tempest enforces a single implementation for each
   service client. Available service clients are held in a ``ClientsRegistry``
   singleton, and registered with ``service_version``, which means that
@@ -229,7 +229,7 @@
 
 .. code-block:: python
 
-   # my_creds is instance of tempest.lib.auth.Credentials
+   # my_creds is an instance of tempest.lib.auth.Credentials
    # identity_uri is v2 or v3 depending on the configuration
    from tempest.lib.services import clients
 
@@ -241,13 +241,13 @@
 constraints on the structure of the configuration options exposed by the
 plugin.
 
-First ``service_version`` should be in the format `service_config[.version]`.
+Firstly, ``service_version`` should be in the format `service_config[.version]`.
 The `.version` part is optional, and should only be used if there are multiple
 versions of the same API available. The `service_config` must match the name of
 a configuration options group defined by the plugin. Different versions of one
 API must share the same configuration group.
 
-Second the configuration options group `service_config` must contain the
+Secondly, the configuration options group `service_config` must contain the
 following options:
 
 * `catalog_type`: corresponds to `service` in the catalog
@@ -257,10 +257,10 @@
 as they do not necessarily apply to all service clients.
 
 * `region`: default to identity.region
-* `build_timeout` : default to compute.build_timeout
+* `build_timeout`: default to compute.build_timeout
 * `build_interval`: default to compute.build_interval
 
-Third the service client classes should inherit from ``RestClient``, should
+Thirdly, the service client classes should inherit from ``RestClient``, should
 accept generic keyword arguments, and should pass those arguments to the
 ``__init__`` method of ``RestClient``. Extra arguments can be added. For
 instance:
@@ -276,7 +276,7 @@
            self.my_arg = my_arg
            self.my_args2 = my_arg
 
-Finally the service client should be structured in a python module, so that all
+Finally, the service client should be structured in a Python module, so that all
 service client classes are importable from it. Each major API version should
 have its own module.
 
@@ -299,7 +299,7 @@
    __all__ = ['API1Client', 'API2Client']
 
 The following folder and module structure is recommended for multiple major
-API version::
+API versions::
 
     plugin_dir/
       services/
@@ -325,14 +325,14 @@
 =============
 
 Tempest will automatically discover any installed plugins when it is run. So by
-just installing the python packages which contain your plugin you'll be using
+just installing the Python packages, which contain your plugin, you'll be using
 them with Tempest, nothing else is really required.
 
-However, you should take care when installing plugins. By their very nature
+However, you should take care when installing plugins. By their very nature,
 there are no guarantees when running Tempest with plugins enabled about the
 quality of the plugin. Additionally, while there is no limitation on running
 with multiple plugins, it's worth noting that poorly written plugins might not
-properly isolate their tests which could cause unexpected cross interactions
+properly isolate their tests which could cause unexpected cross-interactions
 between plugins.
 
 Notes for using plugins with virtualenvs
diff --git a/doc/source/serial_tests.rst b/doc/source/serial_tests.rst
new file mode 120000
index 0000000..6709115
--- /dev/null
+++ b/doc/source/serial_tests.rst
@@ -0,0 +1 @@
+../../tempest/serial_tests/README.rst
\ No newline at end of file
diff --git a/doc/source/supported_version.rst b/doc/source/supported_version.rst
index 89f0f90..968c821 100644
--- a/doc/source/supported_version.rst
+++ b/doc/source/supported_version.rst
@@ -9,10 +9,10 @@
 
 Tempest master supports the below OpenStack Releases:
 
+* 2024.1
 * 2023.2
 * 2023.1
 * Zed
-* Yoga
 
 For older OpenStack Release:
 
diff --git a/doc/source/tests/modules.rst b/doc/source/tests/modules.rst
index 026a7a5..697b011 100644
--- a/doc/source/tests/modules.rst
+++ b/doc/source/tests/modules.rst
@@ -19,3 +19,10 @@
    network/modules
    object_storage/modules
    volume/modules
+
+Serial Tests
+------------
+.. toctree::
+   :maxdepth: 2
+
+   serial_tests/modules
diff --git a/playbooks/devstack-tempest-ipv6.yaml b/playbooks/devstack-tempest-ipv6.yaml
index 568077e..89eec6d 100644
--- a/playbooks/devstack-tempest-ipv6.yaml
+++ b/playbooks/devstack-tempest-ipv6.yaml
@@ -17,6 +17,16 @@
     # fail early if anything missing the IPv6 settings or deployments.
     - devstack-ipv6-only-deployments-verification
   tasks:
+    - name: Run tempest cleanup init-saved-state
+      include_role:
+        name: tempest-cleanup
+      vars:
+        init_saved_state: true
+      when: (run_tempest_dry_cleanup is defined and run_tempest_dry_cleanup | bool) or
+            (run_tempest_cleanup is defined and run_tempest_cleanup | bool) or
+            (run_tempest_fail_if_leaked_resources is defined and run_tempest_fail_if_leaked_resources | bool) or
+            (run_tempest_cleanup_prefix is defined and run_tempest_cleanup_prefix | bool)
+
     - name: Run Tempest version <= 26.0.0
       include_role:
         name: run-tempest-26
@@ -30,3 +40,15 @@
       when:
         - zuul.branch is defined
         - zuul.branch not in ["stable/ocata", "stable/pike", "stable/queens", "stable/rocky", "stable/stein"]
+
+    - name: Run tempest cleanup dry-run
+      include_role:
+        name: tempest-cleanup
+      vars:
+        dry_run: true
+      when: run_tempest_dry_cleanup is defined and run_tempest_dry_cleanup | bool
+
+    - name: Run tempest cleanup
+      include_role:
+        name: tempest-cleanup
+      when: run_tempest_cleanup is defined and run_tempest_cleanup | bool
diff --git a/playbooks/devstack-tempest.yaml b/playbooks/devstack-tempest.yaml
index 269999c..5fb1afc 100644
--- a/playbooks/devstack-tempest.yaml
+++ b/playbooks/devstack-tempest.yaml
@@ -20,6 +20,11 @@
       include_role:
         name: acl-devstack-files
 
+    - name: Set source and destination host
+      include_role:
+        name: set-src-dest-host
+      when: tempest_set_src_dest_host is defined and tempest_set_src_dest_host | bool
+
     - name: Run tempest cleanup init-saved-state
       include_role:
         name: tempest-cleanup
@@ -27,7 +32,8 @@
         init_saved_state: true
       when: (run_tempest_dry_cleanup is defined and run_tempest_dry_cleanup | bool) or
             (run_tempest_cleanup is defined and run_tempest_cleanup | bool) or
-            (run_tempest_fail_if_leaked_resources is defined and run_tempest_fail_if_leaked_resources | bool)
+            (run_tempest_fail_if_leaked_resources is defined and run_tempest_fail_if_leaked_resources | bool) or
+            (run_tempest_cleanup_prefix is defined and run_tempest_cleanup_prefix | bool)
 
     - name: Run Tempest version <= 26.0.0
       include_role:
diff --git a/releasenotes/notes/Add-resource_name_prefix-config-option-26e0b7cfeffc48f9.yaml b/releasenotes/notes/Add-resource_name_prefix-config-option-26e0b7cfeffc48f9.yaml
new file mode 100644
index 0000000..0824c66
--- /dev/null
+++ b/releasenotes/notes/Add-resource_name_prefix-config-option-26e0b7cfeffc48f9.yaml
@@ -0,0 +1,10 @@
+---
+features:
+  - |
+    A new config option in the default section, resource_name_prefix,
+    is added to allow users to customize the name (specifically the prefix)
+    of the resources created by Tempest during a test run. By default it is
+    set to tempest.
+    Tempest cleanup CLI will then use this config option to cleanup only the
+    resources that match the prefix. Make sure this prefix does not match with
+    the resource name you do not want Tempest cleanup CLI to delete.
diff --git a/releasenotes/notes/Allow-tempest-cleanup-delete-resources-based-on-prefix-96d9562f1f30e979.yaml b/releasenotes/notes/Allow-tempest-cleanup-delete-resources-based-on-prefix-96d9562f1f30e979.yaml
new file mode 100644
index 0000000..872f664
--- /dev/null
+++ b/releasenotes/notes/Allow-tempest-cleanup-delete-resources-based-on-prefix-96d9562f1f30e979.yaml
@@ -0,0 +1,10 @@
+---
+features:
+  - |
+    We add a new argument, ``--prefix``, to ``tempest cleanup`` tool that will
+    allow users delete only resources that match the prefix. When this option
+    is used, ``saved_state.json`` file is not needed (no need to run with
+    ``--init-saved-state`` first). If there is one, it will be ignored and the
+    cleanup will be done based on the given prefix only.
+    Note, that some resources are not named thus they will not be deleted when
+    filtering based on the prefix.
diff --git a/releasenotes/notes/add-delete-image-from-specific-store-api-84c0ecd50724f6de.yaml b/releasenotes/notes/add-delete-image-from-specific-store-api-84c0ecd50724f6de.yaml
new file mode 100644
index 0000000..a8a0b70
--- /dev/null
+++ b/releasenotes/notes/add-delete-image-from-specific-store-api-84c0ecd50724f6de.yaml
@@ -0,0 +1,4 @@
+---
+features:
+  - |
+    Add delete image from specific store API to image V2 client
diff --git a/releasenotes/notes/add-option-to-specify-source-host.yaml b/releasenotes/notes/add-option-to-specify-source-host.yaml
new file mode 100644
index 0000000..f8df40a
--- /dev/null
+++ b/releasenotes/notes/add-option-to-specify-source-host.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - Add a new config options migration_source_host and migration_dest_host
+    in the compute section, which if is set takes source or destination
+    host from options, otherwise a host is chosen automatically.
diff --git a/releasenotes/notes/backup-driver-config-option-5f12e71c75b7f01b.yaml b/releasenotes/notes/backup-driver-config-option-5f12e71c75b7f01b.yaml
new file mode 100644
index 0000000..0126a06
--- /dev/null
+++ b/releasenotes/notes/backup-driver-config-option-5f12e71c75b7f01b.yaml
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    A new tempest.conf option called backup_driver was added to tempest to
+    indicate which backup driver is used by Cinder. This option allows us
+    to create a resource properly and avoid cleanup issues when Swift is used as the
+    backup driver.
diff --git a/releasenotes/notes/cleanup-decorator-aliases-e940b6e114e6f481.yaml b/releasenotes/notes/cleanup-decorator-aliases-e940b6e114e6f481.yaml
new file mode 100644
index 0000000..fd4a546
--- /dev/null
+++ b/releasenotes/notes/cleanup-decorator-aliases-e940b6e114e6f481.yaml
@@ -0,0 +1,9 @@
+---
+upgrade:
+  - |
+    The following decorators are no longer available in the ``tempest.test``
+    module. Use the ``tempest.common.utils`` module instead.
+
+    - ``services``
+    - ``requires_ext``
+    - ``is_extension_enabled``
diff --git a/releasenotes/notes/end-of-support-of-yoga-4ad45e91fe893024.yaml b/releasenotes/notes/end-of-support-of-yoga-4ad45e91fe893024.yaml
new file mode 100644
index 0000000..ceeb2b2
--- /dev/null
+++ b/releasenotes/notes/end-of-support-of-yoga-4ad45e91fe893024.yaml
@@ -0,0 +1,12 @@
+---
+prelude: >
+    This is an intermediate release during the 2024.1 development cycle to
+    mark the end of support for Yoga release in Tempest.
+    After this release, Tempest will support below OpenStack Releases:
+
+    * 2023.2
+    * 2023.1
+    * Zed
+
+    Current development of Tempest is for OpenStack 2024.1 development
+    cycle.
diff --git a/releasenotes/notes/identity-feature-opt-cleanup-caracal-7afd283855a07025.yaml b/releasenotes/notes/identity-feature-opt-cleanup-caracal-7afd283855a07025.yaml
new file mode 100644
index 0000000..67f6ede
--- /dev/null
+++ b/releasenotes/notes/identity-feature-opt-cleanup-caracal-7afd283855a07025.yaml
@@ -0,0 +1,21 @@
+---
+upgrade:
+  - |
+    The following deprecated options in the ``[identity-feature-enabled]``
+    section have been removed. Project tags API and application credentials
+    API are now always tested if identity v3 API is available.
+
+    - ``project_tag``
+    - ``application_credentials``
+
+  - |
+    Default value of the ``[identity-feature-enabled] access_rule`` option has
+    been changed from ``False`` to ``True`` and now the access rule API is
+    always tested when identity API is available.
+
+deprecations:
+  - |
+    The Keystone access_rule is enabled by default since Train release and we
+    no longer need a separate config in Tempest to enable it. Therefore
+    the ``[identity-feature-enabled] access_rule`` option has been deprecated
+    and will be removed in a future release.
diff --git a/releasenotes/notes/remove-compute-feature-enabled-block-migrate-cinder-iscsi-882da88096019f3c.yaml b/releasenotes/notes/remove-compute-feature-enabled-block-migrate-cinder-iscsi-882da88096019f3c.yaml
new file mode 100644
index 0000000..2808677
--- /dev/null
+++ b/releasenotes/notes/remove-compute-feature-enabled-block-migrate-cinder-iscsi-882da88096019f3c.yaml
@@ -0,0 +1,8 @@
+---
+upgrade:
+  - |
+    The deprecated ``[compute-feature-enabled] block_migrate_cinder_iscsi``
+    option has been removed.
+    Now the ``[compute-feature-enabled] block_migration_for_live_migration``
+    option is solely used to determine when to run block migration based tests
+    during live migration.
diff --git a/releasenotes/notes/remove-dns_servers_option-f49fdb2b4eb50f8f.yaml b/releasenotes/notes/remove-dns_servers_option-f49fdb2b4eb50f8f.yaml
new file mode 100644
index 0000000..6be1db9
--- /dev/null
+++ b/releasenotes/notes/remove-dns_servers_option-f49fdb2b4eb50f8f.yaml
@@ -0,0 +1,4 @@
+---
+upgrade:
+  - |
+    The deprecated ``[network] dns_servers`` option has been removed.
diff --git a/releasenotes/notes/remove-nova_cert-e2ee70a40e117e8a.yaml b/releasenotes/notes/remove-nova_cert-e2ee70a40e117e8a.yaml
new file mode 100644
index 0000000..1a292f0
--- /dev/null
+++ b/releasenotes/notes/remove-nova_cert-e2ee70a40e117e8a.yaml
@@ -0,0 +1,6 @@
+---
+upgrade:
+  - |
+    The deprecated ``[compute-feature-enabled] nova_cert`` option has been
+    removed. The nova-cert service was removed from nova in 16.0.0 release.
+    Tests of compute root certificates API have also been removed.
diff --git a/releasenotes/notes/remove-rdp_console-34e11f58d525905a.yaml b/releasenotes/notes/remove-rdp_console-34e11f58d525905a.yaml
new file mode 100644
index 0000000..4f03150
--- /dev/null
+++ b/releasenotes/notes/remove-rdp_console-34e11f58d525905a.yaml
@@ -0,0 +1,5 @@
+---
+upgrade:
+  - |
+    The deprecated ``[compute-feature-enabled] rdp_console`` config option has
+    been removed.
diff --git a/releasenotes/notes/remove-vnc-server-header-1a9731ba10242603.yaml b/releasenotes/notes/remove-vnc-server-header-1a9731ba10242603.yaml
new file mode 100644
index 0000000..cf14513
--- /dev/null
+++ b/releasenotes/notes/remove-vnc-server-header-1a9731ba10242603.yaml
@@ -0,0 +1,5 @@
+---
+upgrade:
+  - |
+    The deprecated ``[compute-feature-enabled] vnc_server_header`` option has
+    been removed.
diff --git a/releasenotes/notes/tempest-2024-1-release-d51f15c6bfe60b35.yaml b/releasenotes/notes/tempest-2024-1-release-d51f15c6bfe60b35.yaml
new file mode 100644
index 0000000..81d6a05
--- /dev/null
+++ b/releasenotes/notes/tempest-2024-1-release-d51f15c6bfe60b35.yaml
@@ -0,0 +1,17 @@
+---
+prelude: >
+    This release is to tag Tempest for OpenStack 2024.1 release.
+    This release marks the start of 2024.1 release support in Tempest.
+    After this release, Tempest will support below OpenStack Releases:
+
+    * 2024.1
+    * 2023.2
+    * 2023.1
+    * Zed
+
+    Current development of Tempest is for OpenStack 2024.2 development
+    cycle. Every Tempest commit is also tested against master during
+    the 2024.2 cycle. However, this does not necessarily mean that using
+    Tempest as of this tag will work against a 2024.2 (or future release)
+    cloud.
+    To be on safe side, use this tag to test the OpenStack 2024.1 release.
diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst
index 989d3b5..e3018b4 100644
--- a/releasenotes/source/index.rst
+++ b/releasenotes/source/index.rst
@@ -6,6 +6,8 @@
    :maxdepth: 1
 
    unreleased
+   v38.0.0
+   v37.0.0
    v36.0.0
    v35.0.0
    v34.2.0
diff --git a/releasenotes/source/v37.0.0.rst b/releasenotes/source/v37.0.0.rst
new file mode 100644
index 0000000..72b8bc6
--- /dev/null
+++ b/releasenotes/source/v37.0.0.rst
@@ -0,0 +1,6 @@
+=====================
+v37.0.0 Release Notes
+=====================
+
+.. release-notes:: 37.0.0 Release Notes
+   :version: 37.0.0
diff --git a/releasenotes/source/v38.0.0.rst b/releasenotes/source/v38.0.0.rst
new file mode 100644
index 0000000..2664374
--- /dev/null
+++ b/releasenotes/source/v38.0.0.rst
@@ -0,0 +1,6 @@
+=====================
+v38.0.0 Release Notes
+=====================
+
+.. release-notes:: 38.0.0 Release Notes
+   :version: 38.0.0
diff --git a/roles/set-src-dest-host/defaults/main.yaml b/roles/set-src-dest-host/defaults/main.yaml
new file mode 100644
index 0000000..fea05c8
--- /dev/null
+++ b/roles/set-src-dest-host/defaults/main.yaml
@@ -0,0 +1 @@
+devstack_base_dir: /opt/stack
diff --git a/roles/set-src-dest-host/tasks/main.yaml b/roles/set-src-dest-host/tasks/main.yaml
new file mode 100644
index 0000000..78b7a2c
--- /dev/null
+++ b/roles/set-src-dest-host/tasks/main.yaml
@@ -0,0 +1,29 @@
+- name: Find out hostnames
+  set_fact:
+      devstack_hostnames: "{{ devstack_hostnames|default([]) + [hostvars[zj_item]['ansible_hostname'] | default('unknown')] }}"
+  loop: "{{ query('inventory_hostnames', 'all,!localhost') }}"
+  loop_control:
+    loop_var: zj_item
+  ignore_errors: yes  # noqa ignore-errors
+
+- name: Found hostnames
+  debug:
+    msg: |
+      # Available hosts
+      {{ devstack_hostnames }}
+
+- name: Set migration_source_host in tempest.conf
+  become: true
+  community.general.ini_file:
+    path: "{{ devstack_base_dir }}/tempest/etc/tempest.conf"
+    section: compute
+    option: migration_source_host
+    value: "{{ devstack_hostnames[0] }}"
+
+- name: Set migration_dest_host in tempest.conf
+  become: true
+  community.general.ini_file:
+    path: "{{ devstack_base_dir }}/tempest/etc/tempest.conf"
+    section: compute
+    option: migration_dest_host
+    value: "{{ devstack_hostnames[1] }}"
diff --git a/roles/tempest-cleanup/README.rst b/roles/tempest-cleanup/README.rst
index d1fad90..d43319c 100644
--- a/roles/tempest-cleanup/README.rst
+++ b/roles/tempest-cleanup/README.rst
@@ -40,6 +40,12 @@
    some must have been leaked. This can be also used to verify that tempest
    cleanup was successful.
 
+.. zuul:rolevar:: run_tempest_cleanup_prefix
+   :default: false
+
+   When true, tempest cleanup will be called with '--prefix tempest' to delete
+   only resources with names that match the prefix. This option can be used
+   together with dry_run.
 
 Role usage
 ----------
diff --git a/roles/tempest-cleanup/defaults/main.yaml b/roles/tempest-cleanup/defaults/main.yaml
index ce78bdb..8060b29 100644
--- a/roles/tempest-cleanup/defaults/main.yaml
+++ b/roles/tempest-cleanup/defaults/main.yaml
@@ -2,3 +2,4 @@
 init_saved_state: false
 dry_run: false
 run_tempest_fail_if_leaked_resources: false
+run_tempest_cleanup_prefix: false
diff --git a/roles/tempest-cleanup/tasks/dry_run.yaml b/roles/tempest-cleanup/tasks/dry_run.yaml
index 46749ab..07e1b63 100644
--- a/roles/tempest-cleanup/tasks/dry_run.yaml
+++ b/roles/tempest-cleanup/tasks/dry_run.yaml
@@ -5,3 +5,12 @@
   command: tox -evenv-tempest -- tempest cleanup --dry-run --debug
   args:
     chdir: "{{ devstack_base_dir }}/tempest"
+  when: not run_tempest_cleanup_prefix
+
+- name: Run tempest cleanup dry-run with tempest prefix
+  become: yes
+  become_user: tempest
+  command: tox -evenv-tempest -- tempest cleanup --dry-run --debug --prefix tempest
+  args:
+    chdir: "{{ devstack_base_dir }}/tempest"
+  when: run_tempest_cleanup_prefix
\ No newline at end of file
diff --git a/roles/tempest-cleanup/tasks/main.yaml b/roles/tempest-cleanup/tasks/main.yaml
index c1d63f0..7ef4928 100644
--- a/roles/tempest-cleanup/tasks/main.yaml
+++ b/roles/tempest-cleanup/tasks/main.yaml
@@ -27,6 +27,15 @@
       command: tox -evenv-tempest -- tempest cleanup --debug
       args:
         chdir: "{{ devstack_base_dir }}/tempest"
+      when: not run_tempest_cleanup_prefix
+
+    - name: Run tempest cleanup with tempest prefix
+      become: yes
+      become_user: tempest
+      command: tox -evenv-tempest -- tempest cleanup --debug --prefix tempest
+      args:
+        chdir: "{{ devstack_base_dir }}/tempest"
+      when: run_tempest_cleanup_prefix
 
 - when:
     - run_tempest_fail_if_leaked_resources
diff --git a/tempest/README.rst b/tempest/README.rst
index b345032..b300dcb 100644
--- a/tempest/README.rst
+++ b/tempest/README.rst
@@ -8,7 +8,7 @@
 implementations for both correctness, as well as a burn in tool for
 OpenStack clouds.
 
-As such Tempest tests come in many flavors, each with their own rules
+As such Tempest tests come in many flavors, each with its own rules
 and guidelines. Below is the overview of the Tempest repository structure
 to make this clear.
 
@@ -17,6 +17,7 @@
    tempest/
       api/ - API tests
       scenario/ - complex scenario tests
+      serial_tests/ - tests that run always in the serial mode
       tests/ - unit tests for Tempest internals
 
 Each of these directories contains different types of tests. What
@@ -41,13 +42,20 @@
 ---------------------------
 
 Scenario tests are complex "through path" tests for OpenStack
-functionality. They are typically a series of steps where complicated
+functionality. They are typically a series of steps where a complicated
 state requiring multiple services is set up exercised, and torn down.
 
 Scenario tests should not use the existing Python clients for OpenStack,
 but should instead use the Tempest implementations of clients.
 
 
+:ref:`serial_tests_guide`
+--------------------------------
+
+Tests within this category will always be executed serially from the rest of
+the test cases.
+
+
 :ref:`unit_tests_field_guide`
 -----------------------------
 
diff --git a/tempest/api/README.rst b/tempest/api/README.rst
index a796922..7051230 100644
--- a/tempest/api/README.rst
+++ b/tempest/api/README.rst
@@ -7,20 +7,20 @@
 What are these tests?
 ---------------------
 
-One of Tempest's prime function is to ensure that your OpenStack cloud
+One of Tempest's prime functions is to ensure that your OpenStack cloud
 works with the OpenStack API as documented. The current largest
 portion of Tempest code is devoted to test cases that do exactly this.
 
 It's also important to test not only the expected positive path on
 APIs, but also to provide them with invalid data to ensure they fail
 in expected and documented ways. The latter type of tests is called
-``negative tests`` in Tempest source code. Over the course of the OpenStack
-project Tempest has discovered many fundamental bugs by doing just
+``negative tests`` in Tempest source code. Throughout the OpenStack
+project, Tempest has discovered many fundamental bugs by doing just
 this.
 
 In order for some APIs to return meaningful results, there must be
 enough data in the system. This means these tests might start by
-spinning up a server, image, etc, then operating on it.
+spinning up a server, image, etc., and then operating on it.
 
 
 Why are these tests in Tempest?
@@ -32,7 +32,7 @@
 
 It could be argued that some of the negative testing could be done
 back in the projects themselves, and we might evolve there over time,
-but currently in the OpenStack gate this is a fundamentally important
+but currently, in the OpenStack gate, this is a fundamentally important
 place to keep things.
 
 
@@ -43,7 +43,7 @@
 OpenStack API, as we want to ensure that bugs aren't hidden by the
 official clients.
 
-They should test specific API calls, and can build up complex state if
+They should test specific API calls and can build up complex states if
 it's needed for the API call to be meaningful.
 
 They should send not only good data, but bad data at the API and look
diff --git a/tempest/api/compute/admin/test_agents.py b/tempest/api/compute/admin/test_agents.py
index f54fb22..8fc155b 100644
--- a/tempest/api/compute/admin/test_agents.py
+++ b/tempest/api/compute/admin/test_agents.py
@@ -51,7 +51,9 @@
             # If you try to create an agent with the same hypervisor,
             # os and architecture as an existing agent, Nova will return
             # an HTTPConflict or HTTPServerError.
-            kwargs[rand_key] = data_utils.rand_name(kwargs[rand_key])
+            kwargs[rand_key] = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=kwargs[rand_key])
         return kwargs
 
     @decorators.idempotent_id('1fc6bdc8-0b6d-4cc7-9f30-9b04fabe5b90')
diff --git a/tempest/api/compute/admin/test_aggregates_negative.py b/tempest/api/compute/admin/test_aggregates_negative.py
index 7b115ce..c284370 100644
--- a/tempest/api/compute/admin/test_aggregates_negative.py
+++ b/tempest/api/compute/admin/test_aggregates_negative.py
@@ -15,10 +15,13 @@
 
 from tempest.api.compute import base
 from tempest.common import tempest_fixtures as fixtures
+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
 
+CONF = config.CONF
+
 
 class AggregatesAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
     """Tests Aggregates API that require admin privileges"""
@@ -40,7 +43,9 @@
                      if v['status'] == 'enabled' and v['state'] == 'up']
 
     def _create_test_aggregate(self):
-        aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
+        aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.aggregate_name_prefix)
         aggregate = (self.client.create_aggregate(name=aggregate_name)
                      ['aggregate'])
         self.addCleanup(self.client.delete_aggregate, aggregate['id'])
@@ -50,7 +55,9 @@
     @decorators.idempotent_id('86a1cb14-da37-4a70-b056-903fd56dfe29')
     def test_aggregate_create_as_user(self):
         """Regular user is not allowed to create an aggregate"""
-        aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
+        aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.aggregate_name_prefix)
         self.assertRaises(lib_exc.Forbidden,
                           self.aggregates_client.create_aggregate,
                           name=aggregate_name)
@@ -125,7 +132,9 @@
     def test_aggregate_add_non_exist_host(self):
         """Adding a non-exist host to an aggregate should fail"""
         while True:
-            non_exist_host = data_utils.rand_name('nonexist_host')
+            non_exist_host = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='nonexist_host')
             if non_exist_host not in self.hosts:
                 break
         aggregate = self._create_test_aggregate()
diff --git a/tempest/api/compute/admin/test_create_server.py b/tempest/api/compute/admin/test_create_server.py
index ccdfbf3..293e284 100644
--- a/tempest/api/compute/admin/test_create_server.py
+++ b/tempest/api/compute/admin/test_create_server.py
@@ -51,7 +51,8 @@
 
         def create_flavor_with_ephemeral(ephem_disk):
             name = 'flavor_with_ephemeral_%s' % ephem_disk
-            flavor_name = data_utils.rand_name(name)
+            flavor_name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name=name)
 
             ram = flavor_base['ram']
             vcpus = flavor_base['vcpus']
diff --git a/tempest/api/compute/admin/test_flavors.py b/tempest/api/compute/admin/test_flavors.py
index 294b1ab..cece905 100644
--- a/tempest/api/compute/admin/test_flavors.py
+++ b/tempest/api/compute/admin/test_flavors.py
@@ -16,10 +16,13 @@
 import uuid
 
 from tempest.api.compute import base
+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
 
+CONF = config.CONF
+
 
 class FlavorsAdminTestJSON(base.BaseV2ComputeAdminTest):
     """Tests Flavors API Create and Delete that require admin privileges"""
@@ -76,7 +79,9 @@
 
         This operation requires the user to have 'admin' role
         """
-        flavor_name = data_utils.rand_name(self.flavor_name_prefix)
+        flavor_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.flavor_name_prefix)
 
         # Create the flavor
         self.create_flavor(name=flavor_name,
@@ -107,7 +112,9 @@
             self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'], 0)
             self.assertEqual(flavor['os-flavor-access:is_public'], True)
 
-        flavor_name = data_utils.rand_name(self.flavor_name_prefix)
+        flavor_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.flavor_name_prefix)
         new_flavor_id = data_utils.rand_int_id(start=1000)
 
         # Create the flavor
@@ -143,7 +150,9 @@
         tenant is not automatically added access list.
         This operation requires the user to have 'admin' role
         """
-        flavor_name = data_utils.rand_name(self.flavor_name_prefix)
+        flavor_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.flavor_name_prefix)
 
         # Create the flavor
         self.create_flavor(name=flavor_name,
@@ -178,7 +187,9 @@
 
         Try to List/Get flavor with another user
         """
-        flavor_name = data_utils.rand_name(self.flavor_name_prefix)
+        flavor_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.flavor_name_prefix)
 
         # Create the flavor
         self.create_flavor(name=flavor_name,
@@ -192,8 +203,11 @@
     @decorators.idempotent_id('fb9cbde6-3a0e-41f2-a983-bdb0a823c44e')
     def test_is_public_string_variations(self):
         """Test creating public and non public flavors"""
-        flavor_name_not_public = data_utils.rand_name(self.flavor_name_prefix)
-        flavor_name_public = data_utils.rand_name(self.flavor_name_prefix)
+        prefix = CONF.resource_name_prefix
+        flavor_name_not_public = data_utils.rand_name(
+            prefix=prefix, name=self.flavor_name_prefix)
+        flavor_name_public = data_utils.rand_name(
+            prefix=prefix, name=self.flavor_name_prefix)
 
         # Create a non public flavor
         self.create_flavor(name=flavor_name_not_public,
diff --git a/tempest/api/compute/admin/test_flavors_extra_specs.py b/tempest/api/compute/admin/test_flavors_extra_specs.py
index da95660..5829269 100644
--- a/tempest/api/compute/admin/test_flavors_extra_specs.py
+++ b/tempest/api/compute/admin/test_flavors_extra_specs.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class FlavorsExtraSpecsTestJSON(base.BaseV2ComputeAdminTest):
     """Tests Flavor Extra Spec API extension.
@@ -28,7 +31,8 @@
     @classmethod
     def resource_setup(cls):
         super(FlavorsExtraSpecsTestJSON, cls).resource_setup()
-        flavor_name = data_utils.rand_name('test_flavor')
+        flavor_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test_flavor')
         ram = 512
         vcpus = 1
         disk = 10
@@ -139,7 +143,9 @@
     @decorators.idempotent_id('d3114f03-b0f2-4dc7-be11-70c0abc178b3')
     def test_flavor_update_with_custom_namespace(self):
         """Test flavor creation with a custom namespace, key and value"""
-        flavor_name = data_utils.rand_name(self.flavor_name_prefix)
+        flavor_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.flavor_name_prefix)
         flavor_id = self.create_flavor(ram=self.ram,
                                        vcpus=self.vcpus,
                                        disk=self.disk,
diff --git a/tempest/api/compute/admin/test_flavors_extra_specs_negative.py b/tempest/api/compute/admin/test_flavors_extra_specs_negative.py
index 6822614..7f518d2 100644
--- a/tempest/api/compute/admin/test_flavors_extra_specs_negative.py
+++ b/tempest/api/compute/admin/test_flavors_extra_specs_negative.py
@@ -15,10 +15,13 @@
 #    under the License.
 
 from tempest.api.compute import base
+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
 
+CONF = config.CONF
+
 
 class FlavorsExtraSpecsNegativeTestJSON(base.BaseV2ComputeAdminTest):
     """Negative Tests Flavor Extra Spec API extension.
@@ -30,7 +33,8 @@
     def resource_setup(cls):
         super(FlavorsExtraSpecsNegativeTestJSON, cls).resource_setup()
 
-        flavor_name = data_utils.rand_name('test_flavor')
+        flavor_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test_flavor')
         ram = 512
         vcpus = 1
         disk = 10
diff --git a/tempest/api/compute/admin/test_hosts.py b/tempest/api/compute/admin/test_hosts.py
index 30f3388..0d79570 100644
--- a/tempest/api/compute/admin/test_hosts.py
+++ b/tempest/api/compute/admin/test_hosts.py
@@ -68,7 +68,9 @@
         """Showing nova host details"""
         hosts = self.client.list_hosts()['hosts']
 
-        hosts = [host for host in hosts if host['service'] == 'compute']
+        hosts = [host for host in hosts if (
+            host['service'] == 'compute' and
+            not host['host_name'].endswith('-ironic'))]
         self.assertNotEmpty(hosts)
 
         for host in hosts:
diff --git a/tempest/api/compute/admin/test_keypairs_v210.py b/tempest/api/compute/admin/test_keypairs_v210.py
index 3068127..5c5031b 100644
--- a/tempest/api/compute/admin/test_keypairs_v210.py
+++ b/tempest/api/compute/admin/test_keypairs_v210.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.compute.keypairs import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class KeyPairsV210TestJSON(base.BaseKeypairTest):
     """Tests KeyPairs API with microversion higher than 2.9"""
@@ -33,7 +36,8 @@
     def _create_and_check_keypairs(self, user_id):
         key_list = list()
         for _ in range(2):
-            k_name = data_utils.rand_name('keypair')
+            k_name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name='keypair')
             keypair = self.create_keypair(k_name,
                                           keypair_type='ssh',
                                           user_id=user_id,
diff --git a/tempest/api/compute/admin/test_live_migration.py b/tempest/api/compute/admin/test_live_migration.py
index d68334f..f6a1ae9 100644
--- a/tempest/api/compute/admin/test_live_migration.py
+++ b/tempest/api/compute/admin/test_live_migration.py
@@ -175,9 +175,6 @@
     @testtools.skipIf(not CONF.compute_feature_enabled.
                       block_migration_for_live_migration,
                       'Block Live migration not available')
-    @testtools.skipIf(not CONF.compute_feature_enabled.
-                      block_migrate_cinder_iscsi,
-                      'Block Live migration not configured for iSCSI')
     @utils.services('volume')
     def test_live_block_migration_with_attached_volume(self):
         """Test the live-migration of an instance with an attached volume.
@@ -214,7 +211,8 @@
         self.assertEqual(volume_id1, volume_id2)
 
     def _create_net_subnet(self, name, cidr):
-        net_name = data_utils.rand_name(name=name)
+        net_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=name)
         net = self.networks_client.create_network(name=net_name)['network']
         self.addClassResourceCleanup(
             self.networks_client.delete_network, net['id'])
@@ -228,7 +226,8 @@
         return net
 
     def _create_port(self, network_id, name):
-        name = data_utils.rand_name(name=name)
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=name)
         port = self.ports_client.create_port(name=name,
                                              network_id=network_id)['port']
         self.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -244,7 +243,8 @@
         subport = self._create_port(network_id=net['id'], name='subport')
 
         trunk = self.trunks_client.create_trunk(
-            name=data_utils.rand_name('trunk'),
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name='trunk'),
             port_id=parent['id'],
             sub_ports=[{"segmentation_id": 42, "port_id": subport['id'],
                         "segmentation_type": "vlan"}]
diff --git a/tempest/api/compute/admin/test_live_migration_negative.py b/tempest/api/compute/admin/test_live_migration_negative.py
index 80c0525..c956d99 100644
--- a/tempest/api/compute/admin/test_live_migration_negative.py
+++ b/tempest/api/compute/admin/test_live_migration_negative.py
@@ -43,7 +43,8 @@
     @decorators.idempotent_id('7fb7856e-ae92-44c9-861a-af62d7830bcb')
     def test_invalid_host_for_migration(self):
         """Test migrating to an invalid host should not change the status"""
-        target_host = data_utils.rand_name('host')
+        target_host = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='host')
         server = self.create_test_server(wait_until="ACTIVE")
 
         self.assertRaises(lib_exc.BadRequest, self._migrate_server_to,
diff --git a/tempest/api/compute/admin/test_migrations.py b/tempest/api/compute/admin/test_migrations.py
index b3d2833..fa8a737 100644
--- a/tempest/api/compute/admin/test_migrations.py
+++ b/tempest/api/compute/admin/test_migrations.py
@@ -74,7 +74,9 @@
         flavor = self.admin_flavors_client.show_flavor(
             self.flavor_ref)['flavor']
         flavor = self.admin_flavors_client.create_flavor(
-            name=data_utils.rand_name('test_resize_flavor_'),
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='test_resize_flavor_'),
             ram=flavor['ram'],
             disk=flavor['disk'],
             vcpus=flavor['vcpus']
diff --git a/tempest/api/compute/admin/test_quotas.py b/tempest/api/compute/admin/test_quotas.py
index caf4fc1..70711f5 100644
--- a/tempest/api/compute/admin/test_quotas.py
+++ b/tempest/api/compute/admin/test_quotas.py
@@ -43,7 +43,9 @@
 
     def _get_updated_quotas(self):
         # Verify that GET shows the updated quota set of project
-        project_name = data_utils.rand_name('cpu_quota_project')
+        project_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='cpu_quota_project')
         project_desc = project_name + '-desc'
         project = identity.identity_utils(self.os_admin).create_project(
             name=project_name, description=project_desc)
@@ -59,7 +61,9 @@
         self.assertEqual(5120, quota_set['ram']['limit'])
 
         # Verify that GET shows the updated quota set of user
-        user_name = data_utils.rand_name('cpu_quota_user')
+        user_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='cpu_quota_user')
         password = data_utils.rand_password()
         email = user_name + '@testmail.tm'
         user = identity.identity_utils(self.os_admin).create_user(
@@ -157,7 +161,9 @@
                       'Legacy quota update not available with unified limits')
     def test_delete_quota(self):
         """Test admin can delete the compute quota set for a project"""
-        project_name = data_utils.rand_name('ram_quota_project')
+        project_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='ram_quota_project')
         project_desc = project_name + '-desc'
         project = identity.identity_utils(self.os_admin).create_project(
             name=project_name, description=project_desc)
diff --git a/tempest/api/compute/admin/test_quotas_negative.py b/tempest/api/compute/admin/test_quotas_negative.py
index a4120bb..ef89cc1 100644
--- a/tempest/api/compute/admin/test_quotas_negative.py
+++ b/tempest/api/compute/admin/test_quotas_negative.py
@@ -133,8 +133,9 @@
         # when we reach limit maxSecurityGroupRules
         self._update_quota('security_group_rules', 0)
 
-        s_name = data_utils.rand_name('securitygroup')
-        s_description = data_utils.rand_name('description')
+        prefix = CONF.resource_name_prefix
+        s_name = data_utils.rand_name(prefix=prefix, name='securitygroup')
+        s_description = data_utils.rand_name(prefix=prefix, name='description')
         securitygroup = self.sg_client.create_security_group(
             name=s_name, description=s_description)['security_group']
         self.addCleanup(self.sg_client.delete_security_group,
diff --git a/tempest/api/compute/admin/test_security_groups.py b/tempest/api/compute/admin/test_security_groups.py
index f0a6a84..41acc94 100644
--- a/tempest/api/compute/admin/test_security_groups.py
+++ b/tempest/api/compute/admin/test_security_groups.py
@@ -15,9 +15,12 @@
 
 from tempest.api.compute import base
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class SecurityGroupsTestAdminJSON(base.BaseV2ComputeAdminTest):
     """Test security groups API that requires admin privilege
@@ -57,9 +60,11 @@
         # List of all security groups created
         security_group_list = []
         # Create two security groups for a non-admin tenant
+        prefix = CONF.resource_name_prefix
         for _ in range(2):
-            name = data_utils.rand_name('securitygroup')
-            description = data_utils.rand_name('description')
+            name = data_utils.rand_name(prefix=prefix, name='securitygroup')
+            description = data_utils.rand_name(
+                prefix=prefix, name='description')
             securitygroup = self.client.create_security_group(
                 name=name, description=description)['security_group']
             self.addCleanup(self._delete_security_group,
@@ -69,8 +74,9 @@
         client_tenant_id = securitygroup['tenant_id']
         # Create two security groups for admin tenant
         for _ in range(2):
-            name = data_utils.rand_name('securitygroup')
-            description = data_utils.rand_name('description')
+            name = data_utils.rand_name(prefix=prefix, name='securitygroup')
+            description = data_utils.rand_name(
+                prefix=prefix, name='description')
             adm_securitygroup = self.adm_client.create_security_group(
                 name=name, description=description)['security_group']
             self.addCleanup(self._delete_security_group,
diff --git a/tempest/api/compute/admin/test_servers.py b/tempest/api/compute/admin/test_servers.py
index 321078c..be838fc 100644
--- a/tempest/api/compute/admin/test_servers.py
+++ b/tempest/api/compute/admin/test_servers.py
@@ -37,11 +37,14 @@
     def resource_setup(cls):
         super(ServersAdminTestJSON, cls).resource_setup()
 
-        cls.s1_name = data_utils.rand_name(cls.__name__ + '-server')
+        prefix = CONF.resource_name_prefix
+        cls.s1_name = data_utils.rand_name(prefix=prefix,
+                                           name=cls.__name__ + '-server')
         server = cls.create_test_server(name=cls.s1_name)
         cls.s1_id = server['id']
 
-        cls.s2_name = data_utils.rand_name(cls.__name__ + '-server')
+        cls.s2_name = data_utils.rand_name(prefix=prefix,
+                                           name=cls.__name__ + '-server')
         server = cls.create_test_server(name=cls.s2_name,
                                         wait_until='ACTIVE')
         cls.s2_id = server['id']
diff --git a/tempest/api/compute/admin/test_volume.py b/tempest/api/compute/admin/test_volume.py
index e7c931e..2813d7a 100644
--- a/tempest/api/compute/admin/test_volume.py
+++ b/tempest/api/compute/admin/test_volume.py
@@ -59,6 +59,11 @@
             'min_ram': image['min_ram'],
             'visibility': 'public',
         }
+        if 'kernel_id' in image:
+            create_dict['kernel_id'] = image['kernel_id']
+        if 'ramdisk_id' in image:
+            create_dict['ramdisk_id'] = image['ramdisk_id']
+
         create_dict.update(kwargs)
         try:
             new_image = self.admin_image_client.create_image(**create_dict)
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index d02532d..2557e47 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -223,7 +223,9 @@
             `compute.create_test_server` call.
         """
         if 'name' not in kwargs:
-            kwargs['name'] = data_utils.rand_name(cls.__name__ + "-server")
+            kwargs['name'] = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=cls.__name__ + "-server")
 
         request_version = api_version_request.APIVersionRequest(
             cls.request_microversion)
@@ -260,10 +262,13 @@
 
     @classmethod
     def create_security_group(cls, name=None, description=None):
+        prefix = CONF.resource_name_prefix
         if name is None:
-            name = data_utils.rand_name(cls.__name__ + "-securitygroup")
+            name = data_utils.rand_name(
+                prefix=prefix, name=cls.__name__ + "-securitygroup")
         if description is None:
-            description = data_utils.rand_name('description')
+            description = data_utils.rand_name(
+                prefix=prefix, name='description')
         body = cls.security_groups_client.create_security_group(
             name=name, description=description)['security_group']
         cls.addClassResourceCleanup(
@@ -276,7 +281,9 @@
     @classmethod
     def create_test_server_group(cls, name="", policy=None):
         if not name:
-            name = data_utils.rand_name(cls.__name__ + "-Server-Group")
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=cls.__name__ + "-Server-Group")
         if cls.is_requested_microversion_compatible('2.63'):
             policy = policy or ['affinity']
             if not isinstance(policy, list):
@@ -324,8 +331,11 @@
         If compute microversion >= 2.36, the returned image response will
         be from the image service API rather than the compute image proxy API.
         """
-        name = kwargs.pop('name',
-                          data_utils.rand_name(cls.__name__ + "-image"))
+        name = kwargs.pop(
+            'name',
+            data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=cls.__name__ + "-image"))
         wait_until = kwargs.pop('wait_until', None)
         wait_for_server = kwargs.pop('wait_for_server', True)
 
@@ -501,7 +511,9 @@
         if 'size' not in kwargs:
             kwargs['size'] = CONF.volume.volume_size
         if 'display_name' not in kwargs:
-            vol_name = data_utils.rand_name(cls.__name__ + '-volume')
+            vol_name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=cls.__name__ + '-volume')
             kwargs['display_name'] = vol_name
         if image_ref is not None:
             kwargs['imageRef'] = image_ref
@@ -595,7 +607,8 @@
     def create_volume_snapshot(self, volume_id, name=None, description=None,
                                metadata=None, force=False):
         name = name or data_utils.rand_name(
-            self.__class__.__name__ + '-snapshot')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-snapshot')
         snapshot = self.snapshots_client.create_snapshot(
             volume_id=volume_id,
             force=force,
@@ -652,7 +665,9 @@
     def create_flavor(self, ram, vcpus, disk, name=None,
                       is_public='True', **kwargs):
         if name is None:
-            name = data_utils.rand_name(self.__class__.__name__ + "-flavor")
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + "-flavor")
         id = kwargs.pop('id', data_utils.rand_int_id(start=1000))
         client = self.admin_flavors_client
         flavor = client.create_flavor(
diff --git a/tempest/api/compute/certificates/test_certificates.py b/tempest/api/compute/certificates/test_certificates.py
deleted file mode 100644
index 5917931..0000000
--- a/tempest/api/compute/certificates/test_certificates.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-from tempest.api.compute import base
-from tempest import config
-from tempest.lib import decorators
-
-CONF = config.CONF
-
-
-class CertificatesV2TestJSON(base.BaseV2ComputeTest):
-    """Test Certificates API"""
-
-    @classmethod
-    def skip_checks(cls):
-        super(CertificatesV2TestJSON, cls).skip_checks()
-        if not CONF.compute_feature_enabled.nova_cert:
-            raise cls.skipException("Nova cert is not available")
-
-    @decorators.idempotent_id('c070a441-b08e-447e-a733-905909535b1b')
-    def test_create_root_certificate(self):
-        """Test creating root certificate"""
-        self.certificates_client.create_certificate()
-
-    @decorators.idempotent_id('3ac273d0-92d2-4632-bdfc-afbc21d4606c')
-    def test_get_root_certificate(self):
-        """Test getting root certificate details"""
-        self.certificates_client.show_certificate('root')
diff --git a/tempest/api/compute/flavors/test_flavors_negative.py b/tempest/api/compute/flavors/test_flavors_negative.py
index 22b71fc..09f54b5 100644
--- a/tempest/api/compute/flavors/test_flavors_negative.py
+++ b/tempest/api/compute/flavors/test_flavors_negative.py
@@ -44,7 +44,8 @@
         size = random.randint(1024, 4096)
         image_file = io.BytesIO(data_utils.random_bytes(size))
         params = {
-            'name': data_utils.rand_name('image'),
+            'name': data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name='image'),
             'container_format': CONF.image.container_formats[0],
             'disk_format': CONF.image.disk_formats[0],
             'min_ram': min_img_ram,
diff --git a/tempest/api/compute/images/test_image_metadata.py b/tempest/api/compute/images/test_image_metadata.py
index f630bc8..1c9f212 100644
--- a/tempest/api/compute/images/test_image_metadata.py
+++ b/tempest/api/compute/images/test_image_metadata.py
@@ -52,9 +52,12 @@
     def resource_setup(cls):
         super(ImagesMetadataTestJSON, cls).resource_setup()
         cls.image_id = None
-
+        image_name_kwargs = {
+            'prefix': CONF.resource_name_prefix,
+            'name': 'image'
+        }
         params = {
-            'name': data_utils.rand_name('image'),
+            'name': data_utils.rand_name(**image_name_kwargs),
             'container_format': 'bare',
             'disk_format': 'raw',
             'visibility': 'private'
diff --git a/tempest/api/compute/images/test_images.py b/tempest/api/compute/images/test_images.py
index d47ffce..87cedae 100644
--- a/tempest/api/compute/images/test_images.py
+++ b/tempest/api/compute/images/test_images.py
@@ -57,7 +57,8 @@
         # in task_state image_snapshot
         self.addCleanup(waiters.wait_for_server_status, self.servers_client,
                         server['id'], 'ACTIVE')
-        snapshot_name = data_utils.rand_name('test-snap')
+        snapshot_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test-snap')
         try:
             image = self.create_image_from_server(server['id'],
                                                   name=snapshot_name,
@@ -83,7 +84,8 @@
         waiters.wait_for_server_status(self.servers_client,
                                        server['id'], 'SHUTOFF')
         self.addCleanup(self.servers_client.delete_server, server['id'])
-        snapshot_name = data_utils.rand_name('test-snap')
+        snapshot_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test-snap')
         image = self.create_image_from_server(server['id'],
                                               name=snapshot_name,
                                               wait_until='ACTIVE',
@@ -102,7 +104,8 @@
                                        server['id'], 'PAUSED')
         self.addCleanup(self.servers_client.delete_server, server['id'])
 
-        snapshot_name = data_utils.rand_name('test-snap')
+        snapshot_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test-snap')
         image = self.create_image_from_server(server['id'],
                                               name=snapshot_name,
                                               wait_until='ACTIVE',
@@ -121,7 +124,8 @@
                                        server['id'], 'SUSPENDED')
         self.addCleanup(self.servers_client.delete_server, server['id'])
 
-        snapshot_name = data_utils.rand_name('test-snap')
+        snapshot_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test-snap')
         image = self.create_image_from_server(server['id'],
                                               name=snapshot_name,
                                               wait_until='ACTIVE',
@@ -136,7 +140,8 @@
         self.addCleanup(self.servers_client.delete_server, server['id'])
 
         # Snapshot it
-        snapshot_name = data_utils.rand_name('test-snap')
+        snapshot_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test-snap')
         image = self.create_image_from_server(server['id'],
                                               name=snapshot_name,
                                               wait_until='ACTIVE',
diff --git a/tempest/api/compute/images/test_images_negative.py b/tempest/api/compute/images/test_images_negative.py
index 124651e..2375514 100644
--- a/tempest/api/compute/images/test_images_negative.py
+++ b/tempest/api/compute/images/test_images_negative.py
@@ -66,8 +66,12 @@
         """Check server image should not be created with invalid server id"""
         # Create a new image with invalid server id
         meta = {'image_type': 'test'}
-        self.assertRaises(lib_exc.NotFound, self.create_image_from_server,
-                          data_utils.rand_name('invalid'), metadata=meta)
+        self.assertRaises(
+            lib_exc.NotFound,
+            self.create_image_from_server,
+            data_utils.rand_name(prefix=CONF.resource_name_prefix,
+                                 name='invalid'),
+            metadata=meta)
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('ec176029-73dc-4037-8d72-2e4ff60cf538')
@@ -76,7 +80,8 @@
 
         Return an error if server id passed is 35 characters or less
         """
-        snapshot_name = data_utils.rand_name('test-snap')
+        snapshot_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test-snap')
         test_uuid = ('a' * 35)
         self.assertRaises(lib_exc.NotFound, self.client.create_image,
                           test_uuid, name=snapshot_name)
@@ -88,7 +93,8 @@
 
         Return an error if sever id passed is 37 characters or more
         """
-        snapshot_name = data_utils.rand_name('test-snap')
+        snapshot_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test-snap')
         test_uuid = ('a' * 37)
         self.assertRaises(lib_exc.NotFound, self.client.create_image,
                           test_uuid, name=snapshot_name)
@@ -105,8 +111,10 @@
     @decorators.idempotent_id('381acb65-785a-4942-94ce-d8f8c84f1f0f')
     def test_delete_image_with_invalid_image_id(self):
         """Check an image should not be deleted with invalid image id"""
-        self.assertRaises(lib_exc.NotFound, self.client.delete_image,
-                          data_utils.rand_name('invalid'))
+        self.assertRaises(
+            lib_exc.NotFound, self.client.delete_image,
+            data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name='invalid'))
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('137aef61-39f7-44a1-8ddf-0adf82511701')
diff --git a/tempest/api/compute/images/test_images_oneserver.py b/tempest/api/compute/images/test_images_oneserver.py
index 2b859da..ed3bf66 100644
--- a/tempest/api/compute/images/test_images_oneserver.py
+++ b/tempest/api/compute/images/test_images_oneserver.py
@@ -66,7 +66,8 @@
             MIN_RAM = 'min_ram'
 
         # Create a new image
-        name = data_utils.rand_name('image')
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='image')
         meta = {'image_type': 'test'}
         image = self.create_image_from_server(self.server_id, name=name,
                                               metadata=meta,
@@ -104,6 +105,8 @@
         # We use a string with 3 byte utf-8 character due to nova/glance which
         # will return 400(Bad Request) if we attempt to send a name which has
         # 4 byte utf-8 character.
-        utf8_name = data_utils.rand_name(b'\xe2\x82\xa1'.decode('utf-8'))
+        utf8_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=b'\xe2\x82\xa1'.decode('utf-8'))
         self.create_image_from_server(self.server_id, name=utf8_name,
                                       wait_until='ACTIVE')
diff --git a/tempest/api/compute/images/test_list_image_filters.py b/tempest/api/compute/images/test_list_image_filters.py
index c6eff9b..78363ee 100644
--- a/tempest/api/compute/images/test_list_image_filters.py
+++ b/tempest/api/compute/images/test_list_image_filters.py
@@ -56,8 +56,12 @@
         super(ListImageFiltersTestJSON, cls).resource_setup()
 
         def _create_image():
+            image_name_kwargs = {
+                'prefix': CONF.resource_name_prefix,
+                'name': cls.__name__ + '-image'
+            }
             params = {
-                'name': data_utils.rand_name(cls.__name__ + '-image'),
+                'name': data_utils.rand_name(**image_name_kwargs),
                 'container_format': 'bare',
                 'disk_format': 'raw',
                 'visibility': 'private'
diff --git a/tempest/api/compute/keypairs/base.py b/tempest/api/compute/keypairs/base.py
index 44da88c..5f8f959 100644
--- a/tempest/api/compute/keypairs/base.py
+++ b/tempest/api/compute/keypairs/base.py
@@ -14,8 +14,11 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 
+CONF = config.CONF
+
 
 class BaseKeypairTest(base.BaseV2ComputeTest):
     """Base test case class for all keypair API tests."""
@@ -32,7 +35,8 @@
             client = self.keypairs_client
         if keypair_name is None:
             keypair_name = data_utils.rand_name(
-                self.__class__.__name__ + '-keypair')
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + '-keypair')
         kwargs = {'name': keypair_name}
         delete_params = {}
         if pub_key:
diff --git a/tempest/api/compute/keypairs/test_keypairs.py b/tempest/api/compute/keypairs/test_keypairs.py
index 8df2e84..2aab58d 100644
--- a/tempest/api/compute/keypairs/test_keypairs.py
+++ b/tempest/api/compute/keypairs/test_keypairs.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.compute.keypairs import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class KeyPairsV2TestJSON(base.BaseKeypairTest):
     """Test keypairs API with compute microversion less than 2.2"""
@@ -54,7 +57,8 @@
     @decorators.idempotent_id('6c1d3123-4519-4742-9194-622cb1714b7d')
     def test_keypair_create_delete(self):
         """Test create/delete keypair"""
-        k_name = data_utils.rand_name('keypair')
+        k_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='keypair')
         keypair = self.create_keypair(k_name)
         key_name = keypair['name']
         self.assertEqual(key_name, k_name,
@@ -64,7 +68,8 @@
     @decorators.idempotent_id('a4233d5d-52d8-47cc-9a25-e1864527e3df')
     def test_get_keypair_detail(self):
         """Test getting keypair detail by keypair name"""
-        k_name = data_utils.rand_name('keypair')
+        k_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='keypair')
         self.create_keypair(k_name)
         keypair_detail = self.keypairs_client.show_keypair(k_name)['keypair']
         self.assertEqual(keypair_detail['name'], k_name,
@@ -74,7 +79,8 @@
     @decorators.idempotent_id('39c90c6a-304a-49dd-95ec-2366129def05')
     def test_keypair_create_with_pub_key(self):
         """Test creating keypair with a given public key"""
-        k_name = data_utils.rand_name('keypair')
+        k_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='keypair')
         pub_key = ("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCs"
                    "Ne3/1ILNCqFyfYWDeTKLD6jEXC2OQHLmietMWW+/vd"
                    "aZq7KZEwO0jhglaFjU1mpqq4Gz5RX156sCTNM9vRbw"
diff --git a/tempest/api/compute/keypairs/test_keypairs_negative.py b/tempest/api/compute/keypairs/test_keypairs_negative.py
index 40bea3f..feef864 100644
--- a/tempest/api/compute/keypairs/test_keypairs_negative.py
+++ b/tempest/api/compute/keypairs/test_keypairs_negative.py
@@ -15,10 +15,13 @@
 #    under the License.
 
 from tempest.api.compute.keypairs import base
+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
 
+CONF = config.CONF
+
 
 class KeyPairsNegativeTestJSON(base.BaseKeypairTest):
     """Negative tests of keypairs API"""
@@ -35,7 +38,9 @@
     @decorators.idempotent_id('7cc32e47-4c42-489d-9623-c5e2cb5a2fa5')
     def test_keypair_delete_nonexistent_key(self):
         """Test non-existent key deletion should throw a proper error"""
-        k_name = data_utils.rand_name("keypair-non-existent")
+        k_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="keypair-non-existent")
         self.assertRaises(lib_exc.NotFound,
                           self.keypairs_client.delete_keypair,
                           k_name)
@@ -60,7 +65,8 @@
     @decorators.idempotent_id('0359a7f1-f002-4682-8073-0c91e4011b7c')
     def test_create_keypair_with_duplicate_name(self):
         """Test keypairs with duplicate names should not be created"""
-        k_name = data_utils.rand_name('keypair')
+        k_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='keypair')
         self.keypairs_client.create_keypair(name=k_name)
         # Now try the same keyname to create another key
         self.assertRaises(lib_exc.Conflict, self.create_keypair,
diff --git a/tempest/api/compute/keypairs/test_keypairs_v22.py b/tempest/api/compute/keypairs/test_keypairs_v22.py
index e229c37..06bbf57 100644
--- a/tempest/api/compute/keypairs/test_keypairs_v22.py
+++ b/tempest/api/compute/keypairs/test_keypairs_v22.py
@@ -13,9 +13,12 @@
 #    under the License.
 
 from tempest.api.compute.keypairs import test_keypairs
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class KeyPairsV22TestJSON(test_keypairs.KeyPairsV2TestJSON):
     """Test keypairs API with compute microversion greater than 2.1"""
@@ -29,7 +32,8 @@
         self.assertEqual(keypair_type, keypair['type'])
 
     def _test_keypairs_create_list_show(self, keypair_type=None):
-        k_name = data_utils.rand_name('keypair')
+        k_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='keypair')
         keypair = self.create_keypair(k_name, keypair_type=keypair_type)
         # Verify whether 'type' is present in keypair create response of
         # version 2.2 and it is with default value 'ssh'.
diff --git a/tempest/api/compute/security_groups/test_security_group_rules_negative.py b/tempest/api/compute/security_groups/test_security_group_rules_negative.py
index 3d000ca..c09be58 100644
--- a/tempest/api/compute/security_groups/test_security_group_rules_negative.py
+++ b/tempest/api/compute/security_groups/test_security_group_rules_negative.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.compute.security_groups import base
+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
 
+CONF = config.CONF
+
 
 class SecurityGroupRulesNegativeTestJSON(base.BaseSecurityGroupsTest):
     """Negative tests of security group rules API
@@ -59,7 +62,8 @@
         with parent group id which is not integer.
         """
         # Adding rules to the non int Security Group id
-        parent_group_id = data_utils.rand_name('non_int_id')
+        parent_group_id = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='non_int_id')
         ip_protocol = 'tcp'
         from_port = 22
         to_port = 22
@@ -105,7 +109,8 @@
         sg = self.create_security_group()
         # Adding rules to the created Security Group
         parent_group_id = sg['id']
-        ip_protocol = data_utils.rand_name('999')
+        ip_protocol = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='999')
         from_port = 22
         to_port = 22
 
diff --git a/tempest/api/compute/security_groups/test_security_groups.py b/tempest/api/compute/security_groups/test_security_groups.py
index a1f3514..01a7986 100644
--- a/tempest/api/compute/security_groups/test_security_groups.py
+++ b/tempest/api/compute/security_groups/test_security_groups.py
@@ -15,10 +15,13 @@
 
 from tempest.api.compute.security_groups import base
 from tempest.common import waiters
+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
 
+CONF = config.CONF
+
 
 class SecurityGroupsTestJSON(base.BaseSecurityGroupsTest):
     """Test security groups API with compute microversion less than 2.36"""
@@ -69,7 +72,8 @@
         Security group should be created, fetched and deleted
         with char space between name along with leading and trailing spaces.
         """
-        s_name = ' %s ' % data_utils.rand_name('securitygroup ')
+        s_name = ' %s ' % data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='securitygroup ')
         securitygroup = self.create_security_group(name=s_name)
         securitygroup_name = securitygroup['name']
         self.assertEqual(securitygroup_name, s_name,
@@ -133,8 +137,9 @@
         securitygroup = self.create_security_group()
         securitygroup_id = securitygroup['id']
         # Update the name and description
-        s_new_name = data_utils.rand_name('sg-hth')
-        s_new_des = data_utils.rand_name('description-hth')
+        prefix = CONF.resource_name_prefix
+        s_new_name = data_utils.rand_name(prefix=prefix, name='sg-hth')
+        s_new_des = data_utils.rand_name(prefix=prefix, name='description-hth')
         self.client.update_security_group(securitygroup_id,
                                           name=s_new_name,
                                           description=s_new_des)
diff --git a/tempest/api/compute/security_groups/test_security_groups_negative.py b/tempest/api/compute/security_groups/test_security_groups_negative.py
index 4607112..c7d873f 100644
--- a/tempest/api/compute/security_groups/test_security_groups_negative.py
+++ b/tempest/api/compute/security_groups/test_security_groups_negative.py
@@ -55,7 +55,8 @@
         as an empty string, or group name with white spaces, or group name
         with chars more than 255.
         """
-        s_description = data_utils.rand_name('description')
+        s_description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='description')
         # Create Security Group with empty string as group name
         self.assertRaises(lib_exc.BadRequest,
                           self.client.create_security_group,
@@ -81,7 +82,8 @@
         longer than 255 chars. Empty description is allowed by the API
         reference, however.
         """
-        s_name = data_utils.rand_name('securitygroup')
+        s_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='securitygroup')
         # Create Security Group with group description longer than 255 chars
         s_description = 'description-'.ljust(260, '0')
         self.assertRaises(lib_exc.BadRequest,
@@ -94,8 +96,10 @@
     @decorators.attr(type=['negative'])
     def test_security_group_create_with_duplicate_name(self):
         """Test creating security group with duplicate name should fail"""
-        s_name = data_utils.rand_name('securitygroup')
-        s_description = data_utils.rand_name('description')
+        s_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='securitygroup')
+        s_description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='description')
         self.create_security_group(name=s_name, description=s_description)
         # Now try the Security Group with the same 'Name'
         self.assertRaises(lib_exc.BadRequest,
@@ -138,10 +142,13 @@
     @decorators.attr(type=['negative'])
     def test_update_security_group_with_invalid_sg_id(self):
         """Test updating security group with invalid group id should fail"""
-        s_name = data_utils.rand_name('sg')
-        s_description = data_utils.rand_name('description')
+        s_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='sg')
+        s_description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='description')
         # Create a non int sg_id
-        sg_id_invalid = data_utils.rand_name('sg')
+        sg_id_invalid = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='sg')
         self.assertRaises(lib_exc.BadRequest,
                           self.client.update_security_group, sg_id_invalid,
                           name=s_name, description=s_description)
@@ -179,8 +186,10 @@
     def test_update_non_existent_security_group(self):
         """Test updating a non existent security group should fail"""
         non_exist_id = self.generate_random_security_group_id()
-        s_name = data_utils.rand_name('sg')
-        s_description = data_utils.rand_name('description')
+        s_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='sg')
+        s_description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='description')
         self.assertRaises(lib_exc.NotFound,
                           self.client.update_security_group,
                           non_exist_id, name=s_name,
diff --git a/tempest/api/compute/servers/test_attach_interfaces.py b/tempest/api/compute/servers/test_attach_interfaces.py
index 9b6bf84..8984d1d 100644
--- a/tempest/api/compute/servers/test_attach_interfaces.py
+++ b/tempest/api/compute/servers/test_attach_interfaces.py
@@ -161,7 +161,9 @@
         network_id = ifs[0]['net_id']
         port = self.ports_client.create_port(
             network_id=network_id,
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__))
         port_id = port['port']['id']
         self.addCleanup(self.ports_client.delete_port, port_id)
         iface = self.interfaces_client.create_interface(
@@ -324,7 +326,9 @@
 
         port = self.ports_client.create_port(
             network_id=network_id,
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__))
         port_id = port['port']['id']
         self.addCleanup(self.ports_client.delete_port, port_id)
 
diff --git a/tempest/api/compute/servers/test_create_server.py b/tempest/api/compute/servers/test_create_server.py
index c9aec62..6664e15 100644
--- a/tempest/api/compute/servers/test_create_server.py
+++ b/tempest/api/compute/servers/test_create_server.py
@@ -53,7 +53,9 @@
         cls.meta = {'hello': 'world'}
         cls.accessIPv4 = '1.1.1.1'
         cls.accessIPv6 = '0000:0000:0000:0000:0000:babe:220.12.22.2'
-        cls.name = data_utils.rand_name(cls.__name__ + '-server')
+        cls.name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__name__ + '-server')
         cls.password = data_utils.rand_password()
         disk_config = cls.disk_config
         server_initial = cls.create_test_server(
diff --git a/tempest/api/compute/servers/test_create_server_multi_nic.py b/tempest/api/compute/servers/test_create_server_multi_nic.py
index 6ec058d..1cbb976 100644
--- a/tempest/api/compute/servers/test_create_server_multi_nic.py
+++ b/tempest/api/compute/servers/test_create_server_multi_nic.py
@@ -67,7 +67,9 @@
         cls.subnets_client = cls.os_primary.subnets_client
 
     def _create_net_subnet_ret_net_from_cidr(self, cidr):
-        name_net = data_utils.rand_name(self.__class__.__name__)
+        name_net = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__)
         net = self.networks_client.create_network(name=name_net)
         self.addCleanup(self.networks_client.delete_network,
                         net['network']['id'])
diff --git a/tempest/api/compute/servers/test_device_tagging.py b/tempest/api/compute/servers/test_device_tagging.py
index 7d29a4d..2640311 100644
--- a/tempest/api/compute/servers/test_device_tagging.py
+++ b/tempest/api/compute/servers/test_device_tagging.py
@@ -172,11 +172,15 @@
 
         # Create networks
         net1 = self.networks_client.create_network(
-            name=data_utils.rand_name('device-tagging-net1'))['network']
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='device-tagging-net1'))['network']
         self.addCleanup(self.networks_client.delete_network, net1['id'])
 
         net2 = self.networks_client.create_network(
-            name=data_utils.rand_name('device-tagging-net2'))['network']
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='device-tagging-net2'))['network']
         self.addCleanup(self.networks_client.delete_network, net2['id'])
 
         # Create subnets
@@ -195,13 +199,17 @@
         # Create ports
         self.port1 = self.ports_client.create_port(
             network_id=net1['id'],
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__),
             fixed_ips=[{'subnet_id': subnet1['id']}])['port']
         self.addCleanup(self.ports_client.delete_port, self.port1['id'])
 
         self.port2 = self.ports_client.create_port(
             network_id=net1['id'],
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__),
             fixed_ips=[{'subnet_id': subnet1['id']}])['port']
         self.addCleanup(self.ports_client.delete_port, self.port2['id'])
 
@@ -215,7 +223,9 @@
             wait_until='SSHABLE',
             validation_resources=validation_resources,
             config_drive=config_drive_enabled,
-            name=data_utils.rand_name('device-tagging-server'),
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='device-tagging-server'),
             networks=[
                 # Validation network for ssh
                 {
@@ -378,7 +388,8 @@
         # Create network
         net = self.networks_client.create_network(
             name=data_utils.rand_name(
-                'tagged-attachments-test-net'))['network']
+                prefix=CONF.resource_name_prefix,
+                name='tagged-attachments-test-net'))['network']
         self.addCleanup(self.networks_client.delete_network, net['id'])
 
         # Create subnet
@@ -400,7 +411,9 @@
             validatable=True,
             validation_resources=validation_resources,
             config_drive=config_drive_enabled,
-            name=data_utils.rand_name('device-tagging-server'),
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='device-tagging-server'),
             networks=[{'uuid': self.get_tenant_network()['id']}],
             wait_until='SSHABLE')
         self.addCleanup(self.delete_server, server['id'])
diff --git a/tempest/api/compute/servers/test_list_server_filters.py b/tempest/api/compute/servers/test_list_server_filters.py
index 990dd52..7873296 100644
--- a/tempest/api/compute/servers/test_list_server_filters.py
+++ b/tempest/api/compute/servers/test_list_server_filters.py
@@ -48,17 +48,23 @@
         else:
             cls.fixed_network_name = None
         network_kwargs = fixed_network.set_networks_kwarg(network)
-        cls.s1_name = data_utils.rand_name(cls.__name__ + '-instance')
+        cls.s1_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__name__ + '-instance')
         cls.s1 = cls.create_test_server(name=cls.s1_name, **network_kwargs)
 
-        cls.s2_name = data_utils.rand_name(cls.__name__ + '-instance')
+        cls.s2_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__name__ + '-instance')
         # If image_ref_alt is "" or None then we still want to boot a server
         # but we rely on `testtools.skipUnless` decorator to actually skip
         # the irrelevant tests.
         cls.s2 = cls.create_test_server(
             name=cls.s2_name, image_id=cls.image_ref_alt or cls.image_ref)
 
-        cls.s3_name = data_utils.rand_name(cls.__name__ + '-instance')
+        cls.s3_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__name__ + '-instance')
         cls.s3 = cls.create_test_server(name=cls.s3_name,
                                         flavor=cls.flavor_ref_alt,
                                         wait_until='ACTIVE')
diff --git a/tempest/api/compute/servers/test_server_actions.py b/tempest/api/compute/servers/test_server_actions.py
index a181839..21ed0cd 100644
--- a/tempest/api/compute/servers/test_server_actions.py
+++ b/tempest/api/compute/servers/test_server_actions.py
@@ -133,7 +133,9 @@
                               ['addresses'])
         # The server should be rebuilt using the provided image and data
         meta = {'rebuild': 'server'}
-        new_name = data_utils.rand_name(self.__class__.__name__ + '-server')
+        new_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-server')
         password = 'rebuildPassw0rd'
         rebuilt_server = self.client.rebuild_server(
             server_id,
@@ -575,7 +577,8 @@
             raise lib_exc.InvalidConfiguration(
                 'api_v2 must be True in [image-feature-enabled].')
 
-        backup1 = data_utils.rand_name('backup-1')
+        backup1 = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='backup-1')
         resp = self.client.create_backup(self.server_id,
                                          backup_type='daily',
                                          rotation=2,
@@ -603,7 +606,8 @@
         waiters.wait_for_image_status(glance_client,
                                       image1_id, 'active')
 
-        backup2 = data_utils.rand_name('backup-2')
+        backup2 = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='backup-2')
         waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
         resp = self.client.create_backup(self.server_id,
                                          backup_type='daily',
@@ -639,7 +643,8 @@
 
         # create the third one, due to the rotation is 2,
         # the first one will be deleted
-        backup3 = data_utils.rand_name('backup-3')
+        backup3 = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='backup-3')
         waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
         resp = self.client.create_backup(self.server_id,
                                          backup_type='daily',
@@ -796,7 +801,8 @@
     def test_create_backup(self):
         server = self.create_test_server(wait_until='ACTIVE')
 
-        backup1 = data_utils.rand_name('backup-1')
+        backup1 = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='backup-1')
         # Just check create_back to verify the schema with 2.47
         self.servers_client.create_backup(server['id'],
                                           backup_type='daily',
@@ -859,7 +865,9 @@
 
         # The server should be rebuilt using the provided image and data
         meta = {'rebuild': 'server'}
-        new_name = data_utils.rand_name(self.__class__.__name__ + '-server')
+        new_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-server')
         password = 'rebuildPassw0rd'
         rebuilt_server = self.servers_client.rebuild_server(
             server['id'],
diff --git a/tempest/api/compute/servers/test_server_group.py b/tempest/api/compute/servers/test_server_group.py
index 4b6d45a..f92b5ba 100644
--- a/tempest/api/compute/servers/test_server_group.py
+++ b/tempest/api/compute/servers/test_server_group.py
@@ -17,9 +17,12 @@
 
 from tempest.api.compute import base
 from tempest.common import compute
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class ServerGroupTestJSON(base.BaseV2ComputeTest):
     """These tests check for the server-group APIs.
@@ -80,7 +83,8 @@
 
     def _create_delete_server_group(self, policy):
         # Create and Delete the server-group with given policy
-        name = data_utils.rand_name('server-group')
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='server-group')
         server_group = self._create_server_group(name, policy)
         self._delete_server_group(server_group)
 
@@ -99,7 +103,8 @@
     def test_create_delete_multiple_server_groups_with_same_name_policy(self):
         """Test Create/Delete the server-groups with same name and policy"""
         server_groups = []
-        server_group_name = data_utils.rand_name('server-group')
+        server_group_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='server-group')
         for _ in range(0, 2):
             server_groups.append(self._create_server_group(server_group_name,
                                                            self.policy))
diff --git a/tempest/api/compute/servers/test_server_tags.py b/tempest/api/compute/servers/test_server_tags.py
index cdeaae5..0b5870a 100644
--- a/tempest/api/compute/servers/test_server_tags.py
+++ b/tempest/api/compute/servers/test_server_tags.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class ServerTagsTestJSON(base.BaseV2ComputeTest):
     """Test server tags with compute microversion greater than 2.25"""
@@ -51,7 +54,8 @@
         self.assertEmpty(fetched_tags)
 
         # Add server tag to the server.
-        assigned_tag = data_utils.rand_name('tag')
+        assigned_tag = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='tag')
         self._update_server_tags(self.server['id'], assigned_tag)
 
         # Check that added tag exists.
@@ -67,11 +71,16 @@
     def test_update_all_tags(self):
         """Test updating all server tags"""
         # Add server tags to the server.
-        tags = [data_utils.rand_name('tag'), data_utils.rand_name('tag')]
+        kwargs = {
+            'prefix': CONF.resource_name_prefix,
+            'name': 'tag'
+        }
+        tags = [data_utils.rand_name(**kwargs), data_utils.rand_name(**kwargs)]
         self._update_server_tags(self.server['id'], tags)
 
         # Replace tags with new tags and check that they are present.
-        new_tags = [data_utils.rand_name('tag'), data_utils.rand_name('tag')]
+        new_tags = [data_utils.rand_name(**kwargs),
+                    data_utils.rand_name(**kwargs)]
         replaced_tags = self.client.update_all_tags(
             self.server['id'], new_tags)['tags']
         self.assertCountEqual(new_tags, replaced_tags)
@@ -83,9 +92,13 @@
     @decorators.idempotent_id('a63b2a74-e918-4b7c-bcab-10c855f3a57e')
     def test_delete_all_tags(self):
         """Test deleting all server tags"""
+        kwargs = {
+            'prefix': CONF.resource_name_prefix,
+            'name': 'tag'
+        }
         # Add server tags to the server.
-        assigned_tags = [data_utils.rand_name('tag'),
-                         data_utils.rand_name('tag')]
+        assigned_tags = [data_utils.rand_name(**kwargs),
+                         data_utils.rand_name(**kwargs)]
         self._update_server_tags(self.server['id'], assigned_tags)
 
         # Delete tags from the server and check that they were deleted.
@@ -97,7 +110,8 @@
     def test_check_tag_existence(self):
         """Test checking server tag existence"""
         # Add server tag to the server.
-        assigned_tag = data_utils.rand_name('tag')
+        assigned_tag = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='tag')
         self._update_server_tags(self.server['id'], assigned_tag)
 
         # Check that added tag exists. Throws a 404 if not found, else a 204,
diff --git a/tempest/api/compute/servers/test_servers.py b/tempest/api/compute/servers/test_servers.py
index 388b9b0..c72b74e 100644
--- a/tempest/api/compute/servers/test_servers.py
+++ b/tempest/api/compute/servers/test_servers.py
@@ -60,7 +60,8 @@
         """Test creating a server with already existing name is allowed"""
         # TODO(sdague): clear out try, we do cleanup one layer up
         server_name = data_utils.rand_name(
-            self.__class__.__name__ + '-server')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-server')
         server = self.create_test_server(name=server_name,
                                          wait_until='ACTIVE')
         id1 = server['id']
@@ -79,7 +80,8 @@
     @decorators.idempotent_id('f9e15296-d7f9-4e62-b53f-a04e89160833')
     def test_create_specify_keypair(self):
         """Test creating server with keypair"""
-        key_name = data_utils.rand_name('key')
+        key_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='key')
         self.keypairs_client.create_keypair(name=key_name)
         self.addCleanup(self.keypairs_client.delete_keypair, key_name)
         self.keypairs_client.list_keypairs()
@@ -91,7 +93,8 @@
 
     def _update_server_name(self, server_id, status, prefix_name='server'):
         # The server name should be changed to the provided value
-        new_name = data_utils.rand_name(prefix_name)
+        new_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=prefix_name)
 
         # Update the server with a new name
         self.client.update_server(server_id,
@@ -159,7 +162,9 @@
         will return 400(Bad Request) if we attempt to send a name which has
         4 byte utf-8 character.
         """
-        utf8_name = data_utils.rand_name(b'\xe2\x82\xa1'.decode('utf-8'))
+        utf8_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=b'\xe2\x82\xa1'.decode('utf-8'))
         self.create_test_server(name=utf8_name, wait_until='ACTIVE')
 
 
diff --git a/tempest/api/compute/servers/test_servers_microversions.py b/tempest/api/compute/servers/test_servers_microversions.py
index 566d04a..346c659 100644
--- a/tempest/api/compute/servers/test_servers_microversions.py
+++ b/tempest/api/compute/servers/test_servers_microversions.py
@@ -15,6 +15,7 @@
 
 from tempest.api.compute import base
 from tempest.common import waiters
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
@@ -30,6 +31,8 @@
 # their integration tests, you can add tests to cover those schema
 # in this file.
 
+CONF = config.CONF
+
 
 class ServerShowV254Test(base.BaseV2ComputeTest):
     """Test servers API schema for compute microversion greater than 2.53"""
@@ -41,7 +44,8 @@
         """Test rebuilding server with microversion greater than 2.53"""
         server = self.create_test_server(wait_until='ACTIVE')
         keypair_name = data_utils.rand_name(
-            self.__class__.__name__ + '-keypair')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-keypair')
         kwargs = {'name': keypair_name}
         self.keypairs_client.create_keypair(**kwargs)
         self.addCleanup(self.keypairs_client.delete_keypair,
diff --git a/tempest/api/compute/servers/test_servers_negative.py b/tempest/api/compute/servers/test_servers_negative.py
index bd383d3..22fe54d 100644
--- a/tempest/api/compute/servers/test_servers_negative.py
+++ b/tempest/api/compute/servers/test_servers_negative.py
@@ -267,7 +267,8 @@
     def test_create_with_non_existent_keypair(self):
         """Creating a server with non-existent keypair should fail"""
         # Pass a non-existent keypair while creating a server
-        key_name = data_utils.rand_name('key')
+        key_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='key')
         self.assertRaises(lib_exc.BadRequest,
                           self.create_test_server,
                           key_name=key_name)
@@ -288,7 +289,8 @@
         """Updating name of a non-existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
         new_name = data_utils.rand_name(
-            self.__class__.__name__ + '-server') + '_updated'
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-server') + '_updated'
 
         self.assertRaises(lib_exc.NotFound, self.client.update_server,
                           nonexistent_server, name=new_name)
diff --git a/tempest/api/compute/volumes/test_volume_snapshots.py b/tempest/api/compute/volumes/test_volume_snapshots.py
index 30bea60..5b06a86 100644
--- a/tempest/api/compute/volumes/test_volume_snapshots.py
+++ b/tempest/api/compute/volumes/test_volume_snapshots.py
@@ -53,7 +53,9 @@
         volume = self.create_volume()
         self.addCleanup(self.delete_volume, volume['id'])
 
-        s_name = data_utils.rand_name(self.__class__.__name__ + '-Snapshot')
+        s_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Snapshot')
         # Create snapshot
         snapshot = self.snapshots_client.create_snapshot(
             volume_id=volume['id'],
diff --git a/tempest/api/compute/volumes/test_volumes_get.py b/tempest/api/compute/volumes/test_volumes_get.py
index 554f418..2a4189e 100644
--- a/tempest/api/compute/volumes/test_volumes_get.py
+++ b/tempest/api/compute/volumes/test_volumes_get.py
@@ -47,7 +47,9 @@
     @decorators.idempotent_id('f10f25eb-9775-4d9d-9cbe-1cf54dae9d5f')
     def test_volume_create_get_delete(self):
         """Test create/get/delete volume"""
-        v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
+        v_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Volume')
         metadata = {'Type': 'work'}
         # Create volume
         volume = self.create_volume(size=CONF.volume.volume_size,
diff --git a/tempest/api/compute/volumes/test_volumes_negative.py b/tempest/api/compute/volumes/test_volumes_negative.py
index f553e32..c386497 100644
--- a/tempest/api/compute/volumes/test_volumes_negative.py
+++ b/tempest/api/compute/volumes/test_volumes_negative.py
@@ -64,7 +64,9 @@
     @decorators.idempotent_id('5125ae14-152b-40a7-b3c5-eae15e9022ef')
     def test_create_volume_with_invalid_size(self):
         """Test creating volume with invalid size should fail"""
-        v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
+        v_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Volume')
         metadata = {'Type': 'work'}
         self.assertRaises(lib_exc.BadRequest, self.client.create_volume,
                           size='#$%', display_name=v_name, metadata=metadata)
@@ -73,7 +75,9 @@
     @decorators.idempotent_id('131cb3a1-75cc-4d40-b4c3-1317f64719b0')
     def test_create_volume_without_passing_size(self):
         """Test creating volume without specifying size should fail"""
-        v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
+        v_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Volume')
         metadata = {'Type': 'work'}
         self.assertRaises(lib_exc.BadRequest, self.client.create_volume,
                           size='', display_name=v_name, metadata=metadata)
@@ -82,7 +86,9 @@
     @decorators.idempotent_id('8cce995e-0a83-479a-b94d-e1e40b8a09d1')
     def test_create_volume_with_size_zero(self):
         """Test creating volume with size=0 should fail"""
-        v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
+        v_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Volume')
         metadata = {'Type': 'work'}
         self.assertRaises(lib_exc.BadRequest, self.client.create_volume,
                           size='0', display_name=v_name, metadata=metadata)
@@ -97,9 +103,11 @@
     @decorators.idempotent_id('62972737-124b-4513-b6cf-2f019f178494')
     def test_delete_invalid_volume_id(self):
         """Test deleting volume with an invalid volume id should fail"""
-        self.assertRaises(lib_exc.NotFound,
-                          self.client.delete_volume,
-                          data_utils.rand_name('invalid'))
+        self.assertRaises(
+            lib_exc.NotFound,
+            self.client.delete_volume,
+            data_utils.rand_name(prefix=CONF.resource_name_prefix,
+                                 name='invalid'))
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('0d1417c5-4ae8-4c2c-adc5-5f0b864253e5')
diff --git a/tempest/api/identity/admin/v2/test_endpoints.py b/tempest/api/identity/admin/v2/test_endpoints.py
index 236ce7c..20d023b 100644
--- a/tempest/api/identity/admin/v2/test_endpoints.py
+++ b/tempest/api/identity/admin/v2/test_endpoints.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class EndPointsTestJSON(base.BaseIdentityV2AdminTest):
     """Test keystone v2 endpoints"""
@@ -24,9 +27,12 @@
     @classmethod
     def resource_setup(cls):
         super(EndPointsTestJSON, cls).resource_setup()
-        s_name = data_utils.rand_name('service')
-        s_type = data_utils.rand_name('type')
-        s_description = data_utils.rand_name('description')
+        s_name = data_utils.rand_name(
+            name='service', prefix=CONF.resource_name_prefix)
+        s_type = data_utils.rand_name(
+            name='type', prefix=CONF.resource_name_prefix)
+        s_description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         service_data = cls.services_client.create_service(
             name=s_name, type=s_type,
             description=s_description)['OS-KSADM:service']
@@ -36,7 +42,8 @@
         # Create endpoints so as to use for LIST and GET test cases
         cls.setup_endpoints = list()
         for _ in range(2):
-            region = data_utils.rand_name('region')
+            region = data_utils.rand_name(
+                name='region', prefix=CONF.resource_name_prefix)
             url = data_utils.rand_url()
             endpoint = cls.endpoints_client.create_endpoint(
                 service_id=cls.service_id,
@@ -65,7 +72,8 @@
     @decorators.idempotent_id('9974530a-aa28-4362-8403-f06db02b26c1')
     def test_create_list_delete_endpoint(self):
         """Test creating, listing and deleting a keystone endpoint"""
-        region = data_utils.rand_name('region')
+        region = data_utils.rand_name(
+            name='region', prefix=CONF.resource_name_prefix)
         url = data_utils.rand_url()
         endpoint = self.endpoints_client.create_endpoint(
             service_id=self.service_id,
diff --git a/tempest/api/identity/admin/v2/test_roles.py b/tempest/api/identity/admin/v2/test_roles.py
index 9736a76..6d384ab 100644
--- a/tempest/api/identity/admin/v2/test_roles.py
+++ b/tempest/api/identity/admin/v2/test_roles.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class RolesTestJSON(base.BaseIdentityV2AdminTest):
 
@@ -26,7 +29,8 @@
         super(RolesTestJSON, cls).resource_setup()
         cls.roles = list()
         for _ in range(5):
-            role_name = data_utils.rand_name(name='role')
+            role_name = data_utils.rand_name(
+                name='role', prefix=CONF.resource_name_prefix)
             role = cls.roles_client.create_role(name=role_name)['role']
             cls.addClassResourceCleanup(
                 test_utils.call_and_ignore_notfound_exc,
@@ -57,7 +61,8 @@
     @decorators.idempotent_id('c62d909d-6c21-48c0-ae40-0a0760e6db5e')
     def test_role_create_delete(self):
         """Role should be created, verified, and deleted."""
-        role_name = data_utils.rand_name(name='role-test')
+        role_name = data_utils.rand_name(
+            name='role-test', prefix=CONF.resource_name_prefix)
         body = self.roles_client.create_role(name=role_name)['role']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.roles_client.delete_role, body['id'])
diff --git a/tempest/api/identity/admin/v2/test_roles_negative.py b/tempest/api/identity/admin/v2/test_roles_negative.py
index 3c71ba9..0f0466e 100644
--- a/tempest/api/identity/admin/v2/test_roles_negative.py
+++ b/tempest/api/identity/admin/v2/test_roles_negative.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+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
 
+CONF = config.CONF
+
 
 class RolesNegativeTestJSON(base.BaseIdentityV2AdminTest):
     """Negative tests of keystone roles via v2 API"""
@@ -55,7 +58,8 @@
     @decorators.idempotent_id('585c8998-a8a4-4641-a5dd-abef7a8ced00')
     def test_create_role_by_unauthorized_user(self):
         """Test non-admin user should not be able to create role via v2 API"""
-        role_name = data_utils.rand_name(name='role')
+        role_name = data_utils.rand_name(
+            name='role', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.Forbidden,
                           self.non_admin_roles_client.create_role,
                           name=role_name)
@@ -66,7 +70,8 @@
         """Test creating role without a valid token via v2 API should fail"""
         token = self.client.auth_provider.get_token()
         self.client.delete_token(token)
-        role_name = data_utils.rand_name(name='role')
+        role_name = data_utils.rand_name(
+            name='role', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.Unauthorized,
                           self.roles_client.create_role, name=role_name)
         self.client.auth_provider.clear_auth()
@@ -75,7 +80,8 @@
     @decorators.idempotent_id('c0cde2c8-81c1-4bb0-8fe2-cf615a3547a8')
     def test_role_create_duplicate(self):
         """Test role names should be unique via v2 API"""
-        role_name = data_utils.rand_name(name='role-dup')
+        role_name = data_utils.rand_name(
+            name='role-dup', prefix=CONF.resource_name_prefix)
         body = self.roles_client.create_role(name=role_name)['role']
         role1_id = body.get('id')
         self.addCleanup(self.roles_client.delete_role, role1_id)
@@ -86,7 +92,8 @@
     @decorators.idempotent_id('15347635-b5b1-4a87-a280-deb2bd6d865e')
     def test_delete_role_by_unauthorized_user(self):
         """Test non-admin user should not be able to delete role via v2 API"""
-        role_name = data_utils.rand_name(name='role')
+        role_name = data_utils.rand_name(
+            name='role', prefix=CONF.resource_name_prefix)
         body = self.roles_client.create_role(name=role_name)['role']
         self.addCleanup(self.roles_client.delete_role, body['id'])
         role_id = body.get('id')
@@ -97,7 +104,8 @@
     @decorators.idempotent_id('44b60b20-70de-4dac-beaf-a3fc2650a16b')
     def test_delete_role_request_without_token(self):
         """Test deleting role without a valid token via v2 API should fail"""
-        role_name = data_utils.rand_name(name='role')
+        role_name = data_utils.rand_name(
+            name='role', prefix=CONF.resource_name_prefix)
         body = self.roles_client.create_role(name=role_name)['role']
         self.addCleanup(self.roles_client.delete_role, body['id'])
         role_id = body.get('id')
diff --git a/tempest/api/identity/admin/v2/test_services.py b/tempest/api/identity/admin/v2/test_services.py
index 182b24c..0e5d378 100644
--- a/tempest/api/identity/admin/v2/test_services.py
+++ b/tempest/api/identity/admin/v2/test_services.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+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
 
+CONF = config.CONF
+
 
 class ServicesTestJSON(base.BaseIdentityV2AdminTest):
     """Test identity services via v2 API"""
@@ -34,9 +37,12 @@
         """Test verifies the identity service create/get/delete via v2 API"""
         # GET Service
         # Creating a Service
-        name = data_utils.rand_name('service')
-        s_type = data_utils.rand_name('type')
-        description = data_utils.rand_name('description')
+        name = data_utils.rand_name(
+            name='service', prefix=CONF.resource_name_prefix)
+        s_type = data_utils.rand_name(
+            name='type', prefix=CONF.resource_name_prefix)
+        description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         service_data = self.services_client.create_service(
             name=name, type=s_type,
             description=description)['OS-KSADM:service']
@@ -70,8 +76,10 @@
 
         Create a service only with name and type.
         """
-        name = data_utils.rand_name('service')
-        s_type = data_utils.rand_name('type')
+        name = data_utils.rand_name(
+            name='service', prefix=CONF.resource_name_prefix)
+        s_type = data_utils.rand_name(
+            name='type', prefix=CONF.resource_name_prefix)
         service = self.services_client.create_service(
             name=name, type=s_type)['OS-KSADM:service']
         self.assertIn('id', service)
@@ -87,9 +95,12 @@
         """Test Create/List/Verify/Delete of identity service via v2 API"""
         services = []
         for _ in range(3):
-            name = data_utils.rand_name('service')
-            s_type = data_utils.rand_name('type')
-            description = data_utils.rand_name('description')
+            name = data_utils.rand_name(
+                name='service', prefix=CONF.resource_name_prefix)
+            s_type = data_utils.rand_name(
+                name='type', prefix=CONF.resource_name_prefix)
+            description = data_utils.rand_name(
+                name='description', prefix=CONF.resource_name_prefix)
 
             service = self.services_client.create_service(
                 name=name, type=s_type,
diff --git a/tempest/api/identity/admin/v2/test_tenant_negative.py b/tempest/api/identity/admin/v2/test_tenant_negative.py
index 792dad9..4c7c44c 100644
--- a/tempest/api/identity/admin/v2/test_tenant_negative.py
+++ b/tempest/api/identity/admin/v2/test_tenant_negative.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+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
 
+CONF = config.CONF
+
 
 class TenantsNegativeTestJSON(base.BaseIdentityV2AdminTest):
     """Negative tests of keystone tenants via v2 API"""
@@ -77,7 +80,8 @@
     @decorators.idempotent_id('af16f44b-a849-46cb-9f13-a751c388f739')
     def test_tenant_create_duplicate(self):
         """Test tenant names should be unique via v2 API"""
-        tenant_name = data_utils.rand_name(name='tenant')
+        tenant_name = data_utils.rand_name(
+            name='tenant', prefix=CONF.resource_name_prefix)
         self.setup_test_tenant(name=tenant_name)
         self.assertRaises(lib_exc.Conflict, self.tenants_client.create_tenant,
                           name=tenant_name)
@@ -89,7 +93,8 @@
 
         Non-admin user should not be authorized to create a tenant via v2 API.
         """
-        tenant_name = data_utils.rand_name(name='tenant')
+        tenant_name = data_utils.rand_name(
+            name='tenant', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.Forbidden,
                           self.non_admin_tenants_client.create_tenant,
                           name=tenant_name)
@@ -98,7 +103,8 @@
     @decorators.idempotent_id('a3ee9d7e-6920-4dd5-9321-d4b2b7f0a638')
     def test_create_tenant_request_without_token(self):
         """Test creating tenant without a token via v2 API is not allowed"""
-        tenant_name = data_utils.rand_name(name='tenant')
+        tenant_name = data_utils.rand_name(
+            name='tenant', prefix=CONF.resource_name_prefix)
         token = self.client.auth_provider.get_token()
         self.client.delete_token(token)
         self.assertRaises(lib_exc.Unauthorized,
diff --git a/tempest/api/identity/admin/v2/test_tenants.py b/tempest/api/identity/admin/v2/test_tenants.py
index 5f73e1c..4f674a8 100644
--- a/tempest/api/identity/admin/v2/test_tenants.py
+++ b/tempest/api/identity/admin/v2/test_tenants.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class TenantsTestJSON(base.BaseIdentityV2AdminTest):
     """Test identity tenants via v2 API"""
@@ -46,7 +49,8 @@
     @decorators.idempotent_id('d25e9f24-1310-4d29-b61b-d91299c21d6d')
     def test_tenant_create_with_description(self):
         """Test creating tenant with a description via v2 API"""
-        tenant_desc = data_utils.rand_name(name='desc')
+        tenant_desc = data_utils.rand_name(
+            name='desc', prefix=CONF.resource_name_prefix)
         tenant = self.setup_test_tenant(description=tenant_desc)
         tenant_id = tenant['id']
         desc1 = tenant['description']
@@ -83,12 +87,14 @@
     @decorators.idempotent_id('781f2266-d128-47f3-8bdb-f70970add238')
     def test_tenant_update_name(self):
         """Test updating name attribute of a tenant via v2 API"""
-        t_name1 = data_utils.rand_name(name='tenant')
+        t_name1 = data_utils.rand_name(
+            name='tenant', prefix=CONF.resource_name_prefix)
         tenant = self.setup_test_tenant(name=t_name1)
         t_id = tenant['id']
         resp1_name = tenant['name']
 
-        t_name2 = data_utils.rand_name(name='tenant2')
+        t_name2 = data_utils.rand_name(
+            name='tenant2', prefix=CONF.resource_name_prefix)
         body = self.tenants_client.update_tenant(t_id, name=t_name2)['tenant']
         resp2_name = body['name']
         self.assertNotEqual(resp1_name, resp2_name)
@@ -105,12 +111,14 @@
     @decorators.idempotent_id('859fcfe1-3a03-41ef-86f9-b19a47d1cd87')
     def test_tenant_update_desc(self):
         """Test updating description attribute of a tenant via v2 API"""
-        t_desc = data_utils.rand_name(name='desc')
+        t_desc = data_utils.rand_name(
+            name='desc', prefix=CONF.resource_name_prefix)
         tenant = self.setup_test_tenant(description=t_desc)
         t_id = tenant['id']
         resp1_desc = tenant['description']
 
-        t_desc2 = data_utils.rand_name(name='desc2')
+        t_desc2 = data_utils.rand_name(
+            name='desc2', prefix=CONF.resource_name_prefix)
         body = self.tenants_client.update_tenant(t_id, description=t_desc2)
         updated_tenant = body['tenant']
         resp2_desc = updated_tenant['description']
diff --git a/tempest/api/identity/admin/v2/test_tokens.py b/tempest/api/identity/admin/v2/test_tokens.py
index 5d89f9d..78a2aad 100644
--- a/tempest/api/identity/admin/v2/test_tokens.py
+++ b/tempest/api/identity/admin/v2/test_tokens.py
@@ -29,7 +29,8 @@
     def test_create_check_get_delete_token(self):
         """Test getting create/check/get/delete token for user via v2 API"""
         # get a token by username and password
-        user_name = data_utils.rand_name(name='user')
+        user_name = data_utils.rand_name(
+            name='user', prefix=CONF.resource_name_prefix)
         user_password = data_utils.rand_password()
         # first:create a tenant
         tenant = self.setup_test_tenant()
@@ -67,7 +68,8 @@
         """
 
         # Create a user.
-        user_name = data_utils.rand_name(name='user')
+        user_name = data_utils.rand_name(
+            name='user', prefix=CONF.resource_name_prefix)
         user_password = data_utils.rand_password()
         tenant_id = None  # No default tenant so will get unscoped token.
         user = self.create_test_user(name=user_name,
@@ -76,10 +78,12 @@
                                      email='')
 
         # Create a couple tenants.
-        tenant1_name = data_utils.rand_name(name='tenant')
+        tenant1_name = data_utils.rand_name(
+            name='tenant', prefix=CONF.resource_name_prefix)
         tenant1 = self.setup_test_tenant(name=tenant1_name)
 
-        tenant2_name = data_utils.rand_name(name='tenant')
+        tenant2_name = data_utils.rand_name(
+            name='tenant', prefix=CONF.resource_name_prefix)
         tenant2 = self.setup_test_tenant(name=tenant2_name)
 
         # Create a role
diff --git a/tempest/api/identity/admin/v2/test_users.py b/tempest/api/identity/admin/v2/test_users.py
index 57a321a..011419e 100644
--- a/tempest/api/identity/admin/v2/test_users.py
+++ b/tempest/api/identity/admin/v2/test_users.py
@@ -18,9 +18,12 @@
 from testtools import matchers
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class UsersTestJSON(base.BaseIdentityV2AdminTest):
     """Test keystone users via v2 API"""
@@ -28,7 +31,8 @@
     @classmethod
     def resource_setup(cls):
         super(UsersTestJSON, cls).resource_setup()
-        cls.alt_user = data_utils.rand_name('test_user')
+        cls.alt_user = data_utils.rand_name(
+            name='test_user', prefix=CONF.resource_name_prefix)
         cls.alt_email = cls.alt_user + '@testmail.tm'
 
     @decorators.attr(type='smoke')
@@ -43,7 +47,8 @@
     def test_create_user_with_enabled(self):
         """Test creating a user with enabled : False via v2 API"""
         tenant = self.setup_test_tenant()
-        name = data_utils.rand_name('test_user')
+        name = data_utils.rand_name(
+            name='test_user', prefix=CONF.resource_name_prefix)
         user = self.create_test_user(name=name,
                                      tenantId=tenant['id'],
                                      email=self.alt_email,
@@ -59,7 +64,8 @@
         user = self.create_test_user(tenantId=tenant['id'])
 
         # Updating user details with new values
-        u_name2 = data_utils.rand_name('user2')
+        u_name2 = data_utils.rand_name(
+            name='user2', prefix=CONF.resource_name_prefix)
         u_email2 = u_name2 + '@testmail.tm'
         update_user = self.users_client.update_user(user['id'], name=u_name2,
                                                     email=u_email2,
diff --git a/tempest/api/identity/admin/v2/test_users_negative.py b/tempest/api/identity/admin/v2/test_users_negative.py
index eda1fdd..7ccd75c 100644
--- a/tempest/api/identity/admin/v2/test_users_negative.py
+++ b/tempest/api/identity/admin/v2/test_users_negative.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+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
 
+CONF = config.CONF
+
 
 class UsersNegativeTestJSON(base.BaseIdentityV2AdminTest):
     """Negative tests of identity users via v2 API"""
@@ -25,7 +28,8 @@
     @classmethod
     def resource_setup(cls):
         super(UsersNegativeTestJSON, cls).resource_setup()
-        cls.alt_user = data_utils.rand_name('test_user')
+        cls.alt_user = data_utils.rand_name(
+            'test_user', prefix=CONF.resource_name_prefix)
         cls.alt_password = data_utils.rand_password()
         cls.alt_email = cls.alt_user + '@testmail.tm'
 
@@ -106,7 +110,8 @@
     def test_create_user_with_enabled_non_bool(self):
         """Creating a user with invalid enabled para via v2 API should fail"""
         tenant = self.setup_test_tenant()
-        name = data_utils.rand_name('test_user')
+        name = data_utils.rand_name(
+            'test_user', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.BadRequest, self.users_client.create_user,
                           name=name, password=self.alt_password,
                           tenantId=tenant['id'],
@@ -116,7 +121,8 @@
     @decorators.idempotent_id('3d07e294-27a0-4144-b780-a2a1bf6fee19')
     def test_update_user_for_non_existent_user(self):
         """Updating a non-existent user via v2 API should fail"""
-        user_name = data_utils.rand_name('user')
+        user_name = data_utils.rand_name(
+            'user', prefix=CONF.resource_name_prefix)
         non_existent_id = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound, self.users_client.update_user,
                           non_existent_id, name=user_name)
diff --git a/tempest/api/identity/admin/v3/test_credentials.py b/tempest/api/identity/admin/v3/test_credentials.py
index 441f10f..1213cfc 100644
--- a/tempest/api/identity/admin/v3/test_credentials.py
+++ b/tempest/api/identity/admin/v3/test_credentials.py
@@ -15,9 +15,12 @@
 from oslo_serialization import jsonutils as json
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class CredentialsTestJSON(base.BaseIdentityV3AdminTest):
     """Test keystone credentials"""
@@ -35,8 +38,11 @@
                           ['access', 'secret']]
         for _ in range(2):
             project = cls.projects_client.create_project(
-                data_utils.rand_name('project'),
-                description=data_utils.rand_name('project-desc'))['project']
+                data_utils.rand_name(
+                    name='project', prefix=CONF.resource_name_prefix),
+                description=data_utils.rand_name(
+                    name='project-desc',
+                    prefix=CONF.resource_name_prefix))['project']
             cls.addClassResourceCleanup(
                 cls.projects_client.delete_project, project['id'])
             cls.projects.append(project['id'])
@@ -50,8 +56,10 @@
     @decorators.idempotent_id('7cd59bf9-bda4-4c72-9467-d21cab278355')
     def test_credentials_create_get_update_delete(self):
         """Test creating, getting, updating, deleting of credentials"""
+        prefix = CONF.resource_name_prefix
         blob = '{"access": "%s", "secret": "%s"}' % (
-            data_utils.rand_name('Access'), data_utils.rand_name('Secret'))
+            data_utils.rand_name(name='Access', prefix=prefix),
+            data_utils.rand_name(name='Secret', prefix=prefix))
         cred = self.creds_client.create_credential(
             user_id=self.user_body['id'], project_id=self.projects[0],
             blob=blob, type='ec2')['credential']
@@ -61,8 +69,8 @@
         for value2 in self.creds_list[1]:
             self.assertIn(value2, cred['blob'])
 
-        new_keys = [data_utils.rand_name('NewAccess'),
-                    data_utils.rand_name('NewSecret')]
+        new_keys = [data_utils.rand_name(name='NewAccess', prefix=prefix),
+                    data_utils.rand_name(name='NewSecret', prefix=prefix)]
         blob = '{"access": "%s", "secret": "%s"}' % (new_keys[0], new_keys[1])
         update_body = self.creds_client.update_credential(
             cred['id'], blob=blob, project_id=self.projects[1],
@@ -88,10 +96,12 @@
         """Test listing credentials"""
         created_cred_ids = list()
         fetched_cred_ids = list()
+        prefix = CONF.resource_name_prefix
 
         for _ in range(2):
             blob = '{"access": "%s", "secret": "%s"}' % (
-                data_utils.rand_name('Access'), data_utils.rand_name('Secret'))
+                data_utils.rand_name(name='Access', prefix=prefix),
+                data_utils.rand_name(name='Secret', prefix=prefix))
             cred = self.creds_client.create_credential(
                 user_id=self.user_body['id'], project_id=self.projects[0],
                 blob=blob, type='ec2')['credential']
diff --git a/tempest/api/identity/admin/v3/test_default_project_id.py b/tempest/api/identity/admin/v3/test_default_project_id.py
index 7c3a6cc..64550d1 100644
--- a/tempest/api/identity/admin/v3/test_default_project_id.py
+++ b/tempest/api/identity/admin/v3/test_default_project_id.py
@@ -42,7 +42,8 @@
     def test_default_project_id(self):
         """Creating a token without project will default to user's project"""
         # create a domain
-        dom_name = data_utils.rand_name('dom')
+        dom_name = data_utils.rand_name(
+            name='dom', prefix=CONF.resource_name_prefix)
         domain_body = self.domains_client.create_domain(
             name=dom_name)['domain']
         dom_id = domain_body['id']
@@ -57,7 +58,8 @@
 
         # create a user in the domain, with the previous project as his
         # default project
-        user_name = data_utils.rand_name('user')
+        user_name = data_utils.rand_name(
+            name='user', prefix=CONF.resource_name_prefix)
         user_pass = data_utils.rand_password()
         user_body = self.users_client.create_user(
             name=user_name,
diff --git a/tempest/api/identity/admin/v3/test_domain_configuration.py b/tempest/api/identity/admin/v3/test_domain_configuration.py
index a246a36..e195dd9 100644
--- a/tempest/api/identity/admin/v3/test_domain_configuration.py
+++ b/tempest/api/identity/admin/v3/test_domain_configuration.py
@@ -14,11 +14,14 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 
+CONF = config.CONF
+
 
 class DomainConfigurationTestJSON(base.BaseIdentityV3AdminTest):
     """Test domain configuration"""
@@ -150,7 +153,8 @@
         domain, _ = self._create_domain_and_config(self.custom_config)
 
         # Check that updating configuration groups work.
-        new_driver = data_utils.rand_name('driver')
+        new_driver = data_utils.rand_name(
+            name='driver', prefix=CONF.resource_name_prefix)
         new_limit = data_utils.rand_int_id(0, 100)
         new_group_config = {'identity': {'driver': new_driver,
                                          'list_limit': new_limit}}
@@ -162,7 +166,8 @@
         self.assertEqual(new_limit, updated_config['identity']['list_limit'])
 
         # Check that updating individual configuration group options work.
-        new_driver = data_utils.rand_name('driver')
+        new_driver = data_utils.rand_name(
+            name='driver', prefix=CONF.resource_name_prefix)
 
         updated_config = self.client.update_domain_group_option_config(
             domain['id'], 'identity', 'driver', driver=new_driver)['config']
diff --git a/tempest/api/identity/admin/v3/test_domains.py b/tempest/api/identity/admin/v3/test_domains.py
index 419c6c7..80c4d1c 100644
--- a/tempest/api/identity/admin/v3/test_domains.py
+++ b/tempest/api/identity/admin/v3/test_domains.py
@@ -76,9 +76,10 @@
     @decorators.idempotent_id('f2f5b44a-82e8-4dad-8084-0661ea3b18cf')
     def test_create_update_delete_domain(self):
         """Test creating, updating and deleting domain"""
+        prefix = CONF.resource_name_prefix
         # Create domain
-        d_name = data_utils.rand_name('domain')
-        d_desc = data_utils.rand_name('domain-desc')
+        d_name = data_utils.rand_name(name='domain', prefix=prefix)
+        d_desc = data_utils.rand_name(name='domain-desc', prefix=prefix)
         domain = self.domains_client.create_domain(
             name=d_name, description=d_desc)['domain']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -92,8 +93,8 @@
         self.assertEqual(d_desc, domain['description'])
         self.assertEqual(True, domain['enabled'])
         # Update domain
-        new_desc = data_utils.rand_name('new-desc')
-        new_name = data_utils.rand_name('new-name')
+        new_desc = data_utils.rand_name(name='new-desc', prefix=prefix)
+        new_name = data_utils.rand_name(name='new-name', prefix=prefix)
         updated_domain = self.domains_client.update_domain(
             domain['id'], name=new_name, description=new_desc,
             enabled=False)['domain']
@@ -139,8 +140,10 @@
     def test_create_domain_with_disabled_status(self):
         """Test creating domain with disabled status"""
         # Create domain with enabled status as false
-        d_name = data_utils.rand_name('domain')
-        d_desc = data_utils.rand_name('domain-desc')
+        d_name = data_utils.rand_name(
+            name='domain', prefix=CONF.resource_name_prefix)
+        d_desc = data_utils.rand_name(
+            name='domain-desc', prefix=CONF.resource_name_prefix)
         domain = self.domains_client.create_domain(
             name=d_name, description=d_desc, enabled=False)['domain']
         self.addCleanup(self.domains_client.delete_domain, domain['id'])
@@ -152,7 +155,8 @@
     def test_create_domain_without_description(self):
         """Test creating domain without description"""
         # Create domain only with name
-        d_name = data_utils.rand_name('domain')
+        d_name = data_utils.rand_name(
+            name='domain', prefix=CONF.resource_name_prefix)
         domain = self.domains_client.create_domain(name=d_name)['domain']
         self.addCleanup(self.delete_domain, domain['id'])
         expected_data = {'name': d_name, 'enabled': True}
diff --git a/tempest/api/identity/admin/v3/test_domains_negative.py b/tempest/api/identity/admin/v3/test_domains_negative.py
index c90206d..1087b63 100644
--- a/tempest/api/identity/admin/v3/test_domains_negative.py
+++ b/tempest/api/identity/admin/v3/test_domains_negative.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+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
 
+CONF = config.CONF
+
 
 class DomainsNegativeTestJSON(base.BaseIdentityV3AdminTest):
     """Negative tests of identity domains"""
@@ -73,7 +76,8 @@
     @decorators.idempotent_id('e6f9e4a2-4f36-4be8-bdbc-4e199ae29427')
     def test_domain_create_duplicate(self):
         """Test creating domain with duplicate name should fail"""
-        domain_name = data_utils.rand_name('domain-dup')
+        domain_name = data_utils.rand_name(
+            name='domain-dup', prefix=CONF.resource_name_prefix)
         domain = self.domains_client.create_domain(name=domain_name)['domain']
         domain_id = domain['id']
         self.addCleanup(self.delete_domain, domain_id)
diff --git a/tempest/api/identity/admin/v3/test_endpoint_groups.py b/tempest/api/identity/admin/v3/test_endpoint_groups.py
index 2fa92e3..591a83b 100644
--- a/tempest/api/identity/admin/v3/test_endpoint_groups.py
+++ b/tempest/api/identity/admin/v3/test_endpoint_groups.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class EndPointGroupsTest(base.BaseIdentityV3AdminTest):
     """Test endpoint groups"""
@@ -42,8 +45,10 @@
         cls.addClassResourceCleanup(
             cls.services_client.delete_service, service_id)
 
-        name = data_utils.rand_name('service_group')
-        description = data_utils.rand_name('description')
+        name = data_utils.rand_name(
+            name='service_group', prefix=CONF.resource_name_prefix)
+        description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         filters = {'service_id': service_id}
 
         endpoint_group = cls.client.create_endpoint_group(
@@ -57,9 +62,10 @@
 
     @classmethod
     def _create_service(cls):
-        s_name = data_utils.rand_name('service')
-        s_type = data_utils.rand_name('type')
-        s_description = data_utils.rand_name('description')
+        prefix = CONF.resource_name_prefix
+        s_name = data_utils.rand_name(name='service', prefix=prefix)
+        s_type = data_utils.rand_name(name='type', prefix=prefix)
+        s_description = data_utils.rand_name(name='description', prefix=prefix)
         service_data = (
             cls.services_client.create_service(name=s_name,
                                                type=s_type,
@@ -73,8 +79,10 @@
         """Test create/list/show/check/delete of endpoint group"""
         service_id = self._create_service()
         self.addCleanup(self.services_client.delete_service, service_id)
-        name = data_utils.rand_name('service_group')
-        description = data_utils.rand_name('description')
+        name = data_utils.rand_name(
+            name='service_group', prefix=CONF.resource_name_prefix)
+        description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         filters = {'service_id': service_id}
 
         endpoint_group = self.client.create_endpoint_group(
@@ -135,8 +143,10 @@
         # with new values
         service1_id = self._create_service()
         self.addCleanup(self.services_client.delete_service, service1_id)
-        name = data_utils.rand_name('service_group')
-        description = data_utils.rand_name('description')
+        name = data_utils.rand_name(
+            name='service_group', prefix=CONF.resource_name_prefix)
+        description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         filters = {'service_id': service1_id}
 
         endpoint_group = self.client.create_endpoint_group(
@@ -149,8 +159,10 @@
         # Creating new attr values to update endpoint group
         service2_id = self._create_service()
         self.addCleanup(self.services_client.delete_service, service2_id)
-        name2 = data_utils.rand_name('service_group2')
-        description2 = data_utils.rand_name('description2')
+        name2 = data_utils.rand_name(
+            name='service_group2', prefix=CONF.resource_name_prefix)
+        description2 = data_utils.rand_name(
+            name='description2', prefix=CONF.resource_name_prefix)
         filters = {'service_id': service2_id}
 
         # Updating endpoint group with new attr values
diff --git a/tempest/api/identity/admin/v3/test_endpoints.py b/tempest/api/identity/admin/v3/test_endpoints.py
index 0199d73..f9f3e72 100644
--- a/tempest/api/identity/admin/v3/test_endpoints.py
+++ b/tempest/api/identity/admin/v3/test_endpoints.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class EndPointsTestJSON(base.BaseIdentityV3AdminTest):
     """Test keystone endpoints"""
@@ -46,7 +49,8 @@
             cls.addClassResourceCleanup(
                 cls.services_client.delete_service, service['id'])
 
-            region_name = data_utils.rand_name('region')
+            region_name = data_utils.rand_name(
+                'region', prefix=CONF.resource_name_prefix)
             url = data_utils.rand_url()
             endpoint = cls.client.create_endpoint(
                 service_id=cls.service_ids[i], interface=interfaces[i],
@@ -60,12 +64,14 @@
 
     @classmethod
     def _create_service(cls, s_name=None, s_type=None, s_description=None):
+        prefix = CONF.resource_name_prefix
         if s_name is None:
-            s_name = data_utils.rand_name('service')
+            s_name = data_utils.rand_name(name='service', prefix=prefix)
         if s_type is None:
-            s_type = data_utils.rand_name('type')
+            s_type = data_utils.rand_name(name='type', prefix=prefix)
         if s_description is None:
-            s_description = data_utils.rand_name('description')
+            s_description = data_utils.rand_name(
+                name='description', prefix=prefix)
         service_data = (
             cls.services_client.create_service(name=s_name, type=s_type,
                                                description=s_description))
@@ -115,7 +121,8 @@
     @decorators.idempotent_id('0e2446d2-c1fd-461b-a729-b9e73e3e3b37')
     def test_create_list_show_delete_endpoint(self):
         """Test creating, listing, showing and deleting keystone endpoint"""
-        region_name = data_utils.rand_name('region')
+        region_name = data_utils.rand_name(
+            name='region', prefix=CONF.resource_name_prefix)
         url = data_utils.rand_url()
         interface = 'public'
         endpoint = self.client.create_endpoint(service_id=self.service_ids[0],
@@ -162,16 +169,17 @@
         # endpoint_for_update is deleted, otherwise we will get a 404 error
         # when deleting endpoint_for_update if endpoint's service is deleted.
 
+        prefix = CONF.resource_name_prefix
         # Creating service for updating endpoint with new service ID
-        s_name = data_utils.rand_name('service')
-        s_type = data_utils.rand_name('type')
-        s_description = data_utils.rand_name('description')
+        s_name = data_utils.rand_name(name='service', prefix=prefix)
+        s_type = data_utils.rand_name(name='type', prefix=prefix)
+        s_description = data_utils.rand_name(name='description', prefix=prefix)
         service2 = self._create_service(s_name=s_name, s_type=s_type,
                                         s_description=s_description)
         self.addCleanup(self.services_client.delete_service, service2['id'])
 
         # Creating an endpoint so as to check update endpoint with new values
-        region1_name = data_utils.rand_name('region')
+        region1_name = data_utils.rand_name(name='region', prefix=prefix)
         url1 = data_utils.rand_url()
         interface1 = 'public'
         endpoint_for_update = (
@@ -183,7 +191,7 @@
         self.addCleanup(self.regions_client.delete_region, region1['id'])
 
         # Updating endpoint with new values
-        region2_name = data_utils.rand_name('region')
+        region2_name = data_utils.rand_name(name='region', prefix=prefix)
         url2 = data_utils.rand_url()
         interface2 = 'internal'
         endpoint = self.client.update_endpoint(endpoint_for_update['id'],
diff --git a/tempest/api/identity/admin/v3/test_endpoints_negative.py b/tempest/api/identity/admin/v3/test_endpoints_negative.py
index 9689d87..2d47eb8 100644
--- a/tempest/api/identity/admin/v3/test_endpoints_negative.py
+++ b/tempest/api/identity/admin/v3/test_endpoints_negative.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+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
 
+CONF = config.CONF
+
 
 class EndpointsNegativeTestJSON(base.BaseIdentityV3AdminTest):
     """Negative tests of endpoint"""
@@ -34,10 +37,11 @@
 
     @classmethod
     def resource_setup(cls):
+        prefix = CONF.resource_name_prefix
         super(EndpointsNegativeTestJSON, cls).resource_setup()
-        s_name = data_utils.rand_name('service')
-        s_type = data_utils.rand_name('type')
-        s_description = data_utils.rand_name('description')
+        s_name = data_utils.rand_name(name='service', prefix=prefix)
+        s_type = data_utils.rand_name(name='type', prefix=prefix)
+        s_description = data_utils.rand_name(name='description', prefix=prefix)
         service_data = (
             cls.services_client.create_service(name=s_name, type=s_type,
                                                description=s_description)
@@ -56,7 +60,8 @@
         """
         interface = 'public'
         url = data_utils.rand_url()
-        region = data_utils.rand_name('region')
+        region = data_utils.rand_name(
+            name='region', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.BadRequest, self.client.create_endpoint,
                           service_id=self.service_id, interface=interface,
                           url=url, region=region, enabled='False')
@@ -70,7 +75,8 @@
         """
         interface = 'public'
         url = data_utils.rand_url()
-        region = data_utils.rand_name('region')
+        region = data_utils.rand_name(
+            name='region', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.BadRequest, self.client.create_endpoint,
                           service_id=self.service_id, interface=interface,
                           url=url, region=region, enabled='True')
@@ -78,7 +84,8 @@
     def _assert_update_raises_bad_request(self, enabled):
 
         # Create an endpoint
-        region1_name = data_utils.rand_name('region')
+        region1_name = data_utils.rand_name(
+            name='region', prefix=CONF.resource_name_prefix)
         url1 = data_utils.rand_url()
         interface1 = 'public'
         endpoint_for_update = (
diff --git a/tempest/api/identity/admin/v3/test_groups.py b/tempest/api/identity/admin/v3/test_groups.py
index b2e3775..b5b3c5d 100644
--- a/tempest/api/identity/admin/v3/test_groups.py
+++ b/tempest/api/identity/admin/v3/test_groups.py
@@ -38,9 +38,10 @@
     @decorators.idempotent_id('2e80343b-6c81-4ac3-88c7-452f3e9d5129')
     def test_group_create_update_get(self):
         """Test creating, updating and getting keystone group"""
+        prefix = CONF.resource_name_prefix
         # Verify group creation works.
-        name = data_utils.rand_name('Group')
-        description = data_utils.rand_name('Description')
+        name = data_utils.rand_name(name='Group', prefix=prefix)
+        description = data_utils.rand_name(name='Description', prefix=prefix)
         group = self.setup_test_group(name=name, domain_id=self.domain['id'],
                                       description=description)
         self.assertEqual(group['name'], name)
@@ -48,8 +49,10 @@
         self.assertEqual(self.domain['id'], group['domain_id'])
 
         # Verify updating name and description works.
-        first_name_update = data_utils.rand_name('UpdateGroup')
-        first_desc_update = data_utils.rand_name('UpdateDescription')
+        first_name_update = data_utils.rand_name(
+            name='UpdateGroup', prefix=prefix)
+        first_desc_update = data_utils.rand_name(
+            name='UpdateDescription', prefix=prefix)
         updated_group = self.groups_client.update_group(
             group['id'], name=first_name_update,
             description=first_desc_update)['group']
@@ -65,7 +68,7 @@
         # Verify that updating a single field for a group (name) leaves the
         # other fields (description, domain_id) unchanged.
         second_name_update = data_utils.rand_name(
-            self.__class__.__name__ + 'UpdateGroup')
+            self.__class__.__name__ + 'UpdateGroup', prefix=prefix)
         updated_group = self.groups_client.update_group(
             group['id'], name=second_name_update)['group']
         self.assertEqual(second_name_update, updated_group['name'])
diff --git a/tempest/api/identity/admin/v3/test_inherits.py b/tempest/api/identity/admin/v3/test_inherits.py
index cababc6..48bde2b 100644
--- a/tempest/api/identity/admin/v3/test_inherits.py
+++ b/tempest/api/identity/admin/v3/test_inherits.py
@@ -37,20 +37,21 @@
     @classmethod
     def resource_setup(cls):
         super(InheritsV3TestJSON, cls).resource_setup()
-        u_name = data_utils.rand_name('user-')
+        prefix = CONF.resource_name_prefix
+        u_name = data_utils.rand_name(name='user-', prefix=prefix)
         u_desc = '%s description' % u_name
         u_email = '%s@testmail.tm' % u_name
         u_password = data_utils.rand_password()
         cls.domain = cls.create_domain()
         cls.project = cls.projects_client.create_project(
-            data_utils.rand_name('project-'),
-            description=data_utils.rand_name('project-desc-'),
+            data_utils.rand_name(name='project-', prefix=prefix),
+            description=data_utils.rand_name('project-desc-', prefix=prefix),
             domain_id=cls.domain['id'])['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
                                     cls.project['id'])
         cls.group = cls.groups_client.create_group(
-            name=data_utils.rand_name('group-'), project_id=cls.project['id'],
-            domain_id=cls.domain['id'])['group']
+            name=data_utils.rand_name(name='group-', prefix=prefix),
+            project_id=cls.project['id'], domain_id=cls.domain['id'])['group']
         cls.addClassResourceCleanup(cls.groups_client.delete_group,
                                     cls.group['id'])
         if not CONF.identity_feature_enabled.immutable_user_source:
diff --git a/tempest/api/identity/admin/v3/test_list_projects.py b/tempest/api/identity/admin/v3/test_list_projects.py
index b33d8bd..2135fcc 100644
--- a/tempest/api/identity/admin/v3/test_list_projects.py
+++ b/tempest/api/identity/admin/v3/test_list_projects.py
@@ -45,20 +45,21 @@
     @classmethod
     def resource_setup(cls):
         super(ListProjectsTestJSON, cls).resource_setup()
+        prefix = CONF.resource_name_prefix
         domain_id = cls.os_admin.credentials.domain_id
         # Create project with domain
-        p1_name = data_utils.rand_name(cls.__name__)
+        p1_name = data_utils.rand_name(cls.__name__, prefix=prefix)
         cls.p1 = cls.projects_client.create_project(
             p1_name, enabled=False, domain_id=domain_id)['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
                                     cls.p1['id'])
         # Create default project
-        p2_name = data_utils.rand_name(cls.__name__)
+        p2_name = data_utils.rand_name(cls.__name__, prefix=prefix)
         cls.p2 = cls.projects_client.create_project(p2_name)['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
                                     cls.p2['id'])
         # Create a new project (p3) using p2 as parent project
-        p3_name = data_utils.rand_name(cls.__name__)
+        p3_name = data_utils.rand_name(cls.__name__, prefix=prefix)
         cls.p3 = cls.projects_client.create_project(
             p3_name, parent_id=cls.p2['id'])['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
@@ -99,7 +100,8 @@
         cls.p1 = cls.projects_client.show_project(
             cls.os_primary.credentials.project_id)['project']
         # Create a test project
-        p2_name = data_utils.rand_name(cls.__name__)
+        p2_name = data_utils.rand_name(
+            cls.__name__, prefix=CONF.resource_name_prefix)
         p2_domain_id = CONF.identity.default_domain_id
         cls.p2 = cls.projects_client.create_project(
             p2_name, domain_id=p2_domain_id)['project']
diff --git a/tempest/api/identity/admin/v3/test_list_users.py b/tempest/api/identity/admin/v3/test_list_users.py
index 7bd0bcf..3884989 100644
--- a/tempest/api/identity/admin/v3/test_list_users.py
+++ b/tempest/api/identity/admin/v3/test_list_users.py
@@ -45,14 +45,15 @@
     @classmethod
     def resource_setup(cls):
         super(UsersV3TestJSON, cls).resource_setup()
-        alt_user = data_utils.rand_name('test_user')
+        prefix = CONF.resource_name_prefix
+        alt_user = data_utils.rand_name(name='test_user', prefix=prefix)
         alt_password = data_utils.rand_password()
         cls.alt_email = alt_user + '@testmail.tm'
         # Create a domain
         cls.domain = cls.create_domain()
         # Create user with Domain
         cls.users = list()
-        u1_name = data_utils.rand_name('test_user')
+        u1_name = data_utils.rand_name(name='test_user', prefix=prefix)
         cls.domain_enabled_user = cls.users_client.create_user(
             name=u1_name, password=alt_password,
             email=cls.alt_email, domain_id=cls.domain['id'])['user']
@@ -60,7 +61,7 @@
                                     cls.domain_enabled_user['id'])
         cls.users.append(cls.domain_enabled_user)
         # Create default not enabled user
-        u2_name = data_utils.rand_name('test_user')
+        u2_name = data_utils.rand_name(name='test_user', prefix=prefix)
         cls.non_domain_enabled_user = cls.users_client.create_user(
             name=u2_name, password=alt_password,
             email=cls.alt_email, enabled=False)['user']
diff --git a/tempest/api/identity/admin/v3/test_oauth_consumers.py b/tempest/api/identity/admin/v3/test_oauth_consumers.py
index 7a85f84..0c474c0 100644
--- a/tempest/api/identity/admin/v3/test_oauth_consumers.py
+++ b/tempest/api/identity/admin/v3/test_oauth_consumers.py
@@ -14,11 +14,14 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions
 
+CONF = config.CONF
+
 
 class OAUTHConsumersV3Test(base.BaseIdentityV3AdminTest):
     # NOTE: force_tenant_isolation is true in the base class by default but
@@ -28,7 +31,8 @@
 
     def _create_consumer(self):
         """Creates a consumer with a random description."""
-        description = data_utils.rand_name('test_create_consumer')
+        description = data_utils.rand_name(
+            name='test_create_consumer', prefix=CONF.resource_name_prefix)
         consumer = self.oauth_consumers_client.create_consumer(
             description)['consumer']
         # cleans up created consumers after tests
@@ -70,7 +74,8 @@
         # create a new consumer to update
         consumer = self._create_consumer()
         # create new description
-        new_description = data_utils.rand_name('test_update_consumer')
+        new_description = data_utils.rand_name(
+            name='test_update_consumer', prefix=CONF.resource_name_prefix)
         # update consumer
         self.oauth_consumers_client.update_consumer(consumer['id'],
                                                     new_description)
diff --git a/tempest/api/identity/admin/v3/test_policies.py b/tempest/api/identity/admin/v3/test_policies.py
index fb81d0a..2d3775a 100644
--- a/tempest/api/identity/admin/v3/test_policies.py
+++ b/tempest/api/identity/admin/v3/test_policies.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class PoliciesTestJSON(base.BaseIdentityV3AdminTest):
     """Test keystone policies"""
@@ -30,8 +33,10 @@
         policy_ids = list()
         fetched_ids = list()
         for _ in range(3):
-            blob = data_utils.rand_name('BlobName')
-            policy_type = data_utils.rand_name('PolicyType')
+            blob = data_utils.rand_name(
+                name='BlobName', prefix=CONF.resource_name_prefix)
+            policy_type = data_utils.rand_name(
+                name='PolicyType', prefix=CONF.resource_name_prefix)
             policy = self.policies_client.create_policy(
                 blob=blob, type=policy_type)['policy']
             # Delete the Policy at the end of this method
@@ -48,8 +53,9 @@
     @decorators.idempotent_id('e544703a-2f03-4cf2-9b0f-350782fdb0d3')
     def test_create_update_delete_policy(self):
         """Test to update keystone policy"""
-        blob = data_utils.rand_name('BlobName')
-        policy_type = data_utils.rand_name('PolicyType')
+        prefix = CONF.resource_name_prefix
+        blob = data_utils.rand_name(name='BlobName', prefix=prefix)
+        policy_type = data_utils.rand_name(name='PolicyType', prefix=prefix)
         policy = self.policies_client.create_policy(blob=blob,
                                                     type=policy_type)['policy']
         self.addCleanup(self._delete_policy, policy['id'])
@@ -59,7 +65,7 @@
         self.assertEqual(blob, policy['blob'])
         self.assertEqual(policy_type, policy['type'])
         # Update policy
-        update_type = data_utils.rand_name('UpdatedPolicyType')
+        update_type = data_utils.rand_name('UpdatedPolicyType', prefix=prefix)
         data = self.policies_client.update_policy(
             policy['id'], type=update_type)['policy']
         self.assertIn('type', data)
diff --git a/tempest/api/identity/admin/v3/test_project_tags.py b/tempest/api/identity/admin/v3/test_project_tags.py
index eed60af..2004cbc 100644
--- a/tempest/api/identity/admin/v3/test_project_tags.py
+++ b/tempest/api/identity/admin/v3/test_project_tags.py
@@ -13,8 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import testtools
-
 from tempest.api.identity import base
 from tempest import config
 from tempest.lib.common.utils import data_utils
@@ -33,14 +31,12 @@
     force_tenant_isolation = False
 
     @decorators.idempotent_id('7c123aac-999d-416a-a0fb-84b915ab10de')
-    @testtools.skipUnless(CONF.identity_feature_enabled.project_tags,
-                          'Project tags not available.')
     def test_list_update_delete_project_tags(self):
         """Test listing, updating and deleting of project tags"""
         project = self.setup_test_project()
 
         # Create a tag for testing.
-        tag = data_utils.rand_name('tag')
+        tag = data_utils.rand_name('tag', prefix=CONF.resource_name_prefix)
         # NOTE(felipemonteiro): The response body for create is empty.
         self.project_tags_client.update_project_tag(project['id'], tag)
 
@@ -49,7 +45,8 @@
             project['id'], tag)
 
         # Verify that updating the project tags works.
-        tags_to_update = [data_utils.rand_name('tag') for _ in range(3)]
+        tags_to_update = [data_utils.rand_name(
+            'tag', prefix=CONF.resource_name_prefix) for _ in range(3)]
         updated_tags = self.project_tags_client.update_all_project_tags(
             project['id'], tags_to_update)['tags']
         self.assertEqual(sorted(tags_to_update), sorted(updated_tags))
diff --git a/tempest/api/identity/admin/v3/test_projects.py b/tempest/api/identity/admin/v3/test_projects.py
index be1216a..3b0052c 100644
--- a/tempest/api/identity/admin/v3/test_projects.py
+++ b/tempest/api/identity/admin/v3/test_projects.py
@@ -33,7 +33,8 @@
     @decorators.idempotent_id('0ecf465c-0dc4-4532-ab53-91ffeb74d12d')
     def test_project_create_with_description(self):
         """Test creating project with a description"""
-        project_desc = data_utils.rand_name('desc')
+        project_desc = data_utils.rand_name(
+            name='desc', prefix=CONF.resource_name_prefix)
         project = self.setup_test_project(description=project_desc)
         project_id = project['id']
         desc1 = project['description']
@@ -48,7 +49,8 @@
     def test_project_create_with_domain(self):
         """Test creating project with a domain"""
         domain = self.setup_test_domain()
-        project_name = data_utils.rand_name('project')
+        project_name = data_utils.rand_name(
+            name='project', prefix=CONF.resource_name_prefix)
         project = self.setup_test_project(
             name=project_name, domain_id=domain['id'])
         project_id = project['id']
@@ -64,7 +66,8 @@
         domain = self.setup_test_domain()
         domain_id = domain['id']
 
-        root_project_name = data_utils.rand_name('root_project')
+        root_project_name = data_utils.rand_name(
+            name='root_project', prefix=CONF.resource_name_prefix)
         root_project = self.setup_test_project(
             name=root_project_name, domain_id=domain_id)
 
@@ -76,7 +79,8 @@
         self.assertEqual(domain_id, parent_id)
 
         # Create a project using root_project_id as parent_id
-        project_name = data_utils.rand_name('project')
+        project_name = data_utils.rand_name(
+            name='project', prefix=CONF.resource_name_prefix)
         project = self.setup_test_project(
             name=project_name, domain_id=domain_id, parent_id=root_project_id)
         parent_id = project['parent_id']
@@ -127,12 +131,14 @@
     @decorators.idempotent_id('f608f368-048c-496b-ad63-d286c26dab6b')
     def test_project_update_name(self):
         """Test updating name attribute of a project"""
-        p_name1 = data_utils.rand_name('project')
+        p_name1 = data_utils.rand_name(
+            name='project', prefix=CONF.resource_name_prefix)
         project = self.setup_test_project(name=p_name1)
 
         resp1_name = project['name']
 
-        p_name2 = data_utils.rand_name('project2')
+        p_name2 = data_utils.rand_name(
+            name='project2', prefix=CONF.resource_name_prefix)
         body = self.projects_client.update_project(project['id'],
                                                    name=p_name2)['project']
         resp2_name = body['name']
@@ -148,11 +154,13 @@
     @decorators.idempotent_id('f138b715-255e-4a7d-871d-351e1ef2e153')
     def test_project_update_desc(self):
         """Test updating description attribute of a project"""
-        p_desc = data_utils.rand_name('desc')
+        p_desc = data_utils.rand_name(
+            name='desc', prefix=CONF.resource_name_prefix)
         project = self.setup_test_project(description=p_desc)
         resp1_desc = project['description']
 
-        p_desc2 = data_utils.rand_name('desc2')
+        p_desc2 = data_utils.rand_name(
+            name='desc2', prefix=CONF.resource_name_prefix)
         body = self.projects_client.update_project(
             project['id'], description=p_desc2)['project']
         resp2_desc = body['description']
@@ -197,7 +205,8 @@
         project = self.setup_test_project()
 
         # Create a User
-        u_name = data_utils.rand_name('user')
+        u_name = data_utils.rand_name(
+            name='user', prefix=CONF.resource_name_prefix)
         u_desc = u_name + 'description'
         u_email = u_name + '@testmail.tm'
         u_password = data_utils.rand_password()
diff --git a/tempest/api/identity/admin/v3/test_projects_negative.py b/tempest/api/identity/admin/v3/test_projects_negative.py
index 79e3d29..68dd5cb 100644
--- a/tempest/api/identity/admin/v3/test_projects_negative.py
+++ b/tempest/api/identity/admin/v3/test_projects_negative.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+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
 
+CONF = config.CONF
+
 
 class ProjectsNegativeTestJSON(base.BaseIdentityV3AdminTest):
     """Negative tests of projects"""
@@ -54,7 +57,8 @@
     @decorators.idempotent_id('874c3e84-d174-4348-a16b-8c01f599561b')
     def test_project_create_duplicate(self):
         """Project names should be unique"""
-        project_name = data_utils.rand_name('project-dup')
+        project_name = data_utils.rand_name(
+            name='project-dup', prefix=CONF.resource_name_prefix)
         self.setup_test_project(name=project_name)
 
         self.assertRaises(lib_exc.Conflict,
@@ -64,7 +68,8 @@
     @decorators.idempotent_id('8fba9de2-3e1f-4e77-812a-60cb68f8df13')
     def test_create_project_by_unauthorized_user(self):
         """Non-admin user should not be authorized to create a project"""
-        project_name = data_utils.rand_name('project')
+        project_name = data_utils.rand_name(
+            name='project', prefix=CONF.resource_name_prefix)
         self.assertRaises(
             lib_exc.Forbidden, self.non_admin_projects_client.create_project,
             project_name)
diff --git a/tempest/api/identity/admin/v3/test_regions.py b/tempest/api/identity/admin/v3/test_regions.py
index 63e456e..870a406 100644
--- a/tempest/api/identity/admin/v3/test_regions.py
+++ b/tempest/api/identity/admin/v3/test_regions.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class RegionsTestJSON(base.BaseIdentityV3AdminTest):
     """Test regions"""
@@ -37,7 +40,8 @@
         super(RegionsTestJSON, cls).resource_setup()
         cls.setup_regions = list()
         for _ in range(2):
-            r_description = data_utils.rand_name('description')
+            r_description = data_utils.rand_name(
+                name='description', prefix=CONF.resource_name_prefix)
             region = cls.client.create_region(
                 description=r_description)['region']
             cls.addClassResourceCleanup(
@@ -48,7 +52,8 @@
     def test_create_update_get_delete_region(self):
         """Test creating, updating, getting and updating region"""
         # Create region
-        r_description = data_utils.rand_name('description')
+        r_description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         region = self.client.create_region(
             description=r_description,
             parent_region_id=self.setup_regions[0]['id'])['region']
@@ -62,7 +67,8 @@
         self.assertEqual(self.setup_regions[0]['id'],
                          region['parent_region_id'])
         # Update region with new description and parent ID
-        r_alt_description = data_utils.rand_name('description')
+        r_alt_description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         region = self.client.update_region(
             region['id'],
             description=r_alt_description,
@@ -86,7 +92,8 @@
     def test_create_region_with_specific_id(self):
         """Test creating region with specific id"""
         r_region_id = data_utils.rand_uuid()
-        r_description = data_utils.rand_name('description')
+        r_description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         region = self.client.create_region(
             region_id=r_region_id, description=r_description)['region']
         self.addCleanup(self.client.delete_region, region['id'])
@@ -109,7 +116,8 @@
     def test_list_regions_filter_by_parent_region_id(self):
         """Test listing regions filtered by parent region id"""
         # Add a sub-region to one of the existing test regions
-        r_description = data_utils.rand_name('description')
+        r_description = data_utils.rand_name(
+            name='description', prefix=CONF.resource_name_prefix)
         region = self.client.create_region(
             description=r_description,
             parent_region_id=self.setup_regions[0]['id'])['region']
diff --git a/tempest/api/identity/admin/v3/test_roles.py b/tempest/api/identity/admin/v3/test_roles.py
index e5137f4..ab96027 100644
--- a/tempest/api/identity/admin/v3/test_roles.py
+++ b/tempest/api/identity/admin/v3/test_roles.py
@@ -35,31 +35,34 @@
     @classmethod
     def resource_setup(cls):
         super(RolesV3TestJSON, cls).resource_setup()
+        prefix = CONF.resource_name_prefix
         cls.roles = list()
         for _ in range(3):
-            role_name = data_utils.rand_name(name='role')
+            role_name = data_utils.rand_name(name='role', prefix=prefix)
             role = cls.roles_client.create_role(name=role_name)['role']
             cls.addClassResourceCleanup(cls.roles_client.delete_role,
                                         role['id'])
             cls.roles.append(role)
-        u_name = data_utils.rand_name('user')
+        u_name = data_utils.rand_name(name='user', prefix=prefix)
         u_desc = '%s description' % u_name
         u_email = '%s@testmail.tm' % u_name
         cls.u_password = data_utils.rand_password()
         cls.domain = cls.create_domain()
         cls.project = cls.projects_client.create_project(
-            data_utils.rand_name('project'),
-            description=data_utils.rand_name('project-desc'),
+            data_utils.rand_name(name='project', prefix=prefix),
+            description=data_utils.rand_name(
+                name='project-desc', prefix=prefix),
             domain_id=cls.domain['id'])['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
                                     cls.project['id'])
         cls.group_body = cls.groups_client.create_group(
-            name=data_utils.rand_name('Group'), project_id=cls.project['id'],
+            name=data_utils.rand_name(name='Group', prefix=prefix),
+            project_id=cls.project['id'],
             domain_id=cls.domain['id'])['group']
         cls.addClassResourceCleanup(cls.groups_client.delete_group,
                                     cls.group_body['id'])
         cls.role = cls.roles_client.create_role(
-            name=data_utils.rand_name('Role'))['role']
+            name=data_utils.rand_name(name='Role', prefix=prefix))['role']
         cls.addClassResourceCleanup(cls.roles_client.delete_role,
                                     cls.role['id'])
         if not CONF.identity_feature_enabled.immutable_user_source:
@@ -78,13 +81,15 @@
     @decorators.idempotent_id('18afc6c0-46cf-4911-824e-9989cc056c3a')
     def test_role_create_update_show_list(self):
         """Test creating, updating, showing and listing a role"""
-        r_name = data_utils.rand_name('Role')
+        r_name = data_utils.rand_name(
+            name='Role', prefix=CONF.resource_name_prefix)
         role = self.roles_client.create_role(name=r_name)['role']
         self.addCleanup(self.roles_client.delete_role, role['id'])
         self.assertIn('name', role)
         self.assertEqual(role['name'], r_name)
 
-        new_name = data_utils.rand_name('NewRole')
+        new_name = data_utils.rand_name(
+            name='NewRole', prefix=CONF.resource_name_prefix)
         updated_role = self.roles_client.update_role(role['id'],
                                                      name=new_name)['role']
         self.assertIn('name', updated_role)
@@ -371,7 +376,8 @@
     def test_domain_roles_create_delete(self):
         """Test creating, listing and deleting domain roles"""
         domain_role = self.roles_client.create_role(
-            name=data_utils.rand_name('domain_role'),
+            name=data_utils.rand_name(
+                name='domain_role', prefix=CONF.resource_name_prefix),
             domain_id=self.domain['id'])['role']
         self.addCleanup(
             test_utils.call_and_ignore_notfound_exc,
diff --git a/tempest/api/identity/admin/v3/test_services.py b/tempest/api/identity/admin/v3/test_services.py
index fb3b03e..b67e175 100644
--- a/tempest/api/identity/admin/v3/test_services.py
+++ b/tempest/api/identity/admin/v3/test_services.py
@@ -14,10 +14,13 @@
 #    under the License.
 
 from tempest.api.identity import base
+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
 
+CONF = config.CONF
+
 
 class ServicesTestJSON(base.BaseIdentityV3AdminTest):
     """Test keystone services"""
@@ -33,10 +36,11 @@
     @decorators.idempotent_id('5193aad5-bcb7-411d-85b0-b3b61b96ef06')
     def test_create_update_get_service(self):
         """Test creating, updating and getting of keystone service"""
+        prefix = CONF.resource_name_prefix
         # Creating a Service
-        name = data_utils.rand_name('service')
-        serv_type = data_utils.rand_name('type')
-        desc = data_utils.rand_name('description')
+        name = data_utils.rand_name(name='service', prefix=prefix)
+        serv_type = data_utils.rand_name(name='type', prefix=prefix)
+        desc = data_utils.rand_name(name='description', prefix=prefix)
         create_service = self.services_client.create_service(
             type=serv_type, name=name, description=desc)['service']
         self.addCleanup(self._del_service, create_service['id'])
@@ -49,7 +53,7 @@
         # Update description
         s_id = create_service['id']
         resp1_desc = create_service['description']
-        s_desc2 = data_utils.rand_name('desc2')
+        s_desc2 = data_utils.rand_name(name='desc2', prefix=prefix)
         update_service = self.services_client.update_service(
             s_id, description=s_desc2)['service']
         resp2_desc = update_service['description']
@@ -66,8 +70,10 @@
     @decorators.idempotent_id('d1dcb1a1-2b6b-4da8-bbb8-5532ef6e8269')
     def test_create_service_without_description(self):
         """Create a keystone service only with name and type"""
-        name = data_utils.rand_name('service')
-        serv_type = data_utils.rand_name('type')
+        name = data_utils.rand_name(
+            name='service', prefix=CONF.resource_name_prefix)
+        serv_type = data_utils.rand_name(
+            name='type', prefix=CONF.resource_name_prefix)
         service = self.services_client.create_service(
             type=serv_type, name=name)['service']
         self.addCleanup(self.services_client.delete_service, service['id'])
@@ -80,8 +86,12 @@
         service_ids = list()
         service_types = list()
         for _ in range(3):
-            name = data_utils.rand_name(self.__class__.__name__ + '-Service')
-            serv_type = data_utils.rand_name(self.__class__.__name__ + '-Type')
+            name = data_utils.rand_name(
+                self.__class__.__name__ + '-Service',
+                prefix=CONF.resource_name_prefix)
+            serv_type = data_utils.rand_name(
+                self.__class__.__name__ + '-Type',
+                prefix=CONF.resource_name_prefix)
             create_service = self.services_client.create_service(
                 type=serv_type, name=name)['service']
             self.addCleanup(self.services_client.delete_service,
diff --git a/tempest/api/identity/admin/v3/test_tokens.py b/tempest/api/identity/admin/v3/test_tokens.py
index e191979..d0a8748 100644
--- a/tempest/api/identity/admin/v3/test_tokens.py
+++ b/tempest/api/identity/admin/v3/test_tokens.py
@@ -42,11 +42,13 @@
                                      domain_id=CONF.identity.default_domain_id)
 
         # Create a couple projects
-        project1_name = data_utils.rand_name(name=self.__class__.__name__)
+        project1_name = data_utils.rand_name(
+            name=self.__class__.__name__, prefix=CONF.resource_name_prefix)
         project1 = self.setup_test_project(
             name=project1_name, domain_id=CONF.identity.default_domain_id)
 
-        project2_name = data_utils.rand_name(name=self.__class__.__name__)
+        project2_name = data_utils.rand_name(
+            name=self.__class__.__name__, prefix=CONF.resource_name_prefix)
         project2 = self.setup_test_project(
             name=project2_name, domain_id=CONF.identity.default_domain_id)
         self.addCleanup(self.projects_client.delete_project, project2['id'])
diff --git a/tempest/api/identity/admin/v3/test_trusts.py b/tempest/api/identity/admin/v3/test_trusts.py
index 580e304..5bd6756 100644
--- a/tempest/api/identity/admin/v3/test_trusts.py
+++ b/tempest/api/identity/admin/v3/test_trusts.py
@@ -53,9 +53,10 @@
         super(TrustsV3TestJSON, self).tearDown()
 
     def create_trustor_and_roles(self):
+        prefix = CONF.resource_name_prefix
         # create a project that trusts will be granted on
         trustor_project_name = data_utils.rand_name(
-            name=self.__class__.__name__)
+            name=self.__class__.__name__, prefix=prefix)
         project = self.projects_client.create_project(
             trustor_project_name,
             domain_id=CONF.identity.default_domain_id)['project']
@@ -64,7 +65,7 @@
         self.assertIsNotNone(self.trustor_project_id)
 
         # Create a trustor User
-        trustor_username = data_utils.rand_name('user')
+        trustor_username = data_utils.rand_name(name='user', prefix=prefix)
         u_desc = trustor_username + 'description'
         u_email = trustor_username + '@testmail.xx'
         trustor_password = data_utils.rand_password()
@@ -79,8 +80,10 @@
         self.trustor_user_id = user['id']
 
         # And two roles, one we'll delegate and one we won't
-        self.delegated_role = data_utils.rand_name('DelegatedRole')
-        self.not_delegated_role = data_utils.rand_name('NotDelegatedRole')
+        self.delegated_role = data_utils.rand_name(
+            name='DelegatedRole', prefix=prefix)
+        self.not_delegated_role = data_utils.rand_name(
+            name='NotDelegatedRole', prefix=prefix)
 
         role = self.roles_client.create_role(name=self.delegated_role)['role']
         self.addCleanup(self.roles_client.delete_role, role['id'])
diff --git a/tempest/api/identity/admin/v3/test_users.py b/tempest/api/identity/admin/v3/test_users.py
index 31cbbac..9bcbba5 100644
--- a/tempest/api/identity/admin/v3/test_users.py
+++ b/tempest/api/identity/admin/v3/test_users.py
@@ -40,8 +40,9 @@
     @decorators.idempotent_id('b537d090-afb9-4519-b95d-270b0708e87e')
     def test_user_update(self):
         """Test case to check if updating of user attributes is successful"""
+        prefix = CONF.resource_name_prefix
         # Creating first user
-        u_name = data_utils.rand_name('user')
+        u_name = data_utils.rand_name(name='user', prefix=prefix)
         u_desc = u_name + 'description'
         u_email = u_name + '@testmail.tm'
         u_password = data_utils.rand_password()
@@ -55,7 +56,7 @@
         project = self.setup_test_project()
 
         # Updating user details with new values
-        update_kwargs = {'name': data_utils.rand_name('user2'),
+        update_kwargs = {'name': data_utils.rand_name('user2', prefix=prefix),
                          'description': data_utils.rand_name('desc2'),
                          'project_id': project['id'],
                          'email': 'user2@testmail.tm',
@@ -75,7 +76,8 @@
     def test_update_user_password(self):
         """Test updating user password"""
         # Creating User to check password updation
-        u_name = data_utils.rand_name('user')
+        u_name = data_utils.rand_name(
+            name='user', prefix=CONF.resource_name_prefix)
         original_password = data_utils.rand_password()
         user = self.users_client.create_user(
             name=u_name, password=original_password)['user']
@@ -105,7 +107,8 @@
         fetched_project_ids = list()
         u_project = self.setup_test_project()
         # Create a user.
-        u_name = data_utils.rand_name('user')
+        u_name = data_utils.rand_name(
+            name='user', prefix=CONF.resource_name_prefix)
         u_desc = u_name + 'description'
         u_email = u_name + '@testmail.tm'
         u_password = data_utils.rand_password()
diff --git a/tempest/api/identity/admin/v3/test_users_negative.py b/tempest/api/identity/admin/v3/test_users_negative.py
index 1cba945..f55d2d4 100644
--- a/tempest/api/identity/admin/v3/test_users_negative.py
+++ b/tempest/api/identity/admin/v3/test_users_negative.py
@@ -29,7 +29,8 @@
     @decorators.idempotent_id('e75f006c-89cc-477b-874d-588e4eab4b17')
     def test_create_user_for_non_existent_domain(self):
         """Attempt to create a user in a non-existent domain should fail"""
-        u_name = data_utils.rand_name('user')
+        u_name = data_utils.rand_name(
+            name='user', prefix=CONF.resource_name_prefix)
         u_email = u_name + '@testmail.tm'
         u_password = data_utils.rand_password()
         self.assertRaises(lib_exc.NotFound, self.users_client.create_user,
diff --git a/tempest/api/identity/base.py b/tempest/api/identity/base.py
index 5722f0e..9cdd917 100644
--- a/tempest/api/identity/base.py
+++ b/tempest/api/identity/base.py
@@ -71,7 +71,8 @@
         if kwargs.get('password', None) is None:
             kwargs['password'] = data_utils.rand_password()
         if 'name' not in kwargs:
-            kwargs['name'] = data_utils.rand_name('test_user')
+            kwargs['name'] = data_utils.rand_name(
+                name='test_user', prefix=CONF.resource_name_prefix)
         if 'email' not in kwargs:
             kwargs['email'] = kwargs['name'] + '@testmail.tm'
 
@@ -84,7 +85,8 @@
 
     def setup_test_role(self, name=None, domain_id=None):
         """Set up a test role."""
-        params = {'name': name or data_utils.rand_name('test_role')}
+        params = {'name': name or data_utils.rand_name(
+            name='test_role', prefix=CONF.resource_name_prefix)}
         if domain_id:
             params['domain_id'] = domain_id
 
@@ -161,9 +163,12 @@
     def setup_test_tenant(self, **kwargs):
         """Set up a test tenant."""
         if 'name' not in kwargs:
-            kwargs['name'] = data_utils.rand_name('test_tenant')
+            kwargs['name'] = data_utils.rand_name(
+                name='test_tenant',
+                prefix=CONF.resource_name_prefix)
         if 'description' not in kwargs:
-            kwargs['description'] = data_utils.rand_name('desc')
+            kwargs['description'] = data_utils.rand_name(
+                name='desc', prefix=CONF.resource_name_prefix)
         tenant = self.projects_client.create_tenant(**kwargs)['tenant']
         # Delete the tenant at the end of the test
         self.addCleanup(
@@ -249,9 +254,11 @@
     def create_domain(cls, **kwargs):
         """Create a domain."""
         if 'name' not in kwargs:
-            kwargs['name'] = data_utils.rand_name('test_domain')
+            kwargs['name'] = data_utils.rand_name(
+                name='test_domain', prefix=CONF.resource_name_prefix)
         if 'description' not in kwargs:
-            kwargs['description'] = data_utils.rand_name('desc')
+            kwargs['description'] = data_utils.rand_name(
+                name='desc', prefix=CONF.resource_name_prefix)
         domain = cls.domains_client.create_domain(**kwargs)['domain']
         cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
                                     cls.delete_domain, domain['id'])
@@ -274,9 +281,11 @@
     def setup_test_project(self, **kwargs):
         """Set up a test project."""
         if 'name' not in kwargs:
-            kwargs['name'] = data_utils.rand_name('test_project')
+            kwargs['name'] = data_utils.rand_name(
+                name='test_project', prefix=CONF.resource_name_prefix)
         if 'description' not in kwargs:
-            kwargs['description'] = data_utils.rand_name('test_description')
+            kwargs['description'] = data_utils.rand_name(
+                name='test_description', prefix=CONF.resource_name_prefix)
         project = self.projects_client.create_project(**kwargs)['project']
         # Delete the project at the end of the test
         self.addCleanup(
@@ -297,10 +306,12 @@
         """Set up a test group."""
         if 'name' not in kwargs:
             kwargs['name'] = data_utils.rand_name(
-                self.__class__.__name__ + '_test_project')
+                self.__class__.__name__ + '_test_project',
+                prefix=CONF.resource_name_prefix)
         if 'description' not in kwargs:
             kwargs['description'] = data_utils.rand_name(
-                self.__class__.__name__ + '_test_description')
+                self.__class__.__name__ + '_test_description',
+                prefix=CONF.resource_name_prefix)
         group = self.groups_client.create_group(**kwargs)['group']
         self.addCleanup(
             test_utils.call_and_ignore_notfound_exc,
@@ -311,20 +322,14 @@
 class BaseApplicationCredentialsV3Test(BaseIdentityV3Test):
 
     @classmethod
-    def skip_checks(cls):
-        super(BaseApplicationCredentialsV3Test, cls).skip_checks()
-        if not CONF.identity_feature_enabled.application_credentials:
-            raise cls.skipException("Application credentials are not available"
-                                    " in this environment")
-
-    @classmethod
     def resource_setup(cls):
         super(BaseApplicationCredentialsV3Test, cls).resource_setup()
         cls.user_id = cls.os_primary.credentials.user_id
         cls.project_id = cls.os_primary.credentials.project_id
 
     def create_application_credential(self, name=None, **kwargs):
-        name = name or data_utils.rand_name('application_credential')
+        name = name or data_utils.rand_name(
+            name='application_credential', prefix=CONF.resource_name_prefix)
         application_credential = (
             self.non_admin_app_creds_client.create_application_credential(
                 self.user_id, name=name, **kwargs))['application_credential']
diff --git a/tempest/api/identity/v3/test_access_rules.py b/tempest/api/identity/v3/test_access_rules.py
index 64a6959..f816a09 100644
--- a/tempest/api/identity/v3/test_access_rules.py
+++ b/tempest/api/identity/v3/test_access_rules.py
@@ -48,7 +48,9 @@
         cls.ac = cls.non_admin_app_creds_client
         cls.app_cred = cls.ac.create_application_credential(
             cls.user_id,
-            name=data_utils.rand_name('application_credential'),
+            name=data_utils.rand_name(
+                name='application_credential',
+                prefix=CONF.resource_name_prefix),
             access_rules=access_rules
         )['application_credential']
         cls.addClassResourceCleanup(
@@ -77,7 +79,9 @@
         ]
         app_cred = self.ac.create_application_credential(
             self.user_id,
-            name=data_utils.rand_name('application_credential'),
+            name=data_utils.rand_name(
+                name='application_credential',
+                prefix=CONF.resource_name_prefix),
             access_rules=access_rules
         )['application_credential']
         self.addCleanup(
diff --git a/tempest/api/image/base.py b/tempest/api/image/base.py
index 7bae712..89d5f91 100644
--- a/tempest/api/image/base.py
+++ b/tempest/api/image/base.py
@@ -12,6 +12,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import io
 import time
 
 from tempest import config
@@ -51,7 +52,9 @@
         """Wrapper that returns a test image."""
 
         if 'name' not in kwargs:
-            name = data_utils.rand_name(cls.__name__ + "-image")
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=cls.__name__ + "-image")
             kwargs['name'] = name
 
         image = cls.client.create_image(**kwargs)
@@ -83,7 +86,8 @@
                          description='Tempest', protected=False,
                          **kwargs):
         if not namespace_name:
-            namespace_name = data_utils.rand_name('test-ns')
+            namespace_name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name='test-ns')
         kwargs.setdefault('display_name', namespace_name)
         namespace = self.namespaces_client.create_namespace(
             namespace=namespace_name, visibility=visibility,
@@ -92,6 +96,36 @@
                         namespace_name)
         return namespace
 
+    def create_and_stage_image(self, all_stores=False):
+        """Create Image & stage image file for glance-direct import method."""
+        image_name = data_utils.rand_name('test-image')
+        container_format = CONF.image.container_formats[0]
+        disk_format = CONF.image.disk_formats[0]
+        image = self.create_image(name=image_name,
+                                  container_format=container_format,
+                                  disk_format=disk_format,
+                                  visibility='private')
+        self.assertEqual('queued', image['status'])
+
+        self.client.stage_image_file(
+            image['id'],
+            io.BytesIO(data_utils.random_bytes()))
+        # Check image status is 'uploading'
+        body = self.client.show_image(image['id'])
+        self.assertEqual(image['id'], body['id'])
+        self.assertEqual('uploading', body['status'])
+
+        if all_stores:
+            stores_list = ','.join([store['id']
+                                    for store in self.available_stores
+                                    if store.get('read-only') != 'true'])
+        else:
+            stores = [store['id'] for store in self.available_stores
+                      if store.get('read-only') != 'true']
+            stores_list = stores[::max(1, len(stores) - 1)]
+
+        return body, stores_list
+
     @classmethod
     def get_available_stores(cls):
         stores = []
@@ -200,7 +234,9 @@
         return image_ids
 
     def _create_image(self):
-        name = data_utils.rand_name(self.__class__.__name__ + '-image')
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-image')
         image = self.client.create_image(name=name,
                                          container_format='bare',
                                          disk_format='raw')
diff --git a/tempest/api/image/v2/admin/test_image_caching.py b/tempest/api/image/v2/admin/test_image_caching.py
index 11dcc80..333f946 100644
--- a/tempest/api/image/v2/admin/test_image_caching.py
+++ b/tempest/api/image/v2/admin/test_image_caching.py
@@ -37,13 +37,17 @@
         # NOTE(abhishekk): As caching is enabled instance boot or volume
         # boot or image download can also cache image, so we are going to
         # maintain our caching information to avoid disturbing other tests
-        self.cached_info = {}
+        self.cached_info = []
+        self.cached_info_remote = []
 
     def tearDown(self):
         # Delete all from cache/queue if we exit abruptly
         for image_id in self.cached_info:
-            self.os_admin.image_cache_client.cache_delete(
-                image_id)
+            self.os_admin.image_cache_client.cache_delete(image_id)
+
+        for image_id in self.cached_info_remote:
+            self.os_admin.image_cache_client.cache_delete(image_id)
+
         super(ImageCachingTest, self).tearDown()
 
     @classmethod
@@ -57,7 +61,9 @@
     def image_create_and_upload(self, upload=True, **kwargs):
         """Wrapper that returns a test image."""
         if 'name' not in kwargs:
-            name = data_utils.rand_name(self.__name__ + "-image")
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__name__ + "-image")
             kwargs['name'] = name
 
         params = dict(kwargs)
@@ -73,19 +79,13 @@
         image = self.client.show_image(image['id'])
         return image
 
-    def _assertCheckQueues(self, queued_images):
-        for image in self.cached_info:
-            if self.cached_info[image] == 'queued':
-                self.assertIn(image, queued_images)
-
-    def _assertCheckCache(self, cached_images):
+    def _assertCheckCache(self, cached_images, cached):
         cached_list = []
         for image in cached_images:
             cached_list.append(image['image_id'])
 
-        for image in self.cached_info:
-            if self.cached_info[image] == 'cached':
-                self.assertIn(image, cached_list)
+        for image in cached:
+            self.assertIn(image, cached_list)
 
     @decorators.idempotent_id('4bf6adba-2f9f-47e9-a6d5-37f21ad4387c')
     def test_image_caching_cycle(self):
@@ -95,10 +95,9 @@
         self.assertRaises(lib_exc.Forbidden,
                           self.os_primary.image_cache_client.list_cache)
 
-        # Check there is nothing is queued for cached by us
+        # Check there is nothing cached by us
         output = self.os_admin.image_cache_client.list_cache()
-        self._assertCheckQueues(output['queued_images'])
-        self._assertCheckCache(output['cached_images'])
+        self._assertCheckCache(output['cached_images'], self.cached_info)
 
         # Non-existing image should raise NotFound exception
         self.assertRaises(lib_exc.NotFound,
@@ -120,12 +119,6 @@
 
         # Queue image for caching
         self.os_admin.image_cache_client.cache_queue(image['id'])
-        self.cached_info[image['id']] = 'queued'
-        # Verify that we have 1 image for queueing and 0 for caching
-        output = self.os_admin.image_cache_client.list_cache()
-        self._assertCheckQueues(output['queued_images'])
-        self._assertCheckCache(output['cached_images'])
-
         # Wait for image caching
         LOG.info("Waiting for image %s to get cached", image['id'])
         caching = waiters.wait_for_caching(
@@ -133,10 +126,9 @@
             self.os_admin.image_cache_client,
             image['id'])
 
-        self.cached_info[image['id']] = 'cached'
-        # verify that we have image in cache and not in queued
-        self._assertCheckQueues(caching['queued_images'])
-        self._assertCheckCache(caching['cached_images'])
+        self.cached_info.append(image['id'])
+        # verify that we have image cached
+        self._assertCheckCache(caching['cached_images'], self.cached_info)
 
         # Verify that we can delete images from caching and queueing with
         # api call.
@@ -150,4 +142,78 @@
                           self.os_admin.image_cache_client.cache_clear,
                           target="invalid")
         # Remove all data from local information
-        self.cached_info = {}
+        self.cached_info = []
+
+    @decorators.idempotent_id('0a6b7e10-bc30-4a41-91ff-69fb4f5e65f2')
+    def test_remote_and_self_cache(self):
+        """Test image cache works with self and remote glance service"""
+        if not CONF.image.alternate_image_endpoint:
+            raise self.skipException('No image_remote service to test '
+                                     'against')
+
+        # Check there is nothing is cached by us on current and
+        # remote node
+        output = self.os_admin.image_cache_client.list_cache()
+        self._assertCheckCache(output['cached_images'], self.cached_info)
+
+        output = self.os_admin.cache_client_remote.list_cache()
+        self._assertCheckCache(output['cached_images'],
+                               self.cached_info_remote)
+
+        # Create one image
+        image = self.image_create_and_upload(name='first',
+                                             container_format='bare',
+                                             disk_format='raw',
+                                             visibility='private')
+        self.assertEqual('active', image['status'])
+
+        # Queue image for caching on local node
+        self.os_admin.image_cache_client.cache_queue(image['id'])
+        # Wait for image caching
+        LOG.info("Waiting for image %s to get cached", image['id'])
+        caching = waiters.wait_for_caching(
+            self.client,
+            self.os_admin.image_cache_client,
+            image['id'])
+        self.cached_info.append(image['id'])
+        # verify that we have image in cache on local node
+        self._assertCheckCache(caching['cached_images'], self.cached_info)
+        # verify that we don't have anything cached on remote node
+        output = self.os_admin.cache_client_remote.list_cache()
+        self._assertCheckCache(output['cached_images'],
+                               self.cached_info_remote)
+
+        # cache same image on remote node
+        self.os_admin.cache_client_remote.cache_queue(image['id'])
+        # Wait for image caching
+        LOG.info("Waiting for image %s to get cached", image['id'])
+        caching = waiters.wait_for_caching(
+            self.client,
+            self.os_admin.cache_client_remote,
+            image['id'])
+        self.cached_info_remote.append(image['id'])
+
+        # verify that we have image cached on remote node
+        output = self.os_admin.cache_client_remote.list_cache()
+        self._assertCheckCache(output['cached_images'],
+                               self.cached_info_remote)
+
+        # Verify that we can delete image from remote cache and it
+        # still present in local cache
+        self.os_admin.cache_client_remote.cache_clear()
+        output = self.os_admin.cache_client_remote.list_cache()
+        self.assertEqual(0, len(output['queued_images']))
+        self.assertEqual(0, len(output['cached_images']))
+
+        output = self.os_admin.image_cache_client.list_cache()
+        self._assertCheckCache(output['cached_images'], self.cached_info)
+
+        # Delete image from local cache as well
+        self.os_admin.image_cache_client.cache_clear()
+        output = self.os_admin.image_cache_client.list_cache()
+        self.assertEqual(0, len(output['queued_images']))
+        self.assertEqual(0, len(output['cached_images']))
+
+        # Remove all data from local and remote information
+        self.cached_info = []
+        self.cached_info_remote = []
diff --git a/tempest/api/image/v2/admin/test_image_task.py b/tempest/api/image/v2/admin/test_image_task.py
index 9439e91..6437a3c 100644
--- a/tempest/api/image/v2/admin/test_image_task.py
+++ b/tempest/api/image/v2/admin/test_image_task.py
@@ -61,7 +61,8 @@
         i = 0
         tasks = list()
         while i < len(disk_format):
-            image_name = data_utils.rand_name("task_image")
+            image_name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name="task_image")
             image_property = {"container_format": "bare",
                               "disk_format": disk_format[0],
                               "visibility": "public",
@@ -126,8 +127,12 @@
     @decorators.idempotent_id("ad6450c6-7060-4ee7-a2d1-41c2604b446c")
     @decorators.attr(type=['negative'])
     def test_task_create_fake_image_location(self):
+        kwargs = {
+            'prefix': CONF.resource_name_prefix,
+            'name': 'dummy-img-file'
+        }
         http_fake_url = ''.join(
-            ["http://", data_utils.rand_name('dummy-img-file'), ".qcow2"])
+            ["http://", data_utils.rand_name(**kwargs), ".qcow2"])
         task = self._prepare_image_tasks_param(
             image_from_format=['qcow2'],
             disk_format=['qcow2'],
diff --git a/tempest/api/image/v2/admin/test_images.py b/tempest/api/image/v2/admin/test_images.py
index ce50c5d..2b1c4fb 100644
--- a/tempest/api/image/v2/admin/test_images.py
+++ b/tempest/api/image/v2/admin/test_images.py
@@ -63,7 +63,9 @@
     @decorators.idempotent_id('f6ab4aa0-035e-4664-9f2d-c57c6df50605')
     def test_list_public_image(self):
         """Test create image as admin and list public image as none admin"""
-        name = data_utils.rand_name(self.__class__.__name__ + '-Image')
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Image')
         image = self.admin_client.create_image(
             name=name,
             container_format='bare',
@@ -107,7 +109,8 @@
             raise self.skipException('Either copy-image import method or '
                                      'multistore is not available')
         uuid = data_utils.rand_uuid()
-        image_name = data_utils.rand_name('copy-image')
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='copy-image')
         container_format = CONF.image.container_formats[0]
         disk_format = CONF.image.disk_formats[0]
         image = self.create_image(name=image_name,
@@ -176,3 +179,59 @@
         self.assertRaises(lib_exc.Forbidden,
                           self.admin_client.update_image, image['id'], [
                               dict(remove='/locations/0')])
+
+
+class MultiStoresImagesTest(base.BaseV2ImageAdminTest, base.BaseV2ImageTest):
+    """Test importing and deleting image in multiple stores"""
+    @classmethod
+    def skip_checks(cls):
+        super(MultiStoresImagesTest, cls).skip_checks()
+        if not CONF.image_feature_enabled.import_image:
+            skip_msg = (
+                "%s skipped as image import is not available" % cls.__name__)
+            raise cls.skipException(skip_msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(MultiStoresImagesTest, cls).resource_setup()
+        cls.available_import_methods = \
+            cls.client.info_import()['import-methods']['value']
+        if not cls.available_import_methods:
+            raise cls.skipException('Server does not support '
+                                    'any import method')
+
+        # NOTE(pdeore): Skip if glance-direct import method and mutlistore
+        # are not enabled/configured, or only one store is configured in
+        # multiple stores setup.
+        cls.available_stores = cls.get_available_stores()
+        if ('glance-direct' not in cls.available_import_methods or
+                not len(cls.available_stores) > 1):
+            raise cls.skipException(
+                'Either glance-direct import method not present in %s or '
+                'None or only one store is '
+                'configured %s' % (cls.available_import_methods,
+                                   cls.available_stores))
+
+    @decorators.idempotent_id('1ecec683-41d4-4470-a0df-54969ec74514')
+    def test_delete_image_from_specific_store(self):
+        """Test delete image from specific store"""
+        # Import image to available stores
+        image, stores = self.create_and_stage_image(all_stores=True)
+        self.client.image_import(image['id'],
+                                 method='glance-direct',
+                                 all_stores=True)
+        self.addCleanup(self.admin_client.delete_image, image['id'])
+        waiters.wait_for_image_imported_to_stores(
+            self.client,
+            image['id'], stores)
+        observed_image = self.client.show_image(image['id'])
+
+        # Image will be deleted from first store
+        first_image_store_deleted = (observed_image['stores'].split(","))[0]
+        self.admin_client.delete_image_from_store(
+            observed_image['id'], first_image_store_deleted)
+        waiters.wait_for_image_deleted_from_store(
+            self.admin_client,
+            observed_image,
+            stores,
+            first_image_store_deleted)
diff --git a/tempest/api/image/v2/admin/test_images_metadefs_namespace_objects.py b/tempest/api/image/v2/admin/test_images_metadefs_namespace_objects.py
index 9222920..f244ebc 100644
--- a/tempest/api/image/v2/admin/test_images_metadefs_namespace_objects.py
+++ b/tempest/api/image/v2/admin/test_images_metadefs_namespace_objects.py
@@ -11,16 +11,21 @@
 #    under the License.
 
 from tempest.api.image import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class MetadataNamespaceObjectsTest(base.BaseV2ImageAdminTest):
     """Test the Metadata definition namespace objects basic functionality"""
 
     def _create_namespace_object(self, namespace):
-        object_name = data_utils.rand_name(self.__class__.__name__ + '-object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-object')
         namespace_object = self.namespace_objects_client.\
             create_namespace_object(namespace['namespace'], name=object_name)
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -36,7 +41,8 @@
         # Create a namespace object
         body = self._create_namespace_object(namespace)
         # Update a namespace object
-        up_object_name = data_utils.rand_name('update-object')
+        up_object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='update-object')
         body = self.namespace_objects_client.update_namespace_object(
             namespace['namespace'], body['name'],
             name=up_object_name)
diff --git a/tempest/api/image/v2/admin/test_images_metadefs_namespace_properties.py b/tempest/api/image/v2/admin/test_images_metadefs_namespace_properties.py
index 10dfba1..5e0d28d 100644
--- a/tempest/api/image/v2/admin/test_images_metadefs_namespace_properties.py
+++ b/tempest/api/image/v2/admin/test_images_metadefs_namespace_properties.py
@@ -11,9 +11,12 @@
 #    under the License.
 
 from tempest.api.image import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class MetadataNamespacePropertiesTest(base.BaseV2ImageAdminTest):
     """Test the Metadata definition namespace property basic functionality"""
@@ -31,7 +34,8 @@
         body = self.resource_types_client.create_resource_type_association(
             namespace['namespace'], name=resource_name)
         # Create a property
-        property_title = data_utils.rand_name('property')
+        property_title = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='property')
         body = self.namespace_properties_client.create_namespace_property(
             namespace=namespace['namespace'], title=property_title,
             name=resource_name, type="string", enum=enum)
@@ -41,7 +45,9 @@
             namespace['namespace'], resource_name)
         self.assertEqual(resource_name, body['name'])
         # Update namespace property
-        update_property_title = data_utils.rand_name('update-property')
+        update_property_title = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='update-property')
         body = self.namespace_properties_client.update_namespace_properties(
             namespace['namespace'], resource_name,
             title=update_property_title, type="string",
diff --git a/tempest/api/image/v2/admin/test_images_metadefs_namespace_tags.py b/tempest/api/image/v2/admin/test_images_metadefs_namespace_tags.py
index 9e88e03..361bb60 100644
--- a/tempest/api/image/v2/admin/test_images_metadefs_namespace_tags.py
+++ b/tempest/api/image/v2/admin/test_images_metadefs_namespace_tags.py
@@ -11,10 +11,13 @@
 #    under the License.
 
 from tempest.api.image import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class MetadataNamespaceTagsTest(base.BaseV2ImageAdminTest):
     """Test the Metadata definition namespace tags basic functionality"""
@@ -68,7 +71,8 @@
         namespace = self.create_namespace()
         self._create_namespace_tags(namespace)
         # Create a tag
-        tag_name = data_utils.rand_name('tag_name')
+        tag_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='tag_name')
         self.namespace_tags_client.create_namespace_tag(
             namespace=namespace['namespace'], tag_name=tag_name)
 
@@ -76,7 +80,8 @@
             namespace['namespace'], tag_name)
         self.assertEqual(tag_name, body['name'])
         # Update tag definition
-        update_tag_definition = data_utils.rand_name('update-tag')
+        update_tag_definition = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='update-tag')
         body = self.namespace_tags_client.update_namespace_tag(
             namespace['namespace'], tag_name=tag_name,
             name=update_tag_definition)
diff --git a/tempest/api/image/v2/admin/test_images_metadefs_namespaces.py b/tempest/api/image/v2/admin/test_images_metadefs_namespaces.py
index c411aa9..be6d01a 100644
--- a/tempest/api/image/v2/admin/test_images_metadefs_namespaces.py
+++ b/tempest/api/image/v2/admin/test_images_metadefs_namespaces.py
@@ -14,11 +14,14 @@
 #    under the License.
 
 from tempest.api.image import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
 
+CONF = config.CONF
+
 
 class MetadataNamespacesTest(base.BaseV2ImageAdminTest):
     """Test the Metadata definition Namespaces basic functionality"""
@@ -30,7 +33,8 @@
         body = self.resource_types_client.list_resource_types()
         resource_name = body['resource_types'][0]['name']
         name = [{'name': resource_name}]
-        namespace_name = data_utils.rand_name('namespace')
+        namespace_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='namespace')
         # create the metadef namespace
         body = self.namespaces_client.create_namespace(
             namespace=namespace_name,
diff --git a/tempest/api/image/v2/test_images.py b/tempest/api/image/v2/test_images.py
index 977ad82..e468e32 100644
--- a/tempest/api/image/v2/test_images.py
+++ b/tempest/api/image/v2/test_images.py
@@ -53,7 +53,8 @@
     def _create_image(self, disk_format=None, container_format=None):
         # Create image
         uuid = '00000000-1111-2222-3333-444455556666'
-        image_name = data_utils.rand_name('image')
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='image')
         container_format = container_format or CONF.image.container_formats[0]
         disk_format = disk_format or CONF.image.disk_formats[0]
         image = self.create_image(name=image_name,
@@ -343,36 +344,6 @@
                 'configured %s' % (cls.available_import_methods,
                                    cls.available_stores))
 
-    def _create_and_stage_image(self, all_stores=False):
-        """Create Image & stage image file for glance-direct import method."""
-        image_name = data_utils.rand_name('test-image')
-        container_format = CONF.image.container_formats[0]
-        disk_format = CONF.image.disk_formats[0]
-        image = self.create_image(name=image_name,
-                                  container_format=container_format,
-                                  disk_format=disk_format,
-                                  visibility='private')
-        self.assertEqual('queued', image['status'])
-
-        self.client.stage_image_file(
-            image['id'],
-            io.BytesIO(data_utils.random_bytes()))
-        # Check image status is 'uploading'
-        body = self.client.show_image(image['id'])
-        self.assertEqual(image['id'], body['id'])
-        self.assertEqual('uploading', body['status'])
-
-        if all_stores:
-            stores_list = ','.join([store['id']
-                                    for store in self.available_stores
-                                    if store.get('read-only') != 'true'])
-        else:
-            stores = [store['id'] for store in self.available_stores
-                      if store.get('read-only') != 'true']
-            stores_list = stores[::max(1, len(stores) - 1)]
-
-        return body, stores_list
-
     @decorators.idempotent_id('bf04ff00-3182-47cb-833a-f1c6767b47fd')
     def test_glance_direct_import_image_to_all_stores(self):
         """Test image is imported in all available stores
@@ -380,7 +351,7 @@
         Create image, import image to all available stores using glance-direct
         import method and verify that import succeeded.
         """
-        image, stores = self._create_and_stage_image(all_stores=True)
+        image, stores = self.create_and_stage_image(all_stores=True)
 
         self.client.image_import(
             image['id'], method='glance-direct', all_stores=True)
@@ -395,7 +366,7 @@
         Create image, import image to specified store(s) using glance-direct
         import method and verify that import succeeded.
         """
-        image, stores = self._create_and_stage_image()
+        image, stores = self.create_and_stage_image()
         self.client.image_import(image['id'], method='glance-direct',
                                  stores=stores)
 
@@ -416,7 +387,8 @@
         """
 
         uuid = '00000000-1111-2222-3333-444455556666'
-        image_name = data_utils.rand_name('image')
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='image')
         container_format = CONF.image.container_formats[0]
         disk_format = CONF.image.disk_formats[0]
         image = self.create_image(name=image_name,
@@ -464,7 +436,8 @@
     def test_delete_image(self):
         """Test deleting an image by image_id"""
         # Create image
-        image_name = data_utils.rand_name('image')
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='image')
         container_format = CONF.image.container_formats[0]
         disk_format = CONF.image.disk_formats[0]
         image = self.create_image(name=image_name,
@@ -485,7 +458,8 @@
     def test_update_image(self):
         """Test updating an image by image_id"""
         # Create image
-        image_name = data_utils.rand_name('image')
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='image')
         container_format = CONF.image.container_formats[0]
         disk_format = CONF.image.disk_formats[0]
         image = self.create_image(name=image_name,
@@ -495,7 +469,8 @@
         self.assertEqual('queued', image['status'])
 
         # Update Image
-        new_image_name = data_utils.rand_name('new-image')
+        new_image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='new-image')
         self.client.update_image(image['id'], [
             dict(replace='/name', value=new_image_name)])
 
@@ -509,7 +484,8 @@
     def test_deactivate_reactivate_image(self):
         """Test deactivating and reactivating an image"""
         # Create image
-        image_name = data_utils.rand_name('image')
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='image')
         image = self.create_image(name=image_name,
                                   container_format='bare',
                                   disk_format='raw',
@@ -568,7 +544,9 @@
         """
         size = random.randint(1024, 4096)
         image_file = io.BytesIO(data_utils.random_bytes(size))
-        tags = [data_utils.rand_name('tag'), data_utils.rand_name('tag')]
+        prefix = CONF.resource_name_prefix
+        tags = [data_utils.rand_name(prefix=prefix, name='tag'),
+                data_utils.rand_name(prefix=prefix, name='tag')]
         image = cls.create_image(container_format=container_format,
                                  disk_format=disk_format,
                                  visibility='private',
diff --git a/tempest/api/image/v2/test_images_negative.py b/tempest/api/image/v2/test_images_negative.py
index 80c01a5..f0b891f 100644
--- a/tempest/api/image/v2/test_images_negative.py
+++ b/tempest/api/image/v2/test_images_negative.py
@@ -58,7 +58,10 @@
     def test_get_delete_deleted_image(self):
         """Get and delete the deleted image"""
         # create and delete image
-        image = self.client.create_image(name='test',
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="test")
+        image = self.client.create_image(name=image_name,
                                          container_format='bare',
                                          disk_format='raw')
         self.client.delete_image(image['id'])
@@ -111,7 +114,10 @@
     @decorators.idempotent_id('ab980a34-8410-40eb-872b-f264752f46e5')
     def test_delete_protected_image(self):
         """Create a protected image"""
-        image = self.create_image(protected=True)
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="test")
+        image = self.create_image(name=image_name, protected=True)
         self.addCleanup(self.client.update_image, image['id'],
                         [dict(replace="/protected", value=False)])
 
@@ -132,7 +138,10 @@
         if not CONF.image_feature_enabled.os_glance_reserved:
             raise self.skipException('os_glance_reserved is not enabled')
 
-        image = self.create_image(name='test',
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="test")
+        image = self.create_image(name=image_name,
                                   container_format='bare',
                                   disk_format='raw')
         self.assertRaises(lib_exc.Forbidden,
@@ -152,9 +161,12 @@
         if not CONF.image_feature_enabled.os_glance_reserved:
             raise self.skipException('os_glance_reserved is not enabled')
 
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="test")
         self.assertRaises(lib_exc.Forbidden,
                           self.create_image,
-                          name='test',
+                          name=image_name,
                           container_format='bare',
                           disk_format='raw',
                           os_glance_foo='bar')
@@ -195,7 +207,10 @@
         if 'web-download' not in self.available_import_methods:
             raise self.skipException('Server does not support '
                                      'web-download import method')
-        image = self.client.create_image(name='test',
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="test")
+        image = self.client.create_image(name=image_name,
                                          container_format='bare',
                                          disk_format='raw')
         # Now try to get image details
diff --git a/tempest/api/image/v2/test_images_tags.py b/tempest/api/image/v2/test_images_tags.py
index 163063c..12e6c8e 100644
--- a/tempest/api/image/v2/test_images_tags.py
+++ b/tempest/api/image/v2/test_images_tags.py
@@ -13,9 +13,12 @@
 # under the License.
 
 from tempest.api.image import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class ImagesTagsTest(base.BaseV2ImageTest):
     """Test image tags"""
@@ -26,7 +29,8 @@
         image = self.create_image(container_format='bare',
                                   disk_format='raw',
                                   visibility='private')
-        tag = data_utils.rand_name('tag')
+        tag = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='tag')
         self.addCleanup(self.client.delete_image, image['id'])
 
         # Creating image tag and verify it.
diff --git a/tempest/api/image/v2/test_images_tags_negative.py b/tempest/api/image/v2/test_images_tags_negative.py
index 2db4a74..9d74aa4 100644
--- a/tempest/api/image/v2/test_images_tags_negative.py
+++ b/tempest/api/image/v2/test_images_tags_negative.py
@@ -13,10 +13,13 @@
 # under the License.
 
 from tempest.api.image import base
+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
 
+CONF = config.CONF
+
 
 class ImagesTagsNegativeTest(base.BaseV2ImageTest):
     """Negative tests of image tags"""
@@ -25,7 +28,8 @@
     @decorators.idempotent_id('8cd30f82-6f9a-4c6e-8034-c1b51fba43d9')
     def test_update_tags_for_non_existing_image(self):
         """Update image tag with non existing image"""
-        tag = data_utils.rand_name('tag')
+        tag = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='tag')
         non_exist_image = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound, self.client.add_image_tag,
                           non_exist_image, tag)
@@ -38,7 +42,8 @@
                                   disk_format='raw',
                                   visibility='private'
                                   )
-        tag = data_utils.rand_name('non-exist-tag')
+        tag = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='non-exist-tag')
         self.addCleanup(self.client.delete_image, image['id'])
         self.assertRaises(lib_exc.NotFound, self.client.delete_image_tag,
                           image['id'], tag)
diff --git a/tempest/api/network/admin/test_dhcp_agent_scheduler.py b/tempest/api/network/admin/test_dhcp_agent_scheduler.py
index 3c0efee..b4bfc61 100644
--- a/tempest/api/network/admin/test_dhcp_agent_scheduler.py
+++ b/tempest/api/network/admin/test_dhcp_agent_scheduler.py
@@ -31,6 +31,15 @@
     @classmethod
     def resource_setup(cls):
         super(DHCPAgentSchedulersTestJSON, cls).resource_setup()
+        # NOTE(slaweq): In some cases (like default ML2/OVN deployment)
+        # extension is enabled but there may not be any DHCP agent available.
+        # In such case those tests should be also skipped.
+        dhcp_agents = cls.admin_agents_client.list_agents(
+            agent_type="DHCP Agent")['agents']
+        if not dhcp_agents:
+            msg = ("At least one DHCP agent is required to be running in "
+                   "the environment for those tests.")
+            raise cls.skipException(msg)
         # Create a network and make sure it will be hosted by a
         # dhcp agent: this is done by creating a regular port
         cls.network = cls.create_network()
diff --git a/tempest/api/network/admin/test_external_network_extension.py b/tempest/api/network/admin/test_external_network_extension.py
index 0cec316..8d71a27 100644
--- a/tempest/api/network/admin/test_external_network_extension.py
+++ b/tempest/api/network/admin/test_external_network_extension.py
@@ -31,7 +31,8 @@
         cls.network = cls.create_network()
 
     def _create_network(self, external=True):
-        post_body = {'name': data_utils.rand_name('network-')}
+        post_body = {'name': data_utils.rand_name(
+            name='network-', prefix=CONF.resource_name_prefix)}
         if external:
             post_body['router:external'] = external
         body = self.admin_networks_client.create_network(**post_body)
diff --git a/tempest/api/network/admin/test_external_networks_negative.py b/tempest/api/network/admin/test_external_networks_negative.py
index 92731f6..ef10ee0 100644
--- a/tempest/api/network/admin/test_external_networks_negative.py
+++ b/tempest/api/network/admin/test_external_networks_negative.py
@@ -54,6 +54,8 @@
         # create a port which will internally create an instance-ip
         self.assertRaises(lib_exc.Conflict,
                           self.admin_ports_client.create_port,
-                          name=data_utils.rand_name(self.__class__.__name__),
+                          name=data_utils.rand_name(
+                              self.__class__.__name__,
+                              prefix=CONF.resource_name_prefix),
                           network_id=CONF.network.public_network_id,
                           fixed_ips=fixed_ips)
diff --git a/tempest/api/network/admin/test_metering_extensions.py b/tempest/api/network/admin/test_metering_extensions.py
index a60cd48..919aaf2 100644
--- a/tempest/api/network/admin/test_metering_extensions.py
+++ b/tempest/api/network/admin/test_metering_extensions.py
@@ -14,10 +14,13 @@
 
 from tempest.api.network import base
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class MeteringTestJSON(base.BaseAdminNetworkTest):
     """Tests the following operations in the Neutron API:
@@ -37,7 +40,8 @@
     def resource_setup(cls):
         super(MeteringTestJSON, cls).resource_setup()
         description = "metering label created by tempest"
-        name = data_utils.rand_name("metering-label")
+        name = data_utils.rand_name(
+            name="metering-label", prefix=CONF.resource_name_prefix)
         cls.metering_label = cls.create_metering_label(name, description)
         remote_ip_prefix = ("10.0.0.0/24" if cls._ip_version == 4
                             else "fd02::/64")
@@ -101,7 +105,8 @@
     def test_create_delete_metering_label_with_filters(self):
         """Verifies creating and deleting metering label with filters"""
         # Creates a label
-        name = data_utils.rand_name('metering-label-')
+        name = data_utils.rand_name(
+            name='metering-label-', prefix=CONF.resource_name_prefix)
         description = "label created by tempest"
         body = self.admin_metering_labels_client.create_metering_label(
             name=name, description=description)
diff --git a/tempest/api/network/admin/test_ports.py b/tempest/api/network/admin/test_ports.py
index 5f9f29f..3158749 100644
--- a/tempest/api/network/admin/test_ports.py
+++ b/tempest/api/network/admin/test_ports.py
@@ -45,7 +45,9 @@
         """Test creating port with extended attribute"""
         post_body = {"network_id": self.network['id'],
                      "binding:host_id": self.host_id,
-                     "name": data_utils.rand_name(self.__class__.__name__)}
+                     "name": data_utils.rand_name(
+            self.__class__.__name__,
+            prefix=CONF.resource_name_prefix)}
         body = self.admin_ports_client.create_port(**post_body)
         port = body['port']
         self.addCleanup(self.admin_ports_client.wait_for_resource_deletion,
@@ -62,7 +64,9 @@
     def test_update_port_binding_ext_attr(self):
         """Test updating port's extended attribute"""
         post_body = {"network_id": self.network['id'],
-                     "name": data_utils.rand_name(self.__class__.__name__)}
+                     "name": data_utils.rand_name(
+            self.__class__.__name__,
+            prefix=CONF.resource_name_prefix)}
         body = self.admin_ports_client.create_port(**post_body)
         port = body['port']
         self.addCleanup(self.admin_ports_client.wait_for_resource_deletion,
@@ -83,7 +87,9 @@
         """Test updating and listing port's extended attribute"""
         # Create a new port
         post_body = {"network_id": self.network['id'],
-                     "name": data_utils.rand_name(self.__class__.__name__)}
+                     "name": data_utils.rand_name(
+            self.__class__.__name__,
+            prefix=CONF.resource_name_prefix)}
         body = self.admin_ports_client.create_port(**post_body)
         port = body['port']
         self.addCleanup(self.admin_ports_client.wait_for_resource_deletion,
@@ -113,7 +119,8 @@
     def test_show_port_binding_ext_attr(self):
         """Test showing port's extended attribute"""
         body = self.admin_ports_client.create_port(
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             network_id=self.network['id'])
         port = body['port']
         self.addCleanup(self.admin_ports_client.wait_for_resource_deletion,
diff --git a/tempest/api/network/admin/test_routers.py b/tempest/api/network/admin/test_routers.py
index 90e0917..216b15d 100644
--- a/tempest/api/network/admin/test_routers.py
+++ b/tempest/api/network/admin/test_routers.py
@@ -54,16 +54,17 @@
 
     @decorators.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
     def test_create_router_setting_project_id(self):
+        prefix = CONF.resource_name_prefix
         """Test creating router from admin user setting project_id."""
-        project = data_utils.rand_name('test_tenant_')
-        description = data_utils.rand_name('desc_')
+        project = data_utils.rand_name(name='test_tenant_', prefix=prefix)
+        description = data_utils.rand_name(name='desc_', prefix=prefix)
         project = identity.identity_utils(self.os_admin).create_project(
             name=project, description=description)
         project_id = project['id']
         self.addCleanup(identity.identity_utils(self.os_admin).delete_project,
                         project_id)
 
-        name = data_utils.rand_name('router-')
+        name = data_utils.rand_name(name='router-', prefix=prefix)
         create_body = self.admin_routers_client.create_router(
             name=name, project_id=project_id)
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -89,7 +90,8 @@
                           'The public_network_id option must be specified.')
     def test_create_router_with_snat_explicit(self):
         """Test creating router with specified enable_snat value"""
-        name = data_utils.rand_name('snat-router')
+        name = data_utils.rand_name(
+            'snat-router', prefix=CONF.resource_name_prefix)
         # Create a router enabling snat attributes
         enable_snat_states = [False, True]
         for enable_snat in enable_snat_states:
@@ -226,7 +228,8 @@
         """Test creating router setting gateway with fixed ip"""
         # At first create an external network and then use that
         # to create address and delete
-        network_name = data_utils.rand_name(self.__class__.__name__)
+        network_name = data_utils.rand_name(
+            self.__class__.__name__, prefix=CONF.resource_name_prefix)
         network_1 = self.admin_networks_client.create_network(
             name=network_name, **{'router:external': True})['network']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -237,7 +240,8 @@
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.admin_subnets_client.delete_subnet, subnet['id'])
         port = self.admin_ports_client.create_port(
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             network_id=network_1['id'])['port']
         self.admin_ports_client.delete_port(port_id=port['id'])
         fixed_ip = {
diff --git a/tempest/api/network/admin/test_routers_dvr.py b/tempest/api/network/admin/test_routers_dvr.py
index 291581c..f19857d 100644
--- a/tempest/api/network/admin/test_routers_dvr.py
+++ b/tempest/api/network/admin/test_routers_dvr.py
@@ -17,10 +17,13 @@
 
 from tempest.api.network import base
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class RoutersTestDVR(base.BaseAdminNetworkTest):
 
@@ -41,7 +44,8 @@
     @classmethod
     def resource_setup(cls):
         super(RoutersTestDVR, cls).resource_setup()
-        name = data_utils.rand_name('pretest-check')
+        name = data_utils.rand_name(
+            name='pretest-check', prefix=CONF.resource_name_prefix)
         router = cls.admin_routers_client.create_router(name=name)
         cls.admin_routers_client.delete_router(router['router']['id'])
         if 'distributed' not in router['router']:
@@ -60,7 +64,8 @@
         The router is created and the "distributed" attribute is
         set to True
         """
-        name = data_utils.rand_name('router')
+        name = data_utils.rand_name(
+            name='router', prefix=CONF.resource_name_prefix)
         router = self.admin_routers_client.create_router(name=name,
                                                          distributed=True)
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -81,7 +86,8 @@
         set to False, thus making it a "Centralized Virtual Router"
         as opposed to a "Distributed Virtual Router"
         """
-        name = data_utils.rand_name('router')
+        name = data_utils.rand_name(
+            name='router', prefix=CONF.resource_name_prefix)
         router = self.admin_routers_client.create_router(name=name,
                                                          distributed=False)
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -105,7 +111,8 @@
         set to False. Once the router is updated, the distributed
         attribute will be set to True
         """
-        name = data_utils.rand_name('router')
+        name = data_utils.rand_name(
+            name='router', prefix=CONF.resource_name_prefix)
         project_id = self.routers_client.project_id
         # router needs to be in admin state down in order to be upgraded to DVR
         # l3ha routers are not upgradable to dvr, make it explicitly non ha
diff --git a/tempest/api/network/admin/test_routers_negative.py b/tempest/api/network/admin/test_routers_negative.py
index 914c046..2a07f16 100644
--- a/tempest/api/network/admin/test_routers_negative.py
+++ b/tempest/api/network/admin/test_routers_negative.py
@@ -45,7 +45,8 @@
         """Test creating router with gateway set to used ip should fail"""
         # At first create a address from public_network_id
         port = self.admin_ports_client.create_port(
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             network_id=CONF.network.public_network_id)['port']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.admin_ports_client.delete_port,
diff --git a/tempest/api/network/base.py b/tempest/api/network/base.py
index 696d68d..99742cc 100644
--- a/tempest/api/network/base.py
+++ b/tempest/api/network/base.py
@@ -104,7 +104,7 @@
     def create_network(cls, network_name=None, **kwargs):
         """Wrapper utility that returns a test network."""
         network_name = network_name or data_utils.rand_name(
-            cls.__name__ + '-test-network')
+            cls.__name__ + '-test-network', prefix=CONF.resource_name_prefix)
 
         body = cls.networks_client.create_network(name=network_name, **kwargs)
         network = body['network']
@@ -161,7 +161,8 @@
     @classmethod
     def create_port(cls, network, **kwargs):
         if 'name' not in kwargs:
-            kwargs['name'] = data_utils.rand_name(cls.__name__)
+            kwargs['name'] = data_utils.rand_name(
+                cls.__name__, prefix=CONF.resource_name_prefix)
         """Wrapper utility that returns a test port."""
         body = cls.ports_client.create_port(network_id=network['id'],
                                             **kwargs)
@@ -182,7 +183,7 @@
                       external_network_id=None, enable_snat=None,
                       **kwargs):
         router_name = router_name or data_utils.rand_name(
-            cls.__name__ + "-router")
+            cls.__name__ + "-router", prefix=CONF.resource_name_prefix)
 
         ext_gw_info = {}
         if external_network_id:
diff --git a/tempest/api/network/base_security_groups.py b/tempest/api/network/base_security_groups.py
index 32f2cdd..a1bb68d 100644
--- a/tempest/api/network/base_security_groups.py
+++ b/tempest/api/network/base_security_groups.py
@@ -14,15 +14,19 @@
 #    under the License.
 
 from tempest.api.network import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 
+CONF = config.CONF
+
 
 class BaseSecGroupTest(base.BaseNetworkTest):
 
     def _create_security_group(self):
         # Create a security group
-        name = data_utils.rand_name('secgroup-')
+        name = data_utils.rand_name(
+            name='secgroup-', prefix=CONF.resource_name_prefix)
         group_create_body = (
             self.security_groups_client.create_security_group(name=name))
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
diff --git a/tempest/api/network/test_allowed_address_pair.py b/tempest/api/network/test_allowed_address_pair.py
index bf9eae6..5c28e96 100644
--- a/tempest/api/network/test_allowed_address_pair.py
+++ b/tempest/api/network/test_allowed_address_pair.py
@@ -15,10 +15,13 @@
 
 from tempest.api.network import base
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class AllowedAddressPairTestJSON(base.BaseNetworkTest):
     """Tests the Neutron Allowed Address Pair API extension
@@ -60,7 +63,8 @@
                                   'mac_address': self.mac_address}]
         body = self.ports_client.create_port(
             network_id=self.network['id'],
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             allowed_address_pairs=allowed_address_pairs)
         port_id = body['port']['id']
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
@@ -80,7 +84,8 @@
         # Create a port without allowed address pair
         body = self.ports_client.create_port(
             network_id=self.network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         port_id = body['port']['id']
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
                         port_id)
@@ -126,7 +131,8 @@
         """Update allowed address pair port with multiple ip and mac"""
         resp = self.ports_client.create_port(
             network_id=self.network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         newportid = resp['port']['id']
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
                         newportid)
diff --git a/tempest/api/network/test_extra_dhcp_options.py b/tempest/api/network/test_extra_dhcp_options.py
index bc6418a..36578b1 100644
--- a/tempest/api/network/test_extra_dhcp_options.py
+++ b/tempest/api/network/test_extra_dhcp_options.py
@@ -15,10 +15,13 @@
 
 from tempest.api.network import base
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class ExtraDHCPOptionsTestJSON(base.BaseNetworkTest):
     """Tests the following operations with the Extra DHCP Options:
@@ -61,7 +64,8 @@
         """Test creating a port with Extra DHCP Options and list those"""
         body = self.ports_client.create_port(
             network_id=self.network['id'],
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             extra_dhcp_opts=self.extra_dhcp_opts)
         port_id = body['port']['id']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -77,7 +81,8 @@
     @decorators.idempotent_id('9a6aebf4-86ee-4f47-b07a-7f7232c55607')
     def test_update_show_port_with_extra_dhcp_options(self):
         """Test updating port with extra DHCP options and show that port"""
-        name = data_utils.rand_name('new-port-name')
+        name = data_utils.rand_name(
+            name='new-port-name', prefix=CONF.resource_name_prefix)
         self.ports_client.update_port(
             self.port['id'],
             name=name,
diff --git a/tempest/api/network/test_floating_ips.py b/tempest/api/network/test_floating_ips.py
index 64f6e80..e39ad08 100644
--- a/tempest/api/network/test_floating_ips.py
+++ b/tempest/api/network/test_floating_ips.py
@@ -153,7 +153,8 @@
         # Create a port
         port = self.ports_client.create_port(
             network_id=self.network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         created_port = port['port']
         floating_ip = self.floating_ips_client.update_floatingip(
             created_floating_ip['id'],
@@ -183,7 +184,8 @@
             self.floating_ips_client.delete_floatingip,
             created_floating_ip['id'])
         self.assertEqual(created_floating_ip['router_id'], self.router['id'])
-        network_name = data_utils.rand_name(self.__class__.__name__)
+        network_name = data_utils.rand_name(
+            self.__class__.__name__, prefix=CONF.resource_name_prefix)
         network2 = self.networks_client.create_network(
             name=network_name)['network']
         self.addCleanup(
@@ -258,7 +260,8 @@
         # Create port
         body = self.ports_client.create_port(
             network_id=self.network['id'],
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             fixed_ips=fixed_ips)
         port = body['port']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
diff --git a/tempest/api/network/test_networks.py b/tempest/api/network/test_networks.py
index caaf964..fd93779 100644
--- a/tempest/api/network/test_networks.py
+++ b/tempest/api/network/test_networks.py
@@ -468,8 +468,11 @@
     def test_bulk_create_delete_network(self):
         """Verify creating and deleting multiple networks in one request"""
         # Creates 2 networks in one request
-        network_list = [{'name': data_utils.rand_name('network-')},
-                        {'name': data_utils.rand_name('network-')}]
+        network_list = [
+            {'name': data_utils.rand_name(
+                'network-', prefix=CONF.resource_name_prefix)},
+            {'name': data_utils.rand_name(
+                'network-', prefix=CONF.resource_name_prefix)}]
         body = self.networks_client.create_bulk_networks(networks=network_list)
         created_networks = body['networks']
         self.addCleanup(self._delete_networks, created_networks)
@@ -489,7 +492,9 @@
         cidrs = [subnet_cidr
                  for subnet_cidr in self.cidr.subnet(self.mask_bits)]
 
-        names = [data_utils.rand_name('subnet-') for i in range(len(networks))]
+        names = [data_utils.rand_name(
+            name='subnet-', prefix=CONF.resource_name_prefix)
+            for i in range(len(networks))]
         subnets_list = []
         for i in range(len(names)):
             p1 = {
@@ -516,7 +521,9 @@
         """Verify creating and deleting multiple ports in one request"""
         networks = [self.create_network(), self.create_network()]
         # Creates 2 ports in one request
-        names = [data_utils.rand_name('port-') for i in range(len(networks))]
+        names = [data_utils.rand_name(
+            name='port-', prefix=CONF.resource_name_prefix)
+            for i in range(len(networks))]
         port_list = []
         state = [True, False]
         for i in range(len(names)):
diff --git a/tempest/api/network/test_networks_negative.py b/tempest/api/network/test_networks_negative.py
index 0525484..6c91df0 100644
--- a/tempest/api/network/test_networks_negative.py
+++ b/tempest/api/network/test_networks_negative.py
@@ -15,10 +15,13 @@
 #    under the License.
 
 from tempest.api.network import base
+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
 
+CONF = config.CONF
+
 
 class NetworksNegativeTestJSON(base.BaseNetworkTest):
     """Negative tests of network"""
@@ -89,7 +92,9 @@
         self.assertRaises(lib_exc.NotFound,
                           self.ports_client.create_port,
                           network_id=non_exist_net_id,
-                          name=data_utils.rand_name(self.__class__.__name__))
+                          name=data_utils.rand_name(
+                              self.__class__.__name__,
+                              prefix=CONF.resource_name_prefix))
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('cf8eef21-4351-4f53-adcd-cc5cb1e76b92')
diff --git a/tempest/api/network/test_ports.py b/tempest/api/network/test_ports.py
index 190f7e0..02faa59 100644
--- a/tempest/api/network/test_ports.py
+++ b/tempest/api/network/test_ports.py
@@ -21,11 +21,14 @@
 from tempest.api.network import base_security_groups as sec_base
 from tempest.common import custom_matchers
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions
 
+CONF = config.CONF
+
 
 class PortsTestJSON(sec_base.BaseSecGroupTest):
     """Test the following operations for ports:
@@ -59,7 +62,7 @@
 
     def _create_network(self, network_name=None, **kwargs):
         network_name = network_name or data_utils.rand_name(
-            self.__class__.__name__)
+            self.__class__.__name__, prefix=CONF.resource_name_prefix)
         network = self.networks_client.create_network(
             name=network_name, **kwargs)['network']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -74,7 +77,8 @@
         # Verify port creation
         body = self.ports_client.create_port(
             network_id=self.network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         port = body['port']
         # Schedule port deletion with verification upon test completion
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
@@ -131,7 +135,8 @@
                             **allocation_pools)
         body = self.ports_client.create_port(
             network_id=net_id,
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
                         body['port']['id'])
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -190,14 +195,16 @@
         # Create two ports
         port_1 = self.ports_client.create_port(
             network_id=network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
                         port_1['port']['id'])
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, port_1['port']['id'])
         port_2 = self.ports_client.create_port(
             network_id=network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
                         port_2['port']['id'])
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -251,7 +258,8 @@
         fixed_ips = [{'subnet_id': subnet['id'], 'ip_address': ip_address_1}]
         port_1 = self.ports_client.create_port(
             network_id=network['id'],
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             fixed_ips=fixed_ips)
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
                         port_1['port']['id'])
@@ -260,7 +268,8 @@
         fixed_ips = [{'subnet_id': subnet['id'], 'ip_address': ip_address_2}]
         port_2 = self.ports_client.create_port(
             network_id=network['id'],
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             fixed_ips=fixed_ips)
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
                         port_2['port']['id'])
@@ -319,7 +328,8 @@
                         self.routers_client.delete_router, router['id'])
         port = self.ports_client.create_port(
             network_id=network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         # Add router interface to port created above
         self.routers_client.add_router_interface(router['id'],
                                                  port_id=port['port']['id'])
@@ -393,14 +403,16 @@
             security_groups_list.append(group_create_body['security_group']
                                         ['id'])
         # Create a port
-        sec_grp_name = data_utils.rand_name('secgroup')
+        sec_grp_name = data_utils.rand_name(
+            name='secgroup', prefix=CONF.resource_name_prefix)
         security_group = sec_grps_client.create_security_group(
             name=sec_grp_name)
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.security_groups_client.delete_security_group,
                         security_group['security_group']['id'])
         post_body = {
-            "name": data_utils.rand_name(self.__class__.__name__),
+            "name": data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             "security_groups": [security_group['security_group']['id']],
             "network_id": self.network['id'],
             "admin_state_up": True,
@@ -416,7 +428,8 @@
         subnet_2 = self.create_subnet(self.network)
         fixed_ip_2 = [{'subnet_id': subnet_2['id']}]
         update_body = {
-            "name": data_utils.rand_name(self.__class__.__name__),
+            "name": data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix),
             "admin_state_up": False,
             "fixed_ips": fixed_ip_2,
             "security_groups": security_groups_list}
@@ -446,7 +459,8 @@
         the port's fixed ips.
         """
         self._update_port_with_security_groups(
-            [data_utils.rand_name('secgroup')])
+            [data_utils.rand_name('secgroup',
+                                  prefix=CONF.resource_name_prefix)])
 
     @decorators.idempotent_id('edf6766d-3d40-4621-bc6e-2521a44c257d')
     @testtools.skipUnless(
@@ -460,8 +474,10 @@
         the port's fixed ips.
         """
         self._update_port_with_security_groups(
-            [data_utils.rand_name('secgroup'),
-             data_utils.rand_name('secgroup')])
+            [data_utils.rand_name('secgroup',
+                                  prefix=CONF.resource_name_prefix),
+             data_utils.rand_name('secgroup',
+                                  prefix=CONF.resource_name_prefix)])
 
     @decorators.idempotent_id('13e95171-6cbd-489c-9d7c-3f9c58215c18')
     def test_create_show_delete_port_user_defined_mac(self):
@@ -469,7 +485,8 @@
         # Create a port for a legal mac
         body = self.ports_client.create_port(
             network_id=self.network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         old_port = body['port']
         free_mac_address = old_port['mac_address']
         self.ports_client.delete_port(old_port['id'])
@@ -477,7 +494,8 @@
         body = self.ports_client.create_port(
             network_id=self.network['id'],
             mac_address=free_mac_address,
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         self.addCleanup(self.ports_client.wait_for_resource_deletion,
                         body['port']['id'])
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
diff --git a/tempest/api/network/test_routers.py b/tempest/api/network/test_routers.py
index c03a8a2..0dd7c70 100644
--- a/tempest/api/network/test_routers.py
+++ b/tempest/api/network/test_routers.py
@@ -56,7 +56,9 @@
     def test_create_show_list_update_delete_router(self):
         """Test create/show/list/update/delete of a router"""
         # Create a router
-        router_name = data_utils.rand_name(self.__class__.__name__ + '-router')
+        router_name = data_utils.rand_name(
+            self.__class__.__name__ + '-router',
+            prefix=CONF.resource_name_prefix)
         router = self.create_router(
             router_name,
             admin_state_up=False,
@@ -90,7 +92,8 @@
     @decorators.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
     def test_add_remove_router_interface_with_subnet_id(self):
         """Test adding and removing router interface with subnet id"""
-        network_name = data_utils.rand_name(self.__class__.__name__)
+        network_name = data_utils.rand_name(
+            self.__class__.__name__, prefix=CONF.resource_name_prefix)
         network = self.networks_client.create_network(
             name=network_name)['network']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -117,7 +120,8 @@
     @decorators.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
     def test_add_remove_router_interface_with_port_id(self):
         """Test adding and removing router interface with port id"""
-        network_name = data_utils.rand_name(self.__class__.__name__)
+        network_name = data_utils.rand_name(
+            self.__class__.__name__, prefix=CONF.resource_name_prefix)
         network = self.networks_client.create_network(
             name=network_name)['network']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -128,7 +132,8 @@
         self.addCleanup(self.delete_router, router)
         port_body = self.ports_client.create_port(
             network_id=network['id'],
-            name=data_utils.rand_name(self.__class__.__name__))
+            name=data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix))
         # add router interface to port created above
         interface = self.routers_client.add_router_interface(
             router['id'],
@@ -165,7 +170,8 @@
         # Update router extra route, second ip of the range is
         # used as next hop
         for i in range(routes_num):
-            network_name = data_utils.rand_name(self.__class__.__name__)
+            network_name = data_utils.rand_name(
+                self.__class__.__name__, prefix=CONF.resource_name_prefix)
             network = self.networks_client.create_network(
                 name=network_name)['network']
             self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -235,12 +241,14 @@
     @decorators.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
     def test_add_multiple_router_interfaces(self):
         """Test adding multiple router interfaces"""
-        network_name = data_utils.rand_name(self.__class__.__name__)
+        network_name = data_utils.rand_name(
+            self.__class__.__name__, prefix=CONF.resource_name_prefix)
         network01 = self.networks_client.create_network(
             name=network_name)['network']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.networks_client.delete_network, network01['id'])
-        network_name = data_utils.rand_name(self.__class__.__name__)
+        network_name = data_utils.rand_name(
+            self.__class__.__name__, prefix=CONF.resource_name_prefix)
         network02 = self.networks_client.create_network(
             name=network_name)['network']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -266,7 +274,8 @@
     @decorators.idempotent_id('96522edf-b4b5-45d9-8443-fa11c26e6eff')
     def test_router_interface_port_update_with_fixed_ip(self):
         """Test updating router interface port's fixed ip"""
-        network_name = data_utils.rand_name(self.__class__.__name__)
+        network_name = data_utils.rand_name(
+            self.__class__.__name__, prefix=CONF.resource_name_prefix)
         network = self.networks_client.create_network(
             name=network_name)['network']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
diff --git a/tempest/api/network/test_routers_negative.py b/tempest/api/network/test_routers_negative.py
index 10a2706..50ba977 100644
--- a/tempest/api/network/test_routers_negative.py
+++ b/tempest/api/network/test_routers_negative.py
@@ -15,10 +15,13 @@
 
 from tempest.api.network import base
 from tempest.common import utils
+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
 
+CONF = config.CONF
+
 
 class RoutersNegativeTest(base.BaseNetworkTest):
     """Negative tests of routers"""
@@ -65,9 +68,11 @@
     def test_add_router_interfaces_on_overlapping_subnets_returns_400(self):
         """Test adding router interface which is on overlapping subnets"""
         network01 = self.create_network(
-            network_name=data_utils.rand_name('router-network01-'))
+            network_name=data_utils.rand_name(
+                name='router-network01-', prefix=CONF.resource_name_prefix))
         network02 = self.create_network(
-            network_name=data_utils.rand_name('router-network02-'))
+            network_name=data_utils.rand_name(
+                name='router-network02-', prefix=CONF.resource_name_prefix))
         subnet01 = self.create_subnet(network01)
         subnet02 = self.create_subnet(network02)
         interface = self.routers_client.add_router_interface(
@@ -96,7 +101,8 @@
     @decorators.idempotent_id('c2a70d72-8826-43a7-8208-0209e6360c47')
     def test_show_non_existent_router_returns_404(self):
         """Test showing non existent router"""
-        router = data_utils.rand_name('non_exist_router')
+        router = data_utils.rand_name(
+            name='non_exist_router', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.NotFound, self.routers_client.show_router,
                           router)
 
@@ -104,7 +110,8 @@
     @decorators.idempotent_id('b23d1569-8b0c-4169-8d4b-6abd34fad5c7')
     def test_update_non_existent_router_returns_404(self):
         """Test updating non existent router"""
-        router = data_utils.rand_name('non_exist_router')
+        router = data_utils.rand_name(
+            name='non_exist_router', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.NotFound, self.routers_client.update_router,
                           router, name="new_name")
 
@@ -112,7 +119,8 @@
     @decorators.idempotent_id('c7edc5ad-d09d-41e6-a344-5c0c31e2e3e4')
     def test_delete_non_existent_router_returns_404(self):
         """Test deleting non existent router"""
-        router = data_utils.rand_name('non_exist_router')
+        router = data_utils.rand_name(
+            name='non_exist_router', prefix=CONF.resource_name_prefix)
         self.assertRaises(lib_exc.NotFound, self.routers_client.delete_router,
                           router)
 
diff --git a/tempest/api/network/test_security_groups.py b/tempest/api/network/test_security_groups.py
index 532ef65..c7f6b8f 100644
--- a/tempest/api/network/test_security_groups.py
+++ b/tempest/api/network/test_security_groups.py
@@ -15,10 +15,13 @@
 
 from tempest.api.network import base_security_groups as base
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class SecGroupTest(base.BaseSecGroupTest):
     """Test security groups"""
@@ -91,7 +94,8 @@
             secgroup_list.append(secgroup['id'])
         self.assertIn(group_create_body['security_group']['id'], secgroup_list)
         # Update the security group
-        new_name = data_utils.rand_name('security-')
+        new_name = data_utils.rand_name(
+            'security-', prefix=CONF.resource_name_prefix)
         new_description = data_utils.rand_name('security-description')
         update_body = self.security_groups_client.update_security_group(
             group_create_body['security_group']['id'],
diff --git a/tempest/api/network/test_subnetpools_extensions.py b/tempest/api/network/test_subnetpools_extensions.py
index 48603ed..689844b 100644
--- a/tempest/api/network/test_subnetpools_extensions.py
+++ b/tempest/api/network/test_subnetpools_extensions.py
@@ -50,7 +50,8 @@
     @decorators.idempotent_id('62595970-ab1c-4b7f-8fcc-fddfe55e9811')
     def test_create_list_show_update_delete_subnetpools(self):
         """Test create/list/show/update/delete of subnet pools"""
-        subnetpool_name = data_utils.rand_name('subnetpools')
+        subnetpool_name = data_utils.rand_name(
+            name='subnetpools', prefix=CONF.resource_name_prefix)
         # create subnet pool
         prefix = CONF.network.default_network
         body = self.subnetpools_client.create_subnetpool(name=subnetpool_name,
@@ -64,7 +65,8 @@
         body = self.subnetpools_client.show_subnetpool(subnetpool_id)
         self.assertEqual(subnetpool_name, body["subnetpool"]["name"])
         # update the subnet pool
-        subnetpool_name = data_utils.rand_name('subnetpools_update')
+        subnetpool_name = data_utils.rand_name(
+            name='subnetpools_update', prefix=CONF.resource_name_prefix)
         body = self.subnetpools_client.update_subnetpool(subnetpool_id,
                                                          name=subnetpool_name)
         self.assertEqual(subnetpool_name, body["subnetpool"]["name"])
diff --git a/tempest/api/network/test_tags.py b/tempest/api/network/test_tags.py
index 5219c34..bd3e360 100644
--- a/tempest/api/network/test_tags.py
+++ b/tempest/api/network/test_tags.py
@@ -52,7 +52,8 @@
     @decorators.idempotent_id('ee76bfaf-ac94-4d74-9ecc-4bbd4c583cb1')
     def test_create_list_show_update_delete_tags(self):
         """Validate that creating a tag on a network resource works"""
-        tag_name = data_utils.rand_name(self.__class__.__name__ + '-Tag')
+        tag_name = data_utils.rand_name(
+            self.__class__.__name__ + '-Tag', prefix=CONF.resource_name_prefix)
         self.tags_client.create_tag('networks', self.network['id'], tag_name)
         self.addCleanup(self.tags_client.delete_all_tags, 'networks',
                         self.network['id'])
@@ -66,7 +67,8 @@
 
         # Generate 3 new tag names.
         replace_tags = [data_utils.rand_name(
-            self.__class__.__name__ + '-Tag') for _ in range(3)]
+            self.__class__.__name__ + '-Tag',
+            prefix=CONF.resource_name_prefix) for _ in range(3)]
 
         # Replace the current tag with the 3 new tags and validate that the
         # network resource has the 3 new tags.
@@ -132,7 +134,8 @@
         cls.port = cls.create_port(cls.network)
         cls.router = cls.create_router()
 
-        subnetpool_name = data_utils.rand_name(cls.__name__ + '-Subnetpool')
+        subnetpool_name = data_utils.rand_name(
+            cls.__name__ + '-Subnetpool', prefix=CONF.resource_name_prefix)
         prefix = CONF.network.default_network
         cls.subnetpool = cls.subnetpools_client.create_subnetpool(
             name=subnetpool_name, prefixes=prefix)['subnetpool']
@@ -145,7 +148,9 @@
         tag_names = []
 
         for resource in self.SUPPORTED_RESOURCES:
-            tag_name = data_utils.rand_name(self.__class__.__name__ + '-Tag')
+            tag_name = data_utils.rand_name(
+                self.__class__.__name__ + '-Tag',
+                prefix=CONF.resource_name_prefix)
             tag_names.append(tag_name)
             resource_object = getattr(self, resource[:-1])
 
@@ -188,7 +193,8 @@
         for resource in self.SUPPORTED_RESOURCES:
             # Generate 3 new tag names.
             replace_tags = [data_utils.rand_name(
-                self.__class__.__name__ + '-Tag') for _ in range(3)]
+                self.__class__.__name__ + '-Tag',
+                prefix=CONF.resource_name_prefix) for _ in range(3)]
 
             # Replace the current tag with the 3 new tags and validate that the
             # current resource has the 3 new tags.
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index 58ad9d4..58e71a5 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -18,6 +18,7 @@
 from oslo_log import log
 
 from tempest.common import custom_matchers
+from tempest.common import object_storage
 from tempest.common import waiters
 from tempest import config
 from tempest.lib.common.utils import data_utils
@@ -28,51 +29,6 @@
 LOG = log.getLogger(__name__)
 
 
-def delete_containers(containers, container_client, object_client):
-    """Remove containers and all objects in them.
-
-    The containers should be visible from the container_client given.
-    Will not throw any error if the containers don't exist.
-
-    :param containers: List of containers(or string of a container)
-                       to be deleted
-    :param container_client: Client to be used to delete containers
-    :param object_client: Client to be used to delete objects
-    """
-    if isinstance(containers, str):
-        containers = [containers]
-
-    for cont in containers:
-        try:
-            delete_objects(cont, container_client, object_client)
-            container_client.delete_container(cont)
-            container_client.wait_for_resource_deletion(cont)
-        except lib_exc.NotFound:
-            LOG.warning(f"Container {cont} wasn't deleted as it wasn't found.")
-
-
-def delete_objects(container, container_client, object_client):
-    """Remove all objects from container.
-
-    Will not throw any error if the objects do not exist
-
-    :param container: Name of the container that contains the objects to be
-                      deleted
-    :param container_client: Client to be used to list objects in
-                             the container
-    :param object_client: Client to be used to delete objects
-    """
-    params = {'limit': 9999, 'format': 'json'}
-    _, objlist = container_client.list_container_objects(container, params)
-
-    for obj in objlist:
-        try:
-            object_client.delete_object(container, obj['name'])
-            object_client.wait_for_resource_deletion(obj['name'], container)
-        except lib_exc.NotFound:
-            LOG.warning(f"Object {obj} wasn't deleted as it wasn't found.")
-
-
 class BaseObjectTest(tempest.test.BaseTestCase):
 
     credentials = [['operator', CONF.object_storage.operator_role]]
@@ -122,7 +78,8 @@
     @classmethod
     def create_container(cls):
         # wrapper that returns a test container
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         cls.container_client.update_container(container_name)
         cls.containers.append(container_name)
 
@@ -133,7 +90,8 @@
                       data=None, metadata=None):
         # wrapper that returns a test object
         if object_name is None:
-            object_name = data_utils.rand_name(name='TestObject')
+            object_name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name='TestObject')
         if data is None:
             data = data_utils.random_bytes()
 
@@ -160,7 +118,8 @@
             container_client = cls.container_client
         if object_client is None:
             object_client = cls.object_client
-        delete_containers(cls.containers, container_client, object_client)
+        object_storage.delete_containers(cls.containers, container_client,
+                                         object_client)
 
     def assertHeaders(self, resp, target, method):
         """Check the existence and the format of response headers"""
diff --git a/tempest/api/object_storage/test_account_bulk.py b/tempest/api/object_storage/test_account_bulk.py
index 687fe57..0ecae85 100644
--- a/tempest/api/object_storage/test_account_bulk.py
+++ b/tempest/api/object_storage/test_account_bulk.py
@@ -16,6 +16,7 @@
 import tempfile
 
 from tempest.api.object_storage import base
+from tempest.common import object_storage
 from tempest.common import utils
 from tempest.lib import decorators
 
@@ -30,8 +31,9 @@
     def tearDown(self):
         # NOTE(andreaf) BulkTests needs to cleanup containers after each
         # test is executed.
-        base.delete_containers(self.containers, self.container_client,
-                               self.object_client)
+        object_storage.delete_containers(self.containers,
+                                         self.container_client,
+                                         self.object_client)
         super(BulkTest, self).tearDown()
 
     def _create_archive(self):
diff --git a/tempest/api/object_storage/test_account_quotas.py b/tempest/api/object_storage/test_account_quotas.py
index 6854bbe..0a40237 100644
--- a/tempest/api/object_storage/test_account_quotas.py
+++ b/tempest/api/object_storage/test_account_quotas.py
@@ -81,7 +81,8 @@
     @utils.requires_ext(extension='account_quotas', service='object')
     def test_upload_valid_object(self):
         """Test uploading valid object"""
-        object_name = data_utils.rand_name(name="TestObject")
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name="TestObject")
         data = data_utils.arbitrary_string()
         resp, _ = self.object_client.create_object(self.container_name,
                                                    object_name, data)
diff --git a/tempest/api/object_storage/test_account_services.py b/tempest/api/object_storage/test_account_services.py
index 4966ec4..75414c0 100644
--- a/tempest/api/object_storage/test_account_services.py
+++ b/tempest/api/object_storage/test_account_services.py
@@ -18,6 +18,7 @@
 
 from tempest.api.object_storage import base
 from tempest.common import custom_matchers
+from tempest.common import object_storage
 from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
@@ -41,9 +42,11 @@
     def resource_setup(cls):
         super(AccountTest, cls).resource_setup()
         for i in range(ord('a'), ord('f') + 1):
-            name = data_utils.rand_name(name='%s-' % bytes((i,)))
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='%s-' % bytes((i,)))
             cls.container_client.update_container(name)
-            cls.addClassResourceCleanup(base.delete_containers,
+            cls.addClassResourceCleanup(object_storage.delete_containers,
                                         [name],
                                         cls.container_client,
                                         cls.object_client)
diff --git a/tempest/api/object_storage/test_container_acl.py b/tempest/api/object_storage/test_container_acl.py
index 0259373..9dafbf0 100644
--- a/tempest/api/object_storage/test_container_acl.py
+++ b/tempest/api/object_storage/test_container_acl.py
@@ -50,7 +50,8 @@
                 create_update_metadata_prefix=''))
         self.assertHeaders(resp_meta, 'Container', 'POST')
         # create object
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         resp, _ = self.os_roles_operator.object_client.create_object(
             self.container_name, object_name, 'data')
         self.assertHeaders(resp, 'Object', 'PUT')
@@ -84,7 +85,8 @@
             auth_data=self.os_roles_operator_alt.object_client.auth_provider.
             auth_data)
         # Trying to write the object with rights
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         resp, _ = self.os_roles_operator.object_client.create_object(
             self.container_name,
             object_name, 'data', headers={})
diff --git a/tempest/api/object_storage/test_container_acl_negative.py b/tempest/api/object_storage/test_container_acl_negative.py
index 347c79e..49c2ed0 100644
--- a/tempest/api/object_storage/test_container_acl_negative.py
+++ b/tempest/api/object_storage/test_container_acl_negative.py
@@ -39,7 +39,8 @@
 
     def setUp(self):
         super(ObjectACLsNegativeTest, self).setUp()
-        self.container_name = data_utils.rand_name(name='TestContainer')
+        self.container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         self.container_client.update_container(self.container_name)
         self.containers.append(self.container_name)
 
@@ -54,7 +55,8 @@
         """Test writing object without using credentials"""
         # trying to create object with empty headers
         # X-Auth-Token is not provided
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         self.object_client.auth_provider.set_alt_auth_data(
             request_part='headers',
             auth_data=None
@@ -68,7 +70,8 @@
     def test_delete_object_without_using_creds(self):
         """Test deleting object without using credentials"""
         # create object
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         self.object_client.create_object(self.container_name, object_name,
                                          'data')
         # trying to delete object with empty headers
@@ -86,7 +89,8 @@
     def test_write_object_with_non_authorized_user(self):
         """Test writing object with non-authorized user"""
         # User provided token is forbidden. ACL are not set
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         # trying to create object with non-authorized user
         self.object_client.auth_provider.set_alt_auth_data(
             request_part='headers',
@@ -101,7 +105,8 @@
     def test_read_object_with_non_authorized_user(self):
         """Test reading object with non-authorized user"""
         # User provided token is forbidden. ACL are not set
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         resp, _ = self.object_client.create_object(
             self.container_name, object_name, 'data')
         self.assertHeaders(resp, 'Object', 'PUT')
@@ -119,7 +124,8 @@
     def test_delete_object_with_non_authorized_user(self):
         """Test deleting object with non-authorized user"""
         # User provided token is forbidden. ACL are not set
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         resp, _ = self.object_client.create_object(
             self.container_name, object_name, 'data')
         self.assertHeaders(resp, 'Object', 'PUT')
@@ -144,7 +150,8 @@
                 create_update_metadata_prefix=''))
         self.assertHeaders(resp_meta, 'Container', 'POST')
         # create object
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         resp, _ = self.object_client.create_object(self.container_name,
                                                    object_name, 'data')
         self.assertHeaders(resp, 'Object', 'PUT')
@@ -173,7 +180,8 @@
             request_part='headers',
             auth_data=self.test_auth_data
         )
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         self.assertRaises(lib_exc.Forbidden,
                           self.object_client.create_object,
                           self.container_name,
@@ -199,7 +207,8 @@
             request_part='headers',
             auth_data=self.test_auth_data
         )
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         self.assertRaises(lib_exc.Forbidden,
                           self.object_client.create_object,
                           self.container_name,
@@ -221,7 +230,8 @@
                 create_update_metadata_prefix=''))
         self.assertHeaders(resp_meta, 'Container', 'POST')
         # create object
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         resp, _ = self.object_client.create_object(self.container_name,
                                                    object_name, 'data')
         self.assertHeaders(resp, 'Object', 'PUT')
diff --git a/tempest/api/object_storage/test_container_quotas.py b/tempest/api/object_storage/test_container_quotas.py
index fb67fb4..f055d19 100644
--- a/tempest/api/object_storage/test_container_quotas.py
+++ b/tempest/api/object_storage/test_container_quotas.py
@@ -16,10 +16,12 @@
 from tempest.api.object_storage import base
 from tempest.common import utils
 from tempest.common import waiters
+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
 
+CONF = config.CONF
 QUOTA_BYTES = 10
 QUOTA_COUNT = 3
 
@@ -55,7 +57,8 @@
     @decorators.attr(type="smoke")
     def test_upload_valid_object(self):
         """Attempts to uploads an object smaller than the bytes quota."""
-        object_name = data_utils.rand_name(name="TestObject")
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name="TestObject")
         data = data_utils.arbitrary_string(QUOTA_BYTES)
 
         nbefore = self._get_bytes_used()
@@ -72,7 +75,8 @@
     @decorators.attr(type="smoke")
     def test_upload_large_object(self):
         """Attempts to upload an object larger than the bytes quota."""
-        object_name = data_utils.rand_name(name="TestObject")
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name="TestObject")
         data = data_utils.arbitrary_string(QUOTA_BYTES + 1)
 
         nbefore = self._get_bytes_used()
@@ -90,7 +94,8 @@
     def test_upload_too_many_objects(self):
         """Attempts to upload many objects that exceeds the count limit."""
         for _ in range(QUOTA_COUNT):
-            name = data_utils.rand_name(name="TestObject")
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name="TestObject")
             self.object_client.create_object(self.container_name, name, "")
             waiters.wait_for_object_create(self.object_client,
                                            self.container_name,
diff --git a/tempest/api/object_storage/test_container_services.py b/tempest/api/object_storage/test_container_services.py
index 085b8ab..e2bbc26 100644
--- a/tempest/api/object_storage/test_container_services.py
+++ b/tempest/api/object_storage/test_container_services.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.object_storage import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class ContainerTest(base.BaseObjectTest):
     """Test containers"""
@@ -30,7 +33,8 @@
     @decorators.idempotent_id('92139d73-7819-4db1-85f8-3f2f22a8d91f')
     def test_create_container(self):
         """Test creating container"""
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         resp, _ = self.container_client.update_container(container_name)
         self.containers.append(container_name)
         self.assertHeaders(resp, 'Container', 'PUT')
@@ -38,7 +42,8 @@
     @decorators.idempotent_id('49f866ed-d6af-4395-93e7-4187eb56d322')
     def test_create_container_overwrite(self):
         """Test overwriting container with the same name"""
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         self.container_client.update_container(container_name)
         self.containers.append(container_name)
 
@@ -48,7 +53,8 @@
     @decorators.idempotent_id('c2ac4d59-d0f5-40d5-ba19-0635056d48cd')
     def test_create_container_with_metadata_key(self):
         """Test creating container with the blank value of metadata"""
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         headers = {'X-Container-Meta-test-container-meta': ''}
         resp, _ = self.container_client.update_container(
             container_name,
@@ -65,7 +71,8 @@
     @decorators.idempotent_id('e1e8df32-7b22-44e1-aa08-ccfd8d446b58')
     def test_create_container_with_metadata_value(self):
         """Test creating container with metadata value"""
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
 
         # metadata name using underscores should be converted to hyphens
         headers = {'X-Container-Meta-test_container_meta': 'Meta1'}
@@ -84,7 +91,8 @@
     @decorators.idempotent_id('24d16451-1c0c-4e4f-b59c-9840a3aba40e')
     def test_create_container_with_remove_metadata_key(self):
         """Test creating container with the blank value of remove metadata"""
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         headers = {'X-Container-Meta-test-container-meta': 'Meta1'}
         self.container_client.update_container(container_name, **headers)
         self.containers.append(container_name)
@@ -102,7 +110,8 @@
     @decorators.idempotent_id('8a21ebad-a5c7-4e29-b428-384edc8cd156')
     def test_create_container_with_remove_metadata_value(self):
         """Test creating container with remove metadata"""
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         headers = {'X-Container-Meta-test-container-meta': 'Meta1'}
         self.container_client.update_container(container_name, **headers)
         self.containers.append(container_name)
@@ -151,7 +160,8 @@
     def test_list_container_contents_with_delimiter(self):
         """Test getting container contents list using delimiter param"""
         container_name = self.create_container()
-        object_name = data_utils.rand_name(name='TestObject/')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject/')
         self.create_object(container_name, object_name)
 
         params = {'delimiter': '/'}
@@ -247,7 +257,8 @@
     def test_list_container_contents_with_path(self):
         """Test getting container contents list using path param"""
         container_name = self.create_container()
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         object_name = 'Swift/' + object_name
         self.create_object(container_name, object_name)
 
@@ -305,7 +316,8 @@
 
         Send one request of adding and deleting metadata.
         """
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         metadata_1 = {'X-Container-Meta-test-container-meta1': 'Meta1'}
         self.container_client.update_container(container_name, **metadata_1)
         self.containers.append(container_name)
@@ -346,7 +358,8 @@
     @decorators.idempotent_id('3a5ce7d4-6e4b-47d0-9d87-7cd42c325094')
     def test_update_container_metadata_with_delete_metadata(self):
         """Test updating container metadata using delete metadata"""
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         metadata = {'X-Container-Meta-test-container-meta1': 'Meta1'}
         self.container_client.update_container(container_name, **metadata)
         self.containers.append(container_name)
@@ -380,7 +393,8 @@
     @decorators.idempotent_id('a2e36378-6f1f-43f4-840a-ffd9cfd61914')
     def test_update_container_metadata_with_delete_metadata_key(self):
         """Test updating container metadata with a blank value of metadata"""
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         headers = {'X-Container-Meta-test-container-meta1': 'Meta1'}
         self.container_client.update_container(container_name, **headers)
         self.containers.append(container_name)
diff --git a/tempest/api/object_storage/test_container_services_negative.py b/tempest/api/object_storage/test_container_services_negative.py
index 51c711f..63d97a3 100644
--- a/tempest/api/object_storage/test_container_services_negative.py
+++ b/tempest/api/object_storage/test_container_services_negative.py
@@ -66,7 +66,8 @@
     def test_create_container_metadata_name_exceeds_max_length(self):
         """Test creating container with metadata name longer than max"""
         max_length = self.constraints['max_meta_name_length']
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         metadata_name = 'X-Container-Meta-' + data_utils.arbitrary_string(
             size=max_length + 1)
         metadata = {metadata_name: 'penguin'}
@@ -84,7 +85,8 @@
     def test_create_container_metadata_value_exceeds_max_length(self):
         """Test creating container with metadata value longer than max"""
         max_length = self.constraints['max_meta_value_length']
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         metadata_value = data_utils.arbitrary_string(size=max_length + 1)
         metadata = {'X-Container-Meta-animal': metadata_value}
         ex = self.assertRaises(
@@ -101,7 +103,8 @@
     def test_create_container_metadata_exceeds_overall_metadata_count(self):
         """Test creating container with metadata exceeding default count"""
         max_count = self.constraints['max_meta_count']
-        container_name = data_utils.rand_name(name='TestContainer')
+        container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         metadata = {}
         for i in range(max_count + 1):
             metadata['X-Container-Meta-animal-' + str(i)] = 'penguin'
diff --git a/tempest/api/object_storage/test_container_sync.py b/tempest/api/object_storage/test_container_sync.py
index b31ff76..e2c9d54 100644
--- a/tempest/api/object_storage/test_container_sync.py
+++ b/tempest/api/object_storage/test_container_sync.py
@@ -19,6 +19,7 @@
 import testtools
 
 from tempest.api.object_storage import base
+from tempest.common import object_storage
 from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
@@ -68,13 +69,17 @@
             int(container_sync_timeout / cls.container_sync_interval)
 
         # define container and object clients
-        cls.clients[data_utils.rand_name(name='TestContainerSync')] = \
+        cls.clients[data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='TestContainerSync')] = \
             (cls.container_client, cls.object_client)
-        cls.clients[data_utils.rand_name(name='TestContainerSync')] = \
+        cls.clients[data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='TestContainerSync')] = \
             (cls.container_client_alt, cls.object_client_alt)
         for cont_name, client in cls.clients.items():
             client[0].create_container(cont_name)
-            cls.addClassResourceCleanup(base.delete_containers,
+            cls.addClassResourceCleanup(object_storage.delete_containers,
                                         cont_name,
                                         client[0],
                                         client[1])
@@ -91,7 +96,9 @@
             headers = make_headers(cont[1], cont_client[1])
             cont_client[0].put(str(cont[0]), body=None, headers=headers)
             # create object in container
-            object_name = data_utils.rand_name(name='TestSyncObject')
+            object_name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='TestSyncObject')
             data = object_name[::-1].encode()  # Raw data, we need bytes
             obj_client[0].create_object(cont[0], object_name, data)
             self.objects.append(object_name)
diff --git a/tempest/api/object_storage/test_object_formpost.py b/tempest/api/object_storage/test_object_formpost.py
index 39e895e..3231c0a 100644
--- a/tempest/api/object_storage/test_object_formpost.py
+++ b/tempest/api/object_storage/test_object_formpost.py
@@ -19,9 +19,12 @@
 
 from tempest.api.object_storage import base
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class ObjectFormPostTest(base.BaseObjectTest):
     """Test object post with form"""
@@ -33,7 +36,8 @@
     def resource_setup(cls):
         super(ObjectFormPostTest, cls).resource_setup()
         cls.container_name = cls.create_container()
-        cls.object_name = data_utils.rand_name(name='ObjectTemp')
+        cls.object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='ObjectTemp')
 
         cls.key = 'Meta'
         cls.metadata = {'Temp-URL-Key': cls.key}
diff --git a/tempest/api/object_storage/test_object_formpost_negative.py b/tempest/api/object_storage/test_object_formpost_negative.py
index 971a223..c15ce1b 100644
--- a/tempest/api/object_storage/test_object_formpost_negative.py
+++ b/tempest/api/object_storage/test_object_formpost_negative.py
@@ -19,10 +19,13 @@
 
 from tempest.api.object_storage import base
 from tempest.common import utils
+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
 
+CONF = config.CONF
+
 
 class ObjectFormPostNegativeTest(base.BaseObjectTest):
     """Negative tests of object post with form"""
@@ -34,7 +37,8 @@
     def resource_setup(cls):
         super(ObjectFormPostNegativeTest, cls).resource_setup()
         cls.container_name = cls.create_container()
-        cls.object_name = data_utils.rand_name(name='ObjectTemp')
+        cls.object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='ObjectTemp')
 
         cls.key = 'Meta'
         cls.metadata = {'Temp-URL-Key': cls.key}
diff --git a/tempest/api/object_storage/test_object_services.py b/tempest/api/object_storage/test_object_services.py
index 61b9136..8110915 100644
--- a/tempest/api/object_storage/test_object_services.py
+++ b/tempest/api/object_storage/test_object_services.py
@@ -43,7 +43,8 @@
 
     def _upload_segments(self):
         # create object
-        object_name = data_utils.rand_name(name='LObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='LObject')
         data = data_utils.arbitrary_string()
         segments = 10
         data_segments = [data + str(i) for i in range(segments)]
@@ -56,7 +57,8 @@
         return object_name, data_segments
 
     def _copy_object_2d(self, src_object_name, metadata=None):
-        dst_object_name = data_utils.rand_name(name='TestObject')
+        dst_object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         resp, _ = self.object_client.copy_object_2d_way(self.container_name,
                                                         src_object_name,
                                                         dst_object_name,
@@ -81,12 +83,14 @@
     def test_create_object(self):
         """Test creating object and checking the object's uploaded content"""
         # create object
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         resp, _ = self.object_client.create_object(self.container_name,
                                                    object_name, data)
         # create another object
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         resp, _ = self.object_client.create_object(self.container_name,
                                                    object_name, data)
@@ -100,7 +104,8 @@
     @decorators.idempotent_id('5daebb1d-f0d5-4dc9-b541-69672eff00b0')
     def test_create_object_with_content_disposition(self):
         """Test creating object with content-disposition"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         metadata = {}
         metadata['content-disposition'] = 'inline'
@@ -122,7 +127,8 @@
     @decorators.idempotent_id('605f8317-f945-4bee-ae91-013f1da8f0a0')
     def test_create_object_with_content_encoding(self):
         """Test creating object with content-encoding"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
 
         # put compressed string
         data_before = b'x' * 2000
@@ -149,7 +155,8 @@
     @decorators.idempotent_id('73820093-0503-40b1-a478-edf0e69c7d1f')
     def test_create_object_with_etag(self):
         """Test creating object with Etag"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         create_md5 = md5(data, usedforsecurity=False).hexdigest()
         metadata = {'Etag': create_md5}
@@ -168,7 +175,8 @@
     @decorators.idempotent_id('84dafe57-9666-4f6d-84c8-0814d37923b8')
     def test_create_object_with_expect_continue(self):
         """Test creating object with expect_continue"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
 
         status, _ = self.object_client.create_object_continue(
@@ -184,7 +192,8 @@
     @decorators.idempotent_id('4f84422a-e2f2-4403-b601-726a4220b54e')
     def test_create_object_with_transfer_encoding(self):
         """Test creating object with transfer_encoding"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes(1024)
         resp, _ = self.object_client.create_object(
             self.container_name,
@@ -205,14 +214,16 @@
 
         The previous added metadata will be cleared.
         """
-        object_name_base = data_utils.rand_name(name='TestObject')
+        object_name_base = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         metadata_1 = {'X-Object-Meta-test-meta': 'Meta'}
         self.object_client.create_object(self.container_name,
                                          object_name_base,
                                          data,
                                          metadata=metadata_1)
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         metadata_2 = {'X-Copy-From': '%s/%s' % (self.container_name,
                                                 object_name_base),
                       'X-Fresh-Metadata': 'true'}
@@ -231,7 +242,8 @@
     @decorators.idempotent_id('1c7ed3e4-2099-406b-b843-5301d4811baf')
     def test_create_object_with_x_object_meta(self):
         """Test creating object with x-object-meta"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         metadata = {'X-Object-Meta-test-meta': 'Meta'}
         resp, _ = self.object_client.create_object(
@@ -250,7 +262,8 @@
     @decorators.idempotent_id('e4183917-33db-4153-85cc-4dacbb938865')
     def test_create_object_with_x_object_metakey(self):
         """Test creating object with the blank value of metadata"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         metadata = {'X-Object-Meta-test-meta': ''}
         resp, _ = self.object_client.create_object(
@@ -272,7 +285,8 @@
 
         The metadata will be removed from the object.
         """
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         metadata_add = {'X-Object-Meta-test-meta': 'Meta'}
         self.object_client.create_object(self.container_name,
@@ -299,7 +313,8 @@
         Creating object with blank metadata 'X-Remove-Object-Meta-test-meta',
         metadata 'x-object-meta-test-meta' will be removed from the object.
         """
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         metadata_add = {'X-Object-Meta-test-meta': 'Meta'}
         self.object_client.create_object(self.container_name,
@@ -322,7 +337,8 @@
     @decorators.idempotent_id('17738d45-03bd-4d45-9e0b-7b2f58f98687')
     def test_delete_object(self):
         """Test deleting object"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         resp, _ = self.object_client.create_object(self.container_name,
                                                    object_name, data)
@@ -353,7 +369,8 @@
     @decorators.idempotent_id('48650ed0-c189-4e1e-ad6b-1d4770c6e134')
     def test_update_object_metadata_with_remove_metadata(self):
         """Test updating object metadata with remove metadata"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         create_metadata = {'X-Object-Meta-test-meta1': 'Meta1'}
         self.object_client.create_object(self.container_name,
@@ -381,7 +398,8 @@
         request, both operations will succeed.
         """
         # creation and deletion of metadata with one request
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         create_metadata = {'X-Object-Meta-test-meta1': 'Meta1'}
         self.object_client.create_object(self.container_name,
@@ -450,7 +468,8 @@
     @decorators.idempotent_id('9a88dca4-b684-425b-806f-306cd0e57e42')
     def test_update_object_metadata_with_x_remove_object_metakey(self):
         """Test updating object metadata with blank remove metadata value"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.arbitrary_string()
         create_metadata = {'X-Object-Meta-test-meta': 'Meta'}
         self.object_client.create_object(self.container_name,
@@ -474,7 +493,8 @@
     @decorators.idempotent_id('9a447cf6-de06-48de-8226-a8c6ed31caf2')
     def test_list_object_metadata(self):
         """Test listing object metadata"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         metadata = {'X-Object-Meta-test-meta': 'Meta'}
         self.object_client.create_object(self.container_name,
@@ -556,7 +576,8 @@
     @decorators.idempotent_id('005f9bf6-e06d-41ec-968e-96c78e0b1d82')
     def test_get_object_with_metadata(self):
         """Test getting object with metadata"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         metadata = {'X-Object-Meta-test-meta': 'Meta'}
         self.object_client.create_object(self.container_name,
@@ -575,7 +596,8 @@
     @decorators.idempotent_id('05a1890e-7db9-4a6c-90a8-ce998a2bddfa')
     def test_get_object_with_range(self):
         """Test getting object with range"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes(100)
         self.object_client.create_object(self.container_name,
                                          object_name,
@@ -636,7 +658,8 @@
     @decorators.idempotent_id('c05b4013-e4de-47af-be84-e598062b16fc')
     def test_get_object_with_if_match(self):
         """Test getting object with if_match"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes(10)
         create_md5 = md5(data, usedforsecurity=False).hexdigest()
         create_metadata = {'Etag': create_md5}
@@ -656,7 +679,8 @@
     @decorators.idempotent_id('be133639-e5d2-4313-9b1f-2d59fc054a16')
     def test_get_object_with_if_modified_since(self):
         """Test getting object with if_modified_since"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         time_now = time.time()
         self.object_client.create_object(self.container_name,
@@ -676,7 +700,8 @@
     @decorators.idempotent_id('641500d5-1612-4042-a04d-01fc4528bc30')
     def test_get_object_with_if_none_match(self):
         """Test getting object with if_none_match"""
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         data = data_utils.random_bytes()
         create_md5 = md5(data, usedforsecurity=False).hexdigest()
         create_metadata = {'Etag': create_md5}
@@ -727,13 +752,15 @@
     def test_copy_object_in_same_container(self):
         """Test copying object to another object in same container"""
         # create source object
-        src_object_name = data_utils.rand_name(name='SrcObject')
+        src_object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='SrcObject')
         src_data = data_utils.random_bytes(size=len(src_object_name) * 2)
         resp, _ = self.object_client.create_object(self.container_name,
                                                    src_object_name,
                                                    src_data)
         # create destination object
-        dst_object_name = data_utils.rand_name(name='DstObject')
+        dst_object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='DstObject')
         dst_data = data_utils.random_bytes(size=len(dst_object_name) * 3)
         resp, _ = self.object_client.create_object(self.container_name,
                                                    dst_object_name,
@@ -784,12 +811,14 @@
     def test_copy_object_2d_way(self):
         """Test copying object's data to the new object using COPY"""
         # create source object
-        src_object_name = data_utils.rand_name(name='SrcObject')
+        src_object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='SrcObject')
         src_data = data_utils.random_bytes(size=len(src_object_name) * 2)
         resp, _ = self.object_client.create_object(self.container_name,
                                                    src_object_name, src_data)
         # create destination object
-        dst_object_name = data_utils.rand_name(name='DstObject')
+        dst_object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='DstObject')
         dst_data = data_utils.random_bytes(size=len(dst_object_name) * 3)
         resp, _ = self.object_client.create_object(self.container_name,
                                                    dst_object_name, dst_data)
@@ -809,22 +838,28 @@
     def test_copy_object_across_containers(self):
         """Test copying object to another container"""
         # create a container to use as a source container
-        src_container_name = data_utils.rand_name(name='TestSourceContainer')
+        src_container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='TestSourceContainer')
         self.container_client.update_container(src_container_name)
         self.containers.append(src_container_name)
         # create a container to use as a destination container
         dst_container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
             name='TestDestinationContainer')
         self.container_client.update_container(dst_container_name)
         self.containers.append(dst_container_name)
         # create object in source container
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         data = data_utils.random_bytes(size=len(object_name) * 2)
         resp, _ = self.object_client.create_object(src_container_name,
                                                    object_name, data)
         # set object metadata
-        meta_key = data_utils.rand_name(name='test')
-        meta_value = data_utils.rand_name(name='MetaValue')
+        meta_key = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='test')
+        meta_value = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='MetaValue')
         orig_metadata = {'X-Object-Meta-' + meta_key: meta_value}
         resp, _ = self.object_client.create_or_update_object_metadata(
             src_container_name,
@@ -924,7 +959,8 @@
     def test_object_upload_in_segments(self):
         """Test uploading object in segments"""
         # create object
-        object_name = data_utils.rand_name(name='LObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='LObject')
         data = data_utils.arbitrary_string()
         segments = 10
         data_segments = [data + str(i) for i in range(segments)]
@@ -1014,7 +1050,8 @@
 
     def setUp(self):
         super(PublicObjectTest, self).setUp()
-        self.container_name = data_utils.rand_name(name='TestContainer')
+        self.container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestContainer')
         self.container_client.update_container(self.container_name)
         self.containers.append(self.container_name)
 
@@ -1039,7 +1076,8 @@
         self.assertHeaders(resp_meta, 'Container', 'POST')
 
         # create object
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         data = data_utils.random_bytes(size=len(object_name))
         resp, _ = self.object_client.create_object(self.container_name,
                                                    object_name, data)
@@ -1079,7 +1117,8 @@
         self.assertHeaders(resp_meta, 'Container', 'POST')
 
         # create object
-        object_name = data_utils.rand_name(name='Object')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Object')
         data = data_utils.random_bytes(size=len(object_name))
         resp, _ = self.object_client.create_object(self.container_name,
                                                    object_name, data)
diff --git a/tempest/api/object_storage/test_object_slo.py b/tempest/api/object_storage/test_object_slo.py
index 22d12ce..b8e0b55 100644
--- a/tempest/api/object_storage/test_object_slo.py
+++ b/tempest/api/object_storage/test_object_slo.py
@@ -17,9 +17,11 @@
 from oslo_utils.secretutils import md5
 from tempest.api.object_storage import base
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
 # Each segment, except for the final one, must be at least 1 megabyte
 MIN_SEGMENT_SIZE = 1024 * 1024
 
@@ -47,7 +49,8 @@
 
     def _create_manifest(self):
         # Create a manifest file for SLO uploading
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         object_name_base_1 = object_name + '_01'
         object_name_base_2 = object_name + '_02'
         data_size = MIN_SEGMENT_SIZE
@@ -80,7 +83,8 @@
         manifest = self._create_manifest()
 
         params = {'multipart-manifest': 'put'}
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         self._create_object(self.container_name,
                             object_name,
                             manifest,
@@ -109,7 +113,8 @@
         manifest = self._create_manifest()
 
         params = {'multipart-manifest': 'put'}
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         resp = self._create_object(self.container_name,
                                    object_name,
                                    manifest,
diff --git a/tempest/api/object_storage/test_object_temp_url_negative.py b/tempest/api/object_storage/test_object_temp_url_negative.py
index 712697e..d63a3cb 100644
--- a/tempest/api/object_storage/test_object_temp_url_negative.py
+++ b/tempest/api/object_storage/test_object_temp_url_negative.py
@@ -67,7 +67,8 @@
             self.key)
 
         # create object
-        self.object_name = data_utils.rand_name(name='ObjectTemp')
+        self.object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='ObjectTemp')
         content = data_utils.arbitrary_string(size=len(self.object_name),
                                               base_text=self.object_name)
         self.object_client.create_object(self.container_name,
diff --git a/tempest/api/object_storage/test_object_version.py b/tempest/api/object_storage/test_object_version.py
index b64b172..02b3be7 100644
--- a/tempest/api/object_storage/test_object_version.py
+++ b/tempest/api/object_storage/test_object_version.py
@@ -16,6 +16,7 @@
 import testtools
 
 from tempest.api.object_storage import base
+from tempest.common import object_storage
 from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
@@ -51,28 +52,33 @@
         6. delete object version 1
         """
         # create container
-        vers_container_name = data_utils.rand_name(name='TestVersionContainer')
+        vers_container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='TestVersionContainer')
         resp, _ = self.container_client.update_container(vers_container_name)
-        self.addCleanup(base.delete_containers,
+        self.addCleanup(object_storage.delete_containers,
                         [vers_container_name],
                         self.container_client,
                         self.object_client)
         self.assertHeaders(resp, 'Container', 'PUT')
         self.assertContainer(vers_container_name, '0', '0', 'Missing Header')
 
-        base_container_name = data_utils.rand_name(name='TestBaseContainer')
+        base_container_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='TestBaseContainer')
         headers = {'X-versions-Location': vers_container_name}
         resp, _ = self.container_client.update_container(
             base_container_name,
             **headers)
-        self.addCleanup(base.delete_containers,
+        self.addCleanup(object_storage.delete_containers,
                         [base_container_name],
                         self.container_client,
                         self.object_client)
         self.assertHeaders(resp, 'Container', 'PUT')
         self.assertContainer(base_container_name, '0', '0',
                              vers_container_name)
-        object_name = data_utils.rand_name(name='TestObject')
+        object_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='TestObject')
         # create object
         data_1 = data_utils.random_bytes()
         resp, _ = self.object_client.create_object(base_container_name,
diff --git a/tempest/api/volume/admin/test_group_snapshots.py b/tempest/api/volume/admin/test_group_snapshots.py
index 8af8435..d059926 100644
--- a/tempest/api/volume/admin/test_group_snapshots.py
+++ b/tempest/api/volume/admin/test_group_snapshots.py
@@ -35,7 +35,8 @@
     def _create_group_snapshot(self, **kwargs):
         if 'name' not in kwargs:
             kwargs['name'] = data_utils.rand_name(
-                self.__class__.__name__ + '-Group_Snapshot')
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + '-Group_Snapshot')
 
         group_snapshot = self.group_snapshots_client.create_group_snapshot(
             **kwargs)['group_snapshot']
@@ -93,7 +94,8 @@
 
         # Create volume is instance level, can not be deleted before group.
         # Volume delete handled by delete_group method, cleanup method.
-        params = {'name': data_utils.rand_name("volume"),
+        prefix = CONF.resource_name_prefix
+        params = {'name': data_utils.rand_name(prefix=prefix, name="volume"),
                   'volume_type': volume_type['id'],
                   'group_id': grp['id'],
                   'size': CONF.volume.volume_size}
@@ -102,7 +104,8 @@
             self.volumes_client, vol['id'], 'available')
 
         # Create group snapshot
-        group_snapshot_name = data_utils.rand_name('group_snapshot')
+        group_snapshot_name = data_utils.rand_name(prefix=prefix,
+                                                   name='group_snapshot')
         group_snapshot = self._create_group_snapshot(
             group_id=grp['id'], name=group_snapshot_name)
         snapshots = self.snapshots_client.list_snapshots(
@@ -161,7 +164,8 @@
 
         # Create volume is instance level, can not be deleted before group.
         # Volume delete handled by delete_group method, cleanup method.
-        params = {'name': data_utils.rand_name("volume"),
+        prefix = CONF.resource_name_prefix
+        params = {'name': data_utils.rand_name(prefix=prefix, name="volume"),
                   'volume_type': volume_type['id'],
                   'group_id': grp['id'],
                   'size': CONF.volume.volume_size}
@@ -170,7 +174,8 @@
             self.volumes_client, vol['id'], 'available')
 
         # Create group_snapshot
-        group_snapshot_name = data_utils.rand_name('group_snapshot')
+        group_snapshot_name = data_utils.rand_name(prefix=prefix,
+                                                   name='group_snapshot')
         group_snapshot = self._create_group_snapshot(
             group_id=grp['id'], name=group_snapshot_name)
         self.assertEqual(group_snapshot_name, group_snapshot['name'])
@@ -182,7 +187,7 @@
                     self.snapshots_client, snap['id'], 'available')
 
         # Create Group from Group snapshot
-        grp_name2 = data_utils.rand_name('Group_from_snap')
+        grp_name2 = data_utils.rand_name(prefix=prefix, name='Group_from_snap')
         grp2 = self.groups_client.create_group_from_source(
             group_snapshot_id=group_snapshot['id'], name=grp_name2)['group']
         self.addCleanup(self.delete_group, grp2['id'])
@@ -219,7 +224,7 @@
         # Create a volume group
         grp = self.create_group(group_type=group_type['id'],
                                 volume_types=[volume_type['id']])
-
+        prefix = CONF.resource_name_prefix
         # Note: When dealing with consistency groups all volumes must
         # reside on the same backend. Adding volumes to the same consistency
         # group from multiple backends isn't supported. In order to ensure all
@@ -229,7 +234,8 @@
         for _ in range(2):
             # Create volume is instance level, can't be deleted before group.
             # Volume delete handled by delete_group method, cleanup method.
-            params = {'name': data_utils.rand_name("volume"),
+            params = {'name': data_utils.rand_name(prefix=prefix,
+                                                   name="volume"),
                       'volume_type': volume_type['id'],
                       'group_id': grp['id'],
                       'size': CONF.volume.volume_size}
@@ -287,9 +293,10 @@
         group = self.create_group(group_type=group_type['id'],
                                   volume_types=[volume_type['id']])
 
+        prefix = CONF.resource_name_prefix
         # Create volume is instance level, can not be deleted before group.
         # Volume delete handled by delete_group method, cleanup method.
-        params = {'name': data_utils.rand_name("volume"),
+        params = {'name': data_utils.rand_name(prefix=prefix, name="volume"),
                   'volume_type': volume_type['id'],
                   'group_id': group['id'],
                   'size': CONF.volume.volume_size}
diff --git a/tempest/api/volume/admin/test_group_types.py b/tempest/api/volume/admin/test_group_types.py
index 406af27..03ff340 100644
--- a/tempest/api/volume/admin/test_group_types.py
+++ b/tempest/api/volume/admin/test_group_types.py
@@ -14,9 +14,12 @@
 #    under the License.
 
 from tempest.api.volume import base
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class GroupTypesTest(base.BaseVolumeAdminTest):
     """Test group types"""
@@ -27,8 +30,12 @@
     @decorators.idempotent_id('dd71e5f9-393e-4d4f-90e9-fa1b8d278864')
     def test_group_type_create_list_update_show_delete(self):
         """Test create/list/update/show/delete group type"""
-        name = data_utils.rand_name(self.__class__.__name__ + '-group-type')
-        description = data_utils.rand_name("group-type-description")
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-group-type')
+        description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="group-type-description")
         group_specs = {"consistent_group_snapshot_enabled": "<is> False"}
         params = {'name': name,
                   'description': description,
@@ -50,7 +57,8 @@
 
         update_params = {
             'name': data_utils.rand_name(
-                self.__class__.__name__ + '-updated-group-type'),
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + '-updated-group-type'),
             'description': 'updated-group-type-desc'
         }
         updated_group_type = self.admin_group_types_client.update_group_type(
@@ -75,8 +83,10 @@
     @decorators.idempotent_id('3d5e5cec-72b4-4511-b135-7cc2b7a053ae')
     def test_group_type_list_by_optional_params(self):
         """Test list group type sort/public"""
-        type_a_name = "a_{}".format(data_utils.rand_name('group-type'))
-        type_b_name = "b_{}".format(data_utils.rand_name('group-type'))
+        type_a_name = "a_{}".format(data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='group-type'))
+        type_b_name = "b_{}".format(data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='group-type'))
         self.create_group_type(name=type_a_name, **{'is_public': True})
         self.create_group_type(name=type_b_name, **{'is_public': False})
 
diff --git a/tempest/api/volume/admin/test_groups.py b/tempest/api/volume/admin/test_groups.py
index 094f142..8f74769 100644
--- a/tempest/api/volume/admin/test_groups.py
+++ b/tempest/api/volume/admin/test_groups.py
@@ -38,20 +38,23 @@
         group_type = self.create_group_type()
 
         # Create group
-        grp1_name = data_utils.rand_name('Group1')
+        grp1_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Group1')
         grp1 = self.create_group(group_type=group_type['id'],
                                  volume_types=[volume_type['id']],
                                  name=grp1_name)
         grp1_id = grp1['id']
 
-        grp2_name = data_utils.rand_name('Group2')
+        grp2_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='Group2')
         grp2 = self.create_group(group_type=group_type['id'],
                                  volume_types=[volume_type['id']],
                                  name=grp2_name)
         grp2_id = grp2['id']
 
         # Create volume
-        vol1_name = data_utils.rand_name("volume")
+        vol1_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name="volume")
         params = {'name': vol1_name,
                   'volume_type': volume_type['id'],
                   'group_id': grp1['id'],
@@ -108,11 +111,13 @@
         grp = self.create_group(group_type=group_type['id'],
                                 volume_types=[volume_type['id']])
 
+        prefix = CONF.resource_name_prefix
         # Create volume is instance level, can not be deleted before group.
         # Volume delete handled by delete_group method, cleanup method.
         grp_vols = []
         for _ in range(2):
-            params = {'name': data_utils.rand_name("volume"),
+            params = {'name': data_utils.rand_name(prefix=prefix,
+                                                   name="volume"),
                       'volume_type': volume_type['id'],
                       'group_id': grp['id'],
                       'size': CONF.volume.volume_size}
@@ -177,9 +182,10 @@
         grp = self.create_group(group_type=group_type['id'],
                                 volume_types=[volume_type['id']])
 
+        prefix = CONF.resource_name_prefix
         # Create volume is instance level, can not be deleted before group.
         # Volume delete handled by delete_group method, cleanup method.
-        params = {'name': data_utils.rand_name("volume"),
+        params = {'name': data_utils.rand_name(prefix=prefix, name="volume"),
                   'volume_type': volume_type['id'],
                   'group_id': grp['id'],
                   'size': CONF.volume.volume_size}
@@ -188,7 +194,7 @@
             self.volumes_client, vol['id'], 'available')
 
         # Create Group from Group
-        grp_name2 = data_utils.rand_name('Group_from_grp')
+        grp_name2 = data_utils.rand_name(prefix=prefix, name='Group_from_grp')
         grp2 = self.groups_client.create_group_from_source(
             source_group_id=grp['id'], name=grp_name2)['group']
         self.addCleanup(self.delete_group, grp2['id'])
diff --git a/tempest/api/volume/admin/test_multi_backend.py b/tempest/api/volume/admin/test_multi_backend.py
index 83733bd..028bf1a 100644
--- a/tempest/api/volume/admin/test_multi_backend.py
+++ b/tempest/api/volume/admin/test_multi_backend.py
@@ -54,8 +54,12 @@
     @classmethod
     def _create_type_and_volume(cls, backend_name_key, with_prefix):
         # Volume/Type creation
-        type_name = data_utils.rand_name(cls.__name__ + '-Type')
-        vol_name = data_utils.rand_name(cls.__name__ + '-Volume')
+        type_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__name__ + '-Type')
+        vol_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=cls.__name__ + '-Volume')
         spec_key_with_prefix = "capabilities:volume_backend_name"
         spec_key_without_prefix = "volume_backend_name"
         if with_prefix:
diff --git a/tempest/api/volume/admin/test_qos.py b/tempest/api/volume/admin/test_qos.py
index e31c0ef..83f7e21 100644
--- a/tempest/api/volume/admin/test_qos.py
+++ b/tempest/api/volume/admin/test_qos.py
@@ -14,9 +14,12 @@
 
 from tempest.api.volume import base
 from tempest.common import waiters
+from tempest import config
 from tempest.lib.common.utils import data_utils as utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class QosSpecsTestJSON(base.BaseVolumeAdminTest):
     """Test the Cinder QoS-specs.
@@ -30,7 +33,8 @@
         super(QosSpecsTestJSON, cls).resource_setup()
         # Create admin qos client
         # Create a test shared qos-specs for tests
-        cls.qos_name = utils.rand_name(cls.__name__ + '-QoS')
+        cls.qos_name = utils.rand_name(
+            cls.__name__ + '-QoS', prefix=CONF.resource_name_prefix)
         cls.qos_consumer = 'front-end'
 
         cls.created_qos = cls.create_test_qos_specs(cls.qos_name,
@@ -38,7 +42,8 @@
                                                     read_iops_sec='2000')
 
     def _create_delete_test_qos_with_given_consumer(self, consumer):
-        name = utils.rand_name(self.__class__.__name__ + '-qos')
+        name = utils.rand_name(
+            self.__class__.__name__ + '-qos', prefix=CONF.resource_name_prefix)
         qos = {'name': name, 'consumer': consumer}
         body = self.create_test_qos_specs(name, consumer)
         for key in ['name', 'consumer']:
diff --git a/tempest/api/volume/admin/test_snapshot_manage.py b/tempest/api/volume/admin/test_snapshot_manage.py
index 478bd16..aed1010 100644
--- a/tempest/api/volume/admin/test_snapshot_manage.py
+++ b/tempest/api/volume/admin/test_snapshot_manage.py
@@ -77,10 +77,12 @@
         self.assertNotIn(snapshot['id'], [v['id'] for v in all_snapshots])
 
         # Manage the snapshot
-        name = data_utils.rand_name(self.__class__.__name__ +
-                                    '-Managed-Snapshot')
-        description = data_utils.rand_name(self.__class__.__name__ +
-                                           '-Managed-Snapshot-Description')
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Managed-Snapshot')
+        description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Managed-Snapshot-Description')
         metadata = {"manage-snap-meta1": "value1",
                     "manage-snap-meta2": "value2",
                     "manage-snap-meta3": "value3"}
diff --git a/tempest/api/volume/admin/test_user_messages.py b/tempest/api/volume/admin/test_user_messages.py
index 00b7f3a..3443b87 100644
--- a/tempest/api/volume/admin/test_user_messages.py
+++ b/tempest/api/volume/admin/test_user_messages.py
@@ -29,12 +29,16 @@
 
     def _create_user_message(self):
         """Trigger a 'no valid host' situation to generate a message."""
-        bad_protocol = data_utils.rand_name('storage_protocol')
-        bad_vendor = data_utils.rand_name('vendor_name')
+        bad_protocol = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='storage_protocol')
+        bad_vendor = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='vendor_name')
         extra_specs = {'storage_protocol': bad_protocol,
                        'vendor_name': bad_vendor}
         vol_type_name = data_utils.rand_name(
-            self.__class__.__name__ + '-volume-type')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-volume-type')
         bogus_type = self.create_volume_type(
             name=vol_type_name, extra_specs=extra_specs)
         params = {'volume_type': bogus_type['id'],
diff --git a/tempest/api/volume/admin/test_volume_manage.py b/tempest/api/volume/admin/test_volume_manage.py
index 1e4e7cb..609ec15 100644
--- a/tempest/api/volume/admin/test_volume_manage.py
+++ b/tempest/api/volume/admin/test_volume_manage.py
@@ -58,7 +58,8 @@
 
         # Manage volume
         new_vol_name = data_utils.rand_name(
-            self.__class__.__name__ + '-volume')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-volume')
         new_vol_ref = {
             'name': new_vol_name,
             'host': org_vol_info['os-vol-host-attr:host'],
diff --git a/tempest/api/volume/admin/test_volume_quota_classes.py b/tempest/api/volume/admin/test_volume_quota_classes.py
index f482788..fb2adc7 100644
--- a/tempest/api/volume/admin/test_volume_quota_classes.py
+++ b/tempest/api/volume/admin/test_volume_quota_classes.py
@@ -21,9 +21,11 @@
 from tempest.api.volume import base
 from tempest.common import identity
 from tempest.common import tempest_fixtures as fixtures
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
 LOG = logging.getLogger(__name__)
 QUOTA_KEYS = ['gigabytes', 'snapshots', 'volumes', 'backups',
               'backup_gigabytes', 'per_volume_gigabytes']
@@ -96,8 +98,11 @@
                         matchers.ContainsAll(update_kwargs.items()))
 
         # Verify a new project's default quotas.
-        project_name = data_utils.rand_name('quota_class_tenant')
-        description = data_utils.rand_name('desc_')
+        project_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='quota_class_tenant')
+        description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='desc_')
         project_id = identity.identity_utils(self.os_admin).create_project(
             name=project_name, description=description)['id']
         self.addCleanup(identity.identity_utils(self.os_admin).delete_project,
diff --git a/tempest/api/volume/admin/test_volume_types.py b/tempest/api/volume/admin/test_volume_types.py
index 98ae83b..5b17afb 100644
--- a/tempest/api/volume/admin/test_volume_types.py
+++ b/tempest/api/volume/admin/test_volume_types.py
@@ -36,7 +36,9 @@
     def test_volume_crud_with_volume_type_and_extra_specs(self):
         """Test create/update/get/delete volume with volume_type"""
         volume_types = list()
-        vol_name = data_utils.rand_name(self.__class__.__name__ + '-volume')
+        vol_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-volume')
         proto = CONF.volume.storage_protocol
         vendor = CONF.volume.vendor_name
         extra_specs = {"storage_protocol": proto,
@@ -82,8 +84,12 @@
     @decorators.idempotent_id('4e955c3b-49db-4515-9590-0c99f8e471ad')
     def test_volume_type_create_get_delete(self):
         """Test create/get/delete volume type"""
-        name = data_utils.rand_name(self.__class__.__name__ + '-volume-type')
-        description = data_utils.rand_name("volume-type-description")
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-volume-type')
+        description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="volume-type-description")
         proto = CONF.volume.storage_protocol
         vendor = CONF.volume.vendor_name
         extra_specs = {"storage_protocol": proto,
@@ -183,8 +189,12 @@
         volume_type = self.create_volume_type()
 
         # New volume type details
-        name = data_utils.rand_name("volume-type")
-        description = data_utils.rand_name("volume-type-description")
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="volume-type")
+        description = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="volume-type-description")
         is_public = not volume_type['is_public']
 
         # Update volume type details
diff --git a/tempest/api/volume/admin/test_volumes_backup.py b/tempest/api/volume/admin/test_volumes_backup.py
index 835cc1d..c1f753a 100644
--- a/tempest/api/volume/admin/test_volumes_backup.py
+++ b/tempest/api/volume/admin/test_volumes_backup.py
@@ -59,7 +59,9 @@
         """
         volume = self.create_volume()
         # Create backup
-        backup_name = data_utils.rand_name(self.__class__.__name__ + '-Backup')
+        backup_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Backup')
         backup = self.create_backup(volume_id=volume['id'], name=backup_name)
         waiters.wait_for_volume_resource_status(self.volumes_client,
                                                 volume['id'], 'available')
@@ -124,7 +126,8 @@
         volume = self.create_volume()
         # Create a backup
         backup_name = data_utils.rand_name(
-            self.__class__.__name__ + '-Backup')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Backup')
         backup = self.create_backup(volume_id=volume['id'], name=backup_name)
         waiters.wait_for_volume_resource_status(self.volumes_client,
                                                 volume['id'], 'available')
diff --git a/tempest/api/volume/base.py b/tempest/api/volume/base.py
index ad8f573..7a08545 100644
--- a/tempest/api/volume/base.py
+++ b/tempest/api/volume/base.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from tempest.common import compute
+from tempest.common import object_storage
 from tempest.common import waiters
 from tempest import config
 from tempest.lib.common import api_version_utils
@@ -68,6 +69,8 @@
         if CONF.service_available.glance:
             cls.images_client = cls.os_primary.image_client_v2
 
+        cls.container_client = cls.os_primary.container_client
+        cls.object_client = cls.os_primary.object_client
         cls.backups_client = cls.os_primary.backups_client_latest
         cls.volumes_client = cls.os_primary.volumes_client_latest
         cls.messages_client = cls.os_primary.volume_messages_client_latest
@@ -117,7 +120,9 @@
             kwargs['size'] = max(kwargs['size'], min_disk)
 
         if 'name' not in kwargs:
-            name = data_utils.rand_name(self.__name__ + '-Volume')
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__name__ + '-Volume')
             kwargs['name'] = name
 
         if CONF.volume.volume_type and 'volume_type' not in kwargs:
@@ -163,7 +168,9 @@
     def create_snapshot(self, volume_id=1, **kwargs):
         """Wrapper utility that returns a test snapshot."""
         if 'name' not in kwargs:
-            name = data_utils.rand_name(self.__name__ + '-Snapshot')
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__name__ + '-Snapshot')
             kwargs['name'] = name
 
         snapshot = self.snapshots_client.create_snapshot(
@@ -174,16 +181,36 @@
                                                 snapshot['id'], 'available')
         return snapshot
 
-    def create_backup(self, volume_id, backup_client=None, **kwargs):
+    def create_backup(self, volume_id, backup_client=None, object_client=None,
+                      container_client=None, **kwargs):
         """Wrapper utility that returns a test backup."""
         if backup_client is None:
             backup_client = self.backups_client
+        if container_client is None:
+            container_client = self.container_client
+        if object_client is None:
+            object_client = self.object_client
         if 'name' not in kwargs:
-            name = data_utils.rand_name(self.__class__.__name__ + '-Backup')
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + '-Backup')
             kwargs['name'] = name
 
+        if CONF.volume.backup_driver == "swift":
+            if 'container' not in kwargs:
+                cont_name = self.__class__.__name__ + '-backup-container'
+                cont = data_utils.rand_name(
+                    prefix=CONF.resource_name_prefix,
+                    name=cont_name)
+                kwargs['container'] = cont.lower()
+
+            self.addCleanup(object_storage.delete_containers,
+                            kwargs['container'], container_client,
+                            object_client)
+
         backup = backup_client.create_backup(
             volume_id=volume_id, **kwargs)['backup']
+
         # addCleanup uses list pop to cleanup. Wait should be added before
         # the backup is deleted
         self.addCleanup(backup_client.wait_for_resource_deletion,
@@ -227,7 +254,9 @@
     def create_server(self, wait_until='ACTIVE', **kwargs):
         name = kwargs.pop(
             'name',
-            data_utils.rand_name(self.__class__.__name__ + '-instance'))
+            data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + '-instance'))
 
         if wait_until == 'SSHABLE' and not kwargs.get('validation_resources'):
             # If we were asked for SSHABLE but were not provided with the
@@ -255,7 +284,8 @@
     def create_group(self, **kwargs):
         if 'name' not in kwargs:
             kwargs['name'] = data_utils.rand_name(
-                self.__class__.__name__ + '-Group')
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + '-Group')
 
         group = self.groups_client.create_group(**kwargs)['group']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -318,7 +348,9 @@
     @cleanup_order
     def create_test_qos_specs(self, name=None, consumer=None, **kwargs):
         """create a test Qos-Specs."""
-        name = name or data_utils.rand_name(self.__name__ + '-QoS')
+        name = name or data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__name__ + '-QoS')
         consumer = consumer or 'front-end'
         qos_specs = self.admin_volume_qos_client.create_qos(
             name=name, consumer=consumer, **kwargs)['qos_specs']
@@ -328,7 +360,9 @@
     @cleanup_order
     def create_volume_type(self, name=None, **kwargs):
         """Create a test volume-type"""
-        name = name or data_utils.rand_name(self.__name__ + '-volume-type')
+        name = name or data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__name__ + '-volume-type')
         volume_type = self.admin_volume_types_client.create_volume_type(
             name=name, **kwargs)['volume_type']
         self.cleanup(self.clear_volume_type, volume_type['id'])
@@ -358,7 +392,8 @@
     def create_group_type(self, name=None, **kwargs):
         """Create a test group-type"""
         name = name or data_utils.rand_name(
-            self.__class__.__name__ + '-group-type')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-group-type')
         group_type = self.admin_group_types_client.create_group_type(
             name=name, **kwargs)['group_type']
         self.addCleanup(self.admin_group_types_client.delete_group_type,
diff --git a/tempest/api/volume/test_volumes_actions.py b/tempest/api/volume/test_volumes_actions.py
index 5b50bfa..150677d 100644
--- a/tempest/api/volume/test_volumes_actions.py
+++ b/tempest/api/volume/test_volumes_actions.py
@@ -109,7 +109,8 @@
         # it is shared with the other tests. After it is uploaded in Glance,
         # there is no way to delete it from Cinder, so we delete it from Glance
         # using the Glance images_client and from Cinder via tearDownClass.
-        image_name = data_utils.rand_name(self.__class__.__name__ + '-Image')
+        image_name = data_utils.rand_name(self.__class__.__name__ + '-Image',
+                                          prefix=CONF.resource_name_prefix)
         body = self.volumes_client.upload_volume(
             self.volume['id'], image_name=image_name,
             disk_format=CONF.volume.disk_format)['os-volume_upload_image']
diff --git a/tempest/api/volume/test_volumes_backup.py b/tempest/api/volume/test_volumes_backup.py
index 89ff497..a3ba974 100644
--- a/tempest/api/volume/test_volumes_backup.py
+++ b/tempest/api/volume/test_volumes_backup.py
@@ -13,7 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import testtools
 from testtools import matchers
 
 from tempest.api.volume import base
@@ -53,8 +52,6 @@
                                                 'available')
         return restored_volume
 
-    @testtools.skipIf(CONF.volume.storage_protocol == 'ceph',
-                      'ceph does not support arbitrary container names')
     @decorators.idempotent_id('a66eb488-8ee1-47d4-8e9f-575a095728c6')
     def test_volume_backup_create_get_detailed_list_restore_delete(self):
         """Test create/get/list/restore/delete volume backup
@@ -75,22 +72,28 @@
         self.addCleanup(self.delete_volume, self.volumes_client, volume['id'])
 
         # Create a backup
-        backup_name = data_utils.rand_name(
-            self.__class__.__name__ + '-Backup')
-        description = data_utils.rand_name("volume-backup-description")
-        backup = self.create_backup(volume_id=volume['id'],
-                                    name=backup_name,
-                                    description=description,
-                                    container='container')
-        self.assertEqual(backup_name, backup['name'])
+        kwargs = {}
+        kwargs["name"] = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Backup')
+        kwargs["description"] = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name="backup-description")
+        if CONF.volume.backup_driver == "swift":
+            kwargs["container"] = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + '-backup-container').lower()
+        backup = self.create_backup(volume_id=volume['id'], **kwargs)
+        self.assertEqual(kwargs["name"], backup['name'])
         waiters.wait_for_volume_resource_status(self.volumes_client,
                                                 volume['id'], 'available')
 
         # Get a given backup
         backup = self.backups_client.show_backup(backup['id'])['backup']
-        self.assertEqual(backup_name, backup['name'])
-        self.assertEqual(description, backup['description'])
-        self.assertEqual('container', backup['container'])
+        self.assertEqual(kwargs["name"], backup['name'])
+        self.assertEqual(kwargs["description"], backup['description'])
+        if CONF.volume.backup_driver == "swift":
+            self.assertEqual(kwargs["container"], backup['container'])
 
         # Get all backups with detail
         backups = self.backups_client.list_backups(detail=True)['backups']
@@ -129,7 +132,8 @@
         self.attach_volume(server['id'], volume['id'])
         # Create backup using force flag
         backup_name = data_utils.rand_name(
-            self.__class__.__name__ + '-Backup')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Backup')
         backup = self.create_backup(volume_id=volume['id'],
                                     name=backup_name, force=True)
         waiters.wait_for_volume_resource_status(self.volumes_client,
@@ -168,6 +172,52 @@
 
         self.assertTrue(restored_volume_info['bootable'])
 
+    @decorators.idempotent_id('f86eff09-2a6d-43c1-905e-8079e5754f1e')
+    @utils.services('compute')
+    @decorators.related_bug('1703011')
+    def test_volume_backup_incremental(self):
+        """Test create a backup when latest incremental backup is deleted"""
+        # Create a volume
+        volume = self.create_volume()
+
+        # Create a server
+        server = self.create_server(wait_until='SSHABLE')
+
+        # Attach volume to the server
+        self.attach_volume(server['id'], volume['id'])
+
+        # Create a backup to the attached volume
+        backup1 = self.create_backup(volume['id'], force=True)
+
+        # Validate backup details
+        backup_info = self.backups_client.show_backup(backup1['id'])['backup']
+        self.assertEqual(False, backup_info['has_dependent_backups'])
+        self.assertEqual(False, backup_info['is_incremental'])
+
+        # Create another incremental backup
+        backup2 = self.backups_client.create_backup(
+            volume_id=volume['id'], incremental=True, force=True)['backup']
+        waiters.wait_for_volume_resource_status(self.backups_client,
+                                                backup2['id'], 'available')
+
+        # Validate incremental backup details
+        backup2_info = self.backups_client.show_backup(backup2['id'])['backup']
+        self.assertEqual(True, backup2_info['is_incremental'])
+        self.assertEqual(False, backup2_info['has_dependent_backups'])
+
+        # Delete the last incremental backup that was created
+        self.backups_client.delete_backup(backup2['id'])
+        self.backups_client.wait_for_resource_deletion(backup2['id'])
+
+        # Create another incremental backup
+        backup3 = self.create_backup(
+            volume_id=volume['id'], incremental=True, force=True)
+
+        # Validate incremental backup details
+        backup3_info = self.backups_client.show_backup(backup3['id'])['backup']
+        self.assertEqual(True, backup3_info['is_incremental'])
+        self.assertEqual(False, backup3_info['has_dependent_backups'])
+
 
 class VolumesBackupsV39Test(base.BaseVolumeTest):
     """Test volumes backup with volume microversion greater than 3.8"""
@@ -192,8 +242,12 @@
 
         # Update backup and assert response body for update_backup method
         update_kwargs = {
-            'name': data_utils.rand_name(self.__class__.__name__ + '-Backup'),
-            'description': data_utils.rand_name("volume-backup-description")
+            'name': data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + '-Backup'),
+            'description': data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name="volume-backup-description")
         }
         update_backup = self.backups_client.update_backup(
             backup['id'], **update_kwargs)['backup']
diff --git a/tempest/api/volume/test_volumes_get.py b/tempest/api/volume/test_volumes_get.py
index 2009970..9b79f38 100644
--- a/tempest/api/volume/test_volumes_get.py
+++ b/tempest/api/volume/test_volumes_get.py
@@ -31,7 +31,9 @@
 
     def _volume_create_get_update_delete(self, **kwargs):
         # Create a volume, Get it's details and Delete the volume
-        v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
+        v_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Volume')
         metadata = {'Type': 'Test'}
         # Create a volume
         kwargs['name'] = v_name
@@ -71,7 +73,8 @@
         self.volumes_client.update_volume(volume['id'], **params)
         # Test volume update when display_name is new
         new_v_name = data_utils.rand_name(
-            self.__class__.__name__ + '-new-Volume')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-new-Volume')
         new_desc = 'This is the new description of volume'
         params = {'name': new_v_name,
                   'description': new_desc}
@@ -94,7 +97,9 @@
         # Test volume create when display_name is none and display_description
         # contains specific characters,
         # then test volume update if display_name is duplicated
-        new_v_desc = data_utils.rand_name('@#$%^* description')
+        new_v_desc = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='@#$%^* description')
         params = {'description': new_v_desc,
                   'availability_zone': volume['availability_zone'],
                   'size': CONF.volume.volume_size}
diff --git a/tempest/api/volume/test_volumes_negative.py b/tempest/api/volume/test_volumes_negative.py
index d9b8430..d8480df 100644
--- a/tempest/api/volume/test_volumes_negative.py
+++ b/tempest/api/volume/test_volumes_negative.py
@@ -39,7 +39,9 @@
 
     def create_image(self):
         # Create image
-        image_name = data_utils.rand_name(self.__class__.__name__ + "-image")
+        image_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + "-image")
         image = self.images_client.create_image(
             name=image_name,
             container_format=CONF.image.container_formats[0],
@@ -133,8 +135,11 @@
     @decorators.idempotent_id('e66e40d6-65e6-4e75-bdc7-636792fa152d')
     def test_update_volume_with_invalid_volume_id(self):
         """Test updating volume with invalid volume id should fail"""
-        self.assertRaises(lib_exc.NotFound, self.volumes_client.update_volume,
-                          volume_id=data_utils.rand_name('invalid'), name="n")
+        self.assertRaises(
+            lib_exc.NotFound, self.volumes_client.update_volume,
+            volume_id=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name='invalid'), name="n")
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('72aeca85-57a5-4c1f-9057-f320f9ea575b')
@@ -147,8 +152,10 @@
     @decorators.idempotent_id('30799cfd-7ee4-446c-b66c-45b383ed211b')
     def test_get_invalid_volume_id(self):
         """Test getting volume with invalid volume id should fail"""
-        self.assertRaises(lib_exc.NotFound, self.volumes_client.show_volume,
-                          data_utils.rand_name('invalid'))
+        self.assertRaises(
+            lib_exc.NotFound, self.volumes_client.show_volume,
+            data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name='invalid'))
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('c6c3db06-29ad-4e91-beb0-2ab195fe49e3')
@@ -161,8 +168,10 @@
     @decorators.idempotent_id('1f035827-7c32-4019-9240-b4ec2dbd9dfd')
     def test_delete_invalid_volume_id(self):
         """Test deleting volume with invalid volume id should fail"""
-        self.assertRaises(lib_exc.NotFound, self.volumes_client.delete_volume,
-                          data_utils.rand_name('invalid'))
+        self.assertRaises(
+            lib_exc.NotFound, self.volumes_client.delete_volume,
+            data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name='invalid'))
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('441a1550-5d44-4b30-af0f-a6d402f52026')
@@ -268,7 +277,9 @@
     @decorators.idempotent_id('0f4aa809-8c7b-418f-8fb3-84c7a5dfc52f')
     def test_list_volumes_with_nonexistent_name(self):
         """Test listing volumes with non existent name should get nothing"""
-        v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
+        v_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Volume')
         params = {'name': v_name}
         fetched_volume = self.volumes_client.list_volumes(
             params=params)['volumes']
@@ -281,7 +292,9 @@
 
         Listing volume details with non existent name should get nothing.
         """
-        v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
+        v_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-Volume')
         params = {'name': v_name}
         fetched_volume = \
             self.volumes_client.list_volumes(
diff --git a/tempest/api/volume/test_volumes_snapshots.py b/tempest/api/volume/test_volumes_snapshots.py
index 95521e7..35afffd 100644
--- a/tempest/api/volume/test_volumes_snapshots.py
+++ b/tempest/api/volume/test_volumes_snapshots.py
@@ -132,7 +132,8 @@
 
         # Updates snapshot with new values
         new_s_name = data_utils.rand_name(
-            self.__class__.__name__ + '-new-snap')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-new-snap')
         new_desc = 'This is the new description of snapshot.'
         params = {'name': new_s_name,
                   'description': new_desc}
diff --git a/tempest/api/volume/test_volumes_snapshots_negative.py b/tempest/api/volume/test_volumes_snapshots_negative.py
index 9c36dc6..364c5a8 100644
--- a/tempest/api/volume/test_volumes_snapshots_negative.py
+++ b/tempest/api/volume/test_volumes_snapshots_negative.py
@@ -32,7 +32,9 @@
     @decorators.idempotent_id('e3e466af-70ab-4f4b-a967-ab04e3532ea7')
     def test_create_snapshot_with_nonexistent_volume_id(self):
         """Test creating snapshot from non existent volume should fail"""
-        s_name = data_utils.rand_name(self.__class__.__name__ + '-snap')
+        s_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-snap')
         self.assertRaises(lib_exc.NotFound,
                           self.snapshots_client.create_snapshot,
                           volume_id=data_utils.rand_uuid(),
@@ -43,7 +45,9 @@
     def test_create_snapshot_without_passing_volume_id(self):
         """Test creating snapshot without passing volume_id should fail"""
         # Create a snapshot without passing volume id
-        s_name = data_utils.rand_name(self.__class__.__name__ + '-snap')
+        s_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-snap')
         self.assertRaises(lib_exc.NotFound,
                           self.snapshots_client.create_snapshot,
                           volume_id=None, display_name=s_name)
diff --git a/tempest/clients.py b/tempest/clients.py
index 5b31cf8..5338ed4 100644
--- a/tempest/clients.py
+++ b/tempest/clients.py
@@ -104,6 +104,15 @@
                 service=CONF.image.alternate_image_endpoint,
                 endpoint_type=CONF.image.alternate_image_endpoint_type,
                 region=CONF.image.region)
+            # NOTE(abhishekk): If no alternate endpoint is configured,
+            # this client will work the same as the base
+            # self.image_cache_client. If your test needs to know if
+            # these are different, check the config option to see if
+            # the alternate_image_endpoint is set.
+            self.cache_client_remote = self.image_v2.ImageCacheClient(
+                service=CONF.image.alternate_image_endpoint,
+                endpoint_type=CONF.image.alternate_image_endpoint_type,
+                region=CONF.image.region)
 
     def _set_compute_clients(self):
         self.agents_client = self.compute.AgentsClient()
diff --git a/tempest/cmd/cleanup.py b/tempest/cmd/cleanup.py
index a8a344a..2a406de 100644
--- a/tempest/cmd/cleanup.py
+++ b/tempest/cmd/cleanup.py
@@ -28,6 +28,10 @@
 
 .. warning::
 
+    We advice not to run tempest cleanup on production environments.
+
+.. warning::
+
     If step 1 is skipped in the example below, the cleanup procedure
     may delete resources that existed in the cloud before the test run. This
     may cause an unwanted destruction of cloud resources, so use caution with
@@ -45,7 +49,10 @@
 * ``--init-saved-state``: Initializes the saved state of the OpenStack
   deployment and will output a ``saved_state.json`` file containing resources
   from your deployment that will be preserved from the cleanup command. This
-  should be done prior to running Tempest tests.
+  should be done prior to running Tempest tests. Note, that if other users of
+  your cloud could have created resources after running ``--init-saved-state``,
+  it would not protect those resources as they wouldn't be present in the
+  saved_state.json file.
 
 * ``--delete-tempest-conf-objects``: If option is present, then the command
   will delete the admin project in addition to the resources associated with
@@ -58,7 +65,27 @@
   global objects that will be removed (domains, flavors, images, roles,
   projects, and users). Once the cleanup command is executed (e.g. run without
   parameters), running it again with ``--dry-run`` should yield an empty
-  report.
+  report. We STRONGLY ENCOURAGE to run ``tempest cleanup`` with ``--dry-run``
+  first and then verify that the resources listed in the ``dry_run.json`` file
+  are meant to be deleted.
+
+* ``--prefix``: Only resources that match the prefix will be deleted. When this
+  option is used, ``saved_state.json`` file is not needed (no need to run with
+  ``--init-saved-state`` first).
+
+  All tempest resources are created with the prefix value from the config
+  option ``resource_name_prefix`` in tempest.conf. To cleanup only the
+  resources created by tempest, you should use the prefix set in your
+  tempest.conf (the default value of ``resource_name_prefix`` is ``tempest``.
+
+  Note, that some resources are not named thus they will not be deleted when
+  filtering based on the prefix. This option will be ignored when
+  ``--init-saved-state`` is used so that it can capture the true init state -
+  all resources present at that moment. If there is any ``saved_state.json``
+  file present (e.g. if you ran the tempest cleanup with ``--init-saved-state``
+  before) and you run the tempest cleanup with ``--prefix``, the
+  ``saved_state.json`` file will be ignored and cleanup will be done based on
+  the passed prefix only.
 
 * ``--help``: Print the help text for the command and parameters.
 
@@ -157,6 +184,7 @@
         is_dry_run = self.options.dry_run
         is_preserve = not self.options.delete_tempest_conf_objects
         is_save_state = False
+        cleanup_prefix = self.options.prefix
 
         if is_dry_run:
             self.dry_run_data["_projects_to_clean"] = {}
@@ -168,7 +196,8 @@
                   'is_dry_run': is_dry_run,
                   'saved_state_json': self.json_data,
                   'is_preserve': False,
-                  'is_save_state': is_save_state}
+                  'is_save_state': is_save_state,
+                  'prefix': cleanup_prefix}
         project_service = cleanup_service.ProjectService(admin_mgr, **kwargs)
         projects = project_service.list()
         LOG.info("Processing %s projects", len(projects))
@@ -182,6 +211,7 @@
                   'saved_state_json': self.json_data,
                   'is_preserve': is_preserve,
                   'is_save_state': is_save_state,
+                  'prefix': cleanup_prefix,
                   'got_exceptions': self.GOT_EXCEPTIONS}
         LOG.info("Processing global services")
         for service in self.global_services:
@@ -206,6 +236,7 @@
         project_id = project['id']
         project_name = project['name']
         project_data = None
+        cleanup_prefix = self.options.prefix
         if is_dry_run:
             project_data = dry_run_data["_projects_to_clean"][project_id] = {}
             project_data['name'] = project_name
@@ -216,6 +247,7 @@
                   'is_preserve': is_preserve,
                   'is_save_state': False,
                   'project_id': project_id,
+                  'prefix': cleanup_prefix,
                   'got_exceptions': self.GOT_EXCEPTIONS}
         for service in self.project_associated_services:
             svc = service(self.admin_mgr, **kwargs)
@@ -243,10 +275,26 @@
                             help="Generate JSON file:" + DRY_RUN_JSON +
                             ", that reports the objects that would have "
                             "been deleted had a full cleanup been run.")
+        parser.add_argument('--prefix', dest='prefix', default=None,
+                            help="Only resources that match the prefix will "
+                            "be deleted (resources in saved_state.json are "
+                            "not taken into account). All tempest resources "
+                            "are created with the prefix value set by "
+                            "resource_name_prefix in tempest.conf, default "
+                            "prefix is tempest. Note that some resources are "
+                            "not named thus they will not be deleted when "
+                            "filtering based on the prefix. This opt will be "
+                            "ignored when --init-saved-state is used so that "
+                            "it can capture the true init state - all "
+                            "resources present at that moment.")
         return parser
 
     def get_description(self):
-        return 'Cleanup after tempest run'
+        return ('tempest cleanup tool, read the full documentation before '
+                'using this tool. We advice not to run it on production '
+                'environments. On environments where also other users may '
+                'create resources, we strongly advice using --dry-run '
+                'argument first and verify the content of dry_run.json file.')
 
     def _init_state(self):
         LOG.info("Initializing saved state.")
@@ -257,6 +305,10 @@
                   'saved_state_json': data,
                   'is_preserve': False,
                   'is_save_state': True,
+                  # must be None as we want to capture true init state
+                  # (all resources present) thus no filtering based
+                  # on the prefix
+                  'prefix': None,
                   'got_exceptions': self.GOT_EXCEPTIONS}
         for service in self.global_services:
             svc = service(admin_mgr, **kwargs)
diff --git a/tempest/cmd/cleanup_service.py b/tempest/cmd/cleanup_service.py
index f2370f3..8651ab0 100644
--- a/tempest/cmd/cleanup_service.py
+++ b/tempest/cmd/cleanup_service.py
@@ -115,6 +115,16 @@
         return [item for item in item_list
                 if item['tenant_id'] == self.tenant_id]
 
+    def _filter_by_prefix(self, item_list):
+        items = [item for item in item_list
+                 if item['name'].startswith(self.prefix)]
+        return items
+
+    def _filter_out_ids_from_saved(self, item_list, attr):
+        items = [item for item in item_list if item['id']
+                 not in self.saved_state_json[attr].keys()]
+        return items
+
     def list(self):
         pass
 
@@ -156,10 +166,11 @@
     def list(self):
         client = self.client
         snaps = client.list_snapshots()['snapshots']
-        if not self.is_save_state:
+        if self.prefix:
+            snaps = self._filter_by_prefix(snaps)
+        elif not self.is_save_state:
             # recreate list removing saved snapshots
-            snaps = [snap for snap in snaps if snap['id']
-                     not in self.saved_state_json['snapshots'].keys()]
+            snaps = self._filter_out_ids_from_saved(snaps, 'snapshots')
         LOG.debug("List count, %s Snapshots", len(snaps))
         return snaps
 
@@ -194,10 +205,11 @@
         client = self.client
         servers_body = client.list_servers()
         servers = servers_body['servers']
-        if not self.is_save_state:
+        if self.prefix:
+            servers = self._filter_by_prefix(servers)
+        elif not self.is_save_state:
             # recreate list removing saved servers
-            servers = [server for server in servers if server['id']
-                       not in self.saved_state_json['servers'].keys()]
+            servers = self._filter_out_ids_from_saved(servers, 'servers')
         LOG.debug("List count, %s Servers", len(servers))
         return servers
 
@@ -227,10 +239,11 @@
     def list(self):
         client = self.server_groups_client
         sgs = client.list_server_groups()['server_groups']
-        if not self.is_save_state:
+        if self.prefix:
+            sgs = self._filter_by_prefix(sgs)
+        elif not self.is_save_state:
             # recreate list removing saved server_groups
-            sgs = [sg for sg in sgs if sg['id']
-                   not in self.saved_state_json['server_groups'].keys()]
+            sgs = self._filter_out_ids_from_saved(sgs, 'server_groups')
         LOG.debug("List count, %s Server Groups", len(sgs))
         return sgs
 
@@ -263,7 +276,9 @@
     def list(self):
         client = self.client
         keypairs = client.list_keypairs()['keypairs']
-        if not self.is_save_state:
+        if self.prefix:
+            keypairs = self._filter_by_prefix(keypairs)
+        elif not self.is_save_state:
             # recreate list removing saved keypairs
             keypairs = [keypair for keypair in keypairs
                         if keypair['keypair']['name']
@@ -302,10 +317,11 @@
     def list(self):
         client = self.client
         vols = client.list_volumes()['volumes']
-        if not self.is_save_state:
+        if self.prefix:
+            vols = self._filter_by_prefix(vols)
+        elif not self.is_save_state:
             # recreate list removing saved volumes
-            vols = [vol for vol in vols if vol['id']
-                    not in self.saved_state_json['volumes'].keys()]
+            vols = self._filter_out_ids_from_saved(vols, 'volumes')
         LOG.debug("List count, %s Volumes", len(vols))
         return vols
 
@@ -336,6 +352,10 @@
         self.client = manager.volume_quotas_client_latest
 
     def delete(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore do nothing
+            return
         client = self.client
         try:
             LOG.debug("Deleting Volume Quotas for project with id %s",
@@ -346,6 +366,10 @@
                           self.project_id)
 
     def dry_run(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore do nothing
+            return
         quotas = self.client.show_quota_set(
             self.project_id, params={'usage': True})['quota_set']
         self.data['volume_quotas'] = quotas
@@ -358,6 +382,10 @@
         self.limits_client = manager.limits_client
 
     def delete(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore do nothing
+            return
         client = self.client
         try:
             LOG.debug("Deleting Nova Quotas for project with id %s",
@@ -368,6 +396,10 @@
                           self.project_id)
 
     def dry_run(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore do nothing
+            return
         client = self.limits_client
         quotas = client.show_limits()['limits']
         self.data['compute_quotas'] = quotas['absolute']
@@ -379,6 +411,10 @@
         self.client = manager.network_quotas_client
 
     def delete(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore do nothing
+            return
         client = self.client
         try:
             LOG.debug("Deleting Network Quotas for project with id %s",
@@ -389,6 +425,10 @@
                           self.project_id)
 
     def dry_run(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore do nothing
+            return
         resp = [quota for quota in self.client.list_quotas()['quotas']
                 if quota['project_id'] == self.project_id]
         self.data['network_quotas'] = resp
@@ -422,11 +462,13 @@
         client = self.networks_client
         networks = client.list_networks(**self.tenant_filter)
         networks = networks['networks']
-
-        if not self.is_save_state:
-            # recreate list removing saved networks
-            networks = [network for network in networks if network['id']
-                        not in self.saved_state_json['networks'].keys()]
+        if self.prefix:
+            networks = self._filter_by_prefix(networks)
+        else:
+            if not self.is_save_state:
+                # recreate list removing saved networks
+                networks = self._filter_out_ids_from_saved(
+                    networks, 'networks')
         # filter out networks declared in tempest.conf
         if self.is_preserve:
             networks = [network for network in networks
@@ -458,14 +500,17 @@
 class NetworkFloatingIpService(BaseNetworkService):
 
     def list(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore return empty list
+            return []
         client = self.floating_ips_client
         flips = client.list_floatingips(**self.tenant_filter)
         flips = flips['floatingips']
 
         if not self.is_save_state:
             # recreate list removing saved flips
-            flips = [flip for flip in flips if flip['id']
-                     not in self.saved_state_json['floatingips'].keys()]
+            flips = self._filter_out_ids_from_saved(flips, 'floatingips')
         LOG.debug("List count, %s Network Floating IPs", len(flips))
         return flips
 
@@ -498,15 +543,15 @@
         client = self.routers_client
         routers = client.list_routers(**self.tenant_filter)
         routers = routers['routers']
-
-        if not self.is_save_state:
-            # recreate list removing saved routers
-            routers = [router for router in routers if router['id']
-                       not in self.saved_state_json['routers'].keys()]
+        if self.prefix:
+            routers = self._filter_by_prefix(routers)
+        else:
+            if not self.is_save_state:
+                # recreate list removing saved routers
+                routers = self._filter_out_ids_from_saved(routers, 'routers')
         if self.is_preserve:
             routers = [router for router in routers
                        if router['id'] != CONF_PUB_ROUTER]
-
         LOG.debug("List count, %s Routers", len(routers))
         return routers
 
@@ -547,15 +592,19 @@
 class NetworkMeteringLabelRuleService(NetworkService):
 
     def list(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore return empty list
+            return []
         client = self.metering_label_rules_client
         rules = client.list_metering_label_rules()
         rules = rules['metering_label_rules']
         rules = self._filter_by_tenant_id(rules)
 
         if not self.is_save_state:
-            saved_rules = self.saved_state_json['metering_label_rules'].keys()
+            rules = self._filter_out_ids_from_saved(
+                rules, 'metering_label_rules')
             # recreate list removing saved rules
-            rules = [rule for rule in rules if rule['id'] not in saved_rules]
         LOG.debug("List count, %s Metering Label Rules", len(rules))
         return rules
 
@@ -589,11 +638,12 @@
         labels = client.list_metering_labels()
         labels = labels['metering_labels']
         labels = self._filter_by_tenant_id(labels)
-
-        if not self.is_save_state:
+        if self.prefix:
+            labels = self._filter_by_prefix(labels)
+        elif not self.is_save_state:
             # recreate list removing saved labels
-            labels = [label for label in labels if label['id']
-                      not in self.saved_state_json['metering_labels'].keys()]
+            labels = self._filter_out_ids_from_saved(
+                labels, 'metering_labels')
         LOG.debug("List count, %s Metering Labels", len(labels))
         return labels
 
@@ -627,14 +677,14 @@
                  client.list_ports(**self.tenant_filter)['ports']
                  if port["device_owner"] == "" or
                  port["device_owner"].startswith("compute:")]
-
-        if not self.is_save_state:
-            # recreate list removing saved ports
-            ports = [port for port in ports if port['id']
-                     not in self.saved_state_json['ports'].keys()]
+        if self.prefix:
+            ports = self._filter_by_prefix(ports)
+        else:
+            if not self.is_save_state:
+                # recreate list removing saved ports
+                ports = self._filter_out_ids_from_saved(ports, 'ports')
         if self.is_preserve:
             ports = self._filter_by_conf_networks(ports)
-
         LOG.debug("List count, %s Ports", len(ports))
         return ports
 
@@ -667,16 +717,18 @@
         secgroups = [secgroup for secgroup in
                      client.list_security_groups(**filter)['security_groups']
                      if secgroup['name'] != 'default']
-
-        if not self.is_save_state:
-            # recreate list removing saved security_groups
-            secgroups = [secgroup for secgroup in secgroups if secgroup['id']
-                         not in self.saved_state_json['security_groups'].keys()
-                         ]
+        if self.prefix:
+            secgroups = self._filter_by_prefix(secgroups)
+        else:
+            if not self.is_save_state:
+                # recreate list removing saved security_groups
+                secgroups = self._filter_out_ids_from_saved(
+                    secgroups, 'security_groups')
         if self.is_preserve:
-            secgroups = [secgroup for secgroup in secgroups
-                         if secgroup['security_group_rules'][0]['project_id']
-                         not in CONF_PROJECTS]
+            secgroups = [
+                secgroup for secgroup in secgroups
+                if secgroup['security_group_rules'][0]['project_id']
+                not in CONF_PROJECTS]
         LOG.debug("List count, %s security_groups", len(secgroups))
         return secgroups
 
@@ -708,10 +760,12 @@
         client = self.subnets_client
         subnets = client.list_subnets(**self.tenant_filter)
         subnets = subnets['subnets']
-        if not self.is_save_state:
-            # recreate list removing saved subnets
-            subnets = [subnet for subnet in subnets if subnet['id']
-                       not in self.saved_state_json['subnets'].keys()]
+        if self.prefix:
+            subnets = self._filter_by_prefix(subnets)
+        else:
+            if not self.is_save_state:
+                # recreate list removing saved subnets
+                subnets = self._filter_out_ids_from_saved(subnets, 'subnets')
         if self.is_preserve:
             subnets = self._filter_by_conf_networks(subnets)
         LOG.debug("List count, %s Subnets", len(subnets))
@@ -743,10 +797,12 @@
     def list(self):
         client = self.subnetpools_client
         pools = client.list_subnetpools(**self.tenant_filter)['subnetpools']
-        if not self.is_save_state:
-            # recreate list removing saved subnet pools
-            pools = [pool for pool in pools if pool['id']
-                     not in self.saved_state_json['subnetpools'].keys()]
+        if self.prefix:
+            pools = self._filter_by_prefix(pools)
+        else:
+            if not self.is_save_state:
+                # recreate list removing saved subnet pools
+                pools = self._filter_out_ids_from_saved(pools, 'subnetpools')
         if self.is_preserve:
             pools = [pool for pool in pools if pool['project_id']
                      not in CONF_PROJECTS]
@@ -782,11 +838,15 @@
         self.client = manager.regions_client
 
     def list(self):
+        if self.prefix:
+            # this means we're cleaning resources based on a certain prefix,
+            # this resource doesn't have a name, therefore return empty list
+            return []
         client = self.client
         regions = client.list_regions()
         if not self.is_save_state:
-            regions = [region for region in regions['regions'] if region['id']
-                       not in self.saved_state_json['regions'].keys()]
+            regions = self._filter_out_ids_from_saved(
+                regions['regions'], 'regions')
             LOG.debug("List count, %s Regions", len(regions))
             return regions
         else:
@@ -824,11 +884,12 @@
     def list(self):
         client = self.client
         flavors = client.list_flavors({"is_public": None})['flavors']
-        if not self.is_save_state:
-            # recreate list removing saved flavors
-            flavors = [flavor for flavor in flavors if flavor['id']
-                       not in self.saved_state_json['flavors'].keys()]
-
+        if self.prefix:
+            flavors = self._filter_by_prefix(flavors)
+        else:
+            if not self.is_save_state:
+                # recreate list removing saved flavors
+                flavors = self._filter_out_ids_from_saved(flavors, 'flavors')
         if self.is_preserve:
             flavors = [flavor for flavor in flavors
                        if flavor['id'] not in CONF_FLAVORS]
@@ -871,10 +932,11 @@
             marker = urllib.parse_qs(parsed.query)['marker'][0]
             response = client.list_images(params={"marker": marker})
             images.extend(response['images'])
-
-        if not self.is_save_state:
-            images = [image for image in images if image['id']
-                      not in self.saved_state_json['images'].keys()]
+        if self.prefix:
+            images = self._filter_by_prefix(images)
+        else:
+            if not self.is_save_state:
+                images = self._filter_out_ids_from_saved(images, 'images')
         if self.is_preserve:
             images = [image for image in images
                       if image['id'] not in CONF_IMAGES]
@@ -910,19 +972,17 @@
 
     def list(self):
         users = self.client.list_users()['users']
-
-        if not self.is_save_state:
-            users = [user for user in users if user['id']
-                     not in self.saved_state_json['users'].keys()]
-
+        if self.prefix:
+            users = self._filter_by_prefix(users)
+        else:
+            if not self.is_save_state:
+                users = self._filter_out_ids_from_saved(users, 'users')
         if self.is_preserve:
             users = [user for user in users if user['name']
                      not in CONF_USERS]
-
         elif not self.is_save_state:  # Never delete admin user
             users = [user for user in users if user['name'] !=
                      CONF.auth.admin_username]
-
         LOG.debug("List count, %s Users after reconcile", len(users))
         return users
 
@@ -955,13 +1015,14 @@
     def list(self):
         try:
             roles = self.client.list_roles()['roles']
-            # reconcile roles with saved state and never list admin role
-            if not self.is_save_state:
-                roles = [role for role in roles if
-                         (role['id'] not in
-                          self.saved_state_json['roles'].keys() and
-                          role['name'] != CONF.identity.admin_role)]
-                LOG.debug("List count, %s Roles after reconcile", len(roles))
+            if self.prefix:
+                roles = self._filter_by_prefix(roles)
+            elif not self.is_save_state:
+                # reconcile roles with saved state and never list admin role
+                roles = self._filter_out_ids_from_saved(roles, 'roles')
+                roles = [role for role in roles
+                         if role['name'] != CONF.identity.admin_role]
+            LOG.debug("List count, %s Roles after reconcile", len(roles))
             return roles
         except Exception:
             LOG.exception("Cannot retrieve Roles.")
@@ -995,18 +1056,17 @@
 
     def list(self):
         projects = self.client.list_projects()['projects']
-        if not self.is_save_state:
-            project_ids = self.saved_state_json['projects']
-            projects = [project
-                        for project in projects
-                        if (project['id'] not in project_ids and
-                            project['name'] != CONF.auth.admin_project_name)]
-
+        if self.prefix:
+            projects = self._filter_by_prefix(projects)
+        else:
+            if not self.is_save_state:
+                projects = self._filter_out_ids_from_saved(
+                    projects, 'projects')
+                projects = [project for project in projects
+                            if project['name'] != CONF.auth.admin_project_name]
         if self.is_preserve:
-            projects = [project
-                        for project in projects
+            projects = [project for project in projects
                         if project['name'] not in CONF_PROJECTS]
-
         LOG.debug("List count, %s Projects after reconcile", len(projects))
         return projects
 
@@ -1039,10 +1099,10 @@
     def list(self):
         client = self.client
         domains = client.list_domains()['domains']
-        if not self.is_save_state:
-            domains = [domain for domain in domains if domain['id']
-                       not in self.saved_state_json['domains'].keys()]
-
+        if self.prefix:
+            domains = self._filter_by_prefix(domains)
+        elif not self.is_save_state:
+            domains = self._filter_out_ids_from_saved(domains, 'domains')
         LOG.debug("List count, %s Domains after reconcile", len(domains))
         return domains
 
diff --git a/tempest/cmd/run.py b/tempest/cmd/run.py
index 2669ff7..e305646 100644
--- a/tempest/cmd/run.py
+++ b/tempest/cmd/run.py
@@ -269,6 +269,8 @@
                 return_code = commands.run_command(
                     **params, blacklist_file=ex_list,
                     whitelist_file=in_list, black_regex=ex_regex)
+            if parsed_args.slowest:
+                commands.slowest_command()
             if return_code > 0:
                 sys.exit(return_code)
         return return_code
@@ -392,6 +394,9 @@
                             help='Combine the output of this run with the '
                                  "previous run's as a combined stream in the "
                                  "stestr repository after it finish")
+        parser.add_argument('--slowest', action='store_true',
+                            help='Show the longest running tests in the '
+                                 'stestr repository after it finishes')
 
         parser.set_defaults(parallel=True)
         return parser
diff --git a/tempest/common/compute.py b/tempest/common/compute.py
index 53d44f1..a8aafe9 100644
--- a/tempest/common/compute.py
+++ b/tempest/common/compute.py
@@ -196,7 +196,8 @@
     """
 
     if name is None:
-        name = data_utils.rand_name(__name__ + "-instance")
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=__name__ + "-instance")
     if flavor is None:
         flavor = CONF.compute.flavor_ref
     if image_id is None:
@@ -245,7 +246,8 @@
             kwargs['user_data'] = script_b64
 
     if volume_backed:
-        volume_name = data_utils.rand_name(__name__ + '-volume')
+        volume_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=__name__ + '-volume')
         volumes_client = clients.volumes_client_latest
         params = {'name': volume_name,
                   'imageRef': image_id,
@@ -375,19 +377,22 @@
                                  is configured not to offload server
                                  automatically after offload time.
     """
-    servers_client.shelve_server(server_id)
+    body = servers_client.shelve_server(server_id)
+    request_id = body.response['x-openstack-request-id']
 
     offload_time = CONF.compute.shelved_offload_time
     if offload_time >= 0:
         waiters.wait_for_server_status(servers_client, server_id,
                                        'SHELVED_OFFLOADED',
-                                       extra_timeout=offload_time)
+                                       extra_timeout=offload_time,
+                                       request_id=request_id)
     else:
         waiters.wait_for_server_status(servers_client, server_id, 'SHELVED')
         if force_shelve_offload:
             servers_client.shelve_offload_server(server_id)
             waiters.wait_for_server_status(servers_client, server_id,
-                                           'SHELVED_OFFLOADED')
+                                           'SHELVED_OFFLOADED',
+                                           request_id=request_id)
 
 
 def create_websocket(url):
diff --git a/tempest/common/object_storage.py b/tempest/common/object_storage.py
new file mode 100644
index 0000000..7ffdc42
--- /dev/null
+++ b/tempest/common/object_storage.py
@@ -0,0 +1,64 @@
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from oslo_log import log
+
+from tempest import config
+from tempest.lib import exceptions as lib_exc
+
+CONF = config.CONF
+LOG = log.getLogger(__name__)
+
+
+def delete_containers(containers, container_client, object_client):
+    """Remove containers and all objects in them.
+
+    The containers should be visible from the container_client given.
+    Will not throw any error if the containers don't exist.
+
+    :param containers: List of containers(or string of a container)
+                       to be deleted
+    :param container_client: Client to be used to delete containers
+    :param object_client: Client to be used to delete objects
+    """
+    if isinstance(containers, str):
+        containers = [containers]
+
+    for cont in containers:
+        try:
+            delete_objects(cont, container_client, object_client)
+            container_client.delete_container(cont)
+            container_client.wait_for_resource_deletion(cont)
+        except lib_exc.NotFound:
+            LOG.warning(f"Container {cont} wasn't deleted as it wasn't found.")
+
+
+def delete_objects(container, container_client, object_client):
+    """Remove all objects from container.
+
+    Will not throw any error if the objects do not exist
+
+    :param container: Name of the container that contains the objects to be
+                      deleted
+    :param container_client: Client to be used to list objects in
+                             the container
+    :param object_client: Client to be used to delete objects
+    """
+    params = {'limit': 9999, 'format': 'json'}
+    _, objlist = container_client.list_container_objects(container, params)
+
+    for obj in objlist:
+        try:
+            object_client.delete_object(container, obj['name'])
+            object_client.wait_for_resource_deletion(obj['name'], container)
+        except lib_exc.NotFound:
+            LOG.warning(f"Object {obj} wasn't deleted as it wasn't found.")
diff --git a/tempest/common/waiters.py b/tempest/common/waiters.py
index d3be6fd..ddc6047 100644
--- a/tempest/common/waiters.py
+++ b/tempest/common/waiters.py
@@ -311,6 +311,36 @@
     raise lib_exc.TimeoutException(message)
 
 
+def wait_for_image_deleted_from_store(client, image, available_stores,
+                                      image_store_deleted):
+    """Waits for an image to be deleted from specific store.
+
+    API will not allow deletion of the last location for an image.
+    This return image if image deleted from store.
+    """
+
+    # Check if image have last store location
+    if len(available_stores) == 1:
+        exc_cls = lib_exc.OtherRestClientException
+        message = ('Delete from last store location not allowed'
+                   % (image, image_store_deleted))
+        raise exc_cls(message)
+    start = int(time.time())
+    while int(time.time()) - start < client.build_timeout:
+        image = client.show_image(image['id'])
+        image_stores = image['stores'].split(",")
+        if image_store_deleted not in image_stores:
+            return
+        time.sleep(client.build_interval)
+    message = ('Failed to delete %s from requested store location: %s '
+               'within the required time: (%s s)' %
+               (image, image_store_deleted, client.build_timeout))
+    caller = test_utils.find_test_caller()
+    if caller:
+        message = '(%s) %s' % (caller, message)
+    raise exc_cls(message)
+
+
 def wait_for_volume_resource_status(client, resource_id, status,
                                     server_id=None, servers_client=None):
     """Waits for a volume resource to reach a given status.
diff --git a/tempest/config.py b/tempest/config.py
index 99e530e..1445773 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -126,9 +126,11 @@
                default=None,
                help='Specify a CA bundle file to use in verifying a '
                     'TLS (https) server certificate.'),
-    cfg.StrOpt('uri',
+    cfg.URIOpt('uri',
+               schemes=['http', 'https'],
                help="Full URI of the OpenStack Identity API (Keystone), v2"),
-    cfg.StrOpt('uri_v3',
+    cfg.URIOpt('uri_v3',
+               schemes=['http', 'https'],
                help='Full URI of the OpenStack Identity API (Keystone), v3'),
     cfg.StrOpt('auth_version',
                default='v3',
@@ -263,23 +265,11 @@
                 default=False,
                 help='Does the environment have the security compliance '
                      'settings enabled?'),
-    cfg.BoolOpt('project_tags',
-                default=True,
-                help='Is the project tags identity v3 API available?',
-                deprecated_for_removal=True,
-                deprecated_reason='Project tags API is a default feature '
-                                  'since Queens'),
-    cfg.BoolOpt('application_credentials',
-                default=True,
-                help='Does the environment have application credentials '
-                     'enabled?',
-                deprecated_for_removal=True,
-                deprecated_reason='Application credentials is a default '
-                                  'feature since Queens'),
-    # Access rules for application credentials is a default feature in Train.
-    # This config option can removed once Stein is EOL.
     cfg.BoolOpt('access_rules',
-                default=False,
+                default=True,
+                deprecated_for_removal=True,
+                deprecated_reason='Access rules for application credentials '
+                                  'is a default feature since Train',
                 help='Does the environment have access rules enabled?'),
     cfg.BoolOpt('immutable_user_source',
                 default=False,
@@ -405,6 +395,17 @@
                     'allow_availability_zone_fallback=False in cinder.conf), '
                     'the volume create request will fail and the instance '
                     'will fail the build request.'),
+    cfg.StrOpt('migration_source_host',
+               default=None,
+               help="Specify source host for live-migration, cold-migration"
+                    " and resize tests. If option is not set tests will use"
+                    " host automatically."),
+    cfg.StrOpt('migration_dest_host',
+               default=None,
+               help="Specify destination host for live-migration and cold"
+                    " migration. If option is not set tests will use host"
+                    " automatically."),
+
 ]
 
 placement_group = cfg.OptGroup(name='placement',
@@ -501,18 +502,6 @@
                 default=False,
                 help="Does the test environment use block devices for live "
                      "migration"),
-    cfg.BoolOpt('block_migrate_cinder_iscsi',
-                default=False,
-                help="Does the test environment support block migration with "
-                "Cinder iSCSI volumes. Note: libvirt >= 1.2.17 is required "
-                "to support this if using the libvirt compute driver.",
-                deprecated_for_removal=True,
-                deprecated_reason='This option duplicates the more generic '
-                                  '[compute-feature-enabled]/block_migration '
-                                  '_for_live_migration now that '
-                                  'MIN_LIBVIRT_VERSION is >= 1.2.17 on all '
-                                  'branches from stable/rocky and will be '
-                                  'removed in a future release.'),
     cfg.BoolOpt('can_migrate_between_any_hosts',
                 default=True,
                 help="Does the test environment support migrating between "
@@ -523,15 +512,6 @@
                 default=False,
                 help='Enable VNC console. This configuration value should '
                      'be same as nova.conf: vnc.enabled'),
-    cfg.StrOpt('vnc_server_header',
-               default='WebSockify',
-               help='Expected VNC server name (WebSockify, nginx, etc) '
-                    'in response header.',
-               deprecated_for_removal=True,
-               deprecated_reason='This option will be ignored because the '
-                                 'usage of different response header fields '
-                                 'to accomplish the same goal (in accordance '
-                                 'with RFC7231 S6.2.2) makes it obsolete.'),
     cfg.BoolOpt('spice_console',
                 default=False,
                 help='Enable Spice console. This configuration value should '
@@ -540,14 +520,6 @@
                 deprecated_reason="This config option is not being used "
                                   "in Tempest, we can add it back when "
                                   "adding the test cases."),
-    cfg.BoolOpt('rdp_console',
-                default=False,
-                help='Enable RDP console. This configuration value should '
-                     'be same as nova.conf: rdp.enabled',
-                deprecated_for_removal=True,
-                deprecated_reason="This config option is not being used "
-                                  "in Tempest, we can add it back when "
-                                  "adding the test cases."),
     cfg.BoolOpt('serial_console',
                 default=False,
                 help='Enable serial console. This configuration value '
@@ -575,13 +547,6 @@
                 default=True,
                 help='Does the test environment support creating snapshot '
                      'images of running instances?'),
-    cfg.BoolOpt('nova_cert',
-                default=False,
-                help='Does the test environment have the nova cert running?',
-                deprecated_for_removal=True,
-                deprecated_reason="On Nova side, the nova-cert service is "
-                                  "deprecated and the service will be removed "
-                                  "as early as Ocata."),
     cfg.BoolOpt('personality',
                 default=False,
                 help='Does the test environment support server personality'),
@@ -801,13 +766,6 @@
                default=1,
                help="Time in seconds between network operation status "
                     "checks."),
-    cfg.ListOpt('dns_servers',
-                default=["8.8.8.8", "8.8.4.4"],
-                help="List of dns servers which should be used"
-                     " for subnet creation",
-                deprecated_for_removal=True,
-                deprecated_reason="This config option is no longer "
-                                  "used anywhere, so it can be removed."),
     cfg.StrOpt('port_vnic_type',
                choices=[None, 'normal', 'direct', 'macvtap', 'direct-physical',
                         'baremetal', 'virtio-forwarder'],
@@ -883,8 +841,9 @@
                                title="Dashboard options")
 
 DashboardGroup = [
-    cfg.StrOpt('dashboard_url',
+    cfg.URIOpt('dashboard_url',
                default='http://localhost/',
+               schemes=['http', 'https'],
                help="Where the dashboard can be found"),
     cfg.BoolOpt('disable_ssl_certificate_validation',
                 default=False,
@@ -909,10 +868,11 @@
                 help='Enable/disable security group rules.'),
     cfg.StrOpt('connect_method',
                default='floating',
-               choices=['fixed', 'floating'],
-               help='Default IP type used for validation: '
-                    '-fixed: uses the first IP belonging to the fixed network '
-                    '-floating: creates and uses a floating IP'),
+               choices=[('fixed',
+                         'uses the first IP belonging to the fixed network'),
+                        ('floating',
+                         'creates and uses a floating IP')],
+               help='Default IP type used for validation'),
     cfg.StrOpt('auth_method',
                default='keypair',
                choices=['keypair'],
@@ -1005,6 +965,13 @@
                choices=['public', 'admin', 'internal',
                         'publicURL', 'adminURL', 'internalURL'],
                help="The endpoint type to use for the volume service."),
+    cfg.StrOpt('backup_driver',
+               default='ceph',
+               choices=['ceph', 'swift', 'nfs', 'glusterfs', 'posix', 'google',
+                        's3'],
+               help="What kind of backup_driver does cinder use?"
+                    "https://docs.openstack.org/cinder/latest/configuration/"
+                    "block-storage/backup-drivers.html"),
     cfg.ListOpt('backend_names',
                 default=['BACKEND_1', 'BACKEND_2'],
                 help='A list of backend names separated by comma. '
@@ -1347,6 +1314,13 @@
  $ stestr run --pdb TEST_ID
 or
  $ python -m testtools.run TEST_ID"""),
+    cfg.StrOpt('resource_name_prefix',
+               default='tempest',
+               help="Define the prefix name for the resources created by "
+                    "tempest. Tempest cleanup CLI will use this config option "
+                    "to cleanup only the resources that match the prefix. "
+                    "Make sure this prefix does not match with the resource "
+                    "name you do not want Tempest cleanup CLI to delete."),
 ]
 
 _opts = [
diff --git a/tempest/lib/cli/base.py b/tempest/lib/cli/base.py
index c9cffd2..c308c30 100644
--- a/tempest/lib/cli/base.py
+++ b/tempest/lib/cli/base.py
@@ -374,12 +374,13 @@
         :param merge_stderr:  if True the stderr buffer is merged into stdout
         :type merge_stderr: boolean
         """
-        creds = ('--os-username %s --os-project-name %s --os-password %s '
+        creds = ('--os-username %s --os-password %s '
                  '--os-auth-url %s' %
                  (self.username,
-                  self.tenant_name,
                   self.password,
                   self.uri))
+        if self.tenant_name is not None:
+            creds += ' --os-project-name %s' % self.tenant_name
         if self.identity_api_version:
             if cmd not in self.CLIENTS_WITHOUT_IDENTITY_VERSION:
                 creds += ' --os-identity-api-version %s' % (
diff --git a/tempest/lib/common/utils/test_utils.py b/tempest/lib/common/utils/test_utils.py
index c79db15..7b85dec 100644
--- a/tempest/lib/common/utils/test_utils.py
+++ b/tempest/lib/common/utils/test_utils.py
@@ -93,7 +93,7 @@
             if attempt >= 3:
                 raise
             LOG.warning('Got ServerFault while running %s, retrying...', func)
-            time.sleep(1)
+            time.sleep(5)
 
 
 def call_until_true(func, duration, sleep_for, *args, **kwargs):
diff --git a/tempest/lib/services/image/v2/images_client.py b/tempest/lib/services/image/v2/images_client.py
index 8460b57..0608d47 100644
--- a/tempest/lib/services/image/v2/images_client.py
+++ b/tempest/lib/services/image/v2/images_client.py
@@ -292,3 +292,15 @@
         resp, _ = self.delete(url)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp)
+
+    def delete_image_from_store(self, image_id, store_name):
+        """Delete image from store
+
+        For a full list of available parameters,
+        please refer to the official API reference:
+        https://docs.openstack.org/api-ref/image/v2/#delete-image-from-store
+        """
+        url = 'stores/%s/%s' % (store_name, image_id)
+        resp, _ = self.delete(url)
+        self.expected_success(204, resp.status)
+        return rest_client.ResponseBody(resp)
diff --git a/tempest/scenario/README.rst b/tempest/scenario/README.rst
index efcd139..6c51f22 100644
--- a/tempest/scenario/README.rst
+++ b/tempest/scenario/README.rst
@@ -7,14 +7,14 @@
 What are these tests?
 ---------------------
 
-Scenario tests are "through path" tests of OpenStack
-function. Complicated setups where one part might depend on completion
+Scenario tests are "through path" tests of OpenStack function.
+Complicated setups where one part might depend on the completion
 of a previous part. They ideally involve the integration between
 multiple OpenStack services to exercise the touch points between them.
 
 Any scenario test should have a real-life use case. An example would be:
 
-- "As operator I want to start with a blank environment":
+- "As an operator, I want to start with a blank environment":
 
   1. upload a glance image
   2. deploy a vm from it
@@ -24,12 +24,14 @@
 
 Why are these tests in Tempest?
 -------------------------------
+
 This is one of Tempest's core purposes, testing the integration between
 projects.
 
 
 Scope of these tests
 --------------------
+
 Scenario tests should always use the Tempest implementation of the
 OpenStack API, as we want to ensure that bugs aren't hidden by the
 official clients.
@@ -40,6 +42,7 @@
 
 Example of a good test
 ----------------------
+
 While we are looking for interaction of 2 or more services, be
 specific in your interactions. A giant "this is my data center" smoke
 test is hard to debug when it goes wrong.
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index 5e01eb1..d51e7e5 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -16,7 +16,11 @@
 
 import copy
 import os
+import re
+import shutil
 import subprocess
+import tarfile
+import tempfile
 
 import netaddr
 
@@ -155,7 +159,8 @@
         if not client:
             client = self.ports_client
         name = data_utils.rand_name(
-            kwargs.pop('namestart', self.__class__.__name__))
+            prefix=CONF.resource_name_prefix,
+            name=kwargs.pop('namestart', self.__class__.__name__))
         if CONF.network.port_vnic_type and 'binding:vnic_type' not in kwargs:
             kwargs['binding:vnic_type'] = CONF.network.port_vnic_type
         if CONF.network.port_profile and 'binding:profile' not in kwargs:
@@ -183,7 +188,9 @@
         if not client:
             client = self.keypairs_client
         if not kwargs.get('name'):
-            kwargs['name'] = data_utils.rand_name(self.__class__.__name__)
+            kwargs['name'] = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__)
         # We don't need to create a keypair by pubkey in scenario
         body = client.create_keypair(**kwargs)
         self.addCleanup(client.delete_keypair, kwargs['name'])
@@ -246,7 +253,9 @@
             clients = self.os_primary
 
         if name is None:
-            name = data_utils.rand_name(self.__class__.__name__ + "-server")
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + "-server")
 
         vnic_type = kwargs.pop('vnic_type', CONF.network.port_vnic_type)
         profile = kwargs.pop('port_profile', CONF.network.port_profile)
@@ -370,7 +379,9 @@
             min_disk = image.get('min_disk')
             size = max(size, min_disk)
         if name is None:
-            name = data_utils.rand_name(self.__class__.__name__ + "-volume")
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + "-volume")
         kwargs.update({'name': name,
                        'snapshot_id': snapshot_id,
                        'imageRef': imageRef,
@@ -420,7 +431,8 @@
         """
 
         name = name or data_utils.rand_name(
-            self.__class__.__name__ + "-backup")
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + "-backup")
         args = {'name': name,
                 'description': description,
                 'force': force,
@@ -429,7 +441,7 @@
                 'container': container}
         args.update(kwargs)
         backup = self.backups_client.create_backup(volume_id=volume_id,
-                                                   **kwargs)['backup']
+                                                   **args)['backup']
         self.addCleanup(self.backups_client.delete_backup, backup['id'])
         waiters.wait_for_volume_resource_status(self.backups_client,
                                                 backup['id'], 'available')
@@ -496,7 +508,8 @@
         """
 
         name = name or data_utils.rand_name(
-            self.__class__.__name__ + '-snapshot')
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-snapshot')
         snapshot = self.snapshots_client.create_snapshot(
             volume_id=volume_id,
             force=force,
@@ -557,8 +570,11 @@
             client = self.os_admin.volume_types_client_latest
         if not name:
             class_name = self.__class__.__name__
-            name = data_utils.rand_name(class_name + '-volume-type')
-        randomized_name = data_utils.rand_name('scenario-type-' + name)
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=class_name + '-volume-type')
+        randomized_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='scenario-type-' + name)
 
         LOG.debug("Creating a volume type: %s on backend %s",
                   randomized_name, backend_name)
@@ -613,7 +629,8 @@
             client = self.security_groups_client
         if not project_id:
             project_id = client.project_id
-        sg_name = data_utils.rand_name(namestart)
+        sg_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=namestart)
         sg_desc = sg_name + " description"
         sg_dict = dict(name=sg_name,
                        description=sg_desc)
@@ -807,7 +824,8 @@
                   img_properties)
         if img_properties is None:
             img_properties = {}
-        name = data_utils.rand_name('%s-' % name)
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='%s-' % name)
         params = {
             'name': name,
             'container_format': img_container_format,
@@ -818,6 +836,60 @@
         if img_properties:
             params.update(img_properties)
         params.update(kwargs)
+
+        # This code is basically copying the devstack code that extracts and
+        # uploads split kernel/ramdisk images.
+        if tarfile.is_tarfile(img_path):
+            extract_dir = os.path.join(tempfile.gettempdir(), 'images', name)
+            self.addCleanup(shutil.rmtree, extract_dir)
+            os.makedirs(extract_dir)
+            with tarfile.open(img_path) as tar:
+                tar.extractall(extract_dir, filter='data')
+            filenames = os.listdir(extract_dir)
+            for fname in filenames:
+                if re.search(r'(.*-vmlinuz.*|aki-.*/image$)', fname):
+                    kernel_img_path = os.path.join(extract_dir, fname)
+                elif re.search(r'(.*-initrd.*|ari-.*/image$)', fname):
+                    ramdisk_img_path = os.path.join(extract_dir, fname)
+                elif re.search(f'(.*\\.img$|ami-.*/image$)', fname):
+                    img_path = os.path.join(extract_dir, fname)
+            # Create the kernel image.
+            kparams = {
+                'name': name + '-kernel',
+                'container_format': 'aki',
+                'disk_format': 'aki',
+                'visibility': 'private'
+            }
+            body = self.image_client.create_image(**kparams)
+            image = body['image'] if 'image' in body else body
+            kernel_id = image['id']
+            self.addCleanup(self.image_client.delete_image, kernel_id)
+            self.assertEqual("queued", image['status'])
+            with open(kernel_img_path, 'rb') as image_file:
+                self.image_client.store_image_file(kernel_id, image_file)
+            LOG.debug("image:%s", kernel_id)
+            # Create the ramdisk image.
+            rparams = {
+                'name': name + '-ramdisk',
+                'container_format': 'ari',
+                'disk_format': 'ari',
+                'visibility': 'private'
+            }
+            body = self.image_client.create_image(**rparams)
+            image = body['image'] if 'image' in body else body
+            ramdisk_id = image['id']
+            self.addCleanup(self.image_client.delete_image, ramdisk_id)
+            self.assertEqual("queued", image['status'])
+            with open(ramdisk_img_path, 'rb') as image_file:
+                self.image_client.store_image_file(ramdisk_id, image_file)
+            LOG.debug("image:%s", ramdisk_id)
+            # Set the kernel_id, ramdisk_id, container format, disk format for
+            # the split image.
+            params['kernel_id'] = kernel_id
+            params['ramdisk_id'] = ramdisk_id
+            params['container_format'] = 'ami'
+            params['disk_format'] = 'ami'
+
         body = self.image_client.create_image(**params)
         image = body['image'] if 'image' in body else body
         self.addCleanup(self.image_client.delete_image, image['id'])
@@ -858,7 +930,9 @@
         # Compute client
         _images_client = self.compute_images_client
         if name is None:
-            name = data_utils.rand_name(self.__class__.__name__ + 'snapshot')
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__ + 'snapshot')
         LOG.debug("Creating a snapshot image for server: %s", server['name'])
         image = _images_client.create_image(server['id'], name=name, **kwargs)
         # microversion 2.45 and above returns image_id
@@ -1298,7 +1372,8 @@
         name = kwargs.pop('name', None)
         if not name:
             namestart = self.__class__.__name__ + '-volume-origin'
-            name = data_utils.rand_name(namestart)
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name=namestart)
         return self.create_volume(name=name, imageRef=image_id, **kwargs)
 
 
@@ -1328,7 +1403,8 @@
             networks_client = self.networks_client
         if not project_id:
             project_id = networks_client.project_id
-        name = data_utils.rand_name(namestart)
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=namestart)
         network_kwargs = dict(name=name, project_id=project_id)
         if net_dict:
             network_kwargs.update(net_dict)
@@ -1386,7 +1462,8 @@
                                         ip_version, subnets_client, **kwargs):
 
             subnet = dict(
-                name=data_utils.rand_name(namestart),
+                name=data_utils.rand_name(
+                    prefix=CONF.resource_name_prefix, name=namestart),
                 network_id=network['id'],
                 project_id=network['project_id'],
                 ip_version=ip_version,
@@ -1574,7 +1651,8 @@
             name = kwargs.pop('name', None)
             if not name:
                 namestart = self.__class__.__name__ + '-router'
-                name = data_utils.rand_name(namestart)
+                name = data_utils.rand_name(
+                    prefix=CONF.resource_name_prefix, name=namestart)
 
             ext_gw_info = kwargs.pop('external_gateway_info', None)
             if not ext_gw_info:
@@ -1732,7 +1810,7 @@
     def create_container(self, container_name=None):
         """Creates container"""
         name = container_name or data_utils.rand_name(
-            'swift-scenario-container')
+            prefix=CONF.resource_name_prefix, name='swift-scenario-container')
         self.container_client.update_container(name)
         # look for the container to assure it is created
         self.list_and_check_container_objects(name)
@@ -1749,7 +1827,8 @@
 
     def upload_object_to_container(self, container_name, obj_name=None):
         """Uploads object to container"""
-        obj_name = obj_name or data_utils.rand_name('swift-scenario-object')
+        obj_name = obj_name or data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='swift-scenario-object')
         obj_data = data_utils.random_bytes()
         self.object_client.create_object(container_name, obj_name, obj_data)
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
diff --git a/tempest/scenario/test_network_advanced_server_ops.py b/tempest/scenario/test_network_advanced_server_ops.py
index 2c7c085..3a93f74 100644
--- a/tempest/scenario/test_network_advanced_server_ops.py
+++ b/tempest/scenario/test_network_advanced_server_ops.py
@@ -28,25 +28,12 @@
 LOG = log.getLogger(__name__)
 
 
-class TestNetworkAdvancedServerOps(manager.NetworkScenarioTest):
-    """Check VM connectivity after some advanced instance operations executed:
-
-     * Stop/Start an instance
-     * Reboot an instance
-     * Rebuild an instance
-     * Pause/Unpause an instance
-     * Suspend/Resume an instance
-     * Resize an instance
-    """
-
-    @classmethod
-    def setup_clients(cls):
-        super(TestNetworkAdvancedServerOps, cls).setup_clients()
-        cls.admin_servers_client = cls.os_admin.servers_client
+class BaseTestNetworkAdvancedServerOps(manager.NetworkScenarioTest):
+    """Base class for defining methods used in tests."""
 
     @classmethod
     def skip_checks(cls):
-        super(TestNetworkAdvancedServerOps, cls).skip_checks()
+        super(BaseTestNetworkAdvancedServerOps, cls).skip_checks()
         if not (CONF.network.project_networks_reachable or
                 CONF.network.public_network_id):
             msg = ('Either project_networks_reachable must be "true", or '
@@ -56,26 +43,52 @@
             raise cls.skipException("Floating ips are not available")
 
     @classmethod
+    def setup_clients(cls):
+        super(BaseTestNetworkAdvancedServerOps, cls).setup_clients()
+        cls.admin_servers_client = cls.os_admin.servers_client
+        cls.sec_group_rules_client = \
+            cls.os_primary.security_group_rules_client
+        cls.sec_groups_client = cls.os_primary.security_groups_client
+        cls.keypairs_client = cls.os_primary.keypairs_client
+        cls.floating_ips_client = cls.os_primary.floating_ips_client
+        cls.servers_client = cls.os_primary.servers_client
+
+    @classmethod
     def setup_credentials(cls):
         # Create no network resources for these tests.
         cls.set_network_resources()
-        super(TestNetworkAdvancedServerOps, cls).setup_credentials()
+        super(BaseTestNetworkAdvancedServerOps, cls).setup_credentials()
 
-    def _setup_server(self, keypair):
+    def _setup_server(self, keypair, host_spec=None):
         security_groups = []
         if utils.is_extension_enabled('security-group', 'network'):
-            security_group = self.create_security_group()
+            sec_args = {
+                'security_group_rules_client':
+                self.sec_group_rules_client,
+                'security_groups_client':
+                self.sec_groups_client
+            }
+            security_group = self.create_security_group(**sec_args)
             security_groups = [{'name': security_group['name']}]
         network, _, _ = self.setup_network_subnet_with_router()
-        server = self.create_server(
-            networks=[{'uuid': network['id']}],
-            key_name=keypair['name'],
-            security_groups=security_groups)
+        server_args = {
+            'networks': [{'uuid': network['id']}],
+            'key_name': keypair['name'],
+            'security_groups': security_groups,
+        }
+
+        if host_spec is not None:
+            server_args['host'] = host_spec
+            # by default, host can be specified by administrators only
+            server_args['clients'] = self.os_admin
+
+        server = self.create_server(**server_args)
         return server
 
     def _setup_network(self, server, keypair):
         public_network_id = CONF.network.public_network_id
-        floating_ip = self.create_floating_ip(server, public_network_id)
+        floating_ip = self.create_floating_ip(
+            server, public_network_id, client=self.floating_ips_client)
         # Verify that we can indeed connect to the server before we mess with
         # it's state
         self._wait_server_status_and_check_network_connectivity(
@@ -107,6 +120,148 @@
         self._check_network_connectivity(server, keypair, floating_ip,
                                          username=username)
 
+    def _test_server_connectivity_resize(self, src_host=None):
+        resize_flavor = CONF.compute.flavor_ref_alt
+        keypair = self.create_keypair()
+        server = self._setup_server(keypair, src_host)
+        if src_host:
+            server_host = self.get_host_for_server(server['id'])
+            self.assertEqual(server_host, src_host)
+        floating_ip = self._setup_network(server, keypair)
+        self.servers_client.resize_server(server['id'],
+                                          flavor_ref=resize_flavor)
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'VERIFY_RESIZE')
+        self.servers_client.confirm_resize_server(server['id'])
+        server = self.servers_client.show_server(server['id'])['server']
+        # Nova API > 2.46 no longer includes flavor.id, and schema check
+        # will cover whether 'id' should be in flavor
+        if server['flavor'].get('id'):
+            self.assertEqual(resize_flavor, server['flavor']['id'])
+        else:
+            flavor = self.flavors_client.show_flavor(resize_flavor)['flavor']
+            self.assertEqual(flavor['name'], server['flavor']['original_name'])
+            for key in ['ram', 'vcpus', 'disk']:
+                self.assertEqual(flavor[key], server['flavor'][key])
+        self._wait_server_status_and_check_network_connectivity(
+            server, keypair, floating_ip)
+
+    def _test_server_connectivity_cold_migration(self, source_host=None,
+                                                 dest_host=None):
+        keypair = self.create_keypair(client=self.keypairs_client)
+        server = self._setup_server(keypair, source_host)
+        floating_ip = self._setup_network(server, keypair)
+        src_host = self.get_host_for_server(server['id'])
+        if source_host:
+            self.assertEqual(src_host, source_host)
+        self._wait_server_status_and_check_network_connectivity(
+            server, keypair, floating_ip)
+
+        self.admin_servers_client.migrate_server(
+            server['id'], host=dest_host)
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'VERIFY_RESIZE')
+        self.servers_client.confirm_resize_server(server['id'])
+        self._wait_server_status_and_check_network_connectivity(
+            server, keypair, floating_ip)
+        dst_host = self.get_host_for_server(server['id'])
+        if dest_host:
+            self.assertEqual(dst_host, dest_host)
+        self.assertNotEqual(src_host, dst_host)
+
+    def _test_server_connectivity_live_migration(self, source_host=None,
+                                                 dest_host=None,
+                                                 migration=False):
+        keypair = self.create_keypair(client=self.keypairs_client)
+        server = self._setup_server(keypair, source_host)
+        floating_ip = self._setup_network(server, keypair)
+        self._wait_server_status_and_check_network_connectivity(
+            server, keypair, floating_ip)
+
+        block_migration = (CONF.compute_feature_enabled.
+                           block_migration_for_live_migration)
+        src_host = self.get_host_for_server(server['id'])
+        if source_host:
+            self.assertEqual(src_host, source_host)
+
+        downtime_meter = net_downtime.NetDowntimeMeter(
+            floating_ip['floating_ip_address'])
+        self.useFixture(downtime_meter)
+
+        migration_kwargs = {'host': None, 'block_migration': block_migration}
+
+        # check if microversion is less than 2.25 because of
+        # disk_over_commit is depracted since compute api version 2.25
+        # if min_microversion is None, it runs on version < 2.25
+        if not migration and (CONF.compute.min_microversion is None or
+                              CONF.compute.min_microversion < '2.25'):
+            migration_kwargs['disk_over_commit'] = False
+
+        if dest_host:
+            migration_kwargs['host'] = dest_host
+
+        self.admin_servers_client.live_migrate_server(
+            server['id'], **migration_kwargs)
+        waiters.wait_for_server_status(self.servers_client,
+                                       server['id'], 'ACTIVE')
+
+        dst_host = self.get_host_for_server(server['id'])
+        if dest_host:
+            self.assertEqual(dst_host, dest_host)
+
+        self.assertNotEqual(src_host, dst_host, 'Server did not migrate')
+
+        # we first wait until the VM replies pings again, then check the
+        # network downtime
+        self._wait_server_status_and_check_network_connectivity(
+            server, keypair, floating_ip)
+
+        downtime = downtime_meter.get_downtime()
+        self.assertIsNotNone(downtime)
+        LOG.debug("Downtime seconds measured with downtime_meter = %r",
+                  downtime)
+        allowed_downtime = CONF.validation.allowed_network_downtime
+        self.assertLessEqual(
+            downtime, allowed_downtime,
+            "Downtime of {} seconds is higher than expected '{}'".format(
+                downtime, allowed_downtime))
+
+    def _test_server_connectivity_cold_migration_revert(self, source_host=None,
+                                                        dest_host=None):
+        keypair = self.create_keypair(client=self.keypairs_client)
+        server = self._setup_server(keypair, source_host)
+        floating_ip = self._setup_network(server, keypair)
+        src_host = self.get_host_for_server(server['id'])
+        if source_host:
+            self.assertEqual(src_host, source_host)
+        self._wait_server_status_and_check_network_connectivity(
+            server, keypair, floating_ip)
+
+        self.admin_servers_client.migrate_server(
+            server['id'], host=dest_host)
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'VERIFY_RESIZE')
+        if dest_host:
+            self.assertEqual(dest_host,
+                             self.get_host_for_server(server['id']))
+        self.servers_client.revert_resize_server(server['id'])
+        self._wait_server_status_and_check_network_connectivity(
+            server, keypair, floating_ip)
+        dst_host = self.get_host_for_server(server['id'])
+
+        self.assertEqual(src_host, dst_host)
+
+
+class TestNetworkAdvancedServerOps(BaseTestNetworkAdvancedServerOps):
+    """Check VM connectivity after some advanced instance operations executed:
+
+     * Stop/Start an instance
+     * Reboot an instance
+     * Rebuild an instance
+     * Pause/Unpause an instance
+     * Suspend/Resume an instance
+    """
+
     @decorators.idempotent_id('61f1aa9a-1573-410e-9054-afa557cab021')
     @decorators.attr(type='slow')
     @utils.services('compute', 'network')
@@ -190,27 +345,7 @@
     @decorators.attr(type='slow')
     @utils.services('compute', 'network')
     def test_server_connectivity_resize(self):
-        resize_flavor = CONF.compute.flavor_ref_alt
-        keypair = self.create_keypair()
-        server = self._setup_server(keypair)
-        floating_ip = self._setup_network(server, keypair)
-        self.servers_client.resize_server(server['id'],
-                                          flavor_ref=resize_flavor)
-        waiters.wait_for_server_status(self.servers_client, server['id'],
-                                       'VERIFY_RESIZE')
-        self.servers_client.confirm_resize_server(server['id'])
-        server = self.servers_client.show_server(server['id'])['server']
-        # Nova API > 2.46 no longer includes flavor.id, and schema check
-        # will cover whether 'id' should be in flavor
-        if server['flavor'].get('id'):
-            self.assertEqual(resize_flavor, server['flavor']['id'])
-        else:
-            flavor = self.flavors_client.show_flavor(resize_flavor)['flavor']
-            self.assertEqual(flavor['name'], server['original_name'])
-            for key in ['ram', 'vcpus', 'disk']:
-                self.assertEqual(flavor[key], server['flavor'][key])
-        self._wait_server_status_and_check_network_connectivity(
-            server, keypair, floating_ip)
+        self._test_server_connectivity_resize()
 
     @decorators.idempotent_id('a4858f6c-401e-4155-9a49-d5cd053d1a2f')
     @testtools.skipUnless(CONF.compute_feature_enabled.cold_migration,
@@ -221,22 +356,7 @@
     @decorators.attr(type=['slow', 'multinode'])
     @utils.services('compute', 'network')
     def test_server_connectivity_cold_migration(self):
-        keypair = self.create_keypair()
-        server = self._setup_server(keypair)
-        floating_ip = self._setup_network(server, keypair)
-        src_host = self.get_host_for_server(server['id'])
-        self._wait_server_status_and_check_network_connectivity(
-            server, keypair, floating_ip)
-
-        self.admin_servers_client.migrate_server(server['id'])
-        waiters.wait_for_server_status(self.servers_client, server['id'],
-                                       'VERIFY_RESIZE')
-        self.servers_client.confirm_resize_server(server['id'])
-        self._wait_server_status_and_check_network_connectivity(
-            server, keypair, floating_ip)
-        dst_host = self.get_host_for_server(server['id'])
-
-        self.assertNotEqual(src_host, dst_host)
+        self._test_server_connectivity_cold_migration()
 
     @decorators.idempotent_id('03fd1562-faad-11e7-9ea0-fa163e65f5ce')
     @testtools.skipUnless(CONF.compute_feature_enabled.live_migration,
@@ -247,43 +367,7 @@
     @decorators.attr(type=['slow', 'multinode'])
     @utils.services('compute', 'network')
     def test_server_connectivity_live_migration(self):
-        keypair = self.create_keypair()
-        server = self._setup_server(keypair)
-        floating_ip = self._setup_network(server, keypair)
-        self._wait_server_status_and_check_network_connectivity(
-            server, keypair, floating_ip)
-
-        block_migration = (CONF.compute_feature_enabled.
-                           block_migration_for_live_migration)
-        old_host = self.get_host_for_server(server['id'])
-
-        downtime_meter = net_downtime.NetDowntimeMeter(
-            floating_ip['floating_ip_address'])
-        self.useFixture(downtime_meter)
-
-        self.admin_servers_client.live_migrate_server(
-            server['id'], host=None, block_migration=block_migration,
-            disk_over_commit=False)
-        waiters.wait_for_server_status(self.servers_client,
-                                       server['id'], 'ACTIVE')
-
-        new_host = self.get_host_for_server(server['id'])
-        self.assertNotEqual(old_host, new_host, 'Server did not migrate')
-
-        # we first wait until the VM replies pings again, then check the
-        # network downtime
-        self._wait_server_status_and_check_network_connectivity(
-            server, keypair, floating_ip)
-
-        downtime = downtime_meter.get_downtime()
-        self.assertIsNotNone(downtime)
-        LOG.debug("Downtime seconds measured with downtime_meter = %r",
-                  downtime)
-        allowed_downtime = CONF.validation.allowed_network_downtime
-        self.assertLessEqual(
-            downtime, allowed_downtime,
-            "Downtime of {} seconds is higher than expected '{}'".format(
-                downtime, allowed_downtime))
+        self._test_server_connectivity_live_migration()
 
     @decorators.idempotent_id('25b188d7-0183-4b1e-a11d-15840c8e2fd6')
     @testtools.skipUnless(CONF.compute_feature_enabled.cold_migration,
@@ -294,19 +378,95 @@
     @decorators.attr(type=['slow', 'multinode'])
     @utils.services('compute', 'network')
     def test_server_connectivity_cold_migration_revert(self):
-        keypair = self.create_keypair()
-        server = self._setup_server(keypair)
-        floating_ip = self._setup_network(server, keypair)
-        src_host = self.get_host_for_server(server['id'])
-        self._wait_server_status_and_check_network_connectivity(
-            server, keypair, floating_ip)
+        self._test_server_connectivity_cold_migration_revert()
 
-        self.admin_servers_client.migrate_server(server['id'])
-        waiters.wait_for_server_status(self.servers_client, server['id'],
-                                       'VERIFY_RESIZE')
-        self.servers_client.revert_resize_server(server['id'])
-        self._wait_server_status_and_check_network_connectivity(
-            server, keypair, floating_ip)
-        dst_host = self.get_host_for_server(server['id'])
 
-        self.assertEqual(src_host, dst_host)
+class TestNetworkAdvancedServerMigrationWithHost(
+    BaseTestNetworkAdvancedServerOps):
+
+    """Check VM connectivity with specifying source and destination hosts:
+
+    * Resize an instance by creating server on configured source host
+    * Migrate server by creating it on configured source host and migrate it
+        - Cold Migration
+        - Cold Migration with revert
+        - Live Migration
+    """
+    credentials = ['primary', 'admin']
+    compute_min_microversion = "2.74"
+
+    @classmethod
+    def skip_checks(cls):
+        super(TestNetworkAdvancedServerMigrationWithHost, cls).skip_checks()
+        if not (CONF.compute.migration_source_host or
+                CONF.compute.migration_dest_host):
+            raise cls.skipException("migration_source_host or "
+                                    "migration_dest_host is required")
+        if (CONF.compute.migration_source_host and
+            CONF.compute.migration_dest_host and
+            CONF.compute.migration_source_host ==
+            CONF.compute.migration_dest_host):
+            raise cls.skipException("migration_source_host and "
+                                    "migration_dest_host must be different")
+
+    @classmethod
+    def setup_clients(cls):
+        super(BaseTestNetworkAdvancedServerOps, cls).setup_clients()
+        cls.sec_group_rules_client = \
+            cls.os_admin.security_group_rules_client
+        cls.sec_groups_client = cls.os_admin.security_groups_client
+        cls.keypairs_client = cls.os_admin.keypairs_client
+        cls.floating_ips_client = cls.os_admin.floating_ips_client
+        cls.servers_client = cls.os_admin.servers_client
+        cls.admin_servers_client = cls.os_admin.servers_client
+
+    @decorators.idempotent_id('06e23934-79ae-11ee-b962-0242ac120002')
+    @testtools.skipUnless(CONF.compute_feature_enabled.resize,
+                          'Resize is not available.')
+    @decorators.attr(type='slow')
+    @utils.services('compute', 'network')
+    def test_server_connectivity_resize(self):
+        source_host = CONF.compute.migration_source_host
+        self._test_server_connectivity_resize(src_host=source_host)
+
+    @decorators.idempotent_id('14f0c9e6-79ae-11ee-b962-0242ac120002')
+    @testtools.skipUnless(CONF.compute_feature_enabled.cold_migration,
+                          'Cold migration is not available.')
+    @testtools.skipUnless(CONF.compute.min_compute_nodes > 1,
+                          'Less than 2 compute nodes, skipping multinode '
+                          'tests.')
+    @decorators.attr(type=['slow', 'multinode'])
+    @utils.services('compute', 'network')
+    def test_server_connectivity_cold_migration(self):
+        source_host = CONF.compute.migration_source_host
+        dest_host = CONF.compute.migration_dest_host
+        self._test_server_connectivity_cold_migration(
+            source_host=source_host, dest_host=dest_host)
+
+    @decorators.idempotent_id('1c13933e-79ae-11ee-b962-0242ac120002')
+    @testtools.skipUnless(CONF.compute_feature_enabled.live_migration,
+                          'Live migration is not available.')
+    @testtools.skipUnless(CONF.compute.min_compute_nodes > 1,
+                          'Less than 2 compute nodes, skipping multinode '
+                          'tests.')
+    @decorators.attr(type=['slow', 'multinode'])
+    @utils.services('compute', 'network')
+    def test_server_connectivity_live_migration(self):
+        source_host = CONF.compute.migration_source_host
+        dest_host = CONF.compute.migration_dest_host
+        self._test_server_connectivity_live_migration(
+            source_host=source_host, dest_host=dest_host, migration=True)
+
+    @decorators.idempotent_id('2627789a-79ae-11ee-b962-0242ac120002')
+    @testtools.skipUnless(CONF.compute_feature_enabled.cold_migration,
+                          'Cold migration is not available.')
+    @testtools.skipUnless(CONF.compute.min_compute_nodes > 1,
+                          'Less than 2 compute nodes, skipping multinode '
+                          'tests.')
+    @decorators.attr(type=['slow', 'multinode'])
+    @utils.services('compute', 'network')
+    def test_server_connectivity_cold_migration_revert(self):
+        source_host = CONF.compute.migration_source_host
+        dest_host = CONF.compute.migration_dest_host
+        self._test_server_connectivity_cold_migration_revert(
+            source_host=source_host, dest_host=dest_host)
diff --git a/tempest/scenario/test_network_qos_placement.py b/tempest/scenario/test_network_qos_placement.py
index 0b2cfcb..055dcb6 100644
--- a/tempest/scenario/test_network_qos_placement.py
+++ b/tempest/scenario/test_network_qos_placement.py
@@ -67,10 +67,10 @@
         cls.networks_client = cls.os_admin.networks_client
         cls.subnets_client = cls.os_admin.subnets_client
         cls.ports_client = cls.os_primary.ports_client
-        cls.routers_client = cls.os_adm.routers_client
+        cls.routers_client = cls.os_admin.routers_client
         cls.qos_client = cls.os_admin.qos_client
         cls.qos_min_bw_client = cls.os_admin.qos_min_bw_client
-        cls.flavors_client = cls.os_adm.flavors_client
+        cls.flavors_client = cls.os_admin.flavors_client
         cls.servers_client = cls.os_primary.servers_client
 
     def _create_flavor_to_resize_to(self):
@@ -113,7 +113,8 @@
         self, name_prefix, min_kbps, direction="ingress"
     ):
         policy = self.qos_client.create_qos_policy(
-            name=data_utils.rand_name(name_prefix),
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name=name_prefix),
             shared=True)['policy']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.qos_client.delete_qos_policy, policy['id'])
@@ -600,7 +601,7 @@
 
     def _create_qos_policy_with_bw_and_pps_rules(self, min_kbps, min_kpps):
         policy = self.qos_client.create_qos_policy(
-            name=data_utils.rand_name(),
+            name=data_utils.rand_name(prefix=CONF.resource_name_prefix),
             shared=True
         )['policy']
         self.addCleanup(
@@ -660,10 +661,11 @@
 
     def _create_port_with_qos_policy(self, policy):
         port = self.ports_client.create_port(
-            name=data_utils.rand_name(self.__class__.__name__),
+            name=data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__class__.__name__),
             network_id=self.network['id'],
-            qos_policy_id=policy['id'] if policy else None,
-        )['port']
+            qos_policy_id=policy['id'] if policy else None)['port']
         self.addCleanup(
             test_utils.call_and_ignore_notfound_exc,
             self.ports_client.delete_port, port['id']
diff --git a/tempest/scenario/test_security_groups_basic_ops.py b/tempest/scenario/test_security_groups_basic_ops.py
index 2fc5f32..752b854 100644
--- a/tempest/scenario/test_security_groups_basic_ops.py
+++ b/tempest/scenario/test_security_groups_basic_ops.py
@@ -300,7 +300,8 @@
                    tenant=tenant.creds.tenant_name,
                    num=i
             )
-            name = data_utils.rand_name(name)
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix, name=name)
             server = self._create_server(name, tenant,
                                          [tenant.security_groups['default']])
             tenant.servers.append(server)
@@ -312,7 +313,8 @@
         secgroups = tenant.security_groups.values()
         name = 'server-{tenant}-access_point'.format(
             tenant=tenant.creds.tenant_name)
-        name = data_utils.rand_name(name)
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=name)
         server = self._create_server(name, tenant,
                                      security_groups=secgroups)
         tenant.access_point = server
@@ -555,7 +557,8 @@
         name = 'server-{tenant}-gen-1'.format(
                tenant=new_tenant.creds.tenant_name
         )
-        name = data_utils.rand_name(name)
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=name)
         server = self._create_server(name, new_tenant,
                                      [new_tenant.security_groups['default']])
 
@@ -624,7 +627,8 @@
         name = 'server-{tenant}-gen-1'.format(
                tenant=new_tenant.creds.tenant_name
         )
-        name = data_utils.rand_name(name)
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=name)
         server = self._create_server(name, new_tenant,
                                      [new_tenant.security_groups['default']])
 
@@ -668,7 +672,8 @@
         tenant = self.primary_tenant
         self._create_tenant_network(tenant, port_security_enabled=False)
         self.assertFalse(tenant.network['port_security_enabled'])
-        name = data_utils.rand_name('server-smoke')
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='server-smoke')
         sec_groups = []
         server = self._create_server(name, tenant, sec_groups)
         server_id = server['id']
diff --git a/tempest/scenario/test_unified_limits.py b/tempest/scenario/test_unified_limits.py
index 22256b4..6e194f9 100644
--- a/tempest/scenario/test_unified_limits.py
+++ b/tempest/scenario/test_unified_limits.py
@@ -71,7 +71,9 @@
         """Wrapper that returns a test image."""
 
         if 'name' not in kwargs:
-            name = data_utils.rand_name(self.__name__ + "-image")
+            name = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.__name__ + "-image")
             kwargs['name'] = name
 
         params = dict(kwargs)
diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py
index 6ebee48..5e28ecd 100644
--- a/tempest/scenario/test_volume_boot_pattern.py
+++ b/tempest/scenario/test_volume_boot_pattern.py
@@ -187,8 +187,9 @@
     def test_image_defined_boot_from_volume(self):
         # create an instance from image-backed volume
         volume_origin = self.create_volume_from_image()
-        name = data_utils.rand_name(self.__class__.__name__ +
-                                    '-volume-backed-server')
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-volume-backed-server')
         instance1 = self.boot_instance_from_resource(
             source_id=volume_origin['id'],
             source_type='volume',
@@ -205,8 +206,9 @@
         # about the volume snapshot. The compute service will use this to
         # create a volume from the volume snapshot and use that as the root
         # disk for the server.
-        name = data_utils.rand_name(self.__class__.__name__ +
-                                    '-image-snapshot-server')
+        name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name=self.__class__.__name__ + '-image-snapshot-server')
         instance2 = self.create_server(image_id=image['id'], name=name,
                                        wait_until='SSHABLE')
 
diff --git a/tempest/scenario/test_volume_migrate_attached.py b/tempest/scenario/test_volume_migrate_attached.py
index 5005346..f34bfd6 100644
--- a/tempest/scenario/test_volume_migrate_attached.py
+++ b/tempest/scenario/test_volume_migrate_attached.py
@@ -96,10 +96,7 @@
         waiters.wait_for_volume_retype(self.volumes_client,
                                        volume_id, new_volume_type)
 
-    @decorators.attr(type='slow')
-    @decorators.idempotent_id('deadd2c2-beef-4dce-98be-f86765ff311b')
-    @utils.services('compute', 'volume')
-    def test_volume_retype_attached(self):
+    def _test_volume_retype_attached(self, dev_name=None):
         LOG.info("Creating keypair and security group")
         keypair = self.create_keypair()
         security_group = self.create_security_group()
@@ -108,18 +105,30 @@
         LOG.info("Creating Volume types")
         source_type, dest_type = self._create_volume_types()
 
-        # create an instance from volume
-        LOG.info("Booting instance from volume")
-        volume_id = self.create_volume(imageRef=CONF.compute.image_ref,
-                                       volume_type=source_type['name'])['id']
+        if dev_name is None:
+            # create an instance from volume
+            LOG.info("Booting instance from volume")
+            volume_id = self.create_volume(
+                imageRef=CONF.compute.image_ref,
+                volume_type=source_type['name'])['id']
 
-        instance = self._boot_instance_from_volume(volume_id, keypair,
-                                                   security_group)
+            instance = self._boot_instance_from_volume(volume_id, keypair,
+                                                       security_group)
+        else:
+            LOG.info("Booting instance from image and attaching data volume")
+            key_name = keypair['name']
+            security_groups = [{'name': security_group['name']}]
+            instance = self.create_server(key_name=key_name,
+                                          security_groups=security_groups)
+            volume = self.create_volume(volume_type=source_type['name'])
+            volume_id = volume['id']
+            volume = self.nova_volume_attach(instance, volume)
 
         # write content to volume on instance
         LOG.info("Setting timestamp in instance %s", instance['id'])
         ip_instance = self.get_server_ip(instance)
         timestamp = self.create_timestamp(ip_instance,
+                                          dev_name=dev_name,
                                           private_key=keypair['private_key'],
                                           server=instance)
 
@@ -134,6 +143,7 @@
         LOG.info("Getting timestamp in postmigrated instance %s",
                  instance['id'])
         timestamp2 = self.get_timestamp(ip_instance,
+                                        dev_name=dev_name,
                                         private_key=keypair['private_key'],
                                         server=instance)
         self.assertEqual(timestamp, timestamp2)
@@ -152,10 +162,35 @@
             instance['id'])['volumeAttachments']
         self.assertEqual(volume_id, attached_volumes[0]['id'])
 
+        # Reboot the instance and verify it boots successfully
+        LOG.info("Hard rebooting instance %s", instance['id'])
+        self.servers_client.reboot_server(instance['id'], type='HARD')
+        waiters.wait_for_server_status(
+            self.servers_client, instance['id'], 'ACTIVE')
+
+        # check the content of written file to verify the instance is working
+        # after being rebooted
+        LOG.info("Getting timestamp in postmigrated rebooted instance %s",
+                 instance['id'])
+        timestamp2 = self.get_timestamp(ip_instance,
+                                        dev_name=dev_name,
+                                        private_key=keypair['private_key'],
+                                        server=instance)
+        self.assertEqual(timestamp, timestamp2)
+
     @decorators.attr(type='slow')
-    @decorators.idempotent_id('fe47b1ed-640e-4e3b-a090-200e25607362')
+    @decorators.idempotent_id('deadd2c2-beef-4dce-98be-f86765ff311b')
     @utils.services('compute', 'volume')
-    def test_volume_migrate_attached(self):
+    def test_volume_retype_attached(self):
+        self._test_volume_retype_attached()
+
+    @decorators.attr(type='slow')
+    @decorators.idempotent_id('122e070c-a5b2-470c-af2b-81e9dbefb9e8')
+    @utils.services('compute', 'volume')
+    def test_volume_retype_attached_data_volume(self):
+        self._test_volume_retype_attached(dev_name='vdb')
+
+    def _test_volume_migrate_attached(self, dev_name=None):
         LOG.info("Creating keypair and security group")
         keypair = self.create_keypair()
         security_group = self.create_security_group()
@@ -163,16 +198,26 @@
         LOG.info("Creating volume")
         # Create a unique volume type to avoid using the backend default
         migratable_type = self.create_volume_type()['name']
-        volume_id = self.create_volume(imageRef=CONF.compute.image_ref,
-                                       volume_type=migratable_type)['id']
-        volume = self.admin_volumes_client.show_volume(volume_id)
 
-        LOG.info("Booting instance from volume")
-        instance = self._boot_instance_from_volume(volume_id, keypair,
-                                                   security_group)
+        if dev_name is None:
+            volume_id = self.create_volume(imageRef=CONF.compute.image_ref,
+                                           volume_type=migratable_type)['id']
+            LOG.info("Booting instance from volume")
+            instance = self._boot_instance_from_volume(volume_id, keypair,
+                                                       security_group)
+        else:
+            LOG.info("Booting instance from image and attaching data volume")
+            key_name = keypair['name']
+            security_groups = [{'name': security_group['name']}]
+            instance = self.create_server(key_name=key_name,
+                                          security_groups=security_groups)
+            volume = self.create_volume(volume_type=migratable_type)
+            volume_id = volume['id']
+            volume = self.nova_volume_attach(instance, volume)
 
         # Identify the source and destination hosts for the migration
-        src_host = volume['volume']['os-vol-host-attr:host']
+        volume = self.admin_volumes_client.show_volume(volume_id)['volume']
+        src_host = volume['os-vol-host-attr:host']
 
         # Select the first c-vol host that isn't hosting the volume as the dest
         # host['host_name'] should take the format of host@backend.
@@ -186,6 +231,7 @@
 
         ip_instance = self.get_server_ip(instance)
         timestamp = self.create_timestamp(ip_instance,
+                                          dev_name=dev_name,
                                           private_key=keypair['private_key'],
                                           server=instance)
 
@@ -202,6 +248,7 @@
         LOG.info("Getting timestamp in postmigrated instance %s",
                  instance['id'])
         timestamp2 = self.get_timestamp(ip_instance,
+                                        dev_name=dev_name,
                                         private_key=keypair['private_key'],
                                         server=instance)
         self.assertEqual(timestamp, timestamp2)
@@ -216,3 +263,31 @@
             instance['id'])['volumeAttachments']
         attached_volume_id = attached_volumes[0]['id']
         self.assertEqual(volume_id, attached_volume_id)
+
+        # Reboot the instance and verify it boots successfully
+        LOG.info("Hard rebooting instance %s", instance['id'])
+        self.servers_client.reboot_server(instance['id'], type='HARD')
+        waiters.wait_for_server_status(
+            self.servers_client, instance['id'], 'ACTIVE')
+
+        # check the content of written file to verify the instance is working
+        # after being rebooted
+        LOG.info("Getting timestamp in postmigrated rebooted instance %s",
+                 instance['id'])
+        timestamp2 = self.get_timestamp(ip_instance,
+                                        dev_name=dev_name,
+                                        private_key=keypair['private_key'],
+                                        server=instance)
+        self.assertEqual(timestamp, timestamp2)
+
+    @decorators.attr(type='slow')
+    @decorators.idempotent_id('fe47b1ed-640e-4e3b-a090-200e25607362')
+    @utils.services('compute', 'volume')
+    def test_volume_migrate_attached(self):
+        self._test_volume_migrate_attached()
+
+    @decorators.attr(type='slow')
+    @decorators.idempotent_id('1b8661cb-db93-4110-860b-201295027b78')
+    @utils.services('compute', 'volume')
+    def test_volume_migrate_attached_data_volume(self):
+        self._test_volume_migrate_attached(dev_name='vdb')
diff --git a/tempest/serial_tests/README.rst b/tempest/serial_tests/README.rst
new file mode 100644
index 0000000..40a50f4
--- /dev/null
+++ b/tempest/serial_tests/README.rst
@@ -0,0 +1,61 @@
+.. _serial_tests_guide:
+
+Tempest Field Guide to Serial tests
+===================================
+
+
+What are these tests?
+---------------------
+
+Tempest can run tests serially as well as in parallel, depending on the
+configuration that is fully up to the user. However, sometimes you need to
+make sure that tests are not interfering with each other via OpenStack
+resources with the other tests running in parallel. Tempest creates separate
+projects for each test class to separate project based resources between test
+cases.
+
+If your tests use resources outside of projects, e.g. host aggregates then
+you might need to explicitly separate interfering test cases. If you only need
+to separate a small set of test cases from each other then you can use the
+``LockFixture``.
+
+However, in some cases, a small set of tests needs to be run serially. For
+example, some of the host aggregate and availability zone testing needs
+compute nodes without any running nova server to be able to move compute hosts
+between availability zones. But many tempest tests start one or more nova
+servers.
+
+
+Why are these tests in Tempest?
+-------------------------------
+
+This is one of Tempest's core purposes, testing the integration between
+projects.
+
+
+Scope of these tests
+--------------------
+
+The tests should always use the Tempest implementation of the OpenStack API,
+as we want to ensure that bugs aren't hidden by the official clients.
+
+Tests should be tagged with which services they exercise, as
+determined by which client libraries are used directly by the test.
+
+
+Example of a good test
+----------------------
+
+While we are looking for interaction of 2 or more services, be specific in
+your interactions. A giant "this is my data center" smoke test is hard to
+debug when it goes wrong.
+
+The tests that need to be run serially need to be marked with the
+``@serial`` class decorator. This will make sure that even if tempest is
+configured to run the tests in parallel, these tests will always be executed
+separately from the rest of the test cases.
+
+Please note that due to test ordering optimization reasons test cases marked
+for ``@serial`` execution need to be put under ``tempest/serial_tests``
+directory. This will ensure that the serial tests will block the parallel tests
+in the least amount of time.
diff --git a/tempest/serial_tests/api/admin/test_aggregates.py b/tempest/serial_tests/api/admin/test_aggregates.py
index 2ca91aa..cedeec0 100644
--- a/tempest/serial_tests/api/admin/test_aggregates.py
+++ b/tempest/serial_tests/api/admin/test_aggregates.py
@@ -63,7 +63,9 @@
 
     def _create_test_aggregate(self, **kwargs):
         if 'name' not in kwargs:
-            kwargs['name'] = data_utils.rand_name(self.aggregate_name_prefix)
+            kwargs['name'] = data_utils.rand_name(
+                prefix=CONF.resource_name_prefix,
+                name=self.aggregate_name_prefix)
         aggregate = self.client.create_aggregate(**kwargs)['aggregate']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.client.delete_aggregate, aggregate['id'])
@@ -87,7 +89,8 @@
     @decorators.idempotent_id('5873a6f8-671a-43ff-8838-7ce430bb6d0b')
     def test_aggregate_create_delete_with_az(self):
         """Test create/delete aggregate with availability_zone"""
-        az_name = data_utils.rand_name(self.az_name_prefix)
+        az_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=self.az_name_prefix)
         aggregate = self._create_test_aggregate(availability_zone=az_name)
         self.assertEqual(az_name, aggregate['availability_zone'])
 
@@ -125,8 +128,10 @@
     @decorators.idempotent_id('4d2b2004-40fa-40a1-aab2-66f4dab81beb')
     def test_aggregate_create_update_with_az(self):
         """Test create/update aggregate with availability_zone"""
-        aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
-        az_name = data_utils.rand_name(self.az_name_prefix)
+        aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=self.aggregate_name_prefix)
+        az_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=self.az_name_prefix)
         aggregate = self._create_test_aggregate(
             name=aggregate_name, availability_zone=az_name)
 
@@ -153,7 +158,8 @@
     def test_aggregate_add_remove_host(self):
         """Test adding host to and removing host from aggregate"""
         self.useFixture(fixtures.LockFixture('availability_zone'))
-        aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
+        aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=self.aggregate_name_prefix)
         aggregate = self._create_test_aggregate(name=aggregate_name)
 
         body = (self.client.add_host(aggregate['id'], host=self.host)
@@ -177,7 +183,8 @@
         Add a host to the given aggregate and list.
         """
         self.useFixture(fixtures.LockFixture('availability_zone'))
-        aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
+        aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=self.aggregate_name_prefix)
         aggregate = self._create_test_aggregate(name=aggregate_name)
 
         self.client.add_host(aggregate['id'], host=self.host)
@@ -199,7 +206,8 @@
         Add a host to the given aggregate and get details.
         """
         self.useFixture(fixtures.LockFixture('availability_zone'))
-        aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
+        aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=self.aggregate_name_prefix)
         aggregate = self._create_test_aggregate(name=aggregate_name)
 
         self.client.add_host(aggregate['id'], host=self.host)
@@ -215,7 +223,8 @@
     def test_aggregate_add_host_create_server_with_az(self):
         """Test adding a host to the given aggregate and creating a server"""
         self.useFixture(fixtures.LockFixture('availability_zone'))
-        az_name = data_utils.rand_name(self.az_name_prefix)
+        az_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=self.az_name_prefix)
         aggregate = self._create_test_aggregate(availability_zone=az_name)
 
         # Find a host that has not been added to other availability zone,
@@ -269,7 +278,8 @@
         # Checking create aggregate API response schema
         aggregate = self._create_test_aggregate()
 
-        new_aggregate_name = data_utils.rand_name(self.aggregate_name_prefix)
+        new_aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name=self.aggregate_name_prefix)
         # Checking update aggregate API response schema
         self.client.update_aggregate(aggregate['id'], name=new_aggregate_name)
         # Checking show aggregate API response schema
diff --git a/tempest/serial_tests/scenario/test_aggregates_basic_ops.py b/tempest/serial_tests/scenario/test_aggregates_basic_ops.py
index ba31d84..a831fe5 100644
--- a/tempest/serial_tests/scenario/test_aggregates_basic_ops.py
+++ b/tempest/serial_tests/scenario/test_aggregates_basic_ops.py
@@ -15,10 +15,13 @@
 
 from tempest.common import tempest_fixtures as fixtures
 from tempest.common import utils
+from tempest import config
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 from tempest.scenario import manager
 
+CONF = config.CONF
+
 
 @decorators.serial
 class TestAggregatesBasicOps(manager.ScenarioTest):
@@ -119,7 +122,8 @@
     def test_aggregate_basic_ops(self):
         self.useFixture(fixtures.LockFixture('availability_zone'))
         az = 'foo_zone'
-        aggregate_name = data_utils.rand_name('aggregate-scenario')
+        aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix, name='aggregate-scenario')
         aggregate = self._create_aggregate(name=aggregate_name,
                                            availability_zone=az)
 
@@ -131,7 +135,9 @@
         self._check_aggregate_details(aggregate, aggregate_name, az, [host],
                                       metadata)
 
-        aggregate_name = data_utils.rand_name('renamed-aggregate-scenario')
+        aggregate_name = data_utils.rand_name(
+            prefix=CONF.resource_name_prefix,
+            name='renamed-aggregate-scenario')
         # Updating the name alone. The az must be specified again otherwise
         # the tempest client would send None in the put body
         aggregate = self._update_aggregate(aggregate, aggregate_name, az)
diff --git a/tempest/test.py b/tempest/test.py
index 3360221..a766367 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -26,7 +26,6 @@
 
 from tempest import clients
 from tempest.common import credentials_factory as credentials
-from tempest.common import utils
 from tempest import config
 from tempest.lib.common import api_microversion_fixture
 from tempest.lib.common import fixed_network
@@ -45,20 +44,6 @@
     version='Pike', removal_version='?')
 
 
-services = debtcollector.moves.moved_function(
-    utils.services, 'services', __name__,
-    version='Pike', removal_version='?')
-
-
-requires_ext = debtcollector.moves.moved_function(
-    utils.requires_ext, 'requires_ext', __name__,
-    version='Pike', removal_version='?')
-
-
-is_extension_enabled = debtcollector.moves.moved_function(
-    utils.is_extension_enabled, 'is_extension_enabled', __name__,
-    version='Pike', removal_version='?')
-
 at_exit_set = set()
 
 
diff --git a/tempest/tests/README.rst b/tempest/tests/README.rst
index 0587e7b..081dd07 100644
--- a/tempest/tests/README.rst
+++ b/tempest/tests/README.rst
@@ -14,6 +14,7 @@
 
 Why are these tests in Tempest?
 -------------------------------
+
 These tests exist to make sure that the mechanisms that we use inside of
 Tempest are valid and remain functional. They are only here for self
 validation of Tempest.
@@ -21,6 +22,7 @@
 
 Scope of these tests
 --------------------
+
 Unit tests should not require an external service to be running or any extra
 configuration to run. Any state that is required for a test should either be
 mocked out or created in a temporary test directory. (see test_wrappers.py for
diff --git a/tempest/tests/cmd/test_cleanup_services.py b/tempest/tests/cmd/test_cleanup_services.py
index 2301be6..6b3b4b7 100644
--- a/tempest/tests/cmd/test_cleanup_services.py
+++ b/tempest/tests/cmd/test_cleanup_services.py
@@ -44,6 +44,7 @@
                   'saved_state_json': {'saved': 'data'},
                   'is_preserve': False,
                   'is_save_state': True,
+                  'prefix': 'tempest',
                   'tenant_id': 'project_id',
                   'got_exceptions': []}
         base = cleanup_service.BaseService(kwargs)
@@ -54,6 +55,7 @@
         self.assertTrue(base.is_save_state)
         self.assertEqual(base.tenant_filter['project_id'], kwargs['tenant_id'])
         self.assertEqual(base.got_exceptions, kwargs['got_exceptions'])
+        self.assertEqual(base.prefix, kwargs['prefix'])
 
     def test_not_implemented_ex(self):
         kwargs = {'data': {'data': 'test'},
@@ -61,6 +63,7 @@
                   'saved_state_json': {'saved': 'data'},
                   'is_preserve': False,
                   'is_save_state': False,
+                  'prefix': 'tempest',
                   'tenant_id': 'project_id',
                   'got_exceptions': []}
         base = self.TestException(kwargs)
@@ -188,7 +191,8 @@
     service_name = 'default'
 
     def _create_cmd_service(self, service_type, is_save_state=False,
-                            is_preserve=False, is_dry_run=False):
+                            is_preserve=False, is_dry_run=False,
+                            prefix=''):
         creds = fake_credentials.FakeKeystoneV3Credentials()
         os = clients.Manager(creds)
         return getattr(cleanup_service, service_type)(
@@ -196,6 +200,7 @@
             is_save_state=is_save_state,
             is_preserve=is_preserve,
             is_dry_run=is_dry_run,
+            prefix=prefix,
             project_id='b8e3ece07bb049138d224436756e3b57',
             data={},
             saved_state_json=self.saved_state
diff --git a/tempest/tests/cmd/test_run.py b/tempest/tests/cmd/test_run.py
index 3b5e901..b487c3f 100644
--- a/tempest/tests/cmd/test_run.py
+++ b/tempest/tests/cmd/test_run.py
@@ -225,6 +225,11 @@
                             '%s=%s' % (self.exclude_list, path),
                             '--regex', 'fail'], 1)
 
+    def test_tempest_run_with_slowest(self):
+        out, err = self.assertRunExit(['tempest', 'run', '--regex', 'passing',
+                                       '--slowest'], 0)
+        self.assertRegex(str(out), r'Test id\s+Runtime \(s\)')
+
 
 class TestOldArgRunReturnCode(TestRunReturnCode):
     """A class for testing deprecated but still supported args.
@@ -363,6 +368,7 @@
         parsed_args.state = None
         parsed_args.list_tests = False
         parsed_args.config_file = path
+        parsed_args.slowest = False
 
         with mock.patch('stestr.commands.run_command') as m:
             m.return_value = 0
@@ -393,6 +399,7 @@
         parsed_args.state = None
         parsed_args.list_tests = False
         parsed_args.config_file = path
+        parsed_args.slowest = False
 
         with mock.patch('stestr.commands.run_command') as m:
             m.return_value = 0
@@ -409,6 +416,7 @@
         parsed_args.state = None
         parsed_args.list_tests = False
         parsed_args.config_file = ''
+        parsed_args.slowest = False
 
         with mock.patch('stestr.commands.run_command') as m:
             m.return_value = 0
@@ -441,6 +449,7 @@
         parsed_args.state = True
         parsed_args.list_tests = False
         parsed_args.config_file = ''
+        parsed_args.slowest = False
 
         with mock.patch('stestr.commands.run_command') as m:
             m.return_value = 0
@@ -460,6 +469,7 @@
         parsed_args.state = True
         parsed_args.list_tests = False
         parsed_args.config_file = path
+        parsed_args.slowest = False
 
         with mock.patch('stestr.commands.run_command') as m:
             m.return_value = 0
diff --git a/tempest/tests/common/test_compute.py b/tempest/tests/common/test_compute.py
index 142bb08..4d933cd 100644
--- a/tempest/tests/common/test_compute.py
+++ b/tempest/tests/common/test_compute.py
@@ -17,8 +17,9 @@
 
 from urllib import parse as urlparse
 
-
 from tempest.common import compute
+from tempest import exceptions
+from tempest.lib import exceptions as lib_exc
 from tempest.tests import base
 
 
@@ -28,6 +29,58 @@
         self.client_sock = mock.Mock()
         self.url = urlparse.urlparse("http://www.fake.com:80")
 
+    @mock.patch('tempest.common.compute.' 'config.CONF.validation')
+    def test_get_server_ip_connect_method_floating(self, mock_conf):
+        fake_server = {'id': 'fake-uuid'}
+        fake_vr = {'floating_ip': {'ip': '10.10.10.1'}}
+        mock_conf.connect_method = 'floating'
+
+        fake_server_ip = compute.get_server_ip(fake_server, fake_vr)
+        self.assertEqual(fake_server_ip, '10.10.10.1')
+
+        # assert that InvalidParam is raised when validadation
+        # resources are not set
+        self.assertRaises(lib_exc.InvalidParam,
+                          compute.get_server_ip,
+                          fake_server)
+
+    @mock.patch('tempest.common.compute.' 'config.CONF.validation')
+    def test_get_server_ip_connect_method_fixed(self, mock_conf):
+        fake_server = {'id': 'fake-uuid',
+                       'addresses': {
+                           'private': [
+                               {'addr': '192.168.0.3',
+                                'version': 4}]}}
+        mock_conf.connect_method = 'fixed'
+        mock_conf.network_for_ssh = 'private'
+        mock_conf.ip_version_for_ssh = 4
+
+        fake_server_ip = compute.get_server_ip(fake_server)
+        self.assertEqual(fake_server_ip, '192.168.0.3')
+
+        fake_server_v6 = {'id': 'fake-uuid',
+                          'addresses': {
+                              'private': [
+                                  {'addr': '2345:0425:2CA1::0567:5673:23b5',
+                                   'version': 6}]}}
+        # assert when server is unreachable
+        self.assertRaises(exceptions.ServerUnreachable,
+                          compute.get_server_ip,
+                          fake_server_v6)
+
+    @mock.patch('tempest.common.compute.' 'config.CONF.validation')
+    def test_get_server_ip_invalid_config(self, mock_conf):
+        fake_server = {'id': 'fake-uuid',
+                       'addresses': {
+                           'private': [
+                               {'addr': '192.168.0.3',
+                                'version': 4}]}}
+        mock_conf.connect_method = 'fake-method'
+        # assert when the connection method is not correctly set
+        self.assertRaises(lib_exc.InvalidConfiguration,
+                          compute.get_server_ip,
+                          fake_server)
+
     def test_rfp_frame_not_cached(self):
         # rfp negotiation frame arrived separately after upgrade
         # response, so it's not cached.
diff --git a/tempest/tests/common/test_credentials_factory.py b/tempest/tests/common/test_credentials_factory.py
index 374474d..8a1158d 100644
--- a/tempest/tests/common/test_credentials_factory.py
+++ b/tempest/tests/common/test_credentials_factory.py
@@ -37,7 +37,7 @@
                          fake_config.FakePrivate)
 
     def test_get_dynamic_provider_params_creds_v2(self):
-        expected_uri = 'EXPECTED_V2_URI'
+        expected_uri = 'http://v2.identy.example.com'
         cfg.CONF.set_default('uri', expected_uri, group='identity')
         admin_creds = fake_credentials.FakeCredentials()
         params = cf.get_dynamic_provider_params('v2', admin_creds=admin_creds)
@@ -48,7 +48,7 @@
             self.assertEqual(expected_params[key], params[key])
 
     def test_get_dynamic_provider_params_creds_v3(self):
-        expected_uri = 'EXPECTED_V3_URI'
+        expected_uri = 'http://v3.identy.example.com'
         cfg.CONF.set_default('uri_v3', expected_uri, group='identity')
         admin_creds = fake_credentials.FakeCredentials()
         params = cf.get_dynamic_provider_params('v3', admin_creds=admin_creds)
@@ -76,14 +76,14 @@
                 fill_in=True, identity_version=expected_identity_version)
 
     def test_get_preprov_provider_params_creds_v2(self):
-        expected_uri = 'EXPECTED_V2_URI'
+        expected_uri = 'http://v2.identy.example.com'
         cfg.CONF.set_default('uri', expected_uri, group='identity')
         params = cf.get_preprov_provider_params('v2')
         self.assertIn('identity_uri', params)
         self.assertEqual(expected_uri, params['identity_uri'])
 
     def test_get_preprov_provider_params_creds_v3(self):
-        expected_uri = 'EXPECTED_V3_URI'
+        expected_uri = 'http://v3.identy.example.com'
         cfg.CONF.set_default('uri_v3', expected_uri, group='identity')
         params = cf.get_preprov_provider_params('v3')
         self.assertIn('identity_uri', params)
@@ -237,7 +237,7 @@
 
     @mock.patch('tempest.lib.auth.get_credentials')
     def test_get_credentials_v2(self, mock_auth_get_credentials):
-        expected_uri = 'V2_URI'
+        expected_uri = 'http://v2.identity.example.com'
         expected_result = 'my_creds'
         mock_auth_get_credentials.return_value = expected_result
         cfg.CONF.set_default('uri', expected_uri, 'identity')
@@ -252,7 +252,7 @@
 
     @mock.patch('tempest.lib.auth.get_credentials')
     def test_get_credentials_v3_no_domain(self, mock_auth_get_credentials):
-        expected_uri = 'V3_URI'
+        expected_uri = 'https://v3.identity.exmaple.com'
         expected_result = 'my_creds'
         expected_domain = 'my_domain'
         mock_auth_get_credentials.return_value = expected_result
@@ -272,7 +272,7 @@
 
     @mock.patch('tempest.lib.auth.get_credentials')
     def test_get_credentials_v3_domain(self, mock_auth_get_credentials):
-        expected_uri = 'V3_URI'
+        expected_uri = 'https://v3.identity.exmaple.com'
         expected_result = 'my_creds'
         expected_domain = 'my_domain'
         mock_auth_get_credentials.return_value = expected_result
@@ -291,7 +291,7 @@
 
     @mock.patch('tempest.lib.auth.get_credentials')
     def test_get_credentials_v3_system(self, mock_auth_get_credentials):
-        expected_uri = 'V3_URI'
+        expected_uri = 'https://v3.identity.exmaple.com'
         expected_result = 'my_creds'
         mock_auth_get_credentials.return_value = expected_result
         cfg.CONF.set_default('uri_v3', expected_uri, 'identity')
diff --git a/tempest/tests/common/test_waiters.py b/tempest/tests/common/test_waiters.py
index 93c949e..f194173 100755
--- a/tempest/tests/common/test_waiters.py
+++ b/tempest/tests/common/test_waiters.py
@@ -27,6 +27,78 @@
 import tempest.tests.utils as utils
 
 
+class TestServerWaiters(base.TestCase):
+    def setUp(self):
+        super(TestServerWaiters, self).setUp()
+        self.client = mock.MagicMock()
+        self.client.build_timeout = 1
+        self.client.build_interval = 1
+
+    def test_wait_for_server_status(self):
+        fake_server = {'id': 'fake-uuid',
+                       'status': 'ACTIVE'}
+        self.client.show_server.return_value = ({'server': fake_server})
+        start_time = int(time.time())
+        waiters.wait_for_server_status(
+            self.client, fake_server['id'], 'ACTIVE')
+        end_time = int(time.time())
+        # Ensure waiter returns before build_timeout
+        self.assertLess((end_time - start_time), 10)
+
+    def test_wait_for_server_status_build(self):
+        fake_server = {'id': 'fake-uuid',
+                       'status': 'BUILD'}
+        self.client.show_server.return_value = ({'server': fake_server})
+        start_time = int(time.time())
+        waiters.wait_for_server_status(self.client, fake_server['id'], 'BUILD')
+        end_time = int(time.time())
+        # Ensure waiter returns before build_timeout
+        self.assertLess((end_time - start_time), 10)
+
+    def test_wait_for_server_status_timeout(self):
+        time_mock = self.patch('time.time')
+        time_mock.side_effect = utils.generate_timeout_series(1)
+
+        fake_server = {'id': 'fake-uuid',
+                       'status': 'SAVING'}
+        self.client.show_server.return_value = ({'server': fake_server})
+        self.assertRaises(lib_exc.TimeoutException,
+                          waiters.wait_for_server_status,
+                          self.client, fake_server['id'], 'ACTIVE')
+
+    def test_wait_for_server_status_error_on_server_build(self):
+        fake_server = {'id': 'fake-uuid',
+                       'status': 'ERROR'}
+        self.client.show_server.return_value = ({'server': fake_server})
+        self.assertRaises(exceptions.BuildErrorException,
+                          waiters.wait_for_server_status,
+                          self.client, fake_server['id'], 'ACTIVE')
+
+    def test_wait_for_server_termination(self):
+        fake_server = {'id': 'fake-uuid',
+                       'status': 'ACTIVE'}
+        self.client.show_server.side_effect = lib_exc.NotFound
+        waiters.wait_for_server_termination(self.client, fake_server['id'])
+
+    def test_wait_for_server_termination_timeout(self):
+        time_mock = self.patch('time.time')
+        time_mock.side_effect = utils.generate_timeout_series(1)
+
+        fake_server = {'id': 'fake-uuid',
+                       'status': 'ACTIVE'}
+        self.assertRaises(lib_exc.TimeoutException,
+                          waiters.wait_for_server_termination,
+                          self.client, fake_server['id'])
+
+    def test_wait_for_server_termination_error_status(self):
+        fake_server = {'id': 'fake-uuid',
+                       'status': 'ERROR'}
+        self.client.show_server.return_value = ({'server': fake_server})
+        self.assertRaises(lib_exc.DeleteErrorException,
+                          waiters.wait_for_server_termination,
+                          self.client, fake_server['id'])
+
+
 class TestImageWaiters(base.TestCase):
     def setUp(self):
         super(TestImageWaiters, self).setUp()
@@ -145,6 +217,15 @@
                           waiters.wait_for_image_copied_to_stores,
                           self.client, 'fake_image_id')
 
+    def test_wait_for_image_copied_to_stores_status_killed(self):
+        self.client.show_image.return_value = ({
+            'status': 'killed',
+            'os_glance_importing_to_stores': None,
+            'os_glance_failed_import': 'fake_os_glance_failed_import'})
+        self.assertRaises(exceptions.ImageKilledException,
+                          waiters.wait_for_image_copied_to_stores,
+                          self.client, 'fake_image_id')
+
     def test_wait_for_image_tasks_status(self):
         self.client.show_image_tasks.return_value = ({
             'tasks': [{'status': 'success'}]})
@@ -168,6 +249,28 @@
                           waiters.wait_for_image_tasks_status,
                           self.client, 'fake_image_id', 'success')
 
+    def test_wait_for_tasks_status(self):
+        self.client.show_tasks.return_value = ({
+            'status': 'success'})
+        start_time = int(time.time())
+        waiters.wait_for_tasks_status(
+            self.client, 'fake_task_id', 'success')
+        end_time = int(time.time())
+        # Ensure waiter returns before build_timeout
+        self.assertLess((end_time - start_time), 10)
+
+    def test_wait_for_tasks_status_timeout(self):
+        time_mock = self.patch('time.time')
+        self.patch('time.time', side_effect=[0., 1.])
+        time_mock.side_effect = utils.generate_timeout_series(1)
+
+        self.client.show_tasks.return_value = (
+            {'status': 'success'},
+            {'status': 'processing'})
+        self.assertRaises(lib_exc.TimeoutException,
+                          waiters.wait_for_tasks_status,
+                          self.client, 'fake_task_id', 'success')
+
 
 class TestInterfaceWaiters(base.TestCase):
 
@@ -366,6 +469,31 @@
                                       mock.call(mock.sentinel.volume_id),
                                       mock.call(mock.sentinel.volume_id)])
 
+    def test_wait_for_volume_retype(self):
+        fake_volume = {'volume_type': {'id': 'fake-uuid'}}
+        show_volume = mock.Mock(return_value={'volume': fake_volume})
+        client = mock.Mock(resource_type="volume",
+                           build_interval=1,
+                           build_timeout=1,
+                           show_volume=show_volume)
+        waiters.wait_for_volume_retype(
+            client, mock.sentinel.volume_id, fake_volume['volume_type'])
+
+    def test_wait_for_volume_retype_timeout(self):
+        fake_volume = {'volume_type': {'id': 'fake-uuid'}}
+        show_volume = mock.Mock(return_value={'volume': fake_volume})
+        client = mock.Mock(resource_type="volume",
+                           build_interval=1,
+                           build_timeout=1,
+                           show_volume=show_volume)
+
+        self.patch('time.time', side_effect=[0., client.build_timeout + 1.])
+        self.patch('time.sleep')
+        self.assertRaises(lib_exc.TimeoutException,
+                          waiters.wait_for_volume_retype,
+                          client, mock.sentinel.volume_id,
+                          'fake_volume_type')
+
     @mock.patch.object(time, 'sleep')
     def test_wait_for_volume_status_error_restoring(self, mock_sleep):
         # Tests that the wait method raises VolumeRestoreErrorException if
@@ -450,7 +578,25 @@
                                       mock.call(uuids.volume_id),
                                       mock.call(uuids.volume_id)])
 
-    def test_wait_for_volume_attachment(self):
+    def test_wait_for_volume_attachment_create_timeout(self):
+        show_volume = mock.MagicMock(return_value={
+            'volume': {'attachments': [
+                {'attachment_id': uuids.attachment_id,
+                 'server_id': uuids.server_id,
+                 'volume_id': uuids.volume_id}]}})
+        client = mock.Mock(spec=volumes_client.VolumesClient,
+                           build_interval=1,
+                           build_timeout=1,
+                           show_volume=show_volume)
+        self.patch('time.time', side_effect=[0., client.build_timeout + 1.])
+        self.patch('time.sleep')
+        # Assert that a timeout is raised if the attachment is not
+        # created within required time
+        self.assertRaises(lib_exc.TimeoutException,
+                          waiters.wait_for_volume_attachment_create,
+                          client, 'fake_volume_id', 'fake_server_id')
+
+    def test_wait_for_volume_attachment_remove(self):
         vol_detached = {'volume': {'attachments': []}}
         vol_attached = {'volume': {'attachments': [
                        {'attachment_id': uuids.attachment_id}]}}
@@ -469,7 +615,7 @@
                                       mock.call(uuids.volume_id),
                                       mock.call(uuids.volume_id)])
 
-    def test_wait_for_volume_attachment_timeout(self):
+    def test_wait_for_volume_attachment_remove_timeout(self):
         show_volume = mock.MagicMock(return_value={
             'volume': {'attachments': [
                 {'attachment_id': uuids.attachment_id}]}})
@@ -635,6 +781,67 @@
             .1
         )
 
+    def test_wait_for_caching(self):
+        mock_client = mock.Mock(
+            build_interval=1,
+            build_timeout=1
+        )
+        mock_cache_client = mock.Mock()
+        mock_cache_client.list_cache.return_value = {
+            "cached_images": [{
+                "image_id": 'fake_image_id'}]}
+        waiters.wait_for_caching(
+            mock_client, mock_cache_client, 'fake_image_id')
+
+    def test_wait_for_caching_timeout(self):
+        time_mock = self.patch('time.time')
+        time_mock.side_effect = utils.generate_timeout_series(1)
+
+        mock_client = mock.Mock(
+            build_interval=1,
+            build_timeout=1
+        )
+        mock_cache_client = mock.Mock()
+        mock_cache_client.list_cache.return_value = {
+            "cached_images": [{
+                "image_id": 'fake_image_id'}]}
+        # Assert that TimeoutException is raised when the image
+        # failed to cache in time
+        self.assertRaises(
+            lib_exc.TimeoutException,
+            waiters.wait_for_caching,
+            mock_client,
+            mock_cache_client,
+            'fake_image_id'
+        )
+
+    def test_wait_for_object_create(self):
+        mock_object_client = mock.Mock(
+            build_interval=1,
+            build_timeout=1
+        )
+        waiters.wait_for_object_create(
+            mock_object_client, 'fake_container', 'fake_object')
+
+    def test_wait_for_object_create_timeout(self):
+        time_mock = self.patch('time.time')
+        time_mock.side_effect = utils.generate_timeout_series(1)
+
+        mock_object_client = mock.Mock(
+            build_interval=1,
+            build_timeout=1
+        )
+        # Assert that TimeoutException is raised when the object is not
+        # created in time
+        self.assertRaises(
+            lib_exc.TimeoutException,
+            waiters.wait_for_object_create,
+            mock_object_client,
+            'fake_container',
+            'fake_object',
+            .1
+        )
+
 
 class TestPortCreationWaiter(base.TestCase):
     def test_wait_for_port_status(self):
diff --git a/tempest/tests/lib/common/test_cred_client.py b/tempest/tests/lib/common/test_cred_client.py
index 7ea660b..e44c5ed 100644
--- a/tempest/tests/lib/common/test_cred_client.py
+++ b/tempest/tests/lib/common/test_cred_client.py
@@ -38,6 +38,13 @@
         self.projects_client.create_tenant.assert_called_once_with(
             name='fake_name', description='desc')
 
+    def test_show_project(self):
+        self.projects_client.show_tenant.return_value = {
+            'tenant': 'a_tenant'
+        }
+        res = self.creds_client.show_project('fake_id')
+        self.assertEqual('a_tenant', res)
+
     def test_delete_project(self):
         self.creds_client.delete_project('fake_id')
         self.projects_client.delete_tenant.assert_called_once_with(
@@ -79,11 +86,32 @@
         self.projects_client.create_project.assert_called_once_with(
             name='fake_name', description='desc', domain_id='fake_domain_id')
 
+    def test_show_project(self):
+        self.projects_client.show_project.return_value = {
+            'project': 'a_tenant'
+        }
+        res = self.creds_client.show_project('fake_id')
+        self.assertEqual('a_tenant', res)
+
     def test_delete_project(self):
         self.creds_client.delete_project('fake_id')
         self.projects_client.delete_project.assert_called_once_with(
             'fake_id')
 
+    def test_create_domain(self):
+        self.domains_client.create_domain.return_value = {
+            'domain': 'a_tenant'
+        }
+        res = self.creds_client.create_domain('fake_name', 'desc')
+        self.assertEqual('a_tenant', res)
+        self.domains_client.create_domain.assert_called_once_with(
+            name='fake_name', description='desc')
+
+    def test_delete_domain(self):
+        self.creds_client.delete_domain('fake_id')
+        self.domains_client.delete_domain.assert_called_once_with(
+            'fake_id')
+
     def test_get_credentials(self):
         ret = self.creds_client.get_credentials(
             {'name': 'some_user', 'id': 'fake_id'},
diff --git a/tempest/tests/lib/services/image/v2/test_images_client.py b/tempest/tests/lib/services/image/v2/test_images_client.py
index 27a50a9..01861a2 100644
--- a/tempest/tests/lib/services/image/v2/test_images_client.py
+++ b/tempest/tests/lib/services/image/v2/test_images_client.py
@@ -146,6 +146,36 @@
         ]
     }
 
+    FAKE_DELETE_IMAGE_FROM_STORE = {
+        "id": "e485aab9-0907-4973-921c-bb6da8a8fcf8",
+        "name": u"\u2740(*\xb4\u25e2`*)\u2740",
+        "status": "active",
+        "visibility": "public",
+        "size": 2254249,
+        "checksum": "2cec138d7dae2aa59038ef8c9aec2390",
+        "tags": [
+            "fedora",
+            "beefy"
+        ],
+        "created_at": "2012-08-10T19:23:50Z",
+        "updated_at": "2012-08-12T11:11:33Z",
+        "self": "/v2/images/da3b75d9-3f4a-40e7-8a2c-bfab23927dea",
+        "file": "/v2/images/da3b75d9-3f4a-40e7-8a2c-bfab23927"
+                "dea/file",
+        "schema": "/v2/schemas/image",
+        "owner": None,
+        "min_ram": None,
+        "min_disk": None,
+        "disk_format": None,
+        "virtual_size": None,
+        "container_format": None,
+        "os_hash_algo": "sha512",
+        "os_hash_value": "ef7d1ed957ffafefb324d50ebc6685ed03d0e645d",
+        "os_hidden": False,
+        "protected": False,
+        "stores": ["store-1", "store-2"],
+    }
+
     FAKE_TAG_NAME = "fake tag"
 
     def setUp(self):
@@ -294,3 +324,12 @@
             self.FAKE_SHOW_IMAGE_TASKS,
             True,
             image_id="e485aab9-0907-4973-921c-bb6da8a8fcf8")
+
+    def test_delete_image_from_store(self):
+        self.check_service_client_function(
+            self.client.delete_image_from_store,
+            'tempest.lib.common.rest_client.RestClient.delete',
+            {},
+            image_id=self.FAKE_DELETE_IMAGE_FROM_STORE["id"],
+            store_name=self.FAKE_DELETE_IMAGE_FROM_STORE["stores"][0],
+            status=204)
diff --git a/tools/generate-tempest-plugins-list.py b/tools/generate-tempest-plugins-list.py
index 0b6b342..2e8ced5 100644
--- a/tools/generate-tempest-plugins-list.py
+++ b/tools/generate-tempest-plugins-list.py
@@ -75,7 +75,6 @@
     'x/networking-l2gw-tempest-plugin'
     'x/novajoin-tempest-plugin'
     'x/ranger-tempest-plugin'
-    'x/tap-as-a-service-tempest-plugin'
     'x/trio2o'
     # No changes are merging in this
     # https://review.opendev.org/q/project:x%252Fnetworking-fortinet
diff --git a/tox.ini b/tox.ini
index e809f1c..51c38f2 100644
--- a/tox.ini
+++ b/tox.ini
@@ -61,7 +61,7 @@
   coverage combine
   coverage html -d cover
   coverage xml -o cover/coverage.xml
-  coverage report
+  coverage report -m --fail-under=76
 
 [testenv:debug]
 commands = oslo_debug_helper -t tempest/tests {posargs}
@@ -198,7 +198,7 @@
 commands =
     find . -type f -name "*.pyc" -delete
     tempest run --regex {[testenv:integrated-compute]regex1} --exclude-list ./tools/tempest-integrated-gate-compute-exclude-list.txt {posargs}
-    tempest run --combine --serial --regex {[testenv:integrated-compute]regex2} --exclude-list ./tools/tempest-integrated-gate-compute-exclude-list.txt {posargs}
+    tempest run --combine --serial --slowest --regex {[testenv:integrated-compute]regex2} --exclude-list ./tools/tempest-integrated-gate-compute-exclude-list.txt {posargs}
 
 [testenv:integrated-placement]
 envdir = .tox/tempest
@@ -359,8 +359,9 @@
   sphinx-apidoc -f -o doc/source/tests/image tempest/api/image
   sphinx-apidoc -f -o doc/source/tests/network tempest/api/network
   sphinx-apidoc -f -o doc/source/tests/object_storage tempest/api/object_storage
-  sphinx-apidoc -f -o doc/source/tests/scenario tempest/scenario
   sphinx-apidoc -f -o doc/source/tests/volume tempest/api/volume
+  sphinx-apidoc -f -o doc/source/tests/scenario tempest/scenario
+  sphinx-apidoc -f -o doc/source/tests/serial_tests tempest/serial_tests
   rm -rf doc/build
   sphinx-build -W -b html doc/source doc/build/html
 allowlist_externals =
@@ -377,8 +378,9 @@
    sphinx-apidoc -f -o doc/source/tests/image tempest/api/image
    sphinx-apidoc -f -o doc/source/tests/network tempest/api/network
    sphinx-apidoc -f -o doc/source/tests/object_storage tempest/api/object_storage
-   sphinx-apidoc -f -o doc/source/tests/scenario tempest/scenario
    sphinx-apidoc -f -o doc/source/tests/volume tempest/api/volume
+   sphinx-apidoc -f -o doc/source/tests/scenario tempest/scenario
+   sphinx-apidoc -f -o doc/source/tests/serial_tests tempest/serial_tests
    sphinx-build -W -b latex doc/source doc/build/pdf
    make -C doc/build/pdf
 
diff --git a/zuul.d/base.yaml b/zuul.d/base.yaml
index 0ac893a..3b402c8 100644
--- a/zuul.d/base.yaml
+++ b/zuul.d/base.yaml
@@ -24,6 +24,8 @@
               min_compute_nodes: "{{ groups['compute'] | default(['controller']) | length }}"
       test_results_stage_name: test_results
       zuul_copy_output:
+        '/var/log/openvswitch': logs
+        '/var/log/ovn': logs
         '{{ devstack_base_dir }}/tempest/etc/tempest.conf': logs
         '{{ devstack_base_dir }}/tempest/etc/accounts.yaml': logs
         '{{ devstack_base_dir }}/tempest/tempest.log': logs
diff --git a/zuul.d/integrated-gate.yaml b/zuul.d/integrated-gate.yaml
index 87b8af0..596acb1 100644
--- a/zuul.d/integrated-gate.yaml
+++ b/zuul.d/integrated-gate.yaml
@@ -8,6 +8,7 @@
       Integration test that runs all tests.
       Former name for this job was:
         * legacy-periodic-tempest-dsvm-all-master
+    timeout: 10800
     vars:
       tox_envlist: all
       tempest_test_regex: tempest
@@ -29,32 +30,6 @@
       tox_envlist: ipv6-only
 
 - job:
-    name: tempest-full
-    parent: devstack-tempest
-    description: |
-      Base integration test with Neutron networking and py27.
-      This job is supposed to run until stable/train setup only.
-      If you are running it on stable/ussuri gate onwards for python2.7
-      coverage then you need to do override-checkout with any stable
-      branch less than or equal to stable/train.
-      Former names for this job where:
-        * legacy-tempest-dsvm-neutron-full
-        * gate-tempest-dsvm-neutron-full-ubuntu-xenial
-    vars:
-      tox_envlist: full
-      devstack_localrc:
-        ENABLE_FILE_INJECTION: true
-        ENABLE_VOLUME_MULTIATTACH: true
-        USE_PYTHON3: False
-      devstack_services:
-        # NOTE(mriedem): Disable the cinder-backup service from tempest-full
-        # since tempest-full is in the integrated-gate project template but
-        # the backup tests do not really involve other services so they should
-        # be run in some more cinder-specific job, especially because the
-        # tests fail at a high rate (see bugs 1483434, 1813217, 1745168)
-        c-bak: false
-
-- job:
     name: tempest-extra-tests
     parent: tempest-full-py3
     description: |
@@ -73,7 +48,7 @@
     # this job definition is only for stable/xena onwards
     # and separate job definition until stable/wallaby
     branches:
-      regex: ^stable/(stein|train|ussuri|victoria|wallaby)$
+      regex: ^.*/(victoria|wallaby)$
       negate: true
     description: |
       Base integration test with Neutron networking, horizon, swift enable,
@@ -107,7 +82,7 @@
     nodeset: devstack-single-node-centos-9-stream
     # centos-9-stream is supported from yoga release onwards
     branches:
-      regex: ^stable/(stein|train|ussuri|victoria|wallaby|xena)$
+      regex: ^.*/(victoria|wallaby|xena)$
       negate: true
     description: |
       Base integration test on CentOS 9 stream
@@ -168,7 +143,7 @@
     nodeset: devstack-single-node-centos-9-stream
     # centos-9-stream is supported from yoga release onwards
     branches:
-      regex: ^stable/(stein|train|ussuri|victoria|wallaby|xena)$
+      regex: ^.*/(victoria|wallaby|xena)$
       negate: true
     description: |
       This job runs integration tests for compute. This is
@@ -255,7 +230,7 @@
     nodeset: openstack-two-node-jammy
     # This job runs on ubuntu Jammy and after stable/zed.
     branches:
-      regex: ^stable/(stein|train|ussuri|victoria|wallaby|xena|yoga|zed)$
+      regex: ^.*/(victoria|wallaby|xena|yoga|zed)$
       negate: true
     vars:
       # NOTE(gmann): Default concurrency is higher (number of cpu -2) which
@@ -263,6 +238,7 @@
       # requests to services and can cause more oom issues. To avoid the
       # oom issue, setting the concurrency to 4 in this job.
       tempest_concurrency: 4
+      tempest_set_src_dest_host: true
       devstack_localrc:
         USE_PYTHON3: true
       devstack_plugins:
@@ -319,7 +295,7 @@
     # till stable/wallaby, this job definition is only for stable/xena
     # onwards and separate job definition until stable/wallaby
     branches:
-      regex: ^stable/(stein|train|ussuri|victoria|wallaby)$
+      regex: ^.*/(victoria|wallaby)$
       negate: true
     vars:
       tox_envlist: slow
@@ -396,11 +372,6 @@
     parent: tempest-full-py3
     description: |
       This job runs the Tempest tests with scope and new defaults enabled.
-    # TODO: remove this once https://review.opendev.org/c/openstack/neutron-lib/+/864213
-    # fix is released in neutron-lib
-    required-projects:
-      - openstack/neutron-lib
-      - openstack/neutron
     vars:
       devstack_localrc:
         # Enabeling the scope and new defaults for services.
@@ -410,10 +381,9 @@
         # Keystone policies are changed to work for both system as well as
         # for project scoped, we need to keep scope check disable for
         # keystone.
-        # Nova and Glance have enabled the new defaults and scope by default
-        # in devstack.
+        # Nova, Glance, and Neutron have enabled the new defaults and scope
+        # by default in devstack.
         CINDER_ENFORCE_SCOPE: true
-        NEUTRON_ENFORCE_SCOPE: true
         PLACEMENT_ENFORCE_SCOPE: true
 
 - job:
@@ -421,12 +391,14 @@
     parent: tempest-all
     description: |
       Integration test that runs all tests on RBAC old defaults.
+    vars:
       devstack_localrc:
-        # NOTE(gmann): Nova and Glance have enabled the new defaults and scope
-        # by default in devstack so we need some jobs keep testing the old
-        # defaults until they are removed from service side.
+        # NOTE(gmann): Nova, Glance, and Neutron have enabled the new defaults
+        # and scope by default in devstack so we need some jobs keep testing
+        # the old defaults until they are removed from service side.
         NOVA_ENFORCE_SCOPE: false
         GLANCE_ENFORCE_SCOPE: false
+        NEUTRON_ENFORCE_SCOPE: false
 
 - project-template:
     name: integrated-gate-networking
@@ -437,10 +409,19 @@
     check:
       jobs:
         - grenade
+        # NOTE(gmann): These template are generic and used on stable branch
+        # as well as master testing. So grenade-skip-level on stable/2023.1
+        # which test stable/yoga to stable/2023.1 upgrade is non-voting.
         - grenade-skip-level:
             voting: false
             branches:
               - stable/2023.1
+        # on stable/2024.1(SLURP) grenade-skip-level is voting which test
+        # stable/2023.1 to stable/2024.1 upgrade. This is supposed to run on
+        # SLURP release only.
+        - grenade-skip-level:
+            branches:
+              - ^.*/2024.1
         - tempest-integrated-networking
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
@@ -448,19 +429,25 @@
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
     gate:
       jobs:
         - grenade
         - tempest-integrated-networking
+        # on stable/2024.1(SLURP) grenade-skip-level is voting which test
+        # stable/2023.1 to stable/2024.1 upgrade. This is supposed to run on
+        # SLURP release only.
+        - grenade-skip-level:
+            branches:
+              - ^.*/2024.1
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
         # and job is broken up to wallaby branch due to the issue
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
 
 - project-template:
@@ -477,6 +464,9 @@
     # only from master(or the branch it was meant to run).
     check:
       jobs:
+        # NOTE(gmann): These template are generic and used on stable branch
+        # as well as master testing. So grenade-skip-level on stable/2023.1
+        # which test stable/yoga to stable/2023.1 upgrade is non-voting.
         - grenade-skip-level:
             voting: false
             branches:
@@ -489,35 +479,39 @@
         # to make sure we do not run this job on older than 2023.2 gate.
         - grenade-skip-level-always:
             branches:
+              - ^.*/2023.2
+              - ^.*/2024.1
               - master
         - tempest-integrated-compute
         # centos-8-stream is tested from wallaby -> yoga branches
         - tempest-integrated-compute-centos-8-stream:
-            branches: ^stable/(wallaby|xena|yoga).*$
+            branches: ^.*/(wallaby|xena|yoga)$
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
         # and job is broken up to wallaby branch due to the issue
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
     gate:
       jobs:
         - grenade-skip-level-always:
             branches:
+              - ^.*/2023.2
+              - ^.*/2024.1
               - master
         - tempest-integrated-compute
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
     periodic-weekly:
       jobs:
         # centos-9-stream is tested from zed release onwards
         - tempest-integrated-compute-centos-9-stream:
             branches:
-              regex: ^stable/(stein|train|ussuri|victoria|wallaby|xena|yoga)$
+              regex: ^.*/(victoria|wallaby|xena|yoga)$
               negate: true
 
 - project-template:
@@ -530,10 +524,19 @@
     check:
       jobs:
         - grenade
+        # NOTE(gmann): These template are generic and used on stable branch
+        # as well as master testing. So grenade-skip-level on stable/2023.1
+        # which test stable/yoga to stable/2023.1 upgrade is non-voting.
         - grenade-skip-level:
             voting: false
             branches:
               - stable/2023.1
+        # on stable/2024.1(SLURP) grenade-skip-level is voting which test
+        # stable/2023.1 to stable/2024.1 upgrade. This is supposed to run on
+        # SLURP release only.
+        - grenade-skip-level:
+            branches:
+              - ^.*/2024.1
         - tempest-integrated-placement
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
@@ -541,19 +544,25 @@
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
     gate:
       jobs:
         - grenade
         - tempest-integrated-placement
+        # on stable/2024.1(SLURP) grenade-skip-level is voting which test
+        # stable/2023.1 to stable/2024.1 upgrade. This is supposed to run on
+        # SLURP release only.
+        - grenade-skip-level:
+            branches:
+              - ^.*/2024.1
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
         # and job is broken up to wallaby branch due to the issue
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
 
 - project-template:
@@ -566,10 +575,19 @@
     check:
       jobs:
         - grenade
+        # NOTE(gmann): These template are generic and used on stable branch
+        # as well as master testing. So grenade-skip-level on stable/2023.1
+        # which test stable/yoga to stable/2023.1 upgrade is non-voting.
         - grenade-skip-level:
             voting: false
             branches:
               - stable/2023.1
+        # on stable/2024.1(SLURP) grenade-skip-level is voting which test
+        # stable/2023.1 to stable/2024.1 upgrade. This is supposed to run on
+        # SLURP release only.
+        - grenade-skip-level:
+            branches:
+              - ^.*/2024.1
         - tempest-integrated-storage
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
@@ -577,11 +595,17 @@
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
     gate:
       jobs:
         - grenade
+        # on stable/2024.1(SLURP) grenade-skip-level is voting which test
+        # stable/2023.1 to stable/2024.1 upgrade. This is supposed to run on
+        # SLURP release only.
+        - grenade-skip-level:
+            branches:
+              - ^.*/2024.1
         - tempest-integrated-storage
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
@@ -589,7 +613,7 @@
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
 
 - project-template:
@@ -602,6 +626,12 @@
     check:
       jobs:
         - grenade
+        # on stable/2024.1(SLURP) grenade-skip-level is voting which test
+        # stable/2023.1 to stable/2024.1 upgrade. This is supposed to run on
+        # SLURP release only.
+        - grenade-skip-level:
+            branches:
+              - ^.*/2024.1
         - tempest-integrated-object-storage
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
@@ -609,11 +639,17 @@
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
     gate:
       jobs:
         - grenade
+        # on stable/2024.1(SLURP) grenade-skip-level is voting which test
+        # stable/2023.1 to stable/2024.1 upgrade. This is supposed to run on
+        # SLURP release only.
+        - grenade-skip-level:
+            branches:
+              - ^.*/2024.1
         - tempest-integrated-object-storage
         # Do not run it on ussuri until below issue is fixed
         # https://storyboard.openstack.org/#!/story/2010057
@@ -621,5 +657,5 @@
         # described in https://review.opendev.org/872341
         - openstacksdk-functional-devstack:
             branches:
-              regex: ^stable/(ussuri|victoria|wallaby)$
+              regex: ^.*/(victoria|wallaby)$
               negate: true
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 9a7d14d..e2505cb 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -37,9 +37,9 @@
         # if things are working in latest and oldest it will work in between
         # stable branches also. If anything is breaking we will be catching
         # those in respective stable branch gate.
-        - tempest-full-2023-2:
+        - tempest-full-2024-1:
             irrelevant-files: *tempest-irrelevant-files
-        - tempest-full-yoga:
+        - tempest-full-zed:
             irrelevant-files: *tempest-irrelevant-files
         - tempest-multinode-full-py3:
             irrelevant-files: *tempest-irrelevant-files
@@ -111,6 +111,8 @@
             irrelevant-files: *tempest-irrelevant-files
         - grenade:
             irrelevant-files: *tempest-irrelevant-files
+        - grenade-skip-level-always:
+            irrelevant-files: *tempest-irrelevant-files
         - neutron-ovs-tempest-dvr:
             voting: false
             irrelevant-files: *tempest-irrelevant-files
@@ -140,6 +142,8 @@
             irrelevant-files: *tempest-irrelevant-files
         - grenade:
             irrelevant-files: *tempest-irrelevant-files
+        - grenade-skip-level-always:
+            irrelevant-files: *tempest-irrelevant-files
         - tempest-ipv6-only:
             irrelevant-files: *tempest-irrelevant-files-3
         - tempest-multinode-full-py3:
@@ -151,7 +155,7 @@
         - nova-live-migration:
             irrelevant-files: *tempest-irrelevant-files
         - ironic-tempest-bios-ipmi-direct-tinyipa:
-            irrelevant-files: *tempest-irrelevant-files
+             irrelevant-files: *tempest-irrelevant-files
     experimental:
       jobs:
         - nova-multi-cell
@@ -166,7 +170,6 @@
         - tempest-all-rbac-old-defaults
         - tempest-full-parallel
         - tempest-full-zed-extra-tests
-        - tempest-full-yoga-extra-tests
         - tempest-full-enforce-scope-new-defaults-zed
         - neutron-ovs-tempest-dvr-ha-multinode-full:
             irrelevant-files: *tempest-irrelevant-files
@@ -186,18 +189,18 @@
             irrelevant-files: *tempest-irrelevant-files
     periodic-stable:
       jobs:
+        - tempest-full-2024-1
         - tempest-full-2023-2
         - tempest-full-2023-1
         - tempest-full-zed
-        - tempest-full-yoga
+        - tempest-slow-2024-1
         - tempest-slow-2023-2
         - tempest-slow-2023-1
         - tempest-slow-zed
-        - tempest-slow-yoga
+        - tempest-full-2024-1-extra-tests
         - tempest-full-2023-2-extra-tests
         - tempest-full-2023-1-extra-tests
         - tempest-full-zed-extra-tests
-        - tempest-full-yoga-extra-tests
     periodic:
       jobs:
         - tempest-all
diff --git a/zuul.d/stable-jobs.yaml b/zuul.d/stable-jobs.yaml
index 2fdc2af..a662685 100644
--- a/zuul.d/stable-jobs.yaml
+++ b/zuul.d/stable-jobs.yaml
@@ -1,5 +1,11 @@
 # NOTE(gmann): This file includes all stable release jobs definition.
 - job:
+    name: tempest-full-2024-1
+    parent: tempest-full-py3
+    nodeset: openstack-single-node-jammy
+    override-checkout: stable/2024.1
+
+- job:
     name: tempest-full-2023-2
     parent: tempest-full-py3
     nodeset: openstack-single-node-jammy
@@ -18,10 +24,10 @@
     override-checkout: stable/zed
 
 - job:
-    name: tempest-full-yoga
-    parent: tempest-full-py3
-    nodeset: openstack-single-node-focal
-    override-checkout: stable/yoga
+    name: tempest-full-2024-1-extra-tests
+    parent: tempest-extra-tests
+    nodeset: openstack-single-node-jammy
+    override-checkout: stable/2024.1
 
 - job:
     name: tempest-full-2023-2-extra-tests
@@ -42,10 +48,10 @@
     override-checkout: stable/zed
 
 - job:
-    name: tempest-full-yoga-extra-tests
-    parent: tempest-extra-tests
-    nodeset: openstack-single-node-focal
-    override-checkout: stable/yoga
+    name: tempest-slow-2024-1
+    parent: tempest-slow-py3
+    nodeset: openstack-two-node-jammy
+    override-checkout: stable/2024.1
 
 - job:
     name: tempest-slow-2023-2
@@ -72,20 +78,13 @@
     override-checkout: stable/zed
 
 - job:
-    name: tempest-slow-yoga
-    parent: tempest-slow-py3
-    nodeset: openstack-two-node-focal
-    override-checkout: stable/yoga
-
-- job:
     name: tempest-full-py3
     parent: devstack-tempest
     # This job version is to use the 'full' tox env which
     # is available for stable/ussuri to stable/wallaby also.
     branches:
-      - stable/ussuri
-      - stable/victoria
-      - stable/wallaby
+      - ^.*/victoria
+      - ^.*/wallaby
     description: |
       Base integration test with Neutron networking, horizon, swift enable,
       and py3.
@@ -108,89 +107,16 @@
         horizon: true
 
 - job:
-    name: tempest-full-py3
-    parent: devstack-tempest
-    # This job version is with swift disabled on py3
-    # as swift was not ready on py3 until stable/train.
-    branches:
-      - stable/stein
-      - stable/train
-    description: |
-      Base integration test with Neutron networking, swift disabled, and py3.
-      Former names for this job where:
-        * legacy-tempest-dsvm-py35
-        * gate-tempest-dsvm-py35
-    required-projects:
-      - openstack/horizon
-    vars:
-      tox_envlist: full
-      devstack_localrc:
-        USE_PYTHON3: true
-        FORCE_CONFIG_DRIVE: true
-        ENABLE_VOLUME_MULTIATTACH: true
-        GLANCE_USE_IMPORT_WORKFLOW: True
-      devstack_plugins:
-        neutron: https://opendev.org/openstack/neutron
-      devstack_local_conf:
-        post-config:
-          "/$NEUTRON_CORE_PLUGIN_CONF":
-            ovs:
-              bridge_mappings: public:br-ex
-              resource_provider_bandwidths: br-ex:1000000:1000000
-        test-config:
-          $TEMPEST_CONFIG:
-            network-feature-enabled:
-              qos_placement_physnet: public
-      devstack_services:
-        # Enbale horizon so that we can run horizon test.
-        horizon: true
-        s-account: false
-        s-container: false
-        s-object: false
-        s-proxy: false
-        # without Swift, c-bak cannot run (in the Gate at least)
-        # NOTE(mriedem): Disable the cinder-backup service from
-        # tempest-full-py3 since tempest-full-py3 is in the integrated-gate-py3
-        # project template but the backup tests do not really involve other
-        # services so they should be run in some more cinder-specific job,
-        # especially because the tests fail at a high rate (see bugs 1483434,
-        # 1813217, 1745168)
-        c-bak: false
-        neutron-placement: true
-        neutron-qos: true
-
-- job:
-    name: tempest-multinode-full-py3
-    parent: tempest-multinode-full
-    nodeset: openstack-two-node-bionic
-    # This job runs on Bionic.
-    branches:
-      - stable/stein
-      - stable/train
-      - stable/ussuri
-    vars:
-      devstack_localrc:
-        USE_PYTHON3: true
-      devstack_plugins:
-        neutron: https://opendev.org/openstack/neutron
-      devstack_services:
-        neutron-trunk: true
-    group-vars:
-      subnode:
-        devstack_localrc:
-          USE_PYTHON3: true
-
-- job:
     name: tempest-multinode-full-py3
     parent: tempest-multinode-full
     nodeset: openstack-two-node-focal
     # This job runs on Focal and supposed to run until stable/zed.
     branches:
-      - stable/victoria
-      - stable/wallaby
-      - stable/xena
-      - stable/yoga
-      - stable/zed
+      - ^.*/victoria
+      - ^.*/wallaby
+      - ^.*/xena
+      - ^.*/yoga
+      - ^.*/zed
     vars:
       devstack_localrc:
         USE_PYTHON3: true
@@ -209,11 +135,11 @@
     nodeset: openstack-two-node-focal
     # This job runs on Focal and on python2. This is for stable/victoria to stable/zed.
     branches:
-      - stable/victoria
-      - stable/wallaby
-      - stable/xena
-      - stable/yoga
-      - stable/zed
+      - ^.*/victoria
+      - ^.*/wallaby
+      - ^.*/xena
+      - ^.*/yoga
+      - ^.*/zed
     vars:
       devstack_localrc:
         USE_PYTHON3: False
@@ -223,56 +149,13 @@
           USE_PYTHON3: False
 
 - job:
-    name: tempest-multinode-full
-    parent: tempest-multinode-full-base
-    nodeset: openstack-two-node-bionic
-    # This job runs on Bionic and on python2. This is for stable/stein and stable/train.
-    # This job is prepared to make sure all stable branches from stable/stein till stable/train
-    # will keep running on bionic. This can be removed once stable/train is EOL.
-    branches:
-      - stable/stein
-      - stable/train
-      - stable/ussuri
-    vars:
-      devstack_localrc:
-        USE_PYTHON3: False
-    group-vars:
-      subnode:
-        devstack_localrc:
-          USE_PYTHON3: False
-
-- job:
-    name: tempest-slow-py3
-    parent: tempest-slow
-    # This job version is with swift disabled on py3
-    # as swift was not ready on py3 until stable/train.
-    branches:
-      - stable/stein
-      - stable/train
-    vars:
-      devstack_localrc:
-        USE_PYTHON3: true
-      devstack_services:
-        s-account: false
-        s-container: false
-        s-object: false
-        s-proxy: false
-        # without Swift, c-bak cannot run (in the Gate at least)
-        c-bak: false
-    group-vars:
-      subnode:
-        devstack_localrc:
-          USE_PYTHON3: true
-
-- job:
     name: tempest-slow-py3
     parent: tempest-slow
     # This job version is to use the 'slow-serial' tox env for
     # the stable/ussuri to stable/wallaby testing.
     branches:
-      - stable/ussuri
-      - stable/victoria
-      - stable/wallaby
+      - ^.*/victoria
+      - ^.*/wallaby
     vars:
       tox_envlist: slow-serial
 
@@ -287,12 +170,9 @@
     # This job is not used after stable/xena and can be
     # removed once stable/xena is EOL.
     branches:
-      - stable/stein
-      - stable/train
-      - stable/ussuri
-      - stable/victoria
-      - stable/wallaby
-      - stable/xena
+      - ^.*/victoria
+      - ^.*/wallaby
+      - ^.*/xena
 
 - job:
     name: tempest-integrated-compute-centos-8-stream
@@ -301,9 +181,9 @@
     voting: false
     nodeset: devstack-single-node-centos-8-stream
     branches:
-      - stable/wallaby
-      - stable/xena
-      - stable/yoga
+      - ^.*/wallaby
+      - ^.*/xena
+      - ^.*/yoga
     description: |
       This job runs integration tests for compute. This is
       subset of 'tempest-full-py3' job and run Nova, Neutron, Cinder (except backup tests)
@@ -320,9 +200,9 @@
     # TODO(gmann): Make this job non voting until bug#1957941 if fixed.
     voting: false
     branches:
-      - stable/wallaby
-      - stable/xena
-      - stable/yoga
+      - ^.*/wallaby
+      - ^.*/xena
+      - ^.*/yoga
     nodeset: devstack-single-node-centos-8-stream
     description: |
       Base integration test with Neutron networking and py36 running
diff --git a/zuul.d/tempest-specific.yaml b/zuul.d/tempest-specific.yaml
index 10490b4..296682e 100644
--- a/zuul.d/tempest-specific.yaml
+++ b/zuul.d/tempest-specific.yaml
@@ -58,6 +58,8 @@
       Base integration test with Neutron networking, IPv6 and py3.
     vars:
       tox_envlist: full
+      run_tempest_cleanup: true
+      run_tempest_cleanup_prefix: true
       devstack_localrc:
         USE_PYTHON3: true
         FORCE_CONFIG_DRIVE: true