From 40370d9a75c9f04cf53751fac48b05a56d8eeaf1 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Thu, 29 Oct 2020 20:03:55 +0100 Subject: [PATCH] Add retries on the same failures as AWSRetry for the waiters --- plugins/module_utils/waiters.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/plugins/module_utils/waiters.py b/plugins/module_utils/waiters.py index 9e8ff54cde6..5119d0af3e7 100644 --- a/plugins/module_utils/waiters.py +++ b/plugins/module_utils/waiters.py @@ -4,6 +4,8 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type +import copy + try: import botocore.waiter as core_waiter except ImportError: @@ -12,6 +14,7 @@ import ansible_collections.amazon.aws.plugins.module_utils.core as aws_core + ec2_data = { "version": 2, "waiters": { @@ -296,24 +299,42 @@ } } +def _inject_limit_retries(model): + + extra_retries = [ + 'RequestLimitExceeded', 'Unavailable', 'ServiceUnavailable', + 'InternalFailure', 'InternalError', 'TooManyRequestsException', + 'Throttling'] + + acceptors = [] + for error in extra_retries: + acceptors.append({"state": "success", "matcher": "error", "expected": error}) + + _model = copy.deepcopy(model) + + for waiter in model["waiters"]: + _model[waiter]["acceptors"].extend(acceptors) + + return _model + def ec2_model(name): - ec2_models = core_waiter.WaiterModel(waiter_config=ec2_data) + ec2_models = core_waiter.WaiterModel(waiter_config=_inject_limit_retries(ec2_data)) return ec2_models.get_waiter(name) def waf_model(name): - waf_models = core_waiter.WaiterModel(waiter_config=waf_data) + waf_models = core_waiter.WaiterModel(waiter_config=_inject_limit_retries(waf_data)) return waf_models.get_waiter(name) def eks_model(name): - eks_models = core_waiter.WaiterModel(waiter_config=eks_data) + eks_models = core_waiter.WaiterModel(waiter_config=_inject_limit_retries(eks_data)) return eks_models.get_waiter(name) def rds_model(name): - rds_models = core_waiter.WaiterModel(waiter_config=rds_data) + rds_models = core_waiter.WaiterModel(waiter_config=_inject_limit_retries(rds_data)) return rds_models.get_waiter(name)