From 4fe325f418d103aea4b2b55bcc61f4695b6001b4 Mon Sep 17 00:00:00 2001 From: Enhao Cui Date: Thu, 6 Aug 2020 15:33:36 -0700 Subject: [PATCH] Expose status codes of related errors in ManagerError Change-Id: I5bad12d82802cc2970b84bc769c89d948c48a791 --- vmware_nsxlib/tests/unit/v3/test_client.py | 3 ++- vmware_nsxlib/v3/client.py | 16 +++++++++++++--- vmware_nsxlib/v3/exceptions.py | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/vmware_nsxlib/tests/unit/v3/test_client.py b/vmware_nsxlib/tests/unit/v3/test_client.py index a698a65b..740f07af 100644 --- a/vmware_nsxlib/tests/unit/v3/test_client.py +++ b/vmware_nsxlib/tests/unit/v3/test_client.py @@ -259,7 +259,8 @@ class NsxV3RESTClientTestCase(nsxlib_testcase.NsxClientTestCase): 'error_message': 'bad', 'related_errors': [{ 'error_message': 'bla', - 'error_code': 'code'}]}) + 'error_code': 'code', + 'httpStatus': 'BAD_REQUEST'}]}) response = mocks.MockRequestsResponse( status_code, content) diff --git a/vmware_nsxlib/v3/client.py b/vmware_nsxlib/v3/client.py index f411bf15..f8bd8bab 100644 --- a/vmware_nsxlib/v3/client.py +++ b/vmware_nsxlib/v3/client.py @@ -34,6 +34,7 @@ def get_http_error_details(response): msg = response.json() if response.content else '' error_code = None related_error_codes = [] + related_status_codes = [] if isinstance(msg, dict) and 'error_message' in msg: error_code = msg.get('error_code') @@ -42,6 +43,10 @@ def get_http_error_details(response): related_error_codes = [str(error['error_code']) for error in msg.get('related_errors', []) if error.get('error_code')] + related_status_codes = [getattr(requests.codes, error['httpStatus']) + for error in msg.get('related_errors', []) if + error.get('httpStatus')] + msg = msg['error_message'] if related_errors: msg += " relatedErrors: %s" % ' '.join(related_errors) @@ -49,6 +54,7 @@ def get_http_error_details(response): return {'status_code': response.status_code, 'error_code': error_code, 'related_error_codes': related_error_codes, + 'related_status_codes': related_status_codes, 'details': msg} @@ -193,12 +199,14 @@ class RESTClient(object): return self._rest_call(url, method='PATCH', body=body, headers=headers) def _raise_error(self, operation, status_code, details, - error_code=None, related_error_codes=None): + error_code=None, related_error_codes=None, + related_status_codes=None): error = http_error_to_exception(status_code, error_code) raise error(manager='', operation=operation, details=details, error_code=error_code, related_error_codes=related_error_codes, - status_code=status_code) + status_code=status_code, + related_status_codes=related_status_codes) def _validate_result(self, result, expected, operation, silent=False): if result.status_code not in expected: @@ -350,7 +358,8 @@ class NSX3Client(JSONRESTClient): client_obj=client_obj) def _raise_error(self, operation, status_code, details, - error_code=None, related_error_codes=None): + error_code=None, related_error_codes=None, + related_status_codes=None): """Override the Rest client errors to add the manager IPs""" error = http_error_to_exception(status_code, error_code) raise error(manager=self.nsx_api_managers, @@ -358,6 +367,7 @@ class NSX3Client(JSONRESTClient): details=details, error_code=error_code, related_error_codes=related_error_codes, + related_status_codes=related_status_codes, status_code=status_code) def _rest_call(self, url, **kwargs): diff --git a/vmware_nsxlib/v3/exceptions.py b/vmware_nsxlib/v3/exceptions.py index 30bed5ee..6a88cf96 100644 --- a/vmware_nsxlib/v3/exceptions.py +++ b/vmware_nsxlib/v3/exceptions.py @@ -70,6 +70,7 @@ class ManagerError(NsxLibException): message = _("Unexpected error from backend manager (%(manager)s) " "for %(operation)s%(details)s") related_error_codes = [] + related_status_codes = [] def __init__(self, **kwargs): details = kwargs.get('details', '') @@ -82,6 +83,7 @@ class ManagerError(NsxLibException): self.error_code = kwargs.get('error_code') self.related_error_codes = kwargs.get('related_error_codes', []) self.status_code = kwargs.get('status_code') + self.related_status_codes = kwargs.get('related_status_codes', []) class ResourceNotFound(ManagerError):