diff --git a/charts/tidb-operator/templates/admission/admission-webhook-deployment.yaml b/charts/tidb-operator/templates/admission/admission-webhook-deployment.yaml index 87ee3f4c19..24a9e8db4f 100644 --- a/charts/tidb-operator/templates/admission/admission-webhook-deployment.yaml +++ b/charts/tidb-operator/templates/admission/admission-webhook-deployment.yaml @@ -65,6 +65,8 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace + - name: TZ + value: {{ .Values.timezone | default "UTC" }} volumeMounts: {{- if eq .Values.admissionWebhook.apiservice.insecureSkipTLSVerify false }} - mountPath: /var/serving-cert diff --git a/charts/tidb-operator/templates/advanced-statefulset-deployment.yaml b/charts/tidb-operator/templates/advanced-statefulset-deployment.yaml index 47dd754653..fce529b6e4 100644 --- a/charts/tidb-operator/templates/advanced-statefulset-deployment.yaml +++ b/charts/tidb-operator/templates/advanced-statefulset-deployment.yaml @@ -42,6 +42,8 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace + - name: TZ + value: {{ .Values.timezone | default "UTC" }} resources: {{ toYaml .Values.advancedStatefulset.resources | indent 12 }} {{- with .Values.advancedStatefulset.nodeSelector }} diff --git a/charts/tidb-operator/values.yaml b/charts/tidb-operator/values.yaml index cffb362836..735392c4fe 100644 --- a/charts/tidb-operator/values.yaml +++ b/charts/tidb-operator/values.yaml @@ -151,7 +151,7 @@ apiserver: # kubectl apply -f manifests/advanced-statefulset-crd.v1.yaml # k8s version >= 1.16.0 advancedStatefulset: create: false - image: pingcap/advanced-statefulset:v0.3.3 + image: pingcap/advanced-statefulset:v0.4.0 imagePullPolicy: IfNotPresent serviceAccount: advanced-statefulset-controller logLevel: 2 diff --git a/pkg/backup/backup/backup_cleaner.go b/pkg/backup/backup/backup_cleaner.go index a872c09e31..57ab5b1dfa 100644 --- a/pkg/backup/backup/backup_cleaner.go +++ b/pkg/backup/backup/backup_cleaner.go @@ -21,6 +21,7 @@ import ( backuputil "github.com/pingcap/tidb-operator/pkg/backup/util" "github.com/pingcap/tidb-operator/pkg/controller" "github.com/pingcap/tidb-operator/pkg/label" + "github.com/pingcap/tidb-operator/pkg/util" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -143,7 +144,7 @@ func (bc *backupCleaner) makeCleanJob(backup *v1alpha1.Backup) (*batchv1.Job, st Image: controller.TidbBackupManagerImage, Args: args, ImagePullPolicy: corev1.PullIfNotPresent, - Env: storageEnv, + Env: util.AppendEnvIfPresent(storageEnv, "TZ"), Resources: backup.Spec.ResourceRequirements, }, }, diff --git a/pkg/backup/backup/backup_manager.go b/pkg/backup/backup/backup_manager.go index 7084de08d0..989607a533 100644 --- a/pkg/backup/backup/backup_manager.go +++ b/pkg/backup/backup/backup_manager.go @@ -221,7 +221,7 @@ func (bm *backupManager) makeExportJob(backup *v1alpha1.Backup) (*batchv1.Job, s VolumeMounts: []corev1.VolumeMount{ {Name: label.BackupJobLabelVal, MountPath: constants.BackupRootPath}, }, - Env: envVars, + Env: util.AppendEnvIfPresent(envVars, "TZ"), Resources: backup.Spec.ResourceRequirements, }, }, @@ -360,7 +360,7 @@ func (bm *backupManager) makeBackupJob(backup *v1alpha1.Backup) (*batchv1.Job, s Args: args, ImagePullPolicy: corev1.PullIfNotPresent, VolumeMounts: volumeMounts, - Env: envVars, + Env: util.AppendEnvIfPresent(envVars, "TZ"), Resources: backup.Spec.ResourceRequirements, }, }, diff --git a/pkg/backup/restore/restore_manager.go b/pkg/backup/restore/restore_manager.go index 213e0927bb..7b9339fe11 100644 --- a/pkg/backup/restore/restore_manager.go +++ b/pkg/backup/restore/restore_manager.go @@ -207,7 +207,7 @@ func (rm *restoreManager) makeImportJob(restore *v1alpha1.Restore) (*batchv1.Job VolumeMounts: []corev1.VolumeMount{ {Name: label.RestoreJobLabelVal, MountPath: constants.BackupRootPath}, }, - Env: envVars, + Env: util.AppendEnvIfPresent(envVars, "TZ"), Resources: restore.Spec.ResourceRequirements, }, }, @@ -346,7 +346,7 @@ func (rm *restoreManager) makeRestoreJob(restore *v1alpha1.Restore) (*batchv1.Jo Args: args, ImagePullPolicy: corev1.PullIfNotPresent, VolumeMounts: volumeMounts, - Env: envVars, + Env: util.AppendEnvIfPresent(envVars, "TZ"), Resources: restore.Spec.ResourceRequirements, }, }, diff --git a/pkg/util/util.go b/pkg/util/util.go index 5af3953dd5..8a445789b2 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -16,6 +16,7 @@ package util import ( "encoding/json" "fmt" + "os" "strconv" "strings" @@ -252,3 +253,19 @@ func RetainManagedFields(desiredSvc, existedSvc *corev1.Service) { } } } + +// AppendEnvIfPresent appends the given environment if present +func AppendEnvIfPresent(envs []corev1.EnvVar, name string) []corev1.EnvVar { + for _, e := range envs { + if e.Name == name { + return envs + } + } + if val, ok := os.LookupEnv(name); ok { + envs = append(envs, corev1.EnvVar{ + Name: name, + Value: val, + }) + } + return envs +} diff --git a/pkg/util/utils_test.go b/pkg/util/utils_test.go index a4f9d4e740..b199531412 100644 --- a/pkg/util/utils_test.go +++ b/pkg/util/utils_test.go @@ -14,6 +14,7 @@ package util import ( + "os" "testing" "github.com/google/go-cmp/cmp" @@ -187,3 +188,94 @@ func TestAppendEnv(t *testing.T) { }) } } + +func TestAppendEnvIfPresent(t *testing.T) { + tests := []struct { + name string + a []corev1.EnvVar + envs map[string]string + n string + want []corev1.EnvVar + }{ + { + "does not exist", + []corev1.EnvVar{ + { + Name: "foo", + Value: "bar", + }, + }, + nil, + "TEST_ENV", + []corev1.EnvVar{ + { + Name: "foo", + Value: "bar", + }, + }, + }, + { + "does exist", + []corev1.EnvVar{ + { + Name: "foo", + Value: "bar", + }, + }, + map[string]string{ + "TEST_ENV": "TEST_VAL", + }, + "TEST_ENV", + []corev1.EnvVar{ + { + Name: "foo", + Value: "bar", + }, + { + Name: "TEST_ENV", + Value: "TEST_VAL", + }, + }, + }, + { + "already exist", + []corev1.EnvVar{ + { + Name: "foo", + Value: "bar", + }, + { + Name: "TEST_ENV", + Value: "TEST_OLD_VAL", + }, + }, + map[string]string{ + "TEST_ENV": "TEST_VAL", + }, + "TEST_ENV", + []corev1.EnvVar{ + { + Name: "foo", + Value: "bar", + }, + { + Name: "TEST_ENV", + Value: "TEST_OLD_VAL", + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + os.Clearenv() + for k, v := range tt.envs { + os.Setenv(k, v) + } + got := AppendEnvIfPresent(tt.a, tt.n) + if diff := cmp.Diff(tt.want, got); diff != "" { + t.Errorf("unwant (-want, +got): %s", diff) + } + }) + } +}