From e14d5664ea40c846939536c1d62deed5b5613d54 Mon Sep 17 00:00:00 2001 From: kemv Date: Wed, 13 Sep 2023 13:43:05 +0200 Subject: [PATCH 1/7] Added code with conditional bool for not setting selector spec Signed-off-by: kemv --- functions/go/set-labels/run.go | 13 ++++++++++++- .../go/set-labels/setlabels/transformer.go | 9 +++++++-- tests/set-labels/deployment/.krmignore | 1 + tests/set-labels/deployment/Kptfile | 10 ++++++++++ tests/set-labels/deployment/deployment.yaml | 18 ++++++++++++++++++ tests/set-labels/deployment/fn-config.yaml | 11 +++++++++++ 6 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 tests/set-labels/deployment/.krmignore create mode 100644 tests/set-labels/deployment/Kptfile create mode 100644 tests/set-labels/deployment/deployment.yaml create mode 100644 tests/set-labels/deployment/fn-config.yaml diff --git a/functions/go/set-labels/run.go b/functions/go/set-labels/run.go index 4af3636e5..ce339a05a 100644 --- a/functions/go/set-labels/run.go +++ b/functions/go/set-labels/run.go @@ -24,7 +24,18 @@ import ( ) func NewTransformer() fn.ResourceListProcessor { - return fn.WithContext(fn.Context{Context: context.Background()}, &setlabels.SetLabels{}) + // Create a new SetLabels struct + labels := make(map[string]string) + options := map[string]bool{ + "setSelectorLabels": true, + } + setLabels := &setlabels.SetLabels{ + Labels: labels, + Options: options, + } + + // Return the SetLabels struct as a fn.ResourceListProcessor + return fn.WithContext(fn.Context{Context: context.Background()}, setLabels) } func run() error { diff --git a/functions/go/set-labels/setlabels/transformer.go b/functions/go/set-labels/setlabels/transformer.go index 7915a8db2..93969c8a6 100644 --- a/functions/go/set-labels/setlabels/transformer.go +++ b/functions/go/set-labels/setlabels/transformer.go @@ -20,8 +20,9 @@ var _ fn.Runner = &SetLabels{} // SetLabels supports the set-labels workflow, it uses Config to parse functionConfig, Transform to change the labels type SetLabels struct { // labels is the desired labels - Labels map[string]string `json:"labels,omitempty"` - count int + Labels map[string]string `json:"labels,omitempty"` + Options map[string]bool `json:"options,omitempty"` + count int } // EmptyfnConfig is a workaround since kpt creates a FunctionConfig placeholder if users don't provide the functionConfig. @@ -161,6 +162,10 @@ func hasSpecSelector(o *fn.KubeObject) bool { // setLabelsInSelector set labels for all selectors, including spec selector map, spec selector LabelSelector, LabelSelector in JobTemplate, and podSelector in NetworkPolicy, and func (p *SetLabels) setLabelsInSelector(o *fn.KubeObject) error { + if !p.Options["setSelectorLabels"] { + return nil + } + if hasSpecSelector(o) { fieldPath := FieldPath{"spec", "selector"} if err := p.updateLabels(&o.SubObject, fieldPath, p.Labels, true); err != nil { diff --git a/tests/set-labels/deployment/.krmignore b/tests/set-labels/deployment/.krmignore new file mode 100644 index 000000000..9d7a4007d --- /dev/null +++ b/tests/set-labels/deployment/.krmignore @@ -0,0 +1 @@ +.expected diff --git a/tests/set-labels/deployment/Kptfile b/tests/set-labels/deployment/Kptfile new file mode 100644 index 000000000..cb09366cf --- /dev/null +++ b/tests/set-labels/deployment/Kptfile @@ -0,0 +1,10 @@ +apiVersion: kpt.dev/v1 +kind: Kptfile +metadata: + name: example + annotations: + config.kubernetes.io/local-config: "true" +pipeline: + mutators: + - image: gcr.io/kpt-fn/set-labels:unstable + configPath: fn-config.yaml diff --git a/tests/set-labels/deployment/deployment.yaml b/tests/set-labels/deployment/deployment.yaml new file mode 100644 index 000000000..5cf7754b6 --- /dev/null +++ b/tests/set-labels/deployment/deployment.yaml @@ -0,0 +1,18 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: the-deployment + labels: + app: the-deployment +spec: + selector: + matchLabels: + app: the-deployment + template: + metadata: + labels: + app: the-deployment + spec: + containers: + - name: the-container + image: the-image \ No newline at end of file diff --git a/tests/set-labels/deployment/fn-config.yaml b/tests/set-labels/deployment/fn-config.yaml new file mode 100644 index 000000000..ec41199be --- /dev/null +++ b/tests/set-labels/deployment/fn-config.yaml @@ -0,0 +1,11 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: SetLabels +metadata: + name: my-config + annotations: + config.kubernetes.io/local-config: "true" +labels: + color: orange + fruit: apple +options: + setSelectorLabels: false From a065f4ab29036e61ac51563edd3b9696ac1b35c7 Mon Sep 17 00:00:00 2001 From: kemv Date: Wed, 13 Sep 2023 13:49:49 +0200 Subject: [PATCH 2/7] Added expected newline Signed-off-by: kemv --- tests/set-labels/deployment/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/set-labels/deployment/deployment.yaml b/tests/set-labels/deployment/deployment.yaml index 5cf7754b6..e284621ad 100644 --- a/tests/set-labels/deployment/deployment.yaml +++ b/tests/set-labels/deployment/deployment.yaml @@ -15,4 +15,4 @@ spec: spec: containers: - name: the-container - image: the-image \ No newline at end of file + image: the-image From d12cb10128a91bd0a4b426003ad6713158a204d9 Mon Sep 17 00:00:00 2001 From: kemv Date: Wed, 13 Sep 2023 13:53:35 +0200 Subject: [PATCH 3/7] Added expected Signed-off-by: kemv --- .../deployment/.expected/diff.patch | 22 +++++++++++++++++++ .../deployment/.expected/results.yaml | 11 ++++++++++ 2 files changed, 33 insertions(+) create mode 100644 tests/set-labels/deployment/.expected/diff.patch create mode 100644 tests/set-labels/deployment/.expected/results.yaml diff --git a/tests/set-labels/deployment/.expected/diff.patch b/tests/set-labels/deployment/.expected/diff.patch new file mode 100644 index 000000000..06afcfddd --- /dev/null +++ b/tests/set-labels/deployment/.expected/diff.patch @@ -0,0 +1,22 @@ +diff --git a/deployment.yaml b/deployment.yaml +index e284621a..2e32cb8c 100644 +--- a/deployment.yaml ++++ b/deployment.yaml +@@ -4,6 +4,8 @@ metadata: + name: the-deployment + labels: + app: the-deployment ++ color: orange ++ fruit: apple + spec: + selector: + matchLabels: +@@ -12,6 +14,8 @@ spec: + metadata: + labels: + app: the-deployment ++ color: orange ++ fruit: apple + spec: + containers: + - name: the-container \ No newline at end of file diff --git a/tests/set-labels/deployment/.expected/results.yaml b/tests/set-labels/deployment/.expected/results.yaml new file mode 100644 index 000000000..a8d710917 --- /dev/null +++ b/tests/set-labels/deployment/.expected/results.yaml @@ -0,0 +1,11 @@ +apiVersion: kpt.dev/v1 +kind: FunctionResultList +metadata: + name: fnresults +exitCode: 0 +items: + - image: gcr.io/kpt-fn/set-labels:unstable + exitCode: 0 + results: + - message: set 4 labels in total + severity: info From faf204b34b8a506e9bbf70c628f19ce8c19af003 Mon Sep 17 00:00:00 2001 From: kemv Date: Wed, 13 Sep 2023 14:00:57 +0200 Subject: [PATCH 4/7] Updated documentation to include new option Signed-off-by: kemv --- functions/go/set-labels/README.md | 19 +++++++++++++++++++ functions/go/set-labels/generated/docs.go | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/functions/go/set-labels/README.md b/functions/go/set-labels/README.md index a0cda80c6..854d9f363 100644 --- a/functions/go/set-labels/README.md +++ b/functions/go/set-labels/README.md @@ -72,6 +72,25 @@ labels: fruit: apple ``` +The `set-labels` function adds the desired labels to more fields than just the one +found in `.metadata`. For example, the `Deployment` resource has a `spec.selector`, +which gets updated by the `set-labels` function by default. This is not always desired. + +To disable updating of `.spec.selectors`, define a `SetLabels` custom resource, and set +`.options.setSelectorLabels` to `false` like so: + +```yaml +apiVersion: fn.kpt.dev/v1alpha1 +kind: SetLabels +metadata: + name: my-config +labels: + color: orange + fruit: apple +options: + setSelectorLabels: false # default is true +``` + [labels]: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ diff --git a/functions/go/set-labels/generated/docs.go b/functions/go/set-labels/generated/docs.go index 70f7e92fc..fd6ed05d1 100644 --- a/functions/go/set-labels/generated/docs.go +++ b/functions/go/set-labels/generated/docs.go @@ -44,4 +44,21 @@ following ` + "`" + `functionConfig` + "`" + `: labels: color: orange fruit: apple + +The ` + "`" + `set-labels` + "`" + ` function adds the desired labels to more fields than just the one +found in ` + "`" + `.metadata` + "`" + `. For example, the ` + "`" + `Deployment` + "`" + ` resource has a ` + "`" + `spec.selector` + "`" + `, +which gets updated by the ` + "`" + `set-labels` + "`" + ` function by default. This is not always desired. + +To disable updating of ` + "`" + `.spec.selectors` + "`" + `, define a ` + "`" + `SetLabels` + "`" + ` custom resource, and set +` + "`" + `.options.setSelectorLabels` + "`" + ` to ` + "`" + `false` + "`" + ` like so: + + apiVersion: fn.kpt.dev/v1alpha1 + kind: SetLabels + metadata: + name: my-config + labels: + color: orange + fruit: apple + options: + setSelectorLabels: false # default is true ` From 814d232094a22d608a04e10a5edab8f24c76b3b2 Mon Sep 17 00:00:00 2001 From: kemv Date: Wed, 13 Sep 2023 14:06:48 +0200 Subject: [PATCH 5/7] Added some comments Signed-off-by: kemv --- functions/go/set-labels/setlabels/transformer.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/functions/go/set-labels/setlabels/transformer.go b/functions/go/set-labels/setlabels/transformer.go index 93969c8a6..29436cceb 100644 --- a/functions/go/set-labels/setlabels/transformer.go +++ b/functions/go/set-labels/setlabels/transformer.go @@ -21,7 +21,10 @@ var _ fn.Runner = &SetLabels{} type SetLabels struct { // labels is the desired labels Labels map[string]string `json:"labels,omitempty"` + + // options is the configurable and optional options Options map[string]bool `json:"options,omitempty"` + count int } @@ -162,6 +165,7 @@ func hasSpecSelector(o *fn.KubeObject) bool { // setLabelsInSelector set labels for all selectors, including spec selector map, spec selector LabelSelector, LabelSelector in JobTemplate, and podSelector in NetworkPolicy, and func (p *SetLabels) setLabelsInSelector(o *fn.KubeObject) error { + // setSelectorLabels is true by default if !p.Options["setSelectorLabels"] { return nil } From 05bd7f3335e73c51f97976780010767fc6bd97a3 Mon Sep 17 00:00:00 2001 From: kemv Date: Wed, 13 Sep 2023 14:37:22 +0200 Subject: [PATCH 6/7] Fix expected diff Signed-off-by: kemv --- tests/set-labels/deployment/.expected/diff.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/set-labels/deployment/.expected/diff.patch b/tests/set-labels/deployment/.expected/diff.patch index 06afcfddd..24ce06098 100644 --- a/tests/set-labels/deployment/.expected/diff.patch +++ b/tests/set-labels/deployment/.expected/diff.patch @@ -1,5 +1,5 @@ diff --git a/deployment.yaml b/deployment.yaml -index e284621a..2e32cb8c 100644 +index e284621..2e32cb8 100644 --- a/deployment.yaml +++ b/deployment.yaml @@ -4,6 +4,8 @@ metadata: From 46abe31ce136a9662e4124e29dffa1b54e07ce0e Mon Sep 17 00:00:00 2001 From: kemv Date: Wed, 13 Sep 2023 15:47:41 +0200 Subject: [PATCH 7/7] Expanded tests to include more use-cases Signed-off-by: kemv --- .../deployment/.expected/diff.patch | 62 ++++++++++++++++++- .../deployment/.expected/results.yaml | 10 +++ tests/set-labels/deployment/Kptfile | 12 +++- tests/set-labels/deployment/deployment.yaml | 40 +++++++++++- ...l => fn-config-selector-labels-false.yaml} | 0 .../fn-config-selector-labels-true.yaml | 11 ++++ .../fn-config-selector-labels-undefined.yaml | 9 +++ 7 files changed, 139 insertions(+), 5 deletions(-) rename tests/set-labels/deployment/{fn-config.yaml => fn-config-selector-labels-false.yaml} (100%) create mode 100644 tests/set-labels/deployment/fn-config-selector-labels-true.yaml create mode 100644 tests/set-labels/deployment/fn-config-selector-labels-undefined.yaml diff --git a/tests/set-labels/deployment/.expected/diff.patch b/tests/set-labels/deployment/.expected/diff.patch index 24ce06098..714c8fb0b 100644 --- a/tests/set-labels/deployment/.expected/diff.patch +++ b/tests/set-labels/deployment/.expected/diff.patch @@ -1,9 +1,20 @@ +diff --git a/Kptfile b/Kptfile +index ad493d3..917ae02 100644 +--- a/Kptfile ++++ b/Kptfile +@@ -17,4 +17,4 @@ pipeline: + - image: gcr.io/kpt-fn/set-labels:unstable + configPath: fn-config-selector-labels-undefined.yaml + selectors: +- - name: the-deployment-selector-labels-undefined +\ No newline at end of file ++ - name: the-deployment-selector-labels-undefined diff --git a/deployment.yaml b/deployment.yaml -index e284621..2e32cb8 100644 +index 11be507..b03ae0a 100644 --- a/deployment.yaml +++ b/deployment.yaml @@ -4,6 +4,8 @@ metadata: - name: the-deployment + name: the-deployment-selector-labels-false labels: app: the-deployment + color: orange @@ -19,4 +30,49 @@ index e284621..2e32cb8 100644 + fruit: apple spec: containers: - - name: the-container \ No newline at end of file + - name: the-container +@@ -23,14 +27,20 @@ metadata: + name: the-deployment-selector-labels-true + labels: + app: the-deployment ++ color: orange ++ fruit: apple + spec: + selector: + matchLabels: + app: the-deployment ++ color: orange ++ fruit: apple + template: + metadata: + labels: + app: the-deployment ++ color: orange ++ fruit: apple + spec: + containers: + - name: the-container +@@ -42,15 +52,21 @@ metadata: + name: the-deployment-selector-labels-undefined + labels: + app: the-deployment ++ color: orange ++ fruit: apple + spec: + selector: + matchLabels: + app: the-deployment ++ color: orange ++ fruit: apple + template: + metadata: + labels: + app: the-deployment ++ color: orange ++ fruit: apple + spec: + containers: + - name: the-container +- image: the-image +\ No newline at end of file ++ image: the-image diff --git a/tests/set-labels/deployment/.expected/results.yaml b/tests/set-labels/deployment/.expected/results.yaml index a8d710917..a67954fc9 100644 --- a/tests/set-labels/deployment/.expected/results.yaml +++ b/tests/set-labels/deployment/.expected/results.yaml @@ -9,3 +9,13 @@ items: results: - message: set 4 labels in total severity: info + - image: gcr.io/kpt-fn/set-labels:unstable + exitCode: 0 + results: + - message: set 6 labels in total + severity: info + - image: gcr.io/kpt-fn/set-labels:unstable + exitCode: 0 + results: + - message: set 6 labels in total + severity: info diff --git a/tests/set-labels/deployment/Kptfile b/tests/set-labels/deployment/Kptfile index cb09366cf..917ae025f 100644 --- a/tests/set-labels/deployment/Kptfile +++ b/tests/set-labels/deployment/Kptfile @@ -7,4 +7,14 @@ metadata: pipeline: mutators: - image: gcr.io/kpt-fn/set-labels:unstable - configPath: fn-config.yaml + configPath: fn-config-selector-labels-false.yaml + selectors: + - name: the-deployment-selector-labels-false + - image: gcr.io/kpt-fn/set-labels:unstable + configPath: fn-config-selector-labels-true.yaml + selectors: + - name: the-deployment-selector-labels-true + - image: gcr.io/kpt-fn/set-labels:unstable + configPath: fn-config-selector-labels-undefined.yaml + selectors: + - name: the-deployment-selector-labels-undefined diff --git a/tests/set-labels/deployment/deployment.yaml b/tests/set-labels/deployment/deployment.yaml index e284621ad..11be507b5 100644 --- a/tests/set-labels/deployment/deployment.yaml +++ b/tests/set-labels/deployment/deployment.yaml @@ -1,7 +1,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: the-deployment + name: the-deployment-selector-labels-false labels: app: the-deployment spec: @@ -16,3 +16,41 @@ spec: containers: - name: the-container image: the-image +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: the-deployment-selector-labels-true + labels: + app: the-deployment +spec: + selector: + matchLabels: + app: the-deployment + template: + metadata: + labels: + app: the-deployment + spec: + containers: + - name: the-container + image: the-image +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: the-deployment-selector-labels-undefined + labels: + app: the-deployment +spec: + selector: + matchLabels: + app: the-deployment + template: + metadata: + labels: + app: the-deployment + spec: + containers: + - name: the-container + image: the-image \ No newline at end of file diff --git a/tests/set-labels/deployment/fn-config.yaml b/tests/set-labels/deployment/fn-config-selector-labels-false.yaml similarity index 100% rename from tests/set-labels/deployment/fn-config.yaml rename to tests/set-labels/deployment/fn-config-selector-labels-false.yaml diff --git a/tests/set-labels/deployment/fn-config-selector-labels-true.yaml b/tests/set-labels/deployment/fn-config-selector-labels-true.yaml new file mode 100644 index 000000000..78f5dd4f4 --- /dev/null +++ b/tests/set-labels/deployment/fn-config-selector-labels-true.yaml @@ -0,0 +1,11 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: SetLabels +metadata: + name: my-config + annotations: + config.kubernetes.io/local-config: "true" +labels: + color: orange + fruit: apple +options: + setSelectorLabels: true diff --git a/tests/set-labels/deployment/fn-config-selector-labels-undefined.yaml b/tests/set-labels/deployment/fn-config-selector-labels-undefined.yaml new file mode 100644 index 000000000..bb7dd7a79 --- /dev/null +++ b/tests/set-labels/deployment/fn-config-selector-labels-undefined.yaml @@ -0,0 +1,9 @@ +apiVersion: fn.kpt.dev/v1alpha1 +kind: SetLabels +metadata: + name: my-config + annotations: + config.kubernetes.io/local-config: "true" +labels: + color: orange + fruit: apple