Tempest image clients use version in URL

Tempest image clients specify the version in each URL of each
method instead of using api_version at class level, which provides
support for both versioned and unversioned enpoints in the
catalog.

Change-Id: Id7883936b5a7ff13dc71fff307a5322c63221ad5
Closes-bug: #1130387
diff --git a/tempest/services/image/v1/json/images_client.py b/tempest/services/image/v1/json/images_client.py
index b45ca22..e7339c4 100644
--- a/tempest/services/image/v1/json/images_client.py
+++ b/tempest/services/image/v1/json/images_client.py
@@ -31,6 +31,7 @@
 
 
 class ImagesClient(rest_client.RestClient):
+    api_version = "v1"
 
     def _image_meta_from_headers(self, headers):
         meta = {'properties': {}}
@@ -102,9 +103,9 @@
         # info fixed-sized chunks.
         headers['Content-Type'] = 'application/octet-stream'
         data = iter(functools.partial(data.read, CHUNKSIZE), b'')
-        resp, body = self.request('POST', '/v1/images',
+        resp, body = self.request('POST', 'images',
                                   headers=headers, body=data, chunked=True)
-        self._error_checker('POST', '/v1/images', headers, data, resp,
+        self._error_checker('POST', 'images', headers, data, resp,
                             body)
         body = json.loads(body)
         return rest_client.ResponseBody(resp, body)
@@ -114,7 +115,7 @@
         # info fixed-sized chunks.
         headers['Content-Type'] = 'application/octet-stream'
         data = iter(functools.partial(data.read, CHUNKSIZE), b'')
-        url = '/v1/images/%s' % image_id
+        url = 'images/%s' % image_id
         resp, body = self.request('PUT', url, headers=headers,
                                   body=data, chunked=True)
         self._error_checker('PUT', url, headers, data,
@@ -136,7 +137,7 @@
         if data is not None:
             return self._create_with_data(headers, data)
 
-        resp, body = self.post('v1/images', None, headers)
+        resp, body = self.post('images', None, headers)
         self.expected_success(201, resp.status)
         body = json.loads(body)
         return rest_client.ResponseBody(resp, body)
@@ -149,14 +150,14 @@
         if data is not None:
             return self._update_with_data(image_id, headers, data)
 
-        url = 'v1/images/%s' % image_id
+        url = 'images/%s' % image_id
         resp, body = self.put(url, None, headers)
         self.expected_success(200, resp.status)
         body = json.loads(body)
         return rest_client.ResponseBody(resp, body)
 
     def delete_image(self, image_id):
-        url = 'v1/images/%s' % image_id
+        url = 'images/%s' % image_id
         resp, body = self.delete(url)
         self.expected_success(200, resp.status)
         return rest_client.ResponseBody(resp, body)
@@ -171,7 +172,7 @@
         any changes.
         :param changes_since: The name is changed to changes-since
         """
-        url = 'v1/images'
+        url = 'images'
 
         if detail:
             url += '/detail'
@@ -193,7 +194,7 @@
 
     def check_image(self, image_id):
         """Check image metadata."""
-        url = 'v1/images/%s' % image_id
+        url = 'images/%s' % image_id
         resp, __ = self.head(url)
         self.expected_success(200, resp.status)
         body = self._image_meta_from_headers(resp)
@@ -201,7 +202,7 @@
 
     def show_image(self, image_id):
         """Get image details plus the image itself."""
-        url = 'v1/images/%s' % image_id
+        url = 'images/%s' % image_id
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         return rest_client.ResponseBodyData(resp, body)
@@ -220,7 +221,7 @@
         return 'image_meta'
 
     def list_image_members(self, image_id):
-        url = 'v1/images/%s/members' % image_id
+        url = 'images/%s/members' % image_id
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         body = json.loads(body)
@@ -228,7 +229,7 @@
 
     def list_shared_images(self, tenant_id):
         """List shared images with the specified tenant"""
-        url = 'v1/shared-images/%s' % tenant_id
+        url = 'shared-images/%s' % tenant_id
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         body = json.loads(body)
@@ -240,14 +241,14 @@
         Available params: see http://developer.openstack.org/
                               api-ref-image-v1.html#addMember-v1
         """
-        url = 'v1/images/%s/members/%s' % (image_id, member_id)
+        url = 'images/%s/members/%s' % (image_id, member_id)
         body = json.dumps({'member': kwargs})
         resp, __ = self.put(url, body)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp)
 
     def delete_member(self, member_id, image_id):
-        url = 'v1/images/%s/members/%s' % (image_id, member_id)
+        url = 'images/%s/members/%s' % (image_id, member_id)
         resp, __ = self.delete(url)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp)
diff --git a/tempest/services/image/v2/json/images_client.py b/tempest/services/image/v2/json/images_client.py
index 83f56cc..f175dce 100644
--- a/tempest/services/image/v2/json/images_client.py
+++ b/tempest/services/image/v2/json/images_client.py
@@ -25,6 +25,7 @@
 
 
 class ImagesClient(rest_client.RestClient):
+    api_version = "v2"
 
     def update_image(self, image_id, patch):
         """Update an image.
@@ -35,7 +36,7 @@
         data = json.dumps(patch)
         headers = {"Content-Type": "application/openstack-images-v2.0"
                                    "-json-patch"}
-        resp, body = self.patch('v2/images/%s' % image_id, data, headers)
+        resp, body = self.patch('images/%s' % image_id, data, headers)
         self.expected_success(200, resp.status)
         body = json.loads(body)
         return rest_client.ResponseBody(resp, body)
@@ -47,31 +48,31 @@
                               api-ref-image-v2.html#createImage-v2
         """
         data = json.dumps(kwargs)
-        resp, body = self.post('v2/images', data)
+        resp, body = self.post('images', data)
         self.expected_success(201, resp.status)
         body = json.loads(body)
         return rest_client.ResponseBody(resp, body)
 
     def deactivate_image(self, image_id):
-        url = 'v2/images/%s/actions/deactivate' % image_id
+        url = 'images/%s/actions/deactivate' % image_id
         resp, body = self.post(url, None)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp, body)
 
     def reactivate_image(self, image_id):
-        url = 'v2/images/%s/actions/reactivate' % image_id
+        url = 'images/%s/actions/reactivate' % image_id
         resp, body = self.post(url, None)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp, body)
 
     def delete_image(self, image_id):
-        url = 'v2/images/%s' % image_id
+        url = 'images/%s' % image_id
         resp, _ = self.delete(url)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp)
 
     def list_images(self, params=None):
-        url = 'v2/images'
+        url = 'images'
 
         if params:
             url += '?%s' % urllib.urlencode(params)
@@ -82,7 +83,7 @@
         return rest_client.ResponseBody(resp, body)
 
     def show_image(self, image_id):
-        url = 'v2/images/%s' % image_id
+        url = 'images/%s' % image_id
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         body = json.loads(body)
@@ -101,7 +102,7 @@
         return 'image'
 
     def store_image_file(self, image_id, data):
-        url = 'v2/images/%s/file' % image_id
+        url = 'images/%s/file' % image_id
 
         # We are going to do chunked transfert, so split the input data
         # info fixed-sized chunks.
@@ -114,25 +115,25 @@
         return rest_client.ResponseBody(resp, body)
 
     def show_image_file(self, image_id):
-        url = 'v2/images/%s/file' % image_id
+        url = 'images/%s/file' % image_id
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         return rest_client.ResponseBodyData(resp, body)
 
     def add_image_tag(self, image_id, tag):
-        url = 'v2/images/%s/tags/%s' % (image_id, tag)
+        url = 'images/%s/tags/%s' % (image_id, tag)
         resp, body = self.put(url, body=None)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp, body)
 
     def delete_image_tag(self, image_id, tag):
-        url = 'v2/images/%s/tags/%s' % (image_id, tag)
+        url = 'images/%s/tags/%s' % (image_id, tag)
         resp, _ = self.delete(url)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp)
 
     def list_image_members(self, image_id):
-        url = 'v2/images/%s/members' % image_id
+        url = 'images/%s/members' % image_id
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         body = json.loads(body)
@@ -144,7 +145,7 @@
         Available params: see http://developer.openstack.org/
                               api-ref-image-v2.html#createImageMember-v2
         """
-        url = 'v2/images/%s/members' % image_id
+        url = 'images/%s/members' % image_id
         data = json.dumps(kwargs)
         resp, body = self.post(url, data)
         self.expected_success(200, resp.status)
@@ -157,7 +158,7 @@
         Available params: see http://developer.openstack.org/
                               api-ref-image-v2.html#updateImageMember-v2
         """
-        url = 'v2/images/%s/members/%s' % (image_id, member_id)
+        url = 'images/%s/members/%s' % (image_id, member_id)
         data = json.dumps(kwargs)
         resp, body = self.put(url, data)
         self.expected_success(200, resp.status)
@@ -165,26 +166,26 @@
         return rest_client.ResponseBody(resp, body)
 
     def show_image_member(self, image_id, member_id):
-        url = 'v2/images/%s/members/%s' % (image_id, member_id)
+        url = 'images/%s/members/%s' % (image_id, member_id)
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         return rest_client.ResponseBody(resp, json.loads(body))
 
     def delete_image_member(self, image_id, member_id):
-        url = 'v2/images/%s/members/%s' % (image_id, member_id)
+        url = 'images/%s/members/%s' % (image_id, member_id)
         resp, _ = self.delete(url)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp)
 
     def show_schema(self, schema):
-        url = 'v2/schemas/%s' % schema
+        url = 'schemas/%s' % schema
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         body = json.loads(body)
         return rest_client.ResponseBody(resp, body)
 
     def list_resource_types(self):
-        url = '/v2/metadefs/resource_types'
+        url = 'metadefs/resource_types'
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         body = json.loads(body)
@@ -197,13 +198,13 @@
                               api-ref-image-v2.html#createNamespace-v2
         """
         data = json.dumps(kwargs)
-        resp, body = self.post('/v2/metadefs/namespaces', data)
+        resp, body = self.post('metadefs/namespaces', data)
         self.expected_success(201, resp.status)
         body = json.loads(body)
         return rest_client.ResponseBody(resp, body)
 
     def show_namespace(self, namespace):
-        url = '/v2/metadefs/namespaces/%s' % namespace
+        url = 'metadefs/namespaces/%s' % namespace
         resp, body = self.get(url)
         self.expected_success(200, resp.status)
         body = json.loads(body)
@@ -220,14 +221,14 @@
         params = {'namespace': namespace}
         params.update(kwargs)
         data = json.dumps(params)
-        url = '/v2/metadefs/namespaces/%s' % namespace
+        url = 'metadefs/namespaces/%s' % namespace
         resp, body = self.put(url, body=data)
         self.expected_success(200, resp.status)
         body = json.loads(body)
         return rest_client.ResponseBody(resp, body)
 
     def delete_namespace(self, namespace):
-        url = '/v2/metadefs/namespaces/%s' % namespace
+        url = 'metadefs/namespaces/%s' % namespace
         resp, _ = self.delete(url)
         self.expected_success(204, resp.status)
         return rest_client.ResponseBody(resp)