diff --git a/ironic_python_agent/inspector.py b/ironic_python_agent/inspector.py index 2b6f2b593..9cfeb4e91 100644 --- a/ironic_python_agent/inspector.py +++ b/ironic_python_agent/inspector.py @@ -134,15 +134,20 @@ def call_inspector(data, failures): @tenacity.retry( retry=tenacity.retry_if_exception_type( - requests.exceptions.ConnectionError), + (requests.exceptions.ConnectionError, + requests.exceptions.HTTPError)), stop=tenacity.stop_after_attempt(_RETRY_ATTEMPTS), - wait=tenacity.wait_fixed(_RETRY_WAIT), + wait=tenacity.wait_exponential(multiplier=1.5, + min=_RETRY_WAIT, max=30), reraise=True) def _post_to_inspector(): - return requests.post( + inspector_resp = requests.post( CONF.inspection_callback_url, data=data, - verify=verify, cert=cert, - timeout=CONF.http_request_timeout) + verify=verify, cert=cert, timeout=CONF.http_request_timeout) + if inspector_resp.status_code >= 500: + raise requests.exceptions.HTTPError(response=inspector_resp) + + return inspector_resp resp = _post_to_inspector() if resp.status_code >= 400: diff --git a/ironic_python_agent/tests/unit/test_inspector.py b/ironic_python_agent/tests/unit/test_inspector.py index cc6aa4d1a..cd5f2eae0 100644 --- a/ironic_python_agent/tests/unit/test_inspector.py +++ b/ironic_python_agent/tests/unit/test_inspector.py @@ -204,6 +204,34 @@ class TestCallInspector(base.IronicAgentTest): data, failures) self.assertEqual(5, mock_post.call_count) + @mock.patch.object(inspector, '_RETRY_WAIT', 0.01) + @mock.patch.object(inspector, '_RETRY_ATTEMPTS', 3) + def test_inspector_retries_on_50X_error(self, mock_post): + mock_post.side_effect = [mock.Mock(status_code=500), + mock.Mock(status_code=501), + mock.Mock(status_code=502)] + failures = utils.AccumulatedFailures() + data = collections.OrderedDict(data=42) + self.assertRaises(requests.exceptions.HTTPError, + inspector.call_inspector, + data, failures) + self.assertEqual(3, mock_post.call_count) + + @mock.patch.object(inspector, '_RETRY_WAIT', 0.01) + @mock.patch.object(inspector, '_RETRY_ATTEMPTS', 2) + def test_inspector_retry_on_50X_and_succeed(self, mock_post): + mock_post.side_effect = [mock.Mock(status_code=503), + mock.Mock(status_code=200)] + + failures = utils.AccumulatedFailures() + data = collections.OrderedDict(data=42) + inspector.call_inspector(data, failures) + self.assertEqual(2, mock_post.call_count) + mock_post.assert_called_with('url', + cert=None, verify=True, + data='{"data": 42, "error": null}', + timeout=30) + class BaseDiscoverTest(base.IronicAgentTest): def setUp(self): diff --git a/releasenotes/notes/inspector-retry-502-2b286e2ccc64c195.yaml b/releasenotes/notes/inspector-retry-502-2b286e2ccc64c195.yaml new file mode 100644 index 000000000..e4bf726dd --- /dev/null +++ b/releasenotes/notes/inspector-retry-502-2b286e2ccc64c195.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Fixes the post data to inspector to retry in 50X errors.