|
|
|
@ -153,7 +153,8 @@ region:
|
|
|
|
|
from ansible.module_utils.ec2 import (camel_dict_to_snake_dict, ec2_argument_spec, HAS_BOTO3,
|
|
|
|
|
get_aws_connection_info, boto3_conn, AWSRetry)
|
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
|
|
|
from ansible.module_utils.aws.direct_connect import (delete_connection,
|
|
|
|
|
from ansible.module_utils.aws.direct_connect import (DirectConnectError,
|
|
|
|
|
delete_connection,
|
|
|
|
|
delete_virtual_interface,
|
|
|
|
|
disassociate_connection_and_lag)
|
|
|
|
|
import traceback
|
|
|
|
@ -166,13 +167,6 @@ except:
|
|
|
|
|
# handled by imported HAS_BOTO3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DirectConnectError(Exception):
|
|
|
|
|
def __init__(self, msg, last_traceback, response):
|
|
|
|
|
self.msg = msg
|
|
|
|
|
self.last_traceback = last_traceback
|
|
|
|
|
self.response = response
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def lag_status(client, lag_id):
|
|
|
|
|
return lag_exists(client, lag_id=lag_id, lag_name=None, verify=False)
|
|
|
|
|
|
|
|
|
@ -230,7 +224,9 @@ def lag_exists(client, lag_id=None, lag_name=None, verify=True):
|
|
|
|
|
|
|
|
|
|
def create_lag(client, num_connections, location, bandwidth, name, connection_id):
|
|
|
|
|
if not name:
|
|
|
|
|
raise DirectConnectError(msg="Failed to create a Direct Connect link aggregation group: name required.")
|
|
|
|
|
raise DirectConnectError(msg="Failed to create a Direct Connect link aggregation group: name required.",
|
|
|
|
|
last_traceback=None,
|
|
|
|
|
exception="")
|
|
|
|
|
|
|
|
|
|
parameters = dict(numberOfConnections=num_connections,
|
|
|
|
|
location=location,
|
|
|
|
@ -272,10 +268,12 @@ def update_lag(client, lag_id, lag_name, min_links, num_connections, wait, wait_
|
|
|
|
|
start = time.time()
|
|
|
|
|
|
|
|
|
|
if min_links and min_links > num_connections:
|
|
|
|
|
raise DirectConnectError(msg="The number of connections {0} must be greater than the minimum number of links "
|
|
|
|
|
"{1} to update the LAG {2}".format(num_connections, min_links, lag_id),
|
|
|
|
|
last_traceback=None,
|
|
|
|
|
response=None)
|
|
|
|
|
raise DirectConnectError(
|
|
|
|
|
msg="The number of connections {0} must be greater than the minimum number of links "
|
|
|
|
|
"{1} to update the LAG {2}".format(num_connections, min_links, lag_id),
|
|
|
|
|
last_traceback=None,
|
|
|
|
|
exception=None
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
try:
|
|
|
|
@ -301,7 +299,9 @@ def lag_changed(current_status, name, min_links):
|
|
|
|
|
def ensure_present(client, num_connections, lag_id, lag_name, location, bandwidth, connection_id, min_links, wait, wait_timeout):
|
|
|
|
|
exists = lag_exists(client, lag_id, lag_name)
|
|
|
|
|
if not exists and lag_id:
|
|
|
|
|
raise DirectConnectError(msg="The Direct Connect link aggregation group {0} does not exist.".format(lag_id), last_traceback=None, response="")
|
|
|
|
|
raise DirectConnectError(msg="The Direct Connect link aggregation group {0} does not exist.".format(lag_id),
|
|
|
|
|
last_traceback=None,
|
|
|
|
|
exception="")
|
|
|
|
|
|
|
|
|
|
# the connection is found; get the latest state and see if it needs to be updated
|
|
|
|
|
if exists:
|
|
|
|
@ -360,10 +360,10 @@ def ensure_absent(client, lag_id, lag_name, force_delete, delete_with_disassocia
|
|
|
|
|
if any((latest_status['minimumLinks'], virtual_interfaces, connections)) and not force_delete:
|
|
|
|
|
raise DirectConnectError(msg="There are a minimum number of links, hosted connections, or associated virtual interfaces for LAG {0}. "
|
|
|
|
|
"To force deletion of the LAG use delete_force: True (if the LAG has virtual interfaces they will be deleted). "
|
|
|
|
|
"Optionally, to ensure hosted connections are deleted after disassocation use delete_with_disassocation: True "
|
|
|
|
|
"Optionally, to ensure hosted connections are deleted after disassociation use delete_with_disassociation: True "
|
|
|
|
|
"and wait: True (as Virtual Interfaces may take a few moments to delete)".format(lag_id),
|
|
|
|
|
last_traceback=None,
|
|
|
|
|
response=None)
|
|
|
|
|
exception=None)
|
|
|
|
|
|
|
|
|
|
# update min_links to be 0 so we can remove the LAG
|
|
|
|
|
update_lag(client, lag_id, None, 0, len(connections), wait, wait_timeout)
|
|
|
|
@ -382,7 +382,7 @@ def ensure_absent(client, lag_id, lag_name, force_delete, delete_with_disassocia
|
|
|
|
|
try:
|
|
|
|
|
delete_lag(client, lag_id)
|
|
|
|
|
except DirectConnectError as e:
|
|
|
|
|
if ('until its Virtual Interfaces are deleted' in e.exception.response) and (time.time() - start_time < wait_timeout) and wait:
|
|
|
|
|
if ('until its Virtual Interfaces are deleted' in e.exception) and (time.time() - start_time < wait_timeout) and wait:
|
|
|
|
|
continue
|
|
|
|
|
else:
|
|
|
|
|
return True
|
|
|
|
@ -421,6 +421,7 @@ def main():
|
|
|
|
|
endpoint=ec2_url, **aws_connect_kwargs)
|
|
|
|
|
|
|
|
|
|
state = module.params.get('state')
|
|
|
|
|
response = {}
|
|
|
|
|
try:
|
|
|
|
|
if state == 'present':
|
|
|
|
|
changed, lag_id = ensure_present(connection,
|
|
|
|
@ -442,10 +443,9 @@ def main():
|
|
|
|
|
delete_with_disassociation=module.params.get("delete_with_disassociation"),
|
|
|
|
|
wait=module.params.get('wait'),
|
|
|
|
|
wait_timeout=module.params.get('wait_timeout'))
|
|
|
|
|
response = {}
|
|
|
|
|
except DirectConnectError as e:
|
|
|
|
|
if e.last_traceback:
|
|
|
|
|
module.fail_json(msg=e.msg, exception=e.last_traceback, **camel_dict_to_snake_dict(e.exception.response))
|
|
|
|
|
module.fail_json(msg=e.msg, exception=e.last_traceback, **camel_dict_to_snake_dict(e.exception))
|
|
|
|
|
else:
|
|
|
|
|
module.fail_json(msg=e.msg)
|
|
|
|
|
|
|
|
|
|