@@ -554,6 +554,112 @@ mod tests {
554554 ) ;
555555 }
556556
557+ #[ test]
558+ fn test_deep_merge_config_overrides_base_only ( ) {
559+ let base = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
560+ ---
561+ apiVersion: spark.stackable.tech/v1alpha1
562+ kind: SparkApplication
563+ metadata:
564+ name: base-app
565+ spec:
566+ mode: cluster
567+ mainApplicationFile: base.py
568+ sparkImage:
569+ productVersion: "3.5.8"
570+ job:
571+ configOverrides:
572+ security.properties:
573+ test.base.only: base
574+ config:
575+ retryOnFailureCount: 1
576+ "# } )
577+ . unwrap ( ) ;
578+
579+ let overlay = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
580+ ---
581+ apiVersion: spark.stackable.tech/v1alpha1
582+ kind: SparkApplication
583+ metadata:
584+ name: overlay-app
585+ spec:
586+ mode: cluster
587+ mainApplicationFile: overlay.py
588+ sparkImage:
589+ productVersion: "4.1.0"
590+ job:
591+ config:
592+ retryOnFailureCount: 2
593+ "# } )
594+ . unwrap ( ) ;
595+
596+ let merged = deep_merge ( & base, & overlay) ;
597+ let submit_security_props = merged
598+ . spec
599+ . job
600+ . as_ref ( )
601+ . and_then ( |j| j. config_overrides . get ( "security.properties" ) )
602+ . unwrap ( ) ;
603+
604+ assert_eq ! (
605+ submit_security_props. get( "test.base.only" ) ,
606+ Some ( & "base" . to_string( ) )
607+ ) ;
608+ }
609+
610+ #[ test]
611+ fn test_deep_merge_config_overrides_overlay_only ( ) {
612+ let base = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
613+ ---
614+ apiVersion: spark.stackable.tech/v1alpha1
615+ kind: SparkApplication
616+ metadata:
617+ name: base-app
618+ spec:
619+ mode: cluster
620+ mainApplicationFile: base.py
621+ sparkImage:
622+ productVersion: "3.5.8"
623+ job:
624+ config:
625+ retryOnFailureCount: 1
626+ "# } )
627+ . unwrap ( ) ;
628+
629+ let overlay = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
630+ ---
631+ apiVersion: spark.stackable.tech/v1alpha1
632+ kind: SparkApplication
633+ metadata:
634+ name: overlay-app
635+ spec:
636+ mode: cluster
637+ mainApplicationFile: overlay.py
638+ sparkImage:
639+ productVersion: "4.1.0"
640+ job:
641+ configOverrides:
642+ security.properties:
643+ test.overlay.only: overlay
644+ config:
645+ retryOnFailureCount: 2
646+ "# } )
647+ . unwrap ( ) ;
648+
649+ let merged = deep_merge ( & base, & overlay) ;
650+ let submit_security_props = merged
651+ . spec
652+ . job
653+ . as_ref ( )
654+ . and_then ( |j| j. config_overrides . get ( "security.properties" ) )
655+ . unwrap ( ) ;
656+
657+ assert_eq ! (
658+ submit_security_props. get( "test.overlay.only" ) ,
659+ Some ( & "overlay" . to_string( ) )
660+ ) ;
661+ }
662+
557663 #[ test]
558664 fn test_deep_merge_env_overrides ( ) {
559665 let base = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
@@ -915,6 +1021,135 @@ mod tests {
9151021 ) ;
9161022 }
9171023
1024+ #[ test]
1025+ fn test_deep_merge_pod_overrides_base_only ( ) {
1026+ let base = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
1027+ ---
1028+ apiVersion: spark.stackable.tech/v1alpha1
1029+ kind: SparkApplication
1030+ metadata:
1031+ name: base-app
1032+ spec:
1033+ mode: cluster
1034+ mainApplicationFile: base.py
1035+ sparkImage:
1036+ productVersion: "3.5.8"
1037+ job:
1038+ podOverrides:
1039+ spec:
1040+ serviceAccountName: base-sa
1041+ nodeSelector:
1042+ test.base.only: base
1043+ config:
1044+ retryOnFailureCount: 1
1045+ "# } )
1046+ . unwrap ( ) ;
1047+
1048+ let overlay = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
1049+ ---
1050+ apiVersion: spark.stackable.tech/v1alpha1
1051+ kind: SparkApplication
1052+ metadata:
1053+ name: overlay-app
1054+ spec:
1055+ mode: cluster
1056+ mainApplicationFile: overlay.py
1057+ sparkImage:
1058+ productVersion: "4.1.0"
1059+ job:
1060+ config:
1061+ retryOnFailureCount: 2
1062+ "# } )
1063+ . unwrap ( ) ;
1064+
1065+ let merged = deep_merge ( & base, & overlay) ;
1066+ let submit_spec = merged
1067+ . spec
1068+ . job
1069+ . as_ref ( )
1070+ . unwrap ( )
1071+ . pod_overrides
1072+ . spec
1073+ . as_ref ( )
1074+ . unwrap ( ) ;
1075+
1076+ assert_eq ! ( submit_spec. service_account_name. as_deref( ) , Some ( "base-sa" ) ) ;
1077+ assert_eq ! (
1078+ submit_spec
1079+ . node_selector
1080+ . as_ref( )
1081+ . and_then( |selector| selector. get( "test.base.only" ) )
1082+ . map( String :: as_str) ,
1083+ Some ( "base" )
1084+ ) ;
1085+ }
1086+
1087+ #[ test]
1088+ fn test_deep_merge_pod_overrides_overlay_only ( ) {
1089+ let base = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
1090+ ---
1091+ apiVersion: spark.stackable.tech/v1alpha1
1092+ kind: SparkApplication
1093+ metadata:
1094+ name: base-app
1095+ spec:
1096+ mode: cluster
1097+ mainApplicationFile: base.py
1098+ sparkImage:
1099+ productVersion: "3.5.8"
1100+ job:
1101+ config:
1102+ retryOnFailureCount: 1
1103+ "# } )
1104+ . unwrap ( ) ;
1105+
1106+ let overlay = serde_yaml:: from_str :: < crate :: crd:: v1alpha1:: SparkApplication > ( indoc ! { r#"
1107+ ---
1108+ apiVersion: spark.stackable.tech/v1alpha1
1109+ kind: SparkApplication
1110+ metadata:
1111+ name: overlay-app
1112+ spec:
1113+ mode: cluster
1114+ mainApplicationFile: overlay.py
1115+ sparkImage:
1116+ productVersion: "4.1.0"
1117+ job:
1118+ podOverrides:
1119+ spec:
1120+ serviceAccountName: overlay-sa
1121+ nodeSelector:
1122+ test.overlay.only: overlay
1123+ config:
1124+ retryOnFailureCount: 2
1125+ "# } )
1126+ . unwrap ( ) ;
1127+
1128+ let merged = deep_merge ( & base, & overlay) ;
1129+ let submit_spec = merged
1130+ . spec
1131+ . job
1132+ . as_ref ( )
1133+ . unwrap ( )
1134+ . pod_overrides
1135+ . spec
1136+ . as_ref ( )
1137+ . unwrap ( ) ;
1138+
1139+ assert_eq ! (
1140+ submit_spec. service_account_name. as_deref( ) ,
1141+ Some ( "overlay-sa" )
1142+ ) ;
1143+ assert_eq ! (
1144+ submit_spec
1145+ . node_selector
1146+ . as_ref( )
1147+ . and_then( |selector| selector. get( "test.overlay.only" ) )
1148+ . map( String :: as_str) ,
1149+ Some ( "overlay" )
1150+ ) ;
1151+ }
1152+
9181153 #[ test]
9191154 fn test_merge_two_templates_into_spark_application ( ) {
9201155 let template_a = serde_yaml:: from_str :: <
0 commit comments