2024-01-13 21:09:57 +00:00
|
|
|
import json
|
|
|
|
|
2023-09-01 07:06:50 +00:00
|
|
|
import boto3
|
|
|
|
import requests
|
|
|
|
|
2024-01-07 12:03:33 +00:00
|
|
|
from moto import mock_aws, settings
|
2024-01-13 21:09:57 +00:00
|
|
|
from moto.s3.utils import bucket_and_name_from_url
|
2023-09-01 07:06:50 +00:00
|
|
|
|
|
|
|
# See our Development Tips on writing tests for hints on how to write good tests:
|
|
|
|
# http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html
|
|
|
|
|
|
|
|
|
2024-01-07 12:03:33 +00:00
|
|
|
@mock_aws
|
2023-09-01 07:06:50 +00:00
|
|
|
def test_invoke_endpoint__default_results():
|
|
|
|
client = boto3.client("sagemaker-runtime", region_name="ap-southeast-1")
|
|
|
|
body = client.invoke_endpoint(
|
|
|
|
EndpointName="asdf", Body="qwer", Accept="sth", TargetModel="tm"
|
|
|
|
)
|
|
|
|
|
|
|
|
assert body["Body"].read() == b"body"
|
|
|
|
assert body["CustomAttributes"] == "custom_attributes"
|
|
|
|
|
|
|
|
|
2024-01-07 12:03:33 +00:00
|
|
|
@mock_aws
|
2023-09-01 07:06:50 +00:00
|
|
|
def test_invoke_endpoint():
|
|
|
|
client = boto3.client("sagemaker-runtime", region_name="us-east-1")
|
|
|
|
base_url = (
|
|
|
|
"localhost:5000" if settings.TEST_SERVER_MODE else "motoapi.amazonaws.com"
|
|
|
|
)
|
|
|
|
|
|
|
|
sagemaker_result = {
|
|
|
|
"results": [
|
|
|
|
{
|
|
|
|
"Body": "first body",
|
|
|
|
"ContentType": "text/xml",
|
|
|
|
"InvokedProductionVariant": "prod",
|
|
|
|
"CustomAttributes": "my_attr",
|
|
|
|
},
|
|
|
|
{"Body": "second body"},
|
|
|
|
]
|
|
|
|
}
|
|
|
|
requests.post(
|
|
|
|
f"http://{base_url}/moto-api/static/sagemaker/endpoint-results",
|
|
|
|
json=sagemaker_result,
|
|
|
|
)
|
|
|
|
|
|
|
|
# Return the first item from the list
|
|
|
|
body = client.invoke_endpoint(EndpointName="asdf", Body="qwer")
|
|
|
|
assert body["Body"].read() == b"first body"
|
|
|
|
|
|
|
|
# Same input -> same output
|
|
|
|
body = client.invoke_endpoint(EndpointName="asdf", Body="qwer")
|
|
|
|
assert body["Body"].read() == b"first body"
|
|
|
|
|
|
|
|
# Different input -> second item
|
|
|
|
body = client.invoke_endpoint(
|
|
|
|
EndpointName="asdf", Body="qwer", Accept="sth", TargetModel="tm"
|
|
|
|
)
|
|
|
|
assert body["Body"].read() == b"second body"
|
2024-01-13 21:09:57 +00:00
|
|
|
|
|
|
|
|
2024-01-07 12:03:33 +00:00
|
|
|
@mock_aws
|
2024-01-13 21:09:57 +00:00
|
|
|
def test_invoke_endpoint_async():
|
|
|
|
client = boto3.client("sagemaker-runtime", region_name="us-east-1")
|
|
|
|
base_url = (
|
|
|
|
"localhost:5000" if settings.TEST_SERVER_MODE else "motoapi.amazonaws.com"
|
|
|
|
)
|
|
|
|
|
|
|
|
sagemaker_result = {
|
|
|
|
"results": [
|
|
|
|
{
|
|
|
|
"Body": "first body",
|
|
|
|
"ContentType": "text/xml",
|
|
|
|
"InvokedProductionVariant": "prod",
|
|
|
|
"CustomAttributes": "my_attr",
|
|
|
|
},
|
|
|
|
{"Body": "second body"},
|
|
|
|
]
|
|
|
|
}
|
|
|
|
requests.post(
|
|
|
|
f"http://{base_url}/moto-api/static/sagemaker/endpoint-results",
|
|
|
|
json=sagemaker_result,
|
|
|
|
)
|
|
|
|
|
|
|
|
# Return the first item from the list
|
|
|
|
body = client.invoke_endpoint_async(EndpointName="asdf", InputLocation="qwer")
|
|
|
|
first_output_location = body["OutputLocation"]
|
|
|
|
|
|
|
|
# Same input -> same output
|
|
|
|
body = client.invoke_endpoint_async(EndpointName="asdf", InputLocation="qwer")
|
|
|
|
assert body["OutputLocation"] == first_output_location
|
|
|
|
|
|
|
|
# Different input -> second item
|
|
|
|
body = client.invoke_endpoint_async(
|
|
|
|
EndpointName="asdf", InputLocation="asf", InferenceId="sth"
|
|
|
|
)
|
|
|
|
second_output_location = body["OutputLocation"]
|
|
|
|
assert body["InferenceId"] == "sth"
|
|
|
|
|
|
|
|
s3 = boto3.client("s3", "us-east-1")
|
|
|
|
bucket_name, obj = bucket_and_name_from_url(second_output_location)
|
|
|
|
resp = s3.get_object(Bucket=bucket_name, Key=obj)
|
|
|
|
resp = json.loads(resp["Body"].read().decode("utf-8"))
|
|
|
|
assert resp["Body"] == "second body"
|