示例#1
0
def create_or_update_alb(alb_obj):
    """Create ALB or modify main attributes. json_exit here"""
    if alb_obj.elb:
        # ALB exists so check subnets, security groups and tags match what has been passed
        # Subnets
        if not alb_obj.compare_subnets():
            if alb_obj.module.check_mode:
                alb_obj.module.exit_json(changed=True, msg='Would have updated ALB if not in check mode.')
            alb_obj.modify_subnets()

        # Security Groups
        if not alb_obj.compare_security_groups():
            if alb_obj.module.check_mode:
                alb_obj.module.exit_json(changed=True, msg='Would have updated ALB if not in check mode.')
            alb_obj.modify_security_groups()

        # Tags - only need to play with tags if tags parameter has been set to something
        if alb_obj.tags is not None:

            tags_need_modify, tags_to_delete = compare_aws_tags(boto3_tag_list_to_ansible_dict(alb_obj.elb['tags']),
                                                                boto3_tag_list_to_ansible_dict(alb_obj.tags), alb_obj.purge_tags)

            # Exit on check_mode
            if alb_obj.module.check_mode and (tags_need_modify or tags_to_delete):
                alb_obj.module.exit_json(changed=True, msg='Would have updated ALB if not in check mode.')

            # Delete necessary tags
            if tags_to_delete:
                alb_obj.delete_tags(tags_to_delete)

            # Add/update tags
            if tags_need_modify:
                alb_obj.modify_tags()

    else:
        # Create load balancer
        if alb_obj.module.check_mode:
            alb_obj.module.exit_json(changed=True, msg='Would have created ALB if not in check mode.')
        alb_obj.create_elb()

    # ALB attributes
    alb_obj.update_elb_attributes()
    alb_obj.modify_elb_attributes()

    # Listeners
    listeners_obj = ELBListeners(alb_obj.connection, alb_obj.module, alb_obj.elb['LoadBalancerArn'])
    listeners_to_add, listeners_to_modify, listeners_to_delete = listeners_obj.compare_listeners()

    # Exit on check_mode
    if alb_obj.module.check_mode and (listeners_to_add or listeners_to_modify or listeners_to_delete):
        alb_obj.module.exit_json(changed=True, msg='Would have updated ALB if not in check mode.')

    # Delete listeners
    for listener_to_delete in listeners_to_delete:
        listener_obj = ELBListener(alb_obj.connection, alb_obj.module, listener_to_delete, alb_obj.elb['LoadBalancerArn'])
        listener_obj.delete()
        listeners_obj.changed = True

    # Add listeners
    for listener_to_add in listeners_to_add:
        listener_obj = ELBListener(alb_obj.connection, alb_obj.module, listener_to_add, alb_obj.elb['LoadBalancerArn'])
        listener_obj.add()
        listeners_obj.changed = True

    # Modify listeners
    for listener_to_modify in listeners_to_modify:
        listener_obj = ELBListener(alb_obj.connection, alb_obj.module, listener_to_modify, alb_obj.elb['LoadBalancerArn'])
        listener_obj.modify()
        listeners_obj.changed = True

    # If listeners changed, mark ALB as changed
    if listeners_obj.changed:
        alb_obj.changed = True

    # Rules of each listener
    for listener in listeners_obj.listeners:
        if 'Rules' in listener:
            rules_obj = ELBListenerRules(alb_obj.connection, alb_obj.module, alb_obj.elb['LoadBalancerArn'], listener['Rules'], listener['Port'])
            rules_to_add, rules_to_modify, rules_to_delete = rules_obj.compare_rules()

            # Exit on check_mode
            if alb_obj.module.check_mode and (rules_to_add or rules_to_modify or rules_to_delete):
                alb_obj.module.exit_json(changed=True, msg='Would have updated ALB if not in check mode.')

            # Delete rules
            if alb_obj.module.params['purge_rules']:
                for rule in rules_to_delete:
                    rule_obj = ELBListenerRule(alb_obj.connection, alb_obj.module, {'RuleArn': rule}, rules_obj.listener_arn)
                    rule_obj.delete()
                    alb_obj.changed = True

            # Add rules
            for rule in rules_to_add:
                rule_obj = ELBListenerRule(alb_obj.connection, alb_obj.module, rule, rules_obj.listener_arn)
                rule_obj.create()
                alb_obj.changed = True

            # Modify rules
            for rule in rules_to_modify:
                rule_obj = ELBListenerRule(alb_obj.connection, alb_obj.module, rule, rules_obj.listener_arn)
                rule_obj.modify()
                alb_obj.changed = True

    # Update ALB ip address type only if option has been provided
    if alb_obj.module.params.get('ip_address_type') and alb_obj.elb_ip_addr_type != alb_obj.module.params.get('ip_address_type'):
        # Exit on check_mode
        if alb_obj.module.check_mode:
            alb_obj.module.exit_json(changed=True, msg='Would have updated ALB if not in check mode.')

        alb_obj.modify_ip_address_type(alb_obj.module.params.get('ip_address_type'))

    # Exit on check_mode - no changes
    if alb_obj.module.check_mode:
        alb_obj.module.exit_json(changed=False, msg='IN CHECK MODE - no changes to make to ALB specified.')

    # Get the ALB again
    alb_obj.update()

    # Get the ALB listeners again
    listeners_obj.update()

    # Update the ALB attributes
    alb_obj.update_elb_attributes()

    # Convert to snake_case and merge in everything we want to return to the user
    snaked_alb = camel_dict_to_snake_dict(alb_obj.elb)
    snaked_alb.update(camel_dict_to_snake_dict(alb_obj.elb_attributes))
    snaked_alb['listeners'] = []
    for listener in listeners_obj.current_listeners:
        # For each listener, get listener rules
        listener['rules'] = get_elb_listener_rules(alb_obj.connection, alb_obj.module, listener['ListenerArn'])
        snaked_alb['listeners'].append(camel_dict_to_snake_dict(listener))

    # Change tags to ansible friendly dict
    snaked_alb['tags'] = boto3_tag_list_to_ansible_dict(snaked_alb['tags'])

    # ip address type
    snaked_alb['ip_address_type'] = alb_obj.get_elb_ip_address_type()

    alb_obj.module.exit_json(changed=alb_obj.changed, **snaked_alb)
def create_or_update_elb(elb_obj):
    """Create ELB or modify main attributes. json_exit here"""

    if elb_obj.elb:
        # ELB exists so check subnets, security groups and tags match what has been passed

        # Subnets
        if not elb_obj.compare_subnets():
            elb_obj.modify_subnets()

        # Security Groups
        if not elb_obj.compare_security_groups():
            elb_obj.modify_security_groups()

        # Tags - only need to play with tags if tags parameter has been set to something
        if elb_obj.tags is not None:

            # Delete necessary tags
            tags_need_modify, tags_to_delete = compare_aws_tags(boto3_tag_list_to_ansible_dict(elb_obj.elb['tags']),
                                                                boto3_tag_list_to_ansible_dict(elb_obj.tags), elb_obj.purge_tags)
            if tags_to_delete:
                elb_obj.delete_tags(tags_to_delete)

            # Add/update tags
            if tags_need_modify:
                elb_obj.modify_tags()

    else:
        # Create load balancer
        elb_obj.create_elb()

    # ELB attributes
    elb_obj.update_elb_attributes()
    elb_obj.modify_elb_attributes()

    # Listeners
    listeners_obj = ELBListeners(elb_obj.connection, elb_obj.module, elb_obj.elb['LoadBalancerArn'])

    listeners_to_add, listeners_to_modify, listeners_to_delete = listeners_obj.compare_listeners()

    # Delete listeners
    for listener_to_delete in listeners_to_delete:
        listener_obj = ELBListener(elb_obj.connection, elb_obj.module, listener_to_delete, elb_obj.elb['LoadBalancerArn'])
        listener_obj.delete()
        listeners_obj.changed = True

    # Add listeners
    for listener_to_add in listeners_to_add:
        listener_obj = ELBListener(elb_obj.connection, elb_obj.module, listener_to_add, elb_obj.elb['LoadBalancerArn'])
        listener_obj.add()
        listeners_obj.changed = True

    # Modify listeners
    for listener_to_modify in listeners_to_modify:
        listener_obj = ELBListener(elb_obj.connection, elb_obj.module, listener_to_modify, elb_obj.elb['LoadBalancerArn'])
        listener_obj.modify()
        listeners_obj.changed = True

    # If listeners changed, mark ELB as changed
    if listeners_obj.changed:
        elb_obj.changed = True

    # Rules of each listener
    for listener in listeners_obj.listeners:
        if 'Rules' in listener:
            rules_obj = ELBListenerRules(elb_obj.connection, elb_obj.module, elb_obj.elb['LoadBalancerArn'], listener['Rules'], listener['Port'])

            rules_to_add, rules_to_modify, rules_to_delete = rules_obj.compare_rules()

            # Delete rules
            if elb_obj.module.params['purge_rules']:
                for rule in rules_to_delete:
                    rule_obj = ELBListenerRule(elb_obj.connection, elb_obj.module, {'RuleArn': rule}, rules_obj.listener_arn)
                    rule_obj.delete()
                    elb_obj.changed = True

            # Add rules
            for rule in rules_to_add:
                rule_obj = ELBListenerRule(elb_obj.connection, elb_obj.module, rule, rules_obj.listener_arn)
                rule_obj.create()
                elb_obj.changed = True

            # Modify rules
            for rule in rules_to_modify:
                rule_obj = ELBListenerRule(elb_obj.connection, elb_obj.module, rule, rules_obj.listener_arn)
                rule_obj.modify()
                elb_obj.changed = True

    # Get the ELB again
    elb_obj.update()

    # Get the ELB listeners again
    listeners_obj.update()

    # Update the ELB attributes
    elb_obj.update_elb_attributes()

    # Convert to snake_case and merge in everything we want to return to the user
    snaked_elb = camel_dict_to_snake_dict(elb_obj.elb)
    snaked_elb.update(camel_dict_to_snake_dict(elb_obj.elb_attributes))
    snaked_elb['listeners'] = []
    for listener in listeners_obj.current_listeners:
        # For each listener, get listener rules
        listener['rules'] = get_elb_listener_rules(elb_obj.connection, elb_obj.module, listener['ListenerArn'])
        snaked_elb['listeners'].append(camel_dict_to_snake_dict(listener))

    # Change tags to ansible friendly dict
    snaked_elb['tags'] = boto3_tag_list_to_ansible_dict(snaked_elb['tags'])

    elb_obj.module.exit_json(changed=elb_obj.changed, **snaked_elb)