Browse Source

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


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 0e9bf337f1f6aa41f67df2966dacf9e8e897b7da)
Mark Goddard 6 months ago
2 changed files with 13 additions and 1 deletions
  1. +5
  2. +8

+ 5
- 1
ironicclient/common/ View File

@@ -118,7 +118,11 @@ class VersionNegotiationMixin(object):
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

+ 8
- 0
releasenotes/notes/fix-negotiate-version-503-c3cb8d1d4901541a.yaml View File

@@ -0,0 +1,8 @@
- |
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.