From fab0196e1ff788616ef59d912d63b4cc4ab8f31f Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 21 Jul 2021 16:18:55 -0500 Subject: [PATCH 01/14] Rename `delete_endpoint` as `delete_predictor` --- src/sagemaker/predictor.py | 4 +++- src/sagemaker/serverless/predictor.py | 2 +- tests/unit/sagemaker/serverless/test_predictor.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/sagemaker/predictor.py b/src/sagemaker/predictor.py index 71251e670a..e968bc419b 100644 --- a/src/sagemaker/predictor.py +++ b/src/sagemaker/predictor.py @@ -62,7 +62,7 @@ def predict(self, *args, **kwargs) -> Any: """Perform inference on the provided data and return a prediction.""" @abc.abstractmethod - def delete_endpoint(self, *args, **kwargs) -> None: + def delete_predictor(self, *args, **kwargs) -> None: """Destroy resources associated with this predictor.""" @property @@ -330,6 +330,8 @@ def delete_endpoint(self, delete_endpoint_config=True): self.sagemaker_session.delete_endpoint(self.endpoint_name) + delete_predictor = delete_endpoint + def delete_model(self): """Deletes the Amazon SageMaker models backing this predictor.""" request_failed = False diff --git a/src/sagemaker/serverless/predictor.py b/src/sagemaker/serverless/predictor.py index 4145b8f447..7ac6f17ca2 100644 --- a/src/sagemaker/serverless/predictor.py +++ b/src/sagemaker/serverless/predictor.py @@ -61,7 +61,7 @@ def predict(self, data: dict) -> dict: response["ResponseMetadata"]["HTTPHeaders"]["content-type"], ) - def delete_endpoint(self) -> None: + def delete_predictor(self) -> None: """Destroy the Lambda function specified in the constructor.""" self._client.delete_function(FunctionName=self._function_name) diff --git a/tests/unit/sagemaker/serverless/test_predictor.py b/tests/unit/sagemaker/serverless/test_predictor.py index 57011a8810..b9fd037766 100644 --- a/tests/unit/sagemaker/serverless/test_predictor.py +++ b/tests/unit/sagemaker/serverless/test_predictor.py @@ -48,7 +48,7 @@ def test_predict(mock_client): def test_delete_endpoint(mock_client): predictor = LambdaPredictor(FUNCTION_NAME, client=mock_client) - predictor.delete_endpoint() + predictor.delete_predictor() mock_client.delete_function.assert_called_once() _, kwargs = mock_client.delete_function.call_args From bc5a586bdd64d6e6092dda9661b5776a869e71a3 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 21 Jul 2021 16:25:40 -0500 Subject: [PATCH 02/14] Update test_serverless.py --- tests/integ/test_serverless.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index b0ef09c79e..5f0beb6fb1 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -24,6 +24,8 @@ ROLE = "arn:aws:iam::142577830533:role/lambda_basic_execution" URL = "https://c.files.bbci.co.uk/12A9B/production/_111434467_gettyimages-1143489763.jpg" +print('"CODEBUILD_BUILD_ID" in os.environ =', "CODEBUILD_BUILD_ID" in os.environ) + @pytest.mark.skipif( "CODEBUILD_BUILD_ID" not in os.environ, @@ -39,5 +41,5 @@ def test_lambda(): assert prediction == {"class": "tabby"} - model.destroy() - predictor.destroy() + model.delete_model() + predictor.delete_predictor() From 5f1131c1ef71732424f0e97c6d5d6c1ddfe27841 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 21 Jul 2021 23:11:29 -0500 Subject: [PATCH 03/14] Update test_serverless.py --- tests/integ/test_serverless.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index 5f0beb6fb1..785e620814 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -20,19 +20,18 @@ from sagemaker.utils import unique_name_from_base # See tests/data/serverless for the image source code. -IMAGE_URI = "142577830533.dkr.ecr.us-west-2.amazonaws.com/serverless-integ-test:latest" -ROLE = "arn:aws:iam::142577830533:role/lambda_basic_execution" -URL = "https://c.files.bbci.co.uk/12A9B/production/_111434467_gettyimages-1143489763.jpg" +ACCOUNT_ID = 142577830533 +IMAGE_URI = f"{ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/serverless-integ-test:latest" +ROLE = f"arn:aws:iam::{ACCOUNT_ID}:role/lambda_basic_execution" +URL = "https://sagemaker-integ-tests-data.s3.us-east-1.amazonaws.com/cat.jpeg" -print('"CODEBUILD_BUILD_ID" in os.environ =', "CODEBUILD_BUILD_ID" in os.environ) - -@pytest.mark.skipif( - "CODEBUILD_BUILD_ID" not in os.environ, - reason="The container image is private to the CI account.", -) def test_lambda(): - model = LambdaModel(image_uri=IMAGE_URI, role=ROLE) + client = boto3.client("lambda") + if client.get_caller_identity().get("Account") != ACCOUNT_ID: + pytest.skip("The container image is private to the CI account.") + + model = LambdaModel(image_uri=IMAGE_URI, role=ROLE, client=client) predictor = model.deploy( unique_name_from_base("my-lambda-function"), timeout=60, memory_size=4092 From 2689fd6049059063c29b88852e116e9143da3621 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 21 Jul 2021 23:20:04 -0500 Subject: [PATCH 04/14] Appease lint --- tests/integ/test_serverless.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index 785e620814..9bddab65d4 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -12,8 +12,7 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import -import os - +import boto3 import pytest from sagemaker.serverless import LambdaModel From ba91b520159e4316dbf72f315336cafcd9df3178 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 28 Jul 2021 16:58:41 -0700 Subject: [PATCH 05/14] Update serverless test --- tests/conftest.py | 12 ++++++- tests/integ/test_serverless.py | 66 +++++++++++++++++++++++++++++----- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 2d171f3eb2..3b5fddbe94 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -97,6 +97,16 @@ def boto_session(request): return boto3.Session(region_name=DEFAULT_REGION) +@pytest.fixture(scope="session") +def account(boto_session): + return boto_session.client("sts").get_caller_identity()["Account"] + + +@pytest.fixture(scope="session") +def region(boto_session): + return os.environ.get("TEST_AWS_REGION_NAME", boto_session.region_name) + + @pytest.fixture(scope="session") def sagemaker_session(sagemaker_client_config, sagemaker_runtime_config, boto_session): sagemaker_client_config.setdefault("config", Config(retries=dict(max_attempts=10))) @@ -127,7 +137,7 @@ def sagemaker_local_session(boto_session): def custom_bucket_name(boto_session): region = boto_session.region_name account = boto_session.client( - "sts", region_name=region, endpoint_url=utils.sts_regional_endpoint(region) + "sts", region_name=region ).get_caller_identity()["Account"] return "{}-{}-{}".format(CUSTOM_BUCKET_NAME_PREFIX, region, account) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index e315f8d576..7added8cfb 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -12,25 +12,73 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import +import os +import subprocess + import boto3 +import botocore import pytest from sagemaker.serverless import LambdaModel from sagemaker.utils import unique_name_from_base -# See tests/data/serverless for the image source code. -ACCOUNT_ID = 142577830533 -IMAGE_URI = f"{ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/serverless-integ-test:latest" -ROLE = f"arn:aws:iam::{ACCOUNT_ID}:role/lambda_basic_execution" +from tests.integ import DATA_DIR + URL = "https://sagemaker-integ-tests-data.s3.us-east-1.amazonaws.com/cat.jpeg" +IMAGE_NAME = "my-lambda-function" +REPOSITORY_NAME = "my-lambda-repository" +BUILD_CONTEXT = os.path.join(DATA_DIR, "serverless") + +ROLE_NAME = "LambdaExecutionRole" +POLICY_DOCUMENT = '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}' +POLICY_ARN = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + + +@pytest.fixture(name="tag", scope="module") +def fixture_tag(): + return unique_name_from_base("tag") + + +@pytest.fixture(name="image_uri", scope="module") +def fixture_image_uri(account, region, tag, boto_session): + client = boto_session.client("ecr") + try: + client.describe_repositories(repositoryNames=[REPOSITORY_NAME])["repositories"] + except client.exceptions.RepositoryNotFoundException: + client.create_repository(repositoryName=REPOSITORY_NAME) + + process = subprocess.Popen(["aws", "ecr", "get-login-password", "--region", region], stdout=subprocess.PIPE) + subprocess.check_call(["docker", "login", "--username", "AWS", "--password-stdin", f"{account}.dkr.ecr.{region}.amazonaws.com"], stdin=process.stdout) + process.wait() + + subprocess.check_call(["docker", "build", "-t", IMAGE_NAME, BUILD_CONTEXT]) + + image_uri = f"{account}.dkr.ecr.us-west-2.amazonaws.com/{REPOSITORY_NAME}:{tag}" + subprocess.check_call(["docker", "tag", f"{IMAGE_NAME}:latest", image_uri]) + subprocess.check_call(["docker", "push", image_uri]) + + yield image_uri + + client.batch_delete_image(repositoryName=REPOSITORY_NAME, imageIds=[{"imageTag": tag}]) + subprocess.check_call(["docker", "rmi", IMAGE_NAME, image_uri]) + + +@pytest.fixture(name="role", scope="module") +def fixture_role(boto_session): + client = boto_session.client("iam") + try: + response = client.get_role(RoleName=ROLE_NAME) + return response["Role"]["Arn"] + except client.exceptions.NoSuchEntityException: + response = client.create_role(RoleName=ROLE_NAME, AssumeRolePolicyDocument=POLICY_DOCUMENT) + client.attach_role_policy(RoleName=ROLE_NAME, PolicyArn=POLICY_ARN) + return response["Role"]["Arn"] -def test_lambda(): - client = boto3.client("lambda") - if client.get_caller_identity().get("Account") != ACCOUNT_ID: - pytest.skip("The container image is private to the CI account.") - model = LambdaModel(image_uri=IMAGE_URI, role=ROLE, client=client) +def test_lambda(image_uri, role, boto_session): + client = boto_session.client("lambda") + model = LambdaModel(image_uri=image_uri, role=role, client=client) predictor = model.deploy( unique_name_from_base("my-lambda-function"), timeout=60, memory_size=4092 From 9ef49e3a7fae375ddc768d5b610f4765cc912053 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 28 Jul 2021 17:06:45 -0700 Subject: [PATCH 06/14] Appease lint --- tests/conftest.py | 2 +- tests/integ/test_serverless.py | 32 +++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 3b5fddbe94..df6793f8ed 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -137,7 +137,7 @@ def sagemaker_local_session(boto_session): def custom_bucket_name(boto_session): region = boto_session.region_name account = boto_session.client( - "sts", region_name=region + "sts", region_name=region, endpoint_url=utils.sts_regional_endpoint(region) ).get_caller_identity()["Account"] return "{}-{}-{}".format(CUSTOM_BUCKET_NAME_PREFIX, region, account) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index 7added8cfb..24bec018c7 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -12,11 +12,10 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import +import json import os import subprocess -import boto3 -import botocore import pytest from sagemaker.serverless import LambdaModel @@ -31,7 +30,18 @@ BUILD_CONTEXT = os.path.join(DATA_DIR, "serverless") ROLE_NAME = "LambdaExecutionRole" -POLICY_DOCUMENT = '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}' +POLICY_DOCUMENT = json.dumps( + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": {"Service": "lambda.amazonaws.com"}, + "Action": "sts:AssumeRole", + } + ], + } +) POLICY_ARN = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" @@ -48,8 +58,20 @@ def fixture_image_uri(account, region, tag, boto_session): except client.exceptions.RepositoryNotFoundException: client.create_repository(repositoryName=REPOSITORY_NAME) - process = subprocess.Popen(["aws", "ecr", "get-login-password", "--region", region], stdout=subprocess.PIPE) - subprocess.check_call(["docker", "login", "--username", "AWS", "--password-stdin", f"{account}.dkr.ecr.{region}.amazonaws.com"], stdin=process.stdout) + process = subprocess.Popen( + ["aws", "ecr", "get-login-password", "--region", region], stdout=subprocess.PIPE + ) + subprocess.check_call( + [ + "docker", + "login", + "--username", + "AWS", + "--password-stdin", + f"{account}.dkr.ecr.{region}.amazonaws.com", + ], + stdin=process.stdout, + ) process.wait() subprocess.check_call(["docker", "build", "-t", IMAGE_NAME, BUILD_CONTEXT]) From 8b017e879e4ffdb6b295005a1d825563138ea24e Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Thu, 29 Jul 2021 11:18:06 -0700 Subject: [PATCH 07/14] Update test_serverless.py --- tests/integ/test_serverless.py | 78 ++++------------------------------ 1 file changed, 9 insertions(+), 69 deletions(-) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index 24bec018c7..10f7834653 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -12,94 +12,34 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import -import json import os -import subprocess import pytest from sagemaker.serverless import LambdaModel from sagemaker.utils import unique_name_from_base -from tests.integ import DATA_DIR - URL = "https://sagemaker-integ-tests-data.s3.us-east-1.amazonaws.com/cat.jpeg" - -IMAGE_NAME = "my-lambda-function" REPOSITORY_NAME = "my-lambda-repository" -BUILD_CONTEXT = os.path.join(DATA_DIR, "serverless") - ROLE_NAME = "LambdaExecutionRole" -POLICY_DOCUMENT = json.dumps( - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": {"Service": "lambda.amazonaws.com"}, - "Action": "sts:AssumeRole", - } - ], - } -) -POLICY_ARN = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" - - -@pytest.fixture(name="tag", scope="module") -def fixture_tag(): - return unique_name_from_base("tag") @pytest.fixture(name="image_uri", scope="module") -def fixture_image_uri(account, region, tag, boto_session): - client = boto_session.client("ecr") - try: - client.describe_repositories(repositoryNames=[REPOSITORY_NAME])["repositories"] - except client.exceptions.RepositoryNotFoundException: - client.create_repository(repositoryName=REPOSITORY_NAME) - - process = subprocess.Popen( - ["aws", "ecr", "get-login-password", "--region", region], stdout=subprocess.PIPE - ) - subprocess.check_call( - [ - "docker", - "login", - "--username", - "AWS", - "--password-stdin", - f"{account}.dkr.ecr.{region}.amazonaws.com", - ], - stdin=process.stdout, - ) - process.wait() - - subprocess.check_call(["docker", "build", "-t", IMAGE_NAME, BUILD_CONTEXT]) +def fixture_image_uri(account, region): + return f"{account}.dkr.ecr.{region}.amazonaws.com/{REPOSITORY_NAME}:latest" - image_uri = f"{account}.dkr.ecr.us-west-2.amazonaws.com/{REPOSITORY_NAME}:{tag}" - subprocess.check_call(["docker", "tag", f"{IMAGE_NAME}:latest", image_uri]) - subprocess.check_call(["docker", "push", image_uri]) - yield image_uri - - client.batch_delete_image(repositoryName=REPOSITORY_NAME, imageIds=[{"imageTag": tag}]) - subprocess.check_call(["docker", "rmi", IMAGE_NAME, image_uri]) +@pytest.fixture(name="role", scope="module") +def fixture_role(account): + return f"arn:aws:iam::{account}:role/{ROLE_NAME}" -@pytest.fixture(name="role", scope="module") -def fixture_role(boto_session): - client = boto_session.client("iam") - try: - response = client.get_role(RoleName=ROLE_NAME) - return response["Role"]["Arn"] - except client.exceptions.NoSuchEntityException: - response = client.create_role(RoleName=ROLE_NAME, AssumeRolePolicyDocument=POLICY_DOCUMENT) - client.attach_role_policy(RoleName=ROLE_NAME, PolicyArn=POLICY_ARN) - return response["Role"]["Arn"] +@pytest.fixture(name="client") +def fixture_client(boto_session): + return boto_session.client("lambda") -def test_lambda(image_uri, role, boto_session): - client = boto_session.client("lambda") +def test_lambda(image_uri, role, client): model = LambdaModel(image_uri=image_uri, role=role, client=client) predictor = model.deploy( From 8e93bde5055a7748c67de966e85958037be4393b Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Tue, 3 Aug 2021 13:28:51 -0500 Subject: [PATCH 08/14] Appease lint --- tests/integ/test_serverless.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index 10f7834653..4657e916f3 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -12,8 +12,6 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import -import os - import pytest from sagemaker.serverless import LambdaModel From f9f07bb9f1aec5b98f789b1e2c6c789c32a20ada Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 4 Aug 2021 01:53:08 -0500 Subject: [PATCH 09/14] Fix test --- tests/conftest.py | 5 ----- tests/integ/test_serverless.py | 25 ++++++++++++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index df6793f8ed..702850073d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -102,11 +102,6 @@ def account(boto_session): return boto_session.client("sts").get_caller_identity()["Account"] -@pytest.fixture(scope="session") -def region(boto_session): - return os.environ.get("TEST_AWS_REGION_NAME", boto_session.region_name) - - @pytest.fixture(scope="session") def sagemaker_session(sagemaker_client_config, sagemaker_runtime_config, boto_session): sagemaker_client_config.setdefault("config", Config(retries=dict(max_attempts=10))) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index 4657e916f3..ed430e2e5c 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -18,13 +18,15 @@ from sagemaker.utils import unique_name_from_base URL = "https://sagemaker-integ-tests-data.s3.us-east-1.amazonaws.com/cat.jpeg" -REPOSITORY_NAME = "my-lambda-repository" + +REPOSITORY_NAME = "serverless-integ-test" ROLE_NAME = "LambdaExecutionRole" +REGION = "us-west-2" @pytest.fixture(name="image_uri", scope="module") -def fixture_image_uri(account, region): - return f"{account}.dkr.ecr.{region}.amazonaws.com/{REPOSITORY_NAME}:latest" +def fixture_image_uri(account): + return f"{account}.dkr.ecr.{REGION}.amazonaws.com/{REPOSITORY_NAME}:latest" @pytest.fixture(name="role", scope="module") @@ -32,12 +34,25 @@ def fixture_role(account): return f"arn:aws:iam::{account}:role/{ROLE_NAME}" -@pytest.fixture(name="client") +@pytest.fixture(name="client", scope="module") def fixture_client(boto_session): return boto_session.client("lambda") -def test_lambda(image_uri, role, client): +@pytest.fixture(name="repository_exists", scope="module") +def fixture_repository_exists(boto_session): + client = boto_session.client("ecr") + try: + client.describe_repositories(repositoryNames=[REPOSITORY_NAME]) + return True + except client.exceptions.RepositoryNotFoundException: + return False + + +def test_lambda(image_uri, role, client, repository_exists): + if not repository_exists: + pytest.skip("The container image required to run this test does not exist.") + model = LambdaModel(image_uri=image_uri, role=role, client=client) predictor = model.deploy( From e35ad7ed2def77317cb9d6d5891e34304804c353 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 4 Aug 2021 02:57:14 -0500 Subject: [PATCH 10/14] Update test_serverless.py --- tests/integ/test_serverless.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index ed430e2e5c..f14cbeb515 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -53,6 +53,8 @@ def test_lambda(image_uri, role, client, repository_exists): if not repository_exists: pytest.skip("The container image required to run this test does not exist.") + pytest.fail("This test should fail!") + model = LambdaModel(image_uri=image_uri, role=role, client=client) predictor = model.deploy( From e8c59e50294d75bc9f6ae48e023077794268ba25 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 4 Aug 2021 03:56:56 -0500 Subject: [PATCH 11/14] Update test_serverless.py --- tests/integ/test_serverless.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index f14cbeb515..c4a8b9c2b5 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -42,11 +42,8 @@ def fixture_client(boto_session): @pytest.fixture(name="repository_exists", scope="module") def fixture_repository_exists(boto_session): client = boto_session.client("ecr") - try: - client.describe_repositories(repositoryNames=[REPOSITORY_NAME]) - return True - except client.exceptions.RepositoryNotFoundException: - return False + client.describe_repositories(repositoryNames=[REPOSITORY_NAME]) + return True def test_lambda(image_uri, role, client, repository_exists): From 42fdd2bf30a65aeb8ff1cdbe3c346ef9fc29df98 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 4 Aug 2021 05:06:28 -0500 Subject: [PATCH 12/14] Update test_serverless.py --- tests/integ/test_serverless.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index c4a8b9c2b5..10faff160c 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -20,13 +20,13 @@ URL = "https://sagemaker-integ-tests-data.s3.us-east-1.amazonaws.com/cat.jpeg" REPOSITORY_NAME = "serverless-integ-test" +REPOSITORY_REGION = "us-west-2" ROLE_NAME = "LambdaExecutionRole" -REGION = "us-west-2" @pytest.fixture(name="image_uri", scope="module") def fixture_image_uri(account): - return f"{account}.dkr.ecr.{REGION}.amazonaws.com/{REPOSITORY_NAME}:latest" + return f"{account}.dkr.ecr.{REPOSITORY_REGION}.amazonaws.com/{REPOSITORY_NAME}:latest" @pytest.fixture(name="role", scope="module") @@ -41,9 +41,12 @@ def fixture_client(boto_session): @pytest.fixture(name="repository_exists", scope="module") def fixture_repository_exists(boto_session): - client = boto_session.client("ecr") - client.describe_repositories(repositoryNames=[REPOSITORY_NAME]) - return True + client = boto_session.client("ecr", region_name=REPOSITORY_REGION) + try: + client.describe_repositories(repositoryNames=[REPOSITORY_NAME]) + return True + except client.exceptions.RepositoryNotFoundException: + return False def test_lambda(image_uri, role, client, repository_exists): From b2156fdf4b27b9779741ba5b372780c12b799ec9 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 4 Aug 2021 05:06:50 -0500 Subject: [PATCH 13/14] Update test_serverless.py --- tests/integ/test_serverless.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index 10faff160c..093bad811c 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -53,8 +53,6 @@ def test_lambda(image_uri, role, client, repository_exists): if not repository_exists: pytest.skip("The container image required to run this test does not exist.") - pytest.fail("This test should fail!") - model = LambdaModel(image_uri=image_uri, role=role, client=client) predictor = model.deploy( From c161878edce4fb0095b433dae32e2fa4fe00f341 Mon Sep 17 00:00:00 2001 From: Balaji Veeramani Date: Wed, 4 Aug 2021 14:00:52 -0500 Subject: [PATCH 14/14] Fix tests --- tests/conftest.py | 5 +++++ tests/integ/test_serverless.py | 7 +++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 702850073d..33a5e1bb6a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -102,6 +102,11 @@ def account(boto_session): return boto_session.client("sts").get_caller_identity()["Account"] +@pytest.fixture(scope="session") +def region(boto_session): + return boto_session.region_name + + @pytest.fixture(scope="session") def sagemaker_session(sagemaker_client_config, sagemaker_runtime_config, boto_session): sagemaker_client_config.setdefault("config", Config(retries=dict(max_attempts=10))) diff --git a/tests/integ/test_serverless.py b/tests/integ/test_serverless.py index 093bad811c..09d314728c 100644 --- a/tests/integ/test_serverless.py +++ b/tests/integ/test_serverless.py @@ -20,13 +20,12 @@ URL = "https://sagemaker-integ-tests-data.s3.us-east-1.amazonaws.com/cat.jpeg" REPOSITORY_NAME = "serverless-integ-test" -REPOSITORY_REGION = "us-west-2" ROLE_NAME = "LambdaExecutionRole" @pytest.fixture(name="image_uri", scope="module") -def fixture_image_uri(account): - return f"{account}.dkr.ecr.{REPOSITORY_REGION}.amazonaws.com/{REPOSITORY_NAME}:latest" +def fixture_image_uri(account, region): + return f"{account}.dkr.ecr.{region}.amazonaws.com/{REPOSITORY_NAME}:latest" @pytest.fixture(name="role", scope="module") @@ -41,7 +40,7 @@ def fixture_client(boto_session): @pytest.fixture(name="repository_exists", scope="module") def fixture_repository_exists(boto_session): - client = boto_session.client("ecr", region_name=REPOSITORY_REGION) + client = boto_session.client("ecr") try: client.describe_repositories(repositoryNames=[REPOSITORY_NAME]) return True