@@ -93,6 +93,55 @@ def simple_network_acl(request):
9393 except :
9494 pass
9595
96+ @pytest .fixture
97+ def network_acl_with_default_rules (request ):
98+ resource_name = random_suffix_name ("network-acl-default-rules" , 32 )
99+ resource_file = "network_acl_with_default_rules"
100+ resources = get_bootstrap_resources ()
101+
102+ replacements = REPLACEMENT_VALUES .copy ()
103+ replacements ["NETWORK_ACL_NAME" ] = resource_name
104+ replacements ["VPC_ID" ] = resources .SharedTestVPC .vpc_id
105+ replacements ["CIDR_BLOCK" ] = "10.0.0.0/24"
106+
107+ marker = request .node .get_closest_marker ("resource_data" )
108+ if marker is not None :
109+ data = marker .args [0 ]
110+ if 'vpc_id' in data :
111+ replacements ["VPC_ID" ] = data ['vpc_id' ]
112+ if 'cidr_block' in data :
113+ replacements ["CIDR_BLOCK" ] = data ['cidr_block' ]
114+ if 'resource_file' in data :
115+ resource_file = data ['resource_file' ]
116+
117+ # Load NetworkACL CR with default rules
118+ resource_data = load_ec2_resource (
119+ resource_file ,
120+ additional_replacements = replacements ,
121+ )
122+ logging .debug (resource_data )
123+
124+ # Create k8s resource
125+ ref = k8s .CustomResourceReference (
126+ CRD_GROUP , CRD_VERSION , RESOURCE_PLURAL ,
127+ resource_name , namespace = "default" ,
128+ )
129+ k8s .create_custom_resource (ref , resource_data )
130+ time .sleep (CREATE_WAIT_AFTER_SECONDS )
131+
132+ cr = k8s .wait_resource_consumed_by_controller (ref )
133+ assert cr is not None
134+ assert k8s .get_resource_exists (ref )
135+
136+ yield (ref , cr )
137+
138+ # Try to delete, if doesn't already exist
139+ try :
140+ _ , deleted = k8s .delete_custom_resource (ref , 3 , 10 )
141+ assert deleted
142+ except :
143+ pass
144+
96145@service_marker
97146@pytest .mark .canary
98147class TestNetworkACLs :
@@ -324,3 +373,77 @@ def test_crud_tags(self, ec2_client, simple_network_acl):
324373
325374 # Check networkAcl no longer exists in AWS
326375 ec2_validator .assert_network_acl (resource_id , exists = False )
376+
377+ def test_default_rules_not_duplicated_on_create (self , ec2_client , network_acl_with_default_rules ):
378+ (ref , cr ) = network_acl_with_default_rules
379+ network_acl_id = cr ["status" ]["id" ]
380+
381+ # Check NetworkACL exists in AWS
382+ ec2_validator = EC2Validator (ec2_client )
383+ ec2_validator .assert_network_acl (network_acl_id )
384+
385+ resource = k8s .get_resource (ref )
386+
387+ # Count how many rules with number 32767 exist in the spec
388+ default_rule_count = 0
389+ for entry in resource ["spec" ]["entries" ]:
390+ if entry .get ("ruleNumber" ) == 32767 :
391+ default_rule_count += 1
392+
393+ # default rules are no op
394+ assert default_rule_count == 2 , "Default rules should not be added to spec when not explicitly defined"
395+
396+ # Verify custom rule
397+ custom_rule_exists = False
398+ for entry in resource ["spec" ]["entries" ]:
399+ if entry .get ("ruleNumber" ) == 100 :
400+ custom_rule_exists = True
401+ break
402+
403+ assert custom_rule_exists , "Custom rule with ruleNumber 100 not found in spec"
404+
405+ # Clean up
406+ _ , deleted = k8s .delete_custom_resource (ref )
407+ assert deleted is True
408+
409+ time .sleep (DELETE_WAIT_AFTER_SECONDS )
410+
411+ # Verify the NetworkACL was deleted
412+ ec2_validator .assert_network_acl (network_acl_id , exists = False )
413+
414+ def test_default_rules_not_added_to_spec (self , ec2_client , simple_network_acl ):
415+ (ref , cr ) = simple_network_acl
416+ network_acl_id = cr ["status" ]["id" ]
417+
418+ # Check NetworkACL exists in AWS
419+ ec2_validator = EC2Validator (ec2_client )
420+ ec2_validator .assert_network_acl (network_acl_id )
421+
422+ resource = k8s .get_resource (ref )
423+
424+ # Count how many rules with number 32767 exist in the spec
425+ default_rule_count = 0
426+ for entry in resource ["spec" ]["entries" ]:
427+ if entry .get ("ruleNumber" ) == 32767 :
428+ default_rule_count += 1
429+
430+ # Verify no default rules were added to spec
431+ assert default_rule_count == 0 , "Default rules should not be added to spec when not explicitly defined"
432+
433+ # Verify custom rule exists
434+ custom_rule_exists = False
435+ for entry in resource ["spec" ]["entries" ]:
436+ if entry .get ("ruleNumber" ) == 100 :
437+ custom_rule_exists = True
438+ break
439+
440+ assert custom_rule_exists , "Custom rule with ruleNumber 100 not found in spec"
441+
442+ # Clean up
443+ _ , deleted = k8s .delete_custom_resource (ref )
444+ assert deleted is True
445+
446+ time .sleep (DELETE_WAIT_AFTER_SECONDS )
447+
448+ # Verify the NetworkACL was deleted
449+ ec2_validator .assert_network_acl (network_acl_id , exists = False )
0 commit comments