van_folmert
van_folmert

Reputation: 4507

Helm upgrade fails with error: expects " or n, but found t

I'm trying to add a new pod to my helm chart, it passes validation (helm lint) but fails at last stage of deployment:

Mon Dec 16 10:01:58 2019 INFO Running helm install/upgrade for xyz-stg
UPGRADE FAILED Error: "" is invalid: patch: Invalid value: "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\"
(...)
ReadString: expects " or n, but found t, error found in #10 byte of ...|,"value":true},{"nam|..., bigger context ...|"value":"stg"}, (...)
Error: UPGRADE FAILED: "" is invalid: patch: Invalid value: "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\": (...)
ReadString: expects " or n, but found t, error found in #10 byte of ...|,"value":true},{"nam|..., bigger context ...|"value":"stg"}, (...) Mon Dec 16 10:02:09 2019 ERROR Upgrade/Installation of xyz-stg failed

I have no idea what this error means or how to even debug it. It sounds like some syntax indentation error, but all I did was: copy-pasted the pod configuration from other working pod and changed all names.

Upvotes: 36

Views: 41010

Answers (4)

Suresh Ganesan
Suresh Ganesan

Reputation: 82

Helm lint - Will not capture this error. For env values / Boolean check - It is recommended to use quote. Below is an example, Assuming zookeeperConnectionTimeout has an entry in values.yml

value: {
    {
        .Values.zookeeperConnectionTimeout | quote
    }
}

To Check: You can use helm template to see the actual substituted values before applying install.

Actual substituted value will be something like below:

value: "180000"

Upvotes: 2

vikas ray
vikas ray

Reputation: 191

Add double quotes and update the deployment.yaml with following changes

In deployment.yaml file

        value: {{ .Values.environment.TEMP }}
        value: {{ quote .Values.environment.TEMP }}

In Values.yaml file

Envrionment:
  TEMP: "true"

Upvotes: 12

Karson
Karson

Reputation: 459

I ran into this adding an annotation from PowerShell. Tried several things before discovering <double><single><value><single><double>

helm upgrade userprofile $helmfile.ToString() --install --wait --timeout 90s
--set ingress.annotations."nginx.ingress.kubernetes.io/auth-tls-verify-depth"="'1'"
--set ingress.annotations."nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream"="'false'"

In Azure DevOps HelmDeploy@0 task arguments I needed <double><single><single><value><single><single><double>.

  - task: HelmDeploy@0
    displayName: 'Install UserProfile'
    inputs:
      ...
      command: upgrade
      arguments: '
        ...
        --set ingress.annotations."nginx\.ingress\.kubernetes\.io/auth-tls-verify-depth"="''1''"
        --set ingress.annotations."nginx\.ingress\.kubernetes\.io/auth-tls-pass-certificate-to-upstream"="''false''"'

Upvotes: 1

Mohammad Faraz
Mohammad Faraz

Reputation: 574

I ran into a similar problem and apparently it turns out Kubernetes's Pod specification requires environment variable values to be coerced as strings, so integers need to be passed through quote.So, in your deployment.yaml file wherever you are using the numeric values try to pass them as below.

value: {{ .Values.environment.TEMP | quote}}

It will work just fine after that. Hope it helps

Upvotes: 51

Related Questions