diff --git a/api/filters/replacement/replacement.go b/api/filters/replacement/replacement.go index 39d047744..11542df14 100644 --- a/api/filters/replacement/replacement.go +++ b/api/filters/replacement/replacement.go @@ -43,8 +43,8 @@ func applyReplacement(nodes []*yaml.RNode, value *yaml.RNode, targets []*types.T t.FieldPaths = []string{types.DefaultReplacementFieldPath} } for _, n := range nodes { - // TODO (#3492): Don't include matches listed in the `reject` field - if t.Select.KrmId.Match(getKrmId(n)) { + nodeId := getKrmId(n) + if t.Select.KrmId.Match(nodeId) && !rejectId(t.Reject, nodeId) { err := applyToNode(n, value, t) if err != nil { return nil, err @@ -55,6 +55,15 @@ func applyReplacement(nodes []*yaml.RNode, value *yaml.RNode, targets []*types.T return nodes, nil } +func rejectId(rejects []*types.Selector, nodeId *types.KrmId) bool { + for _, r := range rejects { + if r.KrmId.Match(nodeId) { + return true + } + } + return false +} + func applyToNode(node *yaml.RNode, value *yaml.RNode, target *types.TargetSelector) error { for _, fp := range target.FieldPaths { t, err := node.Pipe(yaml.Lookup(strings.Split(fp, ".")...)) diff --git a/api/filters/replacement/replacement_test.go b/api/filters/replacement/replacement_test.go index a9aaaa735..dcb004b72 100644 --- a/api/filters/replacement/replacement_test.go +++ b/api/filters/replacement/replacement_test.go @@ -23,33 +23,7 @@ func TestFilter(t *testing.T) { input: `apiVersion: v1 kind: Deployment metadata: - name: deploy1 -spec: - template: - spec: - containers: - - image: nginx:1.7.9 - name: nginx-tagged - - image: postgres:1.8.0 - name: postgresdb ---- -apiVersion: v1 -kind: Deployment -metadata: - name: deploy2 -spec: - template: - spec: - containers: - - image: nginx:1.7.9 - name: nginx-tagged - - image: postgres:1.8.0 - name: postgresdb ---- -apiVersion: v1 -kind: Deployment -metadata: - name: deploy3 + name: deploy spec: template: spec: @@ -62,19 +36,19 @@ spec: replacements: `replacements: - source: kind: Deployment - name: deploy2 + name: deploy fieldPath: spec.template.spec.containers.0.image targets: - select: kind: Deployment - name: deploy1 + name: deploy fieldPaths: - spec.template.spec.containers.1.image `, expected: `apiVersion: v1 kind: Deployment metadata: - name: deploy1 + name: deploy spec: template: spec: @@ -83,32 +57,6 @@ spec: name: nginx-tagged - image: nginx:1.7.9 name: postgresdb ---- -apiVersion: v1 -kind: Deployment -metadata: - name: deploy2 -spec: - template: - spec: - containers: - - image: nginx:1.7.9 - name: nginx-tagged - - image: postgres:1.8.0 - name: postgresdb ---- -apiVersion: v1 -kind: Deployment -metadata: - name: deploy3 -spec: - template: - spec: - containers: - - image: nginx:1.7.9 - name: nginx-tagged - - image: postgres:1.8.0 - name: postgresdb `, }, "complex type": { @@ -581,6 +529,236 @@ spec: name: nginx-tagged - image: nginx:1.7.9 name: postgresdb +`, + }, + "reject 1": { + input: `apiVersion: v1 +kind: Deployment +metadata: + name: deploy1 +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +--- +apiVersion: v1 +kind: Deployment +metadata: + name: deploy2 +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +--- +apiVersion: v1 +kind: Deployment +metadata: + name: deploy3 +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +`, + replacements: `replacements: +- source: + kind: Deployment + name: deploy2 + fieldPath: spec.template.spec.containers.0.image + targets: + - select: + kind: Deployment + reject: + - name: deploy2 + - name: deploy3 + fieldPaths: + - spec.template.spec.containers.1.image +`, + expected: `apiVersion: v1 +kind: Deployment +metadata: + name: deploy1 +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: nginx:1.7.9 + name: postgresdb +--- +apiVersion: v1 +kind: Deployment +metadata: + name: deploy2 +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +--- +apiVersion: v1 +kind: Deployment +metadata: + name: deploy3 +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +`, + }, + "reject 2": { + input: `apiVersion: v1 +kind: Deployment +metadata: + name: my-name +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +--- +apiVersion: v1 +kind: StatefulSet +metadata: + name: my-name +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +`, + replacements: `replacements: +- source: + kind: Deployment + fieldPath: spec.template.spec.containers.0.image + targets: + - select: + version: v1 + reject: + - kind: Deployment + name: my-name + fieldPaths: + - spec.template.spec.containers.1.image +`, + expected: `apiVersion: v1 +kind: Deployment +metadata: + name: my-name +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +--- +apiVersion: v1 +kind: StatefulSet +metadata: + name: my-name +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: nginx:1.7.9 + name: postgresdb +`, + }, + // the only difference in the inputs between this and the previous test + // is the dash before `name: my-name` on line 733 + "reject 3": { + input: `apiVersion: v1 +kind: Deployment +metadata: + name: my-name +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +--- +apiVersion: v1 +kind: StatefulSet +metadata: + name: my-name +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +`, + replacements: `replacements: +- source: + kind: Deployment + fieldPath: spec.template.spec.containers.0.image + targets: + - select: + version: v1 + reject: + - kind: Deployment + - name: my-name + fieldPaths: + - spec.template.spec.containers.1.image +`, + expected: `apiVersion: v1 +kind: Deployment +metadata: + name: my-name +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb +--- +apiVersion: v1 +kind: StatefulSet +metadata: + name: my-name +spec: + template: + spec: + containers: + - image: nginx:1.7.9 + name: nginx-tagged + - image: postgres:1.8.0 + name: postgresdb `, }, } diff --git a/api/types/replacement.go b/api/types/replacement.go index 9af145512..ae7c7c31e 100644 --- a/api/types/replacement.go +++ b/api/types/replacement.go @@ -33,9 +33,7 @@ type TargetSelector struct { Select *Selector `json:"select" yaml:"select"` // From the allowed set, remove objects that match this. - // TODO (#3492): Remove matches listed in the `reject` field - // Currently this field is unused - Reject *Selector `json:"reject" yaml:"reject"` + Reject []*Selector `json:"reject" yaml:"reject"` // Structured field paths expected in each allowed object. FieldPaths []string `json:"fieldPaths" yaml:"fieldPaths"`