summaryrefslogtreecommitdiff
path: root/glanceclient/v1/images.py
diff options
context:
space:
mode:
authorChris Buccella <buccella@linux.vnet.ibm.com>2014-01-27 20:05:36 +0000
committerChris Buccella <buccella@linux.vnet.ibm.com>2014-04-25 10:26:40 -0400
commitf0635ecf39b3aeca868de4a03bdcb66138519c2b (patch)
tree6d38f0c1355f228b67667fcfb4c8b4816d2a81eb /glanceclient/v1/images.py
parent5528ba536fd86cad225feb1d4e5bb75d838ecf69 (diff)
downloadpython-glanceclient-f0635ecf39b3aeca868de4a03bdcb66138519c2b.tar.gz
Return request ID to callers
Currently, calls (create, get, etc.) return only the Image to a caller. In order to log a mapping the request IDs of both glanceclient and the caller, the x-openstack-request-id header value is needed on the server side. This change allows that value to be bubbled up and returned to the caller so that the appropriate logging can occur. The return_req_id parameter can be set by services that are logging request IDs. Glance's request ID will then be returned via the return_req_id parameter. This is a prerequisite for Log Request ID Mappings nova-spec to be completed; Change Ib9b820a0feeb0c0e828ed3e4fab8261f8761ba9a Change I43be05c351f901cee5509c76cff6d69f060c0b3f is an example of a caller using this. Implements: blueprint return-req-id Change-Id: Ia82aa14db5f0e453010514fffb9a25d7b0fc2fd1
Diffstat (limited to 'glanceclient/v1/images.py')
-rw-r--r--glanceclient/v1/images.py52
1 files changed, 43 insertions, 9 deletions
diff --git a/glanceclient/v1/images.py b/glanceclient/v1/images.py
index 72cebf1..19b2432 100644
--- a/glanceclient/v1/images.py
+++ b/glanceclient/v1/images.py
@@ -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)
+
+ return paginate(params, 0, return_request_id)
- def delete(self, image):
+ 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']))