mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-23 19:01:26 -07:00
This creates a way for us to use boto3's data-driven waiter support to use custom waiters where Boto3 hasn't implemented them yet. The only waiter implemented so far is for VPC Route Tables to check that they exist, and this replaces some custom retry code.
52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
# Copyright: (c) 2018, Ansible Project
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
try:
|
|
import botocore.waiter as core_waiter
|
|
except ImportError:
|
|
pass # caught by HAS_BOTO3
|
|
|
|
|
|
ec2_data = {
|
|
"version": 2,
|
|
"waiters": {
|
|
"RouteTableExists": {
|
|
"delay": 5,
|
|
"maxAttempts": 40,
|
|
"operation": "DescribeRouteTables",
|
|
"acceptors": [
|
|
{
|
|
"matcher": "path",
|
|
"expected": True,
|
|
"argument": "length(RouteTables[]) > `0`",
|
|
"state": "success"
|
|
},
|
|
{
|
|
"matcher": "error",
|
|
"expected": "InvalidRouteTableID.NotFound",
|
|
"state": "retry"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
def model_for(name):
|
|
ec2_models = core_waiter.WaiterModel(waiter_config=ec2_data)
|
|
return ec2_models.get_waiter(name)
|
|
|
|
|
|
waiters_by_name = {
|
|
('EC2', 'route_table_exists'): lambda ec2: core_waiter.Waiter(
|
|
'route_table_exists',
|
|
model_for('RouteTableExists'),
|
|
ec2.describe_route_tables)
|
|
}
|
|
|
|
|
|
def get_waiter(client, waiter_name):
|
|
try:
|
|
return waiters_by_name[(client.__class__.__name__, waiter_name)](client)
|
|
except KeyError:
|
|
raise NotImplementedError("Waiter {0} could not be found for client {1}. Available waiters: {2}".format(
|
|
waiter_name, type(client), ', '.join(repr(k) for k in waiters_by_name.keys())))
|