Skip to content

Commit f9d1e2b

Browse files
committed
Added unit tests
1 parent 9f4f949 commit f9d1e2b

File tree

4 files changed

+72
-4
lines changed

4 files changed

+72
-4
lines changed

src/sagemaker/local/utils.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,15 @@ def get_docker_host():
141141
Returns:
142142
docker_host (str): Docker host DNS or IP address
143143
"""
144-
docker_context_string = os.popen("docker context inspect").read()
144+
cmd = "docker context inspect".split()
145+
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
146+
output, err = process.communicate()
147+
if err:
148+
return "localhost"
149+
docker_context_string = output.decode("utf-8")
145150
docker_context_host_url = json.loads(docker_context_string)[0]["Endpoints"]["docker"]["Host"]
146151
parsed_url = urlparse(docker_context_host_url)
147152
if parsed_url.hostname and parsed_url.scheme == "tcp":
148-
docker_host = parsed_url.hostname
153+
return parsed_url.hostname
149154
else:
150-
docker_host = "localhost"
151-
return docker_host
155+
return "localhost"

tests/unit/test_local_entities.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,28 @@ def test_local_transform_job_perform_batch_inference(
163163
assert len(output_files) == 2
164164
assert "file1.out" in output_files
165165
assert "file2.out" in output_files
166+
167+
168+
@patch("sagemaker.local.entities._SageMakerContainer", Mock())
169+
@patch("sagemaker.local.entities.get_docker_host")
170+
@patch("sagemaker.local.entities._perform_request")
171+
@patch("sagemaker.local.entities._LocalTransformJob._perform_batch_inference")
172+
def test_start_local_transform_job_from_remote_docker_host(
173+
m_perform_batch_inference, m_perform_request, m_get_docker_host, local_transform_job
174+
):
175+
input_data = {}
176+
output_data = {}
177+
transform_resources = {"InstanceType": "local"}
178+
m_get_docker_host.return_value = "some_host"
179+
perform_request_mock = Mock()
180+
m_perform_request.return_value = (perform_request_mock, 200)
181+
perform_request_mock.read.return_value = '{"BatchStrategy": "SingleRecord"}'
182+
local_transform_job.primary_container["ModelDataUrl"] = "file:///some/model"
183+
local_transform_job.start(input_data, output_data, transform_resources, Environment={})
184+
endpoints = [
185+
"http://%s:%d/ping" % ("some_host", 8080),
186+
"http://%s:%d/execution-parameters" % ("some_host", 8080),
187+
]
188+
calls = m_perform_request.call_args_list
189+
for call, endpoint in zip(calls, endpoints):
190+
assert call[0][0] == endpoint

tests/unit/test_local_session.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,3 +857,18 @@ def test_local_session_download_with_custom_s3_endpoint_url(sagemaker_session_cu
857857
Filename="{}/{}".format(DOWNLOAD_DATA_TESTS_FILES_DIR, "test.csv"),
858858
ExtraArgs=None,
859859
)
860+
861+
862+
@patch("sagemaker.local.local_session.get_docker_host")
863+
@patch("urllib3.PoolManager.request")
864+
def test_invoke_local_endpoint_with_remote_docker_host(
865+
m_request,
866+
m_get_docker_host,
867+
):
868+
m_get_docker_host.return_value = "some_host"
869+
Body = "Body".encode("utf-8")
870+
url = "http://%s:%d/invocations" % ("some_host", 8080)
871+
sagemaker.local.local_session.LocalSagemakerRuntimeClient().invoke_endpoint(
872+
Body, "local_endpoint"
873+
)
874+
m_request.assert_called_with("POST", url, body=Body, preload_content=False, headers={})

tests/unit/test_local_utils.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,27 @@ def test_get_child_process_ids(m_subprocess):
9292
m_subprocess.Popen.return_value = process_mock
9393
sagemaker.local.utils.get_child_process_ids("pid")
9494
m_subprocess.Popen.assert_called_with(cmd, stdout=m_subprocess.PIPE, stderr=m_subprocess.PIPE)
95+
96+
97+
@patch("sagemaker.local.utils.subprocess")
98+
def test_get_docker_host(m_subprocess):
99+
cmd = "docker context inspect".split()
100+
process_mock = Mock()
101+
endpoints = [
102+
{"test": "tcp://host:port", "result": "host"},
103+
{"test": "fd://something", "result": "localhost"},
104+
{"test": "unix://path/to/socket", "result": "localhost"},
105+
{"test": "npipe:////./pipe/foo", "result": "localhost"},
106+
]
107+
for endpoint in endpoints:
108+
return_value = (
109+
'[\n{\n"Endpoints":{\n"docker":{\n"Host": "%s"}\n}\n}\n]\n' % endpoint["test"]
110+
)
111+
attrs = {"communicate.return_value": (return_value.encode("utf-8"), None), "returncode": 0}
112+
process_mock.configure_mock(**attrs)
113+
m_subprocess.Popen.return_value = process_mock
114+
host = sagemaker.local.utils.get_docker_host()
115+
m_subprocess.Popen.assert_called_with(
116+
cmd, stdout=m_subprocess.PIPE, stderr=m_subprocess.PIPE
117+
)
118+
assert host == endpoint["result"]

0 commit comments

Comments
 (0)