@@ -50,6 +50,9 @@ private static Pod driverPod() {
5050 .addToLabels ("spark.operator/submission-id" , "sub-1" )
5151 .addToLabels (LABEL_SPARK_ROLE_NAME , "driver" )
5252 .addToLabels ("spark-app-selector" , "spark-app-selector-1" )
53+ .addToLabels ("spark-version" , "4.2.0" )
54+ .addToLabels ("spark-app-name" , "app1-name" )
55+ .addToLabels ("driver-only-label" , "driver-value" ) // neutral driver only label
5356 .addToLabels ("overlapping-label" , "driver-value" )
5457 .endMetadata ()
5558 .build ();
@@ -66,12 +69,18 @@ private static Service service(Map<String, String> labels) {
6669 }
6770
6871 /**
69- * Driver-pod labels whose key is absent on the resource are propagated onto the resource, while a
70- * label the resource sets itself still wins on key collision (e.g. a per-service waypoint label).
72+ * Driver-pod labels whose key is absent on the resource are propagated onto the resource
73+ * (including a neutral driver-only label), a label the resource sets itself wins on a key
74+ * collision, and a neutral label only the resource sets is
75+ * kept.
7176 */
7277 @ Test
7378 void driverLabelsPropagatedAndResourceLabelWinsOnCollision () {
74- Service service = service (Map .of ("overlapping-label" , "resource-value" ));
79+ Service service =
80+ service (
81+ Map .of (
82+ "overlapping-label" , "resource-value" ,
83+ "resource-only-label" , "resource-value" ));
7584
7685 new DriverResourceDecorator (driverPod ()).decorate (service );
7786
@@ -82,7 +91,11 @@ void driverLabelsPropagatedAndResourceLabelWinsOnCollision() {
8291 "spark.operator/submission-id" , "sub-1" ,
8392 LABEL_SPARK_ROLE_NAME , "driver" ,
8493 "spark-app-selector" , "spark-app-selector-1" ,
85- "overlapping-label" , "resource-value" ),
94+ "spark-version" , "4.2.0" ,
95+ "spark-app-name" , "app1-name" ,
96+ "driver-only-label" , "driver-value" ,
97+ "overlapping-label" , "resource-value" ,
98+ "resource-only-label" , "resource-value" ),
8699 service .getMetadata ().getLabels ());
87100 }
88101
@@ -102,8 +115,8 @@ void resourceWithoutLabelsInheritsDriverPodLabels() {
102115
103116 /**
104117 * Managed identity labels (exact-match keys and anything under the {@code spark.operator} prefix)
105- * must keep the driver-pod value even when the resource sets a different value, so owner mapping
106- * and selectors are preserved, while a non-managed label is still allowed to win.
118+ * must keep the driver-pod value even when the resource sets a different value, while a
119+ * non-managed label is still allowed to win.
107120 */
108121 @ Test
109122 void managedLabelsAreNotOverriddenByResource () {
@@ -115,6 +128,8 @@ void managedLabelsAreNotOverriddenByResource() {
115128 "spark.operator/submission-id" , "rogue-sub" ,
116129 LABEL_SPARK_ROLE_NAME , "rogue-role" ,
117130 "spark-app-selector" , "rogue-selector" ,
131+ "spark-version" , "rogue-version" ,
132+ "spark-app-name" , "rogue-app-name" ,
118133 "overlapping-label" , "resource-value" ));
119134
120135 new DriverResourceDecorator (driverPod ()).decorate (service );
@@ -126,6 +141,9 @@ void managedLabelsAreNotOverriddenByResource() {
126141 "spark.operator/submission-id" , "sub-1" ,
127142 LABEL_SPARK_ROLE_NAME , "driver" ,
128143 "spark-app-selector" , "spark-app-selector-1" ,
144+ "spark-version" , "4.2.0" ,
145+ "spark-app-name" , "app1-name" ,
146+ "driver-only-label" , "driver-value" ,
129147 "overlapping-label" , "resource-value" ),
130148 service .getMetadata ().getLabels ());
131149 }
0 commit comments