Ejemplo n.º 1
0
def test_get_load_balancer_name():
    get_load_balancer_name('a', '1') == 'a-1'

    get_load_balancer_name('toolong123456789012345678901234567890',
                           '1') == 'toolong12345678901234567890123-1'
Ejemplo n.º 2
0
def test_get_load_balancer_name():
    get_load_balancer_name('a', '1') == 'a-1'

    get_load_balancer_name('toolong123456789012345678901234567890',
                           '1') == 'toolong12345678901234567890123-1'
Ejemplo n.º 3
0
def component_elastic_load_balancer_v2(definition,
                                       configuration: dict,
                                       args: TemplateArguments,
                                       info: dict,
                                       force,
                                       account_info: AccountArguments):
    lb_name = configuration["Name"]
    # domains pointing to the load balancer
    subdomain = ''
    main_zone = None
    for name, domain in configuration.get('Domains', {}).items():
        name = '{}{}'.format(lb_name, name)

        domain_name = "{0}.{1}".format(domain["Subdomain"], domain["Zone"])

        convert_cname_records_to_alias(domain_name)

        properties = {"Type": "A",
                      "Name": domain_name,
                      "HostedZoneName": domain["Zone"],
                      "AliasTarget": {"HostedZoneId": {"Fn::GetAtt": [lb_name,
                                                                      "CanonicalHostedZoneID"]},
                                      "DNSName": {"Fn::GetAtt": [lb_name, "DNSName"]}}}
        definition["Resources"][name] = {"Type": "AWS::Route53::RecordSet",
                                         "Properties": properties}

        if domain["Type"] == "weighted":
            definition["Resources"][name]["Properties"]['Weight'] = 0
            definition["Resources"][name]["Properties"]['SetIdentifier'] = "{0}-{1}".format(info["StackName"],
                                                                                            info["StackVersion"])
            subdomain = domain['Subdomain']
            main_zone = domain['Zone']  # type: str

    target_group_name = lb_name + 'TargetGroup'
    listeners = configuration.get('Listeners') or get_listeners(
        lb_name, target_group_name, subdomain, main_zone, configuration, account_info)

    health_check_protocol = configuration.get('HealthCheckProtocol') or 'HTTP'

    if health_check_protocol not in ALLOWED_HEALTH_CHECK_PROTOCOLS:
        raise click.UsageError('Protocol "{}" is not supported for LoadBalancer'.format(health_check_protocol))

    health_check_path = configuration.get("HealthCheckPath") or '/health'
    health_check_port = configuration.get("HealthCheckPort") or configuration["HTTPPort"]

    if configuration.get('LoadBalancerName'):
        loadbalancer_name = generate_valid_cloud_name(configuration["LoadBalancerName"], 32)
    elif configuration.get('NameSuffix'):
        version = '{}-{}'.format(info["StackVersion"],
                                 configuration['NameSuffix'])
        loadbalancer_name = get_load_balancer_name(info["StackName"], version)
        del(configuration['NameSuffix'])
    else:
        loadbalancer_name = get_load_balancer_name(info["StackName"],
                                                   info["StackVersion"])

    loadbalancer_scheme = configuration.get('Scheme') or 'internal'
    if loadbalancer_scheme == 'internet-facing':
        click.secho('You are deploying an internet-facing ELB that will be '
                    'publicly accessible! You should have OAUTH2 and HTTPS '
                    'in place!', bold=True, err=True)

    if loadbalancer_scheme not in ALLOWED_LOADBALANCER_SCHEMES:
        raise click.UsageError('Scheme "{}" is not supported for LoadBalancer'.format(loadbalancer_scheme))

    if loadbalancer_scheme == "internal":
        loadbalancer_subnet_map = "LoadBalancerInternalSubnets"
    else:
        loadbalancer_subnet_map = "LoadBalancerSubnets"

    vpc_id = configuration.get("VpcId") or account_info.VpcID

    tags = [
        # Tag "Name"
        {
            "Key": "Name",
            "Value": "{0}-{1}".format(info["StackName"], info["StackVersion"])
        },
        # Tag "StackName"
        {
            "Key": "StackName",
            "Value": info["StackName"],
        },
        # Tag "StackVersion"
        {
            "Key": "StackVersion",
            "Value": info["StackVersion"]
        }
    ]

    # load balancer
    definition["Resources"][lb_name] = {
        "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
        "Properties": {
            'Name': loadbalancer_name,
            'Scheme': loadbalancer_scheme,
            'SecurityGroups': resolve_security_groups(configuration["SecurityGroups"], args.region),
            'Subnets': {"Fn::FindInMap": [loadbalancer_subnet_map, {"Ref": "AWS::Region"}, "Subnets"]},
            'LoadBalancerAttributes': [
                {
                    "Key": "idle_timeout.timeout_seconds",
                    "Value": "60"
                }
            ],
            "Tags": tags
        }
    }
    definition["Resources"][target_group_name] = {
        'Type': 'AWS::ElasticLoadBalancingV2::TargetGroup',
        'Properties': {
            'Name': loadbalancer_name,
            'HealthCheckIntervalSeconds': '10',
            'HealthCheckPath': health_check_path,
            'HealthCheckPort': health_check_port,
            'HealthCheckProtocol': health_check_protocol,
            'HealthCheckTimeoutSeconds': '5',
            'HealthyThresholdCount': '2',
            'Port': configuration['HTTPPort'],
            'Protocol': 'HTTP',
            'UnhealthyThresholdCount': '2',
            'VpcId': vpc_id,
            'Tags': tags,
            'TargetGroupAttributes': [{'Key': 'deregistration_delay.timeout_seconds', 'Value': '60'}]
        }
    }
    resource_names = set([lb_name, target_group_name])
    for i, listener in enumerate(listeners):
        if i == 0:
            suffix = ''
        else:
            suffix = str(i + 1)
        resource_name = lb_name + 'Listener' + suffix
        definition['Resources'][resource_name] = listener
        resource_names.add(resource_name)
    for key, val in configuration.items():
        # overwrite any specified properties, but only properties which were defined by us already
        for res in resource_names:
            if key in definition['Resources'][res]['Properties'] and key not in SENZA_PROPERTIES:
                definition['Resources'][res]['Properties'][key] = val
    return definition
Ejemplo n.º 4
0
def component_elastic_load_balancer_v2(definition, configuration: dict,
                                       args: TemplateArguments, info: dict,
                                       force, account_info: AccountArguments):
    lb_name = configuration["Name"]
    # domains pointing to the load balancer
    subdomain = ''
    main_zone = None
    for name, domain in configuration.get('Domains', {}).items():
        name = '{}{}'.format(lb_name, name)

        domain_name = "{0}.{1}".format(domain["Subdomain"], domain["Zone"])

        convert_cname_records_to_alias(domain_name)

        properties = {
            "Type": "A",
            "Name": domain_name,
            "HostedZoneName": domain["Zone"],
            "AliasTarget": {
                "HostedZoneId": {
                    "Fn::GetAtt": [lb_name, "CanonicalHostedZoneID"]
                },
                "DNSName": {
                    "Fn::GetAtt": [lb_name, "DNSName"]
                }
            }
        }
        definition["Resources"][name] = {
            "Type": "AWS::Route53::RecordSet",
            "Properties": properties
        }

        if domain["Type"] == "weighted":
            definition["Resources"][name]["Properties"]['Weight'] = 0
            definition["Resources"][name]["Properties"][
                'SetIdentifier'] = "{0}-{1}".format(info["StackName"],
                                                    info["StackVersion"])
            subdomain = domain['Subdomain']
            main_zone = domain['Zone']  # type: str

    target_group_name = lb_name + 'TargetGroup'
    listeners = configuration.get('Listeners') or get_listeners(
        lb_name, target_group_name, subdomain, main_zone, configuration,
        account_info)

    health_check_protocol = configuration.get('HealthCheckProtocol') or 'HTTP'

    if health_check_protocol not in ALLOWED_HEALTH_CHECK_PROTOCOLS:
        raise click.UsageError(
            'Protocol "{}" is not supported for LoadBalancer'.format(
                health_check_protocol))

    health_check_path = configuration.get("HealthCheckPath") or '/health'
    health_check_port = configuration.get(
        "HealthCheckPort") or configuration["HTTPPort"]

    if configuration.get('NameSuffix'):
        version = '{}-{}'.format(info["StackVersion"],
                                 configuration['NameSuffix'])
        loadbalancer_name = get_load_balancer_name(info["StackName"], version)
        del (configuration['NameSuffix'])
    else:
        loadbalancer_name = get_load_balancer_name(info["StackName"],
                                                   info["StackVersion"])

    loadbalancer_scheme = configuration.get('Scheme') or 'internal'
    if loadbalancer_scheme == 'internet-facing':
        click.secho(
            'You are deploying an internet-facing ELB that will be '
            'publicly accessible! You should have OAUTH2 and HTTPS '
            'in place!',
            bold=True,
            err=True)

    if loadbalancer_scheme not in ALLOWED_LOADBALANCER_SCHEMES:
        raise click.UsageError(
            'Scheme "{}" is not supported for LoadBalancer'.format(
                loadbalancer_scheme))

    if loadbalancer_scheme == "internal":
        loadbalancer_subnet_map = "LoadBalancerInternalSubnets"
    else:
        loadbalancer_subnet_map = "LoadBalancerSubnets"

    vpc_id = configuration.get("VpcId") or account_info.VpcID

    tags = [
        # Tag "Name"
        {
            "Key": "Name",
            "Value": "{0}-{1}".format(info["StackName"], info["StackVersion"])
        },
        # Tag "StackName"
        {
            "Key": "StackName",
            "Value": info["StackName"],
        },
        # Tag "StackVersion"
        {
            "Key": "StackVersion",
            "Value": info["StackVersion"]
        }
    ]

    # load balancer
    definition["Resources"][lb_name] = {
        "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
        "Properties": {
            'Name':
            loadbalancer_name,
            'Scheme':
            loadbalancer_scheme,
            'SecurityGroups':
            resolve_security_groups(configuration["SecurityGroups"],
                                    args.region),
            'Subnets': {
                "Fn::FindInMap":
                [loadbalancer_subnet_map, {
                    "Ref": "AWS::Region"
                }, "Subnets"]
            },
            "Tags":
            tags
        }
    }
    definition["Resources"][target_group_name] = {
        'Type': 'AWS::ElasticLoadBalancingV2::TargetGroup',
        'Properties': {
            'Name':
            loadbalancer_name,
            'HealthCheckIntervalSeconds':
            '10',
            'HealthCheckPath':
            health_check_path,
            'HealthCheckPort':
            health_check_port,
            'HealthCheckProtocol':
            health_check_protocol,
            'HealthCheckTimeoutSeconds':
            '5',
            'HealthyThresholdCount':
            '2',
            'Port':
            configuration['HTTPPort'],
            'Protocol':
            'HTTP',
            'UnhealthyThresholdCount':
            '2',
            'VpcId':
            vpc_id,
            'Tags':
            tags,
            'TargetGroupAttributes': [{
                'Key': 'deregistration_delay.timeout_seconds',
                'Value': '60'
            }]
        }
    }
    resource_names = set([lb_name, target_group_name])
    for i, listener in enumerate(listeners):
        if i == 0:
            suffix = ''
        else:
            suffix = str(i + 1)
        resource_name = lb_name + 'Listener' + suffix
        definition['Resources'][resource_name] = listener
        resource_names.add(resource_name)
    for key, val in configuration.items():
        # overwrite any specified properties, but only properties which were defined by us already
        for res in resource_names:
            if key in definition['Resources'][res][
                    'Properties'] and key not in SENZA_PROPERTIES:
                definition['Resources'][res]['Properties'][key] = val
    return definition