Merge "Clarify how to resolve a uuid collision"
diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst
index 15369de..4fe2e9f 100644
--- a/doc/source/configuration.rst
+++ b/doc/source/configuration.rst
@@ -84,13 +84,11 @@
 
 To enable and use locking test accounts you need do a few things:
 
- #. Enable the locking test account provider with the
-    locking_credentials_provider option in the auth section
  #. Create a accounts.yaml file which contains the set of pre-existing
     credentials to use for testing. To make sure you don't have a credentials
     starvation issue when running in parallel make sure you have at least 2
-    times the number of parallel workers you are using to execute tempest
-    available in the file.
+    times the number of worker processes you are using to execute tempest
+    available in the file. (if running serially the worker count is 1)
 
     You can check the sample file packaged in tempest for the yaml format
  #. Provide tempest with the location of you accounts.yaml file with the
@@ -125,15 +123,3 @@
 is that if a test requires specific roles on accounts these tests can not be
 run. This is because the config options do not give sufficient flexibility to
 describe the roles assigned to a user for running the tests.
-
-You also can use the accounts.yaml file to specify the credentials used for
-testing. This will just allocate them serially so you only need to provide
-a pair of credentials. Do note that all the restrictions associated with
-locking test accounts applies to using the accounts.yaml file this way too,
-except since you can't run in parallel only 2 of each type of credential is
-required to run. However, the limitation on tests which require specific roles
-does not apply here.
-
-The procedure for doing this is very similar to with the locking accounts
-provider just don't set the locking_credentials_provider to true and you
-only should need a single pair of credentials.
diff --git a/etc/tempest.conf.sample b/etc/tempest.conf.sample
index 2e57007..fae24c4 100644
--- a/etc/tempest.conf.sample
+++ b/etc/tempest.conf.sample
@@ -94,8 +94,12 @@
 #
 
 # Path to the yaml file that contains the list of credentials to use
-# for running tests (string value)
-#test_accounts_file = etc/accounts.yaml
+# for running tests. If used when running in parallel you have to make
+# sure sufficient credentials are provided in the accounts file. For
+# example if no tests with roles are being run it requires at least `2
+# * CONC` distinct accounts configured in  the `test_accounts_file`,
+# with CONC == the number of concurrent test processes. (string value)
+#test_accounts_file = <None>
 
 # Allows test cases to create/destroy tenants and users. This option
 # requires that OpenStack Identity API admin credentials are known. If
@@ -105,14 +109,6 @@
 # Deprecated group/name - [orchestration]/allow_tenant_isolation
 #allow_tenant_isolation = true
 
-# If set to True it enables the Accounts provider, which locks
-# credentials to allow for parallel execution with pre-provisioned
-# accounts. It can only be used to run tests that ensure credentials
-# cleanup happens. It requires at least `2 * CONC` distinct accounts
-# configured in `test_accounts_file`, with CONC == the number of
-# concurrent test processes. (boolean value)
-#locking_credentials_provider = false
-
 # Roles to assign to all users created by tempest (list value)
 #tempest_roles =
 
@@ -302,9 +298,11 @@
 # value)
 #ssh_channel_timeout = 60
 
-# Name of the fixed network that is visible to all test tenants.
-# (string value)
-#fixed_network_name = private
+# Name of the fixed network that is visible to all test tenants. If
+# multiple networks are available for a tenant this is the network
+# which will be used for creating servers if tempest does not create a
+# network or a network is not specified elsewhere (string value)
+#fixed_network_name = <None>
 
 # Network used for SSH connections. Ignored if
 # use_floatingip_for_ssh=true or run_ssh=false. (string value)
@@ -393,7 +391,8 @@
 #block_migration_for_live_migration = false
 
 # Does the test environment block migration support cinder iSCSI
-# volumes (boolean value)
+# volumes. Note, libvirt doesn't support this, see
+# https://bugs.launchpad.net/nova/+bug/1398999 (boolean value)
 #block_migrate_cinder_iscsi = false
 
 # Enable VNC console. This configuration value should be same as
diff --git a/tempest/api/compute/admin/test_networks.py b/tempest/api/compute/admin/test_networks.py
index c20d483..477dc61 100644
--- a/tempest/api/compute/admin/test_networks.py
+++ b/tempest/api/compute/admin/test_networks.py
@@ -37,12 +37,15 @@
     @test.idempotent_id('d206d211-8912-486f-86e2-a9d090d1f416')
     def test_get_network(self):
         networks = self.client.list_networks()
-        configured_network = [x for x in networks if x['label'] ==
-                              CONF.compute.fixed_network_name]
-        self.assertEqual(1, len(configured_network),
-                         "{0} networks with label {1}".format(
-                             len(configured_network),
-                             CONF.compute.fixed_network_name))
+        if CONF.compute.fixed_network_name:
+            configured_network = [x for x in networks if x['label'] ==
+                                  CONF.compute.fixed_network_name]
+            self.assertEqual(1, len(configured_network),
+                             "{0} networks with label {1}".format(
+                                 len(configured_network),
+                                 CONF.compute.fixed_network_name))
+        else:
+            configured_network = networks
         configured_network = configured_network[0]
         network = self.client.get_network(configured_network['id'])
         self.assertEqual(configured_network['label'], network['label'])
@@ -51,5 +54,9 @@
     def test_list_all_networks(self):
         networks = self.client.list_networks()
         # Check the configured network is in the list
-        configured_network = CONF.compute.fixed_network_name
-        self.assertIn(configured_network, [x['label'] for x in networks])
+        if CONF.compute.fixed_network_name:
+            configured_network = CONF.compute.fixed_network_name
+            self.assertIn(configured_network, [x['label'] for x in networks])
+        else:
+            network_name = map(lambda x: x['label'], networks)
+            self.assertGreaterEqual(len(network_name), 1)
diff --git a/tempest/api/compute/servers/test_list_server_filters.py b/tempest/api/compute/servers/test_list_server_filters.py
index 70e4dff..f33204d 100644
--- a/tempest/api/compute/servers/test_list_server_filters.py
+++ b/tempest/api/compute/servers/test_list_server_filters.py
@@ -68,7 +68,10 @@
                                cls.image_ref_alt)
 
         network = cls.get_tenant_network()
-        cls.fixed_network_name = network['name']
+        if network:
+            cls.fixed_network_name = network['name']
+        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 = cls.create_test_server(name=cls.s1_name,
@@ -283,6 +286,9 @@
     def test_list_servers_filtered_by_ip(self):
         # Filter servers by ip
         # Here should be listed 1 server
+        if not self.fixed_network_name:
+            msg = 'fixed_network_name needs to be configured to run this test'
+            raise self.skipException(msg)
         self.s1 = self.client.get_server(self.s1['id'])
         ip = self.s1['addresses'][self.fixed_network_name][0]['addr']
         params = {'ip': ip}
@@ -301,6 +307,9 @@
         # Filter servers by regex ip
         # List all servers filtered by part of ip address.
         # Here should be listed all servers
+        if not self.fixed_network_name:
+            msg = 'fixed_network_name needs to be configured to run this test'
+            raise self.skipException(msg)
         self.s1 = self.client.get_server(self.s1['id'])
         ip = self.s1['addresses'][self.fixed_network_name][0]['addr'][0:-3]
         params = {'ip': ip}
diff --git a/tempest/api/identity/admin/v2/test_roles.py b/tempest/api/identity/admin/v2/test_roles.py
index dd5164d..b3746f2 100644
--- a/tempest/api/identity/admin/v2/test_roles.py
+++ b/tempest/api/identity/admin/v2/test_roles.py
@@ -26,7 +26,7 @@
     def resource_setup(cls):
         super(RolesTestJSON, cls).resource_setup()
         for _ in moves.xrange(5):
-            role_name = data_utils.rand_name(name='role-')
+            role_name = data_utils.rand_name(name='role')
             role = cls.client.create_role(role_name)
             cls.data.roles.append(role)
 
@@ -58,7 +58,7 @@
     @test.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')
         body = self.client.create_role(role_name)
         self.assertEqual(role_name, body['name'])
 
diff --git a/tempest/api/identity/admin/v2/test_roles_negative.py b/tempest/api/identity/admin/v2/test_roles_negative.py
index 662d1ea..5e197ec 100644
--- a/tempest/api/identity/admin/v2/test_roles_negative.py
+++ b/tempest/api/identity/admin/v2/test_roles_negative.py
@@ -58,7 +58,7 @@
     @test.idempotent_id('585c8998-a8a4-4641-a5dd-abef7a8ced00')
     def test_create_role_by_unauthorized_user(self):
         # Non-administrator user should not be able to create role
-        role_name = data_utils.rand_name(name='role-')
+        role_name = data_utils.rand_name(name='role')
         self.assertRaises(lib_exc.Forbidden,
                           self.non_admin_client.create_role, role_name)
 
@@ -68,7 +68,7 @@
         # Request to create role without a valid token 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')
         self.assertRaises(lib_exc.Unauthorized,
                           self.client.create_role, role_name)
         self.client.auth_provider.clear_auth()
@@ -77,7 +77,7 @@
     @test.idempotent_id('c0cde2c8-81c1-4bb0-8fe2-cf615a3547a8')
     def test_role_create_duplicate(self):
         # Role names should be unique
-        role_name = data_utils.rand_name(name='role-dup-')
+        role_name = data_utils.rand_name(name='role-dup')
         body = self.client.create_role(role_name)
         role1_id = body.get('id')
         self.addCleanup(self.client.delete_role, role1_id)
@@ -88,7 +88,7 @@
     @test.idempotent_id('15347635-b5b1-4a87-a280-deb2bd6d865e')
     def test_delete_role_by_unauthorized_user(self):
         # Non-administrator user should not be able to delete role
-        role_name = data_utils.rand_name(name='role-')
+        role_name = data_utils.rand_name(name='role')
         body = self.client.create_role(role_name)
         self.data.roles.append(body)
         role_id = body.get('id')
@@ -99,7 +99,7 @@
     @test.idempotent_id('44b60b20-70de-4dac-beaf-a3fc2650a16b')
     def test_delete_role_request_without_token(self):
         # Request to delete role without a valid token should fail
-        role_name = data_utils.rand_name(name='role-')
+        role_name = data_utils.rand_name(name='role')
         body = self.client.create_role(role_name)
         self.data.roles.append(body)
         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 0759ec5..326c78b 100644
--- a/tempest/api/identity/admin/v2/test_services.py
+++ b/tempest/api/identity/admin/v2/test_services.py
@@ -35,9 +35,9 @@
     def test_create_get_delete_service(self):
         # GET Service
         # Creating a Service
-        name = data_utils.rand_name('service-')
-        type = data_utils.rand_name('type--')
-        description = data_utils.rand_name('description-')
+        name = data_utils.rand_name('service')
+        type = data_utils.rand_name('type')
+        description = data_utils.rand_name('description')
         service_data = self.client.create_service(
             name, type, description=description)
         self.assertFalse(service_data['id'] is None)
@@ -67,8 +67,8 @@
     @test.idempotent_id('5d3252c8-e555-494b-a6c8-e11d7335da42')
     def test_create_service_without_description(self):
         # Create a service only with name and type
-        name = data_utils.rand_name('service-')
-        type = data_utils.rand_name('type--')
+        name = data_utils.rand_name('service')
+        type = data_utils.rand_name('type')
         service = self.client.create_service(name, type)
         self.assertIn('id', service)
         self.addCleanup(self._del_service, service['id'])
@@ -83,9 +83,9 @@
         # Create, List, Verify and Delete Services
         services = []
         for _ in moves.xrange(3):
-            name = data_utils.rand_name('service-')
-            type = data_utils.rand_name('type--')
-            description = data_utils.rand_name('description-')
+            name = data_utils.rand_name('service')
+            type = data_utils.rand_name('type')
+            description = data_utils.rand_name('description')
             service = self.client.create_service(
                 name, type, description=description)
             services.append(service)
diff --git a/tempest/api/identity/admin/v2/test_tenant_negative.py b/tempest/api/identity/admin/v2/test_tenant_negative.py
index 8fd1f5a..3ee412b 100644
--- a/tempest/api/identity/admin/v2/test_tenant_negative.py
+++ b/tempest/api/identity/admin/v2/test_tenant_negative.py
@@ -44,7 +44,7 @@
     @test.idempotent_id('162ba316-f18b-4987-8c0c-fd9140cd63ed')
     def test_tenant_delete_by_unauthorized_user(self):
         # Non-administrator user should not be able to delete a tenant
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         tenant = self.client.create_tenant(tenant_name)
         self.data.tenants.append(tenant)
         self.assertRaises(lib_exc.Forbidden,
@@ -54,7 +54,7 @@
     @test.idempotent_id('e450db62-2e9d-418f-893a-54772d6386b1')
     def test_tenant_delete_request_without_token(self):
         # Request to delete a tenant without a valid token should fail
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         tenant = self.client.create_tenant(tenant_name)
         self.data.tenants.append(tenant)
         token = self.client.auth_provider.get_token()
@@ -74,7 +74,7 @@
     @test.idempotent_id('af16f44b-a849-46cb-9f13-a751c388f739')
     def test_tenant_create_duplicate(self):
         # Tenant names should be unique
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         body = self.client.create_tenant(tenant_name)
         tenant = body
         self.data.tenants.append(tenant)
@@ -89,7 +89,7 @@
     @test.idempotent_id('d26b278a-6389-4702-8d6e-5980d80137e0')
     def test_create_tenant_by_unauthorized_user(self):
         # Non-administrator user should not be authorized to create a tenant
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         self.assertRaises(lib_exc.Forbidden,
                           self.non_admin_client.create_tenant, tenant_name)
 
@@ -97,7 +97,7 @@
     @test.idempotent_id('a3ee9d7e-6920-4dd5-9321-d4b2b7f0a638')
     def test_create_tenant_request_without_token(self):
         # Create tenant request without a token should not be authorized
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         token = self.client.auth_provider.get_token()
         self.client.delete_token(token)
         self.assertRaises(lib_exc.Unauthorized, self.client.create_tenant,
@@ -130,7 +130,7 @@
     @test.idempotent_id('41704dc5-c5f7-4f79-abfa-76e6fedc570b')
     def test_tenant_update_by_unauthorized_user(self):
         # Non-administrator user should not be able to update a tenant
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         tenant = self.client.create_tenant(tenant_name)
         self.data.tenants.append(tenant)
         self.assertRaises(lib_exc.Forbidden,
@@ -140,7 +140,7 @@
     @test.idempotent_id('7a421573-72c7-4c22-a98e-ce539219c657')
     def test_tenant_update_request_without_token(self):
         # Request to update a tenant without a valid token should fail
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         tenant = self.client.create_tenant(tenant_name)
         self.data.tenants.append(tenant)
         token = self.client.auth_provider.get_token()
diff --git a/tempest/api/identity/admin/v2/test_tenants.py b/tempest/api/identity/admin/v2/test_tenants.py
index 0be25a9..5dba65a 100644
--- a/tempest/api/identity/admin/v2/test_tenants.py
+++ b/tempest/api/identity/admin/v2/test_tenants.py
@@ -49,8 +49,8 @@
     @test.idempotent_id('d25e9f24-1310-4d29-b61b-d91299c21d6d')
     def test_tenant_create_with_description(self):
         # Create tenant with a description
-        tenant_name = data_utils.rand_name(name='tenant-')
-        tenant_desc = data_utils.rand_name(name='desc-')
+        tenant_name = data_utils.rand_name(name='tenant')
+        tenant_desc = data_utils.rand_name(name='desc')
         body = self.client.create_tenant(tenant_name,
                                          description=tenant_desc)
         tenant = body
@@ -70,7 +70,7 @@
     @test.idempotent_id('670bdddc-1cd7-41c7-b8e2-751cfb67df50')
     def test_tenant_create_enabled(self):
         # Create a tenant that is enabled
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         body = self.client.create_tenant(tenant_name, enabled=True)
         tenant = body
         self.data.tenants.append(tenant)
@@ -87,7 +87,7 @@
     @test.idempotent_id('3be22093-b30f-499d-b772-38340e5e16fb')
     def test_tenant_create_not_enabled(self):
         # Create a tenant that is not enabled
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         body = self.client.create_tenant(tenant_name, enabled=False)
         tenant = body
         self.data.tenants.append(tenant)
@@ -106,7 +106,7 @@
     @test.idempotent_id('781f2266-d128-47f3-8bdb-f70970add238')
     def test_tenant_update_name(self):
         # Update name attribute of a tenant
-        t_name1 = data_utils.rand_name(name='tenant-')
+        t_name1 = data_utils.rand_name(name='tenant')
         body = self.client.create_tenant(t_name1)
         tenant = body
         self.data.tenants.append(tenant)
@@ -114,7 +114,7 @@
         t_id = body['id']
         resp1_name = body['name']
 
-        t_name2 = data_utils.rand_name(name='tenant2-')
+        t_name2 = data_utils.rand_name(name='tenant2')
         body = self.client.update_tenant(t_id, name=t_name2)
         resp2_name = body['name']
         self.assertNotEqual(resp1_name, resp2_name)
@@ -133,8 +133,8 @@
     @test.idempotent_id('859fcfe1-3a03-41ef-86f9-b19a47d1cd87')
     def test_tenant_update_desc(self):
         # Update description attribute of a tenant
-        t_name = data_utils.rand_name(name='tenant-')
-        t_desc = data_utils.rand_name(name='desc-')
+        t_name = data_utils.rand_name(name='tenant')
+        t_desc = data_utils.rand_name(name='desc')
         body = self.client.create_tenant(t_name, description=t_desc)
         tenant = body
         self.data.tenants.append(tenant)
@@ -142,7 +142,7 @@
         t_id = body['id']
         resp1_desc = body['description']
 
-        t_desc2 = data_utils.rand_name(name='desc2-')
+        t_desc2 = data_utils.rand_name(name='desc2')
         body = self.client.update_tenant(t_id, description=t_desc2)
         resp2_desc = body['description']
         self.assertNotEqual(resp1_desc, resp2_desc)
@@ -161,7 +161,7 @@
     @test.idempotent_id('8fc8981f-f12d-4c66-9972-2bdcf2bc2e1a')
     def test_tenant_update_enable(self):
         # Update the enabled attribute of a tenant
-        t_name = data_utils.rand_name(name='tenant-')
+        t_name = data_utils.rand_name(name='tenant')
         t_en = False
         body = self.client.create_tenant(t_name, enabled=t_en)
         tenant = body
diff --git a/tempest/api/identity/admin/v2/test_tokens.py b/tempest/api/identity/admin/v2/test_tokens.py
index 29ba1de..860e5af 100644
--- a/tempest/api/identity/admin/v2/test_tokens.py
+++ b/tempest/api/identity/admin/v2/test_tokens.py
@@ -25,10 +25,10 @@
     @test.idempotent_id('453ad4d5-e486-4b2f-be72-cffc8149e586')
     def test_create_get_delete_token(self):
         # get a token by username and password
-        user_name = data_utils.rand_name(name='user-')
-        user_password = data_utils.rand_name(name='pass-')
+        user_name = data_utils.rand_name(name='user')
+        user_password = data_utils.rand_name(name='pass')
         # first:create a tenant
-        tenant_name = data_utils.rand_name(name='tenant-')
+        tenant_name = data_utils.rand_name(name='tenant')
         tenant = self.client.create_tenant(tenant_name)
         self.data.tenants.append(tenant)
         # second:create a user
@@ -60,8 +60,8 @@
         """
 
         # Create a user.
-        user_name = data_utils.rand_name(name='user-')
-        user_password = data_utils.rand_name(name='pass-')
+        user_name = data_utils.rand_name(name='user')
+        user_password = data_utils.rand_name(name='pass')
         tenant_id = None  # No default tenant so will get unscoped token.
         email = ''
         user = self.client.create_user(user_name, user_password,
@@ -69,16 +69,16 @@
         self.data.users.append(user)
 
         # Create a couple tenants.
-        tenant1_name = data_utils.rand_name(name='tenant-')
+        tenant1_name = data_utils.rand_name(name='tenant')
         tenant1 = self.client.create_tenant(tenant1_name)
         self.data.tenants.append(tenant1)
 
-        tenant2_name = data_utils.rand_name(name='tenant-')
+        tenant2_name = data_utils.rand_name(name='tenant')
         tenant2 = self.client.create_tenant(tenant2_name)
         self.data.tenants.append(tenant2)
 
         # Create a role
-        role_name = data_utils.rand_name(name='role-')
+        role_name = data_utils.rand_name(name='role')
         role = self.client.create_role(role_name)
         self.data.roles.append(role)
 
diff --git a/tempest/api/identity/admin/v2/test_users.py b/tempest/api/identity/admin/v2/test_users.py
index 2ca5595..f47f985 100644
--- a/tempest/api/identity/admin/v2/test_users.py
+++ b/tempest/api/identity/admin/v2/test_users.py
@@ -25,8 +25,8 @@
     @classmethod
     def resource_setup(cls):
         super(UsersTestJSON, cls).resource_setup()
-        cls.alt_user = data_utils.rand_name('test_user_')
-        cls.alt_password = data_utils.rand_name('pass_')
+        cls.alt_user = data_utils.rand_name('test_user')
+        cls.alt_password = data_utils.rand_name('pass')
         cls.alt_email = cls.alt_user + '@testmail.tm'
 
     @test.attr(type='smoke')
@@ -45,7 +45,7 @@
     def test_create_user_with_enabled(self):
         # Create a user with enabled : False
         self.data.setup_test_tenant()
-        name = data_utils.rand_name('test_user_')
+        name = data_utils.rand_name('test_user')
         user = self.client.create_user(name, self.alt_password,
                                        self.data.tenant['id'],
                                        self.alt_email, enabled=False)
@@ -58,7 +58,7 @@
     @test.idempotent_id('39d05857-e8a5-4ed4-ba83-0b52d3ab97ee')
     def test_update_user(self):
         # Test case to check if updating of user attributes is successful.
-        test_user = data_utils.rand_name('test_user_')
+        test_user = data_utils.rand_name('test_user')
         self.data.setup_test_tenant()
         user = self.client.create_user(test_user, self.alt_password,
                                        self.data.tenant['id'],
@@ -66,7 +66,7 @@
         # Delete the User at the end of this method
         self.addCleanup(self.client.delete_user, user['id'])
         # Updating user details with new values
-        u_name2 = data_utils.rand_name('user2-')
+        u_name2 = data_utils.rand_name('user2')
         u_email2 = u_name2 + '@testmail.tm'
         update_user = self.client.update_user(user['id'], name=u_name2,
                                               email=u_email2,
@@ -85,7 +85,7 @@
     @test.idempotent_id('29ed26f4-a74e-4425-9a85-fdb49fa269d2')
     def test_delete_user(self):
         # Delete a user
-        test_user = data_utils.rand_name('test_user_')
+        test_user = data_utils.rand_name('test_user')
         self.data.setup_test_tenant()
         user = self.client.create_user(test_user, self.alt_password,
                                        self.data.tenant['id'],
@@ -139,14 +139,14 @@
         self.data.setup_test_tenant()
         user_ids = list()
         fetched_user_ids = list()
-        alt_tenant_user1 = data_utils.rand_name('tenant_user1_')
+        alt_tenant_user1 = data_utils.rand_name('tenant_user1')
         user1 = self.client.create_user(alt_tenant_user1, 'password1',
                                         self.data.tenant['id'],
                                         'user1@123')
         user_ids.append(user1['id'])
         self.data.users.append(user1)
 
-        alt_tenant_user2 = data_utils.rand_name('tenant_user2_')
+        alt_tenant_user2 = data_utils.rand_name('tenant_user2')
         user2 = self.client.create_user(alt_tenant_user2, 'password2',
                                         self.data.tenant['id'],
                                         'user2@123')
@@ -179,7 +179,7 @@
         role = self.client.assign_user_role(tenant['id'], user['id'],
                                             role['id'])
 
-        alt_user2 = data_utils.rand_name('second_user_')
+        alt_user2 = data_utils.rand_name('second_user')
         second_user = self.client.create_user(alt_user2, 'password1',
                                               self.data.tenant['id'],
                                               'user2@123')
@@ -205,7 +205,7 @@
         # Test case to check if updating of user password is successful.
         self.data.setup_test_user()
         # Updating the user with new password
-        new_pass = data_utils.rand_name('pass-')
+        new_pass = data_utils.rand_name('pass')
         update_user = self.client.update_user_password(
             self.data.user['id'], new_pass)
         self.assertEqual(update_user['id'], self.data.user['id'])
diff --git a/tempest/api/identity/admin/v2/test_users_negative.py b/tempest/api/identity/admin/v2/test_users_negative.py
index 387b714..dcf5565 100644
--- a/tempest/api/identity/admin/v2/test_users_negative.py
+++ b/tempest/api/identity/admin/v2/test_users_negative.py
@@ -27,8 +27,8 @@
     @classmethod
     def resource_setup(cls):
         super(UsersNegativeTestJSON, cls).resource_setup()
-        cls.alt_user = data_utils.rand_name('test_user_')
-        cls.alt_password = data_utils.rand_name('pass_')
+        cls.alt_user = data_utils.rand_name('test_user')
+        cls.alt_password = data_utils.rand_name('pass')
         cls.alt_email = cls.alt_user + '@testmail.tm'
 
     @test.attr(type=['negative', 'gate'])
@@ -97,7 +97,7 @@
     def test_create_user_with_enabled_non_bool(self):
         # Attempt to create a user with valid enabled para should fail
         self.data.setup_test_tenant()
-        name = data_utils.rand_name('test_user_')
+        name = data_utils.rand_name('test_user')
         self.assertRaises(lib_exc.BadRequest, self.client.create_user,
                           name, self.alt_password,
                           self.data.tenant['id'],
@@ -107,7 +107,7 @@
     @test.idempotent_id('3d07e294-27a0-4144-b780-a2a1bf6fee19')
     def test_update_user_for_non_existent_user(self):
         # Attempt to update a user non-existent user should fail
-        user_name = data_utils.rand_name('user-')
+        user_name = data_utils.rand_name('user')
         non_existent_id = str(uuid.uuid4())
         self.assertRaises(lib_exc.NotFound, self.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 c427615..9bad8e0 100644
--- a/tempest/api/identity/admin/v3/test_credentials.py
+++ b/tempest/api/identity/admin/v3/test_credentials.py
@@ -27,14 +27,14 @@
         cls.projects = list()
         cls.creds_list = [['project_id', 'user_id', 'id'],
                           ['access', 'secret']]
-        u_name = data_utils.rand_name('user-')
+        u_name = data_utils.rand_name('user')
         u_desc = '%s description' % u_name
         u_email = '%s@testmail.tm' % u_name
-        u_password = data_utils.rand_name('pass-')
+        u_password = data_utils.rand_name('pass')
         for i in range(2):
             cls.project = cls.client.create_project(
-                data_utils.rand_name('project-'),
-                description=data_utils.rand_name('project-desc-'))
+                data_utils.rand_name('project'),
+                description=data_utils.rand_name('project-desc'))
             cls.projects.append(cls.project['id'])
 
         cls.user_body = cls.client.create_user(
@@ -54,8 +54,8 @@
     @test.attr(type='smoke')
     @test.idempotent_id('7cd59bf9-bda4-4c72-9467-d21cab278355')
     def test_credentials_create_get_update_delete(self):
-        keys = [data_utils.rand_name('Access-'),
-                data_utils.rand_name('Secret-')]
+        keys = [data_utils.rand_name('Access'),
+                data_utils.rand_name('Secret')]
         cred = self.creds_client.create_credential(
             keys[0], keys[1], self.user_body['id'],
             self.projects[0])
@@ -65,8 +65,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('NewAccess'),
+                    data_utils.rand_name('NewSecret')]
         update_body = self.creds_client.update_credential(
             cred['id'], access_key=new_keys[0], secret_key=new_keys[1],
             project_id=self.projects[1])
@@ -92,8 +92,8 @@
 
         for i in range(2):
             cred = self.creds_client.create_credential(
-                data_utils.rand_name('Access-'),
-                data_utils.rand_name('Secret-'),
+                data_utils.rand_name('Access'),
+                data_utils.rand_name('Secret'),
                 self.user_body['id'], self.projects[0])
             created_cred_ids.append(cred['id'])
             self.addCleanup(self._delete_credential, cred['id'])
diff --git a/tempest/api/identity/admin/v3/test_domains.py b/tempest/api/identity/admin/v3/test_domains.py
index 1f6e651..c6d379c 100644
--- a/tempest/api/identity/admin/v3/test_domains.py
+++ b/tempest/api/identity/admin/v3/test_domains.py
@@ -35,8 +35,8 @@
         fetched_ids = list()
         for _ in range(3):
             domain = self.client.create_domain(
-                data_utils.rand_name('domain-'),
-                description=data_utils.rand_name('domain-desc-'))
+                data_utils.rand_name('domain'),
+                description=data_utils.rand_name('domain-desc'))
             # Delete the domain at the end of this method
             self.addCleanup(self._delete_domain, domain['id'])
             domain_ids.append(domain['id'])
@@ -50,8 +50,8 @@
     @test.attr(type='smoke')
     @test.idempotent_id('f2f5b44a-82e8-4dad-8084-0661ea3b18cf')
     def test_create_update_delete_domain(self):
-        d_name = data_utils.rand_name('domain-')
-        d_desc = data_utils.rand_name('domain-desc-')
+        d_name = data_utils.rand_name('domain')
+        d_desc = data_utils.rand_name('domain-desc')
         domain = self.client.create_domain(
             d_name, description=d_desc)
         self.addCleanup(self._delete_domain, domain['id'])
@@ -64,8 +64,8 @@
         self.assertEqual(d_name, domain['name'])
         self.assertEqual(d_desc, domain['description'])
         self.assertEqual(True, domain['enabled'])
-        new_desc = data_utils.rand_name('new-desc-')
-        new_name = data_utils.rand_name('new-name-')
+        new_desc = data_utils.rand_name('new-desc')
+        new_name = data_utils.rand_name('new-name')
 
         updated_domain = self.client.update_domain(
             domain['id'], name=new_name, description=new_desc)
@@ -88,8 +88,8 @@
     @test.idempotent_id('036df86e-bb5d-42c0-a7c2-66b9db3a6046')
     def test_create_domain_with_disabled_status(self):
         # 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('domain')
+        d_desc = data_utils.rand_name('domain-desc')
         domain = self.client.create_domain(
             d_name, description=d_desc, enabled=False)
         self.addCleanup(self.client.delete_domain, domain['id'])
diff --git a/tempest/api/identity/admin/v3/test_endpoints.py b/tempest/api/identity/admin/v3/test_endpoints.py
index c683f59..2d8c04f 100644
--- a/tempest/api/identity/admin/v3/test_endpoints.py
+++ b/tempest/api/identity/admin/v3/test_endpoints.py
@@ -31,9 +31,9 @@
     def resource_setup(cls):
         super(EndPointsTestJSON, cls).resource_setup()
         cls.service_ids = list()
-        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('service')
+        s_type = data_utils.rand_name('type')
+        s_description = data_utils.rand_name('description')
         cls.service_data =\
             cls.service_client.create_service(s_name, s_type,
                                               description=s_description)
@@ -107,9 +107,9 @@
                                         enabled=True)
         self.addCleanup(self.client.delete_endpoint, endpoint_for_update['id'])
         # Creating service so as update 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('service')
+        s_type = data_utils.rand_name('type')
+        s_description = data_utils.rand_name('description')
         service2 =\
             self.service_client.create_service(s_name, s_type,
                                                description=s_description)
diff --git a/tempest/api/identity/admin/v3/test_endpoints_negative.py b/tempest/api/identity/admin/v3/test_endpoints_negative.py
index e2b7edc..8b85566 100644
--- a/tempest/api/identity/admin/v3/test_endpoints_negative.py
+++ b/tempest/api/identity/admin/v3/test_endpoints_negative.py
@@ -33,9 +33,9 @@
     def resource_setup(cls):
         super(EndpointsNegativeTestJSON, cls).resource_setup()
         cls.service_ids = list()
-        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('service')
+        s_type = data_utils.rand_name('type')
+        s_description = data_utils.rand_name('description')
         cls.service_data = (
             cls.service_client.create_service(s_name, s_type,
                                               description=s_description))
diff --git a/tempest/api/identity/admin/v3/test_groups.py b/tempest/api/identity/admin/v3/test_groups.py
index 98d1846..b366d1e 100644
--- a/tempest/api/identity/admin/v3/test_groups.py
+++ b/tempest/api/identity/admin/v3/test_groups.py
@@ -75,13 +75,13 @@
     def test_list_user_groups(self):
         # create a user
         user = self.client.create_user(
-            data_utils.rand_name('User-'),
-            password=data_utils.rand_name('Pass-'))
+            data_utils.rand_name('User'),
+            password=data_utils.rand_name('Pass'))
         self.addCleanup(self.client.delete_user, user['id'])
         # create two groups, and add user into them
         groups = []
         for i in range(2):
-            name = data_utils.rand_name('Group-')
+            name = data_utils.rand_name('Group')
             group = self.client.create_group(name)
             groups.append(group)
             self.addCleanup(self.client.delete_group, group['id'])
diff --git a/tempest/api/identity/admin/v3/test_policies.py b/tempest/api/identity/admin/v3/test_policies.py
index 63d2b0d..bad56f4 100644
--- a/tempest/api/identity/admin/v3/test_policies.py
+++ b/tempest/api/identity/admin/v3/test_policies.py
@@ -31,8 +31,8 @@
         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('BlobName')
+            policy_type = data_utils.rand_name('PolicyType')
             policy = self.policy_client.create_policy(blob,
                                                       policy_type)
             # Delete the Policy at the end of this method
@@ -49,8 +49,8 @@
     @test.idempotent_id('e544703a-2f03-4cf2-9b0f-350782fdb0d3')
     def test_create_update_delete_policy(self):
         # Test to update policy
-        blob = data_utils.rand_name('BlobName-')
-        policy_type = data_utils.rand_name('PolicyType-')
+        blob = data_utils.rand_name('BlobName')
+        policy_type = data_utils.rand_name('PolicyType')
         policy = self.policy_client.create_policy(blob, policy_type)
         self.addCleanup(self._delete_policy, policy['id'])
         self.assertIn('id', policy)
@@ -60,7 +60,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')
         data = self.policy_client.update_policy(
             policy['id'], type=update_type)
         self.assertIn('type', data)
diff --git a/tempest/api/identity/admin/v3/test_projects.py b/tempest/api/identity/admin/v3/test_projects.py
index 69b1fb4..5f8b3d1 100644
--- a/tempest/api/identity/admin/v3/test_projects.py
+++ b/tempest/api/identity/admin/v3/test_projects.py
@@ -25,8 +25,8 @@
     @test.idempotent_id('0ecf465c-0dc4-4532-ab53-91ffeb74d12d')
     def test_project_create_with_description(self):
         # Create project with a description
-        project_name = data_utils.rand_name('project-')
-        project_desc = data_utils.rand_name('desc-')
+        project_name = data_utils.rand_name('project')
+        project_desc = data_utils.rand_name('desc')
         project = self.client.create_project(
             project_name, description=project_desc)
         self.data.projects.append(project)
@@ -59,7 +59,7 @@
     @test.idempotent_id('1f66dc76-50cc-4741-a200-af984509e480')
     def test_project_create_enabled(self):
         # Create a project that is enabled
-        project_name = data_utils.rand_name('project-')
+        project_name = data_utils.rand_name('project')
         project = self.client.create_project(
             project_name, enabled=True)
         self.data.projects.append(project)
@@ -74,7 +74,7 @@
     @test.idempotent_id('78f96a9c-e0e0-4ee6-a3ba-fbf6dfd03207')
     def test_project_create_not_enabled(self):
         # Create a project that is not enabled
-        project_name = data_utils.rand_name('project-')
+        project_name = data_utils.rand_name('project')
         project = self.client.create_project(
             project_name, enabled=False)
         self.data.projects.append(project)
@@ -90,13 +90,13 @@
     @test.idempotent_id('f608f368-048c-496b-ad63-d286c26dab6b')
     def test_project_update_name(self):
         # Update name attribute of a project
-        p_name1 = data_utils.rand_name('project-')
+        p_name1 = data_utils.rand_name('project')
         project = self.client.create_project(p_name1)
         self.data.projects.append(project)
 
         resp1_name = project['name']
 
-        p_name2 = data_utils.rand_name('project2-')
+        p_name2 = data_utils.rand_name('project2')
         body = self.client.update_project(project['id'], name=p_name2)
         resp2_name = body['name']
         self.assertNotEqual(resp1_name, resp2_name)
@@ -112,14 +112,14 @@
     @test.idempotent_id('f138b715-255e-4a7d-871d-351e1ef2e153')
     def test_project_update_desc(self):
         # Update description attribute of a project
-        p_name = data_utils.rand_name('project-')
-        p_desc = data_utils.rand_name('desc-')
+        p_name = data_utils.rand_name('project')
+        p_desc = data_utils.rand_name('desc')
         project = self.client.create_project(
             p_name, description=p_desc)
         self.data.projects.append(project)
         resp1_desc = project['description']
 
-        p_desc2 = data_utils.rand_name('desc2-')
+        p_desc2 = data_utils.rand_name('desc2')
         body = self.client.update_project(
             project['id'], description=p_desc2)
         resp2_desc = body['description']
@@ -136,7 +136,7 @@
     @test.idempotent_id('b6b25683-c97f-474d-a595-55d410b68100')
     def test_project_update_enable(self):
         # Update the enabled attribute of a project
-        p_name = data_utils.rand_name('project-')
+        p_name = data_utils.rand_name('project')
         p_en = False
         project = self.client.create_project(p_name, enabled=p_en)
         self.data.projects.append(project)
@@ -161,15 +161,15 @@
     def test_associate_user_to_project(self):
         # Associate a user to a project
         # Create a Project
-        p_name = data_utils.rand_name('project-')
+        p_name = data_utils.rand_name('project')
         project = self.client.create_project(p_name)
         self.data.projects.append(project)
 
         # Create a User
-        u_name = data_utils.rand_name('user-')
+        u_name = data_utils.rand_name('user')
         u_desc = u_name + 'description'
         u_email = u_name + '@testmail.tm'
-        u_password = data_utils.rand_name('pass-')
+        u_password = data_utils.rand_name('pass')
         user = self.client.create_user(
             u_name, description=u_desc, password=u_password,
             email=u_email, project_id=project['id'])
diff --git a/tempest/api/identity/admin/v3/test_projects_negative.py b/tempest/api/identity/admin/v3/test_projects_negative.py
index 739bb35..2dda585 100644
--- a/tempest/api/identity/admin/v3/test_projects_negative.py
+++ b/tempest/api/identity/admin/v3/test_projects_negative.py
@@ -33,7 +33,7 @@
     @test.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('project-dup')
         project = self.client.create_project(project_name)
         self.data.projects.append(project)
 
@@ -44,7 +44,7 @@
     @test.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('project')
         self.assertRaises(
             lib_exc.Forbidden, self.non_admin_client.create_project,
             project_name)
@@ -68,7 +68,7 @@
     @test.idempotent_id('8d68c012-89e0-4394-8d6b-ccd7196def97')
     def test_project_delete_by_unauthorized_user(self):
         # Non-admin user should not be able to delete a project
-        project_name = data_utils.rand_name('project-')
+        project_name = data_utils.rand_name('project')
         project = self.client.create_project(project_name)
         self.data.projects.append(project)
         self.assertRaises(
diff --git a/tempest/api/identity/admin/v3/test_regions.py b/tempest/api/identity/admin/v3/test_regions.py
index b5c337d..146cc65 100644
--- a/tempest/api/identity/admin/v3/test_regions.py
+++ b/tempest/api/identity/admin/v3/test_regions.py
@@ -32,7 +32,7 @@
         super(RegionsTestJSON, cls).resource_setup()
         cls.setup_regions = list()
         for i in range(2):
-            r_description = data_utils.rand_name('description-')
+            r_description = data_utils.rand_name('description')
             region = cls.client.create_region(r_description)
             cls.setup_regions.append(region)
 
@@ -50,7 +50,7 @@
     @test.attr(type='gate')
     @test.idempotent_id('56186092-82e4-43f2-b954-91013218ba42')
     def test_create_update_get_delete_region(self):
-        r_description = data_utils.rand_name('description-')
+        r_description = data_utils.rand_name('description')
         region = self.client.create_region(
             r_description, parent_region_id=self.setup_regions[0]['id'])
         self.addCleanup(self._delete_region, region['id'])
@@ -58,7 +58,7 @@
         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('description')
         region = self.client.update_region(
             region['id'],
             description=r_alt_description,
@@ -77,7 +77,7 @@
     def test_create_region_with_specific_id(self):
         # Create a region with a specific id
         r_region_id = data_utils.rand_uuid()
-        r_description = data_utils.rand_name('description-')
+        r_description = data_utils.rand_name('description')
         region = self.client.create_region(
             r_description, unique_region_id=r_region_id)
         self.addCleanup(self._delete_region, region['id'])
diff --git a/tempest/api/identity/admin/v3/test_roles.py b/tempest/api/identity/admin/v3/test_roles.py
index b5b1d7b..8334c18 100644
--- a/tempest/api/identity/admin/v3/test_roles.py
+++ b/tempest/api/identity/admin/v3/test_roles.py
@@ -25,30 +25,30 @@
     def resource_setup(cls):
         super(RolesV3TestJSON, cls).resource_setup()
         for _ in range(3):
-            role_name = data_utils.rand_name(name='role-')
+            role_name = data_utils.rand_name(name='role')
             role = cls.client.create_role(role_name)
             cls.data.v3_roles.append(role)
         cls.fetched_role_ids = list()
-        u_name = data_utils.rand_name('user-')
+        u_name = data_utils.rand_name('user')
         u_desc = '%s description' % u_name
         u_email = '%s@testmail.tm' % u_name
-        cls.u_password = data_utils.rand_name('pass-')
+        cls.u_password = data_utils.rand_name('pass')
         cls.domain = cls.client.create_domain(
-            data_utils.rand_name('domain-'),
-            description=data_utils.rand_name('domain-desc-'))
+            data_utils.rand_name('domain'),
+            description=data_utils.rand_name('domain-desc'))
         cls.project = cls.client.create_project(
-            data_utils.rand_name('project-'),
-            description=data_utils.rand_name('project-desc-'),
+            data_utils.rand_name('project'),
+            description=data_utils.rand_name('project-desc'),
             domain_id=cls.domain['id'])
         cls.group_body = cls.client.create_group(
-            data_utils.rand_name('Group-'), project_id=cls.project['id'],
+            data_utils.rand_name('Group'), project_id=cls.project['id'],
             domain_id=cls.domain['id'])
         cls.user_body = cls.client.create_user(
             u_name, description=u_desc, password=cls.u_password,
             email=u_email, project_id=cls.project['id'],
             domain_id=cls.domain['id'])
         cls.role = cls.client.create_role(
-            data_utils.rand_name('Role-'))
+            data_utils.rand_name('Role'))
 
     @classmethod
     def resource_cleanup(cls):
@@ -69,13 +69,13 @@
     @test.attr(type='smoke')
     @test.idempotent_id('18afc6c0-46cf-4911-824e-9989cc056c3a')
     def test_role_create_update_get_list(self):
-        r_name = data_utils.rand_name('Role-')
+        r_name = data_utils.rand_name('Role')
         role = self.client.create_role(r_name)
         self.addCleanup(self.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('NewRole')
         updated_role = self.client.update_role(new_name, role['id'])
         self.assertIn('name', updated_role)
         self.assertIn('id', updated_role)
diff --git a/tempest/api/identity/admin/v3/test_tokens.py b/tempest/api/identity/admin/v3/test_tokens.py
index 7358ce9..702e936 100644
--- a/tempest/api/identity/admin/v3/test_tokens.py
+++ b/tempest/api/identity/admin/v3/test_tokens.py
@@ -27,10 +27,10 @@
     def test_tokens(self):
         # Valid user's token is authenticated
         # Create a User
-        u_name = data_utils.rand_name('user-')
+        u_name = data_utils.rand_name('user')
         u_desc = '%s-description' % u_name
         u_email = '%s@testmail.tm' % u_name
-        u_password = data_utils.rand_name('pass-')
+        u_password = data_utils.rand_name('pass')
         user = self.client.create_user(
             u_name, description=u_desc, password=u_password,
             email=u_email)
@@ -61,22 +61,22 @@
         """
 
         # Create a user.
-        user_name = data_utils.rand_name(name='user-')
-        user_password = data_utils.rand_name(name='pass-')
+        user_name = data_utils.rand_name(name='user')
+        user_password = data_utils.rand_name(name='pass')
         user = self.client.create_user(user_name, password=user_password)
         self.addCleanup(self.client.delete_user, user['id'])
 
         # Create a couple projects
-        project1_name = data_utils.rand_name(name='project-')
+        project1_name = data_utils.rand_name(name='project')
         project1 = self.client.create_project(project1_name)
         self.addCleanup(self.client.delete_project, project1['id'])
 
-        project2_name = data_utils.rand_name(name='project-')
+        project2_name = data_utils.rand_name(name='project')
         project2 = self.client.create_project(project2_name)
         self.addCleanup(self.client.delete_project, project2['id'])
 
         # Create a role
-        role_name = data_utils.rand_name(name='role-')
+        role_name = data_utils.rand_name(name='role')
         role = self.client.create_role(role_name)
         self.addCleanup(self.client.delete_role, role['id'])
 
diff --git a/tempest/api/identity/admin/v3/test_trusts.py b/tempest/api/identity/admin/v3/test_trusts.py
index 9d3d0bc..cafd615 100644
--- a/tempest/api/identity/admin/v3/test_trusts.py
+++ b/tempest/api/identity/admin/v3/test_trusts.py
@@ -52,10 +52,10 @@
         self.assertIsNotNone(self.trustor_project_id)
 
         # Create a trustor User
-        self.trustor_username = data_utils.rand_name('user-')
+        self.trustor_username = data_utils.rand_name('user')
         u_desc = self.trustor_username + 'description'
         u_email = self.trustor_username + '@testmail.xx'
-        self.trustor_password = data_utils.rand_name('pass-')
+        self.trustor_password = data_utils.rand_name('pass')
         user = self.client.create_user(
             self.trustor_username,
             description=u_desc,
@@ -65,8 +65,8 @@
         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('DelegatedRole')
+        self.not_delegated_role = data_utils.rand_name('NotDelegatedRole')
 
         role = self.client.create_role(self.delegated_role)
         self.delegated_role_id = role['id']
diff --git a/tempest/api/identity/admin/v3/test_users.py b/tempest/api/identity/admin/v3/test_users.py
index 9d9f61c..e4bfd6a 100644
--- a/tempest/api/identity/admin/v3/test_users.py
+++ b/tempest/api/identity/admin/v3/test_users.py
@@ -26,10 +26,10 @@
     def test_user_update(self):
         # Test case to check if updating of user attributes is successful.
         # Creating first user
-        u_name = data_utils.rand_name('user-')
+        u_name = data_utils.rand_name('user')
         u_desc = u_name + 'description'
         u_email = u_name + '@testmail.tm'
-        u_password = data_utils.rand_name('pass-')
+        u_password = data_utils.rand_name('pass')
         user = self.client.create_user(
             u_name, description=u_desc, password=u_password,
             email=u_email, enabled=False)
@@ -37,12 +37,12 @@
         self.addCleanup(self.client.delete_user, user['id'])
         # Creating second project for updation
         project = self.client.create_project(
-            data_utils.rand_name('project-'),
-            description=data_utils.rand_name('project-desc-'))
+            data_utils.rand_name('project'),
+            description=data_utils.rand_name('project-desc'))
         # Delete the Project at the end of this method
         self.addCleanup(self.client.delete_project, project['id'])
         # Updating user details with new values
-        u_name2 = data_utils.rand_name('user2-')
+        u_name2 = data_utils.rand_name('user2')
         u_email2 = u_name2 + '@testmail.tm'
         u_description2 = u_name2 + ' description'
         update_user = self.client.update_user(
@@ -95,15 +95,15 @@
         assigned_project_ids = list()
         fetched_project_ids = list()
         u_project = self.client.create_project(
-            data_utils.rand_name('project-'),
-            description=data_utils.rand_name('project-desc-'))
+            data_utils.rand_name('project'),
+            description=data_utils.rand_name('project-desc'))
         # Delete the Project at the end of this method
         self.addCleanup(self.client.delete_project, u_project['id'])
         # Create a user.
-        u_name = data_utils.rand_name('user-')
+        u_name = data_utils.rand_name('user')
         u_desc = u_name + 'description'
         u_email = u_name + '@testmail.tm'
-        u_password = data_utils.rand_name('pass-')
+        u_password = data_utils.rand_name('pass')
         user_body = self.client.create_user(
             u_name, description=u_desc, password=u_password,
             email=u_email, enabled=False, project_id=u_project['id'])
@@ -111,7 +111,7 @@
         self.addCleanup(self.client.delete_user, user_body['id'])
         # Creating Role
         role_body = self.client.create_role(
-            data_utils.rand_name('role-'))
+            data_utils.rand_name('role'))
         # Delete the Role at the end of this method
         self.addCleanup(self.client.delete_role, role_body['id'])
 
@@ -120,8 +120,8 @@
         for i in range(2):
             # Creating project so as to assign role
             project_body = self.client.create_project(
-                data_utils.rand_name('project-'),
-                description=data_utils.rand_name('project-desc-'))
+                data_utils.rand_name('project'),
+                description=data_utils.rand_name('project-desc'))
             project = self.client.get_project(project_body['id'])
             # Delete the Project at the end of this method
             self.addCleanup(self.client.delete_project, project_body['id'])
diff --git a/tempest/api/identity/base.py b/tempest/api/identity/base.py
index 882ef98..b83da3e 100644
--- a/tempest/api/identity/base.py
+++ b/tempest/api/identity/base.py
@@ -19,6 +19,7 @@
 
 from tempest import clients
 from tempest.common import cred_provider
+from tempest.common import credentials
 from tempest import config
 import tempest.test
 
@@ -26,13 +27,7 @@
 LOG = logging.getLogger(__name__)
 
 
-class BaseIdentityAdminTest(tempest.test.BaseTestCase):
-
-    @classmethod
-    def setup_credentials(cls):
-        super(BaseIdentityAdminTest, cls).setup_credentials()
-        cls.os = cls.get_client_manager()
-        cls.os_adm = clients.Manager(cls.isolated_creds.get_admin_creds())
+class BaseIdentityTest(tempest.test.BaseTestCase):
 
     @classmethod
     def disable_user(cls, user_name):
@@ -69,24 +64,55 @@
             return role[0]
 
 
-class BaseIdentityV2AdminTest(BaseIdentityAdminTest):
+class BaseIdentityV2Test(BaseIdentityTest):
+
+    @classmethod
+    def setup_credentials(cls):
+        super(BaseIdentityV2Test, cls).setup_credentials()
+        cls.os = cls.get_client_manager(identity_version='v2')
 
     @classmethod
     def skip_checks(cls):
-        super(BaseIdentityV2AdminTest, cls).skip_checks()
+        super(BaseIdentityV2Test, cls).skip_checks()
         if not CONF.identity_feature_enabled.api_v2:
             raise cls.skipException("Identity api v2 is not enabled")
 
     @classmethod
     def setup_clients(cls):
+        super(BaseIdentityV2Test, cls).setup_clients()
+        cls.non_admin_client = cls.os.identity_client
+        cls.non_admin_token_client = cls.os.token_client
+
+    @classmethod
+    def resource_setup(cls):
+        super(BaseIdentityV2Test, cls).resource_setup()
+
+    @classmethod
+    def resource_cleanup(cls):
+        super(BaseIdentityV2Test, cls).resource_cleanup()
+
+
+class BaseIdentityV2AdminTest(BaseIdentityV2Test):
+
+    @classmethod
+    def setup_credentials(cls):
+        super(BaseIdentityV2AdminTest, cls).setup_credentials()
+        cls.os_adm = clients.Manager(cls.isolated_creds.get_admin_creds())
+
+    @classmethod
+    def skip_checks(cls):
+        if not credentials.is_admin_available():
+            raise cls.skipException('v2 Admin auth disabled')
+        super(BaseIdentityV2AdminTest, cls).skip_checks()
+
+    @classmethod
+    def setup_clients(cls):
         super(BaseIdentityV2AdminTest, cls).setup_clients()
         cls.client = cls.os_adm.identity_client
         cls.token_client = cls.os_adm.token_client
         if not cls.client.has_admin_extensions():
             raise cls.skipException("Admin extensions disabled")
 
-        cls.non_admin_client = cls.os.identity_client
-
     @classmethod
     def resource_setup(cls):
         super(BaseIdentityV2AdminTest, cls).resource_setup()
@@ -98,27 +124,59 @@
         super(BaseIdentityV2AdminTest, cls).resource_cleanup()
 
 
-class BaseIdentityV3AdminTest(BaseIdentityAdminTest):
+class BaseIdentityV3Test(BaseIdentityTest):
+
+    @classmethod
+    def setup_credentials(cls):
+        super(BaseIdentityV3Test, cls).setup_credentials()
+        cls.os = cls.get_client_manager(identity_version='v3')
 
     @classmethod
     def skip_checks(cls):
-        super(BaseIdentityV3AdminTest, cls).skip_checks()
+        super(BaseIdentityV3Test, cls).skip_checks()
         if not CONF.identity_feature_enabled.api_v3:
             raise cls.skipException("Identity api v3 is not enabled")
 
     @classmethod
     def setup_clients(cls):
+        super(BaseIdentityV3Test, cls).setup_clients()
+        cls.non_admin_client = cls.os.identity_v3_client
+        cls.non_admin_token = cls.os.token_v3_client
+        cls.non_admin_endpoints_client = cls.os.endpoints_client
+        cls.non_admin_region_client = cls.os.region_client
+        cls.non_admin_service_client = cls.os.service_client
+        cls.non_admin_policy_client = cls.os.policy_client
+        cls.non_admin_creds_client = cls.os.credentials_client
+
+    @classmethod
+    def resource_cleanup(cls):
+        super(BaseIdentityV3Test, cls).resource_cleanup()
+
+
+class BaseIdentityV3AdminTest(BaseIdentityV3Test):
+
+    @classmethod
+    def setup_credentials(cls):
+        super(BaseIdentityV3AdminTest, cls).setup_credentials()
+        cls.os_adm = clients.Manager(cls.isolated_creds.get_admin_creds())
+
+    @classmethod
+    def skip_checks(cls):
+        if not credentials.is_admin_available():
+            raise cls.skipException('v3 Admin auth disabled')
+        super(BaseIdentityV3AdminTest, cls).skip_checks()
+
+    @classmethod
+    def setup_clients(cls):
         super(BaseIdentityV3AdminTest, cls).setup_clients()
         cls.client = cls.os_adm.identity_v3_client
         cls.token = cls.os_adm.token_v3_client
         cls.endpoints_client = cls.os_adm.endpoints_client
         cls.region_client = cls.os_adm.region_client
         cls.data = DataGenerator(cls.client)
-        cls.non_admin_client = cls.os.identity_v3_client
         cls.service_client = cls.os_adm.service_client
         cls.policy_client = cls.os_adm.policy_client
         cls.creds_client = cls.os_adm.credentials_client
-        cls.non_admin_client = cls.os.identity_v3_client
 
     @classmethod
     def resource_cleanup(cls):
@@ -171,8 +229,8 @@
         def setup_test_user(self):
             """Set up a test user."""
             self.setup_test_tenant()
-            self.test_user = data_utils.rand_name('test_user_')
-            self.test_password = data_utils.rand_name('pass_')
+            self.test_user = data_utils.rand_name('test_user')
+            self.test_password = data_utils.rand_name('pass')
             self.test_email = self.test_user + '@testmail.tm'
             self.user = self.client.create_user(self.test_user,
                                                 self.test_password,
@@ -182,8 +240,8 @@
 
         def setup_test_tenant(self):
             """Set up a test tenant."""
-            self.test_tenant = data_utils.rand_name('test_tenant_')
-            self.test_description = data_utils.rand_name('desc_')
+            self.test_tenant = data_utils.rand_name('test_tenant')
+            self.test_description = data_utils.rand_name('desc')
             self.tenant = self.client.create_tenant(
                 name=self.test_tenant,
                 description=self.test_description)
@@ -198,8 +256,8 @@
         def setup_test_v3_user(self):
             """Set up a test v3 user."""
             self.setup_test_project()
-            self.test_user = data_utils.rand_name('test_user_')
-            self.test_password = data_utils.rand_name('pass_')
+            self.test_user = data_utils.rand_name('test_user')
+            self.test_password = data_utils.rand_name('pass')
             self.test_email = self.test_user + '@testmail.tm'
             self.v3_user = self.client.create_user(
                 self.test_user,
@@ -210,8 +268,8 @@
 
         def setup_test_project(self):
             """Set up a test project."""
-            self.test_project = data_utils.rand_name('test_project_')
-            self.test_description = data_utils.rand_name('desc_')
+            self.test_project = data_utils.rand_name('test_project')
+            self.test_description = data_utils.rand_name('desc')
             self.project = self.client.create_project(
                 name=self.test_project,
                 description=self.test_description)
diff --git a/tempest/api/identity/v2/__init__.py b/tempest/api/identity/v2/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tempest/api/identity/v2/__init__.py
diff --git a/tempest/api/identity/v2/test_tokens.py b/tempest/api/identity/v2/test_tokens.py
new file mode 100644
index 0000000..5a8afa0
--- /dev/null
+++ b/tempest/api/identity/v2/test_tokens.py
@@ -0,0 +1,38 @@
+# Copyright 2015 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.identity import base
+from tempest import test
+
+
+class TokensTest(base.BaseIdentityV2Test):
+
+    @test.idempotent_id('65ae3b78-91ff-467b-a705-f6678863b8ec')
+    def test_create_token(self):
+
+        token_client = self.non_admin_token_client
+
+        # get a token for the user
+        creds = self.os.credentials
+        username = creds.username
+        password = creds.password
+        tenant_name = creds.tenant_name
+
+        body = token_client.auth(username,
+                                 password,
+                                 tenant_name)
+
+        self.assertEqual(body['token']['tenant']['name'],
+                         tenant_name)
diff --git a/tempest/api/identity/v3/__init__.py b/tempest/api/identity/v3/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tempest/api/identity/v3/__init__.py
diff --git a/tempest/api/identity/v3/test_tokens.py b/tempest/api/identity/v3/test_tokens.py
new file mode 100644
index 0000000..ab4a09f
--- /dev/null
+++ b/tempest/api/identity/v3/test_tokens.py
@@ -0,0 +1,33 @@
+# Copyright 2015 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.identity import base
+from tempest import test
+
+
+class TokensV3Test(base.BaseIdentityV3Test):
+
+    @test.idempotent_id('6f8e4436-fc96-4282-8122-e41df57197a9')
+    def test_create_token(self):
+
+        creds = self.os.credentials
+        user_id = creds.user_id
+        username = creds.username
+        password = creds.password
+        resp = self.non_admin_token.auth(user_id=user_id,
+                                         password=password)
+
+        subject_name = resp['token']['user']['name']
+        self.assertEqual(subject_name, username)
diff --git a/tempest/api/network/admin/test_agent_management.py b/tempest/api/network/admin/test_agent_management.py
index d5454ec..be5bb1f 100644
--- a/tempest/api/network/admin/test_agent_management.py
+++ b/tempest/api/network/admin/test_agent_management.py
@@ -20,11 +20,15 @@
 class AgentManagementTestJSON(base.BaseAdminNetworkTest):
 
     @classmethod
-    def resource_setup(cls):
-        super(AgentManagementTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(AgentManagementTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('agent', 'network'):
             msg = "agent extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(AgentManagementTestJSON, cls).resource_setup()
         body = cls.admin_client.list_agents()
         agents = body['agents']
         cls.agent = agents[0]
diff --git a/tempest/api/network/admin/test_dhcp_agent_scheduler.py b/tempest/api/network/admin/test_dhcp_agent_scheduler.py
index 26f5e7a..3b94b82 100644
--- a/tempest/api/network/admin/test_dhcp_agent_scheduler.py
+++ b/tempest/api/network/admin/test_dhcp_agent_scheduler.py
@@ -19,11 +19,15 @@
 class DHCPAgentSchedulersTestJSON(base.BaseAdminNetworkTest):
 
     @classmethod
-    def resource_setup(cls):
-        super(DHCPAgentSchedulersTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(DHCPAgentSchedulersTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('dhcp_agent_scheduler', 'network'):
             msg = "dhcp_agent_scheduler extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(DHCPAgentSchedulersTestJSON, cls).resource_setup()
         # 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_floating_ips_admin_actions.py b/tempest/api/network/admin/test_floating_ips_admin_actions.py
index ccf3980..ce3e319 100644
--- a/tempest/api/network/admin/test_floating_ips_admin_actions.py
+++ b/tempest/api/network/admin/test_floating_ips_admin_actions.py
@@ -24,16 +24,23 @@
 
 
 class FloatingIPAdminTestJSON(base.BaseAdminNetworkTest):
-
     force_tenant_isolation = True
 
     @classmethod
+    def setup_credentials(cls):
+        super(FloatingIPAdminTestJSON, cls).setup_credentials()
+        cls.alt_manager = clients.Manager(cls.isolated_creds.get_alt_creds())
+
+    @classmethod
+    def setup_clients(cls):
+        super(FloatingIPAdminTestJSON, cls).setup_clients()
+        cls.alt_client = cls.alt_manager.network_client
+
+    @classmethod
     def resource_setup(cls):
         super(FloatingIPAdminTestJSON, cls).resource_setup()
         cls.ext_net_id = CONF.network.public_network_id
         cls.floating_ip = cls.create_floatingip(cls.ext_net_id)
-        cls.alt_manager = clients.Manager(cls.isolated_creds.get_alt_creds())
-        cls.alt_client = cls.alt_manager.network_client
         cls.network = cls.create_network()
         cls.subnet = cls.create_subnet(cls.network)
         cls.router = cls.create_router(data_utils.rand_name('router-'),
diff --git a/tempest/api/network/admin/test_l3_agent_scheduler.py b/tempest/api/network/admin/test_l3_agent_scheduler.py
index 257289f..ad121b0 100644
--- a/tempest/api/network/admin/test_l3_agent_scheduler.py
+++ b/tempest/api/network/admin/test_l3_agent_scheduler.py
@@ -15,11 +15,11 @@
 from tempest_lib.common.utils import data_utils
 
 from tempest.api.network import base
+from tempest import exceptions
 from tempest import test
 
 
 class L3AgentSchedulerTestJSON(base.BaseAdminNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -34,12 +34,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(L3AgentSchedulerTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(L3AgentSchedulerTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('l3_agent_scheduler', 'network'):
             msg = "L3 Agent Scheduler Extension not enabled."
             raise cls.skipException(msg)
-        # Trying to get agent details for L3 Agent
+
+    @classmethod
+    def resource_setup(cls):
+        super(L3AgentSchedulerTestJSON, cls).resource_setup()
         body = cls.admin_client.list_agents()
         agents = body['agents']
         for agent in agents:
@@ -47,8 +50,8 @@
                 cls.agent = agent
                 break
         else:
-            msg = "L3 Agent not found"
-            raise cls.skipException(msg)
+            msg = "L3 Agent Scheduler enabled in conf, but L3 Agent not found"
+            raise exceptions.InvalidConfiguration(msg)
 
     @test.attr(type='smoke')
     @test.idempotent_id('b7ce6e89-e837-4ded-9b78-9ed3c9c6a45a')
diff --git a/tempest/api/network/admin/test_lbaas_agent_scheduler.py b/tempest/api/network/admin/test_lbaas_agent_scheduler.py
index 29b69c3..c4f117b 100644
--- a/tempest/api/network/admin/test_lbaas_agent_scheduler.py
+++ b/tempest/api/network/admin/test_lbaas_agent_scheduler.py
@@ -19,7 +19,6 @@
 
 
 class LBaaSAgentSchedulerTestJSON(base.BaseAdminNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -35,11 +34,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(LBaaSAgentSchedulerTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(LBaaSAgentSchedulerTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('lbaas_agent_scheduler', 'network'):
             msg = "LBaaS Agent Scheduler Extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(LBaaSAgentSchedulerTestJSON, cls).resource_setup()
         cls.network = cls.create_network()
         cls.subnet = cls.create_subnet(cls.network)
         pool_name = data_utils.rand_name('pool-')
diff --git a/tempest/api/network/admin/test_load_balancer_admin_actions.py b/tempest/api/network/admin/test_load_balancer_admin_actions.py
index b49b57c..5a32119 100644
--- a/tempest/api/network/admin/test_load_balancer_admin_actions.py
+++ b/tempest/api/network/admin/test_load_balancer_admin_actions.py
@@ -20,7 +20,6 @@
 
 
 class LoadBalancerAdminTestJSON(base.BaseAdminNetworkTest):
-
     """
     Test admin actions for load balancer.
 
@@ -29,15 +28,28 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(LoadBalancerAdminTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(LoadBalancerAdminTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('lbaas', 'network'):
             msg = "lbaas extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def setup_credentials(cls):
+        super(LoadBalancerAdminTestJSON, cls).setup_credentials()
+        cls.manager = cls.get_client_manager()
+        cls.primary_creds = cls.isolated_creds.get_primary_creds()
+
+    @classmethod
+    def setup_clients(cls):
+        super(LoadBalancerAdminTestJSON, cls).setup_clients()
+        cls.client = cls.manager.network_client
+
+    @classmethod
+    def resource_setup(cls):
+        super(LoadBalancerAdminTestJSON, cls).resource_setup()
         cls.force_tenant_isolation = True
-        manager = cls.get_client_manager()
-        cls.client = manager.network_client
-        cls.tenant_id = cls.isolated_creds.get_primary_creds().tenant_id
+        cls.tenant_id = cls.primary_creds.tenant_id
         cls.network = cls.create_network()
         cls.subnet = cls.create_subnet(cls.network)
         cls.pool = cls.create_pool(data_utils.rand_name('pool-'),
diff --git a/tempest/api/network/admin/test_quotas.py b/tempest/api/network/admin/test_quotas.py
index 60552b9..275c0d1 100644
--- a/tempest/api/network/admin/test_quotas.py
+++ b/tempest/api/network/admin/test_quotas.py
@@ -20,7 +20,6 @@
 
 
 class QuotasTest(base.BaseAdminNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -38,11 +37,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(QuotasTest, cls).resource_setup()
+    def skip_checks(cls):
+        super(QuotasTest, cls).skip_checks()
         if not test.is_extension_enabled('quotas', 'network'):
             msg = "quotas extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def setup_clients(cls):
+        super(QuotasTest, cls).setup_clients()
         cls.identity_admin_client = cls.os_adm.identity_client
 
     def _check_quotas(self, new_quotas):
diff --git a/tempest/api/network/base.py b/tempest/api/network/base.py
index cc2d21a..26a31cb 100644
--- a/tempest/api/network/base.py
+++ b/tempest/api/network/base.py
@@ -19,6 +19,7 @@
 from tempest_lib import exceptions as lib_exc
 
 from tempest import clients
+from tempest.common import credentials
 from tempest import config
 from tempest import exceptions
 import tempest.test
@@ -56,19 +57,30 @@
     _ip_version = 4
 
     @classmethod
-    def resource_setup(cls):
-        # Create no network resources for these test.
-        cls.set_network_resources()
-        super(BaseNetworkTest, cls).resource_setup()
+    def skip_checks(cls):
+        super(BaseNetworkTest, cls).skip_checks()
         if not CONF.service_available.neutron:
             raise cls.skipException("Neutron support is required")
         if cls._ip_version == 6 and not CONF.network_feature_enabled.ipv6:
             raise cls.skipException("IPv6 Tests are disabled.")
 
-        os = cls.get_client_manager()
+    @classmethod
+    def setup_credentials(cls):
+        # Create no network resources for these test.
+        cls.set_network_resources()
+        super(BaseNetworkTest, cls).setup_credentials()
+        cls.os = cls.get_client_manager()
+
+    @classmethod
+    def setup_clients(cls):
+        super(BaseNetworkTest, cls).setup_clients()
+        cls.client = cls.os.network_client
+
+    @classmethod
+    def resource_setup(cls):
+        super(BaseNetworkTest, cls).resource_setup()
 
         cls.network_cfg = CONF.network
-        cls.client = os.network_client
         cls.networks = []
         cls.subnets = []
         cls.ports = []
@@ -251,7 +263,8 @@
 
     @classmethod
     def create_router(cls, router_name=None, admin_state_up=False,
-                      external_network_id=None, enable_snat=None):
+                      external_network_id=None, enable_snat=None,
+                      **kwargs):
         ext_gw_info = {}
         if external_network_id:
             ext_gw_info['network_id'] = external_network_id
@@ -259,7 +272,7 @@
             ext_gw_info['enable_snat'] = enable_snat
         body = cls.client.create_router(
             router_name, external_gateway_info=ext_gw_info,
-            admin_state_up=admin_state_up)
+            admin_state_up=admin_state_up, **kwargs)
         router = body['router']
         cls.routers.append(router)
         return router
@@ -414,16 +427,22 @@
 class BaseAdminNetworkTest(BaseNetworkTest):
 
     @classmethod
-    def resource_setup(cls):
-        super(BaseAdminNetworkTest, cls).resource_setup()
-
-        try:
-            creds = cls.isolated_creds.get_admin_creds()
-            cls.os_adm = clients.Manager(credentials=creds)
-        except NotImplementedError:
+    def skip_checks(cls):
+        super(BaseAdminNetworkTest, cls).skip_checks()
+        if not credentials.is_admin_available():
             msg = ("Missing Administrative Network API credentials "
                    "in configuration.")
             raise cls.skipException(msg)
+
+    @classmethod
+    def setup_credentials(cls):
+        super(BaseAdminNetworkTest, cls).setup_credentials()
+        creds = cls.isolated_creds.get_admin_creds()
+        cls.os_adm = clients.Manager(credentials=creds)
+
+    @classmethod
+    def setup_clients(cls):
+        super(BaseAdminNetworkTest, cls).setup_clients()
         cls.admin_client = cls.os_adm.network_client
 
     @classmethod
diff --git a/tempest/api/network/base_routers.py b/tempest/api/network/base_routers.py
index 1b580b0..739e6f9 100644
--- a/tempest/api/network/base_routers.py
+++ b/tempest/api/network/base_routers.py
@@ -21,12 +21,21 @@
     # as some router operations, such as enabling or disabling SNAT
     # require admin credentials by default
 
-    @classmethod
-    def resource_setup(cls):
-        super(BaseRouterTest, cls).resource_setup()
+    def _cleanup_router(self, router):
+        self.delete_router(router)
+        self.routers.remove(router)
 
-    def _delete_router(self, router_id):
-        self.client.delete_router(router_id)
+    def _create_router(self, name, admin_state_up=False,
+                       external_network_id=None, enable_snat=None):
+        # associate a cleanup with created routers to avoid quota limits
+        router = self.create_router(name, admin_state_up,
+                                    external_network_id, enable_snat)
+        self.addCleanup(self._cleanup_router, router)
+        return router
+
+    def _delete_router(self, router_id, network_client=None):
+        client = network_client or self.client
+        client.delete_router(router_id)
         # Asserting that the router is not found in the list
         # after deletion
         list_body = self.client.list_routers()
diff --git a/tempest/api/network/base_security_groups.py b/tempest/api/network/base_security_groups.py
index c704049..6699bf7 100644
--- a/tempest/api/network/base_security_groups.py
+++ b/tempest/api/network/base_security_groups.py
@@ -20,10 +20,6 @@
 
 class BaseSecGroupTest(base.BaseNetworkTest):
 
-    @classmethod
-    def resource_setup(cls):
-        super(BaseSecGroupTest, cls).resource_setup()
-
     def _create_security_group(self):
         # Create a security group
         name = data_utils.rand_name('secgroup-')
diff --git a/tempest/api/network/test_allowed_address_pair.py b/tempest/api/network/test_allowed_address_pair.py
index 99bd82c..d2db326 100644
--- a/tempest/api/network/test_allowed_address_pair.py
+++ b/tempest/api/network/test_allowed_address_pair.py
@@ -23,7 +23,6 @@
 
 
 class AllowedAddressPairTestJSON(base.BaseNetworkTest):
-
     """
     Tests the Neutron Allowed Address Pair API extension using the Tempest
     ReST client. The following API operations are tested with this extension:
@@ -41,11 +40,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(AllowedAddressPairTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(AllowedAddressPairTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('allowed-address-pairs', 'network'):
             msg = "Allowed Address Pairs extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(AllowedAddressPairTestJSON, cls).resource_setup()
         cls.network = cls.create_network()
         cls.create_subnet(cls.network)
         port = cls.create_port(cls.network)
diff --git a/tempest/api/network/test_dhcp_ipv6.py b/tempest/api/network/test_dhcp_ipv6.py
index a10f749..253d779 100644
--- a/tempest/api/network/test_dhcp_ipv6.py
+++ b/tempest/api/network/test_dhcp_ipv6.py
@@ -41,6 +41,7 @@
 
     @classmethod
     def skip_checks(cls):
+        super(NetworksTestDHCPv6, cls).skip_checks()
         msg = None
         if not CONF.network_feature_enabled.ipv6:
             msg = "IPv6 is not enabled"
diff --git a/tempest/api/network/test_extensions.py b/tempest/api/network/test_extensions.py
index bce8efe..e9f1bf4 100644
--- a/tempest/api/network/test_extensions.py
+++ b/tempest/api/network/test_extensions.py
@@ -31,10 +31,6 @@
 
     """
 
-    @classmethod
-    def resource_setup(cls):
-        super(ExtensionsTestJSON, cls).resource_setup()
-
     @test.attr(type='smoke')
     @test.idempotent_id('ef28c7e6-e646-4979-9d67-deb207bc5564')
     def test_list_show_extensions(self):
diff --git a/tempest/api/network/test_extra_dhcp_options.py b/tempest/api/network/test_extra_dhcp_options.py
index 5060a48..1937028 100644
--- a/tempest/api/network/test_extra_dhcp_options.py
+++ b/tempest/api/network/test_extra_dhcp_options.py
@@ -20,7 +20,6 @@
 
 
 class ExtraDHCPOptionsTestJSON(base.BaseNetworkTest):
-
     """
     Tests the following operations with the Extra DHCP Options Neutron API
     extension:
@@ -36,11 +35,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(ExtraDHCPOptionsTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(ExtraDHCPOptionsTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('extra_dhcp_opt', 'network'):
             msg = "Extra DHCP Options extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(ExtraDHCPOptionsTestJSON, cls).resource_setup()
         cls.network = cls.create_network()
         cls.subnet = cls.create_subnet(cls.network)
         cls.port = cls.create_port(cls.network)
diff --git a/tempest/api/network/test_floating_ips.py b/tempest/api/network/test_floating_ips.py
index 212013a..23223f6 100644
--- a/tempest/api/network/test_floating_ips.py
+++ b/tempest/api/network/test_floating_ips.py
@@ -24,7 +24,6 @@
 
 
 class FloatingIPTestJSON(base.BaseNetworkTest):
-
     """
     Tests the following operations in the Quantum API using the REST client for
     Neutron:
@@ -45,11 +44,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(FloatingIPTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(FloatingIPTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('router', 'network'):
             msg = "router extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(FloatingIPTestJSON, cls).resource_setup()
         cls.ext_net_id = CONF.network.public_network_id
 
         # Create network, subnet, router and add interface
diff --git a/tempest/api/network/test_floating_ips_negative.py b/tempest/api/network/test_floating_ips_negative.py
index a7f806c..824034f 100644
--- a/tempest/api/network/test_floating_ips_negative.py
+++ b/tempest/api/network/test_floating_ips_negative.py
@@ -25,7 +25,6 @@
 
 
 class FloatingIPNegativeTestJSON(base.BaseNetworkTest):
-
     """
     Test the following negative  operations for floating ips:
 
@@ -35,11 +34,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(FloatingIPNegativeTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(FloatingIPNegativeTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('router', 'network'):
             msg = "router extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(FloatingIPNegativeTestJSON, cls).resource_setup()
         cls.ext_net_id = CONF.network.public_network_id
         # Create a network with a subnet connected to a router.
         cls.network = cls.create_network()
diff --git a/tempest/api/network/test_fwaas_extensions.py b/tempest/api/network/test_fwaas_extensions.py
index e2b6ff1..cecf96d 100644
--- a/tempest/api/network/test_fwaas_extensions.py
+++ b/tempest/api/network/test_fwaas_extensions.py
@@ -24,7 +24,6 @@
 
 
 class FWaaSExtensionTestJSON(base.BaseNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -51,11 +50,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(FWaaSExtensionTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(FWaaSExtensionTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('fwaas', 'network'):
             msg = "FWaaS Extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(FWaaSExtensionTestJSON, cls).resource_setup()
         cls.fw_rule = cls.create_firewall_rule("allow", "tcp")
         cls.fw_policy = cls.create_firewall_policy()
 
diff --git a/tempest/api/network/test_load_balancer.py b/tempest/api/network/test_load_balancer.py
index 583f91a..8bd0f24 100644
--- a/tempest/api/network/test_load_balancer.py
+++ b/tempest/api/network/test_load_balancer.py
@@ -21,7 +21,6 @@
 
 
 class LoadBalancerTestJSON(base.BaseNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -39,11 +38,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(LoadBalancerTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(LoadBalancerTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('lbaas', 'network'):
             msg = "lbaas extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(LoadBalancerTestJSON, cls).resource_setup()
         cls.network = cls.create_network()
         cls.name = cls.network['name']
         cls.subnet = cls.create_subnet(cls.network)
diff --git a/tempest/api/network/test_metering_extensions.py b/tempest/api/network/test_metering_extensions.py
index c712af2..7935e5b 100644
--- a/tempest/api/network/test_metering_extensions.py
+++ b/tempest/api/network/test_metering_extensions.py
@@ -23,7 +23,6 @@
 
 
 class MeteringTestJSON(base.BaseAdminNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -33,11 +32,15 @@
     """
 
     @classmethod
-    def resource_setup(cls):
-        super(MeteringTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(MeteringTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('metering', 'network'):
             msg = "metering extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(MeteringTestJSON, cls).resource_setup()
         description = "metering label created by tempest"
         name = data_utils.rand_name("metering-label")
         cls.metering_label = cls.create_metering_label(name, description)
diff --git a/tempest/api/network/test_networks.py b/tempest/api/network/test_networks.py
index 2e01a85..f85e8cf 100644
--- a/tempest/api/network/test_networks.py
+++ b/tempest/api/network/test_networks.py
@@ -27,7 +27,6 @@
 
 
 class NetworksTestJSON(base.BaseNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -417,7 +416,6 @@
 
 
 class BulkNetworkOpsTestJSON(base.BaseNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -604,11 +602,11 @@
 class NetworksIpV6TestAttrs(NetworksIpV6TestJSON):
 
     @classmethod
-    def resource_setup(cls):
+    def skip_checks(cls):
+        super(NetworksIpV6TestAttrs, cls).skip_checks()
         if not CONF.network_feature_enabled.ipv6_subnet_attributes:
             raise cls.skipException("IPv6 extended attributes for "
                                     "subnets not available")
-        super(NetworksIpV6TestAttrs, cls).resource_setup()
 
     @test.attr(type='smoke')
     @test.idempotent_id('da40cd1b-a833-4354-9a85-cd9b8a3b74ca')
diff --git a/tempest/api/network/test_ports.py b/tempest/api/network/test_ports.py
index 6fe955e..953b268 100644
--- a/tempest/api/network/test_ports.py
+++ b/tempest/api/network/test_ports.py
@@ -28,7 +28,6 @@
 
 
 class PortsTestJSON(sec_base.BaseSecGroupTest):
-
     """
     Test the following operations for ports:
 
@@ -315,13 +314,17 @@
 class PortsAdminExtendedAttrsTestJSON(base.BaseAdminNetworkTest):
 
     @classmethod
+    def setup_clients(cls):
+        super(PortsAdminExtendedAttrsTestJSON, cls).setup_clients()
+        cls.identity_client = cls.os_adm.identity_client
+
+    @classmethod
     def resource_setup(cls):
         super(PortsAdminExtendedAttrsTestJSON, cls).resource_setup()
-        cls.identity_client = cls._get_identity_admin_client()
-        cls.tenant = cls.identity_client.get_tenant_by_name(
-            CONF.identity.tenant_name)
         cls.network = cls.create_network()
         cls.host_id = socket.gethostname()
+        cls.tenant = cls.identity_client.get_tenant_by_name(
+            CONF.identity.tenant_name)
 
     @test.attr(type='smoke')
     @test.idempotent_id('8e8569c1-9ac7-44db-8bc1-f5fb2814f29b')
diff --git a/tempest/api/network/test_routers.py b/tempest/api/network/test_routers.py
index e9c9484..7c0ab7f 100644
--- a/tempest/api/network/test_routers.py
+++ b/tempest/api/network/test_routers.py
@@ -17,7 +17,6 @@
 from tempest_lib.common.utils import data_utils
 
 from tempest.api.network import base_routers as base
-from tempest import clients
 from tempest import config
 from tempest import test
 
@@ -27,29 +26,24 @@
 class RoutersTest(base.BaseRouterTest):
 
     @classmethod
-    def resource_setup(cls):
-        super(RoutersTest, cls).resource_setup()
+    def skip_checks(cls):
+        super(RoutersTest, cls).skip_checks()
         if not test.is_extension_enabled('router', 'network'):
             msg = "router extension not enabled."
             raise cls.skipException(msg)
-        admin_manager = clients.AdminManager()
-        cls.identity_admin_client = admin_manager.identity_client
+
+    @classmethod
+    def setup_clients(cls):
+        super(RoutersTest, cls).setup_clients()
+        cls.identity_admin_client = cls.os_adm.identity_client
+
+    @classmethod
+    def resource_setup(cls):
+        super(RoutersTest, cls).resource_setup()
         cls.tenant_cidr = (CONF.network.tenant_network_cidr
                            if cls._ip_version == 4 else
                            CONF.network.tenant_network_v6_cidr)
 
-    def _cleanup_router(self, router):
-        self.delete_router(router)
-        self.routers.remove(router)
-
-    def _create_router(self, name, admin_state_up=False,
-                       external_network_id=None, enable_snat=None):
-        # associate a cleanup with created routers to avoid quota limits
-        router = self.create_router(name, admin_state_up,
-                                    external_network_id, enable_snat)
-        self.addCleanup(self._cleanup_router, router)
-        return router
-
     @test.attr(type='smoke')
     @test.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c')
     def test_create_show_list_update_delete_router(self):
@@ -357,3 +351,37 @@
 
 class RoutersIpV6Test(RoutersTest):
     _ip_version = 6
+
+
+class DvrRoutersTest(base.BaseRouterTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(DvrRoutersTest, cls).skip_checks()
+        if not test.is_extension_enabled('dvr', 'network'):
+            msg = "DVR extension not enabled."
+            raise cls.skipException(msg)
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('141297aa-3424-455d-aa8d-f2d95731e00a')
+    def test_create_distributed_router(self):
+        name = data_utils.rand_name('router')
+        create_body = self.admin_client.create_router(
+            name, distributed=True)
+        self.addCleanup(self._delete_router,
+                        create_body['router']['id'],
+                        self.admin_client)
+        self.assertTrue(create_body['router']['distributed'])
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('644d7a4a-01a1-4b68-bb8d-0c0042cb1729')
+    def test_convert_centralized_router(self):
+        router = self._create_router(data_utils.rand_name('router'))
+        self.assertNotIn('distributed', router)
+        update_body = self.admin_client.update_router(router['id'],
+                                                      distributed=True)
+        self.assertTrue(update_body['router']['distributed'])
+        show_body = self.admin_client.show_router(router['id'])
+        self.assertTrue(show_body['router']['distributed'])
+        show_body = self.client.show_router(router['id'])
+        self.assertNotIn('distributed', show_body['router'])
diff --git a/tempest/api/network/test_routers_negative.py b/tempest/api/network/test_routers_negative.py
index 9e7d574..4149be3 100644
--- a/tempest/api/network/test_routers_negative.py
+++ b/tempest/api/network/test_routers_negative.py
@@ -27,11 +27,15 @@
 class RoutersNegativeTest(base.BaseRouterTest):
 
     @classmethod
-    def resource_setup(cls):
-        super(RoutersNegativeTest, cls).resource_setup()
+    def skip_checks(cls):
+        super(RoutersNegativeTest, cls).skip_checks()
         if not test.is_extension_enabled('router', 'network'):
             msg = "router extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(RoutersNegativeTest, cls).resource_setup()
         cls.router = cls.create_router(data_utils.rand_name('router-'))
         cls.network = cls.create_network()
         cls.subnet = cls.create_subnet(cls.network)
@@ -110,3 +114,28 @@
 
 class RoutersNegativeIpV6Test(RoutersNegativeTest):
     _ip_version = 6
+
+
+class DvrRoutersNegativeTest(base.BaseRouterTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(DvrRoutersNegativeTest, cls).skip_checks()
+        if not test.is_extension_enabled('dvr', 'network'):
+            msg = "DVR extension not enabled."
+            raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
+        super(DvrRoutersNegativeTest, cls).resource_setup()
+        cls.router = cls.create_router(data_utils.rand_name('router'))
+        cls.network = cls.create_network()
+        cls.subnet = cls.create_subnet(cls.network)
+
+    @test.attr(type=['negative', 'smoke'])
+    @test.idempotent_id('4990b055-8fc7-48ab-bba7-aa28beaad0b9')
+    def test_router_create_tenant_distributed_returns_forbidden(self):
+        self.assertRaises(lib_exc.Forbidden,
+                          self.create_router,
+                          data_utils.rand_name('router'),
+                          distributed=True)
diff --git a/tempest/api/network/test_security_groups.py b/tempest/api/network/test_security_groups.py
index 46dbeee..71e1beb 100644
--- a/tempest/api/network/test_security_groups.py
+++ b/tempest/api/network/test_security_groups.py
@@ -24,12 +24,11 @@
 
 
 class SecGroupTest(base.BaseSecGroupTest):
-
     _tenant_network_cidr = CONF.network.tenant_network_cidr
 
     @classmethod
-    def resource_setup(cls):
-        super(SecGroupTest, cls).resource_setup()
+    def skip_checks(cls):
+        super(SecGroupTest, cls).skip_checks()
         if not test.is_extension_enabled('security-group', 'network'):
             msg = "security-group extension not enabled."
             raise cls.skipException(msg)
diff --git a/tempest/api/network/test_security_groups_negative.py b/tempest/api/network/test_security_groups_negative.py
index 97c0592..0c5f017 100644
--- a/tempest/api/network/test_security_groups_negative.py
+++ b/tempest/api/network/test_security_groups_negative.py
@@ -25,12 +25,11 @@
 
 
 class NegativeSecGroupTest(base.BaseSecGroupTest):
-
     _tenant_network_cidr = CONF.network.tenant_network_cidr
 
     @classmethod
-    def resource_setup(cls):
-        super(NegativeSecGroupTest, cls).resource_setup()
+    def skip_checks(cls):
+        super(NegativeSecGroupTest, cls).skip_checks()
         if not test.is_extension_enabled('security-group', 'network'):
             msg = "security-group extension not enabled."
             raise cls.skipException(msg)
diff --git a/tempest/api/network/test_service_type_management.py b/tempest/api/network/test_service_type_management.py
index a1e4136..085ad73 100644
--- a/tempest/api/network/test_service_type_management.py
+++ b/tempest/api/network/test_service_type_management.py
@@ -19,8 +19,8 @@
 class ServiceTypeManagementTestJSON(base.BaseNetworkTest):
 
     @classmethod
-    def resource_setup(cls):
-        super(ServiceTypeManagementTestJSON, cls).resource_setup()
+    def skip_checks(cls):
+        super(ServiceTypeManagementTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('service-type', 'network'):
             msg = "Neutron Service Type Management not enabled."
             raise cls.skipException(msg)
diff --git a/tempest/api/network/test_vpnaas_extensions.py b/tempest/api/network/test_vpnaas_extensions.py
index ba30326..4ab69e0 100644
--- a/tempest/api/network/test_vpnaas_extensions.py
+++ b/tempest/api/network/test_vpnaas_extensions.py
@@ -24,7 +24,6 @@
 
 
 class VPNaaSTestJSON(base.BaseAdminNetworkTest):
-
     """
     Tests the following operations in the Neutron API using the REST client for
     Neutron:
@@ -34,10 +33,14 @@
     """
 
     @classmethod
-    def resource_setup(cls):
+    def skip_checks(cls):
+        super(VPNaaSTestJSON, cls).skip_checks()
         if not test.is_extension_enabled('vpnaas', 'network'):
             msg = "vpnaas extension not enabled."
             raise cls.skipException(msg)
+
+    @classmethod
+    def resource_setup(cls):
         super(VPNaaSTestJSON, cls).resource_setup()
         cls.ext_net_id = CONF.network.public_network_id
         cls.network = cls.create_network()
diff --git a/tempest/api_schema/response/compute/availability_zone.py b/tempest/api_schema/response/compute/availability_zone.py
deleted file mode 100644
index ab3e2ea..0000000
--- a/tempest/api_schema/response/compute/availability_zone.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2014 NEC Corporation.  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.
-
-# NOTE: This is the detail information for "get az detail" API.
-# The information is the same between v2 and v3 APIs.
-detail = {
-    'type': 'object',
-    'patternProperties': {
-        # NOTE: Here is for a hostname
-        '^[a-zA-Z0-9-_.]+$': {
-            'type': 'object',
-            'patternProperties': {
-                # NOTE: Here is for a service name
-                '^.*$': {
-                    'type': 'object',
-                    'properties': {
-                        'available': {'type': 'boolean'},
-                        'active': {'type': 'boolean'},
-                        'updated_at': {'type': ['string', 'null']}
-                    },
-                    'required': ['available', 'active', 'updated_at']
-                }
-            }
-        }
-    }
-}
diff --git a/tempest/api_schema/response/compute/v2_1/availability_zone.py b/tempest/api_schema/response/compute/v2_1/availability_zone.py
index e261d3d..5c1224e 100644
--- a/tempest/api_schema/response/compute/v2_1/availability_zone.py
+++ b/tempest/api_schema/response/compute/v2_1/availability_zone.py
@@ -14,8 +14,6 @@
 
 import copy
 
-from tempest.api_schema.response.compute import availability_zone as common
-
 
 base = {
     'status_code': [200],
@@ -47,8 +45,30 @@
     }
 }
 
-get_availability_zone_list = copy.deepcopy(base)
+detail = {
+    'type': 'object',
+    'patternProperties': {
+        # NOTE: Here is for a hostname
+        '^[a-zA-Z0-9-_.]+$': {
+            'type': 'object',
+            'patternProperties': {
+                # NOTE: Here is for a service name
+                '^.*$': {
+                    'type': 'object',
+                    'properties': {
+                        'available': {'type': 'boolean'},
+                        'active': {'type': 'boolean'},
+                        'updated_at': {'type': ['string', 'null']}
+                    },
+                    'required': ['available', 'active', 'updated_at']
+                }
+            }
+        }
+    }
+}
 
-get_availability_zone_list_detail = copy.deepcopy(base)
-get_availability_zone_list_detail['response_body']['properties'][
-    'availabilityZoneInfo']['items']['properties']['hosts'] = common.detail
+list_availability_zone_list = copy.deepcopy(base)
+
+list_availability_zone_list_detail = copy.deepcopy(base)
+list_availability_zone_list_detail['response_body']['properties'][
+    'availabilityZoneInfo']['items']['properties']['hosts'] = detail
diff --git a/tempest/common/accounts.py b/tempest/common/accounts.py
index 8e9a018..6d376d6 100644
--- a/tempest/common/accounts.py
+++ b/tempest/common/accounts.py
@@ -38,7 +38,8 @@
     def __init__(self, identity_version=None, name=None):
         super(Accounts, self).__init__(identity_version=identity_version,
                                        name=name)
-        if os.path.isfile(CONF.auth.test_accounts_file):
+        if (CONF.auth.test_accounts_file and
+                os.path.isfile(CONF.auth.test_accounts_file)):
             accounts = read_accounts_yaml(CONF.auth.test_accounts_file)
             self.use_default_creds = False
         else:
@@ -261,18 +262,14 @@
 
     def _unique_creds(self, cred_arg=None):
         """Verify that the configured credentials are valid and distinct """
-        if self.use_default_creds:
-            try:
-                user = self.get_primary_creds()
-                alt_user = self.get_alt_creds()
-                return getattr(user, cred_arg) != getattr(alt_user, cred_arg)
-            except exceptions.InvalidCredentials as ic:
-                msg = "At least one of the configured credentials is " \
-                      "not valid: %s" % ic.message
-                raise exceptions.InvalidConfiguration(msg)
-        else:
-            # TODO(andreaf) Add a uniqueness check here
-            return len(self.hash_dict['creds']) > 1
+        try:
+            user = self.get_primary_creds()
+            alt_user = self.get_alt_creds()
+            return getattr(user, cred_arg) != getattr(alt_user, cred_arg)
+        except exceptions.InvalidCredentials as ic:
+            msg = "At least one of the configured credentials is " \
+                  "not valid: %s" % ic.message
+            raise exceptions.InvalidConfiguration(msg)
 
     def is_multi_user(self):
         return self._unique_creds('username')
@@ -280,42 +277,20 @@
     def is_multi_tenant(self):
         return self._unique_creds('tenant_id')
 
-    def get_creds(self, id, roles=None):
-        try:
-            hashes = self._get_match_hash_list(roles)
-            # No need to sort the dict as within the same python process
-            # the HASH seed won't change, so subsequent calls to keys()
-            # will return the same result
-            _hash = hashes[id]
-        except IndexError:
-            msg = 'Insufficient number of users provided'
-            raise exceptions.InvalidConfiguration(msg)
-        return self.hash_dict['creds'][_hash]
-
     def get_primary_creds(self):
         if self.isolated_creds.get('primary'):
             return self.isolated_creds.get('primary')
-        if not self.use_default_creds:
-            creds = self.get_creds(0)
-            primary_credential = cred_provider.get_credentials(
-                identity_version=self.identity_version, **creds)
-        else:
-            primary_credential = cred_provider.get_configured_credentials(
-                credential_type='user', identity_version=self.identity_version)
+        primary_credential = cred_provider.get_configured_credentials(
+            credential_type='user', identity_version=self.identity_version)
         self.isolated_creds['primary'] = primary_credential
         return primary_credential
 
     def get_alt_creds(self):
         if self.isolated_creds.get('alt'):
             return self.isolated_creds.get('alt')
-        if not self.use_default_creds:
-            creds = self.get_creds(1)
-            alt_credential = cred_provider.get_credentials(
-                identity_version=self.identity_version, **creds)
-        else:
-            alt_credential = cred_provider.get_configured_credentials(
-                credential_type='alt_user',
-                identity_version=self.identity_version)
+        alt_credential = cred_provider.get_configured_credentials(
+            credential_type='alt_user',
+            identity_version=self.identity_version)
         self.isolated_creds['alt'] = alt_credential
         return alt_credential
 
@@ -323,35 +298,14 @@
         self.isolated_creds = {}
 
     def get_admin_creds(self):
-        if not self.use_default_creds:
-            return self.get_creds_by_roles([CONF.identity.admin_role])
-        else:
-            creds = cred_provider.get_configured_credentials(
-                "identity_admin", fill_in=False)
-            self.isolated_creds['admin'] = creds
-            return creds
+        creds = cred_provider.get_configured_credentials(
+            "identity_admin", fill_in=False)
+        self.isolated_creds['admin'] = creds
+        return creds
 
     def get_creds_by_roles(self, roles, force_new=False):
-        roles = list(set(roles))
-        exist_creds = self.isolated_creds.get(str(roles), None)
-        index = 0
-        if exist_creds and not force_new:
-            return exist_creds
-        elif exist_creds and force_new:
-            new_index = str(roles) + '-' + str(len(self.isolated_creds))
-            self.isolated_creds[new_index] = exist_creds
-            # Figure out how many existing creds for this roles set are present
-            # use this as the index the returning hash list to ensure separate
-            # creds are returned with force_new being True
-            for creds_names in self.isolated_creds:
-                if str(roles) in creds_names:
-                    index = index + 1
-        if not self.use_default_creds:
-            creds = self.get_creds(index, roles=roles)
-            role_credential = cred_provider.get_credentials(**creds)
-            self.isolated_creds[str(roles)] = role_credential
-        else:
-            msg = "Default credentials can not be used with specifying "\
-                  "credentials by roles"
-            raise exceptions.InvalidConfiguration(msg)
-        return role_credential
+        msg = "Credentials being specified through the config file can not be"\
+              " used with tests that specify using credentials by roles. "\
+              "Either exclude/skip the tests doing this or use either an "\
+              "test_accounts_file or tenant isolation."
+        raise exceptions.InvalidConfiguration(msg)
diff --git a/tempest/common/credentials.py b/tempest/common/credentials.py
index 1ca0128..c34df48 100644
--- a/tempest/common/credentials.py
+++ b/tempest/common/credentials.py
@@ -38,7 +38,8 @@
             network_resources=network_resources,
             identity_version=identity_version)
     else:
-        if CONF.auth.locking_credentials_provider:
+        if (CONF.auth.test_accounts_file and
+                os.path.isfile(CONF.auth.test_accounts_file)):
             # Most params are not relevant for pre-created accounts
             return accounts.Accounts(name=name,
                                      identity_version=identity_version)
@@ -56,7 +57,8 @@
     if CONF.auth.allow_tenant_isolation:
         return is_admin
     # Check whether test accounts file has the admin specified or not
-    elif os.path.isfile(CONF.auth.test_accounts_file):
+    elif (CONF.auth.test_accounts_file and
+            os.path.isfile(CONF.auth.test_accounts_file)):
         check_accounts = accounts.Accounts(name='check_admin')
         if not check_accounts.admin_available():
             is_admin = False
diff --git a/tempest/common/fixed_network.py b/tempest/common/fixed_network.py
index 83822c2..b06ddf2 100644
--- a/tempest/common/fixed_network.py
+++ b/tempest/common/fixed_network.py
@@ -16,6 +16,7 @@
 from tempest_lib import exceptions as lib_exc
 
 from tempest import config
+from tempest import exceptions
 
 CONF = config.CONF
 
@@ -34,6 +35,7 @@
     :return a dict with 'id' and 'name' of the network
     """
     fixed_network_name = CONF.compute.fixed_network_name
+    network = None
     # NOTE(andreaf) get_primary_network will always be available once
     # bp test-accounts-continued is implemented
     if (CONF.auth.allow_tenant_isolation and
@@ -51,7 +53,11 @@
                     networks = resp['networks']
                 else:
                     raise lib_exc.NotFound()
-                network = networks[0]
+                if len(networks) > 0:
+                    network = networks[0]
+                else:
+                    msg = "Configured fixed_network_name not found"
+                    raise exceptions.InvalidConfiguration(msg)
                 # To be consistent with network isolation, add name is only
                 # label is available
                 network['name'] = network.get('name', network.get('label'))
diff --git a/tempest/config.py b/tempest/config.py
index 4ee4669..9577f2d 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -35,9 +35,14 @@
 
 AuthGroup = [
     cfg.StrOpt('test_accounts_file',
-               default='etc/accounts.yaml',
                help="Path to the yaml file that contains the list of "
-                    "credentials to use for running tests"),
+                    "credentials to use for running tests. If used when "
+                    "running in parallel you have to make sure sufficient "
+                    "credentials are provided in the accounts file. For "
+                    "example if no tests with roles are being run it requires "
+                    "at least `2 * CONC` distinct accounts configured in "
+                    " the `test_accounts_file`, with CONC == the "
+                    "number of concurrent test processes."),
     cfg.BoolOpt('allow_tenant_isolation',
                 default=True,
                 help="Allows test cases to create/destroy tenants and "
@@ -49,15 +54,6 @@
                                                    group='compute'),
                                  cfg.DeprecatedOpt('allow_tenant_isolation',
                                                    group='orchestration')]),
-    cfg.BoolOpt('locking_credentials_provider',
-                default=False,
-                help="If set to True it enables the Accounts provider, "
-                     "which locks credentials to allow for parallel execution "
-                     "with pre-provisioned accounts. It can only be used to "
-                     "run tests that ensure credentials cleanup happens. "
-                     "It requires at least `2 * CONC` distinct accounts "
-                     "configured in `test_accounts_file`, with CONC == the "
-                     "number of concurrent test processes."),
     cfg.ListOpt('tempest_roles',
                 help="Roles to assign to all users created by tempest",
                 default=[]),
@@ -232,9 +228,11 @@
                help="Timeout in seconds to wait for output from ssh "
                     "channel."),
     cfg.StrOpt('fixed_network_name',
-               default='private',
                help="Name of the fixed network that is visible to all test "
-                    "tenants."),
+                    "tenants. If multiple networks are available for a tenant"
+                    " this is the network which will be used for creating "
+                    "servers if tempest does not create a network or a "
+                    "network is not specified elsewhere"),
     cfg.StrOpt('network_for_ssh',
                default='public',
                help="Network used for SSH connections. Ignored if "
@@ -325,7 +323,8 @@
     cfg.BoolOpt('block_migrate_cinder_iscsi',
                 default=False,
                 help="Does the test environment block migration support "
-                     "cinder iSCSI volumes"),
+                "cinder iSCSI volumes. Note, libvirt doesn't support this, "
+                "see https://bugs.launchpad.net/nova/+bug/1398999"),
     cfg.BoolOpt('vnc_console',
                 default=False,
                 help='Enable VNC console. This configuration value should '
diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py
index 3e259b0..8fa2df5 100644
--- a/tempest/scenario/test_volume_boot_pattern.py
+++ b/tempest/scenario/test_volume_boot_pattern.py
@@ -12,7 +12,6 @@
 
 from oslo_log import log
 from tempest_lib.common.utils import data_utils
-from tempest_lib import decorators
 
 from tempest import config
 from tempest.scenario import manager
@@ -132,7 +131,6 @@
         actual = self._get_content(ssh_client)
         self.assertEqual(expected, actual)
 
-    @decorators.skip_because(bug='1373513')
     @test.idempotent_id('557cd2c2-4eb8-4dce-98be-f86765ff311b')
     @test.services('compute', 'volume', 'image')
     def test_volume_boot_pattern(self):
@@ -176,7 +174,6 @@
         # NOTE(gfidente): ensure resources are in clean state for
         # deletion operations to succeed
         self._stop_instances([instance_2nd, instance_from_snapshot])
-        self._detach_volumes([volume_origin, volume])
 
 
 class TestVolumeBootPatternV2(TestVolumeBootPattern):
diff --git a/tempest/services/compute/json/availability_zone_client.py b/tempest/services/compute/json/availability_zone_client.py
index b541a2c..6c50398 100644
--- a/tempest/services/compute/json/availability_zone_client.py
+++ b/tempest/services/compute/json/availability_zone_client.py
@@ -25,14 +25,14 @@
     def get_availability_zone_list(self):
         resp, body = self.get('os-availability-zone')
         body = json.loads(body)
-        self.validate_response(schema.get_availability_zone_list, resp, body)
+        self.validate_response(schema.list_availability_zone_list, resp, body)
         return service_client.ResponseBodyList(resp,
                                                body['availabilityZoneInfo'])
 
     def get_availability_zone_list_detail(self):
         resp, body = self.get('os-availability-zone/detail')
         body = json.loads(body)
-        self.validate_response(schema.get_availability_zone_list_detail, resp,
+        self.validate_response(schema.list_availability_zone_list_detail, resp,
                                body)
         return service_client.ResponseBodyList(resp,
                                                body['availabilityZoneInfo'])
diff --git a/tempest/stress/driver.py b/tempest/stress/driver.py
index e84d627..62e60d6 100644
--- a/tempest/stress/driver.py
+++ b/tempest/stress/driver.py
@@ -23,7 +23,7 @@
 from tempest_lib.common.utils import data_utils
 
 from tempest import clients
-from tempest.common import cred_provider
+from tempest.common import isolated_creds
 from tempest.common import ssh
 from tempest import config
 from tempest import exceptions
@@ -149,15 +149,22 @@
                 username = data_utils.rand_name("stress_user")
                 tenant_name = data_utils.rand_name("stress_tenant")
                 password = "pass"
-                identity_client = admin_manager.identity_client
-                tenant = identity_client.create_tenant(name=tenant_name)
-                identity_client.create_user(username,
-                                            password,
-                                            tenant['id'],
-                                            "email")
-                creds = cred_provider.get_credentials(username=username,
-                                                      password=password,
-                                                      tenant_name=tenant_name)
+                if CONF.identity.auth_version == 'v2':
+                    identity_client = admin_manager.identity_client
+                else:
+                    identity_client = admin_manager.identity_v3_client
+                credentials_client = isolated_creds.get_creds_client(
+                    identity_client)
+                project = credentials_client.create_project(
+                    name=tenant_name, description=tenant_name)
+                user = credentials_client.create_user(username, password,
+                                                      project['id'], "email")
+                # Add roles specified in config file
+                for conf_role in CONF.auth.tempest_roles:
+                    credentials_client.assign_user_role(user, project,
+                                                        conf_role)
+                creds = credentials_client.get_credentials(user, project,
+                                                           password)
                 manager = clients.Manager(credentials=creds)
 
             test_obj = importutils.import_class(test['action'])
diff --git a/tempest/tests/common/test_accounts.py b/tempest/tests/common/test_accounts.py
index 2a98a06..6371e49 100644
--- a/tempest/tests/common/test_accounts.py
+++ b/tempest/tests/common/test_accounts.py
@@ -67,7 +67,7 @@
         self.useFixture(mockpatch.Patch(
             'tempest.common.accounts.read_accounts_yaml',
             return_value=self.test_accounts))
-        cfg.CONF.set_default('test_accounts_file', '', group='auth')
+        cfg.CONF.set_default('test_accounts_file', 'fake_path', group='auth')
         self.useFixture(mockpatch.Patch('os.path.isfile', return_value=True))
 
     def _get_hash_list(self, accounts_list):
@@ -297,12 +297,8 @@
         cfg.CONF.set_default('test_accounts_file', '', group='auth')
         self.useFixture(mockpatch.Patch('os.path.isfile', return_value=True))
 
-    def test_get_creds(self):
+    def test_get_creds_roles_nonlocking_invalid(self):
         test_accounts_class = accounts.NotLockingAccounts('v2', 'test_name')
-        for i in xrange(len(self.test_accounts)):
-            creds = test_accounts_class.get_creds(i)
-            msg = "Empty credentials returned for ID %s" % str(i)
-            self.assertIsNotNone(creds, msg)
         self.assertRaises(exceptions.InvalidConfiguration,
-                          test_accounts_class.get_creds,
-                          id=len(self.test_accounts))
+                          test_accounts_class.get_creds_by_roles,
+                          ['fake_role'])
diff --git a/tempest/tests/common/test_admin_available.py b/tempest/tests/common/test_admin_available.py
new file mode 100644
index 0000000..4e3aa4c
--- /dev/null
+++ b/tempest/tests/common/test_admin_available.py
@@ -0,0 +1,104 @@
+# Copyright 2015 Red Hat, Inc.
+#
+#    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.config import cfg
+from oslotest import mockpatch
+
+from tempest.common import credentials
+from tempest import config
+from tempest.tests import base
+from tempest.tests import fake_config
+
+
+class TestAdminAvailable(base.TestCase):
+
+    def setUp(self):
+        super(TestAdminAvailable, self).setUp()
+        self.useFixture(fake_config.ConfigFixture())
+        self.stubs.Set(config, 'TempestConfigPrivate', fake_config.FakePrivate)
+
+    def run_test(self, tenant_isolation, use_accounts_file, admin_creds):
+
+        cfg.CONF.set_default('allow_tenant_isolation',
+                             tenant_isolation, group='auth')
+        if use_accounts_file:
+            accounts = [{'username': 'u1',
+                         'tenant_name': 't1',
+                         'password': 'p'},
+                        {'username': 'u2',
+                         'tenant_name': 't2',
+                         'password': 'p'}]
+            if admin_creds == 'role':
+                accounts.append({'username': 'admin',
+                                 'tenant_name': 'admin',
+                                 'password': 'p',
+                                 'roles': ['admin']})
+            elif admin_creds == 'type':
+                accounts.append({'username': 'admin',
+                                 'tenant_name': 'admin',
+                                 'password': 'p',
+                                 'types': ['admin']})
+            self.useFixture(mockpatch.Patch(
+                'tempest.common.accounts.read_accounts_yaml',
+                return_value=accounts))
+            cfg.CONF.set_default('test_accounts_file',
+                                 use_accounts_file, group='auth')
+            self.useFixture(mockpatch.Patch('os.path.isfile',
+                                            return_value=True))
+        else:
+            self.useFixture(mockpatch.Patch('os.path.isfile',
+                                            return_value=False))
+            if admin_creds:
+                (u, t, p) = ('u', 't', 'p')
+            else:
+                (u, t, p) = (None, None, None)
+
+            cfg.CONF.set_default('admin_username', u, group='identity')
+            cfg.CONF.set_default('admin_tenant_name', t, group='identity')
+            cfg.CONF.set_default('admin_password', p, group='identity')
+
+        expected = admin_creds is not None or tenant_isolation
+        observed = credentials.is_admin_available()
+        self.assertEqual(expected, observed)
+
+    # Tenant isolation implies admin so only one test case for True
+    def test__tenant_isolation__accounts_file__no_admin(self):
+        self.run_test(tenant_isolation=True,
+                      use_accounts_file=True,
+                      admin_creds=None)
+
+    def test__no_tenant_isolation__accounts_file__no_admin(self):
+        self.run_test(tenant_isolation=False,
+                      use_accounts_file=True,
+                      admin_creds=None)
+
+    def test__no_tenant_isolation__accounts_file__admin_role(self):
+        self.run_test(tenant_isolation=False,
+                      use_accounts_file=True,
+                      admin_creds='role')
+
+    def test__no_tenant_isolation__accounts_file__admin_type(self):
+        self.run_test(tenant_isolation=False,
+                      use_accounts_file=True,
+                      admin_creds='type')
+
+    def test__no_tenant_isolation__no_accounts_file__no_admin(self):
+        self.run_test(tenant_isolation=False,
+                      use_accounts_file=False,
+                      admin_creds=None)
+
+    def test__no_tenant_isolation__no_accounts_file__admin(self):
+        self.run_test(tenant_isolation=False,
+                      use_accounts_file=False,
+                      admin_creds='role')