Fix AttributeError in negotiate_version

Seen in kolla-ansible CI, if ironic inspector starts up before ironic
API is properly up, we see the following error:

The PXE filter DnsmasqFilter, state=initialized encountered an
exception: StrictVersion instance has no attribute 'version'; resetting
the filter: AttributeError: StrictVersion instance has no attribute
'version'

Example: http://paste.openstack.org/show/756342/

The usual cause of this error is when StrictVersion is initialised with
a version of None. This suggests to me that max_ver is None.

This leads to an exception being raised that circumvents the client's
retry mechanisms.

In the particular case of kolla-ansible CI, Ironic API is behind a load
balancer, and all backends are down resulting in a 503. The lack of a
retry caused ironic inspector to fail on startup.

This patch catches the case where we get a 4xx or 5xx return code when
checking the version, and raises an error that works with the client's
retry mechanisms.

Change-Id: Ib62ca3ee4626084e5e9b90e93e4fa97938023457
Story: 2006393
Task: 36266
(cherry picked from commit 0e9bf337f1)
This commit is contained in:
Mark Goddard 2019-08-12 16:19:37 +01:00
parent 42faaabdee
commit 0bd26cc47e
2 changed files with 13 additions and 1 deletions

View File

@ -118,7 +118,11 @@ class VersionNegotiationMixin(object):
str(self.os_ironic_api_version).split('.')[0]) str(self.os_ironic_api_version).split('.')[0])
else: else:
base_version = API_VERSION base_version = API_VERSION
return self._make_simple_request(conn, 'GET', base_version) # Raise exception on client or server error.
resp = self._make_simple_request(conn, 'GET', base_version)
if not resp.ok:
raise exc.from_response(resp, method='GET', url=base_version)
return resp
version_overridden = False version_overridden = False

View File

@ -0,0 +1,8 @@
---
fixes:
- |
Fixes an issue where some failure modes of communication with the Ironic
API could result in an exception that circumvents the client's retry
mechanisms. In particular this includes HTTP 503 service unavailable which
is seen when Ironic operates behind a load balancer, and no backend is
available to handle the request.