Helm deployment status if tests failed

3/1/2019

Is it possible to make Helm charts deployment to fail if test which is run before installation fails? Because now despite the test fails, status is 'Deployed'.

My test, which checks if MongoDB is deployed and is reachable:

apiVersion: v1
kind: Pod
metadata:
  name: "{{ .Release.Name }}-database-connection-test"
  annotations:
    "helm.sh/hook": pre-install,test-success
    "helm.sh/hook-delete-policy": before-hook-creation
spec:
  containers:
  - name: {{ .Release.Name }}-database-connection-test
    image: {{ template "mongo.image" . }}
    imagePullPolicy: Always
    env:
      - name: HOST
        value: {{ .Values.mongo.host }}
      - name: PORT
        value: {{ .Values.mongo.port | quote }}
      - name: DATABASE_NAME
        value: {{ .Values.mongo.databasename }}
      - name: USERNAME
        value: {{ .Values.mongo.username }}
      - name: PASSWORD
        value: {{ .Values.mongo.password }}
    command: ["sh", "-c", "mongo --username $USERNAME --password $PASSWORD --authenticationDatabase $DATABASE_NAME --host $HOST --port $PORT"]
  restartPolicy: Never
-- Remigijus Kutkaitis
kubernetes
kubernetes-helm
testing

1 Answer

3/4/2019

So in general this can be achieved setting resource type as Job. Job will be blocking Tiller until it will complete.
There is a small issue here: if job will not complete it will be blocking Helm chart deployment infinite amount of time. To avoid that, need to set spec.activeDeadlineSeconds. It will timeout the job if it will not complete until the set time limit.

apiVersion: batch/v1
kind: Job
metadata:
  name: "{{ .Release.Name }}-database-connection-test"
  annotations:
    "helm.sh/hook": pre-install,test-success
    "helm.sh/hook-delete-policy": before-hook-creation
spec:
  ttlSecondsAfterFinished: 300
  backoffPolicy: 1
  activeDeadlineSeconds: 100
  template:
    spec:
      containers:
      - name: {{ .Release.Name }}-database-connection-test
        image: {{ template "mongo.image" . }}
        imagePullPolicy: Always
        env:
          - name: HOST
            value: {{ .Values.mongo.host }}
          - name: PORT
            value: {{ .Values.mongo.port | quote }}
          - name: DATABASE_NAME
            value: {{ .Values.mongo.databasename }}
          - name: USERNAME
            value: {{ .Values.mongo.username }}
          - name: PASSWORD
            value: {{ .Values.mongo.password }}
        command: ["sh", "-c", "mongo --username $USERNAME --password $PASSWORD --authenticationDatabase $DATABASE_NAME --host $HOST --port $PORT"]
      restartPolicy: Never

It's kind of a workaround, because initially Helm test annotation shouldn't be used alongside other hooks.

-- Remigijus Kutkaitis
Source: StackOverflow