Raise error on duplicate elbv1 listener

AWS returns an error condition when a listener is defined that interferes with an existing listener on the same load balancer port.
This commit is contained in:
Jack Danger 2017-07-06 21:52:01 -07:00
parent 7e4a1d0887
commit 98342bfcc3
3 changed files with 24 additions and 0 deletions

View File

@ -40,6 +40,15 @@ class BadHealthCheckDefinition(ELBClientError):
"HealthCheck Target must begin with one of HTTP, TCP, HTTPS, SSL")
class DuplicateListenerError(ELBClientError):
def __init__(self, name, port):
super(DuplicateListenerError, self).__init__(
"DuplicateListener",
"A listener already exists for {0} with LoadBalancerPort {1}, but with a different InstancePort, Protocol, or SSLCertificateId"
.format(name, port))
class DuplicateLoadBalancerName(ELBClientError):
def __init__(self, name):

View File

@ -18,6 +18,7 @@ from moto.ec2.models import ec2_backends
from .exceptions import (
BadHealthCheckDefinition,
DuplicateLoadBalancerName,
DuplicateListenerError,
EmptyListenersError,
LoadBalancerNotFoundError,
TooManyTagsError,
@ -257,6 +258,12 @@ class ELBBackend(BaseBackend):
ssl_certificate_id = port.get('sslcertificate_id')
for listener in balancer.listeners:
if lb_port == listener.load_balancer_port:
if protocol != listener.protocol:
raise DuplicateListenerError(name, lb_port)
if instance_port != listener.instance_port:
raise DuplicateListenerError(name, lb_port)
if ssl_certificate_id != listener.ssl_certificate_id:
raise DuplicateListenerError(name, lb_port)
break
else:
balancer.listeners.append(FakeListener(

View File

@ -214,6 +214,14 @@ def test_create_and_delete_listener_boto3_support():
balancer['ListenerDescriptions'][1]['Listener'][
'InstancePort'].should.equal(8443)
# Creating this listener with an conflicting definition throws error
with assert_raises(ClientError):
client.create_load_balancer_listeners(
LoadBalancerName='my-lb',
Listeners=[
{'Protocol': 'tcp', 'LoadBalancerPort': 443, 'InstancePort': 1234}]
)
client.delete_load_balancer_listeners(
LoadBalancerName='my-lb',
LoadBalancerPorts=[443])