Move _get_region() to NegativeRestClient

_get_region() was used for getting a region from CONF for each project,
but most projects' sections contain a region value and it is easy to
specify its value instead of _get_region().
In addition, RestClient will become a tempest-lib class and it is needed
to separate CONF values from a RestClient class.
This patch moves _get_region() to NegativeRestClient and makes each client
specify its own CONF value.

Change-Id: Ib26badf64e7cddf4158e4720e193b3129e8fdb12
diff --git a/tempest/common/rest_client.py b/tempest/common/rest_client.py
index ca87a75..4b80871 100644
--- a/tempest/common/rest_client.py
+++ b/tempest/common/rest_client.py
@@ -78,10 +78,12 @@
 
     LOG = logging.getLogger(__name__)
 
-    def __init__(self, auth_provider, service, endpoint_type='publicURL',
+    def __init__(self, auth_provider, service, region,
+                 endpoint_type='publicURL',
                  build_interval=1, build_timeout=60):
         self.auth_provider = auth_provider
         self.service = service
+        self.region = region
         self.endpoint_type = endpoint_type
         self.build_interval = build_interval
         self.build_timeout = build_timeout
@@ -124,21 +126,6 @@
                              str(self.token)[0:STRING_LIMIT],
                              str(self.get_headers())[0:STRING_LIMIT])
 
-    def _get_region(self, service):
-        """
-        Returns the region for a specific service
-        """
-        service_region = None
-        for cfgname in dir(CONF._config):
-            # Find all config.FOO.catalog_type and assume FOO is a service.
-            cfg = getattr(CONF, cfgname)
-            catalog_type = getattr(cfg, 'catalog_type', None)
-            if catalog_type == service:
-                service_region = getattr(cfg, 'region', None)
-        if not service_region:
-            service_region = CONF.identity.region
-        return service_region
-
     @property
     def user(self):
         return self.auth_provider.credentials.username
@@ -172,7 +159,7 @@
         _filters = dict(
             service=self.service,
             endpoint_type=self.endpoint_type,
-            region=self._get_region(self.service)
+            region=self.region
         )
         if self.api_version is not None:
             _filters['api_version'] = self.api_version
@@ -609,6 +596,27 @@
     """
     Version of RestClient that does not raise exceptions.
     """
+
+    def __init__(self, auth_provider, service):
+        region = self._get_region(service)
+        super(NegativeRestClient, self).__init__(auth_provider,
+                                                 service, region)
+
+    def _get_region(self, service):
+        """
+        Returns the region for a specific service
+        """
+        service_region = None
+        for cfgname in dir(CONF._config):
+            # Find all config.FOO.catalog_type and assume FOO is a service.
+            cfg = getattr(CONF, cfgname)
+            catalog_type = getattr(cfg, 'catalog_type', None)
+            if catalog_type == service:
+                service_region = getattr(cfg, 'region', None)
+        if not service_region:
+            service_region = CONF.identity.region
+        return service_region
+
     def _error_checker(self, method, url,
                        headers, body, resp, resp_body):
         pass
diff --git a/tempest/services/baremetal/base.py b/tempest/services/baremetal/base.py
index 4bcf2aa..c1ebba5 100644
--- a/tempest/services/baremetal/base.py
+++ b/tempest/services/baremetal/base.py
@@ -50,7 +50,9 @@
 
     def __init__(self, auth_provider):
         super(BaremetalClient, self).__init__(
-            auth_provider, CONF.baremetal.catalog_type,
+            auth_provider,
+            CONF.baremetal.catalog_type,
+            CONF.identity.region,
             endpoint_type=CONF.baremetal.endpoint_type)
         self.uri_prefix = ''
 
diff --git a/tempest/services/compute/json/base.py b/tempest/services/compute/json/base.py
index 9187cc4..cb4915b 100644
--- a/tempest/services/compute/json/base.py
+++ b/tempest/services/compute/json/base.py
@@ -33,6 +33,7 @@
         super(ComputeClient, self).__init__(
             auth_provider,
             CONF.compute.catalog_type,
+            CONF.compute.region or CONF.identity.region,
             endpoint_type=CONF.compute.endpoint_type,
             build_interval=build_interval,
             build_timeout=build_timeout)
diff --git a/tempest/services/data_processing/v1_1/client.py b/tempest/services/data_processing/v1_1/client.py
index 6004b22..1b6842d 100644
--- a/tempest/services/data_processing/v1_1/client.py
+++ b/tempest/services/data_processing/v1_1/client.py
@@ -24,7 +24,9 @@
 
     def __init__(self, auth_provider):
         super(DataProcessingClient, self).__init__(
-            auth_provider, CONF.data_processing.catalog_type,
+            auth_provider,
+            CONF.data_processing.catalog_type,
+            CONF.identity.region,
             endpoint_type=CONF.data_processing.endpoint_type)
 
     def _request_and_check_resp(self, request_func, uri, resp_status):
diff --git a/tempest/services/database/json/flavors_client.py b/tempest/services/database/json/flavors_client.py
index a57b045..01be29a 100644
--- a/tempest/services/database/json/flavors_client.py
+++ b/tempest/services/database/json/flavors_client.py
@@ -25,7 +25,9 @@
 
     def __init__(self, auth_provider):
         super(DatabaseFlavorsClientJSON, self).__init__(
-            auth_provider, CONF.database.catalog_type)
+            auth_provider,
+            CONF.database.catalog_type,
+            CONF.identity.region)
 
     def list_db_flavors(self, params=None):
         url = 'flavors'
diff --git a/tempest/services/database/json/versions_client.py b/tempest/services/database/json/versions_client.py
index 911b55d..8a408e9 100644
--- a/tempest/services/database/json/versions_client.py
+++ b/tempest/services/database/json/versions_client.py
@@ -25,7 +25,9 @@
 
     def __init__(self, auth_provider):
         super(DatabaseVersionsClientJSON, self).__init__(
-            auth_provider, CONF.database.catalog_type)
+            auth_provider,
+            CONF.database.catalog_type,
+            CONF.identity.region)
         self.skip_path()
 
     def list_db_versions(self, params=None):
diff --git a/tempest/services/identity/json/identity_client.py b/tempest/services/identity/json/identity_client.py
index c91b63e..5a4ce72 100644
--- a/tempest/services/identity/json/identity_client.py
+++ b/tempest/services/identity/json/identity_client.py
@@ -22,9 +22,11 @@
 class IdentityClientJSON(rest_client.RestClient):
 
     def __init__(self, auth_provider):
-        super(IdentityClientJSON, self).__init__(auth_provider,
-                                                 CONF.identity.catalog_type,
-                                                 endpoint_type='adminURL')
+        super(IdentityClientJSON, self).__init__(
+            auth_provider,
+            CONF.identity.catalog_type,
+            CONF.identity.region,
+            endpoint_type='adminURL')
 
     def has_admin_extensions(self):
         """
diff --git a/tempest/services/identity/v3/json/base.py b/tempest/services/identity/v3/json/base.py
index da8e287..30d3886 100644
--- a/tempest/services/identity/v3/json/base.py
+++ b/tempest/services/identity/v3/json/base.py
@@ -24,7 +24,9 @@
     """
 
     def __init__(self, auth_provider):
-        super(IdentityV3Client, self).__init__(auth_provider,
-                                               CONF.identity.catalog_type,
-                                               endpoint_type='adminURL')
+        super(IdentityV3Client, self).__init__(
+            auth_provider,
+            CONF.identity.catalog_type,
+            CONF.identity.region,
+            endpoint_type='adminURL')
         self.api_version = "v3"
diff --git a/tempest/services/identity/v3/json/identity_client.py b/tempest/services/identity/v3/json/identity_client.py
index 48ba909..59902bb 100644
--- a/tempest/services/identity/v3/json/identity_client.py
+++ b/tempest/services/identity/v3/json/identity_client.py
@@ -523,7 +523,7 @@
 class V3TokenClientJSON(rest_client.RestClient):
 
     def __init__(self):
-        super(V3TokenClientJSON, self).__init__(None, None)
+        super(V3TokenClientJSON, self).__init__(None, None, None)
         auth_url = CONF.identity.uri_v3
         if not auth_url:
             raise exceptions.InvalidConfiguration('you must specify a v3 uri '
diff --git a/tempest/services/image/v1/json/image_client.py b/tempest/services/image/v1/json/image_client.py
index ba3a814..013784c 100644
--- a/tempest/services/image/v1/json/image_client.py
+++ b/tempest/services/image/v1/json/image_client.py
@@ -38,6 +38,7 @@
         super(ImageClientJSON, self).__init__(
             auth_provider,
             CONF.image.catalog_type,
+            CONF.image.region or CONF.identity.region,
             endpoint_type=CONF.image.endpoint_type)
         self._http = None
 
diff --git a/tempest/services/image/v2/json/image_client.py b/tempest/services/image/v2/json/image_client.py
index 23810f9..2b3cb0e 100644
--- a/tempest/services/image/v2/json/image_client.py
+++ b/tempest/services/image/v2/json/image_client.py
@@ -32,6 +32,7 @@
         super(ImageClientV2JSON, self).__init__(
             auth_provider,
             CONF.image.catalog_type,
+            CONF.image.region or CONF.identity.region,
             endpoint_type=CONF.image.endpoint_type)
         self._http = None
 
diff --git a/tempest/services/messaging/json/messaging_client.py b/tempest/services/messaging/json/messaging_client.py
index caed02f..45534c7 100644
--- a/tempest/services/messaging/json/messaging_client.py
+++ b/tempest/services/messaging/json/messaging_client.py
@@ -28,8 +28,10 @@
 class MessagingClientJSON(rest_client.RestClient):
 
     def __init__(self, auth_provider):
-        super(MessagingClientJSON, self).__init__(auth_provider,
-                                                  CONF.messaging.catalog_type)
+        super(MessagingClientJSON, self).__init__(
+            auth_provider,
+            CONF.messaging.catalog_type,
+            CONF.identity.region)
         self.version = '1'
         self.uri_prefix = 'v{0}'.format(self.version)
 
diff --git a/tempest/services/network/json/network_client.py b/tempest/services/network/json/network_client.py
index c279efd..8f5ed5a 100644
--- a/tempest/services/network/json/network_client.py
+++ b/tempest/services/network/json/network_client.py
@@ -39,7 +39,9 @@
 
     def __init__(self, auth_provider):
         super(NetworkClientJSON, self).__init__(
-            auth_provider, CONF.network.catalog_type,
+            auth_provider,
+            CONF.network.catalog_type,
+            CONF.network.region or CONF.identity.region,
             endpoint_type=CONF.network.endpoint_type,
             build_interval=CONF.network.build_interval,
             build_timeout=CONF.network.build_timeout)
diff --git a/tempest/services/object_storage/base.py b/tempest/services/object_storage/base.py
index 3900e82..655596f 100644
--- a/tempest/services/object_storage/base.py
+++ b/tempest/services/object_storage/base.py
@@ -25,6 +25,8 @@
 
     def __init__(self, auth_provider):
         super(ObjectStorageClient, self).__init__(
-            auth_provider, CONF.object_storage.catalog_type,
+            auth_provider,
+            CONF.object_storage.catalog_type,
+            CONF.object_storage.region or CONF.identity.region,
             endpoint_type=CONF.object_storage.endpoint_type)
         self.format = 'json'
diff --git a/tempest/services/orchestration/json/orchestration_client.py b/tempest/services/orchestration/json/orchestration_client.py
index 2dedf01..054f410 100644
--- a/tempest/services/orchestration/json/orchestration_client.py
+++ b/tempest/services/orchestration/json/orchestration_client.py
@@ -31,6 +31,7 @@
         super(OrchestrationClient, self).__init__(
             auth_provider,
             CONF.orchestration.catalog_type,
+            CONF.orchestration.region or CONF.identity.region,
             endpoint_type=CONF.orchestration.endpoint_type,
             build_interval=CONF.orchestration.build_interval,
             build_timeout=CONF.orchestration.build_timeout)
diff --git a/tempest/services/telemetry/json/telemetry_client.py b/tempest/services/telemetry/json/telemetry_client.py
index 622c996..2b5dc1a 100644
--- a/tempest/services/telemetry/json/telemetry_client.py
+++ b/tempest/services/telemetry/json/telemetry_client.py
@@ -28,6 +28,7 @@
         super(TelemetryClientJSON, self).__init__(
             auth_provider,
             CONF.telemetry.catalog_type,
+            CONF.identity.region,
             endpoint_type=CONF.telemetry.endpoint_type)
         self.version = '2'
         self.uri_prefix = "v%s" % self.version
diff --git a/tempest/services/volume/json/base.py b/tempest/services/volume/json/base.py
index 1800ee6..ef316f2 100644
--- a/tempest/services/volume/json/base.py
+++ b/tempest/services/volume/json/base.py
@@ -27,6 +27,7 @@
         super(VolumeClient, self).__init__(
             auth_provider,
             CONF.volume.catalog_type,
+            CONF.volume.region or CONF.identity.region,
             endpoint_type=CONF.volume.endpoint_type,
             build_interval=CONF.volume.build_interval,
             build_timeout=CONF.volume.build_timeout)
diff --git a/tempest/tests/test_rest_client.py b/tempest/tests/test_rest_client.py
index 42ba5a0..a7fa7cc 100644
--- a/tempest/tests/test_rest_client.py
+++ b/tempest/tests/test_rest_client.py
@@ -30,18 +30,13 @@
 
     url = 'fake_endpoint'
 
-    def _get_region(self):
-        return 'fake region'
-
     def setUp(self):
         super(BaseRestClientTestClass, self).setUp()
         self.useFixture(fake_config.ConfigFixture())
         self.stubs.Set(config, 'TempestConfigPrivate', fake_config.FakePrivate)
         self.rest_client = rest_client.RestClient(
-            fake_auth_provider.FakeAuthProvider(), None)
+            fake_auth_provider.FakeAuthProvider(), None, None)
         self.stubs.Set(httplib2.Http, 'request', self.fake_http.request)
-        self.useFixture(mockpatch.PatchObject(self.rest_client, '_get_region',
-                                              side_effect=self._get_region()))
         self.useFixture(mockpatch.PatchObject(self.rest_client,
                                               '_log_request'))
 
@@ -304,7 +299,7 @@
         self.useFixture(fake_config.ConfigFixture())
         self.stubs.Set(config, 'TempestConfigPrivate', fake_config.FakePrivate)
         self.rest_client = rest_client.RestClient(
-            fake_auth_provider.FakeAuthProvider(), None)
+            fake_auth_provider.FakeAuthProvider(), None, None)
 
     def test_response_less_than_400(self):
         self.rest_client._error_checker(**self.set_data("399"))