From 3fa39ac818e08a842ac00aa9e69522fef8f87082 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Mon, 18 Mar 2019 21:35:51 +0530 Subject: [PATCH] ec2_vpc_vpn: Add delay and wait_timeout parameter (#53940) * ec2_vpc_vpn: Add delay and wait_timeout parameter Fixes: #53481 Signed-off-by: Abhijeet Kasurde * Fix unit tests Signed-off-by: Abhijeet Kasurde --- .../modules/cloud/amazon/ec2_vpc_vpn.py | 42 +++++++++++++++---- .../modules/cloud/amazon/test_ec2_vpc_vpn.py | 8 ++-- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/lib/ansible/modules/cloud/amazon/ec2_vpc_vpn.py b/lib/ansible/modules/cloud/amazon/ec2_vpc_vpn.py index 393b6424b1..c1e6cedb3d 100644 --- a/lib/ansible/modules/cloud/amazon/ec2_vpc_vpn.py +++ b/lib/ansible/modules/cloud/amazon/ec2_vpc_vpn.py @@ -110,6 +110,20 @@ options: description: - Whether or not to delete VPN connections routes that are not specified in the task. type: bool + wait_timeout: + description: + - How long before wait gives up, in seconds. + default: 600 + type: int + required: false + version_added: "2.8" + delay: + description: + - The time to wait before checking operation again. in seconds. + required: false + type: int + default: 15 + version_added: "2.8" """ EXAMPLES = """ @@ -434,11 +448,10 @@ def find_connection_response(connections=None): return connections['VpnConnections'][0] -def create_connection(connection, customer_gateway_id, static_only, vpn_gateway_id, connection_type, tunnel_options=None): +def create_connection(connection, customer_gateway_id, static_only, vpn_gateway_id, connection_type, max_attempts, delay, tunnel_options=None): """ Creates a VPN connection """ options = {'StaticRoutesOnly': static_only} - if tunnel_options and len(tunnel_options) <= 2: t_opt = [] for m in tunnel_options: @@ -458,7 +471,10 @@ def create_connection(connection, customer_gateway_id, static_only, vpn_gateway_ CustomerGatewayId=customer_gateway_id, VpnGatewayId=vpn_gateway_id, Options=options) - connection.get_waiter('vpn_connection_available').wait(VpnConnectionIds=[vpn['VpnConnection']['VpnConnectionId']]) + connection.get_waiter('vpn_connection_available').wait( + VpnConnectionIds=[vpn['VpnConnection']['VpnConnectionId']], + WaiterConfig={'Delay': delay, 'MaxAttempts': max_attempts} + ) except WaiterError as e: raise VPNConnectionException(msg="Failed to wait for VPN connection {0} to be available".format(vpn['VpnConnection']['VpnConnectionId']), exception=e) @@ -469,11 +485,14 @@ def create_connection(connection, customer_gateway_id, static_only, vpn_gateway_ return vpn['VpnConnection'] -def delete_connection(connection, vpn_connection_id): +def delete_connection(connection, vpn_connection_id, delay, max_attempts): """ Deletes a VPN connection """ try: connection.delete_vpn_connection(VpnConnectionId=vpn_connection_id) - connection.get_waiter('vpn_connection_deleted').wait(VpnConnectionIds=[vpn_connection_id]) + connection.get_waiter('vpn_connection_deleted').wait( + VpnConnectionIds=[vpn_connection_id], + WaiterConfig={'Delay': delay, 'MaxAttempts': max_attempts} + ) except WaiterError as e: raise VPNConnectionException(msg="Failed to wait for VPN connection {0} to be removed".format(vpn_connection_id), exception=e) @@ -641,6 +660,8 @@ def ensure_present(connection, module_params, check_mode=False): """ Creates and adds tags to a VPN connection. If the connection already exists update tags. """ vpn_connection = find_connection(connection, module_params) changed = False + delay = module_params.get('delay') + max_attempts = module_params.get('wait_timeout') // delay # No match but vpn_connection_id was specified. if not vpn_connection and module_params.get('vpn_connection_id'): @@ -665,7 +686,9 @@ def ensure_present(connection, module_params, check_mode=False): static_only=module_params.get('static_only'), vpn_gateway_id=module_params.get('vpn_gateway_id'), connection_type=module_params.get('connection_type'), - tunnel_options=module_params.get('tunnel_options')) + tunnel_options=module_params.get('tunnel_options'), + max_attempts=max_attempts, + delay=delay) changes = check_for_update(connection, module_params, vpn_connection['VpnConnectionId']) _ = make_changes(connection, vpn_connection['VpnConnectionId'], changes) @@ -685,8 +708,11 @@ def ensure_absent(connection, module_params, check_mode=False): if check_mode: return get_check_mode_results(connection, module_params, vpn_connection['VpnConnectionId'] if vpn_connection else None) + delay = module_params.get('delay') + max_attempts = module_params.get('wait_timeout') // delay + if vpn_connection: - delete_connection(connection, vpn_connection['VpnConnectionId']) + delete_connection(connection, vpn_connection['VpnConnectionId'], delay=delay, max_attempts=max_attempts) changed = True else: changed = False @@ -708,6 +734,8 @@ def main(): purge_tags=dict(type='bool', default=False), routes=dict(type='list', default=[]), purge_routes=dict(type='bool', default=False), + wait_timeout=dict(type='int', default=600), + delay=dict(type='int', default=15), ) module = AnsibleAWSModule(argument_spec=argument_spec, supports_check_mode=True) diff --git a/test/units/modules/cloud/amazon/test_ec2_vpc_vpn.py b/test/units/modules/cloud/amazon/test_ec2_vpc_vpn.py index 03513bfefc..d86a6a6f43 100644 --- a/test/units/modules/cloud/amazon/test_ec2_vpc_vpn.py +++ b/test/units/modules/cloud/amazon/test_ec2_vpc_vpn.py @@ -96,7 +96,9 @@ def make_params(cgw, vgw, tags=None, filters=None, routes=None): 'purge_tags': True, 'tags': tags, 'filters': filters, - 'routes': routes} + 'routes': routes, + 'delay': 15, + 'wait_timeout': 600} def make_conn(placeboify, module, connection): @@ -111,7 +113,7 @@ def make_conn(placeboify, module, connection): def tear_down_conn(placeboify, connection, vpn_connection_id): - ec2_vpc_vpn.delete_connection(connection, vpn_connection_id) + ec2_vpc_vpn.delete_connection(connection, vpn_connection_id, delay=15, max_attempts=40) def test_find_connection_vpc_conn_id(placeboify, maybe_sleep): @@ -251,7 +253,7 @@ def test_delete_connection(placeboify, maybe_sleep): def test_delete_nonexistent_connection(placeboify, maybe_sleep): # create parameters and ensure any connection matching (None) is deleted - params = {'filters': {'tags': {'ThisConnection': 'DoesntExist'}}} + params = {'filters': {'tags': {'ThisConnection': 'DoesntExist'}}, 'delay': 15, 'wait_timeout': 600} m, conn = setup_mod_conn(placeboify, params) changed, vpn = ec2_vpc_vpn.ensure_absent(conn, m.params)