From aed60716eed58657f716614f4003f300fc6d2471 Mon Sep 17 00:00:00 2001 From: Jesper Schmitz Mouridsen Date: Mon, 19 Jul 2021 13:05:33 +0200 Subject: [PATCH] Wait for pool to be active and online In order to use a newly generated pool for a new healthmonitor the pool must be online and active, to avoid 409 conflict, when trying to update a pool with e.g pending update as a status. Change-Id: I160a75c6fbbf1555f3adcb444c77057f59b4cdfb --- plugins/modules/loadbalancer.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/plugins/modules/loadbalancer.py b/plugins/modules/loadbalancer.py index 9836a61c..336da966 100644 --- a/plugins/modules/loadbalancer.py +++ b/plugins/modules/loadbalancer.py @@ -296,6 +296,35 @@ from ansible_collections.openstack.cloud.plugins.module_utils.openstack import O class LoadBalancerModule(OpenStackModule): + def _wait_for_pool(self, pool, provisioning_status, operating_status, failures, interval=5): + """Wait for pool to be in a particular provisioning and operating status.""" + timeout = self.params['timeout'] # reuse loadbalancer timeout + + total_sleep = 0 + if failures is None: + failures = [] + + while total_sleep < timeout: + pool = self.conn.load_balancer.find_pool(name_or_id=pool.id) + if pool: + if pool.provisioning_status == provisioning_status and pool.operating_status == operating_status: + return None + if pool.provisioning_status in failures: + self.fail_json( + msg="Pool %s transitioned to failure state %s" % + (pool.id, pool.provisioning_status) + ) + else: + if provisioning_status == "DELETED": + return None + else: + self.fail_json( + msg="Pool %s transitioned to DELETED" % pool.id + ) + + time.sleep(interval) + total_sleep += interval + def _wait_for_lb(self, lb, status, failures, interval=5): """Wait for load balancer to be in a particular provisioning status.""" timeout = self.params['timeout'] @@ -497,6 +526,7 @@ class LoadBalancerModule(OpenStackModule): protocol=protocol, lb_algorithm=lb_algorithm ) + self._wait_for_pool(pool, "ACTIVE", "ONLINE", ["ERROR"]) changed = True # Ensure members in the pool @@ -538,6 +568,7 @@ class LoadBalancerModule(OpenStackModule): protocol_port=protocol_port, subnet_id=subnet_id ) + self._wait_for_pool(pool, "ACTIVE", "ONLINE", ["ERROR"]) changed = True # Associate public ip to the load balancer VIP. If