Skip to content

Commit 94fc3ea

Browse files
committed
convert StringData to data
If applied, will make sure that stringData is converted to Data before applying. Signed-off-by: Soule BA <bah.soule@gmail.com>
1 parent af165a9 commit 94fc3ea

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

ssa/manager_diff_test.go

+52
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,49 @@ func TestDiff(t *testing.T) {
8686
}
8787
})
8888

89+
t.Run("generates diff for replaced key in stringData secret", func(t *testing.T) {
90+
// create a new stringData secret
91+
sec := secret.DeepCopy()
92+
if err := unstructured.SetNestedField(sec.Object, generateName("diff"), "metadata", "name"); err != nil {
93+
t.Fatal(err)
94+
}
95+
96+
// copy the secret to simulate a replace of key
97+
diffSecret := sec.DeepCopy()
98+
99+
// apply stringData conversion
100+
SetNativeKindsDefaults([]*unstructured.Unstructured{sec})
101+
102+
if _, err = manager.Apply(ctx, sec, DefaultApplyOptions()); err != nil {
103+
t.Fatal(err)
104+
}
105+
106+
newVal := "diff-test"
107+
unstructured.RemoveNestedField(diffSecret.Object, "stringData", "key")
108+
109+
newKey := "key.new"
110+
err = unstructured.SetNestedField(diffSecret.Object, newVal, "stringData", newKey)
111+
if err != nil {
112+
t.Fatal(err)
113+
}
114+
115+
// apply stringData conversion
116+
SetNativeKindsDefaults([]*unstructured.Unstructured{diffSecret})
117+
118+
_, liveObj, mergedObj, err := manager.Diff(ctx, diffSecret, DefaultDiffOptions())
119+
if err != nil {
120+
t.Fatal(err)
121+
}
122+
123+
liveKeys := getKeys(liveObj.Object["data"].(map[string]interface{}))
124+
mergedKeys := getKeys(mergedObj.Object["data"].(map[string]interface{}))
125+
126+
if diff := cmp.Diff(liveKeys, mergedKeys); diff != "" && len(liveKeys) != len(mergedKeys) {
127+
t.Errorf("Mismatch from expected value (-want +got):\n%s", diff)
128+
}
129+
130+
})
131+
89132
t.Run("masks secret values", func(t *testing.T) {
90133
newVal := "diff-test"
91134
err = unstructured.SetNestedField(secret.Object, newVal, "stringData", "key")
@@ -340,3 +383,12 @@ func TestHasDrifted_Metadata(t *testing.T) {
340383
})
341384
}
342385
}
386+
387+
func getKeys(m map[string]interface{}) []string {
388+
var keys []string
389+
for k := range m {
390+
keys = append(keys, k)
391+
}
392+
393+
return keys
394+
}

ssa/utils.go

+27
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ func AnyInMetadata(object *unstructured.Unstructured, metadata map[string]string
276276
// ContainerPort missing default TCP proto: https://github.com/kubernetes-sigs/structured-merge-diff/issues/130
277277
// ServicePort missing default TCP proto: https://github.com/kubernetes/kubernetes/pull/98576
278278
// PodSpec resources missing int to string conversion for e.g. 'cpu: 2'
279+
// secret.stringData key replacement add an extra key in the resulting data map: https://github.com/kubernetes/kubernetes/issues/108008
279280
func SetNativeKindsDefaults(objects []*unstructured.Unstructured) error {
280281

281282
var setProtoDefault = func(spec *corev1.PodSpec) {
@@ -326,6 +327,18 @@ func SetNativeKindsDefaults(objects []*unstructured.Unstructured) error {
326327
return fmt.Errorf("%s validation error: %w", FmtUnstructured(u), err)
327328
}
328329
u.Object = out
330+
case "Secret":
331+
var s corev1.Secret
332+
err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, &s)
333+
if err != nil {
334+
return fmt.Errorf("%s validation error: %w", FmtUnstructured(u), err)
335+
}
336+
convertStringDataToData(&s)
337+
out, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&s)
338+
if err != nil {
339+
return fmt.Errorf("%s validation error: %w", FmtUnstructured(u), err)
340+
}
341+
u.Object = out
329342
}
330343

331344
case "apps/v1":
@@ -475,3 +488,17 @@ func containsItemString(s []string, e string) bool {
475488
}
476489
return false
477490
}
491+
492+
func convertStringDataToData(secret *corev1.Secret) {
493+
// StringData overwrites Data
494+
if len(secret.StringData) > 0 {
495+
if secret.Data == nil {
496+
secret.Data = map[string][]byte{}
497+
}
498+
for k, v := range secret.StringData {
499+
secret.Data[k] = []byte(v)
500+
}
501+
502+
secret.StringData = nil
503+
}
504+
}

0 commit comments

Comments
 (0)