4
4
import pytest
5
5
6
6
from localstack .aws .api .route53resolver import (
7
+ Action ,
7
8
ListResolverEndpointsResponse ,
8
9
ListResolverQueryLogConfigsResponse ,
9
10
ListResolverRuleAssociationsResponse ,
@@ -23,6 +24,27 @@ def route53resolver_api_snapshot_transformer(snapshot):
23
24
snapshot .add_transformer (snapshot .transform .route53resolver_api ())
24
25
25
26
27
+ @pytest .fixture
28
+ def create_firewall_rule (aws_client : ServiceLevelClientFactory ):
29
+ rules = []
30
+
31
+ def inner (** kwargs ):
32
+ kwargs .setdefault ("Name" , f"rule-name-{ short_uid ()} " )
33
+ rule_group_id = kwargs ["FirewallRuleGroupId" ]
34
+ domain_list_id = kwargs ["FirewallDomainListId" ]
35
+ response = aws_client .route53resolver .create_firewall_rule (** kwargs )
36
+ rules .append ((rule_group_id , domain_list_id ))
37
+ return response
38
+
39
+ yield inner
40
+
41
+ for rule_group_id , domain_list_id in rules [::- 1 ]:
42
+ aws_client .route53resolver .delete_firewall_rule (
43
+ FirewallRuleGroupId = rule_group_id ,
44
+ FirewallDomainListId = domain_list_id ,
45
+ )
46
+
47
+
26
48
# TODO: extract this somewhere so that we can reuse it in other places
27
49
def _cleanup_vpc (aws_client : ServiceLevelClientFactory , vpc_id : str ):
28
50
"""
@@ -721,3 +743,125 @@ def test_list_firewall_domain_lists(self, cleanups, snapshot, aws_client):
721
743
722
744
tag_result = aws_client .route53resolver .list_tags_for_resource (ResourceArn = arn )
723
745
snapshot .match ("list-tags-for-resource" , tag_result )
746
+
747
+ @markers .aws .validated
748
+ @markers .snapshot .skip_snapshot_verify (paths = ["$..Message" ])
749
+ def test_list_firewall_rules_for_missing_rule_group (self , snapshot , aws_client ):
750
+ """Test listing firewall rules for a non-existing rule-group."""
751
+ with pytest .raises (
752
+ aws_client .route53resolver .exceptions .ResourceNotFoundException
753
+ ) as resource_not_found :
754
+ aws_client .route53resolver .list_firewall_rules (FirewallRuleGroupId = "missing-id" )
755
+
756
+ snapshot .add_transformer (
757
+ snapshot .transform .regex (r"\d{1}-[a-f0-9]{8}-[a-f0-9]{24}" , "trace-id" )
758
+ )
759
+ snapshot .match ("missing-firewall-rule-group-id" , resource_not_found .value .response )
760
+
761
+ @markers .aws .validated
762
+ def test_list_firewall_rules_for_empty_rule_group (self , cleanups , snapshot , aws_client ):
763
+ snapshot .add_transformer (snapshot .transform .key_value ("Name" ))
764
+
765
+ rule_group_response = aws_client .route53resolver .create_firewall_rule_group (
766
+ Name = f"empty-{ short_uid ()} "
767
+ )
768
+ cleanups .append (
769
+ lambda : aws_client .route53resolver .delete_firewall_rule_group (
770
+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ]
771
+ )
772
+ )
773
+ snapshot .match ("create-firewall-rule-group" , rule_group_response )
774
+
775
+ response = aws_client .route53resolver .list_firewall_rules (
776
+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ]
777
+ )
778
+ snapshot .match ("empty-firewall-rule-group" , response )
779
+
780
+ @markers .aws .validated
781
+ @markers .snapshot .skip_snapshot_verify (paths = ["$..FirewallDomainRedirectionAction" ])
782
+ def test_list_firewall_rules (
783
+ self ,
784
+ cleanups ,
785
+ snapshot ,
786
+ aws_client ,
787
+ create_firewall_rule ,
788
+ ):
789
+ """Test listing firewall rules.
790
+
791
+ We test listing:
792
+ - all rules in the rule-group
793
+ - rules filtered by priority
794
+ - rules filtered by action
795
+ - rules filtered by priority and action
796
+ """
797
+
798
+ snapshot .add_transformer (
799
+ [
800
+ snapshot .transform .key_value ("Name" ),
801
+ snapshot .transform .key_value ("FirewallRuleGroupId" ),
802
+ snapshot .transform .key_value ("FirewallDomainListId" ),
803
+ ]
804
+ )
805
+
806
+ firewall_rule_group_name = f"fw-rule-group-{ short_uid ()} "
807
+ rule_group_response = aws_client .route53resolver .create_firewall_rule_group (
808
+ Name = firewall_rule_group_name
809
+ )
810
+ cleanups .append (
811
+ lambda rule_group_id = rule_group_response ["FirewallRuleGroup" ][
812
+ "Id"
813
+ ]: aws_client .route53resolver .delete_firewall_rule_group (
814
+ FirewallRuleGroupId = rule_group_id
815
+ )
816
+ )
817
+ # Parameters for creating resources
818
+ priorities = [1 , 2 , 3 , 4 ]
819
+ actions = [Action .ALLOW , Action .ALERT , Action .ALERT , Action .ALLOW ]
820
+
821
+ for action , priority in zip (actions , priorities ):
822
+ domain_list_response = aws_client .route53resolver .create_firewall_domain_list (
823
+ Name = f"fw-domain-list-{ short_uid ()} "
824
+ )
825
+ cleanups .append (
826
+ lambda domain_list_id = domain_list_response ["FirewallDomainList" ][
827
+ "Id"
828
+ ]: aws_client .route53resolver .delete_firewall_domain_list (
829
+ FirewallDomainListId = domain_list_id
830
+ )
831
+ )
832
+ create_firewall_rule (
833
+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ],
834
+ FirewallDomainListId = domain_list_response ["FirewallDomainList" ]["Id" ],
835
+ Priority = priority ,
836
+ Action = action ,
837
+ )
838
+
839
+ # Check list filtering
840
+ list_all_response = aws_client .route53resolver .list_firewall_rules (
841
+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ]
842
+ )
843
+ snapshot .match ("firewall-rules-list-all" , list_all_response )
844
+
845
+ filter_by_priority_response = aws_client .route53resolver .list_firewall_rules (
846
+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ], Priority = 1
847
+ )
848
+ snapshot .match ("firewall-rules-list-by-priority" , filter_by_priority_response )
849
+
850
+ filter_by_action_response = aws_client .route53resolver .list_firewall_rules (
851
+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ], Action = Action .ALLOW
852
+ )
853
+ snapshot .match ("firewall-rules-list-by-action" , filter_by_action_response )
854
+
855
+ action_and_priority_response = aws_client .route53resolver .list_firewall_rules (
856
+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ],
857
+ Action = Action .ALLOW ,
858
+ Priority = 4 ,
859
+ )
860
+ snapshot .match ("firewall-rules-list-by-action-and-priority" , action_and_priority_response )
861
+
862
+ filter_empty_response = aws_client .route53resolver .list_firewall_rules (
863
+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ],
864
+ Action = Action .ALLOW ,
865
+ Priority = 0 , # 0 catches cases when integers pose as booleans
866
+ )
867
+ snapshot .match ("firewall-rules-list-no-match" , filter_empty_response )
0 commit comments