Skip to content

Commit 6bcb8f1

Browse files
authored
Test cross-region support (#141)
Description of changes: - Test ACKs cross region support so that it does not need to be tested manually every release By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent a173dd3 commit 6bcb8f1

File tree

3 files changed

+104
-4
lines changed

3 files changed

+104
-4
lines changed

test/e2e/__init__.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# express or implied. See the License for the specific language governing
1212
# permissions and limitations under the License.
1313

14+
from acktest.aws.identity import get_region
1415
import pytest
1516
import logging
1617
import botocore
@@ -34,8 +35,9 @@
3435
resource_directory = Path(__file__).parent / "resources"
3536

3637

37-
def sagemaker_client():
38-
return boto3.client("sagemaker")
38+
def sagemaker_client(region: str = None):
39+
region = region or get_region()
40+
return boto3.client("sagemaker", region_name=region)
3941

4042

4143
def create_sagemaker_resource(
@@ -325,9 +327,10 @@ def get_sagemaker_endpoint(endpoint_name: str):
325327
return None
326328

327329

328-
def get_sagemaker_model(model_name: str):
330+
def get_sagemaker_model(model_name: str, sm_client=None):
331+
sm_client = sm_client or sagemaker_client()
329332
try:
330-
return sagemaker_client().describe_model(ModelName=model_name)
333+
return sm_client.describe_model(ModelName=model_name)
331334
except botocore.exceptions.ClientError as error:
332335
logging.error(
333336
f"SageMaker could not find a model with the name {model_name}. Error {error}"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: sagemaker.services.k8s.aws/v1alpha1
2+
kind: Model
3+
metadata:
4+
name: $MODEL_NAME
5+
annotations:
6+
services.k8s.aws/region: $REGION
7+
spec:
8+
modelName: $MODEL_NAME
9+
primaryContainer:
10+
containerHostname: xgboost
11+
image: $XGBOOST_V1_IMAGE_URI
12+
executionRoleARN: $SAGEMAKER_EXECUTION_ROLE_ARN

test/e2e/tests/test_cross_region.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License"). You may
4+
# not use this file except in compliance with the License. A copy of the
5+
# License is located at
6+
#
7+
# http://aws.amazon.com/apache2.0/
8+
#
9+
# or in the "license" file accompanying this file. This file is distributed
10+
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11+
# express or implied. See the License for the specific language governing
12+
# permissions and limitations under the License.
13+
"""Integration test for ACKs Cross Region Support.
14+
"""
15+
16+
import logging
17+
from acktest.aws.identity import get_region
18+
import pytest
19+
import time
20+
from typing import Dict
21+
22+
from acktest.resources import random_suffix_name
23+
from acktest.k8s import resource as k8s
24+
from e2e import (
25+
service_marker,
26+
create_sagemaker_resource,
27+
get_sagemaker_model,
28+
sagemaker_client,
29+
)
30+
from e2e.replacement_values import REPLACEMENT_VALUES, XGBOOST_V1_IMAGE_URIS
31+
from e2e.common import config as cfg
32+
33+
34+
@pytest.fixture(scope="module")
35+
def cross_region_model():
36+
resource_name = random_suffix_name("cross-region-model", 32)
37+
region = get_cross_region()
38+
39+
replacements = REPLACEMENT_VALUES.copy()
40+
replacements["MODEL_NAME"] = resource_name
41+
replacements["REGION"] = region
42+
replacements[
43+
"XGBOOST_V1_IMAGE_URI"
44+
] = f"{XGBOOST_V1_IMAGE_URIS[region]}/xgboost:latest"
45+
46+
reference, spec, resource = create_sagemaker_resource(
47+
resource_plural=cfg.MODEL_RESOURCE_PLURAL,
48+
resource_name=resource_name,
49+
spec_file="cross_region_model",
50+
replacements=replacements,
51+
)
52+
assert resource is not None
53+
54+
yield (reference, resource)
55+
56+
# 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
60+
61+
62+
def get_cross_region():
63+
region = get_region()
64+
if region != "us-west-2":
65+
return "us-west-2"
66+
return "us-east-1"
67+
68+
69+
@service_marker
70+
class TestCrossRegionModel:
71+
def test_create_cross_region_model(self, cross_region_model):
72+
(reference, resource) = cross_region_model
73+
assert k8s.get_resource_exists(reference)
74+
75+
sm_client = sagemaker_client(get_cross_region())
76+
model_name = resource["spec"].get("modelName", None)
77+
model_desc = get_sagemaker_model(model_name, sm_client)
78+
cross_region_model_arn = model_desc["ModelArn"]
79+
assert k8s.get_resource_arn(resource) == cross_region_model_arn
80+
81+
# Delete the k8s resource.
82+
_, deleted = k8s.delete_custom_resource(reference, 3, 10)
83+
assert deleted
84+
85+
assert get_sagemaker_model(model_name, sm_client) is None

0 commit comments

Comments
 (0)