From 090e5ffc691c5d40e45ab0c20dc88032a0987b20 Mon Sep 17 00:00:00 2001 From: Andrey Kurilin Date: Wed, 7 Sep 2016 12:39:12 +0300 Subject: Fix from_response method to process response from requests SessionClient uses requests library. It's response class doesn't have "status" property[1], so in case of any errors(with status code > 400), from_response method is called and raises AttributeError. Also, HTTPClient implementation uses requests lib by default[2](if 'http' argument was not transmitted), so from_response method will raise AttributeError too. [1] - http://docs.python-requests.org/en/master/api/#requests.Response.status_code [2] - https://github.com/openstack/python-ceilometerclient/blob/2.6.0/ceilometerclient/openstack/common/apiclient/client.py#L99-L100 Change-Id: Id8fb2f386e8101951716f30a6365c9aa15bd4b24 Closes-Bug: #1620974 (cherry picked from commit 1b1917ab9b56fe92235ce336d3df3e7a8c1c81d2) --- ceilometerclient/exc.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'ceilometerclient/exc.py') diff --git a/ceilometerclient/exc.py b/ceilometerclient/exc.py index c7e550b..3db1c0c 100644 --- a/ceilometerclient/exc.py +++ b/ceilometerclient/exc.py @@ -118,6 +118,16 @@ for obj_name in dir(sys.modules[__name__]): def from_response(response, details=None): - """Return an instance of an HTTPException based on httplib response.""" - cls = _code_map.get(response.status, HTTPException) + """Return an instance of an HTTPException based on http response.""" + if hasattr(response, "status"): + # it is response from HTTPClient (httplib) + code = response.status + elif hasattr(response, "status_code"): + # it is response from SessionClient (requests) + code = response.status_code + else: + # it is something unexpected + raise TypeError("Function 'from_response' expects only response object" + " from httplib or requests libraries.") + cls = _code_map.get(code, HTTPException) return cls(details) -- cgit v1.2.1