77 "path"
88 "sort"
99 "strconv"
10+ "strings"
1011
1112 "github.com/sirupsen/logrus"
1213
@@ -20,7 +21,6 @@ import (
2021
2122 acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1"
2223 "github.com/zalando/postgres-operator/pkg/spec"
23- pkgspec "github.com/zalando/postgres-operator/pkg/spec"
2424 "github.com/zalando/postgres-operator/pkg/util"
2525 "github.com/zalando/postgres-operator/pkg/util/config"
2626 "github.com/zalando/postgres-operator/pkg/util/constants"
@@ -715,28 +715,6 @@ func (c *Cluster) generateSpiloPodEnvVars(uid types.UID, spiloConfiguration stri
715715 envVars = append (envVars , v1.EnvVar {Name : "SPILO_CONFIGURATION" , Value : spiloConfiguration })
716716 }
717717
718- if c .OpConfig .WALES3Bucket != "" {
719- envVars = append (envVars , v1.EnvVar {Name : "WAL_S3_BUCKET" , Value : c .OpConfig .WALES3Bucket })
720- envVars = append (envVars , v1.EnvVar {Name : "WAL_BUCKET_SCOPE_SUFFIX" , Value : getBucketScopeSuffix (string (uid ))})
721- envVars = append (envVars , v1.EnvVar {Name : "WAL_BUCKET_SCOPE_PREFIX" , Value : "" })
722- }
723-
724- if c .OpConfig .WALGSBucket != "" {
725- envVars = append (envVars , v1.EnvVar {Name : "WAL_GS_BUCKET" , Value : c .OpConfig .WALGSBucket })
726- envVars = append (envVars , v1.EnvVar {Name : "WAL_BUCKET_SCOPE_SUFFIX" , Value : getBucketScopeSuffix (string (uid ))})
727- envVars = append (envVars , v1.EnvVar {Name : "WAL_BUCKET_SCOPE_PREFIX" , Value : "" })
728- }
729-
730- if c .OpConfig .GCPCredentials != "" {
731- envVars = append (envVars , v1.EnvVar {Name : "GOOGLE_APPLICATION_CREDENTIALS" , Value : c .OpConfig .GCPCredentials })
732- }
733-
734- if c .OpConfig .LogS3Bucket != "" {
735- envVars = append (envVars , v1.EnvVar {Name : "LOG_S3_BUCKET" , Value : c .OpConfig .LogS3Bucket })
736- envVars = append (envVars , v1.EnvVar {Name : "LOG_BUCKET_SCOPE_SUFFIX" , Value : getBucketScopeSuffix (string (uid ))})
737- envVars = append (envVars , v1.EnvVar {Name : "LOG_BUCKET_SCOPE_PREFIX" , Value : "" })
738- }
739-
740718 if c .patroniUsesKubernetes () {
741719 envVars = append (envVars , v1.EnvVar {Name : "DCS_ENABLE_KUBERNETES_API" , Value : "true" })
742720 } else {
@@ -755,10 +733,34 @@ func (c *Cluster) generateSpiloPodEnvVars(uid types.UID, spiloConfiguration stri
755733 envVars = append (envVars , c .generateStandbyEnvironment (standbyDescription )... )
756734 }
757735
736+ // add vars taken from pod_environment_configmap and pod_environment_secret first
737+ // (to allow them to override the globals set in the operator config)
758738 if len (customPodEnvVarsList ) > 0 {
759739 envVars = append (envVars , customPodEnvVarsList ... )
760740 }
761741
742+ if c .OpConfig .WALES3Bucket != "" {
743+ envVars = append (envVars , v1.EnvVar {Name : "WAL_S3_BUCKET" , Value : c .OpConfig .WALES3Bucket })
744+ envVars = append (envVars , v1.EnvVar {Name : "WAL_BUCKET_SCOPE_SUFFIX" , Value : getBucketScopeSuffix (string (uid ))})
745+ envVars = append (envVars , v1.EnvVar {Name : "WAL_BUCKET_SCOPE_PREFIX" , Value : "" })
746+ }
747+
748+ if c .OpConfig .WALGSBucket != "" {
749+ envVars = append (envVars , v1.EnvVar {Name : "WAL_GS_BUCKET" , Value : c .OpConfig .WALGSBucket })
750+ envVars = append (envVars , v1.EnvVar {Name : "WAL_BUCKET_SCOPE_SUFFIX" , Value : getBucketScopeSuffix (string (uid ))})
751+ envVars = append (envVars , v1.EnvVar {Name : "WAL_BUCKET_SCOPE_PREFIX" , Value : "" })
752+ }
753+
754+ if c .OpConfig .GCPCredentials != "" {
755+ envVars = append (envVars , v1.EnvVar {Name : "GOOGLE_APPLICATION_CREDENTIALS" , Value : c .OpConfig .GCPCredentials })
756+ }
757+
758+ if c .OpConfig .LogS3Bucket != "" {
759+ envVars = append (envVars , v1.EnvVar {Name : "LOG_S3_BUCKET" , Value : c .OpConfig .LogS3Bucket })
760+ envVars = append (envVars , v1.EnvVar {Name : "LOG_BUCKET_SCOPE_SUFFIX" , Value : getBucketScopeSuffix (string (uid ))})
761+ envVars = append (envVars , v1.EnvVar {Name : "LOG_BUCKET_SCOPE_PREFIX" , Value : "" })
762+ }
763+
762764 return envVars
763765}
764766
@@ -777,13 +779,81 @@ func deduplicateEnvVars(input []v1.EnvVar, containerName string, logger *logrus.
777779 result = append (result , input [i ])
778780 } else if names [va .Name ] == 1 {
779781 names [va .Name ]++
780- logger .Warningf ("variable %q is defined in %q more than once, the subsequent definitions are ignored" ,
781- va .Name , containerName )
782+
783+ // Some variables (those to configure the WAL_ and LOG_ shipping) may be overriden, only log as info
784+ if strings .HasPrefix (va .Name , "WAL_" ) || strings .HasPrefix (va .Name , "LOG_" ) {
785+ logger .Infof ("global variable %q has been overwritten by configmap/secret for container %q" ,
786+ va .Name , containerName )
787+ } else {
788+ logger .Warningf ("variable %q is defined in %q more than once, the subsequent definitions are ignored" ,
789+ va .Name , containerName )
790+ }
782791 }
783792 }
784793 return result
785794}
786795
796+ // Return list of variables the pod recieved from the configured ConfigMap
797+ func (c * Cluster ) getPodEnvironmentConfigMapVariables () ([]v1.EnvVar , error ) {
798+ configMapPodEnvVarsList := make ([]v1.EnvVar , 0 )
799+
800+ if c .OpConfig .PodEnvironmentConfigMap .Name == "" {
801+ return configMapPodEnvVarsList , nil
802+ }
803+
804+ cm , err := c .KubeClient .ConfigMaps (c .OpConfig .PodEnvironmentConfigMap .Namespace ).Get (
805+ context .TODO (),
806+ c .OpConfig .PodEnvironmentConfigMap .Name ,
807+ metav1.GetOptions {})
808+ if err != nil {
809+ // if not found, try again using the cluster's namespace if it's different (old behavior)
810+ if k8sutil .ResourceNotFound (err ) && c .Namespace != c .OpConfig .PodEnvironmentConfigMap .Namespace {
811+ cm , err = c .KubeClient .ConfigMaps (c .Namespace ).Get (
812+ context .TODO (),
813+ c .OpConfig .PodEnvironmentConfigMap .Name ,
814+ metav1.GetOptions {})
815+ }
816+ if err != nil {
817+ return nil , fmt .Errorf ("could not read PodEnvironmentConfigMap: %v" , err )
818+ }
819+ }
820+ for k , v := range cm .Data {
821+ configMapPodEnvVarsList = append (configMapPodEnvVarsList , v1.EnvVar {Name : k , Value : v })
822+ }
823+ return configMapPodEnvVarsList , nil
824+ }
825+
826+ // Return list of variables the pod recieved from the configured Secret
827+ func (c * Cluster ) getPodEnvironmentSecretVariables () ([]v1.EnvVar , error ) {
828+ secretPodEnvVarsList := make ([]v1.EnvVar , 0 )
829+
830+ if c .OpConfig .PodEnvironmentSecret == "" {
831+ return secretPodEnvVarsList , nil
832+ }
833+
834+ secret , err := c .KubeClient .Secrets (c .OpConfig .PodEnvironmentSecret ).Get (
835+ context .TODO (),
836+ c .OpConfig .PodEnvironmentSecret ,
837+ metav1.GetOptions {})
838+ if err != nil {
839+ return nil , fmt .Errorf ("could not read Secret PodEnvironmentSecretName: %v" , err )
840+ }
841+
842+ for k := range secret .Data {
843+ secretPodEnvVarsList = append (secretPodEnvVarsList ,
844+ v1.EnvVar {Name : k , ValueFrom : & v1.EnvVarSource {
845+ SecretKeyRef : & v1.SecretKeySelector {
846+ LocalObjectReference : v1.LocalObjectReference {
847+ Name : c .OpConfig .PodEnvironmentSecret ,
848+ },
849+ Key : k ,
850+ },
851+ }})
852+ }
853+
854+ return secretPodEnvVarsList , nil
855+ }
856+
787857func getSidecarContainer (sidecar acidv1.Sidecar , index int , resources * v1.ResourceRequirements ) * v1.Container {
788858 name := sidecar .Name
789859 if name == "" {
@@ -943,32 +1013,23 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef
9431013 initContainers = spec .InitContainers
9441014 }
9451015
946- customPodEnvVarsList := make ([]v1.EnvVar , 0 )
1016+ // fetch env vars from custom ConfigMap
1017+ configMapEnvVarsList , err := c .getPodEnvironmentConfigMapVariables ()
1018+ if err != nil {
1019+ return nil , err
1020+ }
9471021
948- if c .OpConfig .PodEnvironmentConfigMap != (pkgspec.NamespacedName {}) {
949- var cm * v1.ConfigMap
950- cm , err = c .KubeClient .ConfigMaps (c .OpConfig .PodEnvironmentConfigMap .Namespace ).Get (
951- context .TODO (),
952- c .OpConfig .PodEnvironmentConfigMap .Name ,
953- metav1.GetOptions {})
954- if err != nil {
955- // if not found, try again using the cluster's namespace if it's different (old behavior)
956- if k8sutil .ResourceNotFound (err ) && c .Namespace != c .OpConfig .PodEnvironmentConfigMap .Namespace {
957- cm , err = c .KubeClient .ConfigMaps (c .Namespace ).Get (
958- context .TODO (),
959- c .OpConfig .PodEnvironmentConfigMap .Name ,
960- metav1.GetOptions {})
961- }
962- if err != nil {
963- return nil , fmt .Errorf ("could not read PodEnvironmentConfigMap: %v" , err )
964- }
965- }
966- for k , v := range cm .Data {
967- customPodEnvVarsList = append (customPodEnvVarsList , v1.EnvVar {Name : k , Value : v })
968- }
969- sort .Slice (customPodEnvVarsList ,
970- func (i , j int ) bool { return customPodEnvVarsList [i ].Name < customPodEnvVarsList [j ].Name })
1022+ // fetch env vars from custom ConfigMap
1023+ secretEnvVarsList , err := c .getPodEnvironmentSecretVariables ()
1024+ if err != nil {
1025+ return nil , err
9711026 }
1027+
1028+ // concat all custom pod env vars and sort them
1029+ customPodEnvVarsList := append (configMapEnvVarsList , secretEnvVarsList ... )
1030+ sort .Slice (customPodEnvVarsList ,
1031+ func (i , j int ) bool { return customPodEnvVarsList [i ].Name < customPodEnvVarsList [j ].Name })
1032+
9721033 if spec .StandbyCluster != nil && spec .StandbyCluster .S3WalPath == "" {
9731034 return nil , fmt .Errorf ("s3_wal_path is empty for standby cluster" )
9741035 }
0 commit comments