Make proxy honor raise_exc in REST primitives
Previously, invoking a REST primitive (.get(), .put(), etc.) on a proxy would ignore the raise_exc kwarg and always use raise_exc=False, causing any error coming from the actual service [1] to return a Response object even for responses with status >=400. With this change, the raise_exc kwarg is honored: when True, REST primitives with status >=400 will cause an appropriate ksa exception to be raised. [1] as opposed to lower level e.g. communication errors, which would still raise Change-Id: I463e9a63760a6e61827ba957dd9e5d23bd79f4e8
This commit is contained in:
parent
3cefb17483
commit
b54d03a4c0
@ -1,6 +1,7 @@
|
|||||||
appdirs==1.3.0
|
appdirs==1.3.0
|
||||||
coverage==4.0
|
coverage==4.0
|
||||||
cryptography==2.1
|
cryptography==2.1
|
||||||
|
ddt==1.0.1
|
||||||
decorator==3.4.0
|
decorator==3.4.0
|
||||||
doc8==0.8.0
|
doc8==0.8.0
|
||||||
dogpile.cache==0.6.2
|
dogpile.cache==0.6.2
|
||||||
|
@ -93,7 +93,7 @@ class Proxy(adapter.Adapter):
|
|||||||
global_request_id = conn._global_request_id
|
global_request_id = conn._global_request_id
|
||||||
response = super(Proxy, self).request(
|
response = super(Proxy, self).request(
|
||||||
url, method,
|
url, method,
|
||||||
connect_retries=connect_retries, raise_exc=False,
|
connect_retries=connect_retries, raise_exc=raise_exc,
|
||||||
global_request_id=global_request_id,
|
global_request_id=global_request_id,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
for h in response.history:
|
for h in response.history:
|
||||||
|
@ -12,29 +12,58 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import ddt
|
||||||
|
from keystoneauth1 import exceptions
|
||||||
|
|
||||||
from openstack.tests.unit import base
|
from openstack.tests.unit import base
|
||||||
|
|
||||||
|
|
||||||
|
@ddt.ddt
|
||||||
class TestPlacementRest(base.TestCase):
|
class TestPlacementRest(base.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestPlacementRest, self).setUp()
|
super(TestPlacementRest, self).setUp()
|
||||||
self.use_placement()
|
self.use_placement()
|
||||||
|
|
||||||
def test_discovery(self):
|
def _register_uris(self, status_code=None):
|
||||||
self.register_uris([
|
uri = dict(
|
||||||
dict(method='GET',
|
method='GET',
|
||||||
uri=self.get_mock_url(
|
uri=self.get_mock_url(
|
||||||
'placement', 'public', append=['allocation_candidates']),
|
'placement', 'public', append=['allocation_candidates']),
|
||||||
json={})
|
json={})
|
||||||
])
|
if status_code is not None:
|
||||||
rs = self.cloud.placement.get('/allocation_candidates')
|
uri['status_code'] = status_code
|
||||||
self.assertEqual(200, rs.status_code)
|
self.register_uris([uri])
|
||||||
|
|
||||||
|
def _validate_resp(self, resp, status_code):
|
||||||
|
self.assertEqual(status_code, resp.status_code)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
'https://placement.example.com/allocation_candidates',
|
'https://placement.example.com/allocation_candidates',
|
||||||
rs.url)
|
resp.url)
|
||||||
self.assert_calls()
|
self.assert_calls()
|
||||||
|
|
||||||
|
@ddt.data({}, {'raise_exc': False}, {'raise_exc': True})
|
||||||
|
def test_discovery(self, get_kwargs):
|
||||||
|
self._register_uris()
|
||||||
|
# Regardless of raise_exc, a <400 response doesn't raise
|
||||||
|
rs = self.cloud.placement.get('/allocation_candidates', **get_kwargs)
|
||||||
|
self._validate_resp(rs, 200)
|
||||||
|
|
||||||
|
@ddt.data({}, {'raise_exc': False})
|
||||||
|
def test_discovery_err(self, get_kwargs):
|
||||||
|
self._register_uris(status_code=500)
|
||||||
|
# >=400 doesn't raise by default or with explicit raise_exc=False
|
||||||
|
rs = self.cloud.placement.get('/allocation_candidates', **get_kwargs)
|
||||||
|
self._validate_resp(rs, 500)
|
||||||
|
|
||||||
|
def test_discovery_exc(self):
|
||||||
|
self._register_uris(status_code=500)
|
||||||
|
# raise_exc=True raises a ksa exception appropriate to the status code
|
||||||
|
ex = self.assertRaises(
|
||||||
|
exceptions.InternalServerError,
|
||||||
|
self.cloud.placement.get, '/allocation_candidates', raise_exc=True)
|
||||||
|
self._validate_resp(ex.response, 500)
|
||||||
|
|
||||||
def test_microversion_discovery(self):
|
def test_microversion_discovery(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
(1, 17),
|
(1, 17),
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
hacking>=1.0,<1.2 # Apache-2.0
|
hacking>=1.0,<1.2 # Apache-2.0
|
||||||
|
|
||||||
coverage!=4.4,>=4.0 # Apache-2.0
|
coverage!=4.4,>=4.0 # Apache-2.0
|
||||||
|
ddt>=1.0.1 # MIT
|
||||||
extras>=1.0.0 # MIT
|
extras>=1.0.0 # MIT
|
||||||
fixtures>=3.0.0 # Apache-2.0/BSD
|
fixtures>=3.0.0 # Apache-2.0/BSD
|
||||||
jsonschema>=2.6.0 # MIT
|
jsonschema>=2.6.0 # MIT
|
||||||
|
Loading…
x
Reference in New Issue
Block a user