From aecdbf44c77db060857a95a94f54c8a82190b140 Mon Sep 17 00:00:00 2001 From: immanuwell Date: Thu, 28 May 2026 09:53:33 +0400 Subject: [PATCH] fix init container config refs in primary spec Signed-off-by: immanuwell --- pkg/canary/config_tracker.go | 38 ++++++++++++++++++++++++++++++- pkg/canary/config_tracker_test.go | 20 ++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/pkg/canary/config_tracker.go b/pkg/canary/config_tracker.go index c821312e6..0381d8177 100644 --- a/pkg/canary/config_tracker.go +++ b/pkg/canary/config_tracker.go @@ -78,7 +78,7 @@ func configIsDisabled(annotations map[string]string) bool { func (ct *ConfigTracker) getRefFromConfigMap(name string, namespace string) (*ConfigRef, error) { config, err := ct.KubeClient.CoreV1().ConfigMaps(namespace).Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { - return nil, fmt.Errorf("configmap %s.%s get query error: %w", name, namespace, err) + return nil, fmt.Errorf("configmap %s.%s get query error: %w", name, namespace, err) } if configIsDisabled(config.GetAnnotations()) { @@ -483,5 +483,41 @@ func (ct *ConfigTracker) ApplyPrimaryConfigs(spec corev1.PodSpec, refs map[strin } } + // update init containers + for _, container := range spec.InitContainers { + // update env + for i, env := range container.Env { + if env.ValueFrom != nil { + switch { + case env.ValueFrom.ConfigMapKeyRef != nil: + name := fmt.Sprintf("%s/%s", ConfigRefMap, env.ValueFrom.ConfigMapKeyRef.Name) + if _, exists := refs[name]; exists { + container.Env[i].ValueFrom.ConfigMapKeyRef.Name += "-primary" + } + case env.ValueFrom.SecretKeyRef != nil: + name := fmt.Sprintf("%s/%s", ConfigRefSecret, env.ValueFrom.SecretKeyRef.Name) + if _, exists := refs[name]; exists { + container.Env[i].ValueFrom.SecretKeyRef.Name += "-primary" + } + } + } + } + // update envFrom + for i, envFrom := range container.EnvFrom { + switch { + case envFrom.ConfigMapRef != nil: + name := fmt.Sprintf("%s/%s", ConfigRefMap, envFrom.ConfigMapRef.Name) + if _, exists := refs[name]; exists { + container.EnvFrom[i].ConfigMapRef.Name += "-primary" + } + case envFrom.SecretRef != nil: + name := fmt.Sprintf("%s/%s", ConfigRefSecret, envFrom.SecretRef.Name) + if _, exists := refs[name]; exists { + container.EnvFrom[i].SecretRef.Name += "-primary" + } + } + } + } + return spec } diff --git a/pkg/canary/config_tracker_test.go b/pkg/canary/config_tracker_test.go index edb88d1e5..cb3feb1b1 100644 --- a/pkg/canary/config_tracker_test.go +++ b/pkg/canary/config_tracker_test.go @@ -90,6 +90,11 @@ func TestConfigTracker_ConfigMaps(t *testing.T) { assert.Equal(t, configMapProjected.Data["color"], configPrimaryProjected.Data["color"]) } + assert.Equal(t, "podinfo-config-init-env-primary", + depPrimary.Spec.Template.Spec.InitContainers[0].Env[0].ValueFrom.ConfigMapKeyRef.Name) + assert.Equal(t, "podinfo-config-init-all-env-primary", + depPrimary.Spec.Template.Spec.InitContainers[0].EnvFrom[0].ConfigMapRef.Name) + _, err = mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-tracker-enabled", metav1.GetOptions{}) assert.NoError(t, err) _, err = mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-tracker-enabled-primary", metav1.GetOptions{}) @@ -166,6 +171,11 @@ func TestConfigTracker_ConfigMaps(t *testing.T) { assert.Equal(t, configMapProjected.Data["color"], configPrimaryProjected.Data["color"]) } + assert.Equal(t, "podinfo-config-init-env-primary", + daePrimary.Spec.Template.Spec.InitContainers[0].Env[0].ValueFrom.ConfigMapKeyRef.Name) + assert.Equal(t, "podinfo-config-init-all-env-primary", + daePrimary.Spec.Template.Spec.InitContainers[0].EnvFrom[0].ConfigMapRef.Name) + _, err = mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-tracker-enabled", metav1.GetOptions{}) assert.NoError(t, err) _, err = mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-tracker-enabled-primary", metav1.GetOptions{}) @@ -243,6 +253,11 @@ func TestConfigTracker_Secrets(t *testing.T) { assert.Equal(t, string(secretProjected.Data["apiKey"]), string(secretPrimaryProjected.Data["apiKey"])) } + assert.Equal(t, "podinfo-secret-init-env-primary", + depPrimary.Spec.Template.Spec.InitContainers[0].Env[1].ValueFrom.SecretKeyRef.Name) + assert.Equal(t, "podinfo-secret-init-all-env-primary", + depPrimary.Spec.Template.Spec.InitContainers[0].EnvFrom[1].SecretRef.Name) + _, err = mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-tracker-enabled", metav1.GetOptions{}) assert.NoError(t, err) _, err = mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-tracker-enabled-primary", metav1.GetOptions{}) @@ -318,6 +333,11 @@ func TestConfigTracker_Secrets(t *testing.T) { assert.Equal(t, string(secretProjected.Data["apiKey"]), string(secretPrimaryProjected.Data["apiKey"])) } + assert.Equal(t, "podinfo-secret-init-env-primary", + daePrimary.Spec.Template.Spec.InitContainers[0].Env[1].ValueFrom.SecretKeyRef.Name) + assert.Equal(t, "podinfo-secret-init-all-env-primary", + daePrimary.Spec.Template.Spec.InitContainers[0].EnvFrom[1].SecretRef.Name) + _, err = mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-tracker-enabled", metav1.GetOptions{}) assert.NoError(t, err) _, err = mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-tracker-enabled-primary", metav1.GetOptions{})