From 17f2a13573c312d349af986db6805ef3fe8596a4 Mon Sep 17 00:00:00 2001 From: Bert Blommers Date: Wed, 17 Nov 2021 20:36:20 -0100 Subject: [PATCH] ELBv2 - Store default action when modifying listener (#4589) --- moto/elbv2/models.py | 1 + moto/elbv2/responses.py | 2 +- tests/test_elbv2/test_elbv2_target_groups.py | 49 ++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/moto/elbv2/models.py b/moto/elbv2/models.py index 137c1642e..30f2ff240 100644 --- a/moto/elbv2/models.py +++ b/moto/elbv2/models.py @@ -1423,6 +1423,7 @@ Member must satisfy regular expression pattern: {}".format( if default_actions is not None and default_actions != []: # Is currently not validated listener.default_actions = default_actions + listener._default_rule[0].actions = default_actions return listener diff --git a/moto/elbv2/responses.py b/moto/elbv2/responses.py index ed1ea3834..9266065ec 100644 --- a/moto/elbv2/responses.py +++ b/moto/elbv2/responses.py @@ -607,7 +607,7 @@ class ELBV2Response(BaseResponse): 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") + default_actions = self._get_params().get("DefaultActions", []) # Should really move SSL Policies to models if ssl_policy is not None and ssl_policy not in [ diff --git a/tests/test_elbv2/test_elbv2_target_groups.py b/tests/test_elbv2/test_elbv2_target_groups.py index eb077436d..472b910c1 100644 --- a/tests/test_elbv2/test_elbv2_target_groups.py +++ b/tests/test_elbv2/test_elbv2_target_groups.py @@ -521,3 +521,52 @@ def test_create_target_group_with_target_type(target_type): group.should.have.key("TargetType").equal(target_type) group.shouldnt.have.key("Protocol") group.shouldnt.have.key("VpcId") + + +@mock_elbv2 +@mock_ec2 +def test_delete_target_group_after_modifying_listener(): + client = boto3.client("elbv2", region_name="us-east-1") + + response, vpc, _, _, _, conn = create_load_balancer() + + load_balancer_arn = response.get("LoadBalancers")[0].get("LoadBalancerArn") + + response = client.create_target_group( + Name="a-target", Protocol="HTTP", Port=8080, VpcId=vpc.id, + ) + target_group_arn1 = response.get("TargetGroups")[0]["TargetGroupArn"] + + response = client.create_target_group( + Name="a-target-2", Protocol="HTTPS", Port=8081, VpcId=vpc.id, + ) + target_group_arn2 = response.get("TargetGroups")[0]["TargetGroupArn"] + + response = conn.create_listener( + LoadBalancerArn=load_balancer_arn, + Protocol="HTTP", + Port=80, + DefaultActions=[{"Type": "forward", "TargetGroupArn": target_group_arn1}], + ) + listener_arn = response["Listeners"][0].get("ListenerArn") + + client.modify_listener( + ListenerArn=listener_arn, + DefaultActions=[{"Type": "forward", "TargetGroupArn": target_group_arn2,}], + ) + + response = conn.describe_listeners(LoadBalancerArn=load_balancer_arn) + default_actions = response["Listeners"][0]["DefaultActions"] + default_actions.should.equal( + [{"Type": "forward", "TargetGroupArn": target_group_arn2}] + ) + + # Target Group 1 can now be deleted, as the LB points to group 2 + client.delete_target_group(TargetGroupArn=target_group_arn1) + + # Sanity check - we're still pointing to group 2 + response = conn.describe_listeners(LoadBalancerArn=load_balancer_arn) + default_actions = response["Listeners"][0]["DefaultActions"] + default_actions.should.equal( + [{"Type": "forward", "TargetGroupArn": target_group_arn2}] + )