Include server side error message in the multipart error exception.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/509040a6 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/509040a6 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/509040a6 Branch: refs/heads/trunk Commit: 509040a68b5575e6785e6c085e76055cdc1da0fa Parents: 8e5a1f4 Author: Tomaz Muraus <[email protected]> Authored: Mon Jan 6 17:34:42 2014 +0100 Committer: Tomaz Muraus <[email protected]> Committed: Mon Jan 6 17:37:34 2014 +0100 ---------------------------------------------------------------------- libcloud/common/aws.py | 22 ++++++++++++++++------ libcloud/storage/drivers/s3.py | 7 +++++-- 2 files changed, 21 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/509040a6/libcloud/common/aws.py ---------------------------------------------------------------------- diff --git a/libcloud/common/aws.py b/libcloud/common/aws.py index 22d9732..868b5eb 100644 --- a/libcloud/common/aws.py +++ b/libcloud/common/aws.py @@ -26,7 +26,21 @@ from libcloud.utils.xml import findtext, findall class AWSBaseResponse(XmlResponse): - pass + namespace = None + + def _parse_error_details(self, element): + """ + Parse code and message from the provided error element. + + :return: ``tuple`` with two elements: (code, message) + :rtype: ``tuple`` + """ + code = findtext(element=element, xpath='Code', + namespace=self.namespace) + message = findtext(element=element, xpath='Message', + namespace=self.namespace) + + return code, message class AWSGenericResponse(AWSBaseResponse): @@ -71,11 +85,7 @@ class AWSGenericResponse(AWSBaseResponse): msgs = [] for err in errs: - code = findtext(element=err, xpath='Code', - namespace=self.namespace) - message = findtext(element=err, xpath='Message', - namespace=self.namespace) - + code, message = self._parse_error_details(element=err) exceptionCls = self.exceptions.get(code, None) if exceptionCls is None: http://git-wip-us.apache.org/repos/asf/libcloud/blob/509040a6/libcloud/storage/drivers/s3.py ---------------------------------------------------------------------- diff --git a/libcloud/storage/drivers/s3.py b/libcloud/storage/drivers/s3.py index 947b1d7..b89d4be 100644 --- a/libcloud/storage/drivers/s3.py +++ b/libcloud/storage/drivers/s3.py @@ -64,7 +64,7 @@ RESPONSES_PER_REQUEST = 100 class S3Response(AWSBaseResponse): - + namespace = None valid_response_codes = [httplib.NOT_FOUND, httplib.CONFLICT, httplib.BAD_REQUEST] @@ -588,7 +588,10 @@ class S3StorageDriver(StorageDriver): method='POST') if response.status != httplib.OK: - raise LibcloudError('Error in multipart commit', driver=self) + element = response.object + code, message = response._parse_error_details(element=element) + msg = 'Error in multipart commit: %s (%s)' % (message, code) + raise LibcloudError(msg, driver=self) # Get the server's etag to be passed back to the caller body = response.parse_body()
