diff options
author | Julia Kreger <juliaashleykreger@gmail.com> | 2020-08-20 08:21:50 -0700 |
---|---|---|
committer | Julia Kreger <juliaashleykreger@gmail.com> | 2020-08-20 13:45:47 -0700 |
commit | f670f704f3e4bf9b05a97d1f39ab99febfe29cf7 (patch) | |
tree | 6a8d3fa463beacd79a1b7e256b3ee6ae660fb0a7 /ironic_python_agent | |
parent | ba6ca246f542b49e59d51692231a59abdaf6290b (diff) | |
download | ironic-python-agent-f670f704f3e4bf9b05a97d1f39ab99febfe29cf7.tar.gz |
Clarify connection error on heartbeats
Heartbeat connection errors are often a sign of a transitory
network failures which may resolve themselves. But an operator
looking at the screen doesn't necessarilly know that.
They don't understand that there could have been a network
failure, or a misconfiguration that caused the connectivity
failure and soft of kind of default to "well it failed"
without further clarification.
As such, this patch adds explicit catching of the requests
ConnectionError exception and rasies a new internal error
with a more verbose error message in that event to provide
operators with additional clarity.
Change-Id: I4cb2c0d1f577df1c4451308bd86efa8f94390b0c
Story: 2008046
Task: 40709
Diffstat (limited to 'ironic_python_agent')
-rw-r--r-- | ironic_python_agent/errors.py | 10 | ||||
-rw-r--r-- | ironic_python_agent/ironic_api_client.py | 2 | ||||
-rw-r--r-- | ironic_python_agent/tests/unit/test_ironic_api_client.py | 10 |
3 files changed, 22 insertions, 0 deletions
diff --git a/ironic_python_agent/errors.py b/ironic_python_agent/errors.py index 99bbe2b8..bf0253dd 100644 --- a/ironic_python_agent/errors.py +++ b/ironic_python_agent/errors.py @@ -348,3 +348,13 @@ class ClockSyncError(RESTError): """Error raised when attempting to sync the system clock.""" message = 'Error syncing system clock' + + +class HeartbeatConnectionError(IronicAPIError): + """Transitory connection failure occured attempting to contact the API.""" + + message = ("Error attempting to heartbeat - Possible transitory network " + "failure or blocking port may be present.") + + def __init__(self, details): + super(HeartbeatConnectionError, self).__init__(details) diff --git a/ironic_python_agent/ironic_api_client.py b/ironic_python_agent/ironic_api_client.py index 747b133d..4738f22d 100644 --- a/ironic_python_agent/ironic_api_client.py +++ b/ironic_python_agent/ironic_api_client.py @@ -125,6 +125,8 @@ class APIClient(object): try: response = self._request('POST', path, data=data, headers=headers) + except requests.exceptions.ConnectionError as e: + raise errors.HeartbeatConnectionError(str(e)) except Exception as e: raise errors.HeartbeatError(str(e)) diff --git a/ironic_python_agent/tests/unit/test_ironic_api_client.py b/ironic_python_agent/tests/unit/test_ironic_api_client.py index 562f06be..bd710e77 100644 --- a/ironic_python_agent/tests/unit/test_ironic_api_client.py +++ b/ironic_python_agent/tests/unit/test_ironic_api_client.py @@ -234,6 +234,16 @@ class TestBaseIronicPythonAgent(base.IronicAgentTest): uuid='deadbeef-dabb-ad00-b105-f00d00bab10c', advertise_address=('192.0.2.1', '9999')) + def test_heartbeat_requests_connection_error(self): + self.api_client.session.request = mock.Mock() + self.api_client.session.request.side_effect = \ + requests.exceptions.ConnectionError + self.assertRaisesRegex(errors.HeartbeatConnectionError, + 'transitory network failure or blocking port', + self.api_client.heartbeat, + uuid='meow', + advertise_address=('192.0.2.1', '9999')) + @mock.patch('eventlet.greenthread.sleep', autospec=True) @mock.patch('ironic_python_agent.ironic_api_client.APIClient._do_lookup', autospec=True) |