Merge "Change alarm client name and tenant name"
diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst
index 5bd9176..b617b22 100644
--- a/releasenotes/source/index.rst
+++ b/releasenotes/source/index.rst
@@ -5,6 +5,7 @@
  .. toctree::
     :maxdepth: 1
 
+    v11.0.0
     v10.0.0
     unreleased
 
diff --git a/releasenotes/source/v11.0.0.rst b/releasenotes/source/v11.0.0.rst
new file mode 100644
index 0000000..84b145d
--- /dev/null
+++ b/releasenotes/source/v11.0.0.rst
@@ -0,0 +1,6 @@
+=====================
+v11.0.0 Release Notes
+=====================
+
+.. release-notes:: 11.0.0 Release Notes
+   :version: 11.0.0
diff --git a/requirements.txt b/requirements.txt
index 9dd57a9..7c426e6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -12,14 +12,14 @@
 testrepository>=0.0.18 # Apache-2.0/BSD
 pyOpenSSL>=0.14 # Apache-2.0
 oslo.concurrency>=3.5.0 # Apache-2.0
-oslo.config>=3.7.0 # Apache-2.0
+oslo.config>=3.9.0 # Apache-2.0
 oslo.i18n>=2.1.0 # Apache-2.0
 oslo.log>=1.14.0 # Apache-2.0
 oslo.serialization>=1.10.0 # Apache-2.0
 oslo.utils>=3.5.0 # Apache-2.0
 six>=1.9.0 # MIT
 iso8601>=0.1.9 # MIT
-fixtures>=1.3.1 # Apache-2.0/BSD
+fixtures<2.0,>=1.3.1 # Apache-2.0/BSD
 testscenarios>=0.4 # Apache-2.0/BSD
 PyYAML>=3.1.0 # MIT
 stevedore>=1.5.0 # Apache-2.0
diff --git a/tempest/api/baremetal/admin/test_nodes.py b/tempest/api/baremetal/admin/test_nodes.py
index 8cc4d05..2c44665 100644
--- a/tempest/api/baremetal/admin/test_nodes.py
+++ b/tempest/api/baremetal/admin/test_nodes.py
@@ -138,14 +138,14 @@
         body = self.client.get_node_boot_device(self.node['uuid'])
         self.assertIn('boot_device', body)
         self.assertIn('persistent', body)
-        self.assertTrue(isinstance(body['boot_device'], six.string_types))
-        self.assertTrue(isinstance(body['persistent'], bool))
+        self.assertIsInstance(body['boot_device'], six.string_types)
+        self.assertIsInstance(body['persistent'], bool)
 
     @test.idempotent_id('3622bc6f-3589-4bc2-89f3-50419c66b133')
     def test_get_node_supported_boot_devices(self):
         body = self.client.get_node_supported_boot_devices(self.node['uuid'])
         self.assertIn('supported_boot_devices', body)
-        self.assertTrue(isinstance(body['supported_boot_devices'], list))
+        self.assertIsInstance(body['supported_boot_devices'], list)
 
     @test.idempotent_id('f63b6288-1137-4426-8cfe-0d5b7eb87c06')
     def test_get_console(self):
diff --git a/tempest/api/compute/servers/test_servers_negative.py b/tempest/api/compute/servers/test_servers_negative.py
index 0df6ead..8f0e430 100644
--- a/tempest/api/compute/servers/test_servers_negative.py
+++ b/tempest/api/compute/servers/test_servers_negative.py
@@ -29,8 +29,6 @@
 
 class ServersNegativeTestJSON(base.BaseV2ComputeTest):
 
-    credentials = ['primary', 'alt']
-
     def setUp(self):
         super(ServersNegativeTestJSON, self).setUp()
         try:
@@ -47,7 +45,6 @@
     def setup_clients(cls):
         super(ServersNegativeTestJSON, cls).setup_clients()
         cls.client = cls.servers_client
-        cls.alt_client = cls.os_alt.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -271,16 +268,6 @@
                           self.server_id, name=new_name)
 
     @test.attr(type=['negative'])
-    @test.idempotent_id('543d84c1-dd2e-4c6d-8cb2-b9da0efaa384')
-    def test_update_server_of_another_tenant(self):
-        # Update name of a server that belongs to another tenant
-
-        new_name = self.server_id + '_new'
-        self.assertRaises(lib_exc.NotFound,
-                          self.alt_client.update_server, self.server_id,
-                          name=new_name)
-
-    @test.attr(type=['negative'])
     @test.idempotent_id('5c8e244c-dada-4590-9944-749c455b431f')
     def test_update_server_name_length_exceeds_256(self):
         # Update name of server exceed the name length limit
@@ -301,14 +288,6 @@
                           nonexistent_server)
 
     @test.attr(type=['negative'])
-    @test.idempotent_id('5c75009d-3eea-423e-bea3-61b09fd25f9c')
-    def test_delete_a_server_of_another_tenant(self):
-        # Delete a server that belongs to another tenant
-        self.assertRaises(lib_exc.NotFound,
-                          self.alt_client.delete_server,
-                          self.server_id)
-
-    @test.attr(type=['negative'])
     @test.idempotent_id('75f79124-277c-45e6-a373-a1d6803f4cc4')
     def test_delete_server_pass_negative_id(self):
         # Pass an invalid string parameter to delete server
@@ -519,3 +498,45 @@
         self.assertRaises(lib_exc.Conflict,
                           self.client.unshelve_server,
                           self.server_id)
+
+
+class ServersNegativeTestMultiTenantJSON(base.BaseV2ComputeTest):
+
+    credentials = ['primary', 'alt']
+
+    def setUp(self):
+        super(ServersNegativeTestMultiTenantJSON, self).setUp()
+        try:
+            waiters.wait_for_server_status(self.client, self.server_id,
+                                           'ACTIVE')
+        except Exception:
+            self.__class__.server_id = self.rebuild_server(self.server_id)
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServersNegativeTestMultiTenantJSON, cls).setup_clients()
+        cls.alt_client = cls.os_alt.servers_client
+
+    @classmethod
+    def resource_setup(cls):
+        super(ServersNegativeTestMultiTenantJSON, cls).resource_setup()
+        server = cls.create_test_server(wait_until='ACTIVE')
+        cls.server_id = server['id']
+
+    @test.attr(type=['negative'])
+    @test.idempotent_id('543d84c1-dd2e-4c6d-8cb2-b9da0efaa384')
+    def test_update_server_of_another_tenant(self):
+        # Update name of a server that belongs to another tenant
+
+        new_name = self.server_id + '_new'
+        self.assertRaises(lib_exc.NotFound,
+                          self.alt_client.update_server, self.server_id,
+                          name=new_name)
+
+    @test.attr(type=['negative'])
+    @test.idempotent_id('5c75009d-3eea-423e-bea3-61b09fd25f9c')
+    def test_delete_a_server_of_another_tenant(self):
+        # Delete a server that belongs to another tenant
+        self.assertRaises(lib_exc.NotFound,
+                          self.alt_client.delete_server,
+                          self.server_id)
diff --git a/tempest/api/identity/admin/v3/test_groups.py b/tempest/api/identity/admin/v3/test_groups.py
index 010e4a0..a3ada21 100644
--- a/tempest/api/identity/admin/v3/test_groups.py
+++ b/tempest/api/identity/admin/v3/test_groups.py
@@ -20,12 +20,18 @@
 
 class GroupsV3TestJSON(base.BaseIdentityV3AdminTest):
 
+    @classmethod
+    def resource_setup(cls):
+        super(GroupsV3TestJSON, cls).resource_setup()
+        cls.data.setup_test_domain()
+
     @test.idempotent_id('2e80343b-6c81-4ac3-88c7-452f3e9d5129')
     def test_group_create_update_get(self):
         name = data_utils.rand_name('Group')
         description = data_utils.rand_name('Description')
         group = self.groups_client.create_group(
-            name=name, description=description)['group']
+            name=name, domain_id=self.data.domain['id'],
+            description=description)['group']
         self.addCleanup(self.groups_client.delete_group, group['id'])
         self.assertEqual(group['name'], name)
         self.assertEqual(group['description'], description)
@@ -47,7 +53,8 @@
         name = data_utils.rand_name('Group')
         old_description = data_utils.rand_name('Description')
         group = self.groups_client.create_group(
-            name=name, description=old_description)['group']
+            name=name, domain_id=self.data.domain['id'],
+            description=old_description)['group']
         self.addCleanup(self.groups_client.delete_group, group['id'])
 
         new_name = data_utils.rand_name('UpdateGroup')
@@ -61,7 +68,8 @@
     @test.idempotent_id('1598521a-2f36-4606-8df9-30772bd51339')
     def test_group_users_add_list_delete(self):
         name = data_utils.rand_name('Group')
-        group = self.groups_client.create_group(name=name)['group']
+        group = self.groups_client.create_group(
+            name=name, domain_id=self.data.domain['id'])['group']
         self.addCleanup(self.groups_client.delete_group, group['id'])
         # add user into group
         users = []
@@ -94,7 +102,8 @@
         groups = []
         for i in range(2):
             name = data_utils.rand_name('Group')
-            group = self.groups_client.create_group(name=name)['group']
+            group = self.groups_client.create_group(
+                name=name, domain_id=self.data.domain['id'])['group']
             groups.append(group)
             self.addCleanup(self.groups_client.delete_group, group['id'])
             self.groups_client.add_group_user(group['id'], user['id'])
@@ -112,7 +121,8 @@
             name = data_utils.rand_name('Group')
             description = data_utils.rand_name('Description')
             group = self.groups_client.create_group(
-                name=name, description=description)['group']
+                name=name, domain_id=self.data.domain['id'],
+                description=description)['group']
             self.addCleanup(self.groups_client.delete_group, group['id'])
             group_ids.append(group['id'])
         # List and Verify Groups
diff --git a/tempest/api_schema/response/__init__.py b/tempest/api_schema/response/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/api_schema/response/__init__.py
+++ /dev/null
diff --git a/tempest/api_schema/response/compute/__init__.py b/tempest/api_schema/response/compute/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/api_schema/response/compute/__init__.py
+++ /dev/null
diff --git a/tempest/api_schema/response/compute/v2_1/__init__.py b/tempest/api_schema/response/compute/v2_1/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/api_schema/response/compute/v2_1/__init__.py
+++ /dev/null
diff --git a/tempest/api_schema/response/compute/v2_1/keypairs.py b/tempest/api_schema/response/compute/v2_1/keypairs.py
deleted file mode 100644
index 9c04c79..0000000
--- a/tempest/api_schema/response/compute/v2_1/keypairs.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# Copyright 2014 NEC Corporation.  All rights reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-get_keypair = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'keypair': {
-                'type': 'object',
-                'properties': {
-                    'public_key': {'type': 'string'},
-                    'name': {'type': 'string'},
-                    'fingerprint': {'type': 'string'},
-                    'user_id': {'type': 'string'},
-                    'deleted': {'type': 'boolean'},
-                    'created_at': {'type': 'string'},
-                    'updated_at': {'type': ['string', 'null']},
-                    'deleted_at': {'type': ['string', 'null']},
-                    'id': {'type': 'integer'}
-
-                },
-                'additionalProperties': False,
-                # When we run the get keypair API, response body includes
-                # all the above mentioned attributes.
-                # But in Nova API sample file, response body includes only
-                # 'public_key', 'name' & 'fingerprint'. So only 'public_key',
-                # 'name' & 'fingerprint' are defined as 'required'.
-                'required': ['public_key', 'name', 'fingerprint']
-            }
-        },
-        'additionalProperties': False,
-        'required': ['keypair']
-    }
-}
-
-create_keypair = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'keypair': {
-                'type': 'object',
-                'properties': {
-                    'fingerprint': {'type': 'string'},
-                    'name': {'type': 'string'},
-                    'public_key': {'type': 'string'},
-                    'user_id': {'type': 'string'},
-                    'private_key': {'type': 'string'}
-                },
-                'additionalProperties': False,
-                # When create keypair API is being called with 'Public key'
-                # (Importing keypair) then, response body does not contain
-                # 'private_key' So it is not defined as 'required'
-                'required': ['fingerprint', 'name', 'public_key', 'user_id']
-            }
-        },
-        'additionalProperties': False,
-        'required': ['keypair']
-    }
-}
-
-delete_keypair = {
-    'status_code': [202],
-}
-
-list_keypairs = {
-    'status_code': [200],
-    'response_body': {
-        'type': 'object',
-        'properties': {
-            'keypairs': {
-                'type': 'array',
-                'items': {
-                    'type': 'object',
-                    'properties': {
-                        'keypair': {
-                            'type': 'object',
-                            'properties': {
-                                'public_key': {'type': 'string'},
-                                'name': {'type': 'string'},
-                                'fingerprint': {'type': 'string'}
-                            },
-                            'additionalProperties': False,
-                            'required': ['public_key', 'name', 'fingerprint']
-                        }
-                    },
-                    'additionalProperties': False,
-                    'required': ['keypair']
-                }
-            }
-        },
-        'additionalProperties': False,
-        'required': ['keypairs']
-    }
-}
diff --git a/tempest/clients.py b/tempest/clients.py
index 141d1c6..0eded8b 100644
--- a/tempest/clients.py
+++ b/tempest/clients.py
@@ -46,6 +46,7 @@
 from tempest.lib.services.compute.instance_usage_audit_log_client import \
     InstanceUsagesAuditLogClient
 from tempest.lib.services.compute.interfaces_client import InterfacesClient
+from tempest.lib.services.compute.keypairs_client import KeyPairsClient
 from tempest.lib.services.compute.limits_client import LimitsClient
 from tempest.lib.services.compute.migrations_client import MigrationsClient
 from tempest.lib.services.compute.networks_client import NetworksClient \
@@ -96,7 +97,6 @@
 from tempest import manager
 from tempest.services.baremetal.v1.json.baremetal_client import \
     BaremetalClient
-from tempest.services.compute.json.keypairs_client import KeyPairsClient
 from tempest.services.data_processing.v1_1.data_processing_client import \
     DataProcessingClient
 from tempest.services.database.json.flavors_client import \
diff --git a/tempest/hacking/checks.py b/tempest/hacking/checks.py
index f4b76e5..d1bc141 100644
--- a/tempest/hacking/checks.py
+++ b/tempest/hacking/checks.py
@@ -151,7 +151,7 @@
 
 def _common_service_clients_check(logical_line, physical_line, filename,
                                   ignored_list_file=None):
-    if 'tempest/services/' not in filename:
+    if not re.match('tempest/(lib/)?services/.*', filename):
         return False
 
     if ignored_list_file is not None:
diff --git a/tempest/api_schema/response/compute/v2_2/__init__.py b/tempest/lib/api_schema/response/compute/v2_2/__init__.py
similarity index 100%
rename from tempest/api_schema/response/compute/v2_2/__init__.py
rename to tempest/lib/api_schema/response/compute/v2_2/__init__.py
diff --git a/tempest/api_schema/response/compute/v2_2/keypairs.py b/tempest/lib/api_schema/response/compute/v2_2/keypairs.py
similarity index 95%
rename from tempest/api_schema/response/compute/v2_2/keypairs.py
rename to tempest/lib/api_schema/response/compute/v2_2/keypairs.py
index 5d8d24d..0bb7771 100644
--- a/tempest/api_schema/response/compute/v2_2/keypairs.py
+++ b/tempest/lib/api_schema/response/compute/v2_2/keypairs.py
@@ -14,7 +14,7 @@
 
 import copy
 
-from tempest.api_schema.response.compute.v2_1 import keypairs
+from tempest.lib.api_schema.response.compute.v2_1 import keypairs
 
 get_keypair = copy.deepcopy(keypairs.get_keypair)
 get_keypair['response_body']['properties']['keypair'][
diff --git a/tempest/lib/common/rest_client.py b/tempest/lib/common/rest_client.py
index 7d2eda0..d001d27 100644
--- a/tempest/lib/common/rest_client.py
+++ b/tempest/lib/common/rest_client.py
@@ -248,10 +248,10 @@
         :param str url: the relative url to send the post request to
         :param dict body: the request body
         :param dict headers: The headers to use for the request
-        :param dict extra_headers: If the headers returned by the get_headers()
-                                   method are to be used but additional headers
-                                   are needed in the request pass them in as a
-                                   dict
+        :param bool extra_headers: Boolean value than indicates if the headers
+                                   returned by the get_headers() method are to
+                                   be used but additional headers are needed in
+                                   the request pass them in as a dict.
         :return: a tuple with the first entry containing the response headers
                  and the second the response body
         :rtype: tuple
@@ -263,10 +263,10 @@
 
         :param str url: the relative url to send the post request to
         :param dict headers: The headers to use for the request
-        :param dict extra_headers: If the headers returned by the get_headers()
-                                   method are to be used but additional headers
-                                   are needed in the request pass them in as a
-                                   dict
+        :param bool extra_headers: Boolean value than indicates if the headers
+                                   returned by the get_headers() method are to
+                                   be used but additional headers are needed in
+                                   the request pass them in as a dict.
         :return: a tuple with the first entry containing the response headers
                  and the second the response body
         :rtype: tuple
@@ -279,10 +279,10 @@
         :param str url: the relative url to send the post request to
         :param dict headers: The headers to use for the request
         :param dict body: the request body
-        :param dict extra_headers: If the headers returned by the get_headers()
-                                   method are to be used but additional headers
-                                   are needed in the request pass them in as a
-                                   dict
+        :param bool extra_headers: Boolean value than indicates if the headers
+                                   returned by the get_headers() method are to
+                                   be used but additional headers are needed in
+                                   the request pass them in as a dict.
         :return: a tuple with the first entry containing the response headers
                  and the second the response body
         :rtype: tuple
@@ -295,10 +295,10 @@
         :param str url: the relative url to send the post request to
         :param dict body: the request body
         :param dict headers: The headers to use for the request
-        :param dict extra_headers: If the headers returned by the get_headers()
-                                   method are to be used but additional headers
-                                   are needed in the request pass them in as a
-                                   dict
+        :param bool extra_headers: Boolean value than indicates if the headers
+                                   returned by the get_headers() method are to
+                                   be used but additional headers are needed in
+                                   the request pass them in as a dict.
         :return: a tuple with the first entry containing the response headers
                  and the second the response body
         :rtype: tuple
@@ -311,10 +311,10 @@
         :param str url: the relative url to send the post request to
         :param dict body: the request body
         :param dict headers: The headers to use for the request
-        :param dict extra_headers: If the headers returned by the get_headers()
-                                   method are to be used but additional headers
-                                   are needed in the request pass them in as a
-                                   dict
+        :param bool extra_headers: Boolean value than indicates if the headers
+                                   returned by the get_headers() method are to
+                                   be used but additional headers are needed in
+                                   the request pass them in as a dict.
         :return: a tuple with the first entry containing the response headers
                  and the second the response body
         :rtype: tuple
@@ -326,10 +326,10 @@
 
         :param str url: the relative url to send the post request to
         :param dict headers: The headers to use for the request
-        :param dict extra_headers: If the headers returned by the get_headers()
-                                   method are to be used but additional headers
-                                   are needed in the request pass them in as a
-                                   dict
+        :param bool extra_headers: Boolean value than indicates if the headers
+                                   returned by the get_headers() method are to
+                                   be used but additional headers are needed in
+                                   the request pass them in as a dict.
         :return: a tuple with the first entry containing the response headers
                  and the second the response body
         :rtype: tuple
@@ -341,10 +341,10 @@
 
         :param str url: the relative url to send the post request to
         :param dict headers: The headers to use for the request
-        :param dict extra_headers: If the headers returned by the get_headers()
-                                   method are to be used but additional headers
-                                   are needed in the request pass them in as a
-                                   dict
+        :param bool extra_headers: Boolean value than indicates if the headers
+                                   returned by the get_headers() method are to
+                                   be used but additional headers are needed in
+                                   the request pass them in as a dict.
         :return: a tuple with the first entry containing the response headers
                  and the second the response body
         :rtype: tuple
@@ -576,10 +576,10 @@
 
         :param str method: The HTTP verb to use for the request
         :param str url: Relative url to send the request to
-        :param dict extra_headers: If specified without the headers kwarg the
-                                   headers sent with the request will be the
-                                   combination from the get_headers() method
-                                   and this kwarg
+        :param bool extra_headers: Boolean value than indicates if the headers
+                                   returned by the get_headers() method are to
+                                   be used but additional headers are needed in
+                                   the request pass them in as a dict.
         :param dict headers: Headers to use for the request if none are
                              specifed the headers returned from the
                              get_headers() method are used. If the request
@@ -620,7 +620,6 @@
             headers = self.get_headers()
         elif extra_headers:
             try:
-                headers = headers.copy()
                 headers.update(self.get_headers())
             except (ValueError, TypeError):
                 headers = self.get_headers()
diff --git a/tempest/lib/services/compute/flavors_client.py b/tempest/lib/services/compute/flavors_client.py
index 6869f02..e377c84 100644
--- a/tempest/lib/services/compute/flavors_client.py
+++ b/tempest/lib/services/compute/flavors_client.py
@@ -133,7 +133,9 @@
             resp, body)
         return rest_client.ResponseBody(resp, body)
 
-    def unset_flavor_extra_spec(self, flavor_id, key):
+    def unset_flavor_extra_spec(self, flavor_id, key):  # noqa
+        # NOTE: This noqa is for passing T111 check and we cannot rename
+        #       to keep backwards compatibility.
         """Unset extra Specs from the mentioned flavor."""
         resp, body = self.delete('flavors/%s/os-extra_specs/%s' %
                                  (flavor_id, key))
diff --git a/tempest/lib/services/compute/hosts_client.py b/tempest/lib/services/compute/hosts_client.py
index 0143765..16b5edd 100644
--- a/tempest/lib/services/compute/hosts_client.py
+++ b/tempest/lib/services/compute/hosts_client.py
@@ -61,7 +61,11 @@
         self.validate_response(schema.update_host, resp, body)
         return rest_client.ResponseBody(resp, body)
 
-    def startup_host(self, hostname):
+    def startup_host(self, hostname):  # noqa
+        # NOTE: This noqa is for passing T110 check and we cannot rename
+        #       to keep backwards compatibility. Actually, the root problem
+        #       of this is a wrong API design. GET operation should not change
+        #       resource status, but current API does that.
         """Startup a host."""
 
         resp, body = self.get("os-hosts/%s/startup" % hostname)
@@ -69,7 +73,11 @@
         self.validate_response(schema.startup_host, resp, body)
         return rest_client.ResponseBody(resp, body)
 
-    def shutdown_host(self, hostname):
+    def shutdown_host(self, hostname):  # noqa
+        # NOTE: This noqa is for passing T110 check and we cannot rename
+        #       to keep backwards compatibility. Actually, the root problem
+        #       of this is a wrong API design. GET operation should not change
+        #       resource status, but current API does that.
         """Shutdown a host."""
 
         resp, body = self.get("os-hosts/%s/shutdown" % hostname)
@@ -77,7 +85,11 @@
         self.validate_response(schema.shutdown_host, resp, body)
         return rest_client.ResponseBody(resp, body)
 
-    def reboot_host(self, hostname):
+    def reboot_host(self, hostname):  # noqa
+        # NOTE: This noqa is for passing T110 check and we cannot rename
+        #       to keep backwards compatibility. Actually, the root problem
+        #       of this is a wrong API design. GET operation should not change
+        #       resource status, but current API does that.
         """Reboot a host."""
 
         resp, body = self.get("os-hosts/%s/reboot" % hostname)
diff --git a/tempest/lib/services/compute/hypervisor_client.py b/tempest/lib/services/compute/hypervisor_client.py
index 5dcecc9..23c304e 100644
--- a/tempest/lib/services/compute/hypervisor_client.py
+++ b/tempest/lib/services/compute/hypervisor_client.py
@@ -63,7 +63,9 @@
         self.validate_response(schema.get_hypervisor_uptime, resp, body)
         return rest_client.ResponseBody(resp, body)
 
-    def search_hypervisor(self, hypervisor_name):
+    def search_hypervisor(self, hypervisor_name):  # noqa
+        # NOTE: This noqa is for passing T110 check and we cannot rename
+        #       to keep backwards compatibility.
         """Search specified hypervisor."""
         resp, body = self.get('os-hypervisors/%s/search' % hypervisor_name)
         body = json.loads(body)
diff --git a/tempest/lib/services/compute/keypairs_client.py b/tempest/lib/services/compute/keypairs_client.py
index 0361b9d..7b8e6b2 100644
--- a/tempest/lib/services/compute/keypairs_client.py
+++ b/tempest/lib/services/compute/keypairs_client.py
@@ -14,23 +14,36 @@
 #    under the License.
 
 from oslo_serialization import jsonutils as json
+from six.moves.urllib import parse as urllib
 
-from tempest.lib.api_schema.response.compute.v2_1 import keypairs as schema
+from tempest.lib.api_schema.response.compute.v2_1 import keypairs as schemav21
+from tempest.lib.api_schema.response.compute.v2_2 import keypairs as schemav22
 from tempest.lib.common import rest_client
 from tempest.lib.services.compute import base_compute_client
 
 
 class KeyPairsClient(base_compute_client.BaseComputeClient):
 
-    def list_keypairs(self):
-        resp, body = self.get("os-keypairs")
+    schema_versions_info = [{'min': None, 'max': '2.1', 'schema': schemav21},
+                            {'min': '2.2', 'max': None, 'schema': schemav22}]
+
+    def list_keypairs(self, **params):
+        url = 'os-keypairs'
+        if params:
+            url += '?%s' % urllib.urlencode(params)
+        resp, body = self.get(url)
         body = json.loads(body)
+        schema = self.get_schema(self.schema_versions_info)
         self.validate_response(schema.list_keypairs, resp, body)
         return rest_client.ResponseBody(resp, body)
 
-    def show_keypair(self, keypair_name):
-        resp, body = self.get("os-keypairs/%s" % keypair_name)
+    def show_keypair(self, keypair_name, **params):
+        url = "os-keypairs/%s" % keypair_name
+        if params:
+            url += '?%s' % urllib.urlencode(params)
+        resp, body = self.get(url)
         body = json.loads(body)
+        schema = self.get_schema(self.schema_versions_info)
         self.validate_response(schema.get_keypair, resp, body)
         return rest_client.ResponseBody(resp, body)
 
@@ -43,10 +56,15 @@
         post_body = json.dumps({'keypair': kwargs})
         resp, body = self.post("os-keypairs", body=post_body)
         body = json.loads(body)
+        schema = self.get_schema(self.schema_versions_info)
         self.validate_response(schema.create_keypair, resp, body)
         return rest_client.ResponseBody(resp, body)
 
-    def delete_keypair(self, keypair_name):
-        resp, body = self.delete("os-keypairs/%s" % keypair_name)
+    def delete_keypair(self, keypair_name, **params):
+        url = "os-keypairs/%s" % keypair_name
+        if params:
+            url += '?%s' % urllib.urlencode(params)
+        resp, body = self.delete(url)
+        schema = self.get_schema(self.schema_versions_info)
         self.validate_response(schema.delete_keypair, resp, body)
         return rest_client.ResponseBody(resp, body)
diff --git a/tempest/lib/services/network/quotas_client.py b/tempest/lib/services/network/quotas_client.py
index b5cf35b..752b253 100644
--- a/tempest/lib/services/network/quotas_client.py
+++ b/tempest/lib/services/network/quotas_client.py
@@ -22,7 +22,9 @@
         uri = '/quotas/%s' % tenant_id
         return self.update_resource(uri, put_body)
 
-    def reset_quotas(self, tenant_id):
+    def reset_quotas(self, tenant_id):  # noqa
+        # NOTE: This noqa is for passing T111 check and we cannot rename
+        #       to keep backwards compatibility.
         uri = '/quotas/%s' % tenant_id
         return self.delete_resource(uri)
 
diff --git a/tempest/services/compute/__init__.py b/tempest/services/compute/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/services/compute/__init__.py
+++ /dev/null
diff --git a/tempest/services/compute/json/__init__.py b/tempest/services/compute/json/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tempest/services/compute/json/__init__.py
+++ /dev/null
diff --git a/tempest/services/compute/json/keypairs_client.py b/tempest/services/compute/json/keypairs_client.py
deleted file mode 100644
index fcb4f2a..0000000
--- a/tempest/services/compute/json/keypairs_client.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-from oslo_serialization import jsonutils as json
-from six.moves.urllib import parse as urllib
-
-from tempest.api_schema.response.compute.v2_1 import keypairs as schemav21
-from tempest.api_schema.response.compute.v2_2 import keypairs as schemav22
-from tempest.lib.common import rest_client
-from tempest.lib.services.compute import base_compute_client
-
-
-class KeyPairsClient(base_compute_client.BaseComputeClient):
-
-    schema_versions_info = [{'min': None, 'max': '2.1', 'schema': schemav21},
-                            {'min': '2.2', 'max': None, 'schema': schemav22}]
-
-    def list_keypairs(self, **params):
-        url = 'os-keypairs'
-        if params:
-            url += '?%s' % urllib.urlencode(params)
-        resp, body = self.get(url)
-        body = json.loads(body)
-        schema = self.get_schema(self.schema_versions_info)
-        self.validate_response(schema.list_keypairs, resp, body)
-        return rest_client.ResponseBody(resp, body)
-
-    def show_keypair(self, keypair_name, **params):
-        url = "os-keypairs/%s" % keypair_name
-        if params:
-            url += '?%s' % urllib.urlencode(params)
-        resp, body = self.get(url)
-        body = json.loads(body)
-        schema = self.get_schema(self.schema_versions_info)
-        self.validate_response(schema.get_keypair, resp, body)
-        return rest_client.ResponseBody(resp, body)
-
-    def create_keypair(self, **kwargs):
-        post_body = json.dumps({'keypair': kwargs})
-        resp, body = self.post("os-keypairs", body=post_body)
-        body = json.loads(body)
-        schema = self.get_schema(self.schema_versions_info)
-        self.validate_response(schema.create_keypair, resp, body)
-        return rest_client.ResponseBody(resp, body)
-
-    def delete_keypair(self, keypair_name, **params):
-        url = "os-keypairs/%s" % keypair_name
-        if params:
-            url += '?%s' % urllib.urlencode(params)
-        resp, body = self.delete(url)
-        schema = self.get_schema(self.schema_versions_info)
-        self.validate_response(schema.delete_keypair, resp, body)
-        return rest_client.ResponseBody(resp, body)
diff --git a/tempest/tests/common/test_dynamic_creds.py b/tempest/tests/common/test_dynamic_creds.py
index 5ef1eb3..a49612d 100644
--- a/tempest/tests/common/test_dynamic_creds.py
+++ b/tempest/tests/common/test_dynamic_creds.py
@@ -58,8 +58,8 @@
 
     def test_tempest_client(self):
         creds = dynamic_creds.DynamicCredentialProvider(**self.fixed_params)
-        self.assertTrue(isinstance(creds.identity_admin_client,
-                                   json_iden_client.IdentityClient))
+        self.assertIsInstance(creds.identity_admin_client,
+                              json_iden_client.IdentityClient)
 
     def _get_fake_admin_creds(self):
         return credentials.get_credentials(
diff --git a/tempest/tests/common/test_preprov_creds.py b/tempest/tests/common/test_preprov_creds.py
index 7188e5f..7af8654 100644
--- a/tempest/tests/common/test_preprov_creds.py
+++ b/tempest/tests/common/test_preprov_creds.py
@@ -325,7 +325,7 @@
                                                     'id': 'fake-id',
                                                     'label': 'network-2'}]}):
             creds = test_accounts_class.get_creds_by_roles(['role-7'])
-        self.assertTrue(isinstance(creds, cred_provider.TestResources))
+        self.assertIsInstance(creds, cred_provider.TestResources)
         network = creds.network
         self.assertIsNotNone(network)
         self.assertIn('name', network)
diff --git a/tempest/tests/services/compute/base.py b/tempest/tests/services/compute/base.py
deleted file mode 100644
index a35a87c..0000000
--- a/tempest/tests/services/compute/base.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2015 Deutsche Telekom AG.  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 httplib2
-
-from oslo_serialization import jsonutils as json
-from oslotest import mockpatch
-
-from tempest.tests import base
-
-
-class BaseComputeServiceTest(base.TestCase):
-    def create_response(self, body, to_utf=False, status=200):
-        json_body = {}
-        if body:
-            json_body = json.dumps(body)
-            if to_utf:
-                json_body = json_body.encode('utf-8')
-        response = (httplib2.Response({'status': status}), json_body)
-        return response
-
-    def check_service_client_function(self, function, function2mock,
-                                      body, to_utf=False, status=200,
-                                      **kwargs):
-        mocked_response = self.create_response(body, to_utf, status)
-        self.useFixture(mockpatch.Patch(
-            function2mock, return_value=mocked_response))
-        if kwargs:
-            resp = function(**kwargs)
-        else:
-            resp = function()
-        self.assertEqual(body, resp)
diff --git a/tempest/tests/services/compute/test_keypairs_client.py b/tempest/tests/services/compute/test_keypairs_client.py
deleted file mode 100644
index e8f8280..0000000
--- a/tempest/tests/services/compute/test_keypairs_client.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright 2015 NEC Corporation.  All rights reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import copy
-
-from tempest.services.compute.json import keypairs_client
-from tempest.tests.lib import fake_auth_provider
-from tempest.tests.services.compute import base
-
-
-class TestKeyPairsClient(base.BaseComputeServiceTest):
-
-    FAKE_KEYPAIR = {"keypair": {
-        "public_key": "ssh-rsa foo Generated-by-Nova",
-        "name": u'\u2740(*\xb4\u25e1`*)\u2740',
-        "user_id": "525d55f98980415ba98e634972fa4a10",
-        "fingerprint": "76:24:66:49:d7:ca:6e:5c:77:ea:8e:bb:9c:15:5f:98"
-        }}
-
-    def setUp(self):
-        super(TestKeyPairsClient, self).setUp()
-        fake_auth = fake_auth_provider.FakeAuthProvider()
-        self.client = keypairs_client.KeyPairsClient(
-            fake_auth, 'compute', 'regionOne')
-
-    def _test_list_keypairs(self, bytes_body=False):
-        self.check_service_client_function(
-            self.client.list_keypairs,
-            'tempest.lib.common.rest_client.RestClient.get',
-            {"keypairs": []},
-            bytes_body)
-
-    def test_list_keypairs_with_str_body(self):
-        self._test_list_keypairs()
-
-    def test_list_keypairs_with_bytes_body(self):
-        self._test_list_keypairs(bytes_body=True)
-
-    def _test_show_keypair(self, bytes_body=False):
-        fake_keypair = copy.deepcopy(self.FAKE_KEYPAIR)
-        fake_keypair["keypair"].update({
-            "deleted": False,
-            "created_at": "2015-07-22T04:53:52.000000",
-            "updated_at": None,
-            "deleted_at": None,
-            "id": 1
-            })
-
-        self.check_service_client_function(
-            self.client.show_keypair,
-            'tempest.lib.common.rest_client.RestClient.get',
-            fake_keypair,
-            bytes_body,
-            keypair_name="test")
-
-    def test_show_keypair_with_str_body(self):
-        self._test_show_keypair()
-
-    def test_show_keypair_with_bytes_body(self):
-        self._test_show_keypair(bytes_body=True)
-
-    def _test_create_keypair(self, bytes_body=False):
-        fake_keypair = copy.deepcopy(self.FAKE_KEYPAIR)
-        fake_keypair["keypair"].update({"private_key": "foo"})
-
-        self.check_service_client_function(
-            self.client.create_keypair,
-            'tempest.lib.common.rest_client.RestClient.post',
-            fake_keypair,
-            bytes_body,
-            name="test")
-
-    def test_create_keypair_with_str_body(self):
-        self._test_create_keypair()
-
-    def test_create_keypair_with_bytes_body(self):
-        self._test_create_keypair(bytes_body=True)
-
-    def test_delete_keypair(self):
-        self.check_service_client_function(
-            self.client.delete_keypair,
-            'tempest.lib.common.rest_client.RestClient.delete',
-            {}, status=202, keypair_name='test')
diff --git a/tempest/tests/test_glance_http.py b/tempest/tests/test_glance_http.py
index 1811141..f6076ca 100644
--- a/tempest/tests/test_glance_http.py
+++ b/tempest/tests/test_glance_http.py
@@ -93,29 +93,29 @@
         self.assertEqual(httplib.HTTPConnection, conn_class)
 
     def test_get_connection_http(self):
-        self.assertTrue(isinstance(self.client._get_connection(),
-                                   httplib.HTTPConnection))
+        self.assertIsInstance(self.client._get_connection(),
+                              httplib.HTTPConnection)
 
     def test_get_connection_https(self):
         endpoint = 'https://fake_url.com'
         self.fake_auth.base_url = mock.MagicMock(return_value=endpoint)
         self.client = glance_http.HTTPClient(self.fake_auth, {})
-        self.assertTrue(isinstance(self.client._get_connection(),
-                                   glance_http.VerifiedHTTPSConnection))
+        self.assertIsInstance(self.client._get_connection(),
+                              glance_http.VerifiedHTTPSConnection)
 
     def test_get_connection_ipv4_https(self):
         endpoint = 'https://127.0.0.1'
         self.fake_auth.base_url = mock.MagicMock(return_value=endpoint)
         self.client = glance_http.HTTPClient(self.fake_auth, {})
-        self.assertTrue(isinstance(self.client._get_connection(),
-                                   glance_http.VerifiedHTTPSConnection))
+        self.assertIsInstance(self.client._get_connection(),
+                              glance_http.VerifiedHTTPSConnection)
 
     def test_get_connection_ipv6_https(self):
         endpoint = 'https://[::1]'
         self.fake_auth.base_url = mock.MagicMock(return_value=endpoint)
         self.client = glance_http.HTTPClient(self.fake_auth, {})
-        self.assertTrue(isinstance(self.client._get_connection(),
-                                   glance_http.VerifiedHTTPSConnection))
+        self.assertIsInstance(self.client._get_connection(),
+                              glance_http.VerifiedHTTPSConnection)
 
     def test_get_connection_url_not_fount(self):
         self.useFixture(mockpatch.PatchObject(self.client, 'connection_class',
diff --git a/test-requirements.txt b/test-requirements.txt
index be3a4f1..bb4b27f 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -6,7 +6,7 @@
 sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 # BSD
 python-subunit>=0.0.18 # Apache-2.0/BSD
 oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0
-reno>=0.1.1 # Apache2
+reno>=1.6.2 # Apache2
 mox>=0.5.3 # Apache-2.0
 mock>=1.2 # BSD
 coverage>=3.6 # Apache-2.0