diff --git a/moto/elb/models.py b/moto/elb/models.py index 8954f5e3c..43b210b6f 100644 --- a/moto/elb/models.py +++ b/moto/elb/models.py @@ -10,6 +10,7 @@ from boto.ec2.elb.attributes import ( ) from boto.ec2.elb.policies import Policies from moto.core import BaseBackend +from moto.ec2.models import ec2_backends from .exceptions import LoadBalancerNotFoundError, TooManyTagsError, BadHealthCheckDefinition @@ -47,7 +48,7 @@ class FakeBackend(object): class FakeLoadBalancer(object): - def __init__(self, name, zones, ports, scheme='internet-facing',): + def __init__(self, name, zones, ports, scheme='internet-facing', vpc_id=None, subnets=None): self.name = name self.health_check = None self.instance_ids = [] @@ -60,6 +61,8 @@ class FakeLoadBalancer(object): self.policies.other_policies = [] self.policies.app_cookie_stickiness_policies = [] self.policies.lb_cookie_stickiness_policies = [] + self.subnets = subnets or [] + self.vpc_id = vpc_id or 'vpc-56e10e3d' self.tags = {} for port in ports: @@ -149,11 +152,22 @@ class FakeLoadBalancer(object): class ELBBackend(BaseBackend): - def __init__(self): + def __init__(self, region_name=None): + self.region_name = region_name self.load_balancers = {} - def create_load_balancer(self, name, zones, ports, scheme='internet-facing'): - new_load_balancer = FakeLoadBalancer(name=name, zones=zones, ports=ports, scheme=scheme) + def reset(self): + region_name = self.region_name + self.__dict__ = {} + self.__init__(region_name) + + def create_load_balancer(self, name, zones, ports, scheme='internet-facing', subnets=None): + vpc_id = None + ec2_backend = ec2_backends[self.region_name] + if subnets: + subnet = ec2_backend.get_subnet(subnets[0]) + vpc_id = subnet.vpc_id + new_load_balancer = FakeLoadBalancer(name=name, zones=zones, ports=ports, scheme=scheme, subnets=subnets, vpc_id=vpc_id) self.load_balancers[name] = new_load_balancer return new_load_balancer @@ -286,4 +300,4 @@ class ELBBackend(BaseBackend): elb_backends = {} for region in boto.ec2.elb.regions(): - elb_backends[region.name] = ELBBackend() + elb_backends[region.name] = ELBBackend(region.name) diff --git a/moto/elb/responses.py b/moto/elb/responses.py index a55ba5382..52c649ab3 100644 --- a/moto/elb/responses.py +++ b/moto/elb/responses.py @@ -27,13 +27,16 @@ class ELBResponse(BaseResponse): availability_zones = self._get_multi_param("AvailabilityZones.member") ports = self._get_list_prefix("Listeners.member") scheme = self._get_param('Scheme') + subnets = self._get_multi_param("Subnets.member") - self.elb_backend.create_load_balancer( + elb = self.elb_backend.create_load_balancer( name=load_balancer_name, zones=availability_zones, ports=ports, - scheme=scheme + scheme=scheme, + subnets=subnets, ) + self._add_tags(elb) template = self.response_template(CREATE_LOAD_BALANCER_TEMPLATE) return template.render() @@ -229,31 +232,7 @@ class ELBResponse(BaseResponse): if not elb: raise LoadBalancerNotFoundError(load_balancer_name) - value = 'Tags.member.{0}.Value'.format(number) - key = 'Tags.member.{0}.Key'.format(number) - 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): - elb.add_tag(tag_key, tag_value) - + self._add_tags(elb) template = self.response_template(ADD_TAGS_TEMPLATE) return template.render() @@ -290,6 +269,31 @@ class ELBResponse(BaseResponse): template = self.response_template(DESCRIBE_TAGS_TEMPLATE) return template.render(load_balancers=elbs) + def _add_tags(self, elb): + 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): + elb.add_tag(tag_key, tag_value) + + ADD_TAGS_TEMPLATE = """ @@ -369,7 +373,11 @@ DESCRIBE_LOAD_BALANCERS_TEMPLATE = """