Expand variables from the PodEnvironmentConfigMap

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.
This commit is contained in:
Oleksii Kliukin 2017-11-22 18:40:27 +01:00
parent 100caff802
commit 4f8de90e2f
1 changed files with 29 additions and 8 deletions

View File

@ -262,7 +262,7 @@ func (c *Cluster) tolerations(tolerationsSpec *[]v1.Toleration) []v1.Toleration
} }
podToleration := c.Config.OpConfig.PodToleration podToleration := c.Config.OpConfig.PodToleration
if (len(podToleration["key"]) > 0 || len(podToleration["operator"]) > 0 || len(podToleration["value"]) > 0 || len(podToleration["effect"]) > 0) { if len(podToleration["key"]) > 0 || len(podToleration["operator"]) > 0 || len(podToleration["value"]) > 0 || len(podToleration["effect"]) > 0 {
return []v1.Toleration{ return []v1.Toleration{
{ {
Key: podToleration["key"], Key: podToleration["key"],
@ -280,7 +280,8 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
tolerationsSpec *[]v1.Toleration, tolerationsSpec *[]v1.Toleration,
pgParameters *spec.PostgresqlParam, pgParameters *spec.PostgresqlParam,
patroniParameters *spec.Patroni, patroniParameters *spec.Patroni,
cloneDescription *spec.CloneDescription) *v1.PodTemplateSpec { cloneDescription *spec.CloneDescription,
extraEnv map[string]string) *v1.PodTemplateSpec {
spiloConfiguration := c.generateSpiloJSONConfiguration(pgParameters, patroniParameters) spiloConfiguration := c.generateSpiloJSONConfiguration(pgParameters, patroniParameters)
envVars := []v1.EnvVar{ envVars := []v1.EnvVar{
@ -362,10 +363,23 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
envVars = append(envVars, c.generateCloneEnvironment(cloneDescription)...) envVars = append(envVars, c.generateCloneEnvironment(cloneDescription)...)
} }
envFromSource := []v1.EnvFromSource{} var names []string
if c.OpConfig.PodEnvironmentConfigMap != "" { // handle environment variables from the PodEnvironmentConfigMap. We don't use envSource here as it is impossible
configMapRef := v1.ConfigMapEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: c.OpConfig.PodEnvironmentConfigMap}} // to track any changes to the object envSource points to. In order to emulate the envSource behavior, however, we
envFromSource = append(envFromSource, v1.EnvFromSource{ConfigMapRef: &configMapRef}) // need to make sure that PodConfigMap variables doesn't override those we set explicitely from the configuration
// parameters
envVarsMap := make(map[string]string)
for _, envVar := range envVars {
envVarsMap[envVar.Name] = envVar.Value
}
for name := range extraEnv {
if _, ok := envVarsMap[name]; !ok {
names = append(names, name)
}
}
sort.Strings(names)
for _, name := range names {
envVars = append(envVars, v1.EnvVar{Name: name, Value: extraEnv[name]})
} }
privilegedMode := true privilegedMode := true
@ -395,7 +409,6 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
}, },
}, },
Env: envVars, Env: envVars,
EnvFrom: envFromSource,
SecurityContext: &v1.SecurityContext{ SecurityContext: &v1.SecurityContext{
Privileged: &privilegedMode, Privileged: &privilegedMode,
}, },
@ -429,8 +442,16 @@ func (c *Cluster) generateStatefulSet(spec *spec.PostgresSpec) (*v1beta1.Statefu
if err != nil { if err != nil {
return nil, fmt.Errorf("could not generate resource requirements: %v", err) return nil, fmt.Errorf("could not generate resource requirements: %v", err)
} }
var extraEnv map[string]string
if c.OpConfig.PodEnvironmentConfigMap != "" {
if cm, err := c.KubeClient.ConfigMaps(c.Namespace).Get(c.OpConfig.PodEnvironmentConfigMap, metav1.GetOptions{}); err != nil {
return nil, fmt.Errorf("could not read PodEnvironmentConfigMap: %v", err)
} else {
extraEnv = cm.Data
}
podTemplate := c.generatePodTemplate(resourceRequirements, &spec.Tolerations, &spec.PostgresqlParam, &spec.Patroni, &spec.Clone) }
podTemplate := c.generatePodTemplate(resourceRequirements, &spec.Tolerations, &spec.PostgresqlParam, &spec.Patroni, &spec.Clone, extraEnv)
volumeClaimTemplate, err := generatePersistentVolumeClaimTemplate(spec.Volume.Size, spec.Volume.StorageClass) volumeClaimTemplate, err := generatePersistentVolumeClaimTemplate(spec.Volume.Size, spec.Volume.StorageClass)
if err != nil { if err != nil {
return nil, fmt.Errorf("could not generate volume claim template: %v", err) return nil, fmt.Errorf("could not generate volume claim template: %v", err)