diff --git a/cmd/config/internal/commands/annotate.go b/cmd/config/internal/commands/annotate.go index f3a80ff98..1a22e9b37 100644 --- a/cmd/config/internal/commands/annotate.go +++ b/cmd/config/internal/commands/annotate.go @@ -63,7 +63,8 @@ func (r *AnnotateRunner) runE(c *cobra.Command, args []string) error { return handleError(c, kio.Pipeline{ Inputs: input, Filters: []kio.Filter{r}, - Outputs: output}.Execute()) + Outputs: output, + }.Execute()) } func (r *AnnotateRunner) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { diff --git a/cmd/config/internal/commands/annotate_test.go b/cmd/config/internal/commands/annotate_test.go index 8354cff9b..13f180961 100644 --- a/cmd/config/internal/commands/annotate_test.go +++ b/cmd/config/internal/commands/annotate_test.go @@ -22,362 +22,40 @@ func TestAnnotateCommand(t *testing.T) { expected string }{ { - name: "single value", - args: []string{"--kv", "a=b"}, - expected: `kind: Deployment -metadata: - labels: - app: nginx2 - name: foo - annotations: - app: nginx2 - a: 'b' - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f1.yaml' -spec: - replicas: 1 ---- -kind: Service -metadata: - name: foo - annotations: - app: nginx - a: 'b' - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f1.yaml' -spec: - selector: - app: nginx ---- -apiVersion: v1 -kind: Abstraction -metadata: - name: foo - configFn: - container: - image: gcr.io/example/reconciler:v1 - annotations: - config.kubernetes.io/local-config: "true" - a: 'b' - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f2.yaml' - namespace: bar -spec: - replicas: 3 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: nginx - name: bar - annotations: - app: nginx - a: 'b' - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f2.yaml' - namespace: foo -spec: - replicas: 3 -`, + name: "single value", + args: []string{"--kv", "a=b"}, + expected: expectedSingleValue, }, { - name: "multi value", - args: []string{"--kv", "a=b", "--kv", "c=d"}, - expected: `kind: Deployment -metadata: - labels: - app: nginx2 - name: foo - annotations: - app: nginx2 - a: 'b' - c: 'd' - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f1.yaml' -spec: - replicas: 1 ---- -kind: Service -metadata: - name: foo - annotations: - app: nginx - a: 'b' - c: 'd' - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f1.yaml' -spec: - selector: - app: nginx ---- -apiVersion: v1 -kind: Abstraction -metadata: - name: foo - configFn: - container: - image: gcr.io/example/reconciler:v1 - annotations: - config.kubernetes.io/local-config: "true" - a: 'b' - c: 'd' - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f2.yaml' - namespace: bar -spec: - replicas: 3 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: nginx - name: bar - annotations: - app: nginx - a: 'b' - c: 'd' - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f2.yaml' - namespace: foo -spec: - replicas: 3 -`, + name: "multi value", + args: []string{"--kv", "a=b", "--kv", "c=d"}, + expected: expectedMultiValue, }, { - name: "filter kind", - args: []string{"--kv", "a=b", "--kind", "Service"}, - expected: `kind: Deployment -metadata: - labels: - app: nginx2 - name: foo - annotations: - app: nginx2 - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f1.yaml' -spec: - replicas: 1 ---- -kind: Service -metadata: - name: foo - annotations: - app: nginx - a: 'b' - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f1.yaml' -spec: - selector: - app: nginx ---- -apiVersion: v1 -kind: Abstraction -metadata: - name: foo - configFn: - container: - image: gcr.io/example/reconciler:v1 - annotations: - config.kubernetes.io/local-config: "true" - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f2.yaml' - namespace: bar -spec: - replicas: 3 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: nginx - name: bar - annotations: - app: nginx - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f2.yaml' - namespace: foo -spec: - replicas: 3 -`, + name: "filter kind", + args: []string{"--kv", "a=b", "--kind", "Service"}, + expected: expectedFilterKindService, }, { - name: "filter apiVersion", - args: []string{"--kv", "a=b", "--apiVersion", "v1"}, - expected: `kind: Deployment -metadata: - labels: - app: nginx2 - name: foo - annotations: - app: nginx2 - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f1.yaml' -spec: - replicas: 1 ---- -kind: Service -metadata: - name: foo - annotations: - app: nginx - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f1.yaml' -spec: - selector: - app: nginx ---- -apiVersion: v1 -kind: Abstraction -metadata: - name: foo - configFn: - container: - image: gcr.io/example/reconciler:v1 - annotations: - config.kubernetes.io/local-config: "true" - a: 'b' - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f2.yaml' - namespace: bar -spec: - replicas: 3 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: nginx - name: bar - annotations: - app: nginx - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f2.yaml' - namespace: foo -spec: - replicas: 3 -`, + name: "filter apiVersion", + args: []string{"--kv", "a=b", "--apiVersion", "v1"}, + expected: expectedFilterApiVersionV1, }, { - name: "filter name", - args: []string{"--kv", "a=b", "--name", "bar"}, - expected: `kind: Deployment -metadata: - labels: - app: nginx2 - name: foo - annotations: - app: nginx2 - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f1.yaml' -spec: - replicas: 1 ---- -kind: Service -metadata: - name: foo - annotations: - app: nginx - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f1.yaml' -spec: - selector: - app: nginx ---- -apiVersion: v1 -kind: Abstraction -metadata: - name: foo - configFn: - container: - image: gcr.io/example/reconciler:v1 - annotations: - config.kubernetes.io/local-config: "true" - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f2.yaml' - namespace: bar -spec: - replicas: 3 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: nginx - name: bar - annotations: - app: nginx - a: 'b' - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f2.yaml' - namespace: foo -spec: - replicas: 3 -`, + name: "filter name", + args: []string{"--kv", "a=b", "--name", "bar"}, + expected: expectedFilterNameBar, }, { - name: "filter namespace", - args: []string{"--kv", "a=b", "--namespace", "bar"}, - expected: `kind: Deployment -metadata: - labels: - app: nginx2 - name: foo - annotations: - app: nginx2 - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f1.yaml' -spec: - replicas: 1 ---- -kind: Service -metadata: - name: foo - annotations: - app: nginx - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f1.yaml' -spec: - selector: - app: nginx ---- -apiVersion: v1 -kind: Abstraction -metadata: - name: foo - configFn: - container: - image: gcr.io/example/reconciler:v1 - annotations: - config.kubernetes.io/local-config: "true" - a: 'b' - config.kubernetes.io/index: '0' - config.kubernetes.io/path: 'f2.yaml' - namespace: bar -spec: - replicas: 3 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: nginx - name: bar - annotations: - app: nginx - config.kubernetes.io/index: '1' - config.kubernetes.io/path: 'f2.yaml' - namespace: foo -spec: - replicas: 3 -`, + name: "filter namespace", + args: []string{"--kv", "a=b", "--namespace", "bar"}, + expected: expectedFilterNamespaceBar, }, } for i := range tests { tt := tests[i] t.Run(tt.name, func(t *testing.T) { - d := setTestFiles(t) + d := initTestDir(t) defer os.RemoveAll(d) a := NewAnnotateRunner("") @@ -398,20 +76,35 @@ spec: if !assert.NoError(t, err) { t.FailNow() } - - if !assert.Equal(t, strings.TrimSpace(tt.expected), strings.TrimSpace(actual.String())) { + if !assert.Equal(t, + strings.TrimSpace(tt.expected), + strings.TrimSpace(actual.String())) { t.FailNow() } }) } } -func setTestFiles(t *testing.T) string { - d, err := ioutil.TempDir("", "kustomize-cat-test") +func initTestDir(t *testing.T) string { + d, err := ioutil.TempDir("", "kustomize-annotate-test") if !assert.NoError(t, err) { t.FailNow() } - err = ioutil.WriteFile(filepath.Join(d, "f1.yaml"), []byte(` + err = ioutil.WriteFile(filepath.Join(d, "f1.yaml"), []byte(f1Input), 0600) + if !assert.NoError(t, err) { + defer os.RemoveAll(d) + t.FailNow() + } + err = ioutil.WriteFile(filepath.Join(d, "f2.yaml"), []byte(f2Input), 0600) + if !assert.NoError(t, err) { + defer os.RemoveAll(d) + t.FailNow() + } + return d +} + +var ( + f1Input = ` kind: Deployment metadata: labels: @@ -430,12 +123,9 @@ metadata: spec: selector: app: nginx -`), 0600) - if !assert.NoError(t, err) { - defer os.RemoveAll(d) - t.FailNow() - } - err = ioutil.WriteFile(filepath.Join(d, "f2.yaml"), []byte(` +` + + f2Input = ` apiVersion: v1 kind: Abstraction metadata: @@ -460,10 +150,339 @@ metadata: namespace: foo spec: replicas: 3 -`), 0600) - if !assert.NoError(t, err) { - defer os.RemoveAll(d) - t.FailNow() - } - return d -} +` + + expectedSingleValue = `kind: Deployment +metadata: + labels: + app: nginx2 + name: foo + annotations: + app: nginx2 + a: 'b' + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f1.yaml' +spec: + replicas: 1 +--- +kind: Service +metadata: + name: foo + annotations: + app: nginx + a: 'b' + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f1.yaml' +spec: + selector: + app: nginx +--- +apiVersion: v1 +kind: Abstraction +metadata: + name: foo + configFn: + container: + image: gcr.io/example/reconciler:v1 + annotations: + config.kubernetes.io/local-config: "true" + a: 'b' + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f2.yaml' + namespace: bar +spec: + replicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: nginx + name: bar + annotations: + app: nginx + a: 'b' + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f2.yaml' + namespace: foo +spec: + replicas: 3 +` + + expectedMultiValue = `kind: Deployment +metadata: + labels: + app: nginx2 + name: foo + annotations: + app: nginx2 + a: 'b' + c: 'd' + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f1.yaml' +spec: + replicas: 1 +--- +kind: Service +metadata: + name: foo + annotations: + app: nginx + a: 'b' + c: 'd' + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f1.yaml' +spec: + selector: + app: nginx +--- +apiVersion: v1 +kind: Abstraction +metadata: + name: foo + configFn: + container: + image: gcr.io/example/reconciler:v1 + annotations: + config.kubernetes.io/local-config: "true" + a: 'b' + c: 'd' + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f2.yaml' + namespace: bar +spec: + replicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: nginx + name: bar + annotations: + app: nginx + a: 'b' + c: 'd' + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f2.yaml' + namespace: foo +spec: + replicas: 3 +` + + expectedFilterKindService = `kind: Deployment +metadata: + labels: + app: nginx2 + name: foo + annotations: + app: nginx2 + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f1.yaml' +spec: + replicas: 1 +--- +kind: Service +metadata: + name: foo + annotations: + app: nginx + a: 'b' + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f1.yaml' +spec: + selector: + app: nginx +--- +apiVersion: v1 +kind: Abstraction +metadata: + name: foo + configFn: + container: + image: gcr.io/example/reconciler:v1 + annotations: + config.kubernetes.io/local-config: "true" + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f2.yaml' + namespace: bar +spec: + replicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: nginx + name: bar + annotations: + app: nginx + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f2.yaml' + namespace: foo +spec: + replicas: 3 +` + + expectedFilterApiVersionV1 = `kind: Deployment +metadata: + labels: + app: nginx2 + name: foo + annotations: + app: nginx2 + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f1.yaml' +spec: + replicas: 1 +--- +kind: Service +metadata: + name: foo + annotations: + app: nginx + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f1.yaml' +spec: + selector: + app: nginx +--- +apiVersion: v1 +kind: Abstraction +metadata: + name: foo + configFn: + container: + image: gcr.io/example/reconciler:v1 + annotations: + config.kubernetes.io/local-config: "true" + a: 'b' + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f2.yaml' + namespace: bar +spec: + replicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: nginx + name: bar + annotations: + app: nginx + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f2.yaml' + namespace: foo +spec: + replicas: 3 +` + + expectedFilterNameBar = `kind: Deployment +metadata: + labels: + app: nginx2 + name: foo + annotations: + app: nginx2 + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f1.yaml' +spec: + replicas: 1 +--- +kind: Service +metadata: + name: foo + annotations: + app: nginx + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f1.yaml' +spec: + selector: + app: nginx +--- +apiVersion: v1 +kind: Abstraction +metadata: + name: foo + configFn: + container: + image: gcr.io/example/reconciler:v1 + annotations: + config.kubernetes.io/local-config: "true" + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f2.yaml' + namespace: bar +spec: + replicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: nginx + name: bar + annotations: + app: nginx + a: 'b' + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f2.yaml' + namespace: foo +spec: + replicas: 3 +` + + expectedFilterNamespaceBar = `kind: Deployment +metadata: + labels: + app: nginx2 + name: foo + annotations: + app: nginx2 + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f1.yaml' +spec: + replicas: 1 +--- +kind: Service +metadata: + name: foo + annotations: + app: nginx + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f1.yaml' +spec: + selector: + app: nginx +--- +apiVersion: v1 +kind: Abstraction +metadata: + name: foo + configFn: + container: + image: gcr.io/example/reconciler:v1 + annotations: + config.kubernetes.io/local-config: "true" + a: 'b' + config.kubernetes.io/index: '0' + config.kubernetes.io/path: 'f2.yaml' + namespace: bar +spec: + replicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: nginx + name: bar + annotations: + app: nginx + config.kubernetes.io/index: '1' + config.kubernetes.io/path: 'f2.yaml' + namespace: foo +spec: + replicas: 3 +` +)