Can we create a setter contains list of object using kpt?

193 views Asked by At

I've noticed that we can crate a setter contains list of string based on kpt [documentation][1]. Then I found out that complex setter contains list of object is not supported based on [this github issue][1]. Since the issue itself mentioned that this should be supported in kpt function can we use it with the current kpt function version?

[1]: Kpt Apply Setters. https://catalog.kpt.dev/apply-setters/v0.1/

[1]: Setters for list of objects. https://github.com/GoogleContainerTools/kpt/issues/1533

1

There are 1 answers

0
irvifa On BEST ANSWER

I've discussed a bit with my coworkers, and turned out this is possible by doing the following setup:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 4 # kpt-set: ${nginx-replicas}
  selector:
  matchLabels:
    app: nginx
template:
  metadata:
    labels:
      app: nginx
  spec:
    containers:
    - name: nginx
      image: "nginx:1.16.1" # kpt-set: nginx:${tag}
      ports:
        - protocol: TCP
          containerPort: 80
---
apiVersion: v1
kind: MyKind
metadata:
  name: foo
environments: # kpt-set: ${env}
- dev
- stage
---
apiVersion: v1
kind: MyKind
metadata:
  name: bar
environments: # kpt-set: ${nested-env}
- key: some-key
  value: some-value

After that we can define the following setters:

apiVersion: v1
kind: ConfigMap
metadata:
  name: setters
data:
  env: |-
    - prod
    - dev
  nested-env: |-
    - key: some-other-key
      value: some-other-value
  nginx-replicas: "3"
  tag: 1.16.2

And then we can call the following command:

$ kpt fn render apply-setters-simple

I've send a Pull Request to the repository to add documentation about this.