Skip to content

Commit 2db9ae8

Browse files
author
Pravali Uppugunduri
committed
fix: Update all model server prepare.py to use plain SHA-256
Remove generate_secret_key import and usage from TorchServe, MMS, TF Serving, and SMD prepare functions. Switch compute_hash calls from HMAC-SHA256 to plain SHA-256 (no secret_key parameter). This is required because generate_secret_key was removed from check_integrity.py in the previous commit. Without this change, all model server imports fail with ImportError.
1 parent 644fc16 commit 2db9ae8

File tree

6 files changed

+23
-37
lines changed

6 files changed

+23
-37
lines changed

sagemaker-serve/src/sagemaker/serve/model_server/multi_model_server/prepare.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
from sagemaker.serve.spec.inference_spec import InferenceSpec
2727
from sagemaker.serve.detector.dependency_manager import capture_dependencies
2828
from sagemaker.serve.validations.check_integrity import (
29-
generate_secret_key,
3029
compute_hash,
3130
)
3231
from sagemaker.core.remote_function.core.serialization import _MetaData
@@ -119,11 +118,10 @@ def prepare_for_mms(
119118

120119
capture_dependencies(dependencies=dependencies, work_dir=code_dir)
121120

122-
secret_key = generate_secret_key()
123121
with open(str(code_dir.joinpath("serve.pkl")), "rb") as f:
124122
buffer = f.read()
125-
hash_value = compute_hash(buffer=buffer, secret_key=secret_key)
123+
hash_value = compute_hash(buffer=buffer)
126124
with open(str(code_dir.joinpath("metadata.json")), "wb") as metadata:
127125
metadata.write(_MetaData(hash_value).to_json())
128126

129-
return secret_key
127+
return ""

sagemaker-serve/src/sagemaker/serve/model_server/smd/prepare.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from sagemaker.serve.spec.inference_spec import InferenceSpec
1313
from sagemaker.serve.detector.dependency_manager import capture_dependencies
1414
from sagemaker.serve.validations.check_integrity import (
15-
generate_secret_key,
1615
compute_hash,
1716
)
1817
from sagemaker.core.remote_function.core.serialization import _MetaData
@@ -64,11 +63,10 @@ def prepare_for_smd(
6463

6564
capture_dependencies(dependencies=dependencies, work_dir=code_dir)
6665

67-
secret_key = generate_secret_key()
6866
with open(str(code_dir.joinpath("serve.pkl")), "rb") as f:
6967
buffer = f.read()
70-
hash_value = compute_hash(buffer=buffer, secret_key=secret_key)
68+
hash_value = compute_hash(buffer=buffer)
7169
with open(str(code_dir.joinpath("metadata.json")), "wb") as metadata:
7270
metadata.write(_MetaData(hash_value).to_json())
7371

74-
return secret_key
72+
return ""

sagemaker-serve/src/sagemaker/serve/model_server/tensorflow_serving/prepare.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
)
1212
from sagemaker.serve.detector.dependency_manager import capture_dependencies
1313
from sagemaker.serve.validations.check_integrity import (
14-
generate_secret_key,
1514
compute_hash,
1615
)
1716
from sagemaker.core.remote_function.core.serialization import _MetaData
@@ -57,11 +56,10 @@ def prepare_for_tf_serving(
5756
raise ValueError("SavedModel is not found for Tensorflow or Keras flavor.")
5857
_move_contents(src_dir=mlflow_saved_model_dir, dest_dir=saved_model_bundle_dir)
5958

60-
secret_key = generate_secret_key()
6159
with open(str(code_dir.joinpath("serve.pkl")), "rb") as f:
6260
buffer = f.read()
63-
hash_value = compute_hash(buffer=buffer, secret_key=secret_key)
61+
hash_value = compute_hash(buffer=buffer)
6462
with open(str(code_dir.joinpath("metadata.json")), "wb") as metadata:
6563
metadata.write(_MetaData(hash_value).to_json())
6664

67-
return secret_key
65+
return ""

sagemaker-serve/src/sagemaker/serve/model_server/torchserve/prepare.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from sagemaker.serve.spec.inference_spec import InferenceSpec
1414
from sagemaker.serve.detector.dependency_manager import capture_dependencies
1515
from sagemaker.serve.validations.check_integrity import (
16-
generate_secret_key,
1716
compute_hash,
1817
)
1918
from sagemaker.serve.validations.check_image_uri import is_1p_image_uri
@@ -67,11 +66,10 @@ def prepare_for_torchserve(
6766

6867
capture_dependencies(dependencies=dependencies, work_dir=code_dir)
6968

70-
secret_key = generate_secret_key()
7169
with open(str(code_dir.joinpath("serve.pkl")), "rb") as f:
7270
buffer = f.read()
73-
hash_value = compute_hash(buffer=buffer, secret_key=secret_key)
71+
hash_value = compute_hash(buffer=buffer)
7472
with open(str(code_dir.joinpath("metadata.json")), "wb") as metadata:
7573
metadata.write(_MetaData(hash_value).to_json())
7674

77-
return secret_key
75+
return ""

sagemaker-serve/tests/unit/test_model_builder_utils_triton.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ class TestHMACSignin(unittest.TestCase):
265265
"""Test _compute_integrity_hash method."""
266266

267267
def test_compute_integrity_hash(self):
268-
"""Test HMAC signing."""
268+
"""Test SHA-256 integrity hash computation."""
269269
utils = _ModelBuilderUtils()
270270

271271
with tempfile.TemporaryDirectory() as tmpdir:
@@ -278,8 +278,7 @@ def test_compute_integrity_hash(self):
278278

279279
utils._compute_integrity_hash()
280280

281-
# Secret key is generated, not mocked
282-
self.assertIsNotNone(utils.secret_key)
281+
# metadata.json should be created with the SHA-256 hash
283282
self.assertTrue((pkl_path / "metadata.json").exists())
284283

285284

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,45 @@
11
import unittest
2-
import tempfile
32
from pathlib import Path
43
from unittest.mock import patch, mock_open
54
from sagemaker.serve.validations.check_integrity import (
6-
generate_secret_key,
75
compute_hash,
86
perform_integrity_check
97
)
108

119

1210
class TestCheckIntegrity(unittest.TestCase):
13-
def test_generate_secret_key(self):
14-
key = generate_secret_key()
15-
self.assertIsInstance(key, str)
16-
self.assertEqual(len(key), 64)
17-
18-
def test_generate_secret_key_custom_bytes(self):
19-
key = generate_secret_key(nbytes=16)
20-
self.assertEqual(len(key), 32)
21-
2211
def test_compute_hash(self):
2312
buffer = b"test data"
24-
secret_key = "test_secret"
25-
hash_value = compute_hash(buffer, secret_key)
13+
hash_value = compute_hash(buffer)
2614
self.assertIsInstance(hash_value, str)
2715
self.assertEqual(len(hash_value), 64)
2816

2917
def test_compute_hash_consistency(self):
3018
buffer = b"test data"
31-
secret_key = "test_secret"
32-
hash1 = compute_hash(buffer, secret_key)
33-
hash2 = compute_hash(buffer, secret_key)
19+
hash1 = compute_hash(buffer)
20+
hash2 = compute_hash(buffer)
3421
self.assertEqual(hash1, hash2)
3522

36-
@patch.dict("os.environ", {"SAGEMAKER_SERVE_SECRET_KEY": "test_key"})
23+
def test_compute_hash_different_data(self):
24+
hash1 = compute_hash(b"data1")
25+
hash2 = compute_hash(b"data2")
26+
self.assertNotEqual(hash1, hash2)
27+
3728
@patch("pathlib.Path.exists")
3829
@patch("builtins.open", new_callable=mock_open, read_data=b'{"sha256_hash": "test_hash"}')
3930
@patch("sagemaker.serve.validations.check_integrity._MetaData.from_json")
4031
def test_perform_integrity_check_failure(self, mock_metadata, mock_file, mock_exists):
4132
mock_exists.return_value = True
4233
mock_meta = type("obj", (object,), {"sha256_hash": "wrong_hash"})()
4334
mock_metadata.return_value = mock_meta
44-
35+
4536
with self.assertRaises(ValueError):
4637
perform_integrity_check(b"test", Path("/tmp/metadata.json"))
4738

39+
def test_perform_integrity_check_missing_metadata(self):
40+
with self.assertRaises(ValueError, msg="Path to metadata.json does not exist"):
41+
perform_integrity_check(b"test", Path("/nonexistent/metadata.json"))
42+
4843

4944
if __name__ == "__main__":
5045
unittest.main()

0 commit comments

Comments
 (0)