mirror of
https://github.com/zalando/postgres-operator.git
synced 2026-10-06 20:14:58 +02:00
@@ -1137,6 +1137,37 @@ func (c *Cluster) getPodEnvironmentSecretVariables() ([]v1.EnvVar, error) {
|
||||
return secretPodEnvVarsList, nil
|
||||
}
|
||||
|
||||
// Return list of variables the cronjob received from the configured Secret
|
||||
func (c *Cluster) getCronjobEnvironmentSecretVariables() ([]v1.EnvVar, error) {
|
||||
secretCronjobEnvVarsList := make([]v1.EnvVar, 0)
|
||||
|
||||
if c.OpConfig.LogicalBackupCronjobEnvironmentSecret == "" {
|
||||
return secretCronjobEnvVarsList, nil
|
||||
}
|
||||
|
||||
secret, err := c.KubeClient.Secrets(c.Namespace).Get(
|
||||
context.TODO(),
|
||||
c.OpConfig.LogicalBackupCronjobEnvironmentSecret,
|
||||
metav1.GetOptions{})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not read Secret CronjobEnvironmentSecretName: %v", err)
|
||||
}
|
||||
|
||||
for k := range secret.Data {
|
||||
secretCronjobEnvVarsList = append(secretCronjobEnvVarsList,
|
||||
v1.EnvVar{Name: k, ValueFrom: &v1.EnvVarSource{
|
||||
SecretKeyRef: &v1.SecretKeySelector{
|
||||
LocalObjectReference: v1.LocalObjectReference{
|
||||
Name: c.OpConfig.LogicalBackupCronjobEnvironmentSecret,
|
||||
},
|
||||
Key: k,
|
||||
},
|
||||
}})
|
||||
}
|
||||
|
||||
return secretCronjobEnvVarsList, nil
|
||||
}
|
||||
|
||||
func getSidecarContainer(sidecar acidv1.Sidecar, index int, resources *v1.ResourceRequirements) *v1.Container {
|
||||
name := sidecar.Name
|
||||
if name == "" {
|
||||
@@ -2172,7 +2203,13 @@ func (c *Cluster) generateLogicalBackupJob() (*batchv1.CronJob, error) {
|
||||
return nil, fmt.Errorf("could not generate resource requirements for logical backup pods: %v", err)
|
||||
}
|
||||
|
||||
secretEnvVarsList, err := c.getCronjobEnvironmentSecretVariables()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
envVars := c.generateLogicalBackupPodEnvVars()
|
||||
envVars = append(envVars, secretEnvVarsList...)
|
||||
logicalBackupContainer := generateContainer(
|
||||
logicalBackupContainerName,
|
||||
&c.OpConfig.LogicalBackup.LogicalBackupDockerImage,
|
||||
|
||||
@@ -192,6 +192,7 @@ func TestExtractPgVersionFromBinPath(t *testing.T) {
|
||||
const (
|
||||
testPodEnvironmentConfigMapName = "pod_env_cm"
|
||||
testPodEnvironmentSecretName = "pod_env_sc"
|
||||
testCronjobEnvironmentSecretName = "pod_env_sc"
|
||||
testPodEnvironmentObjectNotExists = "idonotexist"
|
||||
testPodEnvironmentSecretNameAPIError = "pod_env_sc_apierror"
|
||||
testResourceCheckInterval = 3
|
||||
@@ -448,6 +449,96 @@ func TestPodEnvironmentSecretVariables(t *testing.T) {
|
||||
|
||||
}
|
||||
|
||||
// Test if the keys of an existing secret are properly referenced
|
||||
func TestCronjobEnvironmentSecretVariables(t *testing.T) {
|
||||
testName := "TestCronjobEnvironmentSecretVariables"
|
||||
tests := []struct {
|
||||
subTest string
|
||||
opConfig config.Config
|
||||
envVars []v1.EnvVar
|
||||
err error
|
||||
}{
|
||||
{
|
||||
subTest: "No CronjobEnvironmentSecret configured",
|
||||
envVars: []v1.EnvVar{},
|
||||
},
|
||||
{
|
||||
subTest: "Secret referenced by CronjobEnvironmentSecret does not exist",
|
||||
opConfig: config.Config{
|
||||
LogicalBackup: config.LogicalBackup{
|
||||
LogicalBackupCronjobEnvironmentSecret: "idonotexist",
|
||||
},
|
||||
},
|
||||
err: fmt.Errorf("could not read Secret CronjobEnvironmentSecretName: secret.core \"idonotexist\" not found"),
|
||||
},
|
||||
{
|
||||
subTest: "Cronjob environment vars reference all keys from secret configured by CronjobEnvironmentSecret",
|
||||
opConfig: config.Config{
|
||||
LogicalBackup: config.LogicalBackup{
|
||||
LogicalBackupCronjobEnvironmentSecret: testCronjobEnvironmentSecretName,
|
||||
},
|
||||
},
|
||||
envVars: []v1.EnvVar{
|
||||
{
|
||||
Name: "clone_aws_access_key_id",
|
||||
ValueFrom: &v1.EnvVarSource{
|
||||
SecretKeyRef: &v1.SecretKeySelector{
|
||||
LocalObjectReference: v1.LocalObjectReference{
|
||||
Name: testPodEnvironmentSecretName,
|
||||
},
|
||||
Key: "clone_aws_access_key_id",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "custom_variable",
|
||||
ValueFrom: &v1.EnvVarSource{
|
||||
SecretKeyRef: &v1.SecretKeySelector{
|
||||
LocalObjectReference: v1.LocalObjectReference{
|
||||
Name: testPodEnvironmentSecretName,
|
||||
},
|
||||
Key: "custom_variable",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "standby_google_application_credentials",
|
||||
ValueFrom: &v1.EnvVarSource{
|
||||
SecretKeyRef: &v1.SecretKeySelector{
|
||||
LocalObjectReference: v1.LocalObjectReference{
|
||||
Name: testPodEnvironmentSecretName,
|
||||
},
|
||||
Key: "standby_google_application_credentials",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
c := newMockCluster(tt.opConfig)
|
||||
vars, err := c.getCronjobEnvironmentSecretVariables()
|
||||
sort.Slice(vars, func(i, j int) bool { return vars[i].Name < vars[j].Name })
|
||||
if !reflect.DeepEqual(vars, tt.envVars) {
|
||||
t.Errorf("%s %s: expected `%v` but got `%v`",
|
||||
testName, tt.subTest, tt.envVars, vars)
|
||||
}
|
||||
if tt.err != nil {
|
||||
if err.Error() != tt.err.Error() {
|
||||
t.Errorf("%s %s: expected error `%v` but got `%v`",
|
||||
testName, tt.subTest, tt.err, err)
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
t.Errorf("%s %s: expected no error but got error: `%v`",
|
||||
testName, tt.subTest, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func testEnvs(cluster *Cluster, podSpec *v1.PodTemplateSpec, role PostgresRole) error {
|
||||
required := map[string]bool{
|
||||
"PGHOST": false,
|
||||
|
||||
Reference in New Issue
Block a user