From c665629f7eb7d8af6b6b7266047f39a8017265d5 Mon Sep 17 00:00:00 2001 From: "Jonas L." Date: Thu, 25 Jul 2024 16:20:23 +0200 Subject: [PATCH] refactor: reuse `exponential_backoff_function` from hcloud-python (#535) Replace the local function with the exponential_backoff_function from hcloud-python --- plugins/module_utils/client.py | 20 -------------------- plugins/module_utils/hcloud.py | 14 +++++++------- tests/unit/module_utils/test_client.py | 13 ------------- 3 files changed, 7 insertions(+), 40 deletions(-) diff --git a/plugins/module_utils/client.py b/plugins/module_utils/client.py index 7301d8a..d82a630 100644 --- a/plugins/module_utils/client.py +++ b/plugins/module_utils/client.py @@ -3,7 +3,6 @@ from __future__ import annotations from contextlib import contextmanager -from random import random from ansible.module_utils.basic import missing_required_lib @@ -107,22 +106,3 @@ class Client(ClientBase): yield finally: self._requests_session = requests.Session() - - -def exponential_backoff_poll_interval(*, base: float, multiplier: int, cap: float, jitter: float): - """ - Return a poll interval function, implementing a truncated exponential backoff with jitter. - - :param base: Base for the exponential backoff algorithm. - :param multiplier: Multiplier for the exponential backoff algorithm. - :param cap: Value at which the interval is truncated. - :param jitter: Proportion of the interval to add as random jitter. - """ - - def func(retries: int) -> float: - interval = base * multiplier**retries # Exponential backoff - interval = min(cap, interval) # Cap backoff - interval += random() * interval * jitter # Add jitter - return interval - - return func diff --git a/plugins/module_utils/hcloud.py b/plugins/module_utils/hcloud.py index f8f410c..9332cb0 100644 --- a/plugins/module_utils/hcloud.py +++ b/plugins/module_utils/hcloud.py @@ -15,13 +15,13 @@ from ansible.module_utils.common.validation import ( check_required_one_of, ) -from .client import ( - ClientException, - client_check_required_lib, - client_get_by_name_or_id, - exponential_backoff_poll_interval, +from .client import ClientException, client_check_required_lib, client_get_by_name_or_id +from .vendor.hcloud import ( + APIException, + Client, + HCloudException, + exponential_backoff_function, ) -from .vendor.hcloud import APIException, Client, HCloudException from .vendor.hcloud.actions import ActionException from .version import version @@ -87,7 +87,7 @@ class AnsibleHCloud: application_name="ansible-module", application_version=version, # Total waiting time before timeout is > 117.0 - poll_interval=exponential_backoff_poll_interval(base=1.0, multiplier=2, cap=5.0, jitter=0.5), + poll_interval=exponential_backoff_function(base=1.0, multiplier=2, cap=5.0), poll_max_retries=25, ) diff --git a/tests/unit/module_utils/test_client.py b/tests/unit/module_utils/test_client.py index 6988f6b..9d48db4 100644 --- a/tests/unit/module_utils/test_client.py +++ b/tests/unit/module_utils/test_client.py @@ -1,14 +1 @@ from __future__ import annotations - -from ansible_collections.hetzner.hcloud.plugins.module_utils.client import ( - exponential_backoff_poll_interval, -) - - -def test_exponential_backoff_poll_interval(): - poll_interval = exponential_backoff_poll_interval(base=1.0, multiplier=2, cap=5.0, jitter=0.0) - poll_max_retries = 25 - - results = [poll_interval(i) for i in range(poll_max_retries)] - assert sum(results) == 117.0 - assert results[:6] == [1.0, 2.0, 4.0, 5.0, 5.0, 5.0]