2727from e2e .tests .helper import EC2Validator
2828
2929CREATE_WAIT_AFTER_SECONDS = 20
30+ MODIFY_WAIT_AFTER_SECONDS = 30
3031DELETE_WAIT_AFTER_SECONDS = 10
3132DELETE_TIMEOUT_SECONDS = 300
3233
@@ -167,4 +168,119 @@ def test_references(self, ec2_client):
167168 ec2_validator .assert_vpc_endpoint (vpc_endpoint_id , exists = False )
168169 ec2_validator .assert_subnet (subnet_id , exists = False )
169170 ec2_validator .assert_security_group (sg_id , exists = False )
170- ec2_validator .assert_vpc (vpc_id , exists = False )
171+ ec2_validator .assert_vpc (vpc_id , exists = False )
172+
173+ def test_array_references (self , ec2_client ):
174+ route_table_name = random_suffix_name ("route-table-test" , 24 )
175+ vpc_name = random_suffix_name ("vpc-ref-test" , 24 )
176+ gateway_name = random_suffix_name ("gateway-ref-test" , 24 )
177+
178+ test_values = REPLACEMENT_VALUES .copy ()
179+ test_values ["ROUTE_TABLE_NAME" ] = route_table_name
180+ test_values ["DEST_CIDR_BLOCK" ] = "0.0.0.0/0"
181+ test_values ["INTERNET_GATEWAY_NAME" ] = gateway_name
182+ test_values ["VPC_NAME" ] = vpc_name
183+ test_values ["CIDR_BLOCK" ] = "10.0.0.0/16"
184+ test_values ["ENABLE_DNS_SUPPORT" ] = "False"
185+ test_values ["ENABLE_DNS_HOSTNAMES" ] = "False"
186+ test_values ["DISALLOW_DEFAULT_SECURITY_GROUP_RULE" ] = "False"
187+
188+ # Load CRs
189+ route_table_resource_data = load_ec2_resource (
190+ "route_table_ref" ,
191+ additional_replacements = test_values
192+ )
193+ vpc_resource_data = load_ec2_resource (
194+ "vpc" ,
195+ additional_replacements = test_values
196+ )
197+ gateway_resource_data = load_ec2_resource (
198+ "internet_gateway_ref" ,
199+ additional_replacements = test_values
200+ )
201+
202+ # This test creates resources in order,
203+
204+ # Create VPC
205+ vpc_ref = k8s .CustomResourceReference (
206+ CRD_GROUP , CRD_VERSION , 'vpcs' ,
207+ vpc_name , namespace = "default" ,
208+ )
209+ k8s .create_custom_resource (vpc_ref , vpc_resource_data )
210+
211+ # Create Internet Gateway
212+ gateway_ref = k8s .CustomResourceReference (
213+ CRD_GROUP , CRD_VERSION , 'internetgateways' ,
214+ gateway_name , namespace = "default" ,
215+ )
216+ k8s .create_custom_resource (gateway_ref , gateway_resource_data )
217+
218+ # Create route table
219+ route_table_ref = k8s .CustomResourceReference (
220+ CRD_GROUP , CRD_VERSION , 'routetables' ,
221+ route_table_name , namespace = "default" ,
222+ )
223+ k8s .create_custom_resource (route_table_ref , route_table_resource_data )
224+
225+ # Wait a few seconds so resources are synced
226+ time .sleep (CREATE_WAIT_AFTER_SECONDS )
227+ assert k8s .wait_on_condition (vpc_ref , "ACK.ResourceSynced" , "True" , wait_periods = 5 )
228+ assert k8s .wait_on_condition (gateway_ref , "ACK.ResourceSynced" , "True" , wait_periods = 5 )
229+ assert k8s .wait_on_condition (route_table_ref , "ACK.ResourceSynced" , "True" , wait_periods = 10 )
230+
231+ assert k8s .wait_on_condition (gateway_ref , "ACK.ReferencesResolved" , "True" , wait_periods = 5 )
232+ assert k8s .wait_on_condition (route_table_ref , "ACK.ReferencesResolved" , "True" , wait_periods = 10 )
233+
234+ # Acquire Internet Gateway ID
235+ gateway_cr = k8s .get_resource (gateway_ref )
236+ assert 'status' in gateway_cr
237+ gateway_id = gateway_cr ["status" ]["internetGatewayID" ]
238+
239+ # Ensure routetable contains reference in spec
240+ route_table_cr = k8s .get_resource (route_table_ref )
241+ assert 'spec' in route_table_cr
242+ assert 'vpcRef' in route_table_cr ['spec' ]
243+ assert route_table_cr ['spec' ]['vpcRef' ]['from' ]['name' ] == vpc_name
244+ assert 'routes' in route_table_cr ['spec' ]
245+ assert len (route_table_cr ['spec' ]['routes' ]) == 1
246+ assert 'gatewayID' not in route_table_cr ['spec' ]['routes' ][0 ]
247+ assert 'gatewayRef' in route_table_cr ['spec' ]['routes' ][0 ]
248+ assert route_table_cr ['spec' ]['routes' ][0 ]['gatewayRef' ]['from' ]['name' ] == gateway_name
249+ assert 'status' in route_table_cr
250+ assert 'routeStatuses' in route_table_cr ['status' ]
251+ found_gateway_id = False
252+ for rs in route_table_cr ['status' ]['routeStatuses' ]:
253+ if 'gatewayID' in rs and rs ['gatewayID' ] == gateway_id :
254+ found_gateway_id = True
255+ assert found_gateway_id
256+
257+ user_tag = {
258+ "tag" : "my_tag" ,
259+ "value" : "my_val"
260+ }
261+ route_table_update = {
262+ 'spec' : {
263+ 'tags' : [user_tag ]
264+ }
265+ }
266+ k8s .patch_custom_resource (route_table_ref , route_table_update )
267+ time .sleep (MODIFY_WAIT_AFTER_SECONDS )
268+ assert k8s .wait_on_condition (route_table_ref , "ACK.ResourceSynced" , "True" , wait_periods = 5 )
269+ assert k8s .wait_on_condition (route_table_ref , "ACK.ReferencesResolved" , "True" , wait_periods = 5 )
270+
271+ # Ensure that the reference has not changed
272+ route_table_cr = k8s .get_resource (route_table_ref )
273+ assert 'spec' in route_table_cr
274+ assert 'routes' in route_table_cr ['spec' ]
275+ assert len (route_table_cr ['spec' ]['routes' ]) == 1
276+ assert 'gatewayID' not in route_table_cr ['spec' ]['routes' ][0 ]
277+ assert 'gatewayRef' in route_table_cr ['spec' ]['routes' ][0 ]
278+ assert route_table_cr ['spec' ]['routes' ][0 ]['gatewayRef' ]['from' ]['name' ] == gateway_name
279+
280+ # Delete All
281+ _ , deleted = k8s .delete_custom_resource (route_table_ref )
282+ assert deleted
283+ _ , deleted = k8s .delete_custom_resource (gateway_ref )
284+ assert deleted
285+ _ , deleted = k8s .delete_custom_resource (vpc_ref )
286+ assert deleted
0 commit comments