Change to use WARNING level for heartbeat conflict errors

It's normal that ironic returns 409 Conflict from time to time, so
it's a bit confusing that we report this with Exception level and
traceback.

Change-Id: I1627c61facc3fadd0f5d9d324150e7d2833c7fbc
Closes-Bug: #1533113
This commit is contained in:
Zhenguo Niu 2016-02-22 16:27:24 +08:00
parent 9b9b982fdd
commit d25d94b316
4 changed files with 28 additions and 1 deletions

View File

@ -118,6 +118,10 @@ class IronicPythonAgentHeartbeater(threading.Thread):
)
self.error_delay = self.initial_delay
LOG.info('heartbeat successful')
except errors.HeartbeatConflictError:
LOG.warning('conflict error sending heartbeat')
self.error_delay = min(self.error_delay * self.backoff_factor,
self.max_delay)
except Exception:
LOG.exception('error sending heartbeat')
self.error_delay = min(self.error_delay * self.backoff_factor,

View File

@ -109,6 +109,15 @@ class HeartbeatError(IronicAPIError):
super(HeartbeatError, self).__init__(details)
class HeartbeatConflictError(IronicAPIError):
"""ConflictError raised when a heartbeat to the agent API fails."""
message = 'ConflictError heartbeating to agent API'
def __init__(self, details):
super(HeartbeatConflictError, self).__init__(details)
class LookupNodeError(IronicAPIError):
"""Error raised when the node lookup to the Ironic API fails."""

View File

@ -72,7 +72,10 @@ class APIClient(object):
except Exception as e:
raise errors.HeartbeatError(str(e))
if response.status_code != requests.codes.ACCEPTED:
if response.status_code == requests.codes.CONFLICT:
data = response.json
raise errors.HeartbeatConflictError(data.get('faultstring'))
elif response.status_code != requests.codes.ACCEPTED:
msg = 'Invalid status code: {0}'.format(response.status_code)
raise errors.HeartbeatError(msg)

View File

@ -89,6 +89,17 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase):
uuid='deadbeef-dabb-ad00-b105-f00d00bab10c',
advertise_address=('192.0.2.1', '9999'))
def test_heartbeat_409_status_code(self):
response = mock.Mock()
response.status_code = 409
self.api_client.session.request = mock.Mock()
self.api_client.session.request.return_value = response
self.assertRaises(errors.HeartbeatConflictError,
self.api_client.heartbeat,
uuid='deadbeef-dabb-ad00-b105-f00d00bab10c',
advertise_address=('192.0.2.1', '9999'))
@mock.patch('eventlet.greenthread.sleep')
@mock.patch('ironic_python_agent.ironic_api_client.APIClient._do_lookup')
def test_lookup_node(self, lookup_mock, sleep_mock):