17
17
18
18
import pytest
19
19
20
- from mock import Mock , patch
20
+ from mock import Mock , call , patch
21
21
22
22
from sagemaker import s3
23
23
from sagemaker .session_settings import SessionSettings
@@ -492,8 +492,10 @@ def test_pipeline_start_selective_execution(sagemaker_session_mock):
492
492
"SourcePipelineExecutionArn" : "foo-arn" ,
493
493
},
494
494
)
495
+ sagemaker_session_mock .reset_mock ()
495
496
496
497
# Case 2: Start selective execution without SourcePipelineExecutionArn
498
+ # References latest execution by default.
497
499
sagemaker_session_mock .sagemaker_client .list_pipeline_executions .return_value = {
498
500
"PipelineExecutionSummaries" : [
499
501
{
@@ -523,6 +525,27 @@ def test_pipeline_start_selective_execution(sagemaker_session_mock):
523
525
"SourcePipelineExecutionArn" : "my:latest:execution:arn" ,
524
526
},
525
527
)
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 ()
526
549
527
550
528
551
def test_pipeline_basic ():
@@ -718,13 +741,99 @@ def test_pipeline_list_executions(sagemaker_session_mock):
718
741
assert executions ["NextToken" ] == "token"
719
742
720
743
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
+
721
826
def test_pipeline_execution_basics (sagemaker_session_mock ):
722
827
sagemaker_session_mock .sagemaker_client .start_pipeline_execution .return_value = {
723
828
"PipelineExecutionArn" : "my:arn"
724
829
}
725
830
sagemaker_session_mock .sagemaker_client .list_pipeline_execution_steps .return_value = {
726
831
"PipelineExecutionSteps" : [Mock ()]
727
832
}
833
+ sagemaker_session_mock .sagemaker_client .list_pipeline_parameters_for_execution .return_value = {
834
+ "PipelineParameters" : [{"Name" : "TestParameterName" , "Value" : "TestParameterValue" }],
835
+ "NextToken" : "token" ,
836
+ }
728
837
pipeline = Pipeline (
729
838
name = "MyPipeline" ,
730
839
parameters = [ParameterString ("alpha" , "beta" ), ParameterString ("gamma" , "delta" )],
@@ -745,6 +854,17 @@ def test_pipeline_execution_basics(sagemaker_session_mock):
745
854
PipelineExecutionArn = "my:arn"
746
855
)
747
856
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"
748
868
749
869
750
870
def _generate_large_pipeline_steps (input_data : object ):
0 commit comments