Merge "Return request ID to callers"

This commit is contained in:
Jenkins
2014-05-20 21:42:11 +00:00
committed by Gerrit Code Review
3 changed files with 173 additions and 12 deletions
+4 -2
View File
@@ -57,10 +57,12 @@ class Manager(object):
obj_class = self.resource_class
data = body[response_key]
return [obj_class(self, res, loaded=True) for res in data if res]
return ([obj_class(self, res, loaded=True) for res in data if res],
resp)
def _delete(self, url):
self.api.raw_request('DELETE', url)
resp = self.api.raw_request('DELETE', url)
return resp[0]
def _update(self, url, body, response_key=None):
resp, body = self.api.json_request('PUT', url, body=body)
+43 -9
View File
@@ -39,6 +39,8 @@ SORT_DIR_VALUES = ('asc', 'desc')
SORT_KEY_VALUES = ('name', 'status', 'container_format', 'disk_format',
'size', 'id', 'created_at', 'updated_at')
OS_REQ_ID_HDR = 'x-openstack-request-id'
class Image(base.Resource):
def __repr__(self):
@@ -47,7 +49,7 @@ class Image(base.Resource):
def update(self, **fields):
self.manager.update(self, **fields)
def delete(self):
def delete(self, **kwargs):
return self.manager.delete(self)
def data(self, **kwargs):
@@ -104,7 +106,7 @@ class ImageManager(base.Manager):
pass
return meta
def get(self, image):
def get(self, image, **kwargs):
"""Get the metadata for a specific image.
:param image: image object or id to look up
@@ -115,9 +117,13 @@ class ImageManager(base.Manager):
resp, body = self.api.raw_request('HEAD', '/v1/images/%s'
% parse.quote(str(image_id)))
meta = self._image_meta_from_headers(dict(resp.getheaders()))
return_request_id = kwargs.get('return_req_id', None)
if return_request_id is not None:
return_request_id.append(resp.getheader(OS_REQ_ID_HDR, None))
return Image(self, meta)
def data(self, image, do_checksum=True):
def data(self, image, do_checksum=True, **kwargs):
"""Get the raw data for a specific image.
:param image: image object or id to look up
@@ -130,6 +136,10 @@ class ImageManager(base.Manager):
checksum = resp.getheader('x-image-meta-checksum', None)
if do_checksum and checksum is not None:
body.set_checksum(checksum)
return_request_id = kwargs.get('return_req_id', None)
if return_request_id is not None:
return_request_id.append(resp.getheader(OS_REQ_ID_HDR, None))
return body
def list(self, **kwargs):
@@ -144,11 +154,14 @@ class ImageManager(base.Manager):
:param owner: If provided, only images with this owner (tenant id)
will be listed. An empty string ('') matches ownerless
images.
:param return_request_id: If an empty list is provided, populate this
list with the request ID value from the header
x-openstack-request-id
:rtype: list of :class:`Image`
"""
absolute_limit = kwargs.get('limit')
def paginate(qp, seen=0):
def paginate(qp, seen=0, return_request_id=None):
def filter_owner(owner, image):
# If client side owner 'filter' is specified
# only return images that match 'owner'.
@@ -173,7 +186,11 @@ class ImageManager(base.Manager):
qp[param] = strutils.safe_encode(value)
url = '/v1/images/detail?%s' % parse.urlencode(qp)
images = self._list(url, "images")
images, resp = self._list(url, "images")
if return_request_id is not None:
return_request_id.append(resp.getheader(OS_REQ_ID_HDR, None))
for image in images:
if filter_owner(owner, image):
continue
@@ -186,7 +203,7 @@ class ImageManager(base.Manager):
if (page_size and len(images) == page_size and
(absolute_limit is None or 0 < seen < absolute_limit)):
qp['marker'] = image.id
for image in paginate(qp, seen):
for image in paginate(qp, seen, return_request_id):
yield image
params = {'limit': kwargs.get('page_size', DEFAULT_PAGE_SIZE)}
@@ -221,11 +238,16 @@ class ImageManager(base.Manager):
if 'is_public' in kwargs:
params['is_public'] = kwargs['is_public']
return paginate(params)
return_request_id = kwargs.get('return_req_id', None)
def delete(self, image):
return paginate(params, 0, return_request_id)
def delete(self, image, **kwargs):
"""Delete an image."""
self._delete("/v1/images/%s" % base.getid(image))
resp = self._delete("/v1/images/%s" % base.getid(image))
return_request_id = kwargs.get('return_req_id', None)
if return_request_id is not None:
return_request_id.append(resp.getheader(OS_REQ_ID_HDR, None))
def create(self, **kwargs):
"""Create an image
@@ -242,6 +264,8 @@ class ImageManager(base.Manager):
for field in kwargs:
if field in CREATE_PARAMS:
fields[field] = kwargs[field]
elif field == 'return_req_id':
continue
else:
msg = 'create() got an unexpected keyword argument \'%s\''
raise TypeError(msg % field)
@@ -254,6 +278,10 @@ class ImageManager(base.Manager):
resp, body_iter = self.api.raw_request(
'POST', '/v1/images', headers=hdrs, body=image_data)
body = json.loads(''.join([c for c in body_iter]))
return_request_id = kwargs.get('return_req_id', None)
if return_request_id is not None:
return_request_id.append(resp.getheader(OS_REQ_ID_HDR, None))
return Image(self, self._format_image_meta_for_user(body['image']))
def update(self, image, **kwargs):
@@ -279,6 +307,8 @@ class ImageManager(base.Manager):
for field in kwargs:
if field in UPDATE_PARAMS:
fields[field] = kwargs[field]
elif field == 'return_req_id':
continue
else:
msg = 'update() got an unexpected keyword argument \'%s\''
raise TypeError(msg % field)
@@ -292,4 +322,8 @@ class ImageManager(base.Manager):
resp, body_iter = self.api.raw_request(
'PUT', url, headers=hdrs, body=image_data)
body = json.loads(''.join([c for c in body_iter]))
return_request_id = kwargs.get('return_req_id', None)
if return_request_id is not None:
return_request_id.append(resp.getheader(OS_REQ_ID_HDR, None))
return Image(self, self._format_image_meta_for_user(body['image']))