1717
1818import pytest
1919
20- from mock import Mock , patch
20+ from mock import Mock , call , patch
2121
2222from sagemaker import s3
2323from sagemaker .session_settings import SessionSettings
@@ -492,8 +492,10 @@ def test_pipeline_start_selective_execution(sagemaker_session_mock):
492492 "SourcePipelineExecutionArn" : "foo-arn" ,
493493 },
494494 )
495+ sagemaker_session_mock .reset_mock ()
495496
496497 # Case 2: Start selective execution without SourcePipelineExecutionArn
498+ # References latest execution by default.
497499 sagemaker_session_mock .sagemaker_client .list_pipeline_executions .return_value = {
498500 "PipelineExecutionSummaries" : [
499501 {
@@ -523,6 +525,27 @@ def test_pipeline_start_selective_execution(sagemaker_session_mock):
523525 "SourcePipelineExecutionArn" : "my:latest:execution:arn" ,
524526 },
525527 )
528+ sagemaker_session_mock .reset_mock ()
529+
530+ # Case 3: Start selective execution without SourcePipelineExecutionArn
531+ # Opts not to reference latest execution.
532+ selective_execution_config = SelectiveExecutionConfig (
533+ selected_steps = ["step-1" , "step-2" , "step-3" ],
534+ reference_latest_execution = False ,
535+ )
536+ pipeline .start (selective_execution_config = selective_execution_config )
537+ sagemaker_session_mock .sagemaker_client .list_pipeline_executions .assert_not_called ()
538+ sagemaker_session_mock .sagemaker_client .start_pipeline_execution .assert_called_with (
539+ PipelineName = "MyPipeline" ,
540+ SelectiveExecutionConfig = {
541+ "SelectedSteps" : [
542+ {"StepName" : "step-1" },
543+ {"StepName" : "step-2" },
544+ {"StepName" : "step-3" },
545+ ],
546+ },
547+ )
548+ sagemaker_session_mock .reset_mock ()
526549
527550
528551def test_pipeline_basic ():
@@ -718,13 +741,99 @@ def test_pipeline_list_executions(sagemaker_session_mock):
718741 assert executions ["NextToken" ] == "token"
719742
720743
744+ def test_pipeline_build_parameters_from_execution (sagemaker_session_mock ):
745+ pipeline = Pipeline (
746+ name = "MyPipeline" ,
747+ sagemaker_session = sagemaker_session_mock ,
748+ )
749+ reference_execution_arn = "reference_execution_arn"
750+ parameter_value_overrides = {"TestParameterName" : "NewParameterValue" }
751+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .return_value = {
752+ "PipelineParameters" : [{"Name" : "TestParameterName" , "Value" : "TestParameterValue" }]
753+ }
754+ parameters = pipeline .build_parameters_from_execution (
755+ pipeline_execution_arn = reference_execution_arn ,
756+ parameter_value_overrides = parameter_value_overrides ,
757+ )
758+ assert (
759+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .called_with (
760+ PipelineExecutionArn = reference_execution_arn
761+ )
762+ )
763+ assert len (parameters ) == 1
764+ assert parameters ["TestParameterName" ] == "NewParameterValue"
765+
766+
767+ def test_pipeline_build_parameters_from_execution_with_invalid_overrides (sagemaker_session_mock ):
768+ pipeline = Pipeline (
769+ name = "MyPipeline" ,
770+ sagemaker_session = sagemaker_session_mock ,
771+ )
772+ reference_execution_arn = "reference_execution_arn"
773+ invalid_parameter_value_overrides = {"InvalidParameterName" : "Value" }
774+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .return_value = {
775+ "PipelineParameters" : [{"Name" : "TestParameterName" , "Value" : "TestParameterValue" }]
776+ }
777+ with pytest .raises (ValueError ) as error :
778+ pipeline .build_parameters_from_execution (
779+ pipeline_execution_arn = reference_execution_arn ,
780+ parameter_value_overrides = invalid_parameter_value_overrides ,
781+ )
782+ assert (
783+ f"The following parameter overrides provided: { str (set (invalid_parameter_value_overrides .keys ()))} "
784+ + f"are not present in the pipeline execution: { reference_execution_arn } "
785+ in str (error )
786+ )
787+ assert (
788+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .called_with (
789+ PipelineExecutionArn = reference_execution_arn
790+ )
791+ )
792+
793+
794+ def test_pipeline_build_parameters_from_execution_with_paginated_result (sagemaker_session_mock ):
795+ pipeline = Pipeline (
796+ name = "MyPipeline" ,
797+ sagemaker_session = sagemaker_session_mock ,
798+ )
799+ reference_execution_arn = "reference_execution_arn"
800+ next_token = "token"
801+ first_page_response = {
802+ "PipelineParameters" : [{"Name" : "TestParameterName1" , "Value" : "TestParameterValue1" }],
803+ "NextToken" : next_token ,
804+ }
805+ second_page_response = {
806+ "PipelineParameters" : [{"Name" : "TestParameterName2" , "Value" : "TestParameterValue2" }],
807+ }
808+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .side_effect = [
809+ first_page_response ,
810+ second_page_response ,
811+ ]
812+ parameters = pipeline .build_parameters_from_execution (
813+ pipeline_execution_arn = reference_execution_arn
814+ )
815+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .assert_has_calls (
816+ [
817+ call (PipelineExecutionArn = reference_execution_arn ),
818+ call (PipelineExecutionArn = reference_execution_arn , NextToken = next_token ),
819+ ]
820+ )
821+ assert len (parameters ) == 2
822+ assert parameters ["TestParameterName1" ] == "TestParameterValue1"
823+ assert parameters ["TestParameterName2" ] == "TestParameterValue2"
824+
825+
721826def test_pipeline_execution_basics (sagemaker_session_mock ):
722827 sagemaker_session_mock .sagemaker_client .start_pipeline_execution .return_value = {
723828 "PipelineExecutionArn" : "my:arn"
724829 }
725830 sagemaker_session_mock .sagemaker_client .list_pipeline_execution_steps .return_value = {
726831 "PipelineExecutionSteps" : [Mock ()]
727832 }
833+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .return_value = {
834+ "PipelineParameters" : [{"Name" : "TestParameterName" , "Value" : "TestParameterValue" }],
835+ "NextToken" : "token" ,
836+ }
728837 pipeline = Pipeline (
729838 name = "MyPipeline" ,
730839 parameters = [ParameterString ("alpha" , "beta" ), ParameterString ("gamma" , "delta" )],
@@ -745,6 +854,17 @@ def test_pipeline_execution_basics(sagemaker_session_mock):
745854 PipelineExecutionArn = "my:arn"
746855 )
747856 assert len (steps ) == 1
857+ list_parameters_response = execution .list_parameters ()
858+ assert (
859+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .called_with (
860+ PipelineExecutionArn = "my:arn"
861+ )
862+ )
863+ parameter_list = list_parameters_response ["PipelineParameters" ]
864+ assert len (parameter_list ) == 1
865+ assert parameter_list [0 ]["Name" ] == "TestParameterName"
866+ assert parameter_list [0 ]["Value" ] == "TestParameterValue"
867+ assert list_parameters_response ["NextToken" ] == "token"
748868
749869
750870def _generate_large_pipeline_steps (input_data : object ):
0 commit comments