-
Notifications
You must be signed in to change notification settings - Fork 237
Description
I want to be able to use a function in a pipeline to perform processing of values AFTER they have been set by a parent package's apply-setters.
The following cluster package works intuitively as a single package, but it doesn't work when it it's inside a parent package that also uses apply-setters, because the parent package mutators are executed after the child package's mutators...
Parent setters:
apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: cluster
pipeline:
mutators:
- image: gcr.io/kpt-fn/apply-setters:v0.1
configPath: setters.yaml
Child setters:
apiVersion: kpt.dev/v1
kind: Kptfile
metadata:
name: nodepool
pipeline:
mutators:
- image: gcr.io/kpt-fn/apply-setters:v0.1
configPath: setters.yaml
- image: gcr.io/kpt-fn/starlark:v0.1
configPath: truncate-service-accounts.yaml
The workaround I know of is to copy the function to the parent package kptfile, but if I do that, it will affect all resources in the parent package, not just the resources in the child package. And even if I could scope it to the right package, it would be a hassle to have to copy function config from child packages to parent packages.
One way to solve this might be to have early and late mutators.
Order of execution:
- parent "early mutators"
- child "early mutators"
- child "late mutators"
- parent "late mutators"
This would kill two birds with one stone, because it would also allow for parent packages to modify the setter values of child packages. I could put apply-setters as an "early mutator" and the starlark function in a "late mutator" and it would affect the setter values as passed from parent to child without affecting the parent or sibling packages.
For example...
Parent setters:
apiVersion: v1
kind: ConfigMap
metadata:
name: setters
annotations:
config.kubernetes.io/local-config: "true"
data:
name: cluster-1
project-id: example-1234
Child setters:
apiVersion: v1
kind: ConfigMap
metadata:
name: setters
annotations:
config.kubernetes.io/local-config: "true"
data:
name: pool-1
cluster-name: cluster-1 # kpt-set: ${name}
project-id: example-1234 # kpt-set: ${project-id}
Child resource:
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMServiceAccount
metadata:
name: gke-cluster-1-pool-1 # kpt-set: gke-${cluster-name}-${name}
Service account names are frequently too long when concatenating other names together. With this configuration the starlark function could truncate it after the setters have been applied. And with this pattern, the name
setter means "node pool name" in the child package and "cluster name" in the parent package, allowing for hierarchical setter namespacing.