@@ -17,6 +17,7 @@ package driver
1717import (
1818 "context"
1919 "encoding/json"
20+ "errors"
2021 "fmt"
2122 "time"
2223
@@ -178,22 +179,31 @@ func extendPodSpecPatch(
178179 // Get node selector information
179180 if kubernetesExecutorConfig .GetNodeSelector () != nil {
180181 var nodeSelector map [string ]string
182+ // skipNodeSelector marks when the node selector input resolved to a null optional
183+ // value. In that case we avoid appending an empty selector to the pod spec.
184+ skipNodeSelector := false
181185 if kubernetesExecutorConfig .GetNodeSelector ().GetNodeSelectorJson () != nil {
182186 err := resolveK8sJsonParameter (ctx , opts , dag , pipeline , mlmd ,
183187 kubernetesExecutorConfig .GetNodeSelector ().GetNodeSelectorJson (), inputParams , & nodeSelector )
184188 if err != nil {
185- return fmt .Errorf ("failed to resolve node selector: %w" , err )
189+ if errors .Is (err , ErrResolvedParameterNull ) {
190+ skipNodeSelector = true
191+ } else {
192+ return fmt .Errorf ("failed to resolve node selector: %w" , err )
193+ }
186194 }
187195 } else {
188196 nodeSelector = kubernetesExecutorConfig .GetNodeSelector ().GetLabels ()
189197 }
190198
191- if setOnTaskConfig [pipelinespec .TaskConfigPassthroughType_KUBERNETES_NODE_SELECTOR ] {
192- taskConfig .NodeSelector = nodeSelector
193- }
199+ if ! skipNodeSelector {
200+ if setOnTaskConfig [pipelinespec .TaskConfigPassthroughType_KUBERNETES_NODE_SELECTOR ] {
201+ taskConfig .NodeSelector = nodeSelector
202+ }
194203
195- if setOnPod [pipelinespec .TaskConfigPassthroughType_KUBERNETES_NODE_SELECTOR ] {
196- podSpec .NodeSelector = nodeSelector
204+ if setOnPod [pipelinespec .TaskConfigPassthroughType_KUBERNETES_NODE_SELECTOR ] {
205+ podSpec .NodeSelector = nodeSelector
206+ }
197207 }
198208 }
199209
@@ -209,6 +219,9 @@ func extendPodSpecPatch(
209219 resolvedParam , err := resolveInputParameter (ctx , dag , pipeline , opts , mlmd ,
210220 toleration .GetTolerationJson (), inputParams )
211221 if err != nil {
222+ if errors .Is (err , ErrResolvedParameterNull ) {
223+ continue // Skip applying the patch for this null/optional parameter
224+ }
212225 return fmt .Errorf ("failed to resolve toleration: %w" , err )
213226 }
214227
@@ -278,6 +291,9 @@ func extendPodSpecPatch(
278291 resolvedSecretName , err := resolveInputParameterStr (ctx , dag , pipeline , opts , mlmd ,
279292 secretAsVolume .SecretNameParameter , inputParams )
280293 if err != nil {
294+ if errors .Is (err , ErrResolvedParameterNull ) {
295+ continue
296+ }
281297 return fmt .Errorf ("failed to resolve secret name: %w" , err )
282298 }
283299 secretName = resolvedSecretName .GetStringValue ()
@@ -337,6 +353,9 @@ func extendPodSpecPatch(
337353 resolvedSecretName , err := resolveInputParameterStr (ctx , dag , pipeline , opts , mlmd ,
338354 secretAsEnv .SecretNameParameter , inputParams )
339355 if err != nil {
356+ if errors .Is (err , ErrResolvedParameterNull ) {
357+ continue
358+ }
340359 return fmt .Errorf ("failed to resolve secret name: %w" , err )
341360 }
342361 secretName = resolvedSecretName .GetStringValue ()
@@ -363,12 +382,15 @@ func extendPodSpecPatch(
363382 for _ , configMapAsVolume := range kubernetesExecutorConfig .GetConfigMapAsVolume () {
364383 var configMapName string
365384 if configMapAsVolume .ConfigMapNameParameter != nil {
366- resolvedSecretName , err := resolveInputParameterStr (ctx , dag , pipeline , opts , mlmd ,
385+ resolvedConfigMapName , err := resolveInputParameterStr (ctx , dag , pipeline , opts , mlmd ,
367386 configMapAsVolume .ConfigMapNameParameter , inputParams )
368387 if err != nil {
388+ if errors .Is (err , ErrResolvedParameterNull ) {
389+ continue
390+ }
369391 return fmt .Errorf ("failed to resolve configmap name: %w" , err )
370392 }
371- configMapName = resolvedSecretName .GetStringValue ()
393+ configMapName = resolvedConfigMapName .GetStringValue ()
372394 } else if configMapAsVolume .ConfigMapName != "" {
373395 configMapName = configMapAsVolume .ConfigMapName
374396 } else {
@@ -424,12 +446,15 @@ func extendPodSpecPatch(
424446
425447 var configMapName string
426448 if configMapAsEnv .ConfigMapNameParameter != nil {
427- resolvedSecretName , err := resolveInputParameterStr (ctx , dag , pipeline , opts , mlmd ,
449+ resolvedConfigMapName , err := resolveInputParameterStr (ctx , dag , pipeline , opts , mlmd ,
428450 configMapAsEnv .ConfigMapNameParameter , inputParams )
429451 if err != nil {
452+ if errors .Is (err , ErrResolvedParameterNull ) {
453+ continue
454+ }
430455 return fmt .Errorf ("failed to resolve configmap name: %w" , err )
431456 }
432- configMapName = resolvedSecretName .GetStringValue ()
457+ configMapName = resolvedConfigMapName .GetStringValue ()
433458 } else if configMapAsEnv .ConfigMapName != "" {
434459 configMapName = configMapAsEnv .ConfigMapName
435460 } else {
@@ -456,6 +481,9 @@ func extendPodSpecPatch(
456481 resolvedSecretName , err := resolveInputParameterStr (ctx , dag , pipeline , opts , mlmd ,
457482 imagePullSecret .SecretNameParameter , inputParams )
458483 if err != nil {
484+ if errors .Is (err , ErrResolvedParameterNull ) {
485+ continue
486+ }
459487 return fmt .Errorf ("failed to resolve image pull secret name: %w" , err )
460488 }
461489 secretName = resolvedSecretName .GetStringValue ()
@@ -588,6 +616,9 @@ func extendPodSpecPatch(
588616 err := resolveK8sJsonParameter (ctx , opts , dag , pipeline , mlmd ,
589617 nodeAffinityTerm .GetNodeAffinityJson (), inputParams , & k8sNodeAffinity )
590618 if err != nil {
619+ if errors .Is (err , ErrResolvedParameterNull ) {
620+ continue
621+ }
591622 return fmt .Errorf ("failed to resolve node affinity json: %w" , err )
592623 }
593624
0 commit comments