diff --git a/ironicclient/common/http.py b/ironicclient/common/http.py index 081b0d6b7..c46e098be 100644 --- a/ironicclient/common/http.py +++ b/ironicclient/common/http.py @@ -170,7 +170,7 @@ def with_retries(func): for attempt in range(1, num_attempts + 1): try: return func(self, url, method, **kwargs) - except exc.Conflict as error: + except (exc.Conflict, exc.ServiceUnavailable) as error: msg = ("Error contacting Ironic server: %(error)s. " "Attempt %(attempt)d of %(total)d" % {'attempt': attempt, diff --git a/ironicclient/tests/unit/test_http.py b/ironicclient/tests/unit/test_http.py index 9192a08b3..ec39fcb15 100644 --- a/ironicclient/tests/unit/test_http.py +++ b/ironicclient/tests/unit/test_http.py @@ -541,6 +541,26 @@ class RetriesTestCase(utils.BaseTestCase): self.assertEqual(200, response.status) self.assertEqual(2, mock_getcon.call_count) + @mock.patch.object(http.HTTPClient, 'get_connection', autospec=True) + def test_http_retry_503(self, mock_getcon): + error_body = _get_error_body() + bad_resp = utils.FakeResponse( + {'content-type': 'text/plain'}, + six.StringIO(error_body), + version=1, + status=503) + good_resp = utils.FakeResponse( + {'content-type': 'text/plain'}, + six.StringIO("meow"), + version=1, + status=200) + client = http.HTTPClient('http://localhost/') + mock_getcon.side_effect = iter((utils.FakeConnection(bad_resp), + utils.FakeConnection(good_resp))) + response, body_iter = client._http_request('/v1/resources', 'GET') + self.assertEqual(200, response.status) + self.assertEqual(2, mock_getcon.call_count) + @mock.patch.object(http.HTTPClient, 'get_connection', autospec=True) def test_http_failed_retry(self, mock_getcon): error_body = _get_error_body() @@ -602,6 +622,24 @@ class RetriesTestCase(utils.BaseTestCase): client.json_request('GET', '/v1/resources') self.assertEqual(2, fake_session.request.call_count) + def test_session_retry_503(self): + error_body = _get_error_body() + + fake_resp = utils.FakeSessionResponse( + {'Content-Type': 'application/json'}, + error_body, + 503) + ok_resp = utils.FakeSessionResponse( + {'Content-Type': 'application/json'}, + b"OK", + 200) + fake_session = mock.Mock(spec=utils.FakeSession) + fake_session.request.side_effect = iter((fake_resp, ok_resp)) + + client = _session_client(session=fake_session) + client.json_request('GET', '/v1/resources') + self.assertEqual(2, fake_session.request.call_count) + def test_session_retry_fail(self): error_body = _get_error_body()