2121
2222from acktest import tags as tagutil
2323from acktest .resources import random_suffix_name
24+ from acktest import tags as tags
2425from acktest .aws .identity import get_region , get_account_id
2526from acktest .k8s import resource as k8s
2627from e2e import service_marker , CRD_GROUP , CRD_VERSION , load_ecr_resource
4344def minify_json_string (json_string : str ) -> str :
4445 return json_string .replace ("\n " , "" ).replace (" " , "" )
4546
47+ @pytest .fixture
48+ def repository (request ):
49+ resource_name = random_suffix_name ("ecr-repository" , 24 )
50+ replacements = REPLACEMENT_VALUES .copy ()
51+ replacements ["REPOSITORY_NAME" ] = resource_name
52+ replacements ["DELETION_POLICY" ] = "delete"
53+ # Load ECR CR
54+ resource_data = load_ecr_resource (
55+ "repository" ,
56+ additional_replacements = replacements ,
57+ )
58+ logging .debug (resource_data )
59+ # Create k8s resource
60+ ref = k8s .CustomResourceReference (
61+ CRD_GROUP , CRD_VERSION , RESOURCE_PLURAL ,
62+ resource_name , namespace = "default" ,
63+ )
64+ k8s .create_custom_resource (ref , resource_data )
65+ cr = k8s .wait_resource_consumed_by_controller (ref )
66+ assert cr is not None
67+ assert k8s .get_resource_exists (ref )
68+
69+ yield (ref , cr )
70+
71+ if k8s .get_resource_exists (ref ):
72+ # Delete k8s resource
73+ _ , deleted = k8s .delete_custom_resource (ref )
74+ assert deleted is True
75+
76+ @pytest .fixture
77+ def repository_adopt_or_create (request ):
78+ resource_name = random_suffix_name ("ecr-repository" , 24 )
79+ replacements = REPLACEMENT_VALUES .copy ()
80+ replacements ["REPOSITORY_NAME" ] = resource_name
81+ replacements ["DELETION_POLICY" ] = "retain"
82+ # Load ECR CR
83+ resource_data = load_ecr_resource (
84+ "repository" ,
85+ additional_replacements = replacements ,
86+ )
87+ logging .debug (resource_data )
88+ # Create k8s resource
89+ ref = k8s .CustomResourceReference (
90+ CRD_GROUP , CRD_VERSION , RESOURCE_PLURAL ,
91+ resource_name , namespace = "default" ,
92+ )
93+ k8s .create_custom_resource (ref , resource_data )
94+ cr = k8s .wait_resource_consumed_by_controller (ref )
95+ assert cr is not None
96+ assert k8s .get_resource_exists (ref )
97+ assert k8s .wait_on_condition (ref , "ACK.ResourceSynced" , "True" , wait_periods = 5 )
98+
99+ # Delete k8s resource
100+ _ , deleted = k8s .delete_custom_resource (ref )
101+ assert deleted is True
102+
103+ resource_data = load_ecr_resource (
104+ "repository_adopt_or_create" ,
105+ additional_replacements = replacements ,
106+ )
107+ logging .debug (resource_data )
108+ # Create k8s resource
109+ ref = k8s .CustomResourceReference (
110+ CRD_GROUP , CRD_VERSION , RESOURCE_PLURAL ,
111+ resource_name , namespace = "default" ,
112+ )
113+ k8s .create_custom_resource (ref , resource_data )
114+
115+ cr = k8s .wait_resource_consumed_by_controller (ref )
116+ assert cr is not None
117+ assert k8s .get_resource_exists (ref )
118+ yield (ref , cr )
119+
120+ # Delete k8s resource
121+ _ , deleted = k8s .delete_custom_resource (ref )
122+ assert deleted is True
123+
124+
125+
46126@service_marker
47127@pytest .mark .canary
48128class TestRepository :
@@ -99,33 +179,14 @@ def get_resource_tags(self, ecr_client, resource_arn: str):
99179 def repository_exists (self , ecr_client , repository_name : str ) -> bool :
100180 return self .get_repository (ecr_client , repository_name ) is not None
101181
102- def test_basic_repository (self , ecr_client ):
103- resource_name = random_suffix_name ( "ecr-repository" , 24 )
182+ def test_basic_repository (self , ecr_client , repository ):
183+ ( ref , cr ) = repository
104184
105- replacements = REPLACEMENT_VALUES .copy ()
106- replacements ["REPOSITORY_NAME" ] = resource_name
107- # Load ECR CR
108- resource_data = load_ecr_resource (
109- "repository" ,
110- additional_replacements = replacements ,
111- )
112- logging .debug (resource_data )
185+ assert k8s .wait_on_condition (ref , "ACK.ResourceSynced" , "True" , wait_periods = 5 )
113186
114- # Create k8s resource
115- ref = k8s .CustomResourceReference (
116- CRD_GROUP , CRD_VERSION , RESOURCE_PLURAL ,
117- resource_name , namespace = "default" ,
118- )
119- k8s .create_custom_resource (ref , resource_data )
120- cr = k8s .wait_resource_consumed_by_controller (ref )
121-
122- assert cr is not None
123- assert k8s .get_resource_exists (ref )
124-
125- time .sleep (CREATE_WAIT_AFTER_SECONDS )
126-
127- # Get latest repository CR
128- cr = k8s .wait_resource_consumed_by_controller (ref )
187+ assert 'spec' in cr
188+ assert 'name' in cr ['spec' ]
189+ resource_name = cr ['spec' ]['name' ]
129190
130191 # Check ECR repository exists
131192 exists = self .repository_exists (ecr_client , resource_name )
@@ -142,16 +203,28 @@ def test_basic_repository(self, ecr_client):
142203 repo = self .get_repository (ecr_client , resource_name )
143204 assert repo is not None
144205 assert repo ["imageScanningConfiguration" ]["scanOnPush" ] is True
206+
207+ def test_adopt_or_create_repository (self , ecr_client , repository_adopt_or_create ):
208+ (ref , cr ) = repository_adopt_or_create
209+ assert k8s .wait_on_condition (ref , "ACK.ResourceSynced" , "True" , wait_periods = 5 )
145210
146- # Delete k8s resource
147- _ , deleted = k8s . delete_custom_resource ( ref )
148- assert deleted is True
211+ assert 'spec' in cr
212+ assert 'name' in cr [ 'spec' ]
213+ resource_name = cr [ 'spec' ][ 'name' ]
149214
150- time .sleep (DELETE_WAIT_AFTER_SECONDS )
151-
152- # Check ECR repository doesn't exists
215+ # Check ECR repository exists
153216 exists = self .repository_exists (ecr_client , resource_name )
154- assert not exists
217+ assert exists
218+
219+ # ensure status fields are populated
220+ assert 'status' in cr
221+ assert 'repositoryURI' in cr ['status' ]
222+
223+ # Ensure we update tags after adoption
224+ repository_tags = tagutil .clean (self .get_resource_tags (ecr_client , cr ["status" ]["ackResourceMetadata" ]["arn" ]))
225+ desired_tags = cr ['spec' ]['tags' ]
226+ assert repository_tags [0 ]['Key' ] == desired_tags [0 ]['key' ]
227+ assert repository_tags [0 ]['Value' ] == desired_tags [0 ]['value' ]
155228
156229 def test_repository_lifecycle_policy (self , ecr_client ):
157230 resource_name = random_suffix_name ("ecr-repository" , 24 )
@@ -209,32 +282,13 @@ def test_repository_lifecycle_policy(self, ecr_client):
209282 exists = self .repository_exists (ecr_client , resource_name )
210283 assert not exists
211284
212- def test_repository_tags (self , ecr_client ):
213- resource_name = random_suffix_name ("ecr-repository" , 24 )
214-
215- replacements = REPLACEMENT_VALUES .copy ()
216- replacements ["REPOSITORY_NAME" ] = resource_name
217- # Load ECR CR
218- resource_data = load_ecr_resource (
219- "repository" ,
220- additional_replacements = replacements ,
221- )
222- logging .debug (resource_data )
223-
224- # Create k8s resource
225- ref = k8s .CustomResourceReference (
226- CRD_GROUP , CRD_VERSION , RESOURCE_PLURAL ,
227- resource_name , namespace = "default" ,
228- )
229- k8s .create_custom_resource (ref , resource_data )
230- cr = k8s .wait_resource_consumed_by_controller (ref )
231-
232- assert cr is not None
233- assert k8s .get_resource_exists (ref )
234-
235- time .sleep (CREATE_WAIT_AFTER_SECONDS )
285+ def test_repository_tags (self , ecr_client , repository ):
286+ (ref , cr ) = repository
287+ assert k8s .wait_on_condition (ref , "ACK.ResourceSynced" , "True" , wait_periods = 5 )
236288
237- cr = k8s .wait_resource_consumed_by_controller (ref )
289+ assert 'spec' in cr
290+ assert 'name' in cr ['spec' ]
291+ resource_name = cr ['spec' ]['name' ]
238292
239293 # Check ECR repository exists
240294 exists = self .repository_exists (ecr_client , resource_name )
0 commit comments