From 0753da505d8a26fd6ff408baf9e49de4a7b9945b Mon Sep 17 00:00:00 2001 From: jo Date: Tue, 4 Nov 2025 18:53:12 +0100 Subject: [PATCH] fix: handle inconsistent state in the API --- plugins/modules/load_balancer_network.py | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/plugins/modules/load_balancer_network.py b/plugins/modules/load_balancer_network.py index adc19e1..508c368 100644 --- a/plugins/modules/load_balancer_network.py +++ b/plugins/modules/load_balancer_network.py @@ -101,6 +101,7 @@ hcloud_load_balancer_network: """ from ipaddress import ip_address, ip_network +from time import sleep from ansible.module_utils.basic import AnsibleModule @@ -140,6 +141,7 @@ class AnsibleHCloudLoadBalancerNetwork(AnsibleHCloud): self.fail_json_hcloud(exception) def _get_load_balancer_network(self): + self.hcloud_load_balancer_network = None for private_net in self.hcloud_load_balancer.private_net: if private_net.network.id == self.hcloud_network.id: self.hcloud_load_balancer_network = private_net @@ -158,6 +160,9 @@ class AnsibleHCloudLoadBalancerNetwork(AnsibleHCloud): try: action = self.hcloud_load_balancer.attach_to_network(**params) action.wait_until_finished() + + # Workaround to handle flakiness from the API + self._wait_for_attachment(True) except HCloudException as exception: self.fail_json_hcloud(exception) @@ -168,6 +173,9 @@ class AnsibleHCloudLoadBalancerNetwork(AnsibleHCloud): try: action = self.hcloud_load_balancer.detach_from_network(self.hcloud_load_balancer_network.network) action.wait_until_finished() + + # Workaround to handle flakiness from the API + self._wait_for_attachment(False) except HCloudException as exception: self.fail_json_hcloud(exception) @@ -210,6 +218,23 @@ class AnsibleHCloudLoadBalancerNetwork(AnsibleHCloud): self._detach() self.hcloud_load_balancer_network = None + # Workaround to handle flakiness from the API + def _wait_for_attachment(self, present: bool): + def done(x: PrivateNet | None): + if present: + return x is not None + return x is None + + # pylint: disable=disallowed-name + for _ in range(10): + self.hcloud_load_balancer.reload() + self._get_load_balancer_network() + + if done(self.hcloud_load_balancer_network): + break + + sleep(2) + @classmethod def define_module(cls): return AnsibleModule(