Skip to content

Commit 8396f6e

Browse files
committed
Feat: support tracking binaryData in CM and stringData in Secret
Signed-off-by: MengjiaLiang <mengjia.liang@uipath.com>
1 parent 8276bfa commit 8396f6e

File tree

3 files changed

+100
-5
lines changed

3 files changed

+100
-5
lines changed

pkg/canary/config_tracker.go

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"crypto/sha256"
2222
"encoding/json"
2323
"fmt"
24+
"maps"
2425
"strings"
2526

2627
"go.uber.org/zap"
@@ -88,7 +89,7 @@ func (ct *ConfigTracker) getRefFromConfigMap(name string, namespace string) (*Co
8889
return &ConfigRef{
8990
Name: config.Name,
9091
Type: ConfigRefMap,
91-
Checksum: checksum(config.Data),
92+
Checksum: checksum(ct.getFullDataFromConfigMap(*config)),
9293
}, nil
9394
}
9495

@@ -116,10 +117,35 @@ func (ct *ConfigTracker) getRefFromSecret(name string, namespace string) (*Confi
116117
return &ConfigRef{
117118
Name: secret.Name,
118119
Type: ConfigRefSecret,
119-
Checksum: checksum(secret.Data),
120+
Checksum: checksum(ct.getFullDataFromSecret(*secret)),
120121
}, nil
121122
}
122123

124+
// getFullDataFromConfigMap fetches both data and binaryData in the configmap
125+
func (ct *ConfigTracker) getFullDataFromConfigMap(config corev1.ConfigMap) map[string]string {
126+
fullData := make(map[string]string)
127+
maps.Copy(fullData, config.Data)
128+
129+
for k, v := range config.BinaryData {
130+
fullData[k] = string(v)
131+
132+
}
133+
134+
return fullData
135+
}
136+
137+
// getFullDataFromSecret fetches both data and stringData in the secret
138+
func (ct *ConfigTracker) getFullDataFromSecret(secret corev1.Secret) map[string]string {
139+
fullData := make(map[string]string)
140+
maps.Copy(fullData, secret.StringData)
141+
142+
for k, v := range secret.Data {
143+
fullData[k] = string(v)
144+
}
145+
146+
return fullData
147+
}
148+
123149
// GetTargetConfigs scans the target deployment for Kubernetes ConfigMaps and Secrets
124150
// and returns a list of config references
125151
func (ct *ConfigTracker) GetTargetConfigs(cd *flaggerv1.Canary) (map[string]ConfigRef, error) {
@@ -332,7 +358,8 @@ func (ct *ConfigTracker) CreatePrimaryConfigs(cd *flaggerv1.Canary, refs map[str
332358
Labels: labels,
333359
OwnerReferences: ownerReferences,
334360
},
335-
Data: config.Data,
361+
Data: config.Data,
362+
BinaryData: config.BinaryData,
336363
}
337364

338365
// update or insert primary ConfigMap
@@ -385,8 +412,9 @@ func (ct *ConfigTracker) CreatePrimaryConfigs(cd *flaggerv1.Canary, refs map[str
385412
Labels: labels,
386413
OwnerReferences: ownerReferences,
387414
},
388-
Type: secret.Type,
389-
Data: secret.Data,
415+
Type: secret.Type,
416+
Data: secret.Data,
417+
StringData: secret.StringData,
390418
}
391419

392420
// update or insert primary Secret

pkg/canary/config_tracker_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,26 +60,31 @@ func TestConfigTracker_ConfigMaps(t *testing.T) {
6060
configPrimaryInit, err := mocks.kubeClient.CoreV1().ConfigMaps("default").Get(context.TODO(), "podinfo-config-init-env-primary", metav1.GetOptions{})
6161
if assert.NoError(t, err) {
6262
assert.Equal(t, configMap.Data["color"], configPrimaryInit.Data["color"])
63+
assert.Equal(t, configMap.BinaryData["color_binary"], configPrimaryInit.BinaryData["color_binary"])
6364
}
6465

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

238254
secretProjectedName := depPrimary.Spec.Template.Spec.Volumes[2].VolumeSource.Projected.Sources[1].Secret.Name

pkg/canary/deployment_fixture_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ func newDeploymentControllerTestConfigMap() *corev1.ConfigMap {
143143
Data: map[string]string{
144144
"color": "red",
145145
},
146+
BinaryData: map[string][]byte{
147+
"color_binary": []byte("cmVkCg=="),
148+
},
146149
}
147150
}
148151

@@ -157,6 +160,9 @@ func newDeploymentControllerTestConfigMapV2() *corev1.ConfigMap {
157160
"color": "blue",
158161
"output": "console",
159162
},
163+
BinaryData: map[string][]byte{
164+
"color_binary": []byte("Ymx1ZAo="),
165+
},
160166
}
161167
}
162168

@@ -170,6 +176,9 @@ func newDeploymentControllerTestConfigMapInit() *corev1.ConfigMap {
170176
Data: map[string]string{
171177
"color": "red",
172178
},
179+
BinaryData: map[string][]byte{
180+
"color_binary": []byte("cmVkCg=="),
181+
},
173182
}
174183
}
175184

@@ -183,6 +192,9 @@ func newDeploymentControllerTestConfigMapInitEnv() *corev1.ConfigMap {
183192
Data: map[string]string{
184193
"color": "red",
185194
},
195+
BinaryData: map[string][]byte{
196+
"color_binary": []byte("cmVkCg=="),
197+
},
186198
}
187199
}
188200

@@ -196,6 +208,9 @@ func newDeploymentControllerTestConfigProjected() *corev1.ConfigMap {
196208
Data: map[string]string{
197209
"color": "red",
198210
},
211+
BinaryData: map[string][]byte{
212+
"color_binary": []byte("cmVkCg=="),
213+
},
199214
}
200215
}
201216

@@ -209,6 +224,9 @@ func newDeploymentControllerTestConfigMapEnv() *corev1.ConfigMap {
209224
Data: map[string]string{
210225
"color": "red",
211226
},
227+
BinaryData: map[string][]byte{
228+
"color_binary": []byte("cmVkCg=="),
229+
},
212230
}
213231
}
214232

@@ -227,6 +245,9 @@ func newDeploymentControllerTestConfigMapTrackerEnabled() *corev1.ConfigMap {
227245
Data: map[string]string{
228246
"color": "red",
229247
},
248+
BinaryData: map[string][]byte{
249+
"color_binary": []byte("cmVkCg=="),
250+
},
230251
}
231252
}
232253

@@ -245,6 +266,9 @@ func newDeploymentControllerTestConfigMapTrackerDisabled() *corev1.ConfigMap {
245266
Data: map[string]string{
246267
"color": "red",
247268
},
269+
BinaryData: map[string][]byte{
270+
"color_binary": []byte("cmVkCg=="),
271+
},
248272
}
249273
}
250274

@@ -258,6 +282,9 @@ func newDeploymentControllerTestConfigMapVol() *corev1.ConfigMap {
258282
Data: map[string]string{
259283
"color": "red",
260284
},
285+
BinaryData: map[string][]byte{
286+
"color_binary": []byte("cmVkCg=="),
287+
},
261288
}
262289
}
263290

@@ -272,6 +299,9 @@ func newDeploymentControllerTestSecret() *corev1.Secret {
272299
Data: map[string][]byte{
273300
"apiKey": []byte("test"),
274301
},
302+
StringData: map[string]string{
303+
"apiKey_string": "test",
304+
},
275305
}
276306
}
277307

@@ -286,6 +316,9 @@ func newDeploymentControllerTestSecretProjected() *corev1.Secret {
286316
Data: map[string][]byte{
287317
"apiKey": []byte("test"),
288318
},
319+
StringData: map[string]string{
320+
"apiKey_string": "test",
321+
},
289322
}
290323
}
291324

@@ -300,6 +333,9 @@ func newDeploymentControllerTestSecretEnv() *corev1.Secret {
300333
Data: map[string][]byte{
301334
"apiKey": []byte("test"),
302335
},
336+
StringData: map[string]string{
337+
"apiKey_string": "test",
338+
},
303339
}
304340
}
305341

@@ -314,6 +350,9 @@ func newDeploymentControllerTestSecretVol() *corev1.Secret {
314350
Data: map[string][]byte{
315351
"apiKey": []byte("test"),
316352
},
353+
StringData: map[string]string{
354+
"apiKey_string": "test",
355+
},
317356
}
318357
}
319358

@@ -333,6 +372,9 @@ func newDeploymentControllerTestSecretTrackerEnabled() *corev1.Secret {
333372
Data: map[string][]byte{
334373
"apiKey": []byte("test"),
335374
},
375+
StringData: map[string]string{
376+
"apiKey_string": "test",
377+
},
336378
}
337379
}
338380

@@ -352,6 +394,9 @@ func newDeploymentControllerTestSecretTrackerDisabled() *corev1.Secret {
352394
Data: map[string][]byte{
353395
"apiKey": []byte("test"),
354396
},
397+
StringData: map[string]string{
398+
"apiKey_string": "test",
399+
},
355400
}
356401
}
357402

@@ -366,6 +411,9 @@ func newDeploymentControllerTestSecretInit() *corev1.Secret {
366411
Data: map[string][]byte{
367412
"apiKey": []byte("test"),
368413
},
414+
StringData: map[string]string{
415+
"apiKey_string": "test",
416+
},
369417
}
370418
}
371419

@@ -380,6 +428,9 @@ func newDeploymentControllerTestSecretInitEnv() *corev1.Secret {
380428
Data: map[string][]byte{
381429
"apiKey": []byte("test"),
382430
},
431+
StringData: map[string]string{
432+
"apiKey_string": "test",
433+
},
383434
}
384435
}
385436

0 commit comments

Comments
 (0)