Skip to content

Commit 70eb3a5

Browse files
authored
breaking: deprecate fw_utils.parse_s3_url in favor of s3.parse_s3_url (#1772)
1 parent 2132dd9 commit 70eb3a5

File tree

7 files changed

+30
-47
lines changed

7 files changed

+30
-47
lines changed

src/sagemaker/estimator.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,10 @@
2929
from sagemaker.debugger import DebuggerHookConfig
3030
from sagemaker.debugger import TensorBoardOutputConfig # noqa: F401 # pylint: disable=unused-import
3131
from sagemaker.debugger import get_rule_container_image_uri
32-
from sagemaker.s3 import S3Uploader
32+
from sagemaker.s3 import S3Uploader, parse_s3_url
3333

3434
from sagemaker.fw_utils import (
3535
tar_and_upload_dir,
36-
parse_s3_url,
3736
UploadedCode,
3837
validate_source_dir,
3938
_region_supports_debugger,

src/sagemaker/fw_utils.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from collections import namedtuple
2222

2323
import sagemaker.utils
24-
from sagemaker import s3
2524

2625
logger = logging.getLogger("sagemaker")
2726

@@ -264,20 +263,6 @@ def framework_version_from_tag(image_tag):
264263
return None if tag_match is None else tag_match.group(1)
265264

266265

267-
def parse_s3_url(url):
268-
"""Calls the method with the same name in the s3 module.
269-
270-
:func:~sagemaker.s3.parse_s3_url
271-
272-
Args:
273-
url: A URL, expected with an s3 scheme.
274-
275-
Returns: The return value of s3.parse_s3_url, which is a tuple containing:
276-
str: S3 bucket name str: S3 key
277-
"""
278-
return s3.parse_s3_url(url)
279-
280-
281266
def model_code_key_prefix(code_location_key_prefix, model_name, image):
282267
"""Returns the s3 key prefix for uploading code during model deployment
283268
The location returned is a potential concatenation of 2 parts

src/sagemaker/model.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
import os
1919

2020
import sagemaker
21-
from sagemaker import fw_utils, image_uris, local, session, utils, git_utils
22-
from sagemaker.fw_utils import UploadedCode
21+
from sagemaker import fw_utils, image_uris, local, s3, session, utils, git_utils
2322
from sagemaker.transformer import Transformer
2423

2524
LOGGER = logging.getLogger("sagemaker")
@@ -715,7 +714,7 @@ def __init__(
715714
self.git_config = git_config
716715
self.container_log_level = container_log_level
717716
if code_location:
718-
self.bucket, self.key_prefix = fw_utils.parse_s3_url(code_location)
717+
self.bucket, self.key_prefix = s3.parse_s3_url(code_location)
719718
else:
720719
self.bucket, self.key_prefix = None, None
721720
if self.git_config:
@@ -788,7 +787,7 @@ def _upload_code(self, key_prefix, repack=False):
788787
)
789788

790789
self.repacked_model_data = repacked_model_data
791-
self.uploaded_code = UploadedCode(
790+
self.uploaded_code = fw_utils.UploadedCode(
792791
s3_prefix=self.repacked_model_data, script_name=os.path.basename(self.entry_point)
793792
)
794793

src/sagemaker/workflow/airflow.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import re
1818

1919
import sagemaker
20-
from sagemaker import fw_utils, job, utils, session, vpc_utils
20+
from sagemaker import fw_utils, job, utils, s3, session, vpc_utils
2121
from sagemaker.amazon import amazon_estimator
2222
from sagemaker.tensorflow import TensorFlow
2323

@@ -33,10 +33,10 @@ def prepare_framework(estimator, s3_operations):
3333
`source_dir` ).
3434
"""
3535
if estimator.code_location is not None:
36-
bucket, key = fw_utils.parse_s3_url(estimator.code_location)
36+
bucket, key = s3.parse_s3_url(estimator.code_location)
3737
key = os.path.join(key, estimator._current_job_name, "source", "sourcedir.tar.gz")
3838
elif estimator.uploaded_code is not None:
39-
bucket, key = fw_utils.parse_s3_url(estimator.uploaded_code.s3_prefix)
39+
bucket, key = s3.parse_s3_url(estimator.uploaded_code.s3_prefix)
4040
else:
4141
bucket = estimator.sagemaker_session._default_bucket
4242
key = os.path.join(estimator._current_job_name, "source", "sourcedir.tar.gz")

tests/unit/test_airflow.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def test_byo_training_config_all_args(sagemaker_session):
168168
@patch("os.path.isfile", MagicMock(return_value=True))
169169
@patch("sagemaker.estimator.tar_and_upload_dir", MagicMock())
170170
@patch(
171-
"sagemaker.fw_utils.parse_s3_url",
171+
"sagemaker.s3.parse_s3_url",
172172
MagicMock(
173173
return_value=["output", "tensorflow-training-{}/source/sourcedir.tar.gz".format(TIME_STAMP)]
174174
),
@@ -468,7 +468,7 @@ def test_amazon_alg_training_config_all_args(sagemaker_session):
468468
@patch("os.path.isfile", MagicMock(return_value=True))
469469
@patch("sagemaker.estimator.tar_and_upload_dir", MagicMock())
470470
@patch(
471-
"sagemaker.fw_utils.parse_s3_url",
471+
"sagemaker.s3.parse_s3_url",
472472
MagicMock(
473473
return_value=[
474474
"output",
@@ -610,7 +610,7 @@ def test_framework_tuning_config(retrieve_image_uri, sagemaker_session):
610610
@patch("os.path.isfile", MagicMock(return_value=True))
611611
@patch("sagemaker.estimator.tar_and_upload_dir", MagicMock())
612612
@patch(
613-
"sagemaker.fw_utils.parse_s3_url",
613+
"sagemaker.s3.parse_s3_url",
614614
MagicMock(
615615
return_value=[
616616
"output",
@@ -1020,7 +1020,7 @@ def test_amazon_alg_model_config(sagemaker_session):
10201020
@patch("os.path.isfile", MagicMock(return_value=True))
10211021
@patch("sagemaker.estimator.tar_and_upload_dir", MagicMock())
10221022
@patch(
1023-
"sagemaker.fw_utils.parse_s3_url",
1023+
"sagemaker.s3.parse_s3_url",
10241024
MagicMock(
10251025
return_value=[
10261026
"output",
@@ -1185,7 +1185,7 @@ def test_transform_config(sagemaker_session):
11851185
@patch("os.path.isfile", MagicMock(return_value=True))
11861186
@patch("sagemaker.estimator.tar_and_upload_dir", MagicMock())
11871187
@patch(
1188-
"sagemaker.fw_utils.parse_s3_url",
1188+
"sagemaker.s3.parse_s3_url",
11891189
MagicMock(
11901190
return_value=[
11911191
"output",
@@ -1436,7 +1436,7 @@ def test_deploy_amazon_alg_model_config(sagemaker_session):
14361436
@patch("os.path.isfile", MagicMock(return_value=True))
14371437
@patch("sagemaker.estimator.tar_and_upload_dir", MagicMock())
14381438
@patch(
1439-
"sagemaker.fw_utils.parse_s3_url",
1439+
"sagemaker.s3.parse_s3_url",
14401440
MagicMock(
14411441
return_value=[
14421442
"output",

tests/unit/test_fw_utils.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -411,18 +411,6 @@ def test_framework_version_from_tag_other():
411411
assert version is None
412412

413413

414-
def test_parse_s3_url():
415-
bucket, key_prefix = fw_utils.parse_s3_url("s3://bucket/code_location")
416-
assert "bucket" == bucket
417-
assert "code_location" == key_prefix
418-
419-
420-
def test_parse_s3_url_fail():
421-
with pytest.raises(ValueError) as error:
422-
fw_utils.parse_s3_url("t3://code_location")
423-
assert "Expecting 's3' scheme" in str(error)
424-
425-
426414
def test_model_code_key_prefix_with_all_values_present():
427415
key_prefix = fw_utils.model_code_key_prefix("prefix", "model_name", "image_uri")
428416
assert key_prefix == "prefix/model_name"

tests/unit/test_s3.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import pytest
1717
from mock import Mock
1818

19-
from sagemaker.s3 import S3Uploader, S3Downloader
19+
from sagemaker import s3
2020

2121
BUCKET_NAME = "mybucket"
2222
REGION = "us-west-2"
@@ -42,7 +42,7 @@ def sagemaker_session():
4242

4343
def test_upload(sagemaker_session, caplog):
4444
desired_s3_uri = os.path.join("s3://", BUCKET_NAME, CURRENT_JOB_NAME, SOURCE_NAME)
45-
S3Uploader.upload(
45+
s3.S3Uploader.upload(
4646
local_path="/path/to/app.jar",
4747
desired_s3_uri=desired_s3_uri,
4848
sagemaker_session=sagemaker_session,
@@ -57,7 +57,7 @@ def test_upload(sagemaker_session, caplog):
5757

5858
def test_upload_with_kms_key(sagemaker_session):
5959
desired_s3_uri = os.path.join("s3://", BUCKET_NAME, CURRENT_JOB_NAME, SOURCE_NAME)
60-
S3Uploader.upload(
60+
s3.S3Uploader.upload(
6161
local_path="/path/to/app.jar",
6262
desired_s3_uri=desired_s3_uri,
6363
kms_key=KMS_KEY,
@@ -73,7 +73,7 @@ def test_upload_with_kms_key(sagemaker_session):
7373

7474
def test_download(sagemaker_session):
7575
s3_uri = os.path.join("s3://", BUCKET_NAME, CURRENT_JOB_NAME, SOURCE_NAME)
76-
S3Downloader.download(
76+
s3.S3Downloader.download(
7777
s3_uri=s3_uri, local_path="/path/for/download/", sagemaker_session=sagemaker_session
7878
)
7979
sagemaker_session.download_data.assert_called_with(
@@ -86,7 +86,7 @@ def test_download(sagemaker_session):
8686

8787
def test_download_with_kms_key(sagemaker_session):
8888
s3_uri = os.path.join("s3://", BUCKET_NAME, CURRENT_JOB_NAME, SOURCE_NAME)
89-
S3Downloader.download(
89+
s3.S3Downloader.download(
9090
s3_uri=s3_uri,
9191
local_path="/path/for/download/",
9292
kms_key=KMS_KEY,
@@ -98,3 +98,15 @@ def test_download_with_kms_key(sagemaker_session):
9898
key_prefix=os.path.join(CURRENT_JOB_NAME, SOURCE_NAME),
9999
extra_args={"SSECustomerKey": KMS_KEY},
100100
)
101+
102+
103+
def test_parse_s3_url():
104+
bucket, key_prefix = s3.parse_s3_url("s3://bucket/code_location")
105+
assert "bucket" == bucket
106+
assert "code_location" == key_prefix
107+
108+
109+
def test_parse_s3_url_fail():
110+
with pytest.raises(ValueError) as error:
111+
s3.parse_s3_url("t3://code_location")
112+
assert "Expecting 's3' scheme" in str(error)

0 commit comments

Comments
 (0)