from __future__ import unicode_literals from moto.core.exceptions import RESTError from moto.core.utils import amzn_request_id from moto.core.responses import BaseResponse from .models import elbv2_backends from .exceptions import DuplicateTagKeysError from .exceptions import LoadBalancerNotFoundError from .exceptions import TargetGroupNotFoundError SSL_POLICIES = [ { 'name': 'ELBSecurityPolicy-2016-08', 'ssl_protocols': ['TLSv1', 'TLSv1.1', 'TLSv1.2'], 'ciphers': [ {'name': 'ECDHE-ECDSA-AES128-GCM-SHA256', 'priority': 1}, {'name': 'ECDHE-RSA-AES128-GCM-SHA256', 'priority': 2}, {'name': 'ECDHE-ECDSA-AES128-SHA256', 'priority': 3}, {'name': 'ECDHE-RSA-AES128-SHA256', 'priority': 4}, {'name': 'ECDHE-ECDSA-AES128-SHA', 'priority': 5}, {'name': 'ECDHE-RSA-AES128-SHA', 'priority': 6}, {'name': 'ECDHE-ECDSA-AES256-GCM-SHA384', 'priority': 7}, {'name': 'ECDHE-RSA-AES256-GCM-SHA384', 'priority': 8}, {'name': 'ECDHE-ECDSA-AES256-SHA384', 'priority': 9}, {'name': 'ECDHE-RSA-AES256-SHA384', 'priority': 10}, {'name': 'ECDHE-RSA-AES256-SHA', 'priority': 11}, {'name': 'ECDHE-ECDSA-AES256-SHA', 'priority': 12}, {'name': 'AES128-GCM-SHA256', 'priority': 13}, {'name': 'AES128-SHA256', 'priority': 14}, {'name': 'AES128-SHA', 'priority': 15}, {'name': 'AES256-GCM-SHA384', 'priority': 16}, {'name': 'AES256-SHA256', 'priority': 17}, {'name': 'AES256-SHA', 'priority': 18} ], }, { 'name': 'ELBSecurityPolicy-TLS-1-2-2017-01', 'ssl_protocols': ['TLSv1.2'], 'ciphers': [ {'name': 'ECDHE-ECDSA-AES128-GCM-SHA256', 'priority': 1}, {'name': 'ECDHE-RSA-AES128-GCM-SHA256', 'priority': 2}, {'name': 'ECDHE-ECDSA-AES128-SHA256', 'priority': 3}, {'name': 'ECDHE-RSA-AES128-SHA256', 'priority': 4}, {'name': 'ECDHE-ECDSA-AES256-GCM-SHA384', 'priority': 5}, {'name': 'ECDHE-RSA-AES256-GCM-SHA384', 'priority': 6}, {'name': 'ECDHE-ECDSA-AES256-SHA384', 'priority': 7}, {'name': 'ECDHE-RSA-AES256-SHA384', 'priority': 8}, {'name': 'AES128-GCM-SHA256', 'priority': 9}, {'name': 'AES128-SHA256', 'priority': 10}, {'name': 'AES256-GCM-SHA384', 'priority': 11}, {'name': 'AES256-SHA256', 'priority': 12} ] }, { 'name': 'ELBSecurityPolicy-TLS-1-1-2017-01', 'ssl_protocols': ['TLSv1.1', 'TLSv1.2'], 'ciphers': [ {'name': 'ECDHE-ECDSA-AES128-GCM-SHA256', 'priority': 1}, {'name': 'ECDHE-RSA-AES128-GCM-SHA256', 'priority': 2}, {'name': 'ECDHE-ECDSA-AES128-SHA256', 'priority': 3}, {'name': 'ECDHE-RSA-AES128-SHA256', 'priority': 4}, {'name': 'ECDHE-ECDSA-AES128-SHA', 'priority': 5}, {'name': 'ECDHE-RSA-AES128-SHA', 'priority': 6}, {'name': 'ECDHE-ECDSA-AES256-GCM-SHA384', 'priority': 7}, {'name': 'ECDHE-RSA-AES256-GCM-SHA384', 'priority': 8}, {'name': 'ECDHE-ECDSA-AES256-SHA384', 'priority': 9}, {'name': 'ECDHE-RSA-AES256-SHA384', 'priority': 10}, {'name': 'ECDHE-RSA-AES256-SHA', 'priority': 11}, {'name': 'ECDHE-ECDSA-AES256-SHA', 'priority': 12}, {'name': 'AES128-GCM-SHA256', 'priority': 13}, {'name': 'AES128-SHA256', 'priority': 14}, {'name': 'AES128-SHA', 'priority': 15}, {'name': 'AES256-GCM-SHA384', 'priority': 16}, {'name': 'AES256-SHA256', 'priority': 17}, {'name': 'AES256-SHA', 'priority': 18} ] }, { 'name': 'ELBSecurityPolicy-2015-05', 'ssl_protocols': ['TLSv1', 'TLSv1.1', 'TLSv1.2'], 'ciphers': [ {'name': 'ECDHE-ECDSA-AES128-GCM-SHA256', 'priority': 1}, {'name': 'ECDHE-RSA-AES128-GCM-SHA256', 'priority': 2}, {'name': 'ECDHE-ECDSA-AES128-SHA256', 'priority': 3}, {'name': 'ECDHE-RSA-AES128-SHA256', 'priority': 4}, {'name': 'ECDHE-ECDSA-AES128-SHA', 'priority': 5}, {'name': 'ECDHE-RSA-AES128-SHA', 'priority': 6}, {'name': 'ECDHE-ECDSA-AES256-GCM-SHA384', 'priority': 7}, {'name': 'ECDHE-RSA-AES256-GCM-SHA384', 'priority': 8}, {'name': 'ECDHE-ECDSA-AES256-SHA384', 'priority': 9}, {'name': 'ECDHE-RSA-AES256-SHA384', 'priority': 10}, {'name': 'ECDHE-RSA-AES256-SHA', 'priority': 11}, {'name': 'ECDHE-ECDSA-AES256-SHA', 'priority': 12}, {'name': 'AES128-GCM-SHA256', 'priority': 13}, {'name': 'AES128-SHA256', 'priority': 14}, {'name': 'AES128-SHA', 'priority': 15}, {'name': 'AES256-GCM-SHA384', 'priority': 16}, {'name': 'AES256-SHA256', 'priority': 17}, {'name': 'AES256-SHA', 'priority': 18} ] }, { 'name': 'ELBSecurityPolicy-TLS-1-0-2015-04', 'ssl_protocols': ['TLSv1', 'TLSv1.1', 'TLSv1.2'], 'ciphers': [ {'name': 'ECDHE-ECDSA-AES128-GCM-SHA256', 'priority': 1}, {'name': 'ECDHE-RSA-AES128-GCM-SHA256', 'priority': 2}, {'name': 'ECDHE-ECDSA-AES128-SHA256', 'priority': 3}, {'name': 'ECDHE-RSA-AES128-SHA256', 'priority': 4}, {'name': 'ECDHE-ECDSA-AES128-SHA', 'priority': 5}, {'name': 'ECDHE-RSA-AES128-SHA', 'priority': 6}, {'name': 'ECDHE-ECDSA-AES256-GCM-SHA384', 'priority': 7}, {'name': 'ECDHE-RSA-AES256-GCM-SHA384', 'priority': 8}, {'name': 'ECDHE-ECDSA-AES256-SHA384', 'priority': 9}, {'name': 'ECDHE-RSA-AES256-SHA384', 'priority': 10}, {'name': 'ECDHE-RSA-AES256-SHA', 'priority': 11}, {'name': 'ECDHE-ECDSA-AES256-SHA', 'priority': 12}, {'name': 'AES128-GCM-SHA256', 'priority': 13}, {'name': 'AES128-SHA256', 'priority': 14}, {'name': 'AES128-SHA', 'priority': 15}, {'name': 'AES256-GCM-SHA384', 'priority': 16}, {'name': 'AES256-SHA256', 'priority': 17}, {'name': 'AES256-SHA', 'priority': 18}, {'name': 'DES-CBC3-SHA', 'priority': 19} ] } ] class ELBV2Response(BaseResponse): @property def elbv2_backend(self): return elbv2_backends[self.region] @amzn_request_id def create_load_balancer(self): load_balancer_name = self._get_param('Name') subnet_ids = self._get_multi_param("Subnets.member") security_groups = self._get_multi_param("SecurityGroups.member") scheme = self._get_param('Scheme') load_balancer = self.elbv2_backend.create_load_balancer( name=load_balancer_name, security_groups=security_groups, subnet_ids=subnet_ids, scheme=scheme, ) self._add_tags(load_balancer) template = self.response_template(CREATE_LOAD_BALANCER_TEMPLATE) return template.render(load_balancer=load_balancer) @amzn_request_id def create_rule(self): lister_arn = self._get_param('ListenerArn') _conditions = self._get_list_prefix('Conditions.member') conditions = [] for _condition in _conditions: condition = {} condition['field'] = _condition['field'] values = sorted( [e for e in _condition.items() if e[0].startswith('values.member')], key=lambda x: x[0] ) condition['values'] = [e[1] for e in values] conditions.append(condition) priority = self._get_int_param('Priority') actions = self._get_list_prefix('Actions.member') rules = self.elbv2_backend.create_rule( listener_arn=lister_arn, conditions=conditions, priority=priority, actions=actions ) template = self.response_template(CREATE_RULE_TEMPLATE) return template.render(rules=rules) @amzn_request_id def create_target_group(self): name = self._get_param('Name') vpc_id = self._get_param('VpcId') protocol = self._get_param('Protocol') port = self._get_param('Port') healthcheck_protocol = self._get_param('HealthCheckProtocol') healthcheck_port = self._get_param('HealthCheckPort') healthcheck_path = self._get_param('HealthCheckPath') healthcheck_interval_seconds = self._get_param('HealthCheckIntervalSeconds') healthcheck_timeout_seconds = self._get_param('HealthCheckTimeoutSeconds') healthy_threshold_count = self._get_param('HealthyThresholdCount') unhealthy_threshold_count = self._get_param('UnhealthyThresholdCount') matcher = self._get_param('Matcher') target_group = self.elbv2_backend.create_target_group( name, vpc_id=vpc_id, protocol=protocol, port=port, healthcheck_protocol=healthcheck_protocol, healthcheck_port=healthcheck_port, healthcheck_path=healthcheck_path, healthcheck_interval_seconds=healthcheck_interval_seconds, healthcheck_timeout_seconds=healthcheck_timeout_seconds, healthy_threshold_count=healthy_threshold_count, unhealthy_threshold_count=unhealthy_threshold_count, matcher=matcher, ) template = self.response_template(CREATE_TARGET_GROUP_TEMPLATE) return template.render(target_group=target_group) @amzn_request_id def create_listener(self): load_balancer_arn = self._get_param('LoadBalancerArn') protocol = self._get_param('Protocol') port = self._get_param('Port') ssl_policy = self._get_param('SslPolicy', 'ELBSecurityPolicy-2016-08') certificates = self._get_list_prefix('Certificates.member') if certificates: certificate = certificates[0].get('certificate_arn') else: certificate = None default_actions = self._get_list_prefix('DefaultActions.member') listener = self.elbv2_backend.create_listener( load_balancer_arn=load_balancer_arn, protocol=protocol, port=port, ssl_policy=ssl_policy, certificate=certificate, default_actions=default_actions) template = self.response_template(CREATE_LISTENER_TEMPLATE) return template.render(listener=listener) @amzn_request_id def describe_load_balancers(self): arns = self._get_multi_param("LoadBalancerArns.member") names = self._get_multi_param("Names.member") all_load_balancers = list(self.elbv2_backend.describe_load_balancers(arns, names)) marker = self._get_param('Marker') all_names = [balancer.name for balancer in all_load_balancers] if marker: start = all_names.index(marker) + 1 else: start = 0 page_size = self._get_int_param('PageSize', 50) # the default is 400, but using 50 to make testing easier load_balancers_resp = all_load_balancers[start:start + page_size] next_marker = None if len(all_load_balancers) > start + page_size: next_marker = load_balancers_resp[-1].name template = self.response_template(DESCRIBE_LOAD_BALANCERS_TEMPLATE) return template.render(load_balancers=load_balancers_resp, marker=next_marker) @amzn_request_id def describe_rules(self): listener_arn = self._get_param('ListenerArn') rule_arns = self._get_multi_param('RuleArns.member') if any(k for k in list(self.querystring.keys()) if k.startswith('RuleArns.member')) else None all_rules = self.elbv2_backend.describe_rules(listener_arn, rule_arns) all_arns = [rule.arn for rule in all_rules] page_size = self._get_int_param('PageSize', 50) # set 50 for temporary marker = self._get_param('Marker') if marker: start = all_arns.index(marker) + 1 else: start = 0 rules_resp = all_rules[start:start + page_size] next_marker = None if len(all_rules) > start + page_size: next_marker = rules_resp[-1].arn template = self.response_template(DESCRIBE_RULES_TEMPLATE) return template.render(rules=rules_resp, marker=next_marker) @amzn_request_id def describe_target_groups(self): load_balancer_arn = self._get_param('LoadBalancerArn') target_group_arns = self._get_multi_param('TargetGroupArns.member') names = self._get_multi_param('Names.member') target_groups = self.elbv2_backend.describe_target_groups(load_balancer_arn, target_group_arns, names) template = self.response_template(DESCRIBE_TARGET_GROUPS_TEMPLATE) return template.render(target_groups=target_groups) @amzn_request_id def describe_target_group_attributes(self): target_group_arn = self._get_param('TargetGroupArn') target_group = self.elbv2_backend.target_groups.get(target_group_arn) if not target_group: raise TargetGroupNotFoundError() template = self.response_template(DESCRIBE_TARGET_GROUP_ATTRIBUTES_TEMPLATE) return template.render(attributes=target_group.attributes) @amzn_request_id def describe_listeners(self): load_balancer_arn = self._get_param('LoadBalancerArn') listener_arns = self._get_multi_param('ListenerArns.member') if not load_balancer_arn and not listener_arns: raise LoadBalancerNotFoundError() listeners = self.elbv2_backend.describe_listeners(load_balancer_arn, listener_arns) template = self.response_template(DESCRIBE_LISTENERS_TEMPLATE) return template.render(listeners=listeners) @amzn_request_id def delete_load_balancer(self): arn = self._get_param('LoadBalancerArn') self.elbv2_backend.delete_load_balancer(arn) template = self.response_template(DELETE_LOAD_BALANCER_TEMPLATE) return template.render() @amzn_request_id def delete_rule(self): arn = self._get_param('RuleArn') self.elbv2_backend.delete_rule(arn) template = self.response_template(DELETE_RULE_TEMPLATE) return template.render() @amzn_request_id def delete_target_group(self): arn = self._get_param('TargetGroupArn') self.elbv2_backend.delete_target_group(arn) template = self.response_template(DELETE_TARGET_GROUP_TEMPLATE) return template.render() @amzn_request_id def delete_listener(self): arn = self._get_param('ListenerArn') self.elbv2_backend.delete_listener(arn) template = self.response_template(DELETE_LISTENER_TEMPLATE) return template.render() @amzn_request_id def modify_rule(self): rule_arn = self._get_param('RuleArn') _conditions = self._get_list_prefix('Conditions.member') conditions = [] for _condition in _conditions: condition = {} condition['field'] = _condition['field'] values = sorted( [e for e in _condition.items() if e[0].startswith('values.member')], key=lambda x: x[0] ) condition['values'] = [e[1] for e in values] conditions.append(condition) actions = self._get_list_prefix('Actions.member') rules = self.elbv2_backend.modify_rule( rule_arn=rule_arn, conditions=conditions, actions=actions ) template = self.response_template(MODIFY_RULE_TEMPLATE) return template.render(rules=rules) @amzn_request_id def modify_target_group_attributes(self): target_group_arn = self._get_param('TargetGroupArn') target_group = self.elbv2_backend.target_groups.get(target_group_arn) attributes = { attr['key']: attr['value'] for attr in self._get_list_prefix('Attributes.member') } target_group.attributes.update(attributes) if not target_group: raise TargetGroupNotFoundError() template = self.response_template(MODIFY_TARGET_GROUP_ATTRIBUTES_TEMPLATE) return template.render(attributes=attributes) @amzn_request_id def register_targets(self): target_group_arn = self._get_param('TargetGroupArn') targets = self._get_list_prefix('Targets.member') self.elbv2_backend.register_targets(target_group_arn, targets) template = self.response_template(REGISTER_TARGETS_TEMPLATE) return template.render() @amzn_request_id def deregister_targets(self): target_group_arn = self._get_param('TargetGroupArn') targets = self._get_list_prefix('Targets.member') self.elbv2_backend.deregister_targets(target_group_arn, targets) template = self.response_template(DEREGISTER_TARGETS_TEMPLATE) return template.render() @amzn_request_id def describe_target_health(self): target_group_arn = self._get_param('TargetGroupArn') targets = self._get_list_prefix('Targets.member') target_health_descriptions = self.elbv2_backend.describe_target_health(target_group_arn, targets) template = self.response_template(DESCRIBE_TARGET_HEALTH_TEMPLATE) return template.render(target_health_descriptions=target_health_descriptions) @amzn_request_id def set_rule_priorities(self): rule_priorities = self._get_list_prefix('RulePriorities.member') for rule_priority in rule_priorities: rule_priority['priority'] = int(rule_priority['priority']) rules = self.elbv2_backend.set_rule_priorities(rule_priorities) template = self.response_template(SET_RULE_PRIORITIES_TEMPLATE) return template.render(rules=rules) @amzn_request_id def add_tags(self): resource_arns = self._get_multi_param('ResourceArns.member') for arn in resource_arns: if ':targetgroup' in arn: resource = self.elbv2_backend.target_groups.get(arn) if not resource: raise TargetGroupNotFoundError() elif ':loadbalancer' in arn: resource = self.elbv2_backend.load_balancers.get(arn) if not resource: raise LoadBalancerNotFoundError() else: raise LoadBalancerNotFoundError() self._add_tags(resource) template = self.response_template(ADD_TAGS_TEMPLATE) return template.render() @amzn_request_id def remove_tags(self): resource_arns = self._get_multi_param('ResourceArns.member') tag_keys = self._get_multi_param('TagKeys.member') for arn in resource_arns: if ':targetgroup' in arn: resource = self.elbv2_backend.target_groups.get(arn) if not resource: raise TargetGroupNotFoundError() elif ':loadbalancer' in arn: resource = self.elbv2_backend.load_balancers.get(arn) if not resource: raise LoadBalancerNotFoundError() else: raise LoadBalancerNotFoundError() [resource.remove_tag(key) for key in tag_keys] template = self.response_template(REMOVE_TAGS_TEMPLATE) return template.render() @amzn_request_id def describe_tags(self): resource_arns = self._get_multi_param('ResourceArns.member') resources = [] for arn in resource_arns: if ':targetgroup' in arn: resource = self.elbv2_backend.target_groups.get(arn) if not resource: raise TargetGroupNotFoundError() elif ':loadbalancer' in arn: resource = self.elbv2_backend.load_balancers.get(arn) if not resource: raise LoadBalancerNotFoundError() else: raise LoadBalancerNotFoundError() resources.append(resource) template = self.response_template(DESCRIBE_TAGS_TEMPLATE) return template.render(resources=resources) @amzn_request_id def describe_account_limits(self): # Supports paging but not worth implementing yet # marker = self._get_param('Marker') # page_size = self._get_int_param('PageSize') limits = { 'application-load-balancers': 20, 'target-groups': 3000, 'targets-per-application-load-balancer': 30, 'listeners-per-application-load-balancer': 50, 'rules-per-application-load-balancer': 100, 'network-load-balancers': 20, 'targets-per-network-load-balancer': 200, 'listeners-per-network-load-balancer': 50 } template = self.response_template(DESCRIBE_LIMITS_TEMPLATE) return template.render(limits=limits) @amzn_request_id def describe_ssl_policies(self): names = self._get_multi_param('Names.member.') # Supports paging but not worth implementing yet # marker = self._get_param('Marker') # page_size = self._get_int_param('PageSize') policies = SSL_POLICIES if names: policies = filter(lambda policy: policy['name'] in names, policies) template = self.response_template(DESCRIBE_SSL_POLICIES_TEMPLATE) return template.render(policies=policies) @amzn_request_id def set_ip_address_type(self): arn = self._get_param('LoadBalancerArn') ip_type = self._get_param('IpAddressType') self.elbv2_backend.set_ip_address_type(arn, ip_type) template = self.response_template(SET_IP_ADDRESS_TYPE_TEMPLATE) return template.render(ip_type=ip_type) @amzn_request_id def set_security_groups(self): arn = self._get_param('LoadBalancerArn') sec_groups = self._get_multi_param('SecurityGroups.member.') self.elbv2_backend.set_security_groups(arn, sec_groups) template = self.response_template(SET_SECURITY_GROUPS_TEMPLATE) return template.render(sec_groups=sec_groups) @amzn_request_id def set_subnets(self): arn = self._get_param('LoadBalancerArn') subnets = self._get_multi_param('Subnets.member.') subnet_zone_list = self.elbv2_backend.set_subnets(arn, subnets) template = self.response_template(SET_SUBNETS_TEMPLATE) return template.render(subnets=subnet_zone_list) @amzn_request_id def modify_load_balancer_attributes(self): arn = self._get_param('LoadBalancerArn') attrs = self._get_map_prefix('Attributes.member', key_end='Key', value_end='Value') all_attrs = self.elbv2_backend.modify_load_balancer_attributes(arn, attrs) template = self.response_template(MODIFY_LOADBALANCER_ATTRS_TEMPLATE) return template.render(attrs=all_attrs) @amzn_request_id def describe_load_balancer_attributes(self): arn = self._get_param('LoadBalancerArn') attrs = self.elbv2_backend.describe_load_balancer_attributes(arn) template = self.response_template(DESCRIBE_LOADBALANCER_ATTRS_TEMPLATE) return template.render(attrs=attrs) @amzn_request_id def modify_target_group(self): arn = self._get_param('TargetGroupArn') health_check_proto = self._get_param('HealthCheckProtocol') # 'HTTP' | 'HTTPS' | 'TCP', health_check_port = self._get_param('HealthCheckPort') health_check_path = self._get_param('HealthCheckPath') health_check_interval = self._get_param('HealthCheckIntervalSeconds') health_check_timeout = self._get_param('HealthCheckTimeoutSeconds') healthy_threshold_count = self._get_param('HealthyThresholdCount') unhealthy_threshold_count = self._get_param('UnhealthyThresholdCount') http_codes = self._get_param('Matcher.HttpCode') target_group = self.elbv2_backend.modify_target_group(arn, health_check_proto, health_check_port, health_check_path, health_check_interval, health_check_timeout, healthy_threshold_count, unhealthy_threshold_count, http_codes) template = self.response_template(MODIFY_TARGET_GROUP_TEMPLATE) return template.render(target_group=target_group) @amzn_request_id def modify_listener(self): arn = self._get_param('ListenerArn') port = self._get_param('Port') protocol = self._get_param('Protocol') ssl_policy = self._get_param('SslPolicy') certificates = self._get_list_prefix('Certificates.member') default_actions = self._get_list_prefix('DefaultActions.member') # Should really move SSL Policies to models if ssl_policy is not None and ssl_policy not in [item['name'] for item in SSL_POLICIES]: raise RESTError('SSLPolicyNotFound', 'Policy {0} not found'.format(ssl_policy)) listener = self.elbv2_backend.modify_listener(arn, port, protocol, ssl_policy, certificates, default_actions) template = self.response_template(MODIFY_LISTENER_TEMPLATE) return template.render(listener=listener) def _add_tags(self, resource): tag_values = [] tag_keys = [] for t_key, t_val in sorted(self.querystring.items()): if t_key.startswith('Tags.member.'): if t_key.split('.')[3] == 'Key': tag_keys.extend(t_val) elif t_key.split('.')[3] == 'Value': tag_values.extend(t_val) counts = {} for i in tag_keys: counts[i] = tag_keys.count(i) counts = sorted(counts.items(), key=lambda i: i[1], reverse=True) if counts and counts[0][1] > 1: # We have dupes... raise DuplicateTagKeysError(counts[0]) for tag_key, tag_value in zip(tag_keys, tag_values): resource.add_tag(tag_key, tag_value) ADD_TAGS_TEMPLATE = """ {{ request_id }} """ REMOVE_TAGS_TEMPLATE = """ {{ request_id }} """ DESCRIBE_TAGS_TEMPLATE = """ {% for resource in resources %} {{ resource.arn }} {% for key, value in resource.tags.items() %} {{ value }} {{ key }} {% endfor %} {% endfor %} {{ request_id }} """ CREATE_LOAD_BALANCER_TEMPLATE = """ {{ load_balancer.arn }} {{ load_balancer.scheme }} {{ load_balancer.name }} {{ load_balancer.vpc_id }} Z2P70J7EXAMPLE {{ load_balancer.created_time }} {% for subnet in load_balancer.subnets %} {{ subnet.id }} {{ subnet.availability_zone }} {% endfor %} {% for security_group in load_balancer.security_groups %} {{ security_group }} {% endfor %} {{ load_balancer.dns_name }} provisioning application {{ request_id }} """ CREATE_RULE_TEMPLATE = """ {% for rule in rules %} {{ "true" if rule.is_default else "false" }} {% for condition in rule.conditions %} {{ condition["field"] }} {% for value in condition["values"] %} {{ value }} {% endfor %} {% endfor %} {{ rule.priority }} {% for action in rule.actions %} {{ action["type"] }} {% if action["type"] == "forward" %} {{ action["target_group_arn"] }} {% elif action["type"] == "redirect" %} {{ action["redirect_config"] }} {% endif %} {% endfor %} {{ rule.arn }} {% endfor %} {{ request_id }} """ CREATE_TARGET_GROUP_TEMPLATE = """ {{ target_group.arn }} {{ target_group.name }} {{ target_group.protocol }} {{ target_group.port }} {{ target_group.vpc_id }} {{ target_group.health_check_protocol }} {{ target_group.healthcheck_port }} {{ target_group.healthcheck_path }} {{ target_group.healthcheck_interval_seconds }} {{ target_group.healthcheck_timeout_seconds }} {{ target_group.healthy_threshold_count }} {{ target_group.unhealthy_threshold_count }} {% if target_group.matcher %} {{ target_group.matcher['HttpCode'] }} {% endif %} {% if target_group.target_type %} {{ target_group.target_type }} {% endif %} {{ request_id }} """ CREATE_LISTENER_TEMPLATE = """ {{ listener.load_balancer_arn }} {{ listener.protocol }} {% if listener.certificates %} {% for cert in listener.certificates %} {{ cert }} {% endfor %} {% endif %} {{ listener.port }} {{ listener.ssl_policy }} {{ listener.arn }} {% for action in listener.default_actions %} {{ action.to_xml() }} {% endfor %} {{ request_id }} """ DELETE_LOAD_BALANCER_TEMPLATE = """ {{ request_id }} """ DELETE_RULE_TEMPLATE = """ {{ request_id }} """ DELETE_TARGET_GROUP_TEMPLATE = """ {{ request_id }} """ DELETE_LISTENER_TEMPLATE = """ {{ request_id }} """ DESCRIBE_LOAD_BALANCERS_TEMPLATE = """ {% for load_balancer in load_balancers %} {{ load_balancer.arn }} {{ load_balancer.scheme }} {{ load_balancer.name }} {{ load_balancer.vpc_id }} Z2P70J7EXAMPLE {{ load_balancer.created_time }} {% for subnet in load_balancer.subnets %} {{ subnet.id }} {{ subnet.availability_zone }} {% endfor %} {% for security_group in load_balancer.security_groups %} {{ security_group }} {% endfor %} {{ load_balancer.dns_name }} provisioning application ipv4 {% endfor %} {% if marker %} {{ marker }} {% endif %} {{ request_id }} """ DESCRIBE_RULES_TEMPLATE = """ {% for rule in rules %} {{ "true" if rule.is_default else "false" }} {% for condition in rule.conditions %} {{ condition["field"] }} {% for value in condition["values"] %} {{ value }} {% endfor %} {% endfor %} {{ rule.priority }} {% for action in rule.actions %} {{ action.to_xml() }} {% endfor %} {{ rule.arn }} {% endfor %} {% if marker %} {{ marker }} {% endif %} {{ request_id }} """ DESCRIBE_TARGET_GROUPS_TEMPLATE = """ {% for target_group in target_groups %} {{ target_group.arn }} {{ target_group.name }} {{ target_group.protocol }} {{ target_group.port }} {{ target_group.vpc_id }} {{ target_group.healthcheck_protocol }} {{ target_group.healthcheck_port }} {{ target_group.healthcheck_path }} {{ target_group.healthcheck_interval_seconds }} {{ target_group.healthcheck_timeout_seconds }} {{ target_group.healthy_threshold_count }} {{ target_group.unhealthy_threshold_count }} {% if target_group.matcher %} {{ target_group.matcher['HttpCode'] }} {% endif %} {% if target_group.target_type %} {{ target_group.target_type }} {% endif %} {% for load_balancer_arn in target_group.load_balancer_arns %} {{ load_balancer_arn }} {% endfor %} {% endfor %} {{ request_id }} """ DESCRIBE_TARGET_GROUP_ATTRIBUTES_TEMPLATE = """ {% for key, value in attributes.items() %} {{ key }} {{ value }} {% endfor %} {{ request_id }} """ DESCRIBE_LISTENERS_TEMPLATE = """ {% for listener in listeners %} {{ listener.load_balancer_arn }} {{ listener.protocol }} {% if listener.certificate %} {{ listener.certificate }} {% endif %} {{ listener.port }} {{ listener.ssl_policy }} {{ listener.arn }} {% for action in listener.default_actions %} {{ action.to_xml() }} {% endfor %} {% endfor %} {{ request_id }} """ CONFIGURE_HEALTH_CHECK_TEMPLATE = """ {{ check.interval }} {{ check.target }} {{ check.healthy_threshold }} {{ check.timeout }} {{ check.unhealthy_threshold }} {{ request_id }} """ MODIFY_RULE_TEMPLATE = """ {% for rule in rules %} {{ "true" if rule.is_default else "false" }} {% for condition in rule.conditions %} {{ condition["field"] }} {% for value in condition["values"] %} {{ value }} {% endfor %} {% endfor %} {{ rule.priority }} {% for action in rule.actions %} {{ action.to_xml() }} {% endfor %} {{ rule.arn }} {% endfor %} {{ request_id }} """ MODIFY_TARGET_GROUP_ATTRIBUTES_TEMPLATE = """ {% for key, value in attributes.items() %} {{ key }} {{ value }} {% endfor %} {{ request_id }} """ REGISTER_TARGETS_TEMPLATE = """ {{ request_id }} """ DEREGISTER_TARGETS_TEMPLATE = """ {{ request_id }} """ SET_LOAD_BALANCER_SSL_CERTIFICATE = """ {{ request_id }} """ DELETE_LOAD_BALANCER_LISTENERS = """ {{ request_id }} """ DESCRIBE_ATTRIBUTES_TEMPLATE = """ {{ attributes.access_log.enabled }} {% if attributes.access_log.enabled %} {{ attributes.access_log.s3_bucket_name }} {{ attributes.access_log.s3_bucket_prefix }} {{ attributes.access_log.emit_interval }} {% endif %} {{ attributes.connecting_settings.idle_timeout }} {{ attributes.cross_zone_load_balancing.enabled }} {% if attributes.connection_draining.enabled %} true {{ attributes.connection_draining.timeout }} {% else %} false {% endif %} {{ request_id }} """ MODIFY_ATTRIBUTES_TEMPLATE = """ {{ load_balancer.name }} {{ attributes.access_log.enabled }} {% if attributes.access_log.enabled %} {{ attributes.access_log.s3_bucket_name }} {{ attributes.access_log.s3_bucket_prefix }} {{ attributes.access_log.emit_interval }} {% endif %} {{ attributes.connecting_settings.idle_timeout }} {{ attributes.cross_zone_load_balancing.enabled }} {% if attributes.connection_draining.enabled %} true {{ attributes.connection_draining.timeout }} {% else %} false {% endif %} {{ request_id }} """ CREATE_LOAD_BALANCER_POLICY_TEMPLATE = """ {{ request_id }} """ SET_LOAD_BALANCER_POLICIES_OF_LISTENER_TEMPLATE = """ {{ request_id }} """ SET_LOAD_BALANCER_POLICIES_FOR_BACKEND_SERVER_TEMPLATE = """ {{ request_id }} """ DESCRIBE_TARGET_HEALTH_TEMPLATE = """ {% for target_health in target_health_descriptions %} {{ target_health.health_port }} {{ target_health.status }} {% if target_health.reason %} {{ target_health.reason }} {% endif %} {% if target_health.description %} {{ target_health.description }} {% endif %} {{ target_health.port }} {{ target_health.instance_id }} {% endfor %} {{ request_id }} """ SET_RULE_PRIORITIES_TEMPLATE = """ {% for rule in rules %} {{ "true" if rule.is_default else "false" }} {% for condition in rule.conditions %} {{ condition["field"] }} {% for value in condition["values"] %} {{ value }} {% endfor %} {% endfor %} {{ rule.priority }} {% for action in rule.actions %} {{ action["type"] }} {{ action["target_group_arn"] }} {% endfor %} {{ rule.arn }} {% endfor %} {{ request_id }} """ DESCRIBE_LIMITS_TEMPLATE = """ {% for key, value in limits.items() %} {{ key }} {{ value }} {% endfor %} {{ request_id }} """ DESCRIBE_SSL_POLICIES_TEMPLATE = """ {% for policy in policies %} {{ policy['name'] }} {% for cipher in policy['ciphers'] %} {{ cipher['name'] }} {{ cipher['priority'] }} {% endfor %} {% for proto in policy['ssl_protocols'] %} {{ proto }} {% endfor %} {% endfor %} {{ request_id }} """ SET_IP_ADDRESS_TYPE_TEMPLATE = """ {{ ip_type }} {{ request_id }} """ SET_SECURITY_GROUPS_TEMPLATE = """ {% for group in sec_groups %} {{ group }} {% endfor %} {{ request_id }} """ SET_SUBNETS_TEMPLATE = """ {% for zone_id, subnet_id in subnets %} {{ subnet_id }} {{ zone_id }} {% endfor %} {{ request_id }} """ MODIFY_LOADBALANCER_ATTRS_TEMPLATE = """ {% for key, value in attrs.items() %} {% if value == None %}{% else %}{{ value }}{% endif %} {{ key }} {% endfor %} {{ request_id }} """ DESCRIBE_LOADBALANCER_ATTRS_TEMPLATE = """ {% for key, value in attrs.items() %} {% if value == None %}{% else %}{{ value }}{% endif %} {{ key }} {% endfor %} {{ request_id }} """ MODIFY_TARGET_GROUP_TEMPLATE = """ {{ target_group.arn }} {{ target_group.name }} {{ target_group.protocol }} {{ target_group.port }} {{ target_group.vpc_id }} {{ target_group.healthcheck_protocol }} {{ target_group.healthcheck_port }} {{ target_group.healthcheck_path }} {{ target_group.healthcheck_interval_seconds }} {{ target_group.healthcheck_timeout_seconds }} {{ target_group.healthy_threshold_count }} {{ target_group.unhealthy_threshold_count }} {{ target_group.matcher['HttpCode'] }} {% for load_balancer_arn in target_group.load_balancer_arns %} {{ load_balancer_arn }} {% endfor %} {{ request_id }} """ MODIFY_LISTENER_TEMPLATE = """ {{ listener.load_balancer_arn }} {{ listener.protocol }} {% if listener.certificates %} {% for cert in listener.certificates %} {{ cert }} {% endfor %} {% endif %} {{ listener.port }} {{ listener.ssl_policy }} {{ listener.arn }} {% for action in listener.default_actions %} {{ action.to_xml() }} {% endfor %} {{ request_id }} """