From 19b5a52b02b890bebd37cff4b5defea612319032 Mon Sep 17 00:00:00 2001 From: Sergei Kuzmin Date: Mon, 28 Feb 2022 03:42:49 -0800 Subject: [PATCH] Annotation to override object name for diff purposes This is useful for immutable secrets which are typically named as secret-base-name-<.data hash>. Previously old and new secrets were considere completely independent ConfigMap/Secret. With this annotation user can add "helm.sh/base-name: secret-base-name" annotation and compare old and new objects similar to git rename. --- manifest/parse.go | 11 ++++++++--- manifest/parse_test.go | 10 ++++++++++ manifest/testdata/secret_immutable.yaml | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 manifest/testdata/secret_immutable.yaml diff --git a/manifest/parse.go b/manifest/parse.go index 68d08e03..ad2f6dc4 100644 --- a/manifest/parse.go +++ b/manifest/parse.go @@ -7,7 +7,7 @@ import ( "log" "strings" - yaml "gopkg.in/yaml.v2" + "gopkg.in/yaml.v2" "k8s.io/helm/pkg/proto/hapi/release" ) @@ -40,8 +40,13 @@ func (m metadata) String() string { if len(sp) > 1 { apiBase = strings.Join(sp[:len(sp)-1], "/") } - - return fmt.Sprintf("%s, %s, %s (%s)", m.Metadata.Namespace, m.Metadata.Name, m.Kind, apiBase) + name := m.Metadata.Name + if a := m.Metadata.Annotations; a != nil { + if baseName, ok := a["helm-diff/base-name"]; ok { + name = baseName + } + } + return fmt.Sprintf("%s, %s, %s (%s)", m.Metadata.Namespace, name, m.Kind, apiBase) } func scanYamlSpecs(data []byte, atEOF bool) (advance int, token []byte, err error) { diff --git a/manifest/parse_test.go b/manifest/parse_test.go index 14c6c2cc..c5a7e319 100644 --- a/manifest/parse_test.go +++ b/manifest/parse_test.go @@ -101,3 +101,13 @@ func TestEmpty(t *testing.T) { foundObjects(Parse(string(spec), "default", false)), ) } + +func TestBaseNameAnnotation(t *testing.T) { + spec, err := ioutil.ReadFile("testdata/secret_immutable.yaml") + require.NoError(t, err) + + require.Equal(t, + []string{"default, bat-secret, Secret (v1)"}, + foundObjects(Parse(string(spec), "default", false)), + ) +} diff --git a/manifest/testdata/secret_immutable.yaml b/manifest/testdata/secret_immutable.yaml new file mode 100644 index 00000000..b3dc160c --- /dev/null +++ b/manifest/testdata/secret_immutable.yaml @@ -0,0 +1,14 @@ + +--- +# Source: nginx/some-secrets.yaml +apiVersion: v1 +kind: Secret +metadata: + name: bat-secret-ab1234cd + annotations: + helm-diff/base-name: bat-secret +immutable: true +type: Opaque +stringData: + secret1: Very secretive secret + secret2: One more