## Introduce new chaosexperiments and workflowtemplates to nc-helm charts Helm Chart A helm chart is a collection of kubernetes yaml manifests grouped into a single package to simplify the deployment of a containarized application. Use tree command inside chart folder to see the chart structure ├── Chart.yaml ├── charts ├── templates │   ├── NOTES.txt │   ├── _helpers.tpl │   ├── deployment.yaml │   ├── ingress.yaml │   ├── service.yaml │   └── tests │   └── test-connection.yaml └── values.yaml Helm chart contains, **charts**: Used for adding dependent charts. **templates**: Contains configuration files **templates/tests**: Used for adding test-manifests to test helm chart **values.yaml**: Used to define default values for configuration files #### chaosexperiment helm chart Chaos experiment contain the actual chaos details. These experiments are installed on target kubernetes cluster as Kubernetes CRs. $ nc-helm/chaosexperiments# tree . ├── Chart.yaml ├── templates │   ├── argo-workflow-rbac.yaml │   ├── experiment-pod-cpu-hog.yaml │   ├── experiment-pod-delete.yaml │   ├── experiment-pod-memory-hog.yaml │   ├── experiment-pod-network-latency.yaml │   ├── experiment-pod-network-loss.yaml │   ├── litmus-chaos-rbac.yaml │   ├── test-chaosexperiments-serviceaccount.yaml │   └── tests │   ├── test-chaosexperiments-pod-cpu-hog.yaml │   ├── test-chaosexperiments-pod-delete.yaml │   ├── test-chaosexperiments-pod-memory-hog.yaml │   ├── test-chaosexperiments-pod-network-latency.yaml │   └── test-chaosexperiments-pod-network-loss.yaml └── values.yaml templates folder contains the list of experiments available in the chart and test folder contains test-experiments used to test helm chart. To install the experiment, edit the values.yaml file and set the experiments to true and run helm install or override the values.yaml using --set command from helm command line. # Using values.yaml $ cat values.yaml experiments: pod_delete: enabled: false ---> set to true network_latency: enabled: false network_loss: enabled: false pod_memory_hog: enabled: false pod_cpu_hog: enabled: false # Using --set to the helm install command $ cd chaosexperiments $ helm install . --name=chaosexperiments --namespace=aqua --set experiments.pod_delete.enabled=true,experiments.network_latency.enabled=true,experiments.network_loss.enabled=true,experiments.pod_cpu_hog.enabled=true,experiments.pod_memory_hog.enabled=true By default, All chaosexperiments are set to false in values.yaml under experiments section. Example chaosexperiment manifest template: {{ if .Values.experiments.<experiment-name>.enabled }} -----> Enable the experiment in values.yaml apiVersion: litmuschaos.io/v1alpha1 description: message: | <Description of experiment> kind: ChaosExperiment metadata: name: <experiment-name> namespace: {{ .Values.namespace }} -----> Namespace of the experiment labels: name: <label> app.kubernetes.io/part-of: litmus app.kubernetes.io/component: chaosexperiment app.kubernetes.io/version: 1.10.0 version: 0.1.19 spec: definition: scope: Namespaced image: {{ .Values.images.tags.go_runner }} -----> Docker image used to perform chaos imagePullPolicy: {{ .Values.images.pull_policy }} -----> Image download policy args: - -c - ./experiments -name <experiment-name> command: - /bin/bash env: - name: <key1> value: <value1> - name: <key2> value: <value2> labels: name: <label> app.kubernetes.io/part-of: litmus app.kubernetes.io/component: experiment-job app.kubernetes.io/version: 1.10.0 {{ end }} To add a new experiment to chaosexperiment helm chart, 1. Create a new experiment file in templates folder with name experiment-<experiment-name>.yaml chaosexperiment menifests can be downloaded from https://litmuschaos.io/ 2. Create a test experiment with test-chaosexperiments-<experiment-name>.yaml 3. Add new experiment to values.yaml in experiments section ### litmus-workflowtemplates helm chart Litmus use argo workflow templates. This allow developers to reuse them by referencing them from your Workflows. litmus-argo-workflow-templates chart directory structure ├── Chart.yaml ├── templates │   ├── chaos_manager_service_account.yaml │   ├── pod-cpu-hog-template.yaml │   ├── pod-delete-template.yaml │   ├── pod-memory-hog-template.yaml │   ├── pod-network-latency-template.yaml │   ├── pod-network-loss-template.yaml │   ├── test-workflowtemplates-serviceaccount.yaml │   └── tests │   ├── test-workflowtemplate-pod-cpu-hog.yaml │   ├── test-workflowtemplate-pod-delete.yaml │   ├── test-workflowtemplate-pod-memory-hog.yaml │   ├── test-workflowtemplate-pod-network-latency.yaml │   └── test-workflowtemplate-pod-network-loss.yaml └── values.yaml To install the argo-workflowtemplates, edit the values.yaml file and set the template to true and run helm install or override the values.yaml using --set command from helm command line. # Using values.yaml $ cat values.yaml workflowTemplates: pod_delete: enabled: false ---> set to true network_latency: enabled: false network_loss: enabled: false pod_memory_hog: enabled: false pod_cpu_hog: enabled: false # Using --set to the helm install command $ cd litmus-argo-workflow-templates $ helm install . --name=workflowtemplates --namespace=aqua --set workflowTemplates.pod_delete.enabled=true,workflowTemplates.network_latency.enabled=true,workflowTemplates.network_loss.enabled=true,workflowTemplates.pod_cpu_hog.enabled=true,workflowTemplates.pod_memory_hog.enabled=true To add a new litmus-argo-workflowtemplate, create a manifest <experiment-name>-template.yaml Example workflowtemplate: {{ if .Values.workflowTemplates.<experiment-name>.enabled }} -----> Add the template in values.yaml apiVersion: argoproj.io/v1alpha1 kind: WorkflowTemplate metadata: name: <experiment-name> spec: arguments: parameters: - name: target_namespace -----> Define input parameter here - name: pod_label templates: - name: <experiment-name> inputs: parameters: - name: targt_namespace -----> Define input parametes here - name: pod_label resource: # indicates that this is a resource template action: create # can be any kubectl action (e.g. create, delete, apply, patch) successCondition: status.engineStatus == completed failureCondition: status.engineStatus == failed manifest: | #put your kubernetes spec here apiVersion: litmuschaos.io/v1alpha1 kind: ChaosEngine metadata: generateName: <experiment-name>- -----> It generates a randon name for chaosengine resource namespace: {{ .Values.chaos_namespace }} -----> namespace for the resource ownerReferences: - apiVersion: argoproj.io/v1alpha1 blockOwnerDeletion: true controller: true kind: Workflow name: "{{`{{workflow.name}}`}}" uid: "{{`{{workflow.uid}}`}}" spec: appinfo: appns: '{{`{{inputs.parameters.target_namespace}}`}}' applabel: '{{`{{inputs.parameters.pod_label}}`}}' # It can be true/false annotationCheck: 'false' # It can be active/stop engineState: 'active' #ex. values: ns1:name=percona,ns2:run=nginx auxiliaryAppInfo: '' chaosServiceAccount: {{ .Values.chaos_service_account }} monitoring: false # It can be delete/retain jobCleanUpPolicy: '{{`{{inputs.parameters.cleanup_policy}}`}}' components: runner: {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 18 }} {{- end }} experiments: - name: pod-delete spec: components: {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 22 }} {{- end }} env: # set chaos duration (in sec) as desired - name: TOTAL_CHAOS_DURATION value: '{{`{{inputs.parameters.duration}}`}}' # set chaos interval (in sec) as desired - name: CHAOS_INTERVAL value: '{{`{{inputs.parameters.chaos_interval}}`}}' # pod failures without '--force' & default terminationGracePeriodSeconds - name: FORCE value: '{{`{{inputs.parameters.force}}`}}' {{ end }} The workflowtemplate can be tested by creating a simple workflow and add templatereference to it $ cat workflow.yaml apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: pod-network-latency- spec: serviceAccountName: litmus-workflow entrypoint: pod-network-latency templates: - name: pod-network-latency steps: - - name: pod-network-latency templateRef: -----> template reference name: pod-network-latency -----> Template name template: pod-network-latency -----> Tempalte name arguments: parameters: - name: target_namespace value: "default" - name: pod_label value: "name=networkchaos" Make sure argo and litmus pods running Install the chaosexperiment and run $ kubectl apply -f workflow.yaml -n aqua Verify the workflow $ kubectl get wf -n aqua NAME STATUS AGE pod-network-latency-br26d Succeeded 4m50s Running helm test for chaosexperiment $ helm ls NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE chaosexperiments 1 Fri May 28 04:36:52 2021 DEPLOYED chaosexperiments-0.1.0 1.0 aqua litmus 1 Fri May 28 04:16:20 2021 DEPLOYED litmus-1.11.0 1.11.0 aqua workflowtemplates 1 Fri May 28 04:37:11 2021 DEPLOYED litmus-argo-workflow-templates-0.1.0 1.0 aqua $ helm test chaosexperiments RUNNING: test-pod-network-loss-chaosexperiment PASSED: test-pod-network-loss-chaosexperiment RUNNING: test-pod-network-latency-chaosexperiment PASSED: test-pod-network-latency-chaosexperiment RUNNING: test-pod-delete-chaosexperiment PASSED: test-pod-delete-chaosexperiment Running helm test for litmus-argo-workflow-templates $ helm test workflowtemplates RUNNING: test-pod-network-loss-workflowtemplate PASSED: test-pod-network-loss-workflowtemplate RUNNING: test-pod-network-latency-workflowtemplate PASSED: test-pod-network-latency-workflowtemplate RUNNING: test-pod-delete-workflowtemplate PASSED: test-pod-delete-workflowtemplate