Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 33 additions & 5 deletions pkg/canary/config_tracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"crypto/sha256"
"encoding/json"
"fmt"
"maps"
"strings"

"go.uber.org/zap"
Expand Down Expand Up @@ -88,7 +89,7 @@ func (ct *ConfigTracker) getRefFromConfigMap(name string, namespace string) (*Co
return &ConfigRef{
Name: config.Name,
Type: ConfigRefMap,
Checksum: checksum(config.Data),
Checksum: checksum(ct.getFullDataFromConfigMap(*config)),
}, nil
}

Expand Down Expand Up @@ -116,10 +117,35 @@ func (ct *ConfigTracker) getRefFromSecret(name string, namespace string) (*Confi
return &ConfigRef{
Name: secret.Name,
Type: ConfigRefSecret,
Checksum: checksum(secret.Data),
Checksum: checksum(ct.getFullDataFromSecret(*secret)),
}, nil
}

// getFullDataFromConfigMap fetches both data and binaryData in the configmap
func (ct *ConfigTracker) getFullDataFromConfigMap(config corev1.ConfigMap) map[string]string {
fullData := make(map[string]string)
maps.Copy(fullData, config.Data)

for k, v := range config.BinaryData {
fullData[k] = string(v)

}

return fullData
}

// getFullDataFromSecret fetches both data and stringData in the secret
func (ct *ConfigTracker) getFullDataFromSecret(secret corev1.Secret) map[string]string {
fullData := make(map[string]string)
maps.Copy(fullData, secret.StringData)

for k, v := range secret.Data {
fullData[k] = string(v)
}

return fullData
}

// GetTargetConfigs scans the target deployment for Kubernetes ConfigMaps and Secrets
// and returns a list of config references
func (ct *ConfigTracker) GetTargetConfigs(cd *flaggerv1.Canary) (map[string]ConfigRef, error) {
Expand Down Expand Up @@ -332,7 +358,8 @@ func (ct *ConfigTracker) CreatePrimaryConfigs(cd *flaggerv1.Canary, refs map[str
Labels: labels,
OwnerReferences: ownerReferences,
},
Data: config.Data,
Data: config.Data,
BinaryData: config.BinaryData,
}

// update or insert primary ConfigMap
Expand Down Expand Up @@ -385,8 +412,9 @@ func (ct *ConfigTracker) CreatePrimaryConfigs(cd *flaggerv1.Canary, refs map[str
Labels: labels,
OwnerReferences: ownerReferences,
},
Type: secret.Type,
Data: secret.Data,
Type: secret.Type,
Data: secret.Data,
StringData: secret.StringData,
}

// update or insert primary Secret
Expand Down
16 changes: 16 additions & 0 deletions pkg/canary/config_tracker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,26 +60,31 @@ func TestConfigTracker_ConfigMaps(t *testing.T) {
configPrimaryInit, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-init-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimaryInit.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryInit.BinaryData["color_binary"])
}

configPrimaryInitEnv, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-init-all-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimaryInitEnv.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryInitEnv.BinaryData["color_binary"])
}

configPrimary, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimary.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimary.BinaryData["color_binary"])
}

configPrimaryEnv, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-all-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimaryEnv.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryEnv.BinaryData["color_binary"])
}

configPrimaryVol, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-vol-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimaryVol.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryVol.BinaryData["color_binary"])
}

configProjectedName := depPrimary.Spec.Template.Spec.Volumes[2].VolumeSource.Projected.Sources[0].ConfigMap.Name
Expand Down Expand Up @@ -136,26 +141,31 @@ func TestConfigTracker_ConfigMaps(t *testing.T) {
configPrimaryInit, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-init-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimaryInit.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryInit.BinaryData["color_binary"])
}

configPrimaryInitEnv, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-init-all-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimaryInitEnv.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryInitEnv.BinaryData["color_binary"])
}

configPrimary, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimary.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimary.BinaryData["color_binary"])
}

configPrimaryEnv, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-all-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimaryEnv.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryEnv.BinaryData["color_binary"])
}

configPrimaryVol, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-vol-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMap.Data["color"], configPrimaryVol.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryVol.BinaryData["color_binary"])
}

configProjectedName := daePrimary.Spec.Template.Spec.Volumes[2].VolumeSource.Projected.Sources[0].ConfigMap.Name
Expand All @@ -164,6 +174,7 @@ func TestConfigTracker_ConfigMaps(t *testing.T) {
configPrimaryProjected, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-vol-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, configMapProjected.Data["color"], configPrimaryProjected.Data["color"])
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryProjected.BinaryData["color_binary"])
}

_, err = mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-tracker-enabled", metav1.GetOptions{})
Expand Down Expand Up @@ -213,26 +224,31 @@ func TestConfigTracker_Secrets(t *testing.T) {
secretPrimaryInit, err := mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-init-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, string(secret.Data["apiKey"]), string(secretPrimaryInit.Data["apiKey"]))
assert.Equal(t, string(secret.StringData["apiKey_string"]), string(secretPrimaryInit.StringData["apiKey_string"]))
}

secretPrimaryInitEnv, err := mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-init-all-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, string(secret.Data["apiKey"]), string(secretPrimaryInitEnv.Data["apiKey"]))
assert.Equal(t, string(secret.StringData["apiKey_string"]), string(secretPrimaryInitEnv.StringData["apiKey_string"]))
}

secretPrimary, err := mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, string(secret.Data["apiKey"]), string(secretPrimary.Data["apiKey"]))
assert.Equal(t, string(secret.StringData["apiKey_string"]), string(secretPrimary.StringData["apiKey_string"]))
}

secretPrimaryEnv, err := mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-all-env-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, string(secret.Data["apiKey"]), string(secretPrimaryEnv.Data["apiKey"]))
assert.Equal(t, string(secret.StringData["apiKey_string"]), string(secretPrimaryEnv.StringData["apiKey_string"]))
}

secretPrimaryVol, err := mocks.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "podinfo-secret-vol-primary", metav1.GetOptions{})
if assert.NoError(t, err) {
assert.Equal(t, string(secret.Data["apiKey"]), string(secretPrimaryVol.Data["apiKey"]))
assert.Equal(t, string(secret.StringData["apiKey_string"]), string(secretPrimaryVol.StringData["apiKey_string"]))
}

secretProjectedName := depPrimary.Spec.Template.Spec.Volumes[2].VolumeSource.Projected.Sources[1].Secret.Name
Expand Down
51 changes: 51 additions & 0 deletions pkg/canary/deployment_fixture_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ func newDeploymentControllerTestConfigMap() *corev1.ConfigMap {
Data: map[string]string{
"color": "red",
},
BinaryData: map[string][]byte{
"color_binary": []byte("cmVkCg=="),
},
}
}

Expand All @@ -157,6 +160,9 @@ func newDeploymentControllerTestConfigMapV2() *corev1.ConfigMap {
"color": "blue",
"output": "console",
},
BinaryData: map[string][]byte{
"color_binary": []byte("Ymx1ZAo="),
},
}
}

Expand All @@ -170,6 +176,9 @@ func newDeploymentControllerTestConfigMapInit() *corev1.ConfigMap {
Data: map[string]string{
"color": "red",
},
BinaryData: map[string][]byte{
"color_binary": []byte("cmVkCg=="),
},
}
}

Expand All @@ -183,6 +192,9 @@ func newDeploymentControllerTestConfigMapInitEnv() *corev1.ConfigMap {
Data: map[string]string{
"color": "red",
},
BinaryData: map[string][]byte{
"color_binary": []byte("cmVkCg=="),
},
}
}

Expand All @@ -196,6 +208,9 @@ func newDeploymentControllerTestConfigProjected() *corev1.ConfigMap {
Data: map[string]string{
"color": "red",
},
BinaryData: map[string][]byte{
"color_binary": []byte("cmVkCg=="),
},
}
}

Expand All @@ -209,6 +224,9 @@ func newDeploymentControllerTestConfigMapEnv() *corev1.ConfigMap {
Data: map[string]string{
"color": "red",
},
BinaryData: map[string][]byte{
"color_binary": []byte("cmVkCg=="),
},
}
}

Expand All @@ -227,6 +245,9 @@ func newDeploymentControllerTestConfigMapTrackerEnabled() *corev1.ConfigMap {
Data: map[string]string{
"color": "red",
},
BinaryData: map[string][]byte{
"color_binary": []byte("cmVkCg=="),
},
}
}

Expand All @@ -245,6 +266,9 @@ func newDeploymentControllerTestConfigMapTrackerDisabled() *corev1.ConfigMap {
Data: map[string]string{
"color": "red",
},
BinaryData: map[string][]byte{
"color_binary": []byte("cmVkCg=="),
},
}
}

Expand All @@ -258,6 +282,9 @@ func newDeploymentControllerTestConfigMapVol() *corev1.ConfigMap {
Data: map[string]string{
"color": "red",
},
BinaryData: map[string][]byte{
"color_binary": []byte("cmVkCg=="),
},
}
}

Expand All @@ -272,6 +299,9 @@ func newDeploymentControllerTestSecret() *corev1.Secret {
Data: map[string][]byte{
"apiKey": []byte("test"),
},
StringData: map[string]string{
"apiKey_string": "test",
},
}
}

Expand All @@ -286,6 +316,9 @@ func newDeploymentControllerTestSecretProjected() *corev1.Secret {
Data: map[string][]byte{
"apiKey": []byte("test"),
},
StringData: map[string]string{
"apiKey_string": "test",
},
}
}

Expand All @@ -300,6 +333,9 @@ func newDeploymentControllerTestSecretEnv() *corev1.Secret {
Data: map[string][]byte{
"apiKey": []byte("test"),
},
StringData: map[string]string{
"apiKey_string": "test",
},
}
}

Expand All @@ -314,6 +350,9 @@ func newDeploymentControllerTestSecretVol() *corev1.Secret {
Data: map[string][]byte{
"apiKey": []byte("test"),
},
StringData: map[string]string{
"apiKey_string": "test",
},
}
}

Expand All @@ -333,6 +372,9 @@ func newDeploymentControllerTestSecretTrackerEnabled() *corev1.Secret {
Data: map[string][]byte{
"apiKey": []byte("test"),
},
StringData: map[string]string{
"apiKey_string": "test",
},
}
}

Expand All @@ -352,6 +394,9 @@ func newDeploymentControllerTestSecretTrackerDisabled() *corev1.Secret {
Data: map[string][]byte{
"apiKey": []byte("test"),
},
StringData: map[string]string{
"apiKey_string": "test",
},
}
}

Expand All @@ -366,6 +411,9 @@ func newDeploymentControllerTestSecretInit() *corev1.Secret {
Data: map[string][]byte{
"apiKey": []byte("test"),
},
StringData: map[string]string{
"apiKey_string": "test",
},
}
}

Expand All @@ -380,6 +428,9 @@ func newDeploymentControllerTestSecretInitEnv() *corev1.Secret {
Data: map[string][]byte{
"apiKey": []byte("test"),
},
StringData: map[string]string{
"apiKey_string": "test",
},
}
}

Expand Down