From e9c04cfdfd07340ef1c3e86d883fda26a354979e Mon Sep 17 00:00:00 2001 From: Evan Carter Date: Mon, 14 Sep 2015 11:27:37 -0400 Subject: [PATCH] Fixing bug #2058 and adding some backwards compatibility --- lib/ansible/modules/cloud/amazon/ec2_eip.py | 34 +++++++++++++++------ 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/ansible/modules/cloud/amazon/ec2_eip.py b/lib/ansible/modules/cloud/amazon/ec2_eip.py index 8ae08c29bc0..58b5c990e17 100644 --- a/lib/ansible/modules/cloud/amazon/ec2_eip.py +++ b/lib/ansible/modules/cloud/amazon/ec2_eip.py @@ -122,6 +122,7 @@ except ImportError: class EIPException(Exception): pass + def associate_ip_and_device(ec2, address, device_id, check_mode, isinstance=True): if address_is_associated_with_device(ec2, address, device_id, isinstance): return {'changed': False} @@ -203,8 +204,12 @@ def allocate_address(ec2, domain, reuse_existing_ip_allowed): domain_filter = {'domain': domain or 'standard'} all_addresses = ec2.get_all_addresses(filters=domain_filter) - unassociated_addresses = [a for a in all_addresses - if not a.device_id] + if domain == 'vpc': + unassociated_addresses = [a for a in all_addresses + if not a.association_id] + else: + unassociated_addresses = [a for a in all_addresses + if not a.instance_id] if unassociated_addresses: return unassociated_addresses[0] @@ -263,6 +268,9 @@ def ensure_present(ec2, domain, address, device_id, # Allocate an IP for instance since no public_ip was provided if isinstance: instance = find_device(ec2, device_id) + if reuse_existing_ip_allowed: + if len(instance.vpc_id) > 0 and domain is None: + raise EIPException("You must set 'in_vpc' to true to associate an instance with an existing ip in a vpc") # Associate address object (provided or allocated) with instance assoc_result = associate_ip_and_device(ec2, address, device_id, check_mode) @@ -322,6 +330,7 @@ def main(): ec2 = ec2_connect(module) device_id = module.params.get('device_id') + instance_id = module.params.get('instance_id') public_ip = module.params.get('public_ip') state = module.params.get('state') in_vpc = module.params.get('in_vpc') @@ -329,10 +338,15 @@ def main(): reuse_existing_ip_allowed = module.params.get('reuse_existing_ip_allowed') release_on_disassociation = module.params.get('release_on_disassociation') - if device_id and device_id.startswith('i-'): - is_instance=True - elif device_id: - is_instance=False + if instance_id: + warnings = ["instance_id is no longer used, please use device_id going forward"] + is_instance = True + device_id = instance_id + else: + if device_id and device_id.startswith('i-'): + is_instance = True + elif device_id: + is_instance = False try: if device_id: @@ -354,17 +368,19 @@ def main(): if release_on_disassociation and disassociated['changed']: released = release_address(ec2, address, module.check_mode) - result = { 'changed': True, 'disassociated': disassociated, 'released': released } + result = {'changed': True, 'disassociated': disassociated, 'released': released} else: - result = { 'changed': disassociated['changed'], 'disassociated': disassociated, 'released': { 'changed': False } } + result = {'changed': disassociated['changed'], 'disassociated': disassociated, 'released': {'changed': False}} else: address = find_address(ec2, public_ip, None) released = release_address(ec2, address, module.check_mode) - result = { 'changed': released['changed'], 'disassociated': { 'changed': False }, 'released': released } + result = {'changed': released['changed'], 'disassociated': {'changed': False}, 'released': released} except (boto.exception.EC2ResponseError, EIPException) as e: module.fail_json(msg=str(e)) + if instance_id: + result['warnings'] = warnings module.exit_json(**result) # import module snippets