Skip to content

Commit c69efe6

Browse files
authored
refactor(diff): extract secret handling to preHandleSecrets (#787)
* refactor(diff): extract secret handling to preHandleSecrets Signed-off-by: yxxhero <[email protected]>
1 parent ab6f030 commit c69efe6

File tree

2 files changed

+65
-34
lines changed

2 files changed

+65
-34
lines changed

diff/diff.go

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -239,16 +239,9 @@ func doDiff(report *Report, key string, oldContent *manifest.MappingResult, newC
239239
}
240240
}
241241

242-
// redactSecrets redacts secrets from the diff output.
243-
func redactSecrets(old, new *manifest.MappingResult) {
242+
func preHandleSecrets(old, new *manifest.MappingResult) (v1.Secret, v1.Secret, error, error) {
244243
var oldSecretDecodeErr, newSecretDecodeErr error
245-
if (old != nil && old.Kind != "Secret") || (new != nil && new.Kind != "Secret") {
246-
return
247-
}
248-
serializer := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme,
249-
scheme.Scheme)
250244
var oldSecret, newSecret v1.Secret
251-
252245
if old != nil {
253246
oldSecretDecodeErr = yaml.NewYAMLToJSONDecoder(bytes.NewBufferString(old.Content)).Decode(&oldSecret)
254247
if oldSecretDecodeErr != nil {
@@ -279,6 +272,17 @@ func redactSecrets(old, new *manifest.MappingResult) {
279272
}
280273
}
281274
}
275+
return oldSecret, newSecret, oldSecretDecodeErr, newSecretDecodeErr
276+
}
277+
278+
// redactSecrets redacts secrets from the diff output.
279+
func redactSecrets(old, new *manifest.MappingResult) {
280+
if (old != nil && old.Kind != "Secret") || (new != nil && new.Kind != "Secret") {
281+
return
282+
}
283+
serializer := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme, scheme.Scheme)
284+
285+
oldSecret, newSecret, oldSecretDecodeErr, newSecretDecodeErr := preHandleSecrets(old, new)
282286

283287
if old != nil && oldSecretDecodeErr == nil {
284288
oldSecret.StringData = make(map[string]string, len(oldSecret.Data))
@@ -324,38 +328,23 @@ func redactSecrets(old, new *manifest.MappingResult) {
324328

325329
// decodeSecrets decodes secrets from the diff output.
326330
func decodeSecrets(old, new *manifest.MappingResult) {
327-
var oldSecretDecodeErr, newSecretDecodeErr error
328331
if (old != nil && old.Kind != "Secret") || (new != nil && new.Kind != "Secret") {
329332
return
330333
}
331-
serializer := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme,
332-
scheme.Scheme)
333-
var oldSecret, newSecret v1.Secret
334+
serializer := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme.Scheme, scheme.Scheme)
334335

335-
if old != nil {
336-
oldSecretDecodeErr = yaml.NewYAMLToJSONDecoder(bytes.NewBufferString(old.Content)).Decode(&oldSecret)
337-
if oldSecretDecodeErr != nil {
338-
old.Content = fmt.Sprintf("Error parsing old secret: %s", oldSecretDecodeErr)
339-
} else {
340-
if len(oldSecret.Data) > 0 && oldSecret.StringData == nil {
341-
oldSecret.StringData = make(map[string]string, len(oldSecret.Data))
342-
}
343-
for k, v := range oldSecret.Data {
344-
oldSecret.StringData[k] = string(v)
345-
}
336+
oldSecret, newSecret, oldSecretDecodeErr, newSecretDecodeErr := preHandleSecrets(old, new)
337+
338+
if old != nil && oldSecretDecodeErr == nil {
339+
oldSecret.StringData = make(map[string]string, len(oldSecret.Data))
340+
for k, v := range oldSecret.Data {
341+
oldSecret.StringData[k] = string(v)
346342
}
347343
}
348-
if new != nil {
349-
newSecretDecodeErr = yaml.NewYAMLToJSONDecoder(bytes.NewBufferString(new.Content)).Decode(&newSecret)
350-
if newSecretDecodeErr != nil {
351-
new.Content = fmt.Sprintf("Error parsing new secret: %s", newSecretDecodeErr)
352-
} else {
353-
if len(newSecret.Data) > 0 && newSecret.StringData == nil {
354-
newSecret.StringData = make(map[string]string, len(newSecret.StringData))
355-
}
356-
for k, v := range newSecret.Data {
357-
newSecret.StringData[k] = string(v)
358-
}
344+
if new != nil && newSecretDecodeErr == nil {
345+
newSecret.StringData = make(map[string]string, len(newSecret.Data))
346+
for k, v := range newSecret.Data {
347+
newSecret.StringData[k] = string(v)
359348
}
360349
}
361350

diff/diff_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,6 +943,48 @@ stringData:
943943
require.Contains(t, new.Content, "key1: value1changed")
944944
require.Contains(t, new.Content, "key2: value2")
945945
})
946+
t.Run("decodeSecrets with stringData and data ensuring that stringData always precedes/overrides data on Secrets", func(t *testing.T) {
947+
old := &manifest.MappingResult{
948+
Name: "default, foo, Secret (v1)",
949+
Kind: "Secret",
950+
Content: `
951+
apiVersion: v1
952+
kind: Secret
953+
metadata:
954+
name: foo
955+
type: Opaque
956+
stringData:
957+
key1: value1.stringdata
958+
key2: value2.stringdata
959+
data:
960+
key2: dmFsdWUyLmRhdGE=
961+
key3: dmFsdWUzLmRhdGE=
962+
`,
963+
}
964+
new := &manifest.MappingResult{
965+
Name: "default, foo, Secret (v1)",
966+
Kind: "Secret",
967+
Content: `
968+
apiVersion: v1
969+
kind: Secret
970+
metadata:
971+
name: foo
972+
type: Opaque
973+
stringData:
974+
key1: value1changed.stringdata
975+
key2: value2.stringdata
976+
data:
977+
key3: dmFsdWUzLmRhdGE=
978+
`,
979+
}
980+
decodeSecrets(old, new)
981+
require.Contains(t, old.Content, "key1: value1.stringdata")
982+
require.Contains(t, old.Content, "key2: value2.stringdata")
983+
require.Contains(t, old.Content, "key3: value3.data")
984+
require.Contains(t, new.Content, "key1: value1changed.stringdata")
985+
require.Contains(t, new.Content, "key2: value2.stringdata")
986+
require.Contains(t, new.Content, "key3: value3.data")
987+
})
946988

947989
t.Run("decodeSecrets with invalid base64", func(t *testing.T) {
948990
old := &manifest.MappingResult{

0 commit comments

Comments
 (0)