Merge pull request #1031 from JackDanger/elbv2-target-group-attributes
Implementing ELBV2 target group attributes
This commit is contained in:
commit
95e3cbe2b2
@ -55,6 +55,11 @@ class FakeTargetGroup(BaseModel):
|
||||
self.unhealthy_threshold_count = unhealthy_threshold_count
|
||||
self.load_balancer_arns = []
|
||||
|
||||
self.attributes = {
|
||||
'deregistration_delay.timeout_seconds': 300,
|
||||
'stickiness.enabled': 'false',
|
||||
}
|
||||
|
||||
self.targets = OrderedDict()
|
||||
|
||||
def register(self, targets):
|
||||
|
@ -1,7 +1,9 @@
|
||||
from __future__ import unicode_literals
|
||||
from moto.core.responses import BaseResponse
|
||||
from .models import elbv2_backends
|
||||
from .exceptions import DuplicateTagKeysError, LoadBalancerNotFoundError
|
||||
from .exceptions import DuplicateTagKeysError
|
||||
from .exceptions import LoadBalancerNotFoundError
|
||||
from .exceptions import TargetGroupNotFoundError
|
||||
|
||||
|
||||
class ELBV2Response(BaseResponse):
|
||||
@ -107,6 +109,14 @@ class ELBV2Response(BaseResponse):
|
||||
template = self.response_template(DESCRIBE_TARGET_GROUPS_TEMPLATE)
|
||||
return template.render(target_groups=target_groups)
|
||||
|
||||
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)
|
||||
|
||||
def describe_listeners(self):
|
||||
load_balancer_arn = self._get_param('LoadBalancerArn')
|
||||
listener_arns = self._get_multi_param('ListenerArns.member')
|
||||
@ -135,6 +145,19 @@ class ELBV2Response(BaseResponse):
|
||||
template = self.response_template(DELETE_LISTENER_TEMPLATE)
|
||||
return template.render()
|
||||
|
||||
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)
|
||||
|
||||
def register_targets(self):
|
||||
target_group_arn = self._get_param('TargetGroupArn')
|
||||
targets = self._get_list_prefix('Targets.member')
|
||||
@ -455,6 +478,23 @@ DESCRIBE_TARGET_GROUPS_TEMPLATE = """<DescribeTargetGroupsResponse xmlns="http:/
|
||||
</DescribeTargetGroupsResponse>"""
|
||||
|
||||
|
||||
DESCRIBE_TARGET_GROUP_ATTRIBUTES_TEMPLATE = """<DescribeTargetGroupAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
|
||||
<DescribeTargetGroupAttributesResult>
|
||||
<Attributes>
|
||||
{% for key, value in attributes.items() %}
|
||||
<member>
|
||||
<Key>{{ key }}</Key>
|
||||
<Value>{{ value }}</Value>
|
||||
</member>
|
||||
{% endfor %}
|
||||
</Attributes>
|
||||
</DescribeTargetGroupAttributesResult>
|
||||
<ResponseMetadata>
|
||||
<RequestId>70092c0e-f3a9-11e5-ae48-cff02092876b</RequestId>
|
||||
</ResponseMetadata>
|
||||
</DescribeTargetGroupAttributesResponse>"""
|
||||
|
||||
|
||||
DESCRIBE_LISTENERS_TEMPLATE = """<DescribeLoadBalancersResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
|
||||
<DescribeListenersResult>
|
||||
<Listeners>
|
||||
@ -504,6 +544,22 @@ CONFIGURE_HEALTH_CHECK_TEMPLATE = """<ConfigureHealthCheckResponse xmlns="http:/
|
||||
</ResponseMetadata>
|
||||
</ConfigureHealthCheckResponse>"""
|
||||
|
||||
MODIFY_TARGET_GROUP_ATTRIBUTES_TEMPLATE = """<ModifyTargetGroupAttributesResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
|
||||
<ModifyTargetGroupAttributesResult>
|
||||
<Attributes>
|
||||
{% for key, value in attributes.items() %}
|
||||
<member>
|
||||
<Key>{{ key }}</Key>
|
||||
<Value>{{ value }}</Value>
|
||||
</member>
|
||||
{% endfor %}
|
||||
</Attributes>
|
||||
</ModifyTargetGroupAttributesResult>
|
||||
<ResponseMetadata>
|
||||
<RequestId>70092c0e-f3a9-11e5-ae48-cff02092876b</RequestId>
|
||||
</ResponseMetadata>
|
||||
</ModifyTargetGroupAttributesResponse>"""
|
||||
|
||||
REGISTER_TARGETS_TEMPLATE = """<RegisterTargetsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
|
||||
<RegisterTargetsResult>
|
||||
</RegisterTargetsResult>
|
||||
|
@ -445,3 +445,76 @@ def test_register_targets():
|
||||
|
||||
response = conn.describe_target_health(TargetGroupArn=target_group.get('TargetGroupArn'))
|
||||
response.get('TargetHealthDescriptions').should.have.length_of(1)
|
||||
|
||||
|
||||
@mock_ec2
|
||||
@mock_elbv2
|
||||
def test_target_group_attributes():
|
||||
conn = boto3.client('elbv2', region_name='us-east-1')
|
||||
ec2 = boto3.resource('ec2', region_name='us-east-1')
|
||||
|
||||
security_group = ec2.create_security_group(GroupName='a-security-group', Description='First One')
|
||||
vpc = ec2.create_vpc(CidrBlock='172.28.7.0/24', InstanceTenancy='default')
|
||||
subnet1 = ec2.create_subnet(VpcId=vpc.id, CidrBlock='172.28.7.192/26', AvailabilityZone='us-east-1a')
|
||||
subnet2 = ec2.create_subnet(VpcId=vpc.id, CidrBlock='172.28.7.192/26', AvailabilityZone='us-east-1b')
|
||||
|
||||
response = conn.create_load_balancer(
|
||||
Name='my-lb',
|
||||
Subnets=[subnet1.id, subnet2.id],
|
||||
SecurityGroups=[security_group.id],
|
||||
Scheme='internal',
|
||||
Tags=[{'Key': 'key_name', 'Value': 'a_value'}])
|
||||
|
||||
response = conn.create_target_group(
|
||||
Name='a-target',
|
||||
Protocol='HTTP',
|
||||
Port=8080,
|
||||
VpcId=vpc.id,
|
||||
HealthCheckProtocol='HTTP',
|
||||
HealthCheckPort='8080',
|
||||
HealthCheckPath='/',
|
||||
HealthCheckIntervalSeconds=5,
|
||||
HealthCheckTimeoutSeconds=5,
|
||||
HealthyThresholdCount=5,
|
||||
UnhealthyThresholdCount=2,
|
||||
Matcher={'HttpCode': '200'})
|
||||
target_group = response.get('TargetGroups')[0]
|
||||
|
||||
# Check it's in the describe_target_groups response
|
||||
response = conn.describe_target_groups()
|
||||
response.get('TargetGroups').should.have.length_of(1)
|
||||
target_group_arn = target_group['TargetGroupArn']
|
||||
|
||||
# The attributes should start with the two defaults
|
||||
response = conn.describe_target_group_attributes(TargetGroupArn=target_group_arn)
|
||||
response['Attributes'].should.have.length_of(2)
|
||||
attributes = {attr['Key']: attr['Value'] for attr in response['Attributes']}
|
||||
attributes['deregistration_delay.timeout_seconds'].should.equal('300')
|
||||
attributes['stickiness.enabled'].should.equal('false')
|
||||
|
||||
# Add cookie stickiness
|
||||
response = conn.modify_target_group_attributes(
|
||||
TargetGroupArn=target_group_arn,
|
||||
Attributes=[
|
||||
{
|
||||
'Key': 'stickiness.enabled',
|
||||
'Value': 'true',
|
||||
},
|
||||
{
|
||||
'Key': 'stickiness.type',
|
||||
'Value': 'lb_cookie',
|
||||
},
|
||||
])
|
||||
|
||||
# The response should have only the keys updated
|
||||
response['Attributes'].should.have.length_of(2)
|
||||
attributes = {attr['Key']: attr['Value'] for attr in response['Attributes']}
|
||||
attributes['stickiness.type'].should.equal('lb_cookie')
|
||||
attributes['stickiness.enabled'].should.equal('true')
|
||||
|
||||
# These new values should be in the full attribute list
|
||||
response = conn.describe_target_group_attributes(TargetGroupArn=target_group_arn)
|
||||
response['Attributes'].should.have.length_of(3)
|
||||
attributes = {attr['Key']: attr['Value'] for attr in response['Attributes']}
|
||||
attributes['stickiness.type'].should.equal('lb_cookie')
|
||||
attributes['stickiness.enabled'].should.equal('true')
|
||||
|
Loading…
Reference in New Issue
Block a user