Merge "mke2fs: do not use full path"
diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst
index 2e5f706..36828e0 100644
--- a/doc/source/configuration.rst
+++ b/doc/source/configuration.rst
@@ -108,12 +108,12 @@
 insufficient for certain use cases because of the admin credentials requirement
 to create the credential sets on demand. To get around that the accounts.yaml
 file was introduced and with that a new internal credential provider to enable
-using the list of credentials instead of creating them on demand. With locking
-test accounts each test class will reserve a set of credentials from the
-accounts.yaml before executing any of its tests so that each class is isolated
-like with dynamic credentials.
+using the list of credentials instead of creating them on demand. With
+pre-provisioned credentials (also known as locking test accounts) each test
+class will reserve a set of credentials from the accounts.yaml before executing
+any of its tests so that each class is isolated like with dynamic credentials.
 
-To enable and use locking test accounts you need do a few things:
+To enable and use pre-provisioned credentials you need do a few things:
 
 #. Create an accounts.yaml file which contains the set of pre-existing
    credentials to use for testing. To make sure you don't have a credentials
diff --git a/releasenotes/notes/add-show-api-v3-details-api-to-v3-versions-client-4b408427379cabfe.yaml b/releasenotes/notes/add-show-api-v3-details-api-to-v3-versions-client-4b408427379cabfe.yaml
new file mode 100644
index 0000000..50f10fa
--- /dev/null
+++ b/releasenotes/notes/add-show-api-v3-details-api-to-v3-versions-client-4b408427379cabfe.yaml
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    Add show api version details function to v3
+    versions_client library for cinder.
+
+    * show_version
\ No newline at end of file
diff --git a/releasenotes/notes/deprecate-vnc-server-header-529f07d592aefb62.yaml b/releasenotes/notes/deprecate-vnc-server-header-529f07d592aefb62.yaml
new file mode 100644
index 0000000..d7e144d
--- /dev/null
+++ b/releasenotes/notes/deprecate-vnc-server-header-529f07d592aefb62.yaml
@@ -0,0 +1,12 @@
+---
+deprecations:
+  - |
+    The config option ``CONF.compute.vnc_server_header`` is deprecated because
+    it has become obsolete with the usage of different response header fields
+    to accomplish the same goal in accordance with RFC7231 Section 6.2.2.
+
+fixes:
+  - |
+    Adequately validates WebSocket upgrade in test_novnc and removes unneeded
+    configuration complexity. Closes bug #1838777 and #1840788.
+
diff --git a/tempest/api/compute/images/test_images.py b/tempest/api/compute/images/test_images.py
index c8221c2..7cf26fb 100644
--- a/tempest/api/compute/images/test_images.py
+++ b/tempest/api/compute/images/test_images.py
@@ -47,6 +47,10 @@
     def test_delete_saving_image(self):
         server = self.create_test_server(wait_until='ACTIVE')
         self.addCleanup(self.servers_client.delete_server, server['id'])
+        # wait for server active to avoid conflict when deleting server
+        # in task_state image_snapshot
+        self.addCleanup(waiters.wait_for_server_status, self.servers_client,
+                        server['id'], 'ACTIVE')
         image = self.create_image_from_server(server['id'],
                                               wait_until='SAVING')
         self.client.delete_image(image['id'])
diff --git a/tempest/api/compute/images/test_images_oneserver.py b/tempest/api/compute/images/test_images_oneserver.py
index 3c152c9..b811421 100644
--- a/tempest/api/compute/images/test_images_oneserver.py
+++ b/tempest/api/compute/images/test_images_oneserver.py
@@ -15,7 +15,6 @@
 
 from tempest.api.compute import base
 from tempest import config
-from tempest.lib.common import api_version_utils
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
 
@@ -101,11 +100,5 @@
         # will return 400(Bad Request) if we attempt to send a name which has
         # 4 byte utf-8 character.
         utf8_name = data_utils.rand_name(b'\xe2\x82\xa1'.decode('utf-8'))
-        body = self.compute_images_client.create_image(
-            self.server_id, name=utf8_name)
-        if api_version_utils.compare_version_header_to_response(
-            "OpenStack-API-Version", "compute 2.45", body.response, "lt"):
-            image_id = body['image_id']
-        else:
-            image_id = data_utils.parse_image_id(body.response['location'])
-        self.addCleanup(self.client.delete_image, image_id)
+        self.create_image_from_server(self.server_id, name=utf8_name,
+                                      wait_until='ACTIVE')
diff --git a/tempest/api/compute/servers/test_attach_interfaces.py b/tempest/api/compute/servers/test_attach_interfaces.py
index 3789aa0..6a2af71 100644
--- a/tempest/api/compute/servers/test_attach_interfaces.py
+++ b/tempest/api/compute/servers/test_attach_interfaces.py
@@ -24,6 +24,7 @@
 from tempest.common.utils import net_utils
 from tempest.common import waiters
 from tempest import config
+from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils.linux import remote_client
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
@@ -150,7 +151,9 @@
 
     def _test_create_interface_by_port_id(self, server, ifs):
         network_id = ifs[0]['net_id']
-        port = self.ports_client.create_port(network_id=network_id)
+        port = self.ports_client.create_port(
+            network_id=network_id,
+            name=data_utils.rand_name(self.__class__.__name__))
         port_id = port['port']['id']
         self.addCleanup(self.ports_client.delete_port, port_id)
         iface = self.interfaces_client.create_interface(
@@ -291,7 +294,9 @@
         """
         network = self.get_tenant_network()
         network_id = network['id']
-        port = self.ports_client.create_port(network_id=network_id)
+        port = self.ports_client.create_port(
+            network_id=network_id,
+            name=data_utils.rand_name(self.__class__.__name__))
         port_id = port['port']['id']
         self.addCleanup(self.ports_client.delete_port, port_id)
 
diff --git a/tempest/api/compute/servers/test_device_tagging.py b/tempest/api/compute/servers/test_device_tagging.py
index e817587..4ee243e 100644
--- a/tempest/api/compute/servers/test_device_tagging.py
+++ b/tempest/api/compute/servers/test_device_tagging.py
@@ -175,11 +175,13 @@
         # Create ports
         self.port1 = self.ports_client.create_port(
             network_id=net1['id'],
+            name=data_utils.rand_name(self.__class__.__name__),
             fixed_ips=[{'subnet_id': subnet1['id']}])['port']
         self.addCleanup(self.ports_client.delete_port, self.port1['id'])
 
         self.port2 = self.ports_client.create_port(
             network_id=net1['id'],
+            name=data_utils.rand_name(self.__class__.__name__),
             fixed_ips=[{'subnet_id': subnet1['id']}])['port']
         self.addCleanup(self.ports_client.delete_port, self.port2['id'])
 
diff --git a/tempest/api/compute/servers/test_novnc.py b/tempest/api/compute/servers/test_novnc.py
index 50ffb21..7cf6d83 100644
--- a/tempest/api/compute/servers/test_novnc.py
+++ b/tempest/api/compute/servers/test_novnc.py
@@ -156,22 +156,24 @@
                                                        data[20:24])[0] + 24))
 
     def _validate_websocket_upgrade(self):
+        """Verify that the websocket upgrade was successful.
+
+        Parses response and ensures that required response
+        fields are present and accurate.
+        (https://tools.ietf.org/html/rfc7231#section-6.2.2)
+        """
+
         self.assertTrue(
             self._websocket.response.startswith(b'HTTP/1.1 101 Switching '
-                                                b'Protocols\r\n'),
-            'Did not get the expected 101 on the {} call: {}'.format(
-                CONF.compute_feature_enabled.vnc_server_header,
+                                                b'Protocols'),
+            'Incorrect HTTP return status code: {}'.format(
                 six.text_type(self._websocket.response)
             )
         )
-        # Since every other server type returns Headers with different case
-        # (for example 'nginx'), lowercase must be applied to eliminate issues.
-        _desired_header = "server: {0}".format(
-            CONF.compute_feature_enabled.vnc_server_header
-        ).lower()
+        _required_header = 'upgrade: websocket'
         _response = six.text_type(self._websocket.response).lower()
         self.assertIn(
-            _desired_header,
+            _required_header,
             _response,
             'Did not get the expected WebSocket HTTP Response.'
         )
diff --git a/tempest/api/compute/servers/test_servers.py b/tempest/api/compute/servers/test_servers.py
index 76d65dd..1e3e966 100644
--- a/tempest/api/compute/servers/test_servers.py
+++ b/tempest/api/compute/servers/test_servers.py
@@ -209,7 +209,8 @@
                                        server['id'], 'ACTIVE')
 
         # Check rebuild API response schema
-        self.servers_client.rebuild_server(server['id'], self.image_ref_alt)
+        self.servers_client.rebuild_server(
+            server['id'], CONF.compute.certified_image_ref)
         waiters.wait_for_server_status(self.servers_client,
                                        server['id'], 'ACTIVE')
 
diff --git a/tempest/api/identity/admin/v3/test_list_projects.py b/tempest/api/identity/admin/v3/test_list_projects.py
index 299a618..cb8ea11 100644
--- a/tempest/api/identity/admin/v3/test_list_projects.py
+++ b/tempest/api/identity/admin/v3/test_list_projects.py
@@ -44,29 +44,24 @@
     @classmethod
     def resource_setup(cls):
         super(ListProjectsTestJSON, cls).resource_setup()
-        cls.project_ids = list()
-        cls.domain_id = cls.os_admin.credentials.domain_id
+        domain_id = cls.os_admin.credentials.domain_id
         # Create project with domain
-        cls.p1_name = data_utils.rand_name('project')
+        p1_name = data_utils.rand_name(cls.__name__)
         cls.p1 = cls.projects_client.create_project(
-            cls.p1_name, enabled=False,
-            domain_id=cls.domain_id)['project']
+            p1_name, enabled=False, domain_id=domain_id)['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
                                     cls.p1['id'])
-        cls.project_ids.append(cls.p1['id'])
         # Create default project
-        p2_name = data_utils.rand_name('project')
+        p2_name = data_utils.rand_name(cls.__name__)
         cls.p2 = cls.projects_client.create_project(p2_name)['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
                                     cls.p2['id'])
-        cls.project_ids.append(cls.p2['id'])
         # Create a new project (p3) using p2 as parent project
-        p3_name = data_utils.rand_name('project')
+        p3_name = data_utils.rand_name(cls.__name__)
         cls.p3 = cls.projects_client.create_project(
             p3_name, parent_id=cls.p2['id'])['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
                                     cls.p3['id'])
-        cls.project_ids.append(cls.p3['id'])
 
     @decorators.idempotent_id('0fe7a334-675a-4509-b00e-1c4b95d5dae8')
     def test_list_projects_with_enabled(self):
@@ -94,40 +89,43 @@
     @classmethod
     def resource_setup(cls):
         super(ListProjectsStaticTestJSON, cls).resource_setup()
-        cls.domain_id = CONF.identity.default_domain_id
-        cls.project_ids = list()
-        cls.p1_name = cls.os_primary.credentials.project_name
+        # Fetch an existing project from os_primary
         cls.p1 = cls.projects_client.show_project(
             cls.os_primary.credentials.project_id)['project']
-        cls.project_ids.append(cls.p1['id'])
-        p2_name = data_utils.rand_name('project')
+        # Create a test project
+        p2_name = data_utils.rand_name(cls.__name__)
+        p2_domain_id = CONF.identity.default_domain_id
         cls.p2 = cls.projects_client.create_project(
-            p2_name, domain_id=cls.domain_id)['project']
+            p2_name, domain_id=p2_domain_id)['project']
         cls.addClassResourceCleanup(cls.projects_client.delete_project,
                                     cls.p2['id'])
-        cls.project_ids.append(cls.p2['id'])
 
     @decorators.idempotent_id('1d830662-22ad-427c-8c3e-4ec854b0af44')
     def test_list_projects(self):
         # List projects
         list_projects = self.projects_client.list_projects()['projects']
 
-        for p in self.project_ids:
-            show_project = self.projects_client.show_project(p)['project']
+        for p in [self.p1, self.p2]:
+            show_project = self.projects_client.show_project(p['id'])[
+                'project']
             self.assertIn(show_project, list_projects)
 
     @decorators.idempotent_id('fa178524-4e6d-4925-907c-7ab9f42c7e26')
     def test_list_projects_with_name(self):
         # List projects with name
         self._list_projects_with_params(
-            [self.p1], [self.p2], {'name': self.p1_name}, 'name')
+            [self.p1], [self.p2], {'name': self.p1['name']}, 'name')
 
     @decorators.idempotent_id('fab13f3c-f6a6-4b9f-829b-d32fd44fdf10')
     def test_list_projects_with_domains(self):
-        # List projects with domain
+        # Verify project list filtered by domain
         key = 'domain_id'
-        params = {key: self.domain_id}
-        # Verify both projects are in the self.domain_id which is the default
-        # domain
-        self._list_projects_with_params(
-            [self.p1, self.p2], [], params, key)
+        for p in [self.p1, self.p2]:
+            params = {key: p[key]}
+            # Verify filter shows both projects in their respective domains
+            self._list_projects_with_params([p], [], params, key)
+        # Verify filter excludes projects that are filtered out
+        if self.p1[key] != self.p2[key]:
+            exclude = [self.p2]
+            params = {key: self.p1[key]}
+            self._list_projects_with_params([self.p1], exclude, params, key)
diff --git a/tempest/api/identity/v3/test_api_discovery.py b/tempest/api/identity/v3/test_api_discovery.py
index c04c21b..e87d1cd 100644
--- a/tempest/api/identity/v3/test_api_discovery.py
+++ b/tempest/api/identity/v3/test_api_discovery.py
@@ -14,12 +14,24 @@
 #    under the License.
 
 from tempest.api.identity import base
+from tempest import config
 from tempest.lib import decorators
 
 
+CONF = config.CONF
+
+
 class TestApiDiscovery(base.BaseIdentityV3Test):
     """Tests for API discovery features."""
 
+    @decorators.idempotent_id('79aec9ae-710f-4c54-a4fc-3aa25b4feac3')
+    def test_identity_v3_existence(self):
+        versions = self.non_admin_versions_client.list_versions()
+        found = any(
+            "v3" in version.get('id')
+            for version in versions['versions']['values'])
+        self.assertEqual(CONF.identity_feature_enabled.api_v3, found)
+
     @decorators.idempotent_id('721f480f-35b6-46c7-846e-047e6acea0dc')
     @decorators.attr(type='smoke')
     def test_list_api_versions(self):
diff --git a/tempest/api/identity/v3/test_tokens.py b/tempest/api/identity/v3/test_tokens.py
index f13aa10..fa1c47f 100644
--- a/tempest/api/identity/v3/test_tokens.py
+++ b/tempest/api/identity/v3/test_tokens.py
@@ -43,7 +43,15 @@
         self.assertEqual(authenticated_token, token_body)
         # test to see if token has been properly authenticated
         self.assertEqual(authenticated_token['user']['id'], user_id)
-        self.assertEqual(authenticated_token['user']['name'], username)
+        # NOTE: resource name that are case-sensitive in keystone
+        # depends on backends such as MySQL or LDAP which are
+        # case-insensitive, case-preserving. Resource name is
+        # returned as it is stored in the backend, not as it is
+        # requested. Verifying the username with both lower-case to
+        # avoid failure on different backends
+        self.assertEqual(
+            authenticated_token['user']['name'].lower(), username.lower())
+
         self.non_admin_client.delete_token(subject_token)
         self.assertRaises(
             lib_exc.NotFound, self.non_admin_client.show_token, subject_token)
@@ -84,10 +92,17 @@
             self.assertIsNotNone(subject_id, 'Expected user ID in token.')
 
         subject_name = resp['user']['name']
+
         if username:
-            self.assertEqual(subject_name, username)
+            # NOTE: resource name that are case-sensitive in keystone
+            # depends on backends such as MySQL or LDAP which are
+            # case-insensitive, case-preserving. Resource name is
+            # returned as it is stored in the backend, not as it is
+            # requested. Verifying the username with both lower-case to
+            # avoid failure on different backends
+            self.assertEqual(subject_name.lower(), username.lower())
         else:
-            # Expect a user name, but don't know what it will be.
+            # Expect a user name, but don't know what it will be
             self.assertIsNotNone(subject_name, 'Expected user name in token.')
 
         self.assertEqual(resp['methods'][0], 'password')
@@ -110,7 +125,15 @@
             subject_token)['token']
         self.assertEqual(resp['x-subject-token'], subject_token)
         self.assertEqual(token_details['user']['id'], user.user_id)
-        self.assertEqual(token_details['user']['name'], user.username)
+        # NOTE: resource name that are case-sensitive in keystone
+        # depends on backends such as MySQL or LDAP which are
+        # case-insensitive, case-preserving. Resource name is
+        # returned as it is stored in the backend, not as it is
+        # requested. Verifying the username with both lower-case to
+        # avoid failure on different backends
+        self.assertEqual(
+            token_details['user']['name'].lower(),
+            user.username.lower())
         # Perform Delete Token
         self.non_admin_client.delete_token(subject_token)
         self.assertRaises(lib_exc.NotFound,
diff --git a/tempest/api/network/admin/test_external_networks_negative.py b/tempest/api/network/admin/test_external_networks_negative.py
index 0709d2a..da32f2d 100644
--- a/tempest/api/network/admin/test_external_networks_negative.py
+++ b/tempest/api/network/admin/test_external_networks_negative.py
@@ -16,6 +16,7 @@
 
 from tempest.api.network import base
 from tempest import config
+from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
@@ -50,5 +51,6 @@
         # create a port which will internally create an instance-ip
         self.assertRaises(lib_exc.Conflict,
                           self.admin_ports_client.create_port,
+                          name=data_utils.rand_name(self.__class__.__name__),
                           network_id=CONF.network.public_network_id,
                           fixed_ips=fixed_ips)
diff --git a/tempest/api/network/admin/test_ports.py b/tempest/api/network/admin/test_ports.py
index edfda6e..289e577 100644
--- a/tempest/api/network/admin/test_ports.py
+++ b/tempest/api/network/admin/test_ports.py
@@ -14,9 +14,14 @@
 #    under the License.
 
 from tempest.api.network import base
+from tempest.common import utils
+from tempest import config
+from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
+CONF = config.CONF
+
 
 class PortsAdminExtendedAttrsTestJSON(base.BaseAdminNetworkTest):
 
@@ -29,13 +34,16 @@
     def resource_setup(cls):
         super(PortsAdminExtendedAttrsTestJSON, cls).resource_setup()
         cls.network = cls.create_network()
-        hyper_list = cls.hyper_client.list_hypervisors()
-        cls.host_id = hyper_list['hypervisors'][0]['hypervisor_hostname']
+        if CONF.service_available.nova:
+            hyper_list = cls.hyper_client.list_hypervisors()
+            cls.host_id = hyper_list['hypervisors'][0]['hypervisor_hostname']
 
     @decorators.idempotent_id('8e8569c1-9ac7-44db-8bc1-f5fb2814f29b')
+    @utils.services('compute')
     def test_create_port_binding_ext_attr(self):
         post_body = {"network_id": self.network['id'],
-                     "binding:host_id": self.host_id}
+                     "binding:host_id": self.host_id,
+                     "name": data_utils.rand_name(self.__class__.__name__)}
         body = self.admin_ports_client.create_port(**post_body)
         port = body['port']
         self.addCleanup(
@@ -46,8 +54,10 @@
         self.assertEqual(self.host_id, host_id)
 
     @decorators.idempotent_id('6f6c412c-711f-444d-8502-0ac30fbf5dd5')
+    @utils.services('compute')
     def test_update_port_binding_ext_attr(self):
-        post_body = {"network_id": self.network['id']}
+        post_body = {"network_id": self.network['id'],
+                     "name": data_utils.rand_name(self.__class__.__name__)}
         body = self.admin_ports_client.create_port(**post_body)
         port = body['port']
         self.addCleanup(
@@ -61,9 +71,11 @@
         self.assertEqual(self.host_id, host_id)
 
     @decorators.idempotent_id('1c82a44a-6c6e-48ff-89e1-abe7eaf8f9f8')
+    @utils.services('compute')
     def test_list_ports_binding_ext_attr(self):
         # Create a new port
-        post_body = {"network_id": self.network['id']}
+        post_body = {"network_id": self.network['id'],
+                     "name": data_utils.rand_name(self.__class__.__name__)}
         body = self.admin_ports_client.create_port(**post_body)
         port = body['port']
         self.addCleanup(
@@ -90,6 +102,7 @@
     @decorators.idempotent_id('b54ac0ff-35fc-4c79-9ca3-c7dbd4ea4f13')
     def test_show_port_binding_ext_attr(self):
         body = self.admin_ports_client.create_port(
+            name=data_utils.rand_name(self.__class__.__name__),
             network_id=self.network['id'])
         port = body['port']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
diff --git a/tempest/api/network/admin/test_routers_negative.py b/tempest/api/network/admin/test_routers_negative.py
index fdcc977..f605945 100644
--- a/tempest/api/network/admin/test_routers_negative.py
+++ b/tempest/api/network/admin/test_routers_negative.py
@@ -18,6 +18,7 @@
 from tempest.api.network import base
 from tempest.common import utils
 from tempest import config
+from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
@@ -42,6 +43,7 @@
     def test_router_set_gateway_used_ip_returns_409(self):
         # At first create a address from public_network_id
         port = self.admin_ports_client.create_port(
+            name=data_utils.rand_name(self.__class__.__name__),
             network_id=CONF.network.public_network_id)['port']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.admin_ports_client.delete_port,
diff --git a/tempest/api/network/base.py b/tempest/api/network/base.py
index 9032fdc..b6bf369 100644
--- a/tempest/api/network/base.py
+++ b/tempest/api/network/base.py
@@ -156,6 +156,8 @@
 
     @classmethod
     def create_port(cls, network, **kwargs):
+        if 'name' not in kwargs:
+            kwargs['name'] = data_utils.rand_name(cls.__name__)
         """Wrapper utility that returns a test port."""
         body = cls.ports_client.create_port(network_id=network['id'],
                                             **kwargs)
diff --git a/tempest/api/network/test_allowed_address_pair.py b/tempest/api/network/test_allowed_address_pair.py
index d393207..639defb 100644
--- a/tempest/api/network/test_allowed_address_pair.py
+++ b/tempest/api/network/test_allowed_address_pair.py
@@ -17,6 +17,7 @@
 
 from tempest.api.network import base
 from tempest.common import utils
+from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 
@@ -61,6 +62,7 @@
                                   'mac_address': self.mac_address}]
         body = self.ports_client.create_port(
             network_id=self.network['id'],
+            name=data_utils.rand_name(self.__class__.__name__),
             allowed_address_pairs=allowed_address_pairs)
         port_id = body['port']['id']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
@@ -76,7 +78,9 @@
 
     def _update_port_with_address(self, address, mac_address=None, **kwargs):
         # Create a port without allowed address pair
-        body = self.ports_client.create_port(network_id=self.network['id'])
+        body = self.ports_client.create_port(
+            network_id=self.network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         port_id = body['port']['id']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, port_id)
@@ -107,7 +111,9 @@
     @decorators.idempotent_id('b3f20091-6cd5-472b-8487-3516137df933')
     def test_update_port_with_multiple_ip_mac_address_pair(self):
         # Create an ip _address and mac_address through port create
-        resp = self.ports_client.create_port(network_id=self.network['id'])
+        resp = self.ports_client.create_port(
+            network_id=self.network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         newportid = resp['port']['id']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, newportid)
diff --git a/tempest/api/network/test_extra_dhcp_options.py b/tempest/api/network/test_extra_dhcp_options.py
index 8e94429..d363081 100644
--- a/tempest/api/network/test_extra_dhcp_options.py
+++ b/tempest/api/network/test_extra_dhcp_options.py
@@ -61,6 +61,7 @@
         # Create a port with Extra DHCP Options
         body = self.ports_client.create_port(
             network_id=self.network['id'],
+            name=data_utils.rand_name(self.__class__.__name__),
             extra_dhcp_opts=self.extra_dhcp_opts)
         port_id = body['port']['id']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
diff --git a/tempest/api/network/test_floating_ips.py b/tempest/api/network/test_floating_ips.py
index 9704c73..aaa5497 100644
--- a/tempest/api/network/test_floating_ips.py
+++ b/tempest/api/network/test_floating_ips.py
@@ -142,7 +142,9 @@
             self.floating_ips_client.delete_floatingip,
             created_floating_ip['id'])
         # Create a port
-        port = self.ports_client.create_port(network_id=self.network['id'])
+        port = self.ports_client.create_port(
+            network_id=self.network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         created_port = port['port']
         floating_ip = self.floating_ips_client.update_floatingip(
             created_floating_ip['id'],
@@ -237,8 +239,10 @@
             2)
         fixed_ips = [{'ip_address': list_ips[0]}, {'ip_address': list_ips[1]}]
         # Create port
-        body = self.ports_client.create_port(network_id=self.network['id'],
-                                             fixed_ips=fixed_ips)
+        body = self.ports_client.create_port(
+            network_id=self.network['id'],
+            name=data_utils.rand_name(self.__class__.__name__),
+            fixed_ips=fixed_ips)
         port = body['port']
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, port['id'])
diff --git a/tempest/api/network/test_networks_negative.py b/tempest/api/network/test_networks_negative.py
index bc4f41f..3af67dd 100644
--- a/tempest/api/network/test_networks_negative.py
+++ b/tempest/api/network/test_networks_negative.py
@@ -79,7 +79,8 @@
         non_exist_net_id = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
                           self.ports_client.create_port,
-                          network_id=non_exist_net_id)
+                          network_id=non_exist_net_id,
+                          name=data_utils.rand_name(self.__class__.__name__))
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('cf8eef21-4351-4f53-adcd-cc5cb1e76b92')
diff --git a/tempest/api/network/test_ports.py b/tempest/api/network/test_ports.py
index 93a4631..56b5509 100644
--- a/tempest/api/network/test_ports.py
+++ b/tempest/api/network/test_ports.py
@@ -71,7 +71,9 @@
     @decorators.idempotent_id('c72c1c0c-2193-4aca-aaa4-b1442640f51c')
     def test_create_update_delete_port(self):
         # Verify port creation
-        body = self.ports_client.create_port(network_id=self.network['id'])
+        body = self.ports_client.create_port(
+            network_id=self.network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         port = body['port']
         # Schedule port deletion with verification upon test completion
         self.addCleanup(self._delete_port, port['id'])
@@ -118,7 +120,9 @@
         self._create_subnet(network, cidr=address,
                             mask_bits=address.prefixlen,
                             **allocation_pools)
-        body = self.ports_client.create_port(network_id=net_id)
+        body = self.ports_client.create_port(
+            network_id=net_id,
+            name=data_utils.rand_name(self.__class__.__name__))
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, body['port']['id'])
         port = body['port']
@@ -172,10 +176,14 @@
         network = self._create_network()
         self._create_subnet(network)
         # Create two ports
-        port_1 = self.ports_client.create_port(network_id=network['id'])
+        port_1 = self.ports_client.create_port(
+            network_id=network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, port_1['port']['id'])
-        port_2 = self.ports_client.create_port(network_id=network['id'])
+        port_2 = self.ports_client.create_port(
+            network_id=network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, port_2['port']['id'])
         # List ports filtered by fixed_ips
@@ -224,13 +232,17 @@
 
         # Create two ports
         fixed_ips = [{'subnet_id': subnet['id'], 'ip_address': ip_address_1}]
-        port_1 = self.ports_client.create_port(network_id=network['id'],
-                                               fixed_ips=fixed_ips)
+        port_1 = self.ports_client.create_port(
+            network_id=network['id'],
+            name=data_utils.rand_name(self.__class__.__name__),
+            fixed_ips=fixed_ips)
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, port_1['port']['id'])
         fixed_ips = [{'subnet_id': subnet['id'], 'ip_address': ip_address_2}]
-        port_2 = self.ports_client.create_port(network_id=network['id'],
-                                               fixed_ips=fixed_ips)
+        port_2 = self.ports_client.create_port(
+            network_id=network['id'],
+            name=data_utils.rand_name(self.__class__.__name__),
+            fixed_ips=fixed_ips)
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, port_2['port']['id'])
 
@@ -283,7 +295,9 @@
         router = self.create_router()
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.routers_client.delete_router, router['id'])
-        port = self.ports_client.create_port(network_id=network['id'])
+        port = self.ports_client.create_port(
+            network_id=network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         # Add router interface to port created above
         self.routers_client.add_router_interface(router['id'],
                                                  port_id=port['port']['id'])
@@ -359,7 +373,7 @@
                         self.security_groups_client.delete_security_group,
                         security_group['security_group']['id'])
         post_body = {
-            "name": data_utils.rand_name('port-'),
+            "name": data_utils.rand_name(self.__class__.__name__),
             "security_groups": [security_group['security_group']['id']],
             "network_id": self.network['id'],
             "admin_state_up": True,
@@ -372,10 +386,11 @@
         # Update the port with security groups
         subnet_2 = self.create_subnet(self.network)
         fixed_ip_2 = [{'subnet_id': subnet_2['id']}]
-        update_body = {"name": data_utils.rand_name('port-'),
-                       "admin_state_up": False,
-                       "fixed_ips": fixed_ip_2,
-                       "security_groups": security_groups_list}
+        update_body = {
+            "name": data_utils.rand_name(self.__class__.__name__),
+            "admin_state_up": False,
+            "fixed_ips": fixed_ip_2,
+            "security_groups": security_groups_list}
         body = self.ports_client.update_port(port['id'], **update_body)
         port_show = body['port']
         # Verify the security groups and other attributes updated to port
@@ -410,13 +425,17 @@
     @decorators.idempotent_id('13e95171-6cbd-489c-9d7c-3f9c58215c18')
     def test_create_show_delete_port_user_defined_mac(self):
         # Create a port for a legal mac
-        body = self.ports_client.create_port(network_id=self.network['id'])
+        body = self.ports_client.create_port(
+            network_id=self.network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         old_port = body['port']
         free_mac_address = old_port['mac_address']
         self.ports_client.delete_port(old_port['id'])
         # Create a new port with user defined mac
-        body = self.ports_client.create_port(network_id=self.network['id'],
-                                             mac_address=free_mac_address)
+        body = self.ports_client.create_port(
+            network_id=self.network['id'],
+            mac_address=free_mac_address,
+            name=data_utils.rand_name(self.__class__.__name__))
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.ports_client.delete_port, body['port']['id'])
         port = body['port']
diff --git a/tempest/api/network/test_routers.py b/tempest/api/network/test_routers.py
index f223fa4..ad316d1 100644
--- a/tempest/api/network/test_routers.py
+++ b/tempest/api/network/test_routers.py
@@ -123,7 +123,8 @@
         router = self.create_router()
         self.addCleanup(self.delete_router, router)
         port_body = self.ports_client.create_port(
-            network_id=network['id'])
+            network_id=network['id'],
+            name=data_utils.rand_name(self.__class__.__name__))
         # add router interface to port created above
         interface = self.routers_client.add_router_interface(
             router['id'],
@@ -150,6 +151,7 @@
         # Don't know public_network_address, so at first create address
         # from public_network and delete
         port = self.admin_ports_client.create_port(
+            name=data_utils.rand_name(self.__class__.__name__),
             network_id=CONF.network.public_network_id)['port']
         self.admin_ports_client.delete_port(port_id=port['id'])
 
diff --git a/tempest/api/volume/admin/test_backends_capabilities.py b/tempest/api/volume/admin/test_backends_capabilities.py
index affed6b..1351704 100644
--- a/tempest/api/volume/admin/test_backends_capabilities.py
+++ b/tempest/api/volume/admin/test_backends_capabilities.py
@@ -21,17 +21,6 @@
 
 class BackendsCapabilitiesAdminTestsJSON(base.BaseVolumeAdminTest):
 
-    CAPABILITIES = ('namespace',
-                    'vendor_name',
-                    'volume_backend_name',
-                    'pool_name',
-                    'driver_version',
-                    'storage_protocol',
-                    'display_name',
-                    'description',
-                    'visibility',
-                    'properties')
-
     @classmethod
     def resource_setup(cls):
         super(BackendsCapabilitiesAdminTestsJSON, cls).resource_setup()
@@ -44,12 +33,8 @@
     @decorators.idempotent_id('3750af44-5ea2-4cd4-bc3e-56e7e6caf854')
     def test_get_capabilities_backend(self):
         # Test backend properties
-        backend = self.admin_capabilities_client.show_backend_capabilities(
-            self.hosts[0])
-
-        # Verify getting capabilities parameters from a backend
-        for key in self.CAPABILITIES:
-            self.assertIn(key, backend)
+        # Check response schema
+        self.admin_capabilities_client.show_backend_capabilities(self.hosts[0])
 
     @decorators.idempotent_id('a9035743-d46a-47c5-9cb7-3c80ea16dea0')
     def test_compare_volume_stats_values(self):
diff --git a/tempest/api/volume/admin/test_user_messages.py b/tempest/api/volume/admin/test_user_messages.py
index 9907497..8048017 100644
--- a/tempest/api/volume/admin/test_user_messages.py
+++ b/tempest/api/volume/admin/test_user_messages.py
@@ -20,18 +20,6 @@
 
 CONF = config.CONF
 
-MESSAGE_KEYS = [
-    'created_at',
-    'event_id',
-    'guaranteed_until',
-    'id',
-    'message_level',
-    'request_id',
-    'resource_type',
-    'resource_uuid',
-    'user_message',
-    'links']
-
 
 class UserMessagesTest(base.BaseVolumeAdminTest):
     _api_version = 3
@@ -66,18 +54,11 @@
         message_id = self._create_user_message()
         self.addCleanup(self.messages_client.delete_message, message_id)
 
-        # show message
-        message = self.messages_client.show_message(message_id)['message']
-        for key in MESSAGE_KEYS:
-            self.assertIn(key, message.keys(), 'Missing expected key %s' % key)
+        # show message, check response schema
+        self.messages_client.show_message(message_id)
 
-        # list messages
-        messages = self.messages_client.list_messages()['messages']
-        self.assertIsInstance(messages, list)
-        for message in messages:
-            for key in MESSAGE_KEYS:
-                self.assertIn(key, message.keys(),
-                              'Missing expected key %s' % key)
+        # list messages, check response schema
+        self.messages_client.list_messages()
 
     @decorators.idempotent_id('c6eb6901-cdcc-490f-b735-4fe251842aed')
     def test_delete_message(self):
diff --git a/tempest/api/volume/admin/test_volume_hosts.py b/tempest/api/volume/admin/test_volume_hosts.py
index 7e53ce8..83c27e1 100644
--- a/tempest/api/volume/admin/test_volume_hosts.py
+++ b/tempest/api/volume/admin/test_volume_hosts.py
@@ -26,13 +26,6 @@
                                 "The count of volume hosts is < 2, "
                                 "response of list hosts is: %s" % hosts)
 
-        # Check elements in volume hosts list
-        host_list_keys = ['service', 'host_name', 'last-update',
-                          'zone', 'service-status', 'service-state']
-        for host in hosts:
-            for key in host_list_keys:
-                self.assertIn(key, host)
-
     @decorators.idempotent_id('21168d57-b373-4b71-a3ac-f2c88f0c5d31')
     def test_show_host(self):
         hosts = self.admin_hosts_client.list_hosts()['hosts']
@@ -53,12 +46,6 @@
                             "all hosts that found are: %s" % hosts)
 
         # Check each cinder-volume host.
-        host_detail_keys = ['project', 'volume_count', 'snapshot_count',
-                            'host', 'total_volume_gb', 'total_snapshot_gb']
         for host in c_vol_hosts:
             host_details = self.admin_hosts_client.show_host(host)['host']
             self.assertNotEmpty(host_details)
-            for detail in host_details:
-                self.assertIn('resource', detail)
-                for key in host_detail_keys:
-                    self.assertIn(key, detail['resource'])
diff --git a/tempest/api/volume/admin/test_volume_retype.py b/tempest/api/volume/admin/test_volume_retype.py
index 9136139..18e0b9b 100644
--- a/tempest/api/volume/admin/test_volume_retype.py
+++ b/tempest/api/volume/admin/test_volume_retype.py
@@ -94,7 +94,7 @@
         super(VolumeRetypeTest, cls).skip_checks()
 
         if not CONF.volume_feature_enabled.multi_backend:
-            raise cls.skipException("Cinder multi-backend feature disabled.")
+            raise cls.skipException("Cinder multi-backend feature disabled")
 
         if len(set(CONF.volume.backend_names)) < 2:
             raise cls.skipException("Requires at least two different "
diff --git a/tempest/api/volume/test_volumes_list.py b/tempest/api/volume/test_volumes_list.py
index d5358ab..2345698 100644
--- a/tempest/api/volume/test_volumes_list.py
+++ b/tempest/api/volume/test_volumes_list.py
@@ -17,7 +17,7 @@
 import operator
 import random
 
-from six.moves.urllib import parse
+from six.moves.urllib.parse import urlparse
 from testtools import matchers
 
 from tempest.api.volume import base
@@ -333,7 +333,19 @@
             # If the current iteration is from a 'next' link, check that the
             # absolute url is the same as the one used for this request
             if next:
-                self.assertEqual(next, response.response['content-location'])
+                curr = response.response['content-location']
+                currparsed = urlparse(curr)
+                nextparsed = urlparse(next)
+                # Depending on the environment, certain fields are omitted
+                # from url (ie port). The fields to check are defined here.
+                fieldscheck = ['scheme', 'hostname', 'path', 'query', 'params',
+                               'fragment']
+                for field in fieldscheck:
+                    self.assertEqual(getattr(currparsed, field),
+                                     getattr(nextparsed, field),
+                                     'Incorrect link to next page. URLs do '
+                                     'not match at %s:\n%s\n%s' % (field, curr,
+                                                                   next))
 
             # Get next from response
             next = None
@@ -352,7 +364,7 @@
             # If we can follow to the next page, get params from url to make
             # request in the form of a relative URL
             if next:
-                params = parse.urlparse(next).query
+                params = urlparse(next).query
 
             # If cannot follow make sure it's because we have finished
             else:
diff --git a/tempest/cmd/cleanup.py b/tempest/cmd/cleanup.py
index f0d7264..645a952 100644
--- a/tempest/cmd/cleanup.py
+++ b/tempest/cmd/cleanup.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright 2014 Dell 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
@@ -72,6 +70,15 @@
     deleted unless the ``--delete-tempest-conf-objects`` flag is used to
     force their deletion.
 
+.. note::
+
+    If during execution of ``tempest cleanup`` NotImplemented exception
+    occurres, ``tempest cleanup`` won't fail on that, it will be logged only.
+    NotImplemented errors are ignored because they are an outcome of some
+    extensions being disabled and ``tempest cleanup`` is not checking their
+    availability as it tries to clean up as much as possible without any
+    complicated logic.
+
 """
 import sys
 import traceback
@@ -85,6 +92,7 @@
 from tempest.common import credentials_factory as credentials
 from tempest.common import identity
 from tempest import config
+from tempest.lib import exceptions
 
 SAVED_STATE_JSON = "saved_state.json"
 DRY_RUN_JSON = "dry_run.json"
@@ -105,7 +113,13 @@
             LOG.exception("Failure during cleanup")
             traceback.print_exc()
             raise
-        if self.GOT_EXCEPTIONS:
+        # ignore NotImplemented errors as those are an outcome of some
+        # extensions being disabled and cleanup is not checking their
+        # availability as it tries to clean up as much as possible without
+        # any complicated logic
+        critical_exceptions = [ex for ex in self.GOT_EXCEPTIONS if
+                               not isinstance(ex, exceptions.NotImplemented)]
+        if critical_exceptions:
             raise Exception(self.GOT_EXCEPTIONS)
 
     def init(self, parsed_args):
diff --git a/tempest/cmd/cleanup_service.py b/tempest/cmd/cleanup_service.py
index e2e1bfb..8b625d0 100644
--- a/tempest/cmd/cleanup_service.py
+++ b/tempest/cmd/cleanup_service.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-
 # Copyright 2015 Dell Inc.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -144,7 +142,7 @@
             msg = ("Got NotImplemented error in %s, full exception: %s" %
                    (str(self.__class__), str(exc)))
             LOG.exception(msg)
-            self.got_exceptions.append(msg)
+            self.got_exceptions.append(exc)
 
 
 class SnapshotService(BaseService):
diff --git a/tempest/cmd/list_plugins.py b/tempest/cmd/list_plugins.py
index 86732da..51decc7 100644
--- a/tempest/cmd/list_plugins.py
+++ b/tempest/cmd/list_plugins.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-
 # 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
diff --git a/tempest/config.py b/tempest/config.py
index ec7807f..d67d3e0 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -483,7 +483,12 @@
     cfg.StrOpt('vnc_server_header',
                default='WebSockify',
                help='Expected VNC server name (WebSockify, nginx, etc) '
-                    'in response header.'),
+                    'in response header.',
+               deprecated_for_removal=True,
+               deprecated_reason='This option will be ignored because the '
+                                 'usage of different response header fields '
+                                 'to accomplish the same goal (in accordance '
+                                 'with RFC7231 S6.2.2) makes it obsolete.'),
     cfg.BoolOpt('spice_console',
                 default=False,
                 help='Enable Spice console. This configuration value should '
diff --git a/tempest/lib/api_schema/response/volume/capabilities.py b/tempest/lib/api_schema/response/volume/capabilities.py
new file mode 100644
index 0000000..ec60fc3
--- /dev/null
+++ b/tempest/lib/api_schema/response/volume/capabilities.py
@@ -0,0 +1,55 @@
+# Copyright 2018 ZTE 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.
+
+property_info = {
+    'type': 'object',
+    'properties': {
+        'type': {'type': 'string'},
+        'description': {'type': 'string'},
+        'title': {'type': 'string'}
+    },
+    'additionalProperties': False,
+    'required': ['type', 'description', 'title']
+}
+
+show_backend_capabilities = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'pool_name': {'type': ['string', 'null']},
+            'description': {'type': ['string', 'null']},
+            'volume_backend_name': {'type': 'string'},
+            'namespace': {'type': 'string',
+                          'pattern': '^OS::Storage::Capabilities::.+$'},
+            'visibility': {'type': ['string', 'null']},
+            'driver_version': {'type': 'string'},
+            'vendor_name': {'type': 'string'},
+            'properties': {
+                'type': 'object',
+                'properties': {
+                    '^.+$': property_info
+                },
+            },
+            'storage_protocol': {'type': 'string'},
+            'replication_targets': {'type': 'array'},
+            'display_name': {'type': ['string', 'null']}
+        },
+        'additionalProperties': False,
+        'required': ['pool_name', 'volume_backend_name', 'namespace',
+                     'visibility', 'driver_version', 'vendor_name',
+                     'properties', 'storage_protocol', 'replication_targets',
+                     'display_name', 'description']
+    }
+}
diff --git a/tempest/lib/api_schema/response/volume/extensions.py b/tempest/lib/api_schema/response/volume/extensions.py
new file mode 100644
index 0000000..8dcb07d
--- /dev/null
+++ b/tempest/lib/api_schema/response/volume/extensions.py
@@ -0,0 +1,43 @@
+# Copyright 2018 ZTE 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.
+
+from tempest.lib.api_schema.response.compute.v2_1 import parameter_types
+
+list_extensions = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'extensions': {
+                'type': 'array',
+                'items': {
+                    'type': 'object',
+                    'properties': {
+                        'updated': parameter_types.date_time,
+                        'description': {'type': 'string'},
+                        'links': {'type': 'array'},
+                        'namespace': {'type': 'string'},
+                        'alias': {'type': 'string'},
+                        'name': {'type': 'string'}
+                    },
+                    'additionalProperties': False,
+                    'required': ['updated', 'links', 'alias', 'name',
+                                 'description']
+                }
+            }
+        },
+        'additionalProperties': False,
+        'required': ['extensions'],
+    }
+}
diff --git a/tempest/lib/api_schema/response/volume/hosts.py b/tempest/lib/api_schema/response/volume/hosts.py
new file mode 100644
index 0000000..d4848d5
--- /dev/null
+++ b/tempest/lib/api_schema/response/volume/hosts.py
@@ -0,0 +1,81 @@
+# Copyright 2018 ZTE 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.
+
+from tempest.lib.api_schema.response.compute.v2_1 import parameter_types
+
+show_host = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'host': {
+                'type': 'array',
+                'items': {
+                    'type': 'object',
+                    'properties': {
+                        'resource': {
+                            'type': 'object',
+                            'properties': {
+                                'volume_count': {'type': 'string'},
+                                'total_volume_gb': {'type': 'string'},
+                                'total_snapshot_gb': {'type': 'string'},
+                                'project': {'type': 'string'},
+                                'host': {'type': 'string', 'pattern': '.+@.+'},
+                                'snapshot_count': {'type': 'string'},
+                            },
+                            'additionalProperties': False,
+                            'required': ['volume_count', 'total_volume_gb',
+                                         'total_snapshot_gb', 'project',
+                                         'host', 'snapshot_count'],
+                        }
+                    },
+                    'additionalProperties': False,
+                    'required': ['resource']
+                }
+            }
+        },
+        'additionalProperties': False,
+        'required': ['host']
+    }
+}
+
+list_hosts = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'hosts': {
+                'type': 'array',
+                'items': {
+                    'type': 'object',
+                    'properties': {
+                        'service-status': {
+                            'enum': ['available', 'unavailable']},
+                        'service': {'type': 'string'},
+                        'zone': {'type': 'string'},
+                        'service-state': {
+                            'enum': ['enabled', 'disabled']},
+                        'host_name': {'type': 'string'},
+                        'last-update': parameter_types.date_time_or_null
+                    },
+                    'additionalProperties': False,
+                    'required': ['service-status', 'service', 'zone',
+                                 'service-state', 'host_name', 'last-update']
+                }
+            }
+        },
+        'additionalProperties': False,
+        'required': ['hosts']
+    }
+}
diff --git a/tempest/lib/api_schema/response/volume/messages.py b/tempest/lib/api_schema/response/volume/messages.py
new file mode 100644
index 0000000..381f542
--- /dev/null
+++ b/tempest/lib/api_schema/response/volume/messages.py
@@ -0,0 +1,64 @@
+# Copyright 2018 ZTE 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.
+
+from tempest.lib.api_schema.response.compute.v2_1 import parameter_types
+
+delete_message = {
+    'status_code': [204],
+}
+
+common_show_message = {
+    'type': 'object',
+    'properties': {
+        'request_id': {'type': 'string'},
+        'message_level': {'type': 'string'},
+        'links': parameter_types.links,
+        'event_id': {'type': 'string'},
+        'created_at': parameter_types.date_time,
+        'guaranteed_until': parameter_types.date_time,
+        'resource_uuid': {'type': 'string', 'format': 'uuid'},
+        'id': {'type': 'string', 'format': 'uuid'},
+        'resource_type': {'type': 'string'},
+        'user_message': {'type': 'string'}},
+    'additionalProperties': False,
+    'required': ['request_id', 'message_level', 'event_id', 'created_at',
+                 'id', 'user_message'],
+}
+
+show_message = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'message': common_show_message
+        },
+        'additionalProperties': False,
+        'required': ['message']
+    }
+}
+
+list_messages = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'messages': {
+                'type': 'array',
+                'items': common_show_message
+            },
+        },
+        'additionalProperties': False,
+        'required': ['messages']
+    }
+}
diff --git a/tempest/lib/api_schema/response/volume/services.py b/tempest/lib/api_schema/response/volume/services.py
new file mode 100644
index 0000000..70de878
--- /dev/null
+++ b/tempest/lib/api_schema/response/volume/services.py
@@ -0,0 +1,92 @@
+# Copyright 2018 ZTE 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.
+import copy
+
+from tempest.lib.api_schema.response.compute.v2_1 import parameter_types
+
+list_services = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'services': {
+                'type': 'array',
+                'items': {
+                    'type': 'object',
+                    'properties': {
+                        'binary': {'type': 'string'},
+                        'disabled_reason': {'type': ['string', 'null']},
+                        'host': {'type': 'string'},
+                        'state': {'enum': ['up', 'down']},
+                        'status': {'enum': ['enabled', 'disabled']},
+                        'frozen': {'type': 'boolean'},
+                        'updated_at': parameter_types.date_time,
+                        'zone': {'type': 'string'},
+                        # TODO(zhufl): cluster is added in 3.7, we should move
+                        # it to the 3.7 schema file when microversion is
+                        # supported in volume interfaces
+                        'cluster': {'type': 'string'},
+                        'replication_status': {'type': 'string'},
+                        'active_backend_id': {'type': ['string', 'null']},
+                        'backend_state': {'type': 'string'},
+                    },
+                    'additionalProperties': False,
+                    'required': ['binary', 'disabled_reason', 'host', 'state',
+                                 'status', 'updated_at', 'zone']
+                }
+            }
+        },
+        'additionalProperties': False,
+        'required': ['services']
+    }
+}
+
+enable_service = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'disabled': {'type': 'boolean'},
+            'status': {'enum': ['enabled', 'disabled']},
+            'host': {'type': 'string'},
+            'service': {'type': 'string'},
+            'binary': {'type': 'string'},
+            'disabled_reason': {'type': ['string', 'null']}
+        },
+        'additionalProperties': False,
+        'required': ['disabled', 'status', 'host', 'service',
+                     'binary', 'disabled_reason']
+    }
+}
+
+disable_service = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'disabled': {'type': 'boolean'},
+            'status': {'enum': ['enabled', 'disabled']},
+            'host': {'type': 'string'},
+            'service': {'type': 'string'},
+            'binary': {'type': 'string'},
+        },
+        'additionalProperties': False,
+        'required': ['disabled', 'status', 'host', 'service', 'binary']
+    }
+}
+
+disable_log_reason = copy.deepcopy(enable_service)
+
+freeze_host = {'status_code': [200]}
+thaw_host = {'status_code': [200]}
diff --git a/tempest/lib/api_schema/response/volume/versions.py b/tempest/lib/api_schema/response/volume/versions.py
index 2391a8c..c845f7f 100644
--- a/tempest/lib/api_schema/response/volume/versions.py
+++ b/tempest/lib/api_schema/response/volume/versions.py
@@ -58,3 +58,49 @@
         'required': ['versions'],
     }
 }
+
+volume_api_version_details = {
+    'status_code': [200],
+    'response_body': {
+        'type': 'object',
+        'properties': {
+            'versions': {
+                'type': 'array',
+                'items': {
+                    'type': 'object',
+                    'properties': {
+                        'status': {'type': 'string'},
+                        'updated': {'type': 'string'},
+                        'id': {'type': 'string'},
+                        'links': {
+                            'type': 'array',
+                            'items': {
+                                'type': 'object',
+                                'properties': {
+                                    'href': {'type': 'string',
+                                             'format': 'uri'},
+                                    'rel': {'type': 'string'},
+                                    'type': {'type': 'string'},
+                                },
+                                'required': ['href', 'rel']
+                            }
+                        },
+                        'min_version': {'type': 'string'},
+                        'version': {'type': 'string'},
+                        'media-types': {
+                            'type': 'array',
+                            'properties': {
+                                'base': {'type': 'string'},
+                                'type': {'type': 'string'}
+                            },
+                            'required': ['base', 'type']
+                        }
+                    },
+                    'required': ['status', 'updated', 'id', 'links',
+                                 'min_version', 'version', 'media-types']
+                }
+            }
+        },
+        'required': ['versions'],
+    }
+}
diff --git a/tempest/lib/services/compute/servers_client.py b/tempest/lib/services/compute/servers_client.py
index f027772..a687137 100644
--- a/tempest/lib/services/compute/servers_client.py
+++ b/tempest/lib/services/compute/servers_client.py
@@ -435,7 +435,12 @@
         return rest_client.ResponseBody(resp, body)
 
     def update_attached_volume(self, server_id, attachment_id, **kwargs):
-        """Swaps a volume attached to an instance for another volume"""
+        """Swaps a volume attached to an instance for another volume
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/compute/#update-a-volume-attachment
+        """
         post_body = json.dumps({'volumeAttachment': kwargs})
         resp, body = self.put('servers/%s/os-volume_attachments/%s' %
                               (server_id, attachment_id),
diff --git a/tempest/lib/services/identity/v3/roles_client.py b/tempest/lib/services/identity/v3/roles_client.py
index 43a9020..f9356be 100644
--- a/tempest/lib/services/identity/v3/roles_client.py
+++ b/tempest/lib/services/identity/v3/roles_client.py
@@ -42,8 +42,12 @@
         return rest_client.ResponseBody(resp, body)
 
     def list_roles(self, **params):
-        """Get the list of Roles."""
+        """Get the list of Roles.
 
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/identity/v3/index.html#list-roles
+        """
         url = 'roles'
         if params:
             url += '?%s' % urllib.urlencode(params)
diff --git a/tempest/lib/services/network/extensions_client.py b/tempest/lib/services/network/extensions_client.py
index 3910c84..4701cb0 100644
--- a/tempest/lib/services/network/extensions_client.py
+++ b/tempest/lib/services/network/extensions_client.py
@@ -16,9 +16,21 @@
 class ExtensionsClient(base.BaseNetworkClient):
 
     def show_extension(self, ext_alias, **fields):
+        """Show extension details.
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-extension-details
+        """
         uri = '/extensions/%s' % ext_alias
         return self.show_resource(uri, **fields)
 
     def list_extensions(self, **filters):
+        """List extensions.
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-extensions
+        """
         uri = '/extensions'
         return self.list_resources(uri, **filters)
diff --git a/tempest/lib/services/network/floating_ips_client.py b/tempest/lib/services/network/floating_ips_client.py
index 893bcc8..a63150b 100644
--- a/tempest/lib/services/network/floating_ips_client.py
+++ b/tempest/lib/services/network/floating_ips_client.py
@@ -23,7 +23,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-floating-ip
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-floating-ip
         """
         uri = '/floatingips'
         post_data = {'floatingip': kwargs}
@@ -34,7 +34,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#update-floating-ip
+        https://docs.openstack.org/api-ref/network/v2/index.html#update-floating-ip
         """
         uri = '/floatingips/%s' % floatingip_id
         post_data = {'floatingip': kwargs}
@@ -45,7 +45,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-floating-ip-details
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-floating-ip-details
         """
         uri = '/floatingips/%s' % floatingip_id
         return self.show_resource(uri, **fields)
@@ -59,7 +59,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-floating-ips
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-floating-ips
         """
         uri = '/floatingips'
         return self.list_resources(uri, **filters)
diff --git a/tempest/lib/services/network/metering_label_rules_client.py b/tempest/lib/services/network/metering_label_rules_client.py
index 8ccabee..dd5fd52 100644
--- a/tempest/lib/services/network/metering_label_rules_client.py
+++ b/tempest/lib/services/network/metering_label_rules_client.py
@@ -27,10 +27,17 @@
         return self.create_resource(uri, post_data)
 
     def show_metering_label_rule(self, metering_label_rule_id, **fields):
+        """Show metering label rule.
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-metering-label-rule-details
+        """
         uri = '/metering/metering-label-rules/%s' % metering_label_rule_id
         return self.show_resource(uri, **fields)
 
     def delete_metering_label_rule(self, metering_label_rule_id):
+        """Delete metering label rule."""
         uri = '/metering/metering-label-rules/%s' % metering_label_rule_id
         return self.delete_resource(uri)
 
diff --git a/tempest/lib/services/network/metering_labels_client.py b/tempest/lib/services/network/metering_labels_client.py
index be19b58..80ed51f 100644
--- a/tempest/lib/services/network/metering_labels_client.py
+++ b/tempest/lib/services/network/metering_labels_client.py
@@ -20,7 +20,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-metering-label
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-metering-label
         """
         uri = '/metering/metering-labels'
         post_data = {'metering_label': kwargs}
@@ -31,7 +31,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-metering-label-details
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-metering-label-details
         """
         uri = '/metering/metering-labels/%s' % metering_label_id
         return self.show_resource(uri, **fields)
@@ -41,7 +41,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#delete-metering-label
+        https://docs.openstack.org/api-ref/network/v2/index.html#delete-metering-label
         """
         uri = '/metering/metering-labels/%s' % metering_label_id
         return self.delete_resource(uri)
@@ -51,7 +51,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-metering-labels
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-metering-labels
         """
         uri = '/metering/metering-labels'
         return self.list_resources(uri, **filters)
diff --git a/tempest/lib/services/network/networks_client.py b/tempest/lib/services/network/networks_client.py
index 4043558..f0e735e 100644
--- a/tempest/lib/services/network/networks_client.py
+++ b/tempest/lib/services/network/networks_client.py
@@ -20,7 +20,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-network
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-network
         """
         uri = '/networks'
         post_data = {'network': kwargs}
@@ -31,7 +31,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#update-network
+        https://docs.openstack.org/api-ref/network/v2/index.html#update-network
         """
         uri = '/networks/%s' % network_id
         post_data = {'network': kwargs}
@@ -42,7 +42,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-network-details
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-network-details
         """
         uri = '/networks/%s' % network_id
         return self.show_resource(uri, **fields)
@@ -56,7 +56,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-networks
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-networks
         """
         uri = '/networks'
         return self.list_resources(uri, **filters)
@@ -66,7 +66,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#bulk-create-networks
+        https://docs.openstack.org/api-ref/network/v2/index.html#bulk-create-networks
         """
         uri = '/networks'
         return self.create_resource(uri, kwargs)
diff --git a/tempest/lib/services/network/ports_client.py b/tempest/lib/services/network/ports_client.py
index aad8515..d77b62f 100644
--- a/tempest/lib/services/network/ports_client.py
+++ b/tempest/lib/services/network/ports_client.py
@@ -21,7 +21,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-port
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-port
         """
         uri = '/ports'
         post_data = {'port': kwargs}
@@ -32,7 +32,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#update-port
+        https://docs.openstack.org/api-ref/network/v2/index.html#update-port
         """
         uri = '/ports/%s' % port_id
         post_data = {'port': kwargs}
@@ -43,7 +43,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-port-details
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-port-details
         """
         uri = '/ports/%s' % port_id
         return self.show_resource(uri, **fields)
@@ -53,7 +53,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#delete-port
+        https://docs.openstack.org/api-ref/network/v2/index.html#delete-port
         """
         uri = '/ports/%s' % port_id
         return self.delete_resource(uri)
@@ -63,7 +63,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-ports
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-ports
         """
         uri = '/ports'
         return self.list_resources(uri, **filters)
@@ -73,7 +73,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#bulk-create-ports
+        https://docs.openstack.org/api-ref/network/v2/index.html#bulk-create-ports
         """
         uri = '/ports'
         return self.create_resource(uri, kwargs)
diff --git a/tempest/lib/services/network/quotas_client.py b/tempest/lib/services/network/quotas_client.py
index c479799..997d201 100644
--- a/tempest/lib/services/network/quotas_client.py
+++ b/tempest/lib/services/network/quotas_client.py
@@ -35,10 +35,22 @@
         return self.delete_resource(uri)
 
     def show_quotas(self, tenant_id, **fields):
+        """Show quota for a project.
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-quotas-for-a-project
+        """
         uri = '/quotas/%s' % tenant_id
         return self.show_resource(uri, **fields)
 
     def list_quotas(self, **filters):
+        """List quotas for projects with non default quota values.
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-quotas-for-projects-with-non-default-quota-values
+        """
         uri = '/quotas'
         return self.list_resources(uri, **filters)
 
diff --git a/tempest/lib/services/network/routers_client.py b/tempest/lib/services/network/routers_client.py
index 1ab9300..2af487f 100644
--- a/tempest/lib/services/network/routers_client.py
+++ b/tempest/lib/services/network/routers_client.py
@@ -20,7 +20,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-router
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-router
         """
         post_body = {'router': kwargs}
         uri = '/routers'
@@ -31,7 +31,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#update-router
+        https://docs.openstack.org/api-ref/network/v2/index.html#update-router
         """
         uri = '/routers/%s' % router_id
         update_body = {'router': kwargs}
@@ -42,7 +42,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-router-details
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-router-details
         """
         uri = '/routers/%s' % router_id
         return self.show_resource(uri, **fields)
@@ -56,7 +56,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-routers
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-routers
         """
         uri = '/routers'
         return self.list_resources(uri, **filters)
@@ -66,7 +66,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#add-interface-to-router
+        https://docs.openstack.org/api-ref/network/v2/index.html#add-interface-to-router
         """
         uri = '/routers/%s/add_router_interface' % router_id
         return self.update_resource(uri, kwargs)
@@ -76,7 +76,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#remove-interface-from-router
+        https://docs.openstack.org/api-ref/network/v2/index.html#remove-interface-from-router
         """
         uri = '/routers/%s/remove_router_interface' % router_id
         return self.update_resource(uri, kwargs)
diff --git a/tempest/lib/services/network/security_group_rules_client.py b/tempest/lib/services/network/security_group_rules_client.py
index 15dfc2a..d62b05f 100644
--- a/tempest/lib/services/network/security_group_rules_client.py
+++ b/tempest/lib/services/network/security_group_rules_client.py
@@ -20,7 +20,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-security-group-rule
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-security-group-rule
         """
         uri = '/security-group-rules'
         post_data = {'security_group_rule': kwargs}
@@ -31,7 +31,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-security-group-rule
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-security-group-rule
         """
         uri = '/security-group-rules/%s' % security_group_rule_id
         return self.show_resource(uri, **fields)
@@ -45,7 +45,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-security-group-rules
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-security-group-rules
         """
         uri = '/security-group-rules'
         return self.list_resources(uri, **filters)
diff --git a/tempest/lib/services/network/security_groups_client.py b/tempest/lib/services/network/security_groups_client.py
index 4664432..b641839 100644
--- a/tempest/lib/services/network/security_groups_client.py
+++ b/tempest/lib/services/network/security_groups_client.py
@@ -21,7 +21,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-security-group
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-security-group
         """
         uri = '/security-groups'
         post_data = {'security_group': kwargs}
@@ -32,7 +32,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#update-security-group
+        https://docs.openstack.org/api-ref/network/v2/index.html#update-security-group
         """
         uri = '/security-groups/%s' % security_group_id
         post_data = {'security_group': kwargs}
@@ -43,7 +43,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-security-group
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-security-group
         """
         uri = '/security-groups/%s' % security_group_id
         return self.show_resource(uri, **fields)
@@ -53,7 +53,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#delete-security-group
+        https://docs.openstack.org/api-ref/network/v2/index.html#delete-security-group
         """
         uri = '/security-groups/%s' % security_group_id
         return self.delete_resource(uri)
@@ -63,7 +63,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-security-groups
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-security-groups
         """
         uri = '/security-groups'
         return self.list_resources(uri, **filters)
diff --git a/tempest/lib/services/network/subnetpools_client.py b/tempest/lib/services/network/subnetpools_client.py
index 1f6a464..635c449 100644
--- a/tempest/lib/services/network/subnetpools_client.py
+++ b/tempest/lib/services/network/subnetpools_client.py
@@ -22,7 +22,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-subnet-pools
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-subnet-pools
         """
         uri = '/subnetpools'
         return self.list_resources(uri, **filters)
@@ -32,7 +32,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-subnet-pool
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-subnet-pool
         """
         uri = '/subnetpools'
         post_data = {'subnetpool': kwargs}
@@ -43,7 +43,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-subnet-pool
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-subnet-pool
         """
         uri = '/subnetpools/%s' % subnetpool_id
         return self.show_resource(uri, **fields)
@@ -53,7 +53,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#update-subnet-pool
+        https://docs.openstack.org/api-ref/network/v2/index.html#update-subnet-pool
         """
         uri = '/subnetpools/%s' % subnetpool_id
         post_data = {'subnetpool': kwargs}
diff --git a/tempest/lib/services/network/subnets_client.py b/tempest/lib/services/network/subnets_client.py
index 9753b86..00dd423 100644
--- a/tempest/lib/services/network/subnets_client.py
+++ b/tempest/lib/services/network/subnets_client.py
@@ -20,7 +20,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#create-subnet
+        https://docs.openstack.org/api-ref/network/v2/index.html#create-subnet
         """
         uri = '/subnets'
         post_data = {'subnet': kwargs}
@@ -31,7 +31,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#update-subnet
+        https://docs.openstack.org/api-ref/network/v2/index.html#update-subnet
         """
         uri = '/subnets/%s' % subnet_id
         post_data = {'subnet': kwargs}
@@ -42,7 +42,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#show-subnet-details
+        https://docs.openstack.org/api-ref/network/v2/index.html#show-subnet-details
         """
         uri = '/subnets/%s' % subnet_id
         return self.show_resource(uri, **fields)
@@ -56,7 +56,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#list-subnets
+        https://docs.openstack.org/api-ref/network/v2/index.html#list-subnets
         """
         uri = '/subnets'
         return self.list_resources(uri, **filters)
@@ -66,7 +66,7 @@
 
         For a full list of available parameters, please refer to the official
         API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#bulk-create-subnet
+        https://docs.openstack.org/api-ref/network/v2/index.html#bulk-create-subnet
         """
         uri = '/subnets'
         return self.create_resource(uri, kwargs)
diff --git a/tempest/lib/services/network/tags_client.py b/tempest/lib/services/network/tags_client.py
index c1ad00b..71e17c7 100644
--- a/tempest/lib/services/network/tags_client.py
+++ b/tempest/lib/services/network/tags_client.py
@@ -25,7 +25,7 @@
         """Adds a tag on the resource.
 
         For more information, please refer to the official API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#add-a-tag
+        https://docs.openstack.org/api-ref/network/v2/index.html#add-a-tag
         """
         uri = '/%s/%s/tags/%s' % (resource_type, resource_id, tag)
         return self.update_resource(
@@ -36,7 +36,7 @@
         """Confirm that a given tag is set on the resource.
 
         For more information, please refer to the official API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#confirm-a-tag
+        https://docs.openstack.org/api-ref/network/v2/index.html#confirm-a-tag
         """
         # TODO(felipemonteiro): Use the "check_resource" method in
         # ``BaseNetworkClient`` once it has been implemented.
@@ -50,7 +50,7 @@
         """Replace all tags on the resource.
 
         For more information, please refer to the official API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#replace-all-tags
+        https://docs.openstack.org/api-ref/network/v2/index.html#replace-all-tags
         """
         uri = '/%s/%s/tags' % (resource_type, resource_id)
         put_body = {"tags": tags}
@@ -60,7 +60,7 @@
         """Removes a tag on the resource.
 
         For more information, please refer to the official API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#remove-a-tag
+        https://docs.openstack.org/api-ref/network/v2/index.html#remove-a-tag
         """
         uri = '/%s/%s/tags/%s' % (resource_type, resource_id, tag)
         return self.delete_resource(uri)
@@ -69,7 +69,7 @@
         """Removes all tags on the resource.
 
         For more information, please refer to the official API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#remove-all-tags
+        https://docs.openstack.org/api-ref/network/v2/index.html#remove-all-tags
         """
         uri = '/%s/%s/tags' % (resource_type, resource_id)
         return self.delete_resource(uri)
@@ -78,7 +78,7 @@
         """Retrieves the tags for a resource.
 
         For more information, please refer to the official API reference:
-        https://docs.openstack.org/api-ref/networking/v2/index.html#obtain-tag-list
+        https://docs.openstack.org/api-ref/network/v2/index.html#obtain-tag-list
         """
         uri = '/%s/%s/tags' % (resource_type, resource_id)
         return self.list_resources(uri)
diff --git a/tempest/lib/services/volume/v3/capabilities_client.py b/tempest/lib/services/volume/v3/capabilities_client.py
index ac2cd02..dc850a8 100644
--- a/tempest/lib/services/volume/v3/capabilities_client.py
+++ b/tempest/lib/services/volume/v3/capabilities_client.py
@@ -15,6 +15,7 @@
 
 from oslo_serialization import jsonutils as json
 
+from tempest.lib.api_schema.response.volume import capabilities as schema
 from tempest.lib.common import rest_client
 
 
@@ -30,5 +31,5 @@
         url = 'capabilities/%s' % host
         resp, body = self.get(url)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.show_backend_capabilities, resp, body)
         return rest_client.ResponseBody(resp, body)
diff --git a/tempest/lib/services/volume/v3/extensions_client.py b/tempest/lib/services/volume/v3/extensions_client.py
index 45b7a56..f1fe5c9 100644
--- a/tempest/lib/services/volume/v3/extensions_client.py
+++ b/tempest/lib/services/volume/v3/extensions_client.py
@@ -15,6 +15,7 @@
 
 from oslo_serialization import jsonutils as json
 
+from tempest.lib.api_schema.response.volume import extensions as schema
 from tempest.lib.common import rest_client
 
 
@@ -25,5 +26,5 @@
         url = 'extensions'
         resp, body = self.get(url)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.list_extensions, resp, body)
         return rest_client.ResponseBody(resp, body)
diff --git a/tempest/lib/services/volume/v3/hosts_client.py b/tempest/lib/services/volume/v3/hosts_client.py
index c95d2d2..019a852 100644
--- a/tempest/lib/services/volume/v3/hosts_client.py
+++ b/tempest/lib/services/volume/v3/hosts_client.py
@@ -16,6 +16,7 @@
 from oslo_serialization import jsonutils as json
 from six.moves.urllib import parse as urllib
 
+from tempest.lib.api_schema.response.volume import hosts as schema
 from tempest.lib.common import rest_client
 
 
@@ -35,13 +36,13 @@
 
         resp, body = self.get(url)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.list_hosts, resp, body)
         return rest_client.ResponseBody(resp, body)
 
     def show_host(self, host_name):
         """Show host details."""
         url = 'os-hosts/%s' % host_name
         resp, body = self.get(url)
-        self.expected_success(200, resp.status)
         body = json.loads(body)
+        self.validate_response(schema.show_host, resp, body)
         return rest_client.ResponseBody(resp, body)
diff --git a/tempest/lib/services/volume/v3/messages_client.py b/tempest/lib/services/volume/v3/messages_client.py
index 47538cd..b770fac 100644
--- a/tempest/lib/services/volume/v3/messages_client.py
+++ b/tempest/lib/services/volume/v3/messages_client.py
@@ -15,6 +15,7 @@
 
 from oslo_serialization import jsonutils as json
 
+from tempest.lib.api_schema.response.volume import messages as schema
 from tempest.lib.common import rest_client
 from tempest.lib import exceptions as lib_exc
 from tempest.lib.services.volume import base_client
@@ -28,7 +29,7 @@
         url = 'messages/%s' % str(message_id)
         resp, body = self.get(url)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.show_message, resp, body)
         return rest_client.ResponseBody(resp, body)
 
     def list_messages(self):
@@ -36,14 +37,14 @@
         url = 'messages'
         resp, body = self.get(url)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.list_messages, resp, body)
         return rest_client.ResponseBody(resp, body)
 
     def delete_message(self, message_id):
         """Delete a single message."""
         url = 'messages/%s' % str(message_id)
         resp, body = self.delete(url)
-        self.expected_success(204, resp.status)
+        self.validate_response(schema.delete_message, resp, body)
         return rest_client.ResponseBody(resp, body)
 
     def is_resource_deleted(self, id):
diff --git a/tempest/lib/services/volume/v3/services_client.py b/tempest/lib/services/volume/v3/services_client.py
index c4a511c..8bc82c9 100644
--- a/tempest/lib/services/volume/v3/services_client.py
+++ b/tempest/lib/services/volume/v3/services_client.py
@@ -16,6 +16,7 @@
 from oslo_serialization import jsonutils as json
 from six.moves.urllib import parse as urllib
 
+from tempest.lib.api_schema.response.volume import services as schema
 from tempest.lib.common import rest_client
 
 
@@ -35,7 +36,7 @@
 
         resp, body = self.get(url)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.list_services, resp, body)
         return rest_client.ResponseBody(resp, body)
 
     def enable_service(self, **kwargs):
@@ -48,7 +49,7 @@
         put_body = json.dumps(kwargs)
         resp, body = self.put('os-services/enable', put_body)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.enable_service, resp, body)
         return rest_client.ResponseBody(resp, body)
 
     def disable_service(self, **kwargs):
@@ -61,7 +62,7 @@
         put_body = json.dumps(kwargs)
         resp, body = self.put('os-services/disable', put_body)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.disable_service, resp, body)
         return rest_client.ResponseBody(resp, body)
 
     def disable_log_reason(self, **kwargs):
@@ -74,7 +75,7 @@
         put_body = json.dumps(kwargs)
         resp, body = self.put('os-services/disable-log-reason', put_body)
         body = json.loads(body)
-        self.expected_success(200, resp.status)
+        self.validate_response(schema.disable_log_reason, resp, body)
         return rest_client.ResponseBody(resp, body)
 
     def freeze_host(self, **kwargs):
@@ -85,8 +86,8 @@
         https://docs.openstack.org/api-ref/block-storage/v3/#freeze-a-cinder-backend-host
         """
         put_body = json.dumps(kwargs)
-        resp, _ = self.put('os-services/freeze', put_body)
-        self.expected_success(200, resp.status)
+        resp, body = self.put('os-services/freeze', put_body)
+        self.validate_response(schema.freeze_host, resp, body)
         return rest_client.ResponseBody(resp)
 
     def thaw_host(self, **kwargs):
@@ -97,6 +98,6 @@
         https://docs.openstack.org/api-ref/block-storage/v3/#thaw-a-cinder-backend-host
         """
         put_body = json.dumps(kwargs)
-        resp, _ = self.put('os-services/thaw', put_body)
-        self.expected_success(200, resp.status)
+        resp, body = self.put('os-services/thaw', put_body)
+        self.validate_response(schema.thaw_host, resp, body)
         return rest_client.ResponseBody(resp)
diff --git a/tempest/lib/services/volume/v3/snapshot_manage_client.py b/tempest/lib/services/volume/v3/snapshot_manage_client.py
index 43fd328..a9e1f74 100644
--- a/tempest/lib/services/volume/v3/snapshot_manage_client.py
+++ b/tempest/lib/services/volume/v3/snapshot_manage_client.py
@@ -22,7 +22,12 @@
     """Snapshot manage client."""
 
     def manage_snapshot(self, **kwargs):
-        """Manage a snapshot."""
+        """Manage a snapshot.
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/block-storage/v3/index.html#manage-an-existing-snapshot
+        """
         post_body = json.dumps({'snapshot': kwargs})
         url = 'os-snapshot-manage'
         resp, body = self.post(url, post_body)
diff --git a/tempest/lib/services/volume/v3/versions_client.py b/tempest/lib/services/volume/v3/versions_client.py
index 29c3fb0..fc8e92f 100644
--- a/tempest/lib/services/volume/v3/versions_client.py
+++ b/tempest/lib/services/volume/v3/versions_client.py
@@ -12,6 +12,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import os
 import time
 
 from oslo_serialization import jsonutils as json
@@ -45,3 +46,17 @@
         body = json.loads(body)
         self.validate_response(schema.list_versions, resp, body)
         return rest_client.ResponseBody(resp, body)
+
+    def show_version(self, version):
+        """Show API version details
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/block-storage/v3/#show-api-v3-details
+        """
+
+        version_url = os.path.join(self._get_base_version_url(), version)
+        resp, body = self.get(version_url)
+        body = json.loads(body)
+        self.validate_response(schema.volume_api_version_details, resp, body)
+        return rest_client.ResponseBody(resp, body)
diff --git a/tempest/lib/services/volume/v3/volumes_client.py b/tempest/lib/services/volume/v3/volumes_client.py
index e60382a..14a3c48 100644
--- a/tempest/lib/services/volume/v3/volumes_client.py
+++ b/tempest/lib/services/volume/v3/volumes_client.py
@@ -142,7 +142,12 @@
         return rest_client.ResponseBody(resp, body)
 
     def upload_volume(self, volume_id, **kwargs):
-        """Uploads a volume in Glance."""
+        """Uploads a volume in Glance.
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/block-storage/v3/index.html#upload-volume-to-image
+        """
         post_body = json.dumps({'os-volume_upload_image': kwargs})
         url = 'volumes/%s/action' % (volume_id)
         resp, body = self.post(url, post_body)
@@ -248,7 +253,12 @@
         return rest_client.ResponseBody(resp, body)
 
     def update_volume_readonly(self, volume_id, **kwargs):
-        """Update the Specified Volume readonly."""
+        """Update the Specified Volume readonly.
+
+        For a full list of available parameters, please refer to the official
+        API reference:
+        https://docs.openstack.org/api-ref/block-storage/v3/index.html#updates-volume-read-only-access-mode-flag
+        """
         post_body = json.dumps({'os-update_readonly_flag': kwargs})
         url = 'volumes/%s/action' % (volume_id)
         resp, body = self.post(url, post_body)
diff --git a/tempest/scenario/test_network_advanced_server_ops.py b/tempest/scenario/test_network_advanced_server_ops.py
index 5f6dae8..f03e9de 100644
--- a/tempest/scenario/test_network_advanced_server_ops.py
+++ b/tempest/scenario/test_network_advanced_server_ops.py
@@ -200,7 +200,8 @@
             self.assertEqual(resize_flavor, server['flavor']['id'])
         else:
             flavor = self.flavors_client.show_flavor(resize_flavor)['flavor']
-            for key in ['original_name', 'ram', 'vcpus', 'disk']:
+            self.assertEqual(flavor['name'], server['original_name'])
+            for key in ['ram', 'vcpus', 'disk']:
                 self.assertEqual(flavor[key], server['flavor'][key])
         self._wait_server_status_and_check_network_connectivity(
             server, keypair, floating_ip)
diff --git a/tempest/tests/lib/services/volume/v3/test_group_types_client.py b/tempest/tests/lib/services/volume/v3/test_group_types_client.py
index a333b81..8b853d7 100644
--- a/tempest/tests/lib/services/volume/v3/test_group_types_client.py
+++ b/tempest/tests/lib/services/volume/v3/test_group_types_client.py
@@ -22,10 +22,13 @@
 class TestGroupTypesClient(base.BaseServiceTest):
     FAKE_CREATE_GROUP_TYPE = {
         "group_type": {
-            "name": "group-type-001",
-            "description": "Test group type 1",
-            "group_specs": {},
+            "id": "6685584b-1eac-4da6-b5c3-555430cf68ff",
+            "name": "grp-type-001",
+            "description": "group type 001",
             "is_public": True,
+            "group_specs": {
+                "consistent_group_snapshot_enabled": "<is> False"
+            }
         }
     }
 
@@ -35,7 +38,6 @@
             "name": "group-type-001",
             "description": "Test group type 1",
             "is_public": True,
-            "created_at": "20127-06-20T03:50:07Z",
             "group_specs": {},
         }
     }
@@ -57,24 +59,27 @@
                 "name": "group-type-001",
                 "description": "Test group type 1",
                 "is_public": True,
-                "created_at": "2017-06-20T03:50:07Z",
-                "group_specs": {},
+                "group_specs": {
+                    "consistent_group_snapshot_enabled": "<is> False"
+                }
             },
             {
                 "id": "e479997c-650b-40a4-9dfe-77655818b0d2",
                 "name": "group-type-002",
                 "description": "Test group type 2",
                 "is_public": True,
-                "created_at": "2017-06-19T01:52:47Z",
-                "group_specs": {},
+                "group_specs": {
+                    "consistent_group_snapshot_enabled": "<is> False"
+                }
             },
             {
                 "id": "c5c4769e-213c-40a6-a568-8e797bb691d4",
                 "name": "group-type-003",
                 "description": "Test group type 3",
                 "is_public": True,
-                "created_at": "2017-06-18T06:34:32Z",
-                "group_specs": {},
+                "group_specs": {
+                    "consistent_group_snapshot_enabled": "<is> False"
+                }
             }
         ]
     }
@@ -140,15 +145,12 @@
 
     def _test_update_group_types(self, bytes_body=False):
         resp_body = copy.deepcopy(self.FAKE_INFO_GROUP_TYPE)
-        resp_body['group_type'].pop('created_at')
-
         self.check_service_client_function(
             self.client.update_group_type,
             'tempest.lib.common.rest_client.RestClient.put',
             resp_body,
             bytes_body,
-            group_type_id="3fbbcccf-d058-4502-8844-6feeffdf4cb5",
-            name='updated-group-type-name')
+            group_type_id="3fbbcccf-d058-4502-8844-6feeffdf4cb5")
 
     def _test_create_or_update_group_type_specs(self, bytes_body=False):
         group_specs = self.FAKE_CREATE_GROUP_TYPE_SPECS['group_specs']
diff --git a/tempest/tests/lib/services/volume/v3/test_groups_client.py b/tempest/tests/lib/services/volume/v3/test_groups_client.py
index 918e958..5a5ae88 100644
--- a/tempest/tests/lib/services/volume/v3/test_groups_client.py
+++ b/tempest/tests/lib/services/volume/v3/test_groups_client.py
@@ -20,27 +20,22 @@
 class TestGroupsClient(base.BaseServiceTest):
     FAKE_CREATE_GROUP = {
         "group": {
-            "name": "group-001",
-            "description": "Test group 1",
-            "group_type": "0e58433f-d108-4bf3-a22c-34e6b71ef86b",
-            "volume_types": ["2103099d-7cc3-4e52-a2f1-23a5284416f3"],
-            "availability_zone": "az1",
+            "id": "6f519a48-3183-46cf-a32f-41815f816666",
+            "name": "first_group"
         }
     }
 
     FAKE_CREATE_GROUP_FROM_GROUP_SNAPSHOT = {
-        "create-from-src": {
-            "name": "group-002",
-            "description": "Test group 2",
-            "group_snapshot_id": "79c9afdb-7e46-4d71-9249-1f022886963c",
+        "group": {
+            "id": "6f519a48-3183-46cf-a32f-41815f816668",
+            "name": "first_group"
         }
     }
 
     FAKE_CREATE_GROUP_FROM_GROUP = {
-        "create-from-src": {
-            "name": "group-003",
-            "description": "Test group 3",
-            "source_group_id": "e92f9dc7-0b20-492d-8ab2-3ad8fdac270e",
+        "group": {
+            "id": "6f519a48-3183-46cf-a32f-41815f816667",
+            "name": "other_group"
         }
     }
 
diff --git a/tempest/tests/lib/services/volume/v3/test_hosts_client.py b/tempest/tests/lib/services/volume/v3/test_hosts_client.py
index 09bc0b1..8033e38 100644
--- a/tempest/tests/lib/services/volume/v3/test_hosts_client.py
+++ b/tempest/tests/lib/services/volume/v3/test_hosts_client.py
@@ -48,7 +48,7 @@
                     "total_volume_gb": "2",
                     "total_snapshot_gb": "0",
                     "project": "(total)",
-                    "host": "fake-host",
+                    "host": "fake-host@rbd",
                     "snapshot_count": "0"
                 }
             },
@@ -58,7 +58,7 @@
                     "total_volume_gb": "2",
                     "total_snapshot_gb": "0",
                     "project": "f21a9c86d7114bf99c711f4874d80474",
-                    "host": "fake-host",
+                    "host": "fake-host@lvm",
                     "snapshot_count": "0"
                 }
             }
diff --git a/tempest/tests/lib/services/volume/v3/test_versions_client.py b/tempest/tests/lib/services/volume/v3/test_versions_client.py
index 9627b9a..b9abd45 100644
--- a/tempest/tests/lib/services/volume/v3/test_versions_client.py
+++ b/tempest/tests/lib/services/volume/v3/test_versions_client.py
@@ -69,6 +69,27 @@
         ]
     }
 
+    FAKE_VERSION_DETAILS = {
+        "versions": [
+            {
+                "id": "v3.0",
+                "links": [
+                    {"href": "https://docs.openstack.org/",
+                     "type": "text/html", "rel": "describedby"},
+                    {"href": "http://127.0.0.1:44895/v3/", "rel": "self"}
+                ],
+                "media-types": [
+                    {"base": "application/json",
+                     "type": "application/vnd.openstack.volume+json;version=3"}
+                ],
+                "min_version": "3.0",
+                "status": "CURRENT",
+                "updated": "2018-07-17T00:00:00Z",
+                "version": "3.59"
+            }
+        ]
+    }
+
     def setUp(self):
         super(TestVersionsClient, self).setUp()
         fake_auth = fake_auth_provider.FakeAuthProvider()
@@ -89,3 +110,17 @@
 
     def test_list_versions_with_bytes_body(self):
         self._test_list_versions(bytes_body=True)
+
+    def _test_show_version(self, bytes_body=False):
+        self.check_service_client_function(
+            self.client.show_version,
+            'tempest.lib.common.rest_client.RestClient.get',
+            self.FAKE_VERSION_DETAILS,
+            bytes_body,
+            200, version='v3')
+
+    def test_show_version_details_with_str_body(self):
+        self._test_show_version()
+
+    def test_show_version_details_with_bytes_body(self):
+        self._test_show_version(bytes_body=True)
diff --git a/tools/generate-tempest-plugins-list.py b/tools/generate-tempest-plugins-list.py
index f1003a0..d4ffd01 100644
--- a/tools/generate-tempest-plugins-list.py
+++ b/tools/generate-tempest-plugins-list.py
@@ -27,14 +27,8 @@
 import re
 import sys
 
-try:
-    # For Python 3.0 and later
-    from urllib.error import HTTPError
-    import urllib.request as urllib
-except ImportError:
-    # Fall back to Python 2's urllib2
-    import urllib2 as urllib
-    from urllib2 import HTTPError
+import urllib3
+from urllib3.util import retry
 
 # List of projects having tempest plugin stale or unmaintained for a long time
 # (6 months or more)
@@ -56,7 +50,6 @@
     # https://review.opendev.org/#/c/637718/
     'openstack/neutron-vpnaas',  # https://review.opendev.org/#/c/637719/
     'x/valet',  # https://review.opendev.org/#/c/638339/
-    'x/ranger-tempest-plugin',  # It looks this doesn't work correctly yet.
 ]
 
 url = 'https://review.opendev.org/projects/'
@@ -69,23 +62,21 @@
   },
 '''
 
+http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED')
+retries = retry.Retry(status_forcelist=[500], backoff_factor=1.0)
 
-# Rather than returning a 404 for a nonexistent file, cgit delivers a
-# 0-byte response to a GET request.  It also does not provide a
-# Content-Length in a HEAD response, so the way we tell if a file exists
-# is to check the length of the entire GET response body.
+
 def has_tempest_plugin(proj):
     try:
-        r = urllib.urlopen(
-            "https://opendev.org/%s/raw/branch/"
-            "master/setup.cfg" % proj)
-    except HTTPError as err:
-        if err.code == 404:
+        r = http.request('GET', "https://opendev.org/%s/raw/branch/"
+                         "master/setup.cfg" % proj, retries=retries)
+        if r.status == 404:
             return False
+    except urllib3.exceptions.MaxRetryError as err:
         # We should not ignore non 404 errors.
         raise err
     p = re.compile(r'^tempest\.test_plugins', re.M)
-    if p.findall(r.read().decode('utf-8')):
+    if p.findall(r.data.decode('utf-8')):
         return True
     else:
         False
@@ -98,11 +89,11 @@
     # So, this exits here.
     sys.exit()
 
-r = urllib.urlopen(url)
+r = http.request('GET', url, retries=retries)
 # Gerrit prepends 4 garbage octets to the JSON, in order to counter
 # cross-site scripting attacks.  Therefore we must discard it so the
 # json library won't choke.
-content = r.read().decode('utf-8')[4:]
+content = r.data.decode('utf-8')[4:]
 projects = sorted(json.loads(content))
 
 # Retrieve projects having no deployment tool repo (such as deb,
diff --git a/tools/generate-tempest-plugins-list.sh b/tools/generate-tempest-plugins-list.sh
index b6a7c77..961cd09 100755
--- a/tools/generate-tempest-plugins-list.sh
+++ b/tools/generate-tempest-plugins-list.sh
@@ -69,7 +69,7 @@
     i=0
     for plugin in $1; do
         i=$((i+1))
-        giturl="https://opendev.org/openstack/${plugin}"
+        giturl="https://opendev.org/${plugin}"
         printf "%-3s %-${name_col_len}s %s\n" "$i" "${plugin}" "${giturl}"
     done
 
diff --git a/tools/verify-ipv6-only-deployments.sh b/tools/verify-ipv6-only-deployments.sh
index 90807a3..2596395 100755
--- a/tools/verify-ipv6-only-deployments.sh
+++ b/tools/verify-ipv6-only-deployments.sh
@@ -15,10 +15,14 @@
 source $TOP_DIR/openrc admin admin
 
 function verify_devstack_ipv6_setting {
-    local _service_host=$(echo $SERVICE_HOST | tr -d [])
-    local _host_ipv6=$(echo $HOST_IPV6 | tr -d [])
-    local _service_listen_address=$(echo $SERVICE_LISTEN_ADDRESS | tr -d [])
-    local _service_local_host=$(echo $SERVICE_LOCAL_HOST | tr -d [])
+    local _service_host=''
+    _service_host=$(echo $SERVICE_HOST | tr -d [])
+    local _host_ipv6=''
+    _host_ipv6=$(echo $HOST_IPV6 | tr -d [])
+    local _service_listen_address=''
+    _service_listen_address=$(echo $SERVICE_LISTEN_ADDRESS | tr -d [])
+    local _service_local_host=''
+    _service_local_host=$(echo $SERVICE_LOCAL_HOST | tr -d [])
     if [[ "$SERVICE_IP_VERSION" != 6 ]]; then
         echo $SERVICE_IP_VERSION "SERVICE_IP_VERSION is not set to 6 which is must for devstack to deploy services with IPv6 address."
         exit 1
@@ -61,9 +65,11 @@
     local all_ipv6=True
     endpoints=$(openstack endpoint list -f value -c URL)
     for endpoint in ${endpoints}; do
-        local endpoint_address=$(echo "$endpoint" | awk -F/ '{print $3}' | awk -F] '{print $1}')
+        local endpoint_address=''
+        endpoint_address=$(echo "$endpoint" | awk -F/ '{print $3}' | awk -F] '{print $1}')
         endpoint_address=$(echo $endpoint_address | tr -d [])
-        local is_endpoint_ipv6=$(python3 -c 'import oslo_utils.netutils as nutils; print(nutils.is_valid_ipv6("'$endpoint_address'"))')
+        local is_endpoint_ipv6=''
+        is_endpoint_ipv6=$(python3 -c 'import oslo_utils.netutils as nutils; print(nutils.is_valid_ipv6("'$endpoint_address'"))')
         if [[ "$is_endpoint_ipv6" != "True" ]]; then
             all_ipv6=False
             echo $endpoint ": This is not ipv6 endpoint which means corresponding service is not listening on IPv6 address."
diff --git a/tox.ini b/tox.ini
index b6ea143..ca4bb3f 100644
--- a/tox.ini
+++ b/tox.ini
@@ -327,7 +327,7 @@
          -not \( -type d -name .?\* -prune \) \
          -type f                              \
          -name \*.sh                          \
-         -print0 | xargs -0 bashate -v"
+         -print0 | xargs -0 bashate -v -eE005,E042 -i E006"
 
 [testenv:pip-check-reqs]
 # Do not install test-requirements as that will pollute the virtualenv for