Sheshananda Naidu
Sheshananda Naidu

Reputation: 1025

Kubernetes Helm chart requirements.yaml file dependencies false condition

I am using the Kubernetes Helm requirements.yaml file for dependencies addition. Based on the values.yaml condition, it will create the dependencies pods.

Here I want to execute required dependencies when apache.enabled == false

values.yaml

external_apache:
  enabled: false

File requirements.yaml

dependencies:
- name:
  version:
  repository:
  condition: external_apache.enabled

How do I add a false condition?

I have tried the below condition, but it's not working:

condition: external_apache.enabled == false

Upvotes: 5

Views: 14228

Answers (4)

VAS
VAS

Reputation: 9041

What version of Helm are you using?

There was a similar issue in the Kubernetes repository on GitHub:

Unable to use condition in 'requirements.yaml' #2111

The solution was to upgrade Helm to v2.2.0+. In that version, condition support was added.

Helm 2 to Helm 3 upgrade note:

Chart apiVersion bumped to "v2" for following specification changes:

  • Dynamically linked chart dependencies moved to Chart.yaml (requirements.yaml removed and requirements --> dependencies)
  • Library charts (helper/common charts) can now be added as dynamically linked chart dependencies
  • Charts have a type metadata field to define the chart to be of an application or library chart. It is application by default which means it is renderable and installable
  • Helm 2 charts (apiVersion=v1) are still installable

In the Helm documentation or repository, there is an explanation of how the condition works: (I've added some comments to make reading easier)

Condition - The condition field holds one or more YAML paths (delimited by commas).
Tags - The tags field is a YAML list of labels to associate with this chart.

# parentchart/requirements.yaml
dependencies:
      - name: subchart1
        repository: http://localhost:10191
        version: 0.1.0
        condition: subchart1.enabled, global.subchart1.enabled
        tags:
          - front-end        #(chart should be disabled because the tags.front-end is “false” in values.yaml file , but ...)
          - subchart1        #(subchart1.enabled condition path is present in values.yaml file and it has "true" value...)
                             #(this condition, so it overrides tag front-end and this chart will be enabled)

      - name: subchart2
        repository: http://localhost:10191
        version: 0.1.0
        condition: subchart2.enabled,global.subchart2.enabled
                  #(as soon as no one from these paths is exists in values.yaml this condition has ho effect)

        tags:
          - back-end        #(chart should be enabled because the tags.back-end is “true” in values.yaml file)
          - subchart2       #(and there is no condition path found in values.yaml to override it)

If this condition path exists in the top parent’s values and resolves to a boolean value, the chart will be enabled or disabled based on that boolean value. Only the first valid path found in the list is evaluated and if no paths exist then the condition has no effect.

In the top parent’s values, all charts with tags can be enabled or disabled by specifying the tag and a boolean value.

# parentchart/values.yaml

subchart1:
  enabled: true          #(this could be found from requirements as subchart1.enabled and override tags in this case)
tags:
  front-end: false      #(this disables charts with tag front-end)
  back-end: true        #(this enables charts with tag back-end)

The logic and sequence of conditions and tags are described in Tags and Condition Resolution:

  • Conditions (when set in values) always override tags. The first condition path that exists wins and subsequent ones for that chart are ignored.
  • Tags are evaluated as ‘if any of the chart’s tags are true then enable the chart’.
  • Tags and conditions values must be set in the top parent’s values.
  • The tags: key in values must be a top level key. Globals and nested tags: tables are not currently supported.

You can also set tags and conditions in the command line:

helm install --set tags.front-end=true --set subchart2.enabled=false

Upvotes: 5

Ashish
Ashish

Reputation: 1917

Though its a bit late, but users may find it helpful. I am not running helm install for the parent chart from command line, but, I have a shell script for running it and another shell script for environment properties.

I have set the conditional boolean values to true or false in environment script and using the values in other script which runs helm for parent helm chart, I have set individual child chart enabled property in parent's values.yaml.

Also, in version 3.0.0+, the configuration done earlier in requirements.yaml are now done in parent's chart.yaml itself.

Upvotes: 0

zzxwill
zzxwill

Reputation: 536

Helm version v2.2.2 worked, while v2.10.0 didn't.

Upvotes: 2

Philippe
Philippe

Reputation: 6828

Based on the documentation and the answer from @VAS, the answer to your question is it's not possible to use a negation of a condition in requirements.yaml.

Upvotes: 1

Related Questions