Use reader role for compute servers tests

Update all test files in tempest/api/compute/servers to use the reader
role for GET requests (list, show, get operations) following the pattern
in test_list_server_filters.py. This ensures proper RBAC testing by
using the project_reader credentials for read operations while
maintaining the primary credentials for write operations.

Additionally, remove redundant cls.client = cls.servers_client assignments
from individual test files and use cls.servers_client directly from the
base class instead. This eliminates redundant aliases and makes the code
more consistent.

Changes include:
- Added credentials = ['primary', 'project_reader'] to base class
- Set up reader_servers_client in base class setup_clients method
- Replaced all GET requests to use reader_servers_client instead of
  regular client
- Removed cls.client = cls.servers_client assignments from test files
- Replaced self.client with self.servers_client for write operations
- Replaced self.client with self.reader_servers_client for read
  operations where appropriate
- Updated files: test_availability_zone, test_server_group,
  test_server_addresses, test_server_tags, test_server_metadata,
  test_servers, test_instance_actions, test_attach_interfaces,
  test_disk_config, test_server_actions, test_server_personality,
  test_server_password, test_servers_negative, test_novnc,
  test_create_server, test_delete_server, test_list_server_filters,
  test_list_servers_negative, and related negative test files

Partial-Implements: blueprint test-nova-with-srbac-defaults
Change-Id: I4c5b35d7d1a8fa7155f2a31bc70116dfd681f948
Signed-off-by: Jason Paroly <jparoly@redhat.com>
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index b974b52..3ac2b46 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -44,7 +44,7 @@
 
     # TODO(andreaf) We should care also for the alt_manager here
     # but only once client lazy load in the manager is done
-    credentials = ['primary']
+    credentials = ['primary', 'project_reader']
 
     @classmethod
     def skip_checks(cls):
@@ -78,6 +78,10 @@
     def setup_clients(cls):
         super(BaseV2ComputeTest, cls).setup_clients()
         cls.servers_client = cls.os_primary.servers_client
+        if CONF.enforce_scope.nova and hasattr(cls, 'os_project_reader'):
+            cls.reader_servers_client = cls.os_project_reader.servers_client
+        else:
+            cls.reader_servers_client = cls.servers_client
         cls.server_groups_client = cls.os_primary.server_groups_client
         cls.flavors_client = cls.os_primary.flavors_client
         cls.compute_images_client = cls.os_primary.compute_images_client
@@ -680,7 +684,7 @@
 class BaseV2ComputeAdminTest(BaseV2ComputeTest):
     """Base test case class for Compute Admin API tests."""
 
-    credentials = ['primary', 'admin']
+    credentials = ['primary', 'admin', 'project_reader']
 
     @classmethod
     def setup_clients(cls):
diff --git a/tempest/api/compute/flavors/test_flavors.py b/tempest/api/compute/flavors/test_flavors.py
index 2916de5..752a48d 100644
--- a/tempest/api/compute/flavors/test_flavors.py
+++ b/tempest/api/compute/flavors/test_flavors.py
@@ -24,8 +24,6 @@
 class FlavorsV2TestJSON(base.BaseV2ComputeTest):
     """Tests Flavors"""
 
-    credentials = ['primary', 'project_reader']
-
     @classmethod
     def setup_clients(cls):
         super(FlavorsV2TestJSON, cls).setup_clients()
diff --git a/tempest/api/compute/flavors/test_flavors_negative.py b/tempest/api/compute/flavors/test_flavors_negative.py
index 682ca58..5700ecd 100644
--- a/tempest/api/compute/flavors/test_flavors_negative.py
+++ b/tempest/api/compute/flavors/test_flavors_negative.py
@@ -28,8 +28,6 @@
 
 class FlavorsV2NegativeTest(base.BaseV2ComputeTest):
 
-    credentials = ['primary', 'project_reader']
-
     @classmethod
     def setup_clients(cls):
         super(FlavorsV2NegativeTest, cls).setup_clients()
diff --git a/tempest/api/compute/servers/test_attach_interfaces.py b/tempest/api/compute/servers/test_attach_interfaces.py
index eddfd73..1ba4e58 100644
--- a/tempest/api/compute/servers/test_attach_interfaces.py
+++ b/tempest/api/compute/servers/test_attach_interfaces.py
@@ -60,6 +60,13 @@
         super(AttachInterfacesTestBase, cls).setup_clients()
         cls.subnets_client = cls.os_primary.subnets_client
         cls.ports_client = cls.os_primary.ports_client
+        if CONF.enforce_scope.nova:
+            cls.reader_interfaces_client = (
+                cls.os_project_reader.interfaces_client)
+            cls.reader_ports_client = cls.os_project_reader.ports_client
+        else:
+            cls.reader_interfaces_client = cls.interfaces_client
+            cls.reader_ports_client = cls.ports_client
 
     def _wait_for_validation(self, server, validation_resources):
         linux_client = remote_client.RemoteClient(
@@ -81,7 +88,8 @@
             wait_until='ACTIVE')
         # NOTE(mgoddard): Get detailed server to ensure addresses are present
         # in fixed IP case.
-        server = self.servers_client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(
+            server['id'])['server']
         # NOTE(artom) self.create_test_server adds cleanups, but this is
         # apparently not enough? Add cleanup here.
         self.addCleanup(self.delete_server, server['id'])
@@ -90,7 +98,7 @@
             fip = set([validation_resources['floating_ip']['ip']])
         except KeyError:
             fip = ()
-        ifs = (self.interfaces_client.list_interfaces(server['id'])
+        ifs = (self.reader_interfaces_client.list_interfaces(server['id'])
                ['interfaceAttachments'])
         body = waiters.wait_for_interface_status(
             self.interfaces_client, server['id'], ifs[0]['port_id'], 'ACTIVE')
@@ -107,7 +115,7 @@
         :param port_id: The id of the port being detached.
         :returns: The final port dict from the show_port response.
         """
-        port = self.ports_client.show_port(port_id)['port']
+        port = self.reader_ports_client.show_port(port_id)['port']
         device_id = port['device_id']
         start = int(time.time())
 
@@ -115,7 +123,7 @@
         # None, but it's not contractual so handle Falsey either way.
         while device_id:
             time.sleep(self.build_interval)
-            port = self.ports_client.show_port(port_id)['port']
+            port = self.reader_ports_client.show_port(port_id)['port']
             device_id = port['device_id']
 
             timed_out = int(time.time()) - start >= self.build_timeout
@@ -205,13 +213,13 @@
         # NOTE(danms): delete not the first or last, but one in the middle
         iface = ifs[1]
         self.interfaces_client.delete_interface(server['id'], iface['port_id'])
-        _ifs = (self.interfaces_client.list_interfaces(server['id'])
+        _ifs = (self.reader_interfaces_client.list_interfaces(server['id'])
                 ['interfaceAttachments'])
         start = int(time.time())
 
         while len(ifs) == len(_ifs):
             time.sleep(self.build_interval)
-            _ifs = (self.interfaces_client.list_interfaces(server['id'])
+            _ifs = (self.reader_interfaces_client.list_interfaces(server['id'])
                     ['interfaceAttachments'])
             timed_out = int(time.time()) - start >= self.build_timeout
             if len(ifs) == len(_ifs) and timed_out:
@@ -254,7 +262,7 @@
         iface = self._test_create_interface_by_port_id(server, ifs)
         ifs.append(iface)
 
-        _ifs = (self.interfaces_client.list_interfaces(server['id'])
+        _ifs = (self.reader_interfaces_client.list_interfaces(server['id'])
                 ['interfaceAttachments'])
         self._compare_iface_list(ifs, _ifs)
 
@@ -284,7 +292,7 @@
         iface = self._test_create_interface_by_fixed_ips(server, ifs)
         ifs.append(iface)
 
-        _ifs = (self.interfaces_client.list_interfaces(server['id'])
+        _ifs = (self.reader_interfaces_client.list_interfaces(server['id'])
                 ['interfaceAttachments'])
         self._compare_iface_list(ifs, _ifs)
 
@@ -340,7 +348,8 @@
         for server in servers:
             # NOTE(mgoddard): Get detailed server to ensure addresses are
             # present in fixed IP case.
-            server = self.servers_client.show_server(server['id'])['server']
+            server = self.reader_servers_client.show_server(server['id'])[
+                'server']
             compute.wait_for_ssh_or_ping(server, self.os_primary, network,
                                          True, validation_resources,
                                          'SSHABLE', True)
@@ -419,7 +428,7 @@
                 'Timed out while waiting for IP count to increase.')
 
         # Remove the fixed IP that we just added.
-        server_detail = self.os_primary.servers_client.show_server(
+        server_detail = self.reader_servers_client.show_server(
             server['id'])['server']
         # Get the Fixed IP from server.
         fixed_ip = None
@@ -467,4 +476,4 @@
             # just to check the response schema
             self.interfaces_client.show_interface(
                 server['id'], iface['port_id'])
-            self.interfaces_client.list_interfaces(server['id'])
+            self.reader_interfaces_client.list_interfaces(server['id'])
diff --git a/tempest/api/compute/servers/test_availability_zone.py b/tempest/api/compute/servers/test_availability_zone.py
index d239149..8e2b660 100644
--- a/tempest/api/compute/servers/test_availability_zone.py
+++ b/tempest/api/compute/servers/test_availability_zone.py
@@ -14,9 +14,13 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.lib import decorators
 
 
+CONF = config.CONF
+
+
 class AZV2TestJSON(base.BaseV2ComputeTest):
     """Tests Availability Zone API List"""
 
@@ -24,9 +28,14 @@
     def setup_clients(cls):
         super(AZV2TestJSON, cls).setup_clients()
         cls.client = cls.availability_zone_client
+        if CONF.enforce_scope.nova:
+            cls.reader_az_client = (
+                cls.os_project_reader.availability_zone_client)
+        else:
+            cls.reader_az_client = cls.client
 
     @decorators.idempotent_id('a8333aa2-205c-449f-a828-d38c2489bf25')
     def test_get_availability_zone_list_with_non_admin_user(self):
         """List of availability zone with non-administrator user"""
-        availability_zone = self.client.list_availability_zones()
+        availability_zone = self.reader_az_client.list_availability_zones()
         self.assertNotEmpty(availability_zone['availabilityZoneInfo'])
diff --git a/tempest/api/compute/servers/test_create_server.py b/tempest/api/compute/servers/test_create_server.py
index 1454deb..a61f5fb 100644
--- a/tempest/api/compute/servers/test_create_server.py
+++ b/tempest/api/compute/servers/test_create_server.py
@@ -33,7 +33,6 @@
 
     This is to create server booted from image and with disk_config 'AUTO'
     """
-    credentials = ['primary', 'project_reader']
     disk_config = 'AUTO'
     volume_backed = False
 
@@ -45,11 +44,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServersTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.client
 
     @classmethod
     def resource_setup(cls):
@@ -75,7 +69,7 @@
             disk_config=disk_config,
             adminPass=cls.password,
             volume_backed=cls.volume_backed)
-        cls.server = cls.reader_client.show_server(
+        cls.server = cls.reader_servers_client.show_server(
             server_initial['id'])['server']
 
     @decorators.attr(type='smoke')
@@ -100,7 +94,7 @@
     @decorators.idempotent_id('9a438d88-10c6-4bcd-8b5b-5b6e25e1346f')
     def test_list_servers(self):
         """The created server should be in the list of all servers"""
-        body = self.reader_client.list_servers()
+        body = self.reader_servers_client.list_servers()
         servers = body['servers']
         found = [i for i in servers if i['id'] == self.server['id']]
         self.assertNotEmpty(found)
@@ -108,7 +102,7 @@
     @decorators.idempotent_id('585e934c-448e-43c4-acbf-d06a9b899997')
     def test_list_servers_with_detail(self):
         """The created server should be in the detailed list of all servers"""
-        body = self.reader_client.list_servers(detail=True)
+        body = self.reader_servers_client.list_servers(detail=True)
         servers = body['servers']
         found = [i for i in servers if i['id'] == self.server['id']]
         self.assertNotEmpty(found)
@@ -131,7 +125,7 @@
             self.password,
             validation_resources['keypair']['private_key'],
             server=self.server,
-            servers_client=self.client)
+            servers_client=self.servers_client)
         output = linux_client.exec_command('grep -c ^processor /proc/cpuinfo')
         self.assertEqual(flavor['vcpus'], int(output))
 
@@ -148,7 +142,7 @@
             self.password,
             validation_resources['keypair']['private_key'],
             server=self.server,
-            servers_client=self.client)
+            servers_client=self.servers_client)
         hostname = linux_client.exec_command("hostname").rstrip()
         msg = ('Failed while verifying servername equals hostname. Expected '
                'hostname "%s" but got "%s".' %
@@ -198,8 +192,6 @@
     server hostname with dashes. This test verifies the same.
     """
 
-    credentials = ['primary', 'project_reader']
-
     @classmethod
     def setup_credentials(cls):
         cls.prepare_instance_network()
@@ -208,11 +200,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServersTestFqdnHostnames, cls).setup_clients()
-        cls.client = cls.servers_client
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.client
 
     @decorators.idempotent_id('622066d2-39fc-4c09-9eeb-35903c114a0a')
     @testtools.skipUnless(
@@ -245,7 +232,7 @@
             self.password,
             validation_resources['keypair']['private_key'],
             server=test_server,
-            servers_client=self.client)
+            servers_client=self.servers_client)
         hostname = linux_client.exec_command("hostname").rstrip()
         self.assertEqual('guest-instance-1-domain-com', hostname)
 
@@ -261,7 +248,6 @@
     more than 64 characters
     """
 
-    credentials = ['primary', 'project_reader']
     min_microversion = '2.94'
 
     @classmethod
@@ -272,11 +258,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServersV294TestFqdnHostnames, cls).setup_clients()
-        cls.client = cls.servers_client
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.client
 
     @classmethod
     def resource_setup(cls):
@@ -295,7 +276,7 @@
             accessIPv4=cls.accessIPv4,
             adminPass=cls.password,
             hostname=cls.hostname)
-        cls.server = cls.reader_client.show_server(
+        cls.server = cls.reader_servers_client.show_server(
             cls.test_server['id'])['server']
 
     def verify_metadata_hostname(self, md_json):
@@ -324,6 +305,6 @@
             self.password,
             self.validation_resources['keypair']['private_key'],
             server=self.test_server,
-            servers_client=self.client)
+            servers_client=self.servers_client)
         self.verify_metadata_from_api(
             self.test_server, linux_client, self.verify_metadata_hostname)
diff --git a/tempest/api/compute/servers/test_create_server_multi_nic.py b/tempest/api/compute/servers/test_create_server_multi_nic.py
index 828ee32..fc75e2f 100644
--- a/tempest/api/compute/servers/test_create_server_multi_nic.py
+++ b/tempest/api/compute/servers/test_create_server_multi_nic.py
@@ -48,8 +48,6 @@
 class ServersTestMultiNic(base.BaseV2ComputeTest):
     """Test multiple networks in servers"""
 
-    credentials = ['primary', 'project_reader']
-
     @classmethod
     def skip_checks(cls):
         super(ServersTestMultiNic, cls).skip_checks()
@@ -64,10 +62,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServersTestMultiNic, cls).setup_clients()
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.servers_client
         cls.networks_client = cls.os_primary.networks_client
         cls.subnets_client = cls.os_primary.subnets_client
 
@@ -112,8 +106,8 @@
         # we're OK.
         self.addCleanup(self.delete_server, server_multi_nics['id'])
 
-        addresses = (self.reader_client.list_addresses(server_multi_nics['id'])
-                     ['addresses'])
+        addresses = (self.reader_servers_client.list_addresses(
+            server_multi_nics['id'])['addresses'])
 
         # We can't predict the ip addresses assigned to the server on networks.
         # So we check if the first address is in first network, similarly
@@ -147,8 +141,8 @@
             networks=networks, wait_until='ACTIVE')
         self.addCleanup(self.delete_server, server_multi_nics['id'])
 
-        addresses = (self.reader_client.list_addresses(server_multi_nics['id'])
-                     ['addresses'])
+        addresses = (self.reader_servers_client.list_addresses(
+            server_multi_nics['id'])['addresses'])
 
         addr = [addresses[net1['network']['name']][0]['addr'],
                 addresses[net2['network']['name']][0]['addr'],
diff --git a/tempest/api/compute/servers/test_delete_server.py b/tempest/api/compute/servers/test_delete_server.py
index 596d2bd..5fb669e 100644
--- a/tempest/api/compute/servers/test_delete_server.py
+++ b/tempest/api/compute/servers/test_delete_server.py
@@ -35,30 +35,30 @@
     @classmethod
     def setup_clients(cls):
         super(DeleteServersTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @decorators.idempotent_id('9e6e0c87-3352-42f7-9faf-5d6210dbd159')
     def test_delete_server_while_in_building_state(self):
         """Test deleting a server while it's VM state is Building"""
         server = self.create_test_server(wait_until='BUILD')
-        self.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(self.client, server['id'])
+        self.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(self.servers_client, server['id'])
 
     @decorators.idempotent_id('925fdfb4-5b13-47ea-ac8a-c36ae6fddb05')
     def test_delete_active_server(self):
         """Test deleting a server while it's VM state is Active"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(self.client, server['id'])
+        self.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(self.servers_client, server['id'])
 
     @decorators.idempotent_id('546d368c-bb6c-4645-979a-83ed16f3a6be')
     def test_delete_server_while_in_shutoff_state(self):
         """Test deleting a server while it's VM state is Shutoff"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.client.stop_server(server['id'])
-        waiters.wait_for_server_status(self.client, server['id'], 'SHUTOFF')
-        self.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(self.client, server['id'])
+        self.servers_client.stop_server(server['id'])
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'SHUTOFF')
+        self.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(self.servers_client, server['id'])
 
     @decorators.idempotent_id('943bd6e8-4d7a-4904-be83-7a6cc2d4213b')
     @testtools.skipUnless(CONF.compute_feature_enabled.pause,
@@ -66,10 +66,11 @@
     def test_delete_server_while_in_pause_state(self):
         """Test deleting a server while it's VM state is Pause"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.client.pause_server(server['id'])
-        waiters.wait_for_server_status(self.client, server['id'], 'PAUSED')
-        self.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(self.client, server['id'])
+        self.servers_client.pause_server(server['id'])
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'PAUSED')
+        self.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(self.servers_client, server['id'])
 
     @decorators.idempotent_id('1f82ebd3-8253-4f4e-b93f-de9b7df56d8b')
     @testtools.skipUnless(CONF.compute_feature_enabled.suspend,
@@ -77,10 +78,11 @@
     def test_delete_server_while_in_suspended_state(self):
         """Test deleting a server while it's VM state is Suspended"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.client.suspend_server(server['id'])
-        waiters.wait_for_server_status(self.client, server['id'], 'SUSPENDED')
-        self.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(self.client, server['id'])
+        self.servers_client.suspend_server(server['id'])
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'SUSPENDED')
+        self.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(self.servers_client, server['id'])
 
     @decorators.idempotent_id('bb0cb402-09dd-4947-b6e5-5e7e1cfa61ad')
     @testtools.skipUnless(CONF.compute_feature_enabled.shelve,
@@ -88,10 +90,10 @@
     def test_delete_server_while_in_shelved_state(self):
         """Test deleting a server while it's VM state is Shelved"""
         server = self.create_test_server(wait_until='ACTIVE')
-        compute.shelve_server(self.client, server['id'])
+        compute.shelve_server(self.servers_client, server['id'])
 
-        self.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(self.client, server['id'])
+        self.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(self.servers_client, server['id'])
 
     @decorators.idempotent_id('ab0c38b4-cdd8-49d3-9b92-0cb898723c01')
     @testtools.skipIf(not CONF.compute_feature_enabled.resize,
@@ -99,14 +101,16 @@
     def test_delete_server_while_in_verify_resize_state(self):
         """Test deleting a server while it's VM state is VERIFY_RESIZE"""
         server = self.create_test_server(wait_until='ACTIVE')
-        body = self.client.resize_server(server['id'], self.flavor_ref_alt)
+        body = self.servers_client.resize_server(server['id'],
+                                                 self.flavor_ref_alt)
         request_id = body.response['x-openstack-request-id']
         waiters.wait_for_server_status(
-            self.client, server['id'], 'VERIFY_RESIZE', request_id=request_id)
-        body = self.client.delete_server(server['id'])
+            self.servers_client, server['id'], 'VERIFY_RESIZE',
+            request_id=request_id)
+        body = self.servers_client.delete_server(server['id'])
         request_id = body.response['x-openstack-request-id']
         waiters.wait_for_server_termination(
-            self.client, server['id'], request_id=request_id)
+            self.servers_client, server['id'], request_id=request_id)
 
     @decorators.idempotent_id('d0f3f0d6-d9b6-4a32-8da4-23015dcab23c')
     @utils.services('volume')
@@ -117,7 +121,7 @@
         volume = self.create_volume()
         self.attach_volume(server, volume)
 
-        self.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(self.client, server['id'])
+        self.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(self.servers_client, server['id'])
         waiters.wait_for_volume_resource_status(self.volumes_client,
                                                 volume['id'], 'available')
diff --git a/tempest/api/compute/servers/test_device_tagging.py b/tempest/api/compute/servers/test_device_tagging.py
index d2fdd52..fd087ea 100644
--- a/tempest/api/compute/servers/test_device_tagging.py
+++ b/tempest/api/compute/servers/test_device_tagging.py
@@ -256,7 +256,8 @@
 
         self.addCleanup(self.delete_server, server['id'])
 
-        server = self.servers_client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(
+            server['id'])['server']
         ssh_client = remote_client.RemoteClient(
             self.get_server_ip(server, validation_resources),
             CONF.validation.image_ssh_user,
@@ -388,7 +389,8 @@
 
         # NOTE(mgoddard): Get detailed server to ensure addresses are present
         # in fixed IP case.
-        server = self.servers_client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(
+            server['id'])['server']
 
         # Attach tagged nic and volume
         interface = self.interfaces_client.create_interface(
diff --git a/tempest/api/compute/servers/test_disk_config.py b/tempest/api/compute/servers/test_disk_config.py
index e5e051a..fc79e37 100644
--- a/tempest/api/compute/servers/test_disk_config.py
+++ b/tempest/api/compute/servers/test_disk_config.py
@@ -38,53 +38,56 @@
     @classmethod
     def setup_clients(cls):
         super(ServerDiskConfigTestJSON, cls).setup_clients()
-        cls.client = cls.os_primary.servers_client
 
     def _update_server_with_disk_config(self, server_id, disk_config):
-        server = self.client.show_server(server_id)['server']
+        server = self.reader_servers_client.show_server(server_id)['server']
         if disk_config != server['OS-DCF:diskConfig']:
-            server = self.client.update_server(
+            server = self.servers_client.update_server(
                 server_id, disk_config=disk_config)['server']
-            waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
-            server = self.client.show_server(server['id'])['server']
+            waiters.wait_for_server_status(self.servers_client, server['id'],
+                                           'ACTIVE')
+            server = self.reader_servers_client.show_server(
+                server['id'])['server']
             self.assertEqual(disk_config, server['OS-DCF:diskConfig'])
 
     @decorators.idempotent_id('bef56b09-2e8c-4883-a370-4950812f430e')
     def test_rebuild_server_with_manual_disk_config(self):
         """A server should be rebuilt using the manual disk config option"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.addCleanup(self.client.delete_server, server['id'])
+        self.addCleanup(self.servers_client.delete_server, server['id'])
         self._update_server_with_disk_config(server['id'],
                                              disk_config='AUTO')
 
-        server = self.client.rebuild_server(server['id'],
-                                            self.image_ref_alt,
-                                            disk_config='MANUAL')['server']
+        server = self.servers_client.rebuild_server(
+            server['id'], self.image_ref_alt,
+            disk_config='MANUAL')['server']
 
         # Wait for the server to become active
-        waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'ACTIVE')
 
         # Verify the specified attributes are set correctly
-        server = self.client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertEqual('MANUAL', server['OS-DCF:diskConfig'])
 
     @decorators.idempotent_id('9c9fae77-4feb-402f-8450-bf1c8b609713')
     def test_rebuild_server_with_auto_disk_config(self):
         """A server should be rebuilt using the auto disk config option"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.addCleanup(self.client.delete_server, server['id'])
+        self.addCleanup(self.servers_client.delete_server, server['id'])
         self._update_server_with_disk_config(server['id'],
                                              disk_config='MANUAL')
 
-        server = self.client.rebuild_server(server['id'],
-                                            self.image_ref_alt,
-                                            disk_config='AUTO')['server']
+        server = self.servers_client.rebuild_server(
+            server['id'], self.image_ref_alt,
+            disk_config='AUTO')['server']
 
         # Wait for the server to become active
-        waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'ACTIVE')
 
         # Verify the specified attributes are set correctly
-        server = self.client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertEqual('AUTO', server['OS-DCF:diskConfig'])
 
     @decorators.idempotent_id('414e7e93-45b5-44bc-8e03-55159c6bfc97')
@@ -93,14 +96,14 @@
     def test_resize_server_from_manual_to_auto(self):
         """A server should be resized from manual to auto disk config"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.addCleanup(self.client.delete_server, server['id'])
+        self.addCleanup(self.servers_client.delete_server, server['id'])
         self._update_server_with_disk_config(server['id'],
                                              disk_config='MANUAL')
         # Resize with auto option
         self.resize_server(server['id'], self.flavor_ref_alt,
                            disk_config='AUTO')
 
-        server = self.client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertEqual('AUTO', server['OS-DCF:diskConfig'])
 
     @decorators.idempotent_id('693d16f3-556c-489a-8bac-3d0ca2490bad')
@@ -109,29 +112,30 @@
     def test_resize_server_from_auto_to_manual(self):
         """A server should be resized from auto to manual disk config"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.addCleanup(self.client.delete_server, server['id'])
+        self.addCleanup(self.servers_client.delete_server, server['id'])
         self._update_server_with_disk_config(server['id'],
                                              disk_config='AUTO')
         # Resize with manual option
         self.resize_server(server['id'], self.flavor_ref_alt,
                            disk_config='MANUAL')
 
-        server = self.client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertEqual('MANUAL', server['OS-DCF:diskConfig'])
 
     @decorators.idempotent_id('5ef18867-358d-4de9-b3c9-94d4ba35742f')
     def test_update_server_from_auto_to_manual(self):
         """A server should be updated from auto to manual disk config"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.addCleanup(self.client.delete_server, server['id'])
+        self.addCleanup(self.servers_client.delete_server, server['id'])
         self._update_server_with_disk_config(server['id'],
                                              disk_config='AUTO')
 
         # Update the disk_config attribute to manual
-        server = self.client.update_server(server['id'],
-                                           disk_config='MANUAL')['server']
-        waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
+        server = self.servers_client.update_server(
+            server['id'], disk_config='MANUAL')['server']
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'ACTIVE')
 
         # Verify the disk_config attribute is set correctly
-        server = self.client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertEqual('MANUAL', server['OS-DCF:diskConfig'])
diff --git a/tempest/api/compute/servers/test_instance_actions.py b/tempest/api/compute/servers/test_instance_actions.py
index 028da68..6a68aab 100644
--- a/tempest/api/compute/servers/test_instance_actions.py
+++ b/tempest/api/compute/servers/test_instance_actions.py
@@ -15,9 +15,13 @@
 
 from tempest.api.compute import base
 from tempest.common import waiters
+from tempest import config
 from tempest.lib import decorators
 
 
+CONF = config.CONF
+
+
 class InstanceActionsTestJSON(base.BaseV2ComputeTest):
     """Test instance actions API"""
 
@@ -26,7 +30,6 @@
     @classmethod
     def setup_clients(cls):
         super(InstanceActionsTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -39,8 +42,8 @@
         """Test listing actions of the provided server"""
         self.reboot_server(self.server['id'], type='HARD')
 
-        body = (self.client.list_instance_actions(self.server['id'])
-                ['instanceActions'])
+        body = (self.reader_servers_client.list_instance_actions(
+            self.server['id'])['instanceActions'])
         self.assertEqual(len(body), 2, str(body))
         self.assertEqual(sorted([i['action'] for i in body]),
                          ['create', 'reboot'])
@@ -48,7 +51,7 @@
     @decorators.idempotent_id('aacc71ca-1d70-4aa5-bbf6-0ff71470e43c')
     def test_get_instance_action(self):
         """Test getting the action details of the provided server"""
-        body = self.client.show_instance_action(
+        body = self.reader_servers_client.show_instance_action(
             self.server['id'], self.request_id)['instanceAction']
         self.assertEqual(self.server['id'], body['instance_uuid'])
         self.assertEqual('create', body['action'])
@@ -65,7 +68,6 @@
     @classmethod
     def setup_clients(cls):
         super(InstanceActionsV221TestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @decorators.idempotent_id('0a0f85d4-10fa-41f6-bf80-a54fb4aa2ae1')
     def test_get_list_deleted_instance_actions(self):
@@ -75,9 +77,9 @@
         actions should contain 'create' and 'delete'.
         """
         server = self.create_test_server(wait_until='ACTIVE')
-        self.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(self.client, server['id'])
-        body = (self.client.list_instance_actions(server['id'])
+        self.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(self.servers_client, server['id'])
+        body = (self.reader_servers_client.list_instance_actions(server['id'])
                 ['instanceActions'])
         self.assertEqual(len(body), 2, str(body))
         self.assertEqual(sorted([i['action'] for i in body]),
diff --git a/tempest/api/compute/servers/test_instance_actions_negative.py b/tempest/api/compute/servers/test_instance_actions_negative.py
index dd2bf06..8e5b883 100644
--- a/tempest/api/compute/servers/test_instance_actions_negative.py
+++ b/tempest/api/compute/servers/test_instance_actions_negative.py
@@ -27,7 +27,6 @@
     @classmethod
     def setup_clients(cls):
         super(InstanceActionsNegativeTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -40,12 +39,13 @@
         """Test listing actions for non existent instance should fail"""
         non_existent_server_id = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.list_instance_actions,
+                          self.reader_servers_client.list_instance_actions,
                           non_existent_server_id)
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('0269f40a-6f18-456c-b336-c03623c897f1')
     def test_get_instance_action_invalid_request(self):
         """Test getting instance action with invalid request_id should fail"""
-        self.assertRaises(lib_exc.NotFound, self.client.show_instance_action,
+        self.assertRaises(lib_exc.NotFound,
+                          self.reader_servers_client.show_instance_action,
                           self.server['id'], '999')
diff --git a/tempest/api/compute/servers/test_list_server_filters.py b/tempest/api/compute/servers/test_list_server_filters.py
index 45f3348..20d460c 100644
--- a/tempest/api/compute/servers/test_list_server_filters.py
+++ b/tempest/api/compute/servers/test_list_server_filters.py
@@ -28,8 +28,6 @@
 class ListServerFiltersTestJSON(base.BaseV2ComputeTest):
     """Test listing servers filtered by specified attribute"""
 
-    credentials = ['primary', 'project_reader']
-
     @classmethod
     def setup_credentials(cls):
         cls.set_network_resources(network=True, subnet=True, dhcp=True)
@@ -38,11 +36,6 @@
     @classmethod
     def setup_clients(cls):
         super(ListServerFiltersTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.client
 
     @classmethod
     def resource_setup(cls):
@@ -75,9 +68,9 @@
                                         flavor=cls.flavor_ref_alt,
                                         wait_until='ACTIVE')
 
-        waiters.wait_for_server_status(cls.client, cls.s1['id'],
+        waiters.wait_for_server_status(cls.servers_client, cls.s1['id'],
                                        'ACTIVE')
-        waiters.wait_for_server_status(cls.client, cls.s2['id'],
+        waiters.wait_for_server_status(cls.servers_client, cls.s2['id'],
                                        'ACTIVE')
 
     @decorators.idempotent_id('05e8a8e7-9659-459a-989d-92c2f501f4ba')
@@ -86,7 +79,7 @@
     def test_list_servers_filter_by_image(self):
         """Filter the list of servers by image"""
         params = {'image': self.image_ref}
-        body = self.reader_client.list_servers(**params)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertIn(self.s1['id'], map(lambda x: x['id'], servers))
@@ -97,7 +90,7 @@
     def test_list_servers_filter_by_flavor(self):
         """Filter the list of servers by flavor"""
         params = {'flavor': self.flavor_ref_alt}
-        body = self.reader_client.list_servers(**params)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertNotIn(self.s1['id'], map(lambda x: x['id'], servers))
@@ -108,7 +101,7 @@
     def test_list_servers_filter_by_server_name(self):
         """Filter the list of servers by server name"""
         params = {'name': self.s1_name}
-        body = self.reader_client.list_servers(**params)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertIn(self.s1_name, map(lambda x: x['name'], servers))
@@ -119,7 +112,7 @@
     def test_list_servers_filter_by_active_status(self):
         """Filter the list of servers by server active status"""
         params = {'status': 'active'}
-        body = self.reader_client.list_servers(**params)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertIn(self.s1['id'], map(lambda x: x['id'], servers))
@@ -130,12 +123,12 @@
     def test_list_servers_filter_by_shutoff_status(self):
         """Filter the list of servers by server shutoff status"""
         params = {'status': 'shutoff'}
-        self.client.stop_server(self.s1['id'])
-        waiters.wait_for_server_status(self.client, self.s1['id'],
+        self.servers_client.stop_server(self.s1['id'])
+        waiters.wait_for_server_status(self.servers_client, self.s1['id'],
                                        'SHUTOFF')
-        body = self.reader_client.list_servers(**params)
-        self.client.start_server(self.s1['id'])
-        waiters.wait_for_server_status(self.client, self.s1['id'],
+        body = self.reader_servers_client.list_servers(**params)
+        self.servers_client.start_server(self.s1['id'])
+        waiters.wait_for_server_status(self.servers_client, self.s1['id'],
                                        'ACTIVE')
         servers = body['servers']
 
@@ -150,7 +143,7 @@
         Verify only the expected number of servers are returned (one server)
         """
         params = {'limit': 1}
-        servers = self.reader_client.list_servers(**params)
+        servers = self.reader_servers_client.list_servers(**params)
         self.assertEqual(1, len([x for x in servers['servers'] if 'id' in x]))
 
     @decorators.idempotent_id('b1495414-2d93-414c-8019-849afe8d319e')
@@ -160,7 +153,7 @@
         Verify only the expected number of servers are returned (no server)
         """
         params = {'limit': 0}
-        servers = self.reader_client.list_servers(**params)
+        servers = self.reader_servers_client.list_servers(**params)
         self.assertEmpty(servers['servers'])
 
     @decorators.idempotent_id('37791bbd-90c0-4de0-831e-5f38cba9c6b3')
@@ -170,8 +163,8 @@
         Verify only the expected number of servers are returned (all servers)
         """
         params = {'limit': 100000}
-        servers = self.reader_client.list_servers(**params)
-        all_servers = self.reader_client.list_servers()
+        servers = self.reader_servers_client.list_servers(**params)
+        all_servers = self.reader_servers_client.list_servers()
         self.assertEqual(len([x for x in all_servers['servers'] if 'id' in x]),
                          len([x for x in servers['servers'] if 'id' in x]))
 
@@ -181,7 +174,7 @@
     def test_list_servers_detailed_filter_by_image(self):
         """"Filter the detailed list of servers by image"""
         params = {'image': self.image_ref}
-        body = self.reader_client.list_servers(detail=True, **params)
+        body = self.reader_servers_client.list_servers(detail=True, **params)
         servers = body['servers']
 
         self.assertIn(self.s1['id'], map(lambda x: x['id'], servers))
@@ -192,7 +185,7 @@
     def test_list_servers_detailed_filter_by_flavor(self):
         """Filter the detailed list of servers by flavor"""
         params = {'flavor': self.flavor_ref_alt}
-        body = self.reader_client.list_servers(detail=True, **params)
+        body = self.reader_servers_client.list_servers(detail=True, **params)
         servers = body['servers']
 
         self.assertNotIn(self.s1['id'], map(lambda x: x['id'], servers))
@@ -203,7 +196,7 @@
     def test_list_servers_detailed_filter_by_server_name(self):
         """Filter the detailed list of servers by server name"""
         params = {'name': self.s1_name}
-        body = self.reader_client.list_servers(detail=True, **params)
+        body = self.reader_servers_client.list_servers(detail=True, **params)
         servers = body['servers']
 
         self.assertIn(self.s1_name, map(lambda x: x['name'], servers))
@@ -214,7 +207,7 @@
     def test_list_servers_detailed_filter_by_server_status(self):
         """Filter the detailed list of servers by server status"""
         params = {'status': 'active'}
-        body = self.reader_client.list_servers(detail=True, **params)
+        body = self.reader_servers_client.list_servers(detail=True, **params)
         servers = body['servers']
         test_ids = [s['id'] for s in (self.s1, self.s2, self.s3)]
 
@@ -229,7 +222,7 @@
         """Filter the list of servers by part of server name"""
         # List all servers that contains '-instance' in name
         params = {'name': '-instance'}
-        body = self.reader_client.list_servers(**params)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertIn(self.s1_name, map(lambda x: x['name'], servers))
@@ -240,7 +233,7 @@
         part_name = self.s1_name[6:-1]
 
         params = {'name': part_name}
-        body = self.reader_client.list_servers(**params)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertIn(self.s1_name, map(lambda x: x['name'], servers))
@@ -254,7 +247,7 @@
         regexes = [r'^.*\-instance\-[0-9]+$', r'^.*\-instance\-.*$']
         for regex in regexes:
             params = {'name': regex}
-            body = self.reader_client.list_servers(**params)
+            body = self.reader_servers_client.list_servers(**params)
             servers = body['servers']
 
             self.assertIn(self.s1_name, map(lambda x: x['name'], servers))
@@ -265,7 +258,7 @@
         part_name = self.s1_name[-10:]
 
         params = {'name': part_name}
-        body = self.reader_client.list_servers(**params)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertIn(self.s1_name, map(lambda x: x['name'], servers))
@@ -285,22 +278,25 @@
         # so here look for the longest server ip, and filter by that ip,
         # so as to ensure only one server is returned.
         ip_list = {}
-        self.s1 = self.reader_client.show_server(self.s1['id'])['server']
+        self.s1 = self.reader_servers_client.show_server(
+            self.s1['id'])['server']
         # Get first ip address in spite of v4 or v6
         ip_addr = self.s1['addresses'][self.fixed_network_name][0]['addr']
         ip_list[ip_addr] = self.s1['id']
 
-        self.s2 = self.reader_client.show_server(self.s2['id'])['server']
+        self.s2 = self.reader_servers_client.show_server(
+            self.s2['id'])['server']
         ip_addr = self.s2['addresses'][self.fixed_network_name][0]['addr']
         ip_list[ip_addr] = self.s2['id']
 
-        self.s3 = self.reader_client.show_server(self.s3['id'])['server']
+        self.s3 = self.reader_servers_client.show_server(
+            self.s3['id'])['server']
         ip_addr = self.s3['addresses'][self.fixed_network_name][0]['addr']
         ip_list[ip_addr] = self.s3['id']
 
         longest_ip = max([[len(ip), ip] for ip in ip_list])[1]
         params = {'ip': longest_ip}
-        body = self.reader_client.list_servers(**params)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertIn(ip_list[longest_ip], map(lambda x: x['id'], servers))
@@ -317,7 +313,7 @@
         # query addresses of the 3 servers
         addrs = []
         for s in [self.s1, self.s2, self.s3]:
-            s_show = self.reader_client.show_server(s['id'])['server']
+            s_show = self.reader_servers_client.show_server(s['id'])['server']
             addr_spec = s_show['addresses'][self.fixed_network_name][0]
             addrs.append(addr_spec['addr'])
         # find common part of the 3 ip addresses
@@ -335,8 +331,8 @@
         else:
             params = {'ip6': prefix}
         # capture all servers in case something goes wrong
-        all_servers = self.reader_client.list_servers(detail=True)
-        body = self.reader_client.list_servers(**params)
+        all_servers = self.reader_servers_client.list_servers(detail=True)
+        body = self.reader_servers_client.list_servers(**params)
         servers = body['servers']
 
         self.assertIn(self.s1_name, map(lambda x: x['name'], servers),
@@ -356,5 +352,6 @@
         Verify only the expected number of servers are returned (one server)
         """
         params = {'limit': 1}
-        servers = self.reader_client.list_servers(detail=True, **params)
+        servers = self.reader_servers_client.list_servers(detail=True,
+                                                          **params)
         self.assertEqual(1, len(servers['servers']))
diff --git a/tempest/api/compute/servers/test_list_servers_negative.py b/tempest/api/compute/servers/test_list_servers_negative.py
index 140e5c3..afa785c 100644
--- a/tempest/api/compute/servers/test_list_servers_negative.py
+++ b/tempest/api/compute/servers/test_list_servers_negative.py
@@ -26,17 +26,11 @@
 class ListServersNegativeTestJSON(base.BaseV2ComputeTest):
     """Negative tests of listing servers"""
 
-    credentials = ['primary', 'project_reader']
     create_default_network = True
 
     @classmethod
     def setup_clients(cls):
         super(ListServersNegativeTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.client
 
     @classmethod
     def resource_setup(cls):
@@ -50,15 +44,16 @@
 
         # delete one of the created servers
         cls.deleted_id = body['server']['id']
-        cls.client.delete_server(cls.deleted_id)
-        waiters.wait_for_server_termination(cls.client, cls.deleted_id)
+        cls.servers_client.delete_server(cls.deleted_id)
+        waiters.wait_for_server_termination(
+            cls.servers_client, cls.deleted_id)
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('24a26f1a-1ddc-4eea-b0d7-a90cc874ad8f')
     def test_list_servers_with_a_deleted_server(self):
         """Test that deleted servers do not show by default in list servers"""
         # List servers and verify server not returned
-        body = self.reader_client.list_servers()
+        body = self.reader_servers_client.list_servers()
         servers = body['servers']
         actual = [srv for srv in servers
                   if srv['id'] == self.deleted_id]
@@ -68,7 +63,8 @@
     @decorators.idempotent_id('ff01387d-c7ad-47b4-ae9e-64fa214638fe')
     def test_list_servers_by_non_existing_image(self):
         """Test listing servers for a non existing image returns empty list"""
-        body = self.reader_client.list_servers(image='non_existing_image')
+        body = self.reader_servers_client.list_servers(
+            image='non_existing_image')
         servers = body['servers']
         self.assertEmpty(servers)
 
@@ -76,7 +72,8 @@
     @decorators.idempotent_id('5913660b-223b-44d4-a651-a0fbfd44ca75')
     def test_list_servers_by_non_existing_flavor(self):
         """Test listing servers by non existing flavor returns empty list"""
-        body = self.reader_client.list_servers(flavor='non_existing_flavor')
+        body = self.reader_servers_client.list_servers(
+            flavor='non_existing_flavor')
         servers = body['servers']
         self.assertEmpty(servers)
 
@@ -89,7 +86,8 @@
         list.
         """
 
-        body = self.reader_client.list_servers(name='non_existing_server_name')
+        body = self.reader_servers_client.list_servers(
+            name='non_existing_server_name')
         servers = body['servers']
         self.assertEmpty(servers)
 
@@ -104,13 +102,14 @@
         """
 
         if self.is_requested_microversion_compatible('2.37'):
-            body = self.reader_client.list_servers(
+            body = self.reader_servers_client.list_servers(
                 status='non_existing_status')
             servers = body['servers']
             self.assertEmpty(servers)
         else:
             self.assertRaises(
-                lib_exc.BadRequest, self.reader_client.list_servers,
+                lib_exc.BadRequest,
+                self.reader_servers_client.list_servers,
                 status='non_existing_status')
 
     @decorators.attr(type=['negative'])
@@ -123,33 +122,39 @@
         """
 
         # Gather the complete list of servers in the project for reference
-        full_list = self.reader_client.list_servers()['servers']
+        full_list = self.reader_servers_client.list_servers()['servers']
         # List servers by specifying a greater value for limit
         limit = len(full_list) + 100
-        body = self.reader_client.list_servers(limit=limit)
+        body = self.reader_servers_client.list_servers(limit=limit)
         self.assertEqual(len(full_list), len(body['servers']))
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('679bc053-5e70-4514-9800-3dfab1a380a6')
     def test_list_servers_by_limits_pass_string(self):
         """Test listing servers by non-integer limit should fail"""
-        self.assertRaises(lib_exc.BadRequest, self.reader_client.list_servers,
-                          limit='testing')
+        self.assertRaises(
+            lib_exc.BadRequest,
+            self.reader_servers_client.list_servers,
+            limit='testing')
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('62610dd9-4713-4ee0-8beb-fd2c1aa7f950')
     def test_list_servers_by_limits_pass_negative_value(self):
         """Test listing servers by negative limit should fail"""
-        self.assertRaises(lib_exc.BadRequest, self.reader_client.list_servers,
-                          limit=-1)
+        self.assertRaises(
+            lib_exc.BadRequest,
+            self.reader_servers_client.list_servers,
+            limit=-1)
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('87d12517-e20a-4c9c-97b6-dd1628d6d6c9')
     def test_list_servers_by_changes_since_invalid_date(self):
         """Test listing servers by invalid changes-since format should fail"""
         params = {'changes-since': '2011/01/01'}
-        self.assertRaises(lib_exc.BadRequest, self.reader_client.list_servers,
-                          **params)
+        self.assertRaises(
+            lib_exc.BadRequest,
+            self.reader_servers_client.list_servers,
+            **params)
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('74745ad8-b346-45b5-b9b8-509d7447fc1f')
@@ -165,14 +170,14 @@
         # {'status': 'ACTIVE'} along with changes-since as filter.
         changes_since = {'changes-since': '2051-01-01T12:34:00Z',
                          'status': 'ACTIVE'}
-        body = self.reader_client.list_servers(**changes_since)
+        body = self.reader_servers_client.list_servers(**changes_since)
         self.assertEmpty(body['servers'])
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('93055106-2d34-46fe-af68-d9ddbf7ee570')
     def test_list_servers_detail_server_is_deleted(self):
         """Test listing servers detail should not contain deleted server"""
-        body = self.reader_client.list_servers(detail=True)
+        body = self.reader_servers_client.list_servers(detail=True)
         servers = body['servers']
         actual = [srv for srv in servers
                   if srv['id'] == self.deleted_id]
diff --git a/tempest/api/compute/servers/test_novnc.py b/tempest/api/compute/servers/test_novnc.py
index a9f68e6..95f5b99 100644
--- a/tempest/api/compute/servers/test_novnc.py
+++ b/tempest/api/compute/servers/test_novnc.py
@@ -51,7 +51,6 @@
     @classmethod
     def setup_clients(cls):
         super(NoVNCConsoleTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -65,12 +64,12 @@
     def test_novnc(self):
         """Test accessing novnc console of server"""
         if self.use_get_remote_console:
-            body = self.client.get_remote_console(
+            body = self.servers_client.get_remote_console(
                 self.server['id'], console_type='novnc',
                 protocol='vnc')['remote_console']
         else:
-            body = self.client.get_vnc_console(self.server['id'],
-                                               type='novnc')['console']
+            body = self.servers_client.get_vnc_console(self.server['id'],
+                                                       type='novnc')['console']
         self.assertEqual('novnc', body['type'])
         # Do the initial HTTP Request to novncproxy to get the NoVNC JavaScript
         self.validate_novnc_html(body['url'])
@@ -89,12 +88,12 @@
         the novnc proxy should reject the connection and closed it.
         """
         if self.use_get_remote_console:
-            body = self.client.get_remote_console(
+            body = self.servers_client.get_remote_console(
                 self.server['id'], console_type='novnc',
                 protocol='vnc')['remote_console']
         else:
-            body = self.client.get_vnc_console(self.server['id'],
-                                               type='novnc')['console']
+            body = self.servers_client.get_vnc_console(self.server['id'],
+                                                       type='novnc')['console']
         self.assertEqual('novnc', body['type'])
         # Do the WebSockify HTTP Request to novncproxy with a bad token
         parts = urlparse.urlparse(body['url'])
diff --git a/tempest/api/compute/servers/test_server_actions.py b/tempest/api/compute/servers/test_server_actions.py
index 10153bb..1fe4a65 100644
--- a/tempest/api/compute/servers/test_server_actions.py
+++ b/tempest/api/compute/servers/test_server_actions.py
@@ -45,7 +45,7 @@
         try:
             self.validation_resources = self.get_class_validation_resources(
                 self.os_primary)
-            waiters.wait_for_server_status(self.client,
+            waiters.wait_for_server_status(self.servers_client,
                                            self.server_id, 'ACTIVE')
         except lib_exc.NotFound:
             # The server was deleted by previous test, create a new one
@@ -78,7 +78,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServerActionsBase, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -89,14 +88,15 @@
     def _test_reboot_server(self, reboot_type):
         if CONF.validation.run_validation:
             # Get the time the server was last rebooted,
-            server = self.client.show_server(self.server_id)['server']
+            server = self.reader_servers_client.show_server(
+                self.server_id)['server']
             linux_client = remote_client.RemoteClient(
                 self.get_server_ip(server, self.validation_resources),
                 self.ssh_user,
                 self.password,
                 self.validation_resources['keypair']['private_key'],
                 server=server,
-                servers_client=self.client)
+                servers_client=self.servers_client)
             boot_time = linux_client.get_boot_time()
 
             # NOTE: This sync is for avoiding the loss of pub key data
@@ -113,22 +113,23 @@
                 self.password,
                 self.validation_resources['keypair']['private_key'],
                 server=server,
-                servers_client=self.client)
+                servers_client=self.servers_client)
             new_boot_time = linux_client.get_boot_time()
             self.assertGreater(new_boot_time, boot_time,
                                '%s > %s' % (new_boot_time, boot_time))
 
     def _test_rebuild_server(self, server_id, **kwargs):
         # Get the IPs the server has before rebuilding it
-        original_addresses = (self.client.show_server(server_id)['server']
-                              ['addresses'])
+        original_addresses = (
+            self.reader_servers_client.show_server(server_id)['server']
+            ['addresses'])
         # The server should be rebuilt using the provided image and data
         meta = {'rebuild': 'server'}
         new_name = data_utils.rand_name(
             prefix=CONF.resource_name_prefix,
             name=self.__class__.__name__ + '-server')
         password = 'rebuildPassw0rd'
-        rebuilt_server = self.client.rebuild_server(
+        rebuilt_server = self.servers_client.rebuild_server(
             server_id,
             self.image_ref_alt,
             name=new_name,
@@ -142,9 +143,10 @@
         self.assert_flavor_equal(self.flavor_ref, rebuilt_server['flavor'])
 
         # Verify the server properties after the rebuild completes
-        waiters.wait_for_server_status(self.client,
+        waiters.wait_for_server_status(self.servers_client,
                                        rebuilt_server['id'], 'ACTIVE')
-        server = self.client.show_server(rebuilt_server['id'])['server']
+        server = self.reader_servers_client.show_server(
+            rebuilt_server['id'])['server']
         rebuilt_image_id = server['image']['id']
         self.assertTrue(self.image_ref_alt.endswith(rebuilt_image_id))
         self.assertEqual(new_name, server['name'])
@@ -169,7 +171,7 @@
                 password,
                 validation_resources['keypair']['private_key'],
                 server=rebuilt_server,
-                servers_client=self.client)
+                servers_client=self.servers_client)
             linux_client.validate_authentication()
 
     def _test_resize_server_confirm(self, server_id, stop=False):
@@ -177,31 +179,31 @@
         # the provided flavor
 
         if stop:
-            self.client.stop_server(server_id)
-            waiters.wait_for_server_status(self.client, server_id,
+            self.servers_client.stop_server(server_id)
+            waiters.wait_for_server_status(self.servers_client, server_id,
                                            'SHUTOFF')
 
-        self.client.resize_server(server_id, self.flavor_ref_alt)
+        self.servers_client.resize_server(server_id, self.flavor_ref_alt)
         # NOTE(jlk): Explicitly delete the server to get a new one for later
         # tests. Avoids resize down race issues.
         self.addCleanup(self.delete_server, server_id)
-        waiters.wait_for_server_status(self.client, server_id,
+        waiters.wait_for_server_status(self.servers_client, server_id,
                                        'VERIFY_RESIZE')
 
-        self.client.confirm_resize_server(server_id)
+        self.servers_client.confirm_resize_server(server_id)
         expected_status = 'SHUTOFF' if stop else 'ACTIVE'
-        waiters.wait_for_server_status(self.client, server_id,
+        waiters.wait_for_server_status(self.servers_client, server_id,
                                        expected_status)
 
-        server = self.client.show_server(server_id)['server']
+        server = self.reader_servers_client.show_server(server_id)['server']
         self.assert_flavor_equal(self.flavor_ref_alt, server['flavor'])
 
         if stop:
             # NOTE(mriedem): tearDown requires the server to be started.
-            self.client.start_server(server_id)
+            self.servers_client.start_server(server_id)
 
     def _get_output(self, server_id):
-        output = self.client.get_console_output(
+        output = self.servers_client.get_console_output(
             server_id, length=3)['output']
         self.assertTrue(output, "Console output was empty.")
         lines = len(output.split('\n'))
@@ -234,18 +236,21 @@
         self.addCleanup(self.delete_server, newserver['id'])
         # The server's password should be set to the provided password
         new_password = 'Newpass1234'
-        self.client.change_password(newserver['id'], adminPass=new_password)
-        waiters.wait_for_server_status(self.client, newserver['id'], 'ACTIVE')
+        self.servers_client.change_password(newserver['id'],
+                                            adminPass=new_password)
+        waiters.wait_for_server_status(self.servers_client, newserver['id'],
+                                       'ACTIVE')
 
         if CONF.validation.run_validation:
             # Verify that the user can authenticate with the new password
-            server = self.client.show_server(newserver['id'])['server']
+            server = self.reader_servers_client.show_server(
+                newserver['id'])['server']
             linux_client = remote_client.RemoteClient(
                 self.get_server_ip(server, self.validation_resources),
                 self.ssh_user,
                 new_password,
                 server=server,
-                servers_client=self.client)
+                servers_client=self.servers_client)
             linux_client.validate_authentication()
 
     @decorators.attr(type='smoke')
@@ -279,13 +284,13 @@
         # ip attached at the beginning of the test_rebuild_server let's
         # make sure right here the floating ip is attached
         waiters.wait_for_server_floating_ip(
-            self.client,
+            self.servers_client,
             server,
             validation_resources['floating_ip'])
 
         self.addCleanup(waiters.wait_for_server_termination,
-                        self.client, server['id'])
-        self.addCleanup(self.client.delete_server, server['id'])
+                        self.servers_client, server['id'])
+        self.addCleanup(self.servers_client.delete_server, server['id'])
 
         self._test_rebuild_server(
             server_id=server['id'],
@@ -308,17 +313,19 @@
         values after a resize is reverted.
         """
 
-        self.client.resize_server(self.server_id, self.flavor_ref_alt)
+        self.servers_client.resize_server(self.server_id, self.flavor_ref_alt)
         # NOTE(zhufl): Explicitly delete the server to get a new one for later
         # tests. Avoids resize down race issues.
         self.addCleanup(self.delete_server, self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id,
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
                                        'VERIFY_RESIZE')
 
-        self.client.revert_resize_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
+        self.servers_client.revert_resize_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
 
-        server = self.client.show_server(self.server_id)['server']
+        server = self.reader_servers_client.show_server(
+            self.server_id)['server']
         self.assert_flavor_equal(self.flavor_ref, server['flavor'])
 
     @decorators.idempotent_id('4b8867e6-fffa-4d54-b1d1-6fdda57be2f3')
@@ -344,29 +351,34 @@
                           'Pause is not available.')
     def test_pause_unpause_server(self):
         """Test pausing and unpausing server"""
-        self.client.pause_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'PAUSED')
-        self.client.unpause_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
+        self.servers_client.pause_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'PAUSED')
+        self.servers_client.unpause_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
 
     @decorators.idempotent_id('0d8ee21e-b749-462d-83da-b85b41c86c7f')
     @testtools.skipUnless(CONF.compute_feature_enabled.suspend,
                           'Suspend is not available.')
     def test_suspend_resume_server(self):
         """Test suspending and resuming server"""
-        self.client.suspend_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id,
+        self.servers_client.suspend_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
                                        'SUSPENDED')
-        self.client.resume_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
+        self.servers_client.resume_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
 
     @decorators.idempotent_id('af8eafd4-38a7-4a4b-bdbc-75145a580560')
     def test_stop_start_server(self):
         """Test stopping and starting server"""
-        self.client.stop_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'SHUTOFF')
-        self.client.start_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
+        self.servers_client.stop_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'SHUTOFF')
+        self.servers_client.start_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
 
     @decorators.idempotent_id('80a8094c-211e-440a-ab88-9e59d556c7ee')
     def test_lock_unlock_server(self):
@@ -377,18 +389,21 @@
         Then unlock the server, now the server can be stopped and started.
         """
         # Lock the server,try server stop(exceptions throw),unlock it and retry
-        self.client.lock_server(self.server_id)
-        self.addCleanup(self.client.unlock_server, self.server_id)
-        server = self.client.show_server(self.server_id)['server']
+        self.servers_client.lock_server(self.server_id)
+        self.addCleanup(self.servers_client.unlock_server, self.server_id)
+        server = self.reader_servers_client.show_server(
+            self.server_id)['server']
         self.assertEqual(server['status'], 'ACTIVE')
         # Locked server is not allowed to be stopped by non-admin user
         self.assertRaises(lib_exc.Conflict,
-                          self.client.stop_server, self.server_id)
-        self.client.unlock_server(self.server_id)
-        self.client.stop_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'SHUTOFF')
-        self.client.start_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
+                          self.servers_client.stop_server, self.server_id)
+        self.servers_client.unlock_server(self.server_id)
+        self.servers_client.stop_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'SHUTOFF')
+        self.servers_client.start_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
 
 
 class ServerActionsTestOtherA(ServerActionsBase):
@@ -398,11 +413,11 @@
         server = self.create_test_server(wait_until='ACTIVE')
 
         # Remove all Security group
-        self.client.remove_security_group(
+        self.servers_client.remove_security_group(
             server['id'], name=server['security_groups'][0]['name'])
 
         # Verify all Security group
-        server = self.client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertNotIn('security_groups', server)
 
     @decorators.idempotent_id('30449a88-5aff-4f9b-9866-6ee9b17f906d')
@@ -420,16 +435,17 @@
         server = servers[0]
 
         self.addCleanup(waiters.wait_for_server_termination,
-                        self.client, server['id'])
-        self.addCleanup(self.client.delete_server, server['id'])
-        server = self.client.show_server(server['id'])['server']
+                        self.servers_client, server['id'])
+        self.addCleanup(self.servers_client.delete_server, server['id'])
+        server = self.reader_servers_client.show_server(server['id'])['server']
         old_image = server['image']['id']
         new_image = (self.image_ref_alt
                      if old_image == self.image_ref else self.image_ref)
-        self.client.stop_server(server['id'])
-        waiters.wait_for_server_status(self.client, server['id'], 'SHUTOFF')
-        rebuilt_server = (self.client.rebuild_server(server['id'], new_image)
-                          ['server'])
+        self.servers_client.stop_server(server['id'])
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'SHUTOFF')
+        rebuilt_server = (self.servers_client.rebuild_server(
+            server['id'], new_image)['server'])
 
         # Verify the properties in the initial response are correct
         self.assertEqual(server['id'], rebuilt_server['id'])
@@ -438,9 +454,10 @@
         self.assert_flavor_equal(self.flavor_ref, rebuilt_server['flavor'])
 
         # Verify the server properties after the rebuild completes
-        waiters.wait_for_server_status(self.client,
+        waiters.wait_for_server_status(self.servers_client,
                                        rebuilt_server['id'], 'SHUTOFF')
-        server = self.client.show_server(rebuilt_server['id'])['server']
+        server = self.reader_servers_client.show_server(
+            rebuilt_server['id'])['server']
         rebuilt_image_id = server['image']['id']
         self.assertEqual(new_image, rebuilt_image_id)
 
@@ -468,10 +485,10 @@
             wait_until='SSHABLE')
         server = servers[0]
         self.addCleanup(waiters.wait_for_server_termination,
-                        self.client, server['id'])
-        self.addCleanup(self.client.delete_server, server['id'])
+                        self.servers_client, server['id'])
+        self.addCleanup(self.servers_client.delete_server, server['id'])
 
-        server = self.client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         waiters.wait_for_volume_resource_status(self.volumes_client,
                                                 volume['id'], 'available')
         self.attach_volume(server, volume)
@@ -506,7 +523,7 @@
 
         # NOTE(mgoddard): Get detailed server to ensure addresses are present
         # in fixed IP case.
-        server = self.servers_client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
 
         self._test_resize_server_confirm(server['id'])
 
@@ -514,7 +531,7 @@
             # Now do something interactive with the guest like get its console
             # output; we don't actually care about the output,
             # just that it doesn't raise an error.
-            self.client.get_console_output(server['id'])
+            self.servers_client.get_console_output(server['id'])
         if CONF.validation.run_validation:
             linux_client = remote_client.RemoteClient(
                 self.get_server_ip(server, self.validation_resources),
@@ -522,7 +539,7 @@
                 password=None,
                 pkey=self.validation_resources['keypair']['private_key'],
                 server=server,
-                servers_client=self.client)
+                servers_client=self.servers_client)
             linux_client.validate_authentication()
 
 
@@ -550,21 +567,24 @@
 
         # Create a blank volume and attach it to the server created in setUp.
         volume = self.create_volume()
-        server = self.client.show_server(self.server_id)['server']
+        server = self.reader_servers_client.show_server(
+            self.server_id)['server']
         self.attach_volume(server, volume)
         # Now resize the server with the blank volume attached.
-        self.client.resize_server(self.server_id, self.flavor_ref_alt)
+        self.servers_client.resize_server(self.server_id, self.flavor_ref_alt)
         # Explicitly delete the server to get a new one for later
         # tests. Avoids resize down race issues.
         self.addCleanup(self.delete_server, self.server_id)
         waiters.wait_for_server_status(
-            self.client, self.server_id, 'VERIFY_RESIZE')
+            self.servers_client, self.server_id, 'VERIFY_RESIZE')
         # Now revert the resize which should move the instance and it's volume
         # attachment back to the original source compute host.
-        self.client.revert_resize_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
+        self.servers_client.revert_resize_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
         # Make sure everything still looks OK.
-        server = self.client.show_server(self.server_id)['server']
+        server = self.reader_servers_client.show_server(
+            self.server_id)['server']
         self.assert_flavor_equal(self.flavor_ref, server['flavor'])
         attached_volumes = server['os-extended-volumes:volumes_attached']
         self.assertEqual(1, len(attached_volumes))
@@ -593,10 +613,10 @@
 
         backup1 = data_utils.rand_name(
             prefix=CONF.resource_name_prefix, name='backup-1')
-        resp = self.client.create_backup(self.server_id,
-                                         backup_type='daily',
-                                         rotation=2,
-                                         name=backup1)
+        resp = self.servers_client.create_backup(self.server_id,
+                                                 backup_type='daily',
+                                                 rotation=2,
+                                                 name=backup1)
         oldest_backup_exist = True
 
         # the oldest one should be deleted automatically in this test
@@ -630,11 +650,12 @@
 
         backup2 = data_utils.rand_name(
             prefix=CONF.resource_name_prefix, name='backup-2')
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
-        resp = self.client.create_backup(self.server_id,
-                                         backup_type='daily',
-                                         rotation=2,
-                                         name=backup2)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
+        resp = self.servers_client.create_backup(self.server_id,
+                                                 backup_type='daily',
+                                                 rotation=2,
+                                                 name=backup2)
         if api_version_utils.compare_version_header_to_response(
                 "OpenStack-API-Version", "compute 2.45", resp.response, "lt"):
             image2_id = resp['image_id']
@@ -669,11 +690,12 @@
         # the first one will be deleted
         backup3 = data_utils.rand_name(
             prefix=CONF.resource_name_prefix, name='backup-3')
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
-        resp = self.client.create_backup(self.server_id,
-                                         backup_type='daily',
-                                         rotation=2,
-                                         name=backup3)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
+        resp = self.servers_client.create_backup(self.server_id,
+                                                 backup_type='daily',
+                                                 rotation=2,
+                                                 name=backup3)
         if api_version_utils.compare_version_header_to_response(
                 "OpenStack-API-Version", "compute 2.45", resp.response, "lt"):
             image3_id = resp['image_id']
@@ -683,7 +705,8 @@
                                             image3_id, 'success')
         self.addCleanup(glance_client.delete_image, image3_id)
         # the first back up should be deleted
-        waiters.wait_for_server_status(self.client, self.server_id, 'ACTIVE')
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'ACTIVE')
         glance_client.wait_for_resource_deletion(image1_id)
         oldest_backup_exist = False
         image_list = glance_client.list_images(params)['images']
@@ -707,7 +730,8 @@
         server = self.create_test_server(wait_until='ACTIVE')
 
         def _check_full_length_console_log():
-            output = self.client.get_console_output(server['id'])['output']
+            output = self.servers_client.get_console_output(server['id'])[
+                'output']
             self.assertTrue(output, "Console output was empty.")
             lines = len(output.split('\n'))
 
@@ -735,8 +759,9 @@
         server = self.create_test_server(wait_until='ACTIVE')
         temp_server_id = server['id']
 
-        self.client.stop_server(temp_server_id)
-        waiters.wait_for_server_status(self.client, temp_server_id, 'SHUTOFF')
+        self.servers_client.stop_server(temp_server_id)
+        waiters.wait_for_server_status(self.servers_client, temp_server_id,
+                                       'SHUTOFF')
         self.wait_for(self._get_output, temp_server_id)
 
     @decorators.idempotent_id('77eba8e0-036e-4635-944b-f7a8f3b78dc9')
@@ -750,19 +775,20 @@
         else:
             raise lib_exc.InvalidConfiguration(
                 'api_v2 must be True in [image-feature-enabled].')
-        compute.shelve_server(self.client, self.server_id,
+        compute.shelve_server(self.servers_client, self.server_id,
                               force_shelve_offload=True)
 
-        server = self.client.show_server(self.server_id)['server']
+        server = self.reader_servers_client.show_server(
+            self.server_id)['server']
         image_name = server['name'] + '-shelved'
         params = {'name': image_name}
         images = glance_client.list_images(params)['images']
         self.assertEqual(1, len(images))
         self.assertEqual(image_name, images[0]['name'])
 
-        body = self.client.unshelve_server(self.server_id)
+        body = self.servers_client.unshelve_server(self.server_id)
         waiters.wait_for_server_status(
-            self.client,
+            self.servers_client,
             self.server_id,
             "ACTIVE",
             request_id=body.response["x-openstack-request-id"],
@@ -778,10 +804,11 @@
     def test_shelve_paused_server(self):
         """Test shelving a paused server"""
         server = self.create_test_server(wait_until='ACTIVE')
-        self.client.pause_server(server['id'])
-        waiters.wait_for_server_status(self.client, server['id'], 'PAUSED')
+        self.servers_client.pause_server(server['id'])
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'PAUSED')
         # Check if Shelve operation is successful on paused server.
-        compute.shelve_server(self.client, server['id'],
+        compute.shelve_server(self.servers_client, server['id'],
                               force_shelve_offload=True)
 
     @decorators.idempotent_id('c6bc11bf-592e-4015-9319-1c98dc64daf5')
@@ -793,10 +820,10 @@
         The returned vnc console url should be in valid format.
         """
         if self.is_requested_microversion_compatible('2.5'):
-            body = self.client.get_vnc_console(
+            body = self.servers_client.get_vnc_console(
                 self.server_id, type='novnc')['console']
         else:
-            body = self.client.get_remote_console(
+            body = self.servers_client.get_remote_console(
                 self.server_id, console_type='novnc',
                 protocol='vnc')['remote_console']
         self.assertEqual('novnc', body['type'])
@@ -853,6 +880,10 @@
         super(ServerActionsV293TestJSON, cls).setup_credentials()
 
     @classmethod
+    def setup_clients(cls):
+        super(ServerActionsV293TestJSON, cls).setup_clients()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerActionsV293TestJSON, cls).resource_setup()
         cls.server_id = cls.recreate_server(None, volume_backed=True,
@@ -863,7 +894,8 @@
         """Test rebuilding a volume backed server"""
         self.validation_resources = self.get_class_validation_resources(
             self.os_primary)
-        server = self.servers_client.show_server(self.server_id)['server']
+        server = self.reader_servers_client.show_server(
+            self.server_id)['server']
         volume_id = server['os-extended-volumes:volumes_attached'][0]['id']
         volume_before_rebuild = self.volumes_client.show_volume(volume_id)
         image_before_rebuild = (
@@ -912,7 +944,7 @@
         # Verify the server properties after the rebuild completes
         waiters.wait_for_server_status(self.servers_client,
                                        rebuilt_server['id'], 'ACTIVE')
-        server = self.servers_client.show_server(
+        server = self.reader_servers_client.show_server(
             rebuilt_server['id'])['server']
         volume_id = server['os-extended-volumes:volumes_attached'][0]['id']
         volume_after_rebuild = self.volumes_client.show_volume(volume_id)
diff --git a/tempest/api/compute/servers/test_server_addresses.py b/tempest/api/compute/servers/test_server_addresses.py
index 978a9da..429ffff 100644
--- a/tempest/api/compute/servers/test_server_addresses.py
+++ b/tempest/api/compute/servers/test_server_addresses.py
@@ -14,9 +14,13 @@
 #    under the License.
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.lib import decorators
 
 
+CONF = config.CONF
+
+
 class ServerAddressesTestJSON(base.BaseV2ComputeTest):
     """Test server addresses"""
     create_default_network = True
@@ -24,7 +28,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServerAddressesTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -40,7 +43,8 @@
         All public and private addresses for a server should be returned.
         """
 
-        addresses = self.client.list_addresses(self.server['id'])['addresses']
+        addresses = self.reader_servers_client.list_addresses(
+            self.server['id'])['addresses']
 
         # We do not know the exact network configuration, but an instance
         # should at least have a single public or private address
@@ -57,14 +61,16 @@
         the specified one.
         """
 
-        addresses = self.client.list_addresses(self.server['id'])['addresses']
+        addresses = self.reader_servers_client.list_addresses(
+            self.server['id'])['addresses']
 
         # Once again we don't know the environment's exact network config,
         # but the response for each individual network should be the same
         # as the partial result of the full address list
         id = self.server['id']
         for addr_type in addresses:
-            addr = self.client.list_addresses_by_network(id, addr_type)
+            addr = self.reader_servers_client.list_addresses_by_network(
+                id, addr_type)
 
             addr = addr[addr_type]
             for address in addresses[addr_type]:
diff --git a/tempest/api/compute/servers/test_server_addresses_negative.py b/tempest/api/compute/servers/test_server_addresses_negative.py
index bb21594..8688cd7 100644
--- a/tempest/api/compute/servers/test_server_addresses_negative.py
+++ b/tempest/api/compute/servers/test_server_addresses_negative.py
@@ -25,7 +25,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServerAddressesNegativeTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -36,13 +35,13 @@
     @decorators.idempotent_id('02c3f645-2d2e-4417-8525-68c0407d001b')
     def test_list_server_addresses_invalid_server_id(self):
         """List addresses request should fail if server id not in system"""
-        self.assertRaises(lib_exc.NotFound, self.client.list_addresses,
-                          '999')
+        self.assertRaises(lib_exc.NotFound,
+                          self.reader_servers_client.list_addresses, '999')
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('a2ab5144-78c0-4942-a0ed-cc8edccfd9ba')
     def test_list_server_addresses_by_network_neg(self):
         """List addresses by network should fail if network name not valid"""
         self.assertRaises(lib_exc.NotFound,
-                          self.client.list_addresses_by_network,
+                          self.reader_servers_client.list_addresses_by_network,
                           self.server['id'], 'invalid')
diff --git a/tempest/api/compute/servers/test_server_group.py b/tempest/api/compute/servers/test_server_group.py
index f92b5ba..c4408ed 100644
--- a/tempest/api/compute/servers/test_server_group.py
+++ b/tempest/api/compute/servers/test_server_group.py
@@ -37,6 +37,10 @@
     def setup_clients(cls):
         super(ServerGroupTestJSON, cls).setup_clients()
         cls.client = cls.server_groups_client
+        if CONF.enforce_scope.nova:
+            cls.reader_sg_client = cls.os_project_reader.server_groups_client
+        else:
+            cls.reader_sg_client = cls.client
 
     @classmethod
     def _set_policy(cls, policy):
@@ -78,7 +82,8 @@
         # delete the test server-group
         self.client.delete_server_group(server_group['id'])
         # validation of server-group deletion
-        server_group_list = self.client.list_server_groups()['server_groups']
+        server_group_list = self.reader_sg_client.list_server_groups()[
+            'server_groups']
         self.assertNotIn(server_group, server_group_list)
 
     def _create_delete_server_group(self, policy):
@@ -118,14 +123,14 @@
     @decorators.idempotent_id('b3545034-dd78-48f0-bdc2-a4adfa6d0ead')
     def test_show_server_group(self):
         """Test getting the server-group detail"""
-        body = self.client.show_server_group(
+        body = self.reader_sg_client.show_server_group(
             self.created_server_group['id'])['server_group']
         self.assertEqual(self.created_server_group, body)
 
     @decorators.idempotent_id('d4874179-27b4-4d7d-80e4-6c560cdfe321')
     def test_list_server_groups(self):
         """Test listing the server-groups"""
-        body = self.client.list_server_groups()['server_groups']
+        body = self.reader_sg_client.list_server_groups()['server_groups']
         self.assertIn(self.created_server_group, body)
 
     @decorators.idempotent_id('ed20d3fb-9d1f-4329-b160-543fbd5d9811')
@@ -140,7 +145,7 @@
         self.addCleanup(self.delete_server, server['id'])
 
         # Check a server is in the group
-        server_group = (self.server_groups_client.show_server_group(
+        server_group = (self.reader_sg_client.show_server_group(
             self.created_server_group['id'])['server_group'])
         self.assertIn(server['id'], server_group['members'])
 
@@ -154,6 +159,14 @@
     create_default_network = True
     min_microversion = '2.64'
 
+    @classmethod
+    def setup_clients(cls):
+        super(ServerGroup264TestJSON, cls).setup_clients()
+        if CONF.enforce_scope.nova:
+            cls.reader_client = cls.os_project_reader.server_groups_client
+        else:
+            cls.reader_client = cls.server_groups_client
+
     @decorators.idempotent_id('b52f09dd-2133-4037-9a5d-bdb260096a88')
     def test_create_get_server_group(self):
         # create, get the test server-group with given policy
@@ -162,5 +175,5 @@
         self.addCleanup(
             self.server_groups_client.delete_server_group,
             server_group['id'])
-        self.server_groups_client.list_server_groups()
-        self.server_groups_client.show_server_group(server_group['id'])
+        self.reader_client.list_server_groups()
+        self.reader_client.show_server_group(server_group['id'])
diff --git a/tempest/api/compute/servers/test_server_metadata.py b/tempest/api/compute/servers/test_server_metadata.py
index 5f35b15..3e82202 100644
--- a/tempest/api/compute/servers/test_server_metadata.py
+++ b/tempest/api/compute/servers/test_server_metadata.py
@@ -29,7 +29,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServerMetadataTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -39,7 +38,7 @@
     def setUp(self):
         super(ServerMetadataTestJSON, self).setUp()
         meta = {'key1': 'value1', 'key2': 'value2'}
-        self.client.set_server_metadata(self.server['id'], meta)
+        self.servers_client.set_server_metadata(self.server['id'], meta)
 
     @decorators.idempotent_id('479da087-92b3-4dcf-aeb3-fd293b2d14ce')
     def test_list_server_metadata(self):
@@ -47,8 +46,9 @@
 
         All metadata key/value pairs for a server should be returned.
         """
-        resp_metadata = (self.client.list_server_metadata(self.server['id'])
-                         ['metadata'])
+        resp_metadata = (
+            self.reader_servers_client.list_server_metadata(self.server['id'])
+            ['metadata'])
 
         # Verify the expected metadata items are in the list
         expected = {'key1': 'value1', 'key2': 'value2'}
@@ -62,12 +62,14 @@
         """
         # Create a new set of metadata for the server
         req_metadata = {'meta2': 'data2', 'meta3': 'data3'}
-        self.client.set_server_metadata(self.server['id'], req_metadata)
+        self.servers_client.set_server_metadata(self.server['id'],
+                                                req_metadata)
 
         # Verify the expected values are correct, and that the
         # previous values have been removed
-        resp_metadata = (self.client.list_server_metadata(self.server['id'])
-                         ['metadata'])
+        resp_metadata = (
+            self.reader_servers_client.list_server_metadata(self.server['id'])
+            ['metadata'])
         self.assertEqual(resp_metadata, req_metadata)
 
     @decorators.idempotent_id('344d981e-0c33-4997-8a5d-6c1d803e4134')
@@ -77,11 +79,12 @@
         The server's metadata values should be updated to the provided values.
         """
         meta = {'key1': 'alt1', 'key3': 'value3'}
-        self.client.update_server_metadata(self.server['id'], meta)
+        self.servers_client.update_server_metadata(self.server['id'], meta)
 
         # Verify the values have been updated to the proper values
-        resp_metadata = (self.client.list_server_metadata(self.server['id'])
-                         ['metadata'])
+        resp_metadata = (
+            self.reader_servers_client.list_server_metadata(self.server['id'])
+            ['metadata'])
         expected = {'key1': 'alt1', 'key2': 'value2', 'key3': 'value3'}
         self.assertEqual(expected, resp_metadata)
 
@@ -93,17 +96,18 @@
         body is passed.
         """
         meta = {}
-        self.client.update_server_metadata(self.server['id'], meta)
-        resp_metadata = (self.client.list_server_metadata(self.server['id'])
-                         ['metadata'])
+        self.servers_client.update_server_metadata(self.server['id'], meta)
+        resp_metadata = (
+            self.reader_servers_client.list_server_metadata(self.server['id'])
+            ['metadata'])
         expected = {'key1': 'value1', 'key2': 'value2'}
         self.assertEqual(expected, resp_metadata)
 
     @decorators.idempotent_id('3043c57d-7e0e-49a6-9a96-ad569c265e6a')
     def test_get_server_metadata_item(self):
         """Test getting specific server metadata item"""
-        meta = self.client.show_server_metadata_item(self.server['id'],
-                                                     'key2')['meta']
+        meta = self.reader_servers_client.show_server_metadata_item(
+            self.server['id'], 'key2')['meta']
         self.assertEqual('value2', meta['key2'])
 
     @decorators.idempotent_id('58c02d4f-5c67-40be-8744-d3fa5982eb1c')
@@ -115,11 +119,13 @@
 
         # Update the metadata value.
         meta = {'nova': 'alt'}
-        self.client.set_server_metadata_item(self.server['id'], 'nova', meta)
+        self.servers_client.set_server_metadata_item(self.server['id'],
+                                                     'nova', meta)
 
         # Verify the meta item's value has been updated
-        resp_metadata = (self.client.list_server_metadata(self.server['id'])
-                         ['metadata'])
+        resp_metadata = (
+            self.reader_servers_client.list_server_metadata(self.server['id'])
+            ['metadata'])
         expected = {'key1': 'value1', 'key2': 'value2', 'nova': 'alt'}
         self.assertEqual(expected, resp_metadata)
 
@@ -129,10 +135,12 @@
 
         The metadata value/key pair should be deleted from the server.
         """
-        self.client.delete_server_metadata_item(self.server['id'], 'key1')
+        self.servers_client.delete_server_metadata_item(self.server['id'],
+                                                        'key1')
 
         # Verify the metadata item has been removed
-        resp_metadata = (self.client.list_server_metadata(self.server['id'])
-                         ['metadata'])
+        resp_metadata = (
+            self.reader_servers_client.list_server_metadata(self.server['id'])
+            ['metadata'])
         expected = {'key2': 'value2'}
         self.assertEqual(expected, resp_metadata)
diff --git a/tempest/api/compute/servers/test_server_metadata_negative.py b/tempest/api/compute/servers/test_server_metadata_negative.py
index 2059dfa..5ba83ad 100644
--- a/tempest/api/compute/servers/test_server_metadata_negative.py
+++ b/tempest/api/compute/servers/test_server_metadata_negative.py
@@ -27,12 +27,11 @@
     @classmethod
     def setup_clients(cls):
         super(ServerMetadataNegativeTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
         super(ServerMetadataNegativeTestJSON, cls).resource_setup()
-        cls.tenant_id = cls.client.tenant_id
+        cls.tenant_id = cls.servers_client.tenant_id
         cls.server = cls.create_test_server(metadata={}, wait_until='ACTIVE')
 
     @decorators.attr(type=['negative'])
@@ -68,7 +67,7 @@
         # GET on a non-existent server should not succeed
         non_existent_server_id = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.show_server_metadata_item,
+                          self.reader_servers_client.show_server_metadata_item,
                           non_existent_server_id,
                           'test2')
 
@@ -78,7 +77,7 @@
         """Test listing metadata for a non existent server should fail"""
         non_existent_server_id = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.list_server_metadata,
+                          self.reader_servers_client.list_server_metadata,
                           non_existent_server_id)
 
     @decorators.attr(type=['negative'])
@@ -90,7 +89,7 @@
         """
         meta = {'testkey': 'testvalue'}
         self.assertRaises(lib_exc.BadRequest,
-                          self.client.set_server_metadata_item,
+                          self.servers_client.set_server_metadata_item,
                           self.server['id'], 'key', meta)
 
     @decorators.attr(type=['negative'])
@@ -100,7 +99,7 @@
         non_existent_server_id = data_utils.rand_uuid()
         meta = {'meta1': 'data1'}
         self.assertRaises(lib_exc.NotFound,
-                          self.client.set_server_metadata,
+                          self.servers_client.set_server_metadata,
                           non_existent_server_id,
                           meta)
 
@@ -111,7 +110,7 @@
         non_existent_server_id = data_utils.rand_uuid()
         meta = {'key1': 'value1', 'key2': 'value2'}
         self.assertRaises(lib_exc.NotFound,
-                          self.client.update_server_metadata,
+                          self.servers_client.update_server_metadata,
                           non_existent_server_id,
                           meta)
 
@@ -121,7 +120,7 @@
         """Test updating server metadata to blank key should fail"""
         meta = {'': 'data1'}
         self.assertRaises(lib_exc.BadRequest,
-                          self.client.update_server_metadata,
+                          self.servers_client.update_server_metadata,
                           self.server['id'], meta=meta)
 
     @decorators.attr(type=['negative'])
@@ -133,7 +132,7 @@
         """
         non_existent_server_id = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.delete_server_metadata_item,
+                          self.servers_client.delete_server_metadata_item,
                           non_existent_server_id,
                           'd')
 
@@ -155,14 +154,14 @@
         for num in range(1, quota_metadata + 2):
             req_metadata['key' + str(num)] = 'val' + str(num)
         self.assertRaises((lib_exc.OverLimit, lib_exc.Forbidden),
-                          self.client.set_server_metadata,
+                          self.servers_client.set_server_metadata,
                           self.server['id'], req_metadata)
 
         # A 403 Forbidden or 413 Overlimit (old behaviour) exception
         # will be raised while exceeding metadata items limit for
         # tenant.
         self.assertRaises((lib_exc.Forbidden, lib_exc.OverLimit),
-                          self.client.update_server_metadata,
+                          self.servers_client.update_server_metadata,
                           self.server['id'], req_metadata)
 
     @decorators.attr(type=['negative'])
@@ -171,7 +170,7 @@
         """Test setting server metadata with blank key should fail"""
         meta = {'': 'data1'}
         self.assertRaises(lib_exc.BadRequest,
-                          self.client.set_server_metadata,
+                          self.servers_client.set_server_metadata,
                           self.server['id'], meta=meta)
 
     @decorators.attr(type=['negative'])
@@ -180,5 +179,5 @@
         """Test setting server metadata without metadata field should fail"""
         meta = {'meta1': 'data1'}
         self.assertRaises(lib_exc.BadRequest,
-                          self.client.set_server_metadata,
+                          self.servers_client.set_server_metadata,
                           self.server['id'], meta=meta, no_metadata_field=True)
diff --git a/tempest/api/compute/servers/test_server_password.py b/tempest/api/compute/servers/test_server_password.py
index f61d4fd..205b0ec 100644
--- a/tempest/api/compute/servers/test_server_password.py
+++ b/tempest/api/compute/servers/test_server_password.py
@@ -15,15 +15,23 @@
 
 
 from tempest.api.compute import base
+from tempest import config
 from tempest.lib import decorators
 
 
+CONF = config.CONF
+
+
 class ServerPasswordTestJSON(base.BaseV2ComputeTest):
     """Test server password"""
 
     create_default_network = True
 
     @classmethod
+    def setup_clients(cls):
+        super(ServerPasswordTestJSON, cls).setup_clients()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerPasswordTestJSON, cls).resource_setup()
         cls.server = cls.create_test_server(wait_until="ACTIVE")
@@ -31,7 +39,7 @@
     @decorators.idempotent_id('f83b582f-62a8-4f22-85b0-0dee50ff783a')
     def test_get_server_password(self):
         """Test getting password of a server"""
-        self.servers_client.show_password(self.server['id'])
+        self.reader_servers_client.show_password(self.server['id'])
 
     @decorators.idempotent_id('f8229e8b-b625-4493-800a-bde86ac611ea')
     def test_delete_server_password(self):
diff --git a/tempest/api/compute/servers/test_server_personality.py b/tempest/api/compute/servers/test_server_personality.py
index 8a05e7a..a4b2ad3 100644
--- a/tempest/api/compute/servers/test_server_personality.py
+++ b/tempest/api/compute/servers/test_server_personality.py
@@ -45,7 +45,10 @@
     @classmethod
     def setup_clients(cls):
         super(ServerPersonalityTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
+        if CONF.enforce_scope.nova:
+            cls.reader_limits_client = cls.os_project_reader.limits_client
+        else:
+            cls.reader_limits_client = cls.limits_client
 
     # NOTE(mriedem): Marked as slow because personality (file injection) is
     # deprecated in nova so we don't care as much about running this all the
@@ -70,14 +73,15 @@
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.servers_client.delete_server,
                         created_server['id'])
-        server = self.client.show_server(created_server['id'])['server']
+        server = self.reader_servers_client.show_server(
+            created_server['id'])['server']
         if CONF.validation.run_validation:
             linux_client = remote_client.RemoteClient(
                 self.get_server_ip(server, validation_resources),
                 self.ssh_user, password,
                 validation_resources['keypair']['private_key'],
                 server=server,
-                servers_client=self.client)
+                servers_client=self.servers_client)
             self.assertEqual(file_contents,
                              linux_client.exec_command(
                                  'sudo cat %s' % file_path))
@@ -102,10 +106,10 @@
         file_contents = 'Test server rebuild.'
         personality = [{'path': 'rebuild.txt',
                         'contents': base64.encode_as_text(file_contents)}]
-        rebuilt_server = self.client.rebuild_server(server_id,
-                                                    self.image_ref_alt,
-                                                    personality=personality)
-        waiters.wait_for_server_status(self.client, server_id, 'ACTIVE')
+        rebuilt_server = self.servers_client.rebuild_server(
+            server_id, self.image_ref_alt, personality=personality)
+        waiters.wait_for_server_status(self.servers_client, server_id,
+                                       'ACTIVE')
         self.assertEqual(self.image_ref_alt,
                          rebuilt_server['server']['image']['id'])
 
@@ -118,7 +122,7 @@
         """
         file_contents = 'This is a test file.'
         personality = []
-        limits = self.limits_client.show_limits()['limits']
+        limits = self.reader_limits_client.show_limits()['limits']
         max_file_limit = limits['absolute']['maxPersonality']
         if max_file_limit == -1:
             raise self.skipException("No limit for personality files")
@@ -144,7 +148,7 @@
         files is injected into the server during creation.
         """
         file_contents = 'This is a test file.'
-        limits = self.limits_client.show_limits()['limits']
+        limits = self.reader_limits_client.show_limits()['limits']
         max_file_limit = limits['absolute']['maxPersonality']
         if max_file_limit == -1:
             raise self.skipException("No limit for personality files")
@@ -168,14 +172,15 @@
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.servers_client.delete_server,
                         created_server['id'])
-        server = self.client.show_server(created_server['id'])['server']
+        server = self.reader_servers_client.show_server(
+            created_server['id'])['server']
         if CONF.validation.run_validation:
             linux_client = remote_client.RemoteClient(
                 self.get_server_ip(server, validation_resources),
                 self.ssh_user, password,
                 validation_resources['keypair']['private_key'],
                 server=server,
-                servers_client=self.client)
+                servers_client=self.servers_client)
             for i in person:
                 self.assertEqual(base64.decode_as_text(i['contents']),
                                  linux_client.exec_command(
diff --git a/tempest/api/compute/servers/test_server_rescue.py b/tempest/api/compute/servers/test_server_rescue.py
index 9f96385..d9ecadc 100644
--- a/tempest/api/compute/servers/test_server_rescue.py
+++ b/tempest/api/compute/servers/test_server_rescue.py
@@ -245,7 +245,8 @@
         server, rescue_image_id = self._create_server_and_rescue_image(
             hw_rescue_device='disk', hw_rescue_bus='virtio', validatable=True,
             validation_resources=validation_resources, wait_until="SSHABLE")
-        server = self.servers_client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(
+            server['id'])['server']
         waiters.wait_for_volume_resource_status(self.volumes_client,
                                                 volume['id'], 'available')
         self.attach_volume(server, volume)
diff --git a/tempest/api/compute/servers/test_server_tags.py b/tempest/api/compute/servers/test_server_tags.py
index 0b5870a..5eb5ea5 100644
--- a/tempest/api/compute/servers/test_server_tags.py
+++ b/tempest/api/compute/servers/test_server_tags.py
@@ -32,7 +32,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServerTagsTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -43,14 +42,15 @@
         if not isinstance(tags, (list, tuple)):
             tags = [tags]
         for tag in tags:
-            self.client.update_tag(server_id, tag)
-        self.addCleanup(self.client.delete_all_tags, server_id)
+            self.servers_client.update_tag(server_id, tag)
+        self.addCleanup(self.servers_client.delete_all_tags, server_id)
 
     @decorators.idempotent_id('8d95abe2-c658-4c42-9a44-c0258500306b')
     def test_create_delete_tag(self):
         """Test creating and deleting server tag"""
         # Check that no tags exist.
-        fetched_tags = self.client.list_tags(self.server['id'])['tags']
+        fetched_tags = self.reader_servers_client.list_tags(
+            self.server['id'])['tags']
         self.assertEmpty(fetched_tags)
 
         # Add server tag to the server.
@@ -59,12 +59,14 @@
         self._update_server_tags(self.server['id'], assigned_tag)
 
         # Check that added tag exists.
-        fetched_tags = self.client.list_tags(self.server['id'])['tags']
+        fetched_tags = self.reader_servers_client.list_tags(
+            self.server['id'])['tags']
         self.assertEqual([assigned_tag], fetched_tags)
 
         # Remove assigned tag from server and check that it was removed.
-        self.client.delete_tag(self.server['id'], assigned_tag)
-        fetched_tags = self.client.list_tags(self.server['id'])['tags']
+        self.servers_client.delete_tag(self.server['id'], assigned_tag)
+        fetched_tags = self.reader_servers_client.list_tags(
+            self.server['id'])['tags']
         self.assertEmpty(fetched_tags)
 
     @decorators.idempotent_id('a2c1af8c-127d-417d-974b-8115f7e3d831')
@@ -81,12 +83,13 @@
         # Replace tags with new tags and check that they are present.
         new_tags = [data_utils.rand_name(**kwargs),
                     data_utils.rand_name(**kwargs)]
-        replaced_tags = self.client.update_all_tags(
+        replaced_tags = self.servers_client.update_all_tags(
             self.server['id'], new_tags)['tags']
         self.assertCountEqual(new_tags, replaced_tags)
 
         # List the tags and check that the tags were replaced.
-        fetched_tags = self.client.list_tags(self.server['id'])['tags']
+        fetched_tags = self.reader_servers_client.list_tags(
+            self.server['id'])['tags']
         self.assertCountEqual(new_tags, fetched_tags)
 
     @decorators.idempotent_id('a63b2a74-e918-4b7c-bcab-10c855f3a57e')
@@ -102,8 +105,9 @@
         self._update_server_tags(self.server['id'], assigned_tags)
 
         # Delete tags from the server and check that they were deleted.
-        self.client.delete_all_tags(self.server['id'])
-        fetched_tags = self.client.list_tags(self.server['id'])['tags']
+        self.servers_client.delete_all_tags(self.server['id'])
+        fetched_tags = self.reader_servers_client.list_tags(
+            self.server['id'])['tags']
         self.assertEmpty(fetched_tags)
 
     @decorators.idempotent_id('81279a66-61c3-4759-b830-a2dbe64cbe08')
@@ -116,4 +120,5 @@
 
         # Check that added tag exists. Throws a 404 if not found, else a 204,
         # which was already checked by the schema validation.
-        self.client.check_tag_existence(self.server['id'], assigned_tag)
+        self.servers_client.check_tag_existence(self.server['id'],
+                                                assigned_tag)
diff --git a/tempest/api/compute/servers/test_servers.py b/tempest/api/compute/servers/test_servers.py
index ea3a710..b529b6b 100644
--- a/tempest/api/compute/servers/test_servers.py
+++ b/tempest/api/compute/servers/test_servers.py
@@ -28,16 +28,9 @@
     """Test servers API"""
     create_default_network = True
 
-    credentials = ['primary', 'project_reader']
-
     @classmethod
     def setup_clients(cls):
         super(ServersTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.client
 
     @decorators.idempotent_id('b92d5ec7-b1dd-44a2-87e4-45e888c46ef0')
     @testtools.skipUnless(CONF.compute_feature_enabled.
@@ -71,9 +64,9 @@
         id2 = server['id']
         self.addCleanup(self.delete_server, id2)
         self.assertNotEqual(id1, id2, "Did not create a new server")
-        server = self.reader_client.show_server(id1)['server']
+        server = self.reader_servers_client.show_server(id1)['server']
         name1 = server['name']
-        server = self.reader_client.show_server(id2)['server']
+        server = self.reader_servers_client.show_server(id2)['server']
         name2 = server['name']
         self.assertEqual(name1, name2)
 
@@ -88,7 +81,7 @@
         server = self.create_test_server(key_name=key_name,
                                          wait_until='ACTIVE')
         self.addCleanup(self.delete_server, server['id'])
-        server = self.reader_client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertEqual(key_name, server['key_name'])
 
     def _update_server_name(self, server_id, status, prefix_name='server'):
@@ -97,12 +90,12 @@
             prefix=CONF.resource_name_prefix, name=prefix_name)
 
         # Update the server with a new name
-        self.client.update_server(server_id,
-                                  name=new_name)
-        waiters.wait_for_server_status(self.client, server_id, status)
+        self.servers_client.update_server(server_id,
+                                          name=new_name)
+        waiters.wait_for_server_status(self.servers_client, server_id, status)
 
         # Verify the name of the server has changed
-        server = self.reader_client.show_server(server_id)['server']
+        server = self.reader_servers_client.show_server(server_id)['server']
         self.assertEqual(new_name, server['name'])
         return server
 
@@ -116,8 +109,9 @@
         self._update_server_name(server['id'], 'ACTIVE', prefix_name)
 
         # stop server and check server name update again
-        self.client.stop_server(server['id'])
-        waiters.wait_for_server_status(self.client, server['id'], 'SHUTOFF')
+        self.servers_client.stop_server(server['id'])
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'SHUTOFF')
         # Update instance name with non-ASCII characters
         updated_server = self._update_server_name(server['id'],
                                                   'SHUTOFF',
@@ -131,13 +125,14 @@
         self.addCleanup(self.delete_server, server['id'])
 
         # Update the IPv4 and IPv6 access addresses
-        self.client.update_server(server['id'],
-                                  accessIPv4='1.1.1.1',
-                                  accessIPv6='::babe:202:202')
-        waiters.wait_for_server_status(self.client, server['id'], 'ACTIVE')
+        self.servers_client.update_server(server['id'],
+                                          accessIPv4='1.1.1.1',
+                                          accessIPv6='::babe:202:202')
+        waiters.wait_for_server_status(self.servers_client, server['id'],
+                                       'ACTIVE')
 
         # Verify the access addresses have been updated
-        server = self.reader_client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertEqual('1.1.1.1', server['accessIPv4'])
         self.assertEqual('::babe:202:202', server['accessIPv6'])
 
@@ -147,7 +142,7 @@
         server = self.create_test_server(accessIPv6='2001:2001::3',
                                          wait_until='ACTIVE')
         self.addCleanup(self.delete_server, server['id'])
-        server = self.reader_client.show_server(server['id'])['server']
+        server = self.reader_servers_client.show_server(server['id'])['server']
         self.assertEqual('2001:2001::3', server['accessIPv6'])
 
     @decorators.related_bug('1730756')
@@ -180,22 +175,16 @@
     # also. 2.47 APIs schema are on top of 2.9->2.19->2.26 schema so
     # below tests cover all of the schema.
 
-    credentials = ['primary', 'project_reader']
-
     @classmethod
     def setup_clients(cls):
         super(ServerShowV247Test, cls).setup_clients()
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.servers_client
 
     @decorators.idempotent_id('88b0bdb2-494c-11e7-a919-92ebcb67fe33')
     def test_show_server(self):
         """Test getting server detail"""
         server = self.create_test_server()
         # All fields will be checked by API schema
-        self.reader_client.show_server(server['id'])
+        self.reader_servers_client.show_server(server['id'])
 
     @decorators.idempotent_id('8de397c2-57d0-4b90-aa30-e5d668f21a8b')
     def test_update_rebuild_list_server(self):
@@ -210,7 +199,7 @@
         waiters.wait_for_server_status(self.servers_client,
                                        server['id'], 'ACTIVE')
         # Checking list details API response schema
-        self.servers_client.list_servers(detail=True)
+        self.reader_servers_client.list_servers(detail=True)
 
 
 class ServerShowV263Test(base.BaseV2ComputeTest):
@@ -219,15 +208,9 @@
     min_microversion = '2.63'
     max_microversion = 'latest'
 
-    credentials = ['primary', 'project_reader']
-
     @classmethod
     def setup_clients(cls):
         super(ServerShowV263Test, cls).setup_clients()
-        if CONF.enforce_scope.nova:
-            cls.reader_client = cls.os_project_reader.servers_client
-        else:
-            cls.reader_client = cls.servers_client
 
     @testtools.skipUnless(CONF.compute.certified_image_ref,
                           '``[compute]/certified_image_ref`` required to test '
@@ -245,7 +228,7 @@
             wait_until='ACTIVE')
 
         # Check show API response schema
-        self.reader_client.show_server(server['id'])['server']
+        self.reader_servers_client.show_server(server['id'])['server']
 
         # Check update API response schema
         self.servers_client.update_server(server['id'])
@@ -260,7 +243,7 @@
 
         # Check list details API response schema
         params = {'trusted_image_certificates': trusted_certs}
-        servers = self.servers_client.list_servers(
+        servers = self.reader_servers_client.list_servers(
             detail=True, **params)['servers']
         self.assertNotEmpty(servers)
 
@@ -275,13 +258,17 @@
     min_microversion = '2.96'
     max_microversion = 'latest'
 
+    @classmethod
+    def setup_clients(cls):
+        super(ServersListShow296Test, cls).setup_clients()
+
     @decorators.idempotent_id('4eee1ffe-9e00-4c99-a431-0d3e0f323a8f')
     def test_list_show_update_rebuild_server_296(self):
         server = self.create_test_server(wait_until='ACTIVE')
         # Checking list API response schema.
-        self.servers_client.list_servers(detail=True)
+        self.reader_servers_client.list_servers(detail=True)
         # Checking show API response schema
-        self.servers_client.show_server(server['id'])
+        self.reader_servers_client.show_server(server['id'])
         # Checking update API response schema
         self.servers_client.update_server(server['id'])
         # Check rebuild API response schema
@@ -296,13 +283,17 @@
     min_microversion = '2.98'
     max_microversion = 'latest'
 
+    @classmethod
+    def setup_clients(cls):
+        super(ServersListShow298Test, cls).setup_clients()
+
     @decorators.idempotent_id('3981e496-3bf7-4015-b807-63ffee7c520c')
     def test_list_show_update_rebuild_server_298(self):
         server = self.create_test_server(wait_until='ACTIVE')
         # Check list details API response schema
-        self.servers_client.list_servers(detail=True)
+        self.reader_servers_client.list_servers(detail=True)
         # Check show API response schema
-        self.servers_client.show_server(server['id'])
+        self.reader_servers_client.show_server(server['id'])
         # Checking update API response schema
         self.servers_client.update_server(server['id'])
         # Check rebuild API response schema
@@ -321,13 +312,17 @@
     min_microversion = '2.100'
     max_microversion = 'latest'
 
+    @classmethod
+    def setup_clients(cls):
+        super(ServersListShow2100Test, cls).setup_clients()
+
     @decorators.idempotent_id('2c3a8270-e6f7-4400-af0f-db003c117e48')
     def test_list_show_rebuild_update_server_2100(self):
         server = self.create_test_server(wait_until='ACTIVE')
         # Checking list API response schema.
-        self.servers_client.list_servers(detail=True)
+        self.reader_servers_client.list_servers(detail=True)
         # Checking show API response schema
-        self.servers_client.show_server(server['id'])
+        self.reader_servers_client.show_server(server['id'])
         # Checking update API response schema
         self.servers_client.update_server(server['id'])
         waiters.wait_for_server_status(self.servers_client,
diff --git a/tempest/api/compute/servers/test_servers_negative.py b/tempest/api/compute/servers/test_servers_negative.py
index fa40629..582819a 100644
--- a/tempest/api/compute/servers/test_servers_negative.py
+++ b/tempest/api/compute/servers/test_servers_negative.py
@@ -37,7 +37,7 @@
     def setUp(self):
         super(ServersNegativeTestJSON, self).setUp()
         try:
-            waiters.wait_for_server_status(self.client, self.server_id,
+            waiters.wait_for_server_status(self.servers_client, self.server_id,
                                            'ACTIVE')
         except Exception:
             self.__class__.server_id = self.recreate_server(self.server_id)
@@ -52,7 +52,6 @@
     @classmethod
     def setup_clients(cls):
         super(ServersNegativeTestJSON, cls).setup_clients()
-        cls.client = cls.servers_client
 
     @classmethod
     def resource_setup(cls):
@@ -62,8 +61,8 @@
 
         # Wait until the instance is active to avoid the delete racing
         server = cls.create_test_server(wait_until='ACTIVE')
-        cls.client.delete_server(server['id'])
-        waiters.wait_for_server_termination(cls.client, server['id'])
+        cls.servers_client.delete_server(server['id'])
+        waiters.wait_for_server_termination(cls.servers_client, server['id'])
         cls.deleted_server_id = server['id']
 
     @decorators.attr(type=['negative'])
@@ -135,7 +134,7 @@
         """Resizing a non-existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.resize_server,
+                          self.servers_client.resize_server,
                           nonexistent_server, self.flavor_ref)
 
     @decorators.idempotent_id('ced1a1d7-2ab6-45c9-b90f-b27d87b30efd')
@@ -145,7 +144,8 @@
     def test_resize_server_with_non_existent_flavor(self):
         """Resizing a server with non existent flavor should fail"""
         nonexistent_flavor = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.BadRequest, self.client.resize_server,
+        self.assertRaises(lib_exc.BadRequest,
+                          self.servers_client.resize_server,
                           self.server_id, flavor_ref=nonexistent_flavor)
 
     @decorators.idempotent_id('45436a7d-a388-4a35-a9d8-3adc5d0d940b')
@@ -154,7 +154,8 @@
     @decorators.attr(type=['negative'])
     def test_resize_server_with_null_flavor(self):
         """Resizing a server with null flavor should fail"""
-        self.assertRaises(lib_exc.BadRequest, self.client.resize_server,
+        self.assertRaises(lib_exc.BadRequest,
+                          self.servers_client.resize_server,
                           self.server_id, flavor_ref="")
 
     @decorators.attr(type=['negative'])
@@ -162,7 +163,7 @@
     def test_reboot_non_existent_server(self):
         """Rebooting a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.reboot_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.reboot_server,
                           nonexistent_server, type='SOFT')
 
     @decorators.idempotent_id('d1417e7f-a509-41b5-a102-d5eed8613369')
@@ -171,19 +172,20 @@
     @decorators.attr(type=['negative'])
     def test_pause_paused_server(self):
         """Pausing a paused server should fail"""
-        self.client.pause_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id, 'PAUSED')
+        self.servers_client.pause_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
+                                       'PAUSED')
         self.assertRaises(lib_exc.Conflict,
-                          self.client.pause_server,
+                          self.servers_client.pause_server,
                           self.server_id)
-        self.client.unpause_server(self.server_id)
+        self.servers_client.unpause_server(self.server_id)
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('98fa0458-1485-440f-873b-fe7f0d714930')
     def test_rebuild_deleted_server(self):
         """Rebuilding a deleted server should fail"""
         self.assertRaises(lib_exc.NotFound,
-                          self.client.rebuild_server,
+                          self.servers_client.rebuild_server,
                           self.deleted_server_id, self.image_ref)
 
     @decorators.related_bug('1660878', status_code=409)
@@ -191,7 +193,7 @@
     @decorators.idempotent_id('581a397d-5eab-486f-9cf9-1014bbd4c984')
     def test_reboot_deleted_server(self):
         """Rebooting a deleted server should fail"""
-        self.assertRaises(lib_exc.NotFound, self.client.reboot_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.reboot_server,
                           self.deleted_server_id, type='SOFT')
 
     @decorators.attr(type=['negative'])
@@ -200,7 +202,7 @@
         """Rebuilding a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.rebuild_server,
+                          self.servers_client.rebuild_server,
                           nonexistent_server,
                           self.image_ref)
 
@@ -292,7 +294,7 @@
             prefix=CONF.resource_name_prefix,
             name=self.__class__.__name__ + '-server') + '_updated'
 
-        self.assertRaises(lib_exc.NotFound, self.client.update_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.update_server,
                           nonexistent_server, name=new_name)
 
     @decorators.attr(type=['negative'])
@@ -300,7 +302,8 @@
     def test_update_server_set_empty_name(self):
         """Updating name of the server to an empty string should fail"""
         new_name = ''
-        self.assertRaises(lib_exc.BadRequest, self.client.update_server,
+        self.assertRaises(lib_exc.BadRequest,
+                          self.servers_client.update_server,
                           self.server_id, name=new_name)
 
     @decorators.attr(type=['negative'])
@@ -313,7 +316,7 @@
         """
         new_name = 'a' * 256
         self.assertRaises(lib_exc.BadRequest,
-                          self.client.update_server,
+                          self.servers_client.update_server,
                           self.server_id,
                           name=new_name)
 
@@ -322,14 +325,15 @@
     def test_delete_non_existent_server(self):
         """Deleting a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.delete_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.delete_server,
                           nonexistent_server)
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('75f79124-277c-45e6-a373-a1d6803f4cc4')
     def test_delete_server_pass_negative_id(self):
         """Passing an invalid string parameter to delete server should fail"""
-        self.assertRaises(lib_exc.NotFound, self.client.delete_server, -1)
+        self.assertRaises(lib_exc.NotFound,
+                          self.servers_client.delete_server, -1)
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('f4d7279b-5fd2-4bf2-9ba4-ae35df0d18c5')
@@ -339,7 +343,7 @@
         Pass a server ID that exceeds length limit to delete server, an error
         is returned.
         """
-        self.assertRaises(lib_exc.NotFound, self.client.delete_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.delete_server,
                           sys.maxsize + 1)
 
     @decorators.attr(type=['negative'])
@@ -356,7 +360,8 @@
     def test_get_non_existent_server(self):
         """Getting a non existent server details should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.show_server,
+        self.assertRaises(lib_exc.NotFound,
+                          self.reader_servers_client.show_server,
                           nonexistent_server)
 
     @decorators.attr(type=['negative'])
@@ -374,7 +379,7 @@
     def test_pause_non_existent_server(self):
         """Pausing a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.pause_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.pause_server,
                           nonexistent_server)
 
     @decorators.idempotent_id('705b8e3a-e8a7-477c-a19b-6868fc24ac75')
@@ -384,7 +389,7 @@
     def test_unpause_non_existent_server(self):
         """Unpausing a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.unpause_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.unpause_server,
                           nonexistent_server)
 
     @decorators.idempotent_id('c8e639a7-ece8-42dd-a2e0-49615917ba4f')
@@ -394,7 +399,7 @@
     def test_unpause_server_invalid_state(self):
         """Unpausing an active server should fail"""
         self.assertRaises(lib_exc.Conflict,
-                          self.client.unpause_server,
+                          self.servers_client.unpause_server,
                           self.server_id)
 
     @decorators.idempotent_id('d1f032d5-7b6e-48aa-b252-d5f16dd994ca')
@@ -404,7 +409,7 @@
     def test_suspend_non_existent_server(self):
         """Suspending a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.suspend_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.suspend_server,
                           nonexistent_server)
 
     @decorators.idempotent_id('7f323206-05a9-4bf8-996b-dd5b2036501b')
@@ -413,13 +418,13 @@
     @decorators.attr(type=['negative'])
     def test_suspend_server_invalid_state(self):
         """Suspending a suspended server should fail"""
-        self.client.suspend_server(self.server_id)
-        waiters.wait_for_server_status(self.client, self.server_id,
+        self.servers_client.suspend_server(self.server_id)
+        waiters.wait_for_server_status(self.servers_client, self.server_id,
                                        'SUSPENDED')
         self.assertRaises(lib_exc.Conflict,
-                          self.client.suspend_server,
+                          self.servers_client.suspend_server,
                           self.server_id)
-        self.client.resume_server(self.server_id)
+        self.servers_client.resume_server(self.server_id)
 
     @decorators.idempotent_id('221cd282-bddb-4837-a683-89c2487389b6')
     @testtools.skipUnless(CONF.compute_feature_enabled.suspend,
@@ -428,7 +433,7 @@
     def test_resume_non_existent_server(self):
         """Resuming a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.resume_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.resume_server,
                           nonexistent_server)
 
     @decorators.idempotent_id('ccb6294d-c4c9-498f-8a43-554c098bfadb')
@@ -438,7 +443,7 @@
     def test_resume_server_invalid_state(self):
         """Resuming an active server should fail"""
         self.assertRaises(lib_exc.Conflict,
-                          self.client.resume_server,
+                          self.servers_client.resume_server,
                           self.server_id)
 
     @decorators.attr(type=['negative'])
@@ -447,7 +452,7 @@
         """Getting the console output for a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.get_console_output,
+                          self.servers_client.get_console_output,
                           nonexistent_server, length=10)
 
     @decorators.attr(type=['negative'])
@@ -456,7 +461,7 @@
         """Force-deleting a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.force_delete_server,
+                          self.servers_client.force_delete_server,
                           nonexistent_server)
 
     @decorators.attr(type=['negative'])
@@ -469,7 +474,7 @@
         """
         nonexistent_server = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
-                          self.client.restore_soft_deleted_server,
+                          self.servers_client.restore_soft_deleted_server,
                           nonexistent_server)
 
     @decorators.idempotent_id('abca56e2-a892-48ea-b5e5-e07e69774816')
@@ -479,7 +484,7 @@
     def test_shelve_non_existent_server(self):
         """Shelving a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.shelve_server,
+        self.assertRaises(lib_exc.NotFound, self.servers_client.shelve_server,
                           nonexistent_server)
 
     @decorators.idempotent_id('443e4f9b-e6bf-4389-b601-3a710f15fddd')
@@ -488,15 +493,17 @@
     @decorators.attr(type=['negative'])
     def test_shelve_shelved_server(self):
         """Shelving a shelved server should fail"""
-        compute.shelve_server(self.client, self.server_id)
+        compute.shelve_server(self.servers_client, self.server_id)
 
         def _unshelve_server():
-            server_info = self.client.show_server(self.server_id)['server']
+            server_info = self.reader_servers_client.show_server(
+                self.server_id)['server']
             if 'SHELVED' in server_info['status']:
-                self.client.unshelve_server(self.server_id)
+                self.servers_client.unshelve_server(self.server_id)
         self.addCleanup(_unshelve_server)
 
-        server = self.client.show_server(self.server_id)['server']
+        server = self.reader_servers_client.show_server(
+            self.server_id)['server']
         image_name = server['name'] + '-shelved'
         kwargs = {'params': {'name': image_name}}
         images = self.images_client.list_images(**kwargs)['images']
@@ -504,10 +511,10 @@
         self.assertEqual(image_name, images[0]['name'])
 
         self.assertRaises(lib_exc.Conflict,
-                          self.client.shelve_server,
+                          self.servers_client.shelve_server,
                           self.server_id)
 
-        self.client.unshelve_server(self.server_id)
+        self.servers_client.unshelve_server(self.server_id)
 
     @decorators.idempotent_id('23d23b37-afaf-40d7-aa5d-5726f82d8821')
     @testtools.skipUnless(CONF.compute_feature_enabled.shelve,
@@ -516,7 +523,8 @@
     def test_unshelve_non_existent_server(self):
         """Unshelving a non existent server should fail"""
         nonexistent_server = data_utils.rand_uuid()
-        self.assertRaises(lib_exc.NotFound, self.client.unshelve_server,
+        self.assertRaises(lib_exc.NotFound,
+                          self.servers_client.unshelve_server,
                           nonexistent_server)
 
     @decorators.idempotent_id('8f198ded-1cca-4228-9e65-c6b449c54880')
@@ -526,7 +534,7 @@
     def test_unshelve_server_invalid_state(self):
         """Unshelving an active server should fail"""
         self.assertRaises(lib_exc.Conflict,
-                          self.client.unshelve_server,
+                          self.servers_client.unshelve_server,
                           self.server_id)
 
     @decorators.attr(type=['negative'])