Skip to content

Commit da4b662

Browse files
committed
Expand variables from the PodEnvironmentConfigMap (zalando#4)
Inject PodEnvironmentConfigMap variables inline into the statefulset definition in order to be able to figure out changes to the statefulset when only PodEnvironmentConfigMap has changed.
1 parent 1c5451c commit da4b662

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

pkg/cluster/k8sres.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
281281
pgParameters *spec.PostgresqlParam,
282282
patroniParameters *spec.Patroni,
283283
cloneDescription *spec.CloneDescription,
284-
dockerImage *string) *v1.PodTemplateSpec {
284+
dockerImage *string,
285+
extraEnv map[string]string) *v1.PodTemplateSpec {
285286
spiloConfiguration := c.generateSpiloJSONConfiguration(pgParameters, patroniParameters)
286287

287288
envVars := []v1.EnvVar{
@@ -363,10 +364,23 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
363364
envVars = append(envVars, c.generateCloneEnvironment(cloneDescription)...)
364365
}
365366

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]})
370384
}
371385

372386
privilegedMode := true
@@ -400,7 +414,6 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
400414
},
401415
},
402416
Env: envVars,
403-
EnvFrom: envFromSource,
404417
SecurityContext: &v1.SecurityContext{
405418
Privileged: &privilegedMode,
406419
},
@@ -434,8 +447,15 @@ func (c *Cluster) generateStatefulSet(spec *spec.PostgresSpec) (*v1beta1.Statefu
434447
if err != nil {
435448
return nil, fmt.Errorf("could not generate resource requirements: %v", err)
436449
}
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)
439459
volumeClaimTemplate, err := generatePersistentVolumeClaimTemplate(spec.Volume.Size, spec.Volume.StorageClass)
440460
if err != nil {
441461
return nil, fmt.Errorf("could not generate volume claim template: %v", err)

0 commit comments

Comments
 (0)