refactor: reuse exponential_backoff_function from hcloud-python (#535)

Replace the local function with the exponential_backoff_function from
hcloud-python
This commit is contained in:
Jonas L. 2024-07-25 16:20:23 +02:00 committed by GitHub
parent b9a1509378
commit c665629f7e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 7 additions and 40 deletions

View file

@ -3,7 +3,6 @@
from __future__ import annotations from __future__ import annotations
from contextlib import contextmanager from contextlib import contextmanager
from random import random
from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.basic import missing_required_lib
@ -107,22 +106,3 @@ class Client(ClientBase):
yield yield
finally: finally:
self._requests_session = requests.Session() 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

View file

@ -15,13 +15,13 @@ from ansible.module_utils.common.validation import (
check_required_one_of, check_required_one_of,
) )
from .client import ( from .client import ClientException, client_check_required_lib, client_get_by_name_or_id
ClientException, from .vendor.hcloud import (
client_check_required_lib, APIException,
client_get_by_name_or_id, Client,
exponential_backoff_poll_interval, HCloudException,
exponential_backoff_function,
) )
from .vendor.hcloud import APIException, Client, HCloudException
from .vendor.hcloud.actions import ActionException from .vendor.hcloud.actions import ActionException
from .version import version from .version import version
@ -87,7 +87,7 @@ class AnsibleHCloud:
application_name="ansible-module", application_name="ansible-module",
application_version=version, application_version=version,
# Total waiting time before timeout is > 117.0 # 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, poll_max_retries=25,
) )

View file

@ -1,14 +1 @@
from __future__ import annotations 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]