7
7
"path"
8
8
"sort"
9
9
"strconv"
10
+ "strings"
10
11
11
12
"github.com/sirupsen/logrus"
12
13
@@ -20,7 +21,6 @@ import (
20
21
21
22
acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1"
22
23
"github.com/zalando/postgres-operator/pkg/spec"
23
- pkgspec "github.com/zalando/postgres-operator/pkg/spec"
24
24
"github.com/zalando/postgres-operator/pkg/util"
25
25
"github.com/zalando/postgres-operator/pkg/util/config"
26
26
"github.com/zalando/postgres-operator/pkg/util/constants"
@@ -715,28 +715,6 @@ func (c *Cluster) generateSpiloPodEnvVars(uid types.UID, spiloConfiguration stri
715
715
envVars = append (envVars , v1.EnvVar {Name : "SPILO_CONFIGURATION" , Value : spiloConfiguration })
716
716
}
717
717
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
-
740
718
if c .patroniUsesKubernetes () {
741
719
envVars = append (envVars , v1.EnvVar {Name : "DCS_ENABLE_KUBERNETES_API" , Value : "true" })
742
720
} else {
@@ -755,10 +733,34 @@ func (c *Cluster) generateSpiloPodEnvVars(uid types.UID, spiloConfiguration stri
755
733
envVars = append (envVars , c .generateStandbyEnvironment (standbyDescription )... )
756
734
}
757
735
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)
758
738
if len (customPodEnvVarsList ) > 0 {
759
739
envVars = append (envVars , customPodEnvVarsList ... )
760
740
}
761
741
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
+
762
764
return envVars
763
765
}
764
766
@@ -777,13 +779,81 @@ func deduplicateEnvVars(input []v1.EnvVar, containerName string, logger *logrus.
777
779
result = append (result , input [i ])
778
780
} else if names [va .Name ] == 1 {
779
781
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
+ }
782
791
}
783
792
}
784
793
return result
785
794
}
786
795
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
+
787
857
func getSidecarContainer (sidecar acidv1.Sidecar , index int , resources * v1.ResourceRequirements ) * v1.Container {
788
858
name := sidecar .Name
789
859
if name == "" {
@@ -943,32 +1013,23 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef
943
1013
initContainers = spec .InitContainers
944
1014
}
945
1015
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
+ }
947
1021
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
971
1026
}
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
+
972
1033
if spec .StandbyCluster != nil && spec .StandbyCluster .S3WalPath == "" {
973
1034
return nil , fmt .Errorf ("s3_wal_path is empty for standby cluster" )
974
1035
}
0 commit comments