Skip to content

Commit 13fc68c

Browse files
authored
fix: handle empty inputs/outputs in ProcessingJob.from_processing_name() (#1348)
1 parent 760a25b commit 13fc68c

File tree

2 files changed

+64
-16
lines changed

2 files changed

+64
-16
lines changed

src/sagemaker/processing.py

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -648,10 +648,9 @@ def from_processing_name(cls, sagemaker_session, processing_job_name):
648648
"""
649649
job_desc = sagemaker_session.describe_processing_job(job_name=processing_job_name)
650650

651-
return cls(
652-
sagemaker_session=sagemaker_session,
653-
job_name=processing_job_name,
654-
inputs=[
651+
inputs = None
652+
if job_desc.get("ProcessingInputs"):
653+
inputs = [
655654
ProcessingInput(
656655
source=processing_input["S3Input"]["S3Uri"],
657656
destination=processing_input["S3Input"]["LocalPath"],
@@ -664,19 +663,31 @@ def from_processing_name(cls, sagemaker_session, processing_job_name):
664663
s3_compression_type=processing_input["S3Input"].get("S3CompressionType"),
665664
)
666665
for processing_input in job_desc["ProcessingInputs"]
667-
],
668-
outputs=[
666+
]
667+
668+
outputs = None
669+
if job_desc.get("ProcessingOutputConfig") and job_desc["ProcessingOutputConfig"].get(
670+
"Outputs"
671+
):
672+
outputs = [
669673
ProcessingOutput(
670-
source=job_desc["ProcessingOutputConfig"]["Outputs"][0]["S3Output"][
671-
"LocalPath"
672-
],
673-
destination=job_desc["ProcessingOutputConfig"]["Outputs"][0]["S3Output"][
674-
"S3Uri"
675-
],
676-
output_name=job_desc["ProcessingOutputConfig"]["Outputs"][0]["OutputName"],
674+
source=processing_output["S3Output"]["LocalPath"],
675+
destination=processing_output["S3Output"]["S3Uri"],
676+
output_name=processing_output["OutputName"],
677677
)
678-
],
679-
output_kms_key=job_desc["ProcessingOutputConfig"].get("KmsKeyId"),
678+
for processing_output in job_desc["ProcessingOutputConfig"]["Outputs"]
679+
]
680+
681+
output_kms_key = None
682+
if job_desc.get("ProcessingOutputConfig"):
683+
output_kms_key = job_desc["ProcessingOutputConfig"].get("KmsKeyId")
684+
685+
return cls(
686+
sagemaker_session=sagemaker_session,
687+
job_name=processing_job_name,
688+
inputs=inputs,
689+
outputs=outputs,
690+
output_kms_key=output_kms_key,
680691
)
681692

682693
@classmethod

tests/integ/test_processing.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,13 @@
2020
from sagemaker import Session
2121
from sagemaker.fw_registry import default_framework_uri
2222

23-
from sagemaker.processing import ProcessingInput, ProcessingOutput, ScriptProcessor, Processor
23+
from sagemaker.processing import (
24+
ProcessingInput,
25+
ProcessingOutput,
26+
ScriptProcessor,
27+
Processor,
28+
ProcessingJob,
29+
)
2430
from sagemaker.sklearn.processing import SKLearnProcessor
2531
from sagemaker.utils import sts_regional_endpoint
2632
from tests.integ import DATA_DIR
@@ -475,6 +481,37 @@ def test_script_processor_with_no_inputs_or_outputs(
475481

476482
assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600}
477483

484+
job_from_name = ProcessingJob.from_processing_name(
485+
sagemaker_session=sagemaker_session,
486+
processing_job_name=job_description["ProcessingJobName"],
487+
)
488+
job_description = job_from_name.describe()
489+
490+
assert job_description["ProcessingInputs"][0]["InputName"] == "code"
491+
492+
assert job_description["ProcessingJobName"].startswith("test-script-processor-with-no-inputs")
493+
494+
assert job_description["ProcessingJobStatus"] == "Completed"
495+
496+
assert job_description["ProcessingResources"]["ClusterConfig"]["InstanceCount"] == 1
497+
assert (
498+
job_description["ProcessingResources"]["ClusterConfig"]["InstanceType"] == cpu_instance_type
499+
)
500+
assert job_description["ProcessingResources"]["ClusterConfig"]["VolumeSizeInGB"] == 100
501+
502+
assert job_description["AppSpecification"]["ContainerArguments"] == ["-v"]
503+
assert job_description["AppSpecification"]["ContainerEntrypoint"] == [
504+
"python3",
505+
"/opt/ml/processing/input/code/dummy_script.py",
506+
]
507+
assert job_description["AppSpecification"]["ImageUri"] == image_uri
508+
509+
assert job_description["Environment"] == {"DUMMY_ENVIRONMENT_VARIABLE": "dummy-value"}
510+
511+
assert ROLE in job_description["RoleArn"]
512+
513+
assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600}
514+
478515

479516
@pytest.mark.canary_quick
480517
def test_processor(sagemaker_session, image_uri, cpu_instance_type, output_kms_key):

0 commit comments

Comments
 (0)