Skip to content

Commit a00b903

Browse files
authored
Cherrypick: Refactor e2e deletion and unmark adopted Endpoint Test (#216) (#219)
Issue #, if available: Description of changes: Disabling the adopted endpoint test as canary since this does not provide value for a canary, will keep as e2e test. Refactors ``` if k8s.get_resource_exists(reference): _, deleted = k8s.delete_custom_resource(reference, cfg.JOB_DELETE_WAIT_PERIODS, cfg.JOB_DELETE_WAIT_LENGTH) > assert deleted ``` into a shared method, and adds a retry loop for this assert. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license. Issue #, if available: Description of changes: By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 970db78 commit a00b903

27 files changed

+284
-230
lines changed

test/e2e/__init__.py

+14
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import random
2424

2525
from acktest.k8s import resource as k8s
26+
from common import config as cfg
27+
2628

2729
SERVICE_NAME = "sagemaker"
2830
CRD_GROUP = "sagemaker.services.k8s.aws"
@@ -372,3 +374,15 @@ def get_sagemaker_pipeline(pipeline_name: str):
372374
f"SageMaker could not find a pipeline with the name {pipeline_name}. Error {error}"
373375
)
374376
return None
377+
378+
379+
def delete_custom_resource(
380+
reference,
381+
wait_period=cfg.JOB_DELETE_WAIT_PERIODS,
382+
wait_length=cfg.JOB_DELETE_WAIT_LENGTH,
383+
):
384+
deleted = True
385+
386+
if k8s.get_resource_exists(reference):
387+
_, deleted = k8s.delete_custom_resource(reference, wait_period, wait_length)
388+
return deleted

test/e2e/common/config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
DELETE_WAIT_PERIOD = 4
3737
DELETE_WAIT_LENGTH = 30
3838

39-
JOB_DELETE_WAIT_PERIODS = 12
39+
JOB_DELETE_WAIT_PERIODS = 18
4040
JOB_DELETE_WAIT_LENGTH = 30
4141

4242
TAG_DELAY_SLEEP = 20

test/e2e/common/fixtures.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import logging
1818
from e2e import (
1919
create_sagemaker_resource,
20+
delete_custom_resource,
2021
wait_sagemaker_endpoint_status,
2122
)
2223

@@ -91,8 +92,9 @@ def xgboost_churn_endpoint(sagemaker_client):
9192
yield endpoint_spec
9293

9394
for cr in (model_reference, endpoint_config_reference, endpoint_reference):
94-
_, deleted = k8s.delete_custom_resource(cr, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH)
95-
assert deleted
95+
assert delete_custom_resource(
96+
cr, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
97+
)
9698

9799

98100
@pytest.fixture(scope="module")
@@ -118,6 +120,6 @@ def xgboost_churn_data_quality_job_definition(xgboost_churn_endpoint):
118120

119121
yield (job_definition_reference, resource)
120122

121-
if k8s.get_resource_exists(job_definition_reference):
122-
_, deleted = k8s.delete_custom_resource(job_definition_reference, 3, 10)
123-
assert deleted
123+
assert delete_custom_resource(
124+
job_definition_reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
125+
)

test/e2e/tests/test_adopt_endpoint.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
CRD_VERSION,
2626
create_adopted_resource,
2727
wait_sagemaker_endpoint_status,
28+
delete_custom_resource,
2829
assert_endpoint_status_in_sync,
2930
sagemaker_client,
3031
get_sagemaker_endpoint,
@@ -169,13 +170,12 @@ def adopted_endpoint(sdk_endpoint):
169170
yield (adopt_model_reference, adopt_config_reference, adopt_endpoint_reference)
170171

171172
for cr in (adopt_model_reference, adopt_config_reference, adopt_endpoint_reference):
172-
if k8s.get_resource_exists(cr):
173-
_, deleted = k8s.delete_custom_resource(cr, 3, 10)
174-
assert deleted
173+
assert delete_custom_resource(
174+
cr, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
175+
)
175176

176177

177178
@service_marker
178-
@pytest.mark.canary
179179
class TestAdoptedEndpoint:
180180
def test_smoke(self, sdk_endpoint, adopted_endpoint):
181181
(
@@ -264,12 +264,13 @@ def test_smoke(self, sdk_endpoint, adopted_endpoint):
264264
)
265265

266266
assert_endpoint_status_in_sync(
267-
endpoint_name, endpoint_reference, cfg.ENDPOINT_STATUS_INSERVICE,
267+
endpoint_name,
268+
endpoint_reference,
269+
cfg.ENDPOINT_STATUS_INSERVICE,
268270
)
269271
assert k8s.wait_on_condition(endpoint_reference, "ACK.ResourceSynced", "True")
270272

271273
for cr in (model_reference, config_reference, endpoint_reference):
272-
_, deleted = k8s.delete_custom_resource(
274+
assert delete_custom_resource(
273275
cr, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
274276
)
275-
assert deleted

test/e2e/tests/test_adopt_model_package.py

+20-11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
create_adopted_resource,
2626
wait_sagemaker_model_package_status,
2727
assert_model_package_status_in_sync,
28+
delete_custom_resource,
2829
get_sagemaker_model_package_group,
2930
get_sagemaker_model_package,
3031
sagemaker_client,
@@ -62,8 +63,12 @@ def sdk_make_model_package(model_package_group_name):
6263
"ModelDataUrl": f"s3://{data_bucket}/sagemaker/model/xgboost-mnist-model.tar.gz",
6364
}
6465
],
65-
"SupportedContentTypes": ["text/csv",],
66-
"SupportedResponseMIMETypes": ["text/csv",],
66+
"SupportedContentTypes": [
67+
"text/csv",
68+
],
69+
"SupportedResponseMIMETypes": [
70+
"text/csv",
71+
],
6772
},
6873
}
6974

@@ -126,7 +131,9 @@ def adopted_model_package(sdk_model_package):
126131
adopt_model_package_group_reference,
127132
_,
128133
adopt_model_package_group_resource,
129-
) = create_adopted_resource(replacements=replacements,)
134+
) = create_adopted_resource(
135+
replacements=replacements,
136+
)
130137
assert adopt_model_package_group_resource is not None
131138

132139
# adopt model package
@@ -144,16 +151,17 @@ def adopted_model_package(sdk_model_package):
144151
_,
145152
adopt_model_package_resource,
146153
) = create_adopted_resource(
147-
replacements=replacements, spec_file="adopted_resource_base_arn",
154+
replacements=replacements,
155+
spec_file="adopted_resource_base_arn",
148156
)
149157
assert adopt_model_package_resource is not None
150158

151159
yield (adopt_model_package_group_reference, adopt_model_package_reference)
152160

153161
for cr in (adopt_model_package_group_reference, adopt_model_package_reference):
154-
if k8s.get_resource_exists(cr):
155-
_, deleted = k8s.delete_custom_resource(cr, 3, 10)
156-
assert deleted
162+
assert delete_custom_resource(
163+
cr, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
164+
)
157165

158166

159167
@service_marker
@@ -236,14 +244,15 @@ def test_smoke(self, sdk_model_package, adopted_model_package):
236244
) == model_package_response.get("ModelPackageArn", None)
237245

238246
assert_model_package_status_in_sync(
239-
model_package_arn, model_package_reference, cfg.JOB_STATUS_COMPLETED,
247+
model_package_arn,
248+
model_package_reference,
249+
cfg.JOB_STATUS_COMPLETED,
240250
)
241251
assert k8s.wait_on_condition(
242252
model_package_reference, "ACK.ResourceSynced", "True"
243253
)
244254

245255
for cr in (model_package_reference, model_package_group_reference):
246-
_, deleted = k8s.delete_custom_resource(
247-
cr, cfg.JOB_DELETE_WAIT_PERIODS, cfg.JOB_DELETE_WAIT_LENGTH
256+
assert delete_custom_resource(
257+
cr, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
248258
)
249-
assert deleted

test/e2e/tests/test_cross_region.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from e2e import (
2525
service_marker,
2626
create_sagemaker_resource,
27+
delete_custom_resource,
2728
get_sagemaker_model,
2829
sagemaker_client,
2930
)
@@ -54,9 +55,9 @@ def cross_region_model():
5455
yield (reference, resource)
5556

5657
# Delete the k8s resource if not already deleted by tests
57-
if k8s.get_resource_exists(reference):
58-
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
59-
assert deleted
58+
assert delete_custom_resource(
59+
reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
60+
)
6061

6162

6263
def get_cross_region():
@@ -79,7 +80,8 @@ def test_create_cross_region_model(self, cross_region_model):
7980
assert k8s.get_resource_arn(resource) == cross_region_model_arn
8081

8182
# Delete the k8s resource.
82-
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
83-
assert deleted
83+
assert delete_custom_resource(
84+
reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
85+
)
8486

8587
assert get_sagemaker_model(model_name, sm_client) is None

test/e2e/tests/test_data_quality_job_definition.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
)
2626
from e2e.common import config as cfg
2727
from acktest.k8s import resource as k8s
28+
from e2e import delete_custom_resource
2829

2930
# Access variable so it is loaded as a fixture
3031
_accessed = xgboost_churn_data_quality_job_definition, xgboost_churn_endpoint
@@ -63,8 +64,9 @@ def test_smoke(self, sagemaker_client, xgboost_churn_data_quality_job_definition
6364
resource_tags = resource["spec"].get("tags", None)
6465
assert_tags_in_sync(job_definition_arn, resource_tags)
6566
# Delete the k8s resource.
66-
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
67-
assert deleted
67+
assert delete_custom_resource(
68+
reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
69+
)
6870
assert (
6971
describe_sagemaker_data_quality_job_definition(
7072
sagemaker_client, job_definition_name

test/e2e/tests/test_endpoint.py

+27-14
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from e2e import (
2626
service_marker,
2727
create_sagemaker_resource,
28+
delete_custom_resource,
2829
assert_endpoint_status_in_sync,
2930
assert_tags_in_sync,
3031
get_sagemaker_endpoint,
@@ -65,7 +66,9 @@ def single_container_model(name_suffix):
6566

6667
yield (model_reference, model_resource)
6768

68-
_, deleted = k8s.delete_custom_resource(model_reference, 3, 10)
69+
_, deleted = k8s.delete_custom_resource(
70+
model_reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
71+
)
6972
assert deleted
7073

7174

@@ -94,7 +97,9 @@ def multi_variant_config(name_suffix, single_container_model):
9497

9598
yield (config_reference, config_resource)
9699

97-
_, deleted = k8s.delete_custom_resource(config_reference, 3, 10)
100+
_, deleted = k8s.delete_custom_resource(
101+
config_reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
102+
)
98103
assert deleted
99104

100105

@@ -123,7 +128,9 @@ def single_variant_config(name_suffix, single_container_model):
123128

124129
yield (config_reference, config_resource)
125130

126-
_, deleted = k8s.delete_custom_resource(config_reference, 3, 10)
131+
_, deleted = k8s.delete_custom_resource(
132+
config_reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
133+
)
127134
assert deleted
128135

129136

@@ -149,10 +156,7 @@ def xgboost_endpoint(name_suffix, single_variant_config):
149156
yield (reference, resource, spec)
150157

151158
# Delete the k8s resource if not already deleted by tests
152-
if k8s.get_resource_exists(reference):
153-
# longer wait incase endpoint is in creating/updating status
154-
_, deleted = k8s.delete_custom_resource(reference, 40, cfg.DELETE_WAIT_LENGTH)
155-
assert deleted
159+
assert delete_custom_resource(reference, 40, cfg.DELETE_WAIT_LENGTH)
156160

157161

158162
@pytest.fixture(scope="module")
@@ -207,7 +211,9 @@ def faulty_config(name_suffix, single_container_model):
207211
yield (config_reference, config_resource)
208212

209213
for cr in (model_reference, config_reference):
210-
_, deleted = k8s.delete_custom_resource(cr, 3, 10)
214+
_, deleted = k8s.delete_custom_resource(
215+
cr, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
216+
)
211217
assert deleted
212218

213219

@@ -255,7 +261,9 @@ def update_endpoint_failed_test(
255261

256262
# endpoint transitions Updating -> InService state
257263
assert_endpoint_status_in_sync(
258-
endpoint_reference.name, endpoint_reference, cfg.ENDPOINT_STATUS_UPDATING,
264+
endpoint_reference.name,
265+
endpoint_reference,
266+
cfg.ENDPOINT_STATUS_UPDATING,
259267
)
260268
assert k8s.wait_on_condition(endpoint_reference, "ACK.ResourceSynced", "False")
261269
endpoint_resource = k8s.get_resource(endpoint_reference)
@@ -264,7 +272,9 @@ def update_endpoint_failed_test(
264272
assert annotations[LAST_ENDPOINTCONFIG_UPDATE_ANNOTATION] == faulty_config_name
265273

266274
assert_endpoint_status_in_sync(
267-
endpoint_reference.name, endpoint_reference, cfg.ENDPOINT_STATUS_INSERVICE,
275+
endpoint_reference.name,
276+
endpoint_reference,
277+
cfg.ENDPOINT_STATUS_INSERVICE,
268278
)
269279

270280
assert k8s.wait_on_condition(endpoint_reference, "ACK.ResourceSynced", "False")
@@ -302,7 +312,9 @@ def update_endpoint_successful_test(self, multi_variant_config, xgboost_endpoint
302312

303313
# endpoint transitions Updating -> InService state
304314
assert_endpoint_status_in_sync(
305-
endpoint_reference.name, endpoint_reference, cfg.ENDPOINT_STATUS_UPDATING,
315+
endpoint_reference.name,
316+
endpoint_reference,
317+
cfg.ENDPOINT_STATUS_UPDATING,
306318
)
307319

308320
assert k8s.wait_on_condition(endpoint_reference, "ACK.ResourceSynced", "False")
@@ -313,7 +325,9 @@ def update_endpoint_successful_test(self, multi_variant_config, xgboost_endpoint
313325
assert annotations[LAST_ENDPOINTCONFIG_UPDATE_ANNOTATION] == new_config_name
314326

315327
assert_endpoint_status_in_sync(
316-
endpoint_reference.name, endpoint_reference, cfg.ENDPOINT_STATUS_INSERVICE,
328+
endpoint_reference.name,
329+
endpoint_reference,
330+
cfg.ENDPOINT_STATUS_INSERVICE,
317331
)
318332
assert k8s.wait_on_condition(endpoint_reference, "ACK.ResourceSynced", "True")
319333
assert k8s.get_resource_condition(endpoint_reference, "ACK.Terminal") is None
@@ -336,10 +350,9 @@ def delete_endpoint_test(self, xgboost_endpoint):
336350
(reference, resource, _) = xgboost_endpoint
337351
endpoint_name = resource["spec"].get("endpointName", None)
338352

339-
_, deleted = k8s.delete_custom_resource(
353+
assert delete_custom_resource(
340354
reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
341355
)
342-
assert deleted
343356

344357
assert get_sagemaker_endpoint(endpoint_name) is None
345358

test/e2e/tests/test_endpoint_config.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from e2e import (
2525
service_marker,
2626
create_sagemaker_resource,
27+
delete_custom_resource,
2728
assert_tags_in_sync,
2829
get_sagemaker_endpoint_config,
2930
)
@@ -63,11 +64,13 @@ def single_variant_config():
6364

6465
yield (config_reference, config_resource)
6566

66-
k8s.delete_custom_resource(model_reference, 3, 10)
67+
k8s.delete_custom_resource(
68+
model_reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
69+
)
6770
# Delete the k8s resource if not already deleted by tests
68-
if k8s.get_resource_exists(config_reference):
69-
_, deleted = k8s.delete_custom_resource(config_reference, 3, 10)
70-
assert deleted
71+
assert delete_custom_resource(
72+
config_reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
73+
)
7174

7275

7376
@service_marker
@@ -87,7 +90,8 @@ def test_create_endpoint_config(self, single_variant_config):
8790
resource_tags = resource["spec"].get("tags", None)
8891
assert_tags_in_sync(endpoint_arn, resource_tags)
8992
# Delete the k8s resource.
90-
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
91-
assert deleted
93+
assert delete_custom_resource(
94+
reference, cfg.DELETE_WAIT_PERIOD, cfg.DELETE_WAIT_LENGTH
95+
)
9296

9397
assert get_sagemaker_endpoint_config(config_name) is None

0 commit comments

Comments
 (0)