From 947004f2e6ed911fd85314b74a5d970c57c58971 Mon Sep 17 00:00:00 2001 From: Bharat Sinha Date: Tue, 15 Oct 2024 15:36:47 -0600 Subject: [PATCH] ELBv2: remove_tags() now throws a ResourceNotFound Exception (#8225) --- moto/elbv2/models.py | 1 + tests/test_elbv2/test_elbv2.py | 7 ++++ .../test_elbv2_listener_rule_tags.py | 35 +++++++++++++++++++ tests/test_elbv2/test_elbv2_listener_tags.py | 29 +++++++++++++++ tests/test_elbv2/test_elbv2_target_groups.py | 35 +++++++++++++++++++ 5 files changed, 107 insertions(+) diff --git a/moto/elbv2/models.py b/moto/elbv2/models.py index 961be5ee1fe3..f0b2e772c897 100644 --- a/moto/elbv2/models.py +++ b/moto/elbv2/models.py @@ -1990,6 +1990,7 @@ def add_tags(self, resource_arns: List[str], tags: List[Dict[str, str]]) -> None def remove_tags(self, resource_arns: List[str], tag_keys: List[str]) -> None: for arn in resource_arns: + self._get_resource_by_arn(arn) self.tagging_service.untag_resource_using_names(arn, tag_keys) def describe_tags(self, resource_arns: List[str]) -> Dict[str, Dict[str, str]]: diff --git a/tests/test_elbv2/test_elbv2.py b/tests/test_elbv2/test_elbv2.py index 5abc626c8bb6..512f31b39416 100644 --- a/tests/test_elbv2/test_elbv2.py +++ b/tests/test_elbv2/test_elbv2.py @@ -198,6 +198,13 @@ def test_add_remove_tags(): conn.remove_tags(ResourceArns=[lb["LoadBalancerArn"]], TagKeys=["a"]) + with pytest.raises(ClientError) as exc: + # add a random string in the ARN to make the resource non-existent + BAD_LB_ARN = lb["LoadBalancerArn"] + "randomstring" + conn.remove_tags(ResourceArns=[BAD_LB_ARN], TagKeys=["a"]) + err = exc.value.response["Error"] + assert err["Code"] == "LoadBalancerNotFound" + tags = { d["Key"]: d["Value"] for d in conn.describe_tags(ResourceArns=[lb["LoadBalancerArn"]])[ diff --git a/tests/test_elbv2/test_elbv2_listener_rule_tags.py b/tests/test_elbv2/test_elbv2_listener_rule_tags.py index 7a03da3091b4..02b5d1351cf4 100644 --- a/tests/test_elbv2/test_elbv2_listener_rule_tags.py +++ b/tests/test_elbv2/test_elbv2_listener_rule_tags.py @@ -1,3 +1,6 @@ +import pytest +from botocore.exceptions import ClientError + from moto import mock_aws from .test_elbv2 import create_load_balancer @@ -83,3 +86,35 @@ def test_listener_rule_add_remove_tags(): {"Key": "b", "Value": "b"}, {"Key": "c", "Value": "b"}, ] + + +@mock_aws +def test_remove_tags_to_invalid_listener_rule(): + response, _, _, _, _, elbv2 = create_load_balancer() + load_balancer_arn = response.get("LoadBalancers")[0].get("LoadBalancerArn") + + listener_arn = elbv2.create_listener( + LoadBalancerArn=load_balancer_arn, + Protocol="HTTP", + Port=80, + DefaultActions=[], + )["Listeners"][0]["ListenerArn"] + rule_arn = elbv2.create_rule( + ListenerArn=listener_arn, + Priority=100, + Conditions=[create_condition], + Actions=[default_action], + Tags=[{"Key": "k1", "Value": "v1"}], + )["Rules"][0]["RuleArn"] + + # add a random string in the ARN to make the resource non-existent + BAD_ARN = rule_arn + "randostring" + + # test for exceptions on remove tags + with pytest.raises(ClientError) as err: + elbv2.remove_tags(ResourceArns=[BAD_ARN], TagKeys=["a"]) + + assert err.value.response["Error"]["Code"] == "RuleNotFound" + assert ( + err.value.response["Error"]["Message"] == "The specified rule does not exist." + ) diff --git a/tests/test_elbv2/test_elbv2_listener_tags.py b/tests/test_elbv2/test_elbv2_listener_tags.py index 3b80537ce965..4c1fed73063a 100644 --- a/tests/test_elbv2/test_elbv2_listener_tags.py +++ b/tests/test_elbv2/test_elbv2_listener_tags.py @@ -1,3 +1,6 @@ +import pytest +from botocore.exceptions import ClientError + from moto import mock_aws from .test_elbv2 import create_load_balancer @@ -73,3 +76,29 @@ def test_listener_add_remove_tags(): {"Key": "b", "Value": "b"}, {"Key": "c", "Value": "b"}, ] + + +@mock_aws +def test_remove_tags_to_invalid_listener(): + response, _, _, _, _, elbv2 = create_load_balancer() + load_balancer_arn = response.get("LoadBalancers")[0].get("LoadBalancerArn") + + listener_arn = elbv2.create_listener( + LoadBalancerArn=load_balancer_arn, + Protocol="HTTP", + Port=80, + DefaultActions=[], + )["Listeners"][0]["ListenerArn"] + + # add a random string in the ARN to make the resource non-existent + BAD_ARN = listener_arn + "randomstring" + + # test for exceptions on remove tags + with pytest.raises(ClientError) as err: + elbv2.remove_tags(ResourceArns=[BAD_ARN], TagKeys=["a"]) + + assert err.value.response["Error"]["Code"] == "ListenerNotFound" + assert ( + err.value.response["Error"]["Message"] + == "The specified listener does not exist." + ) diff --git a/tests/test_elbv2/test_elbv2_target_groups.py b/tests/test_elbv2/test_elbv2_target_groups.py index eefbd4544299..d125d1f8ccc3 100644 --- a/tests/test_elbv2/test_elbv2_target_groups.py +++ b/tests/test_elbv2/test_elbv2_target_groups.py @@ -75,6 +75,41 @@ def test_create_target_group_with_tags(): assert tags == [{"Key": "key2", "Value": "val2"}] +@mock_aws +def test_remove_tags_to_invalid_target_group(): + response, vpc, _, _, _, elbv2 = create_load_balancer() + + response = elbv2.create_target_group( + Name="a-target", + Protocol="HTTP", + Port=8080, + VpcId=vpc.id, + HealthCheckProtocol="HTTP", + HealthCheckPort="8080", + HealthCheckPath="/", + HealthCheckIntervalSeconds=5, + HealthCheckTimeoutSeconds=3, + HealthyThresholdCount=5, + UnhealthyThresholdCount=2, + Matcher={"HttpCode": "200"}, + Tags=[{"Key": "key1", "Value": "val1"}], + ) + target_group = response["TargetGroups"][0] + target_group_arn = target_group["TargetGroupArn"] + + # add a random string in the ARN to make the resource non-existent + BAD_ARN = target_group_arn + "randomstring" + + # test for exceptions on remove tags + with pytest.raises(ClientError) as err: + elbv2.remove_tags(ResourceArns=[BAD_ARN], TagKeys=["a"]) + + assert err.value.response["Error"]["Code"] == "TargetGroupNotFound" + assert ( + err.value.response["Error"]["Message"] == "One or more target groups not found" + ) + + @mock_aws def test_create_target_group_and_listeners(): response, vpc, _, _, _, conn = create_load_balancer()