Skip to content

Commit aed95bf

Browse files
authored
test: repository adopt-or-create (#137)
Issue [#2693](aws-controllers-k8s/community#2693) Description of changes: Add adopt-or-create test for ECR repository By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 5f5cd3a commit aed95bf

File tree

3 files changed

+128
-57
lines changed

3 files changed

+128
-57
lines changed

test/e2e/resources/repository.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ apiVersion: ecr.services.k8s.aws/v1alpha1
22
kind: Repository
33
metadata:
44
name: $REPOSITORY_NAME
5+
annotations:
6+
services.k8s.aws/deletion-policy: $DELETION_POLICY
57
spec:
68
name: $REPOSITORY_NAME
79
imageScanningConfiguration:
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: ecr.services.k8s.aws/v1alpha1
2+
kind: Repository
3+
metadata:
4+
name: $REPOSITORY_NAME
5+
annotations:
6+
services.k8s.aws/adoption-policy: adopt-or-create
7+
spec:
8+
name: $REPOSITORY_NAME
9+
imageScanningConfiguration:
10+
scanOnPush: false
11+
imageTagMutability: MUTABLE
12+
tags:
13+
# ensure we update after adoption
14+
- key: key
15+
value: val

test/e2e/tests/test_repository.py

Lines changed: 111 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
from acktest import tags as tagutil
2323
from acktest.resources import random_suffix_name
24+
from acktest import tags as tags
2425
from acktest.aws.identity import get_region, get_account_id
2526
from acktest.k8s import resource as k8s
2627
from e2e import service_marker, CRD_GROUP, CRD_VERSION, load_ecr_resource
@@ -43,6 +44,85 @@
4344
def 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
48128
class 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

Comments
 (0)