@@ -281,7 +281,8 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
281
281
pgParameters * spec.PostgresqlParam ,
282
282
patroniParameters * spec.Patroni ,
283
283
cloneDescription * spec.CloneDescription ,
284
- dockerImage * string ) * v1.PodTemplateSpec {
284
+ dockerImage * string ,
285
+ extraEnv map [string ]string ) * v1.PodTemplateSpec {
285
286
spiloConfiguration := c .generateSpiloJSONConfiguration (pgParameters , patroniParameters )
286
287
287
288
envVars := []v1.EnvVar {
@@ -363,10 +364,23 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
363
364
envVars = append (envVars , c .generateCloneEnvironment (cloneDescription )... )
364
365
}
365
366
366
- envFromSource := []v1.EnvFromSource {}
367
- if c .OpConfig .PodEnvironmentConfigMap != "" {
368
- configMapRef := v1.ConfigMapEnvSource {LocalObjectReference : v1.LocalObjectReference {Name : c .OpConfig .PodEnvironmentConfigMap }}
369
- envFromSource = append (envFromSource , v1.EnvFromSource {ConfigMapRef : & configMapRef })
367
+ var names []string
368
+ // handle environment variables from the PodEnvironmentConfigMap. We don't use envSource here as it is impossible
369
+ // to track any changes to the object envSource points to. In order to emulate the envSource behavior, however, we
370
+ // need to make sure that PodConfigMap variables doesn't override those we set explicitely from the configuration
371
+ // parameters
372
+ envVarsMap := make (map [string ]string )
373
+ for _ , envVar := range envVars {
374
+ envVarsMap [envVar .Name ] = envVar .Value
375
+ }
376
+ for name := range extraEnv {
377
+ if _ , ok := envVarsMap [name ]; ! ok {
378
+ names = append (names , name )
379
+ }
380
+ }
381
+ sort .Strings (names )
382
+ for _ , name := range names {
383
+ envVars = append (envVars , v1.EnvVar {Name : name , Value : extraEnv [name ]})
370
384
}
371
385
372
386
privilegedMode := true
@@ -400,7 +414,6 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
400
414
},
401
415
},
402
416
Env : envVars ,
403
- EnvFrom : envFromSource ,
404
417
SecurityContext : & v1.SecurityContext {
405
418
Privileged : & privilegedMode ,
406
419
},
@@ -434,8 +447,15 @@ func (c *Cluster) generateStatefulSet(spec *spec.PostgresSpec) (*v1beta1.Statefu
434
447
if err != nil {
435
448
return nil , fmt .Errorf ("could not generate resource requirements: %v" , err )
436
449
}
437
-
438
- podTemplate := c .generatePodTemplate (resourceRequirements , & spec .Tolerations , & spec .PostgresqlParam , & spec .Patroni , & spec .Clone , & spec .DockerImage )
450
+ var extraEnv map [string ]string
451
+ if c .OpConfig .PodEnvironmentConfigMap != "" {
452
+ if cm , err := c .KubeClient .ConfigMaps (c .Namespace ).Get (c .OpConfig .PodEnvironmentConfigMap , metav1.GetOptions {}); err != nil {
453
+ return nil , fmt .Errorf ("could not read PodEnvironmentConfigMap: %v" , err )
454
+ } else {
455
+ extraEnv = cm .Data
456
+ }
457
+ }
458
+ podTemplate := c .generatePodTemplate (resourceRequirements , & spec .Tolerations , & spec .PostgresqlParam , & spec .Patroni , & spec .Clone , & spec .DockerImage , extraEnv )
439
459
volumeClaimTemplate , err := generatePersistentVolumeClaimTemplate (spec .Volume .Size , spec .Volume .StorageClass )
440
460
if err != nil {
441
461
return nil , fmt .Errorf ("could not generate volume claim template: %v" , err )
0 commit comments