'if condition with AND operator and greater than condition in helm

I am trying to make a default value for CPU if its mentioned(if its not mentioned, i have handled that separately) value in values file is less than 5000m. I am trying this but I don't think I am doing it correctly. Also, if I make the default value as 5000m and in my values file its mentioned just as 5. Would it be able to compare both?

resources:
          requests:
         {{- if .Values.resources.requests.cpu }}
            cpu: {{ .Values.resources.requests.cpu }}
         {{- end }}
         {{- if .Values.resources.requests.memory }}
            memory: {{ .Values.resources.requests.memory }}
         {{- end }}
          limits:
         {{- if ((( .Values.resources).limits).cpu) }}
            cpu: {{ .Values.resources.limits.cpu }}
         {{- else }}
           {{- $limit_value := .Values.resources.requests.cpu | toString | regexFind "[0-9.]+" }}
           {{- $limit_suffix := .Values.resources.requests.cpu | toString | regexFind "[^0-9.]+" }}
           cpu: {{ mulf $limit_value 3 }}{{ $limit_suffix }} }} 
         {{- end }}
          {{- if (((.Values.resources).limits).memory) }}
            memory: {{ .Values.resources.limits.memory }}
         {{- else }}
            {{- $limit_val := .Values.resources.requests.memory | toString | regexFind "[0-9.]+" }}
            {{- $limit_suff := .Values.resources.requests.memory | toString | regexFind "[^0-9.]+" }}
            memory: {{ mulf $limit_val 3 }}{{ $limit_suff }}
         {{- end }}
         {{- end }}


Solution 1:[1]

You have two separate issues here. There's not a built-in way to parse the Kubernetes resource values, so you'll have to do a lot of work to actually provide that default value.

If you just want to provide a default value and not try to check for a minimum, then you can just use the Helm (Sprig) default function:

resources:
  requests:
    cpu: {{ .Values.resources.requests.cpu | default "5000m" }}

The minimum bound is what leads to some trouble. I don't believe there's a function in Helm to parse 5000m, or to compare that to 5.0. You could try writing it in Helm template syntax, but it can become awkward.

{{/* Convert a resource quantity like "5000m" to a base number like "5".
     Call with the quantity string as the parameter, returns the number
     as a string. */}}
{{- define "resource-quantity" -}}
{{- if . | hasSuffix "m" -}}
{{- $quantity = . | trimSuffix "m" | float64 -}}
{{- divf $quantity 10000000 -}}
{{- else -}}
{{ . }}
{{- end -}}
{{- end -}}

Note that there are many suffixes besides m and you might want to handle those too, maybe using a dictionary structure. I'm using the Sprig floating-point math functions which should be included in Helm. This template is actual code and you also want to arrange things like tests for it, which Helm does not support well.

Once you have that, gt (greater-than) is a function that takes two parameters. You want to test both "is it present" and also "is it at least this minimum", so you'd have to repeat the value. For a long value like this one thing that can help is to use the standard template with operator, which both acts like an if instruction and also temporarily rebinds the . variable to the value you're testing.

So you could write something like

{{- with .Values.resources.requests.cpu -}}
{{- $quantity := include "resource-quantity" . | float64 }}
{{- if and . (gt $quantity 5.0) }}
    cpu: {{ . }}
{{- else }}{{/* if */}}
    cpu: 5000m
{{- end }}{{/* if */}}
{{- else }}{{/* with */}}
    cpu: 5000m
{{- end }}{{/* with */}}

But with already tests if the value is non-empty, and you can use the maxf function to enforce a minimum value. So (given a complete working tested resource-quantity template function) you could write:

resources:
  requests:
{{- with .Values.resources.requests.cpu }}
    cpu: {{ include "resource-quantity" . | float64 | maxf 5.0 }}
{{- else }}
    cpu: 5.0
{{- end }}

Solution 2:[2]

This is how I managed to compare. Below is the example of one of the unit m

{{- if eq $limit_suffix "m" }}
        
        cpu: {{ mulf $limit_value 3 | max 5000 }}{{$limit_suffix}}
       {{- else }}
        cpu: {{ mulf $limit_value 3 | max 5 }}
     {{- end }}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 David Maze
Solution 2 Andronicus