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)