Helm Install/Upgrade set value on CLI in every element in array or by value

Viewed 61

I have a vendor Chart I am working with that boils down to this:

vendor:
  tier:
    - name: tier1
      valueToSet: TBD

    - name: tier2
      valueToSet: TBD

    - name: tier3
      valueToSet: TBD
      customValueOnlyInThisTier: TBD

    - name: tierN
      valueToSet: TBD

The data for valueToSet and customValueOnlyInThisTier needs to be pull dynamically every time we run an install/upgrade due to vendor limitations. What I would like to do is avoid having to edit the file itself every time we run an upgrade (it is rather gigantic).

  1. Is there a means to add the value to every element in the array using --set parameter to the upgrade call?
  2. Is there a way to use a selector for the array to set customValueOnlyInThisTier using a syntax like --set vendor.tier[?name="tier3"].customValueOnlyInThisTier=TESTING?

Temporary Workaround

I figured I can do something like this:

# something here that generates PREPEND.yaml
mv values.yaml values.yaml.bak
cat PREPEND.yaml values.yaml.bak > values.yaml

In the generated PREPEND.yaml file I can add something like:

Reference1: &SomeTag1 VALUE_HERE
Reference2: &SomeTag2 VALUE_HERE

Then I can reference that data in the values.yaml this way:

vendor:
  tier:
    - name: tier1
      valueToSet: *SomeTag1

It's hacky, but it works.

1 Answers

values.yaml

vendor:
  tier:
    - name: tier1
      valueToSet: TBD
    - name: tier2
      valueToSet: TBD
    - name: tier3
      valueToSet: TBD
      customValueOnlyInThisTier: TBD
    - name: tierN
      valueToSet: TBD

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: test
data: 
  config.yaml: |
    {{- toYaml $.Values.vendor | nindent 4 }}
  1. cmd :
helm template --debug test . \
    --set 'vendor.tier[0].name=tier1' \
    --set 'vendor.tier[0].valueToSet=TBD' \
    --set 'vendor.tier[1].name=tier2' \
    --set 'vendor.tier[1].valueToSet=TBD' \
    --set 'vendor.tier[2].name=tier3' \
    --set 'vendor.tier[2].valueToSet=TBD' \
    --set 'vendor.tier[2].customValueOnlyInThisTier=TESTING' \
    --set 'vendor.tier[3].name=tier4' \
    --set 'vendor.tier[3].valueToSet=TBD' 
  1. cmd :
helm template --debug test . \
    --set 'vendor.tier[0]={name:tier1,valueToSet:TBD}' \
    --set 'vendor.tier[1]={name:tier2,valueToSet:TBD}' \
    --set 'vendor.tier[2]={name:tier3,valueToSet:TBD,customValueOnlyInThisTier:TESTING}' \
    --set 'vendor.tier[3]={name:tier4,valueToSet:TBD}' 

output

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: test
data: 
  config.yaml: |
    tier:
      - name:tier1
        valueToSet:TBD
      - name:tier2
        valueToSet:TBD
      - name:tier3
        valueToSet:TBD
        customValueOnlyInThisTier:TESTING
      - name:tier4
        valueToSet:TBD
Related