Skip to content

Commit 62c11b5

Browse files
authored
refactor tests and bug fixes (#28)
* refactor tests and bug fixes * fix wait_resource * log describe error, increase delete timeout, refractor tests * add owners alias
1 parent 7ed3212 commit 62c11b5

16 files changed

+113
-143
lines changed

OWNERS_ALIASES

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ aliases:
99
- RedbackThomson
1010
- vijtrip2
1111
# TODO: Add your team members to your team controller alias
12-
service-team: []
12+
service-team:
13+
- akartsky
14+
- mbaijal
15+
- surajkota

test/e2e/common/fixtures.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def xgboost_churn_endpoint(sagemaker_client):
8181
yield endpoint_spec
8282

8383
for cr in (model_reference, endpoint_config_reference, endpoint_reference):
84-
_, deleted = k8s.delete_custom_resource(cr)
84+
_, deleted = k8s.delete_custom_resource(cr, 3, 10)
8585
assert deleted
8686

8787

@@ -109,5 +109,5 @@ def xgboost_churn_data_quality_job_definition(xgboost_churn_endpoint):
109109
yield (job_definition_reference, resource)
110110

111111
if k8s.get_resource_exists(job_definition_reference):
112-
_, deleted = k8s.delete_custom_resource(job_definition_reference)
112+
_, deleted = k8s.delete_custom_resource(job_definition_reference, 3, 10)
113113
assert deleted

test/e2e/tests/test_adopt_endpoint.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ def adopted_endpoint(sdk_endpoint):
159159

160160
for cr in (adopt_model_reference, adopt_config_reference, adopt_endpoint_reference):
161161
if k8s.get_resource_exists(cr):
162-
_, deleted = k8s.delete_custom_resource(cr)
162+
_, deleted = k8s.delete_custom_resource(cr, 3, 10)
163163
assert deleted
164164

165165

@@ -201,7 +201,7 @@ def test_smoke(self, sdk_endpoint, adopted_endpoint):
201201
model_reference = k8s.create_reference(
202202
CRD_GROUP, CRD_VERSION, cfg.MODEL_RESOURCE_PLURAL, model_name, namespace
203203
)
204-
model_resource = k8s.get_resource(model_reference)
204+
model_resource = k8s.wait_resource_consumed_by_controller(model_reference)
205205
assert model_resource is not None
206206

207207
assert model_resource["spec"].get("modelName", None) == model_name
@@ -221,7 +221,7 @@ def test_smoke(self, sdk_endpoint, adopted_endpoint):
221221
endpoint_config_name,
222222
namespace,
223223
)
224-
config_resource = k8s.get_resource(config_reference)
224+
config_resource = k8s.wait_resource_consumed_by_controller(config_reference)
225225
assert config_resource is not None
226226

227227
assert (
@@ -236,7 +236,7 @@ def test_smoke(self, sdk_endpoint, adopted_endpoint):
236236
endpoint_reference = k8s.create_reference(
237237
CRD_GROUP, CRD_VERSION, cfg.ENDPOINT_RESOURCE_PLURAL, endpoint_name, namespace
238238
)
239-
endpoint_resource = k8s.get_resource(endpoint_reference)
239+
endpoint_resource = k8s.wait_resource_consumed_by_controller(endpoint_reference)
240240
assert endpoint_resource is not None
241241

242242
assert endpoint_resource["spec"].get("endpointName", None) == endpoint_name

test/e2e/tests/test_data_quality_job_definition.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import pytest
1717
import logging
18+
import botocore
1819

1920
from e2e import service_marker
2021
from e2e.common.fixtures import (
@@ -34,9 +35,9 @@ def describe_sagemaker_data_quality_job_definition(
3435
return sagemaker_client.describe_data_quality_job_definition(
3536
JobDefinitionName=job_definition_name
3637
)
37-
except BaseException:
38+
except botocore.exceptions.ClientError as error:
3839
logging.error(
39-
f"Could not find Data Quality Job Definition with name {job_definition_name}"
40+
f"Could not find Data Quality Job Definition with name {job_definition_name}. Error {error}"
4041
)
4142
return None
4243

@@ -57,7 +58,7 @@ def test_smoke(self, sagemaker_client, xgboost_churn_data_quality_job_definition
5758
)
5859

5960
# Delete the k8s resource.
60-
_, deleted = k8s.delete_custom_resource(reference)
61+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
6162
assert deleted
6263
assert (
6364
describe_sagemaker_data_quality_job_definition(

test/e2e/tests/test_endpoint.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"""Integration tests for the SageMaker Endpoint API.
1414
"""
1515

16-
import boto3
16+
import botocore
1717
import pytest
1818
import logging
1919
import time
@@ -56,7 +56,7 @@ def single_container_model(name_suffix):
5656

5757
yield (model_reference, model_resource)
5858

59-
_, deleted = k8s.delete_custom_resource(model_reference)
59+
_, deleted = k8s.delete_custom_resource(model_reference, 3, 10)
6060
assert deleted
6161

6262

@@ -81,7 +81,7 @@ def multi_variant_config(name_suffix, single_container_model):
8181

8282
yield (config_reference, config_resource)
8383

84-
_, deleted = k8s.delete_custom_resource(config_reference)
84+
_, deleted = k8s.delete_custom_resource(config_reference, 3, 10)
8585
assert deleted
8686

8787

@@ -106,7 +106,7 @@ def single_variant_config(name_suffix, single_container_model):
106106

107107
yield (config_reference, config_resource)
108108

109-
_, deleted = k8s.delete_custom_resource(config_reference)
109+
_, deleted = k8s.delete_custom_resource(config_reference, 3, 10)
110110
assert deleted
111111

112112

@@ -133,7 +133,7 @@ def xgboost_endpoint(name_suffix, single_variant_config):
133133

134134
# Delete the k8s resource if not already deleted by tests
135135
if k8s.get_resource_exists(reference):
136-
_, deleted = k8s.delete_custom_resource(reference)
136+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
137137
assert deleted
138138

139139

@@ -182,7 +182,7 @@ def faulty_config(name_suffix, single_container_model):
182182
yield (config_reference, config_resource)
183183

184184
for cr in (model_reference, config_reference):
185-
_, deleted = k8s.delete_custom_resource(cr)
185+
_, deleted = k8s.delete_custom_resource(cr, 3, 10)
186186
assert deleted
187187

188188

@@ -199,9 +199,9 @@ def _get_resource_endpoint_arn(self, resource: Dict):
199199
def _describe_sagemaker_endpoint(self, sagemaker_client, endpoint_name: str):
200200
try:
201201
return sagemaker_client.describe_endpoint(EndpointName=endpoint_name)
202-
except BaseException:
202+
except botocore.exceptions.ClientError as error:
203203
logging.error(
204-
f"SageMaker could not find a endpoint with the name {endpoint_name}"
204+
f"SageMaker could not find a endpoint with the name {endpoint_name}. Error {error}"
205205
)
206206
return None
207207

@@ -349,7 +349,7 @@ def delete_endpoint_test(self, sagemaker_client, xgboost_endpoint):
349349
(reference, resource, _) = xgboost_endpoint
350350
endpoint_name = resource["spec"].get("endpointName", None)
351351

352-
_, deleted = k8s.delete_custom_resource(reference)
352+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
353353
assert deleted
354354

355355
# resource is removed from management from controller side if call to deleteEndpoint succeeds.

test/e2e/tests/test_endpoint_config.py

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"""Integration tests for the SageMaker EndpointConfig API.
1414
"""
1515

16-
import boto3
16+
from _pytest import config
17+
import botocore
1718
import pytest
1819
import logging
1920
from typing import Dict
@@ -24,6 +25,7 @@
2425
from e2e import (
2526
service_marker,
2627
create_sagemaker_resource,
28+
sagemaker_client
2729
)
2830
from e2e.replacement_values import REPLACEMENT_VALUES
2931
from e2e.common import config as cfg
@@ -57,59 +59,38 @@ def single_variant_config():
5759

5860
yield (config_reference, config_resource)
5961

60-
k8s.delete_custom_resource(model_reference)
62+
k8s.delete_custom_resource(model_reference, 3, 10)
6163
# Delete the k8s resource if not already deleted by tests
6264
if k8s.get_resource_exists(config_reference):
63-
k8s.delete_custom_resource(config_reference)
65+
_, deleted = k8s.delete_custom_resource(config_reference, 3, 10)
66+
assert deleted
67+
68+
def get_sagemaker_endpoint_config(config_name: str):
69+
try:
70+
return sagemaker_client().describe_endpoint_config(
71+
EndpointConfigName=config_name
72+
)
73+
except botocore.exceptions.ClientError as error:
74+
logging.error(
75+
f"SageMaker could not find a config with the name {config_name}. Error {error}"
76+
)
77+
return None
6478

6579

6680
@service_marker
6781
@pytest.mark.canary
6882
class TestEndpointConfig:
69-
def _get_resource_endpoint_config_arn(self, resource: Dict):
70-
assert (
71-
"ackResourceMetadata" in resource["status"]
72-
and "arn" in resource["status"]["ackResourceMetadata"]
73-
)
74-
return resource["status"]["ackResourceMetadata"]["arn"]
75-
76-
def _get_sagemaker_endpoint_config_arn(self, sagemaker_client, config_name: str):
77-
try:
78-
response = sagemaker_client.describe_endpoint_config(
79-
EndpointConfigName=config_name
80-
)
81-
return response["EndpointConfigArn"]
82-
except BaseException:
83-
logging.error(
84-
f"SageMaker could not find a config with the name {config_name}"
85-
)
86-
return None
87-
8883
def test_create_endpoint_config(self, single_variant_config):
8984
(reference, resource) = single_variant_config
9085
assert k8s.get_resource_exists(reference)
9186

92-
def test_config_has_correct_arn(self, sagemaker_client, single_variant_config):
93-
(reference, _) = single_variant_config
94-
resource = k8s.get_resource(reference)
9587
config_name = resource["spec"].get("endpointConfigName", None)
9688

97-
assert config_name is not None
98-
99-
assert self._get_resource_endpoint_config_arn(
100-
resource
101-
) == self._get_sagemaker_endpoint_config_arn(sagemaker_client, config_name)
102-
103-
def test_config_is_deleted(self, sagemaker_client, single_variant_config):
104-
(reference, _) = single_variant_config
105-
resource = k8s.get_resource(reference)
106-
config_name = resource["spec"].get("endpointConfigName", None)
89+
assert k8s.get_resource_arn(resource) == get_sagemaker_endpoint_config(config_name)["EndpointConfigArn"]
10790

10891
# Delete the k8s resource.
109-
_, deleted = k8s.delete_custom_resource(reference)
110-
assert deleted is True
92+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
93+
assert deleted
94+
95+
assert get_sagemaker_endpoint_config(config_name) is None
11196

112-
assert (
113-
self._get_sagemaker_endpoint_config_arn(sagemaker_client, config_name)
114-
is None
115-
)

test/e2e/tests/test_hpo.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"""Integration tests for the SageMaker HyperParameterTuning API.
1414
"""
1515

16-
import boto3
16+
import botocore
1717
import pytest
1818
import logging
1919
from typing import Dict
@@ -52,7 +52,7 @@ def xgboost_hpojob():
5252
yield (reference, resource)
5353

5454
if k8s.get_resource_exists(reference):
55-
_, deleted = k8s.delete_custom_resource(reference)
55+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
5656
assert deleted
5757

5858

@@ -62,9 +62,9 @@ def get_sagemaker_hpo_job(hpo_job_name: str):
6262
HyperParameterTuningJobName=hpo_job_name
6363
)
6464
return hpo_desc
65-
except BaseException:
65+
except botocore.exceptions.ClientError as error:
6666
logging.error(
67-
f"SageMaker could not find an hpo job with the name {hpo_job_name}"
67+
f"SageMaker could not find an hpo job with the name {hpo_job_name}. Error {error}"
6868
)
6969
return None
7070

@@ -139,7 +139,7 @@ def test_stopped(self, xgboost_hpojob):
139139
)
140140

141141
# Delete the k8s resource.
142-
_, deleted = k8s.delete_custom_resource(reference)
142+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
143143
assert deleted is True
144144

145145
hpo_sm_desc = get_sagemaker_hpo_job(hpo_job_name)
@@ -167,5 +167,5 @@ def test_completed(self, xgboost_hpojob):
167167
assert k8s.wait_on_condition(reference, "ACK.ResourceSynced", "True")
168168

169169
# Check that you can delete a completed resource from k8s
170-
_, deleted = k8s.delete_custom_resource(reference)
170+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
171171
assert deleted is True

test/e2e/tests/test_model.py

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"""Integration tests for the SageMaker Model API.
1414
"""
1515

16-
import boto3
16+
import botocore
1717
import pytest
1818
import logging
1919
from typing import Dict
@@ -23,6 +23,7 @@
2323
from e2e import (
2424
service_marker,
2525
create_sagemaker_resource,
26+
sagemaker_client,
2627
)
2728
from e2e.replacement_values import REPLACEMENT_VALUES
2829
from e2e.common import config as cfg
@@ -47,51 +48,31 @@ def xgboost_model():
4748

4849
# Delete the k8s resource if not already deleted by tests
4950
if k8s.get_resource_exists(reference):
50-
k8s.delete_custom_resource(reference)
51-
52-
51+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
52+
assert deleted
53+
54+
def get_sagemaker_model(model_name: str):
55+
try:
56+
return sagemaker_client().describe_model(ModelName=model_name)
57+
except botocore.exceptions.ClientError as error:
58+
logging.error(
59+
f"SageMaker could not find a model with the name {model_name}. Error {error}"
60+
)
61+
return None
5362
@service_marker
5463
@pytest.mark.canary
5564
class TestModel:
56-
def _get_resource_model_arn(self, resource: Dict):
57-
assert (
58-
"ackResourceMetadata" in resource["status"]
59-
and "arn" in resource["status"]["ackResourceMetadata"]
60-
)
61-
return resource["status"]["ackResourceMetadata"]["arn"]
62-
63-
def _get_sagemaker_model_arn(self, sagemaker_client, model_name: str):
64-
try:
65-
model = sagemaker_client.describe_model(ModelName=model_name)
66-
return model["ModelArn"]
67-
except BaseException:
68-
logging.error(
69-
f"SageMaker could not find a model with the name {model_name}"
70-
)
71-
return None
72-
7365
def test_create_model(self, xgboost_model):
7466
(reference, resource) = xgboost_model
7567
assert k8s.get_resource_exists(reference)
7668

77-
def test_model_has_correct_arn(self, sagemaker_client, xgboost_model):
78-
(reference, _) = xgboost_model
79-
resource = k8s.get_resource(reference)
8069
model_name = resource["spec"].get("modelName", None)
8170

82-
assert model_name is not None
83-
84-
assert self._get_resource_model_arn(resource) == self._get_sagemaker_model_arn(
85-
sagemaker_client, model_name
86-
)
87-
88-
def test_model_is_deleted(self, sagemaker_client, xgboost_model):
89-
(reference, _) = xgboost_model
90-
resource = k8s.get_resource(reference)
91-
model_name = resource["spec"].get("modelName", None)
71+
assert k8s.get_resource_arn(resource) == get_sagemaker_model(model_name)["ModelArn"]
9272

9373
# Delete the k8s resource.
94-
_, deleted = k8s.delete_custom_resource(reference)
95-
assert deleted is True
74+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
75+
assert deleted
76+
77+
assert get_sagemaker_model(model_name) is None
9678

97-
assert self._get_sagemaker_model_arn(sagemaker_client, model_name) is None

0 commit comments

Comments
 (0)