Also retry inspection on HTTP CONFLICT

The new implementation can return it when unable to lock the node.

Other possible errors are 400 and 404 (should not be retried), as well as
5xx (already retried).

Change-Id: I74c2f54a624dc47e8e2d1e67ae4c6a6078e01d2f
(cherry picked from commit 0010f5c11a)
This commit is contained in:
Dmitry Tantsur 2024-01-26 16:19:16 +01:00
parent 36b43f3edc
commit af19759add
No known key found for this signature in database
GPG Key ID: 315B2AF9FD216C60
3 changed files with 12 additions and 4 deletions

View File

@ -13,6 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from http import client as http_client
import json
import os
import time
@ -152,7 +153,8 @@ def call_inspector(data, failures):
inspector_resp = requests.post(
CONF.inspection_callback_url, data=data, headers=headers,
verify=verify, cert=cert, timeout=CONF.http_request_timeout)
if inspector_resp.status_code >= 500:
if (inspector_resp.status_code >= 500
or inspector_resp.status_code == http_client.CONFLICT):
raise requests.exceptions.HTTPError(response=inspector_resp)
return inspector_resp

View File

@ -214,7 +214,7 @@ class TestCallInspector(base.IronicAgentTest):
@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=409),
mock.Mock(status_code=502)]
failures = utils.AccumulatedFailures()
data = collections.OrderedDict(data=42)
@ -225,15 +225,16 @@ class TestCallInspector(base.IronicAgentTest):
@mock.patch.object(inspector, '_RETRY_WAIT', 0.01)
@mock.patch.object(inspector, '_RETRY_WAIT_MAX', 1)
@mock.patch.object(inspector, '_RETRY_ATTEMPTS', 2)
@mock.patch.object(inspector, '_RETRY_ATTEMPTS', 3)
def test_inspector_retry_on_50X_and_succeed(self, mock_post):
mock_post.side_effect = [mock.Mock(status_code=503),
mock.Mock(status_code=409),
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)
self.assertEqual(3, mock_post.call_count)
mock_post.assert_called_with('url',
cert=None, verify=True,
data='{"data": 42, "error": null}',

View File

@ -0,0 +1,5 @@
---
fixes:
- |
Inspection is now retried on HTTP 409 (conflict), which can be returned
by the new implementation in Ironic.