From a36b0c76b250307395f06dc4e96eb88e4136a907 Mon Sep 17 00:00:00 2001 From: Matt Leader Date: Wed, 9 Oct 2024 14:46:08 -0400 Subject: [PATCH] OCP Chaos Arcaflow Workflow (#699) * add workflows Signed-off-by: Matthew F Leader * update readme Signed-off-by: Matthew F Leader * rm my kubeconfig path Signed-off-by: Matthew F Leader * add workflow details to readme Signed-off-by: Matthew F Leader * mv arcaflow to utils Signed-off-by: Matthew F Leader --------- Signed-off-by: Matthew F Leader --- utils/arcaflow/ocp-chaos/README.md | 304 ++++++++++++++++++ utils/arcaflow/ocp-chaos/config.yaml | 18 ++ utils/arcaflow/ocp-chaos/input.yaml | 41 +++ .../ocp-chaos/subworkflows/cpu-hog.yaml | 75 +++++ .../ocp-chaos/subworkflows/kubeburner.yaml | 54 ++++ .../ocp-chaos/subworkflows/pod-chaos.yaml | 108 +++++++ utils/arcaflow/ocp-chaos/workflow.yaml | 73 +++++ 7 files changed, 673 insertions(+) create mode 100644 utils/arcaflow/ocp-chaos/README.md create mode 100644 utils/arcaflow/ocp-chaos/config.yaml create mode 100644 utils/arcaflow/ocp-chaos/input.yaml create mode 100644 utils/arcaflow/ocp-chaos/subworkflows/cpu-hog.yaml create mode 100644 utils/arcaflow/ocp-chaos/subworkflows/kubeburner.yaml create mode 100644 utils/arcaflow/ocp-chaos/subworkflows/pod-chaos.yaml create mode 100644 utils/arcaflow/ocp-chaos/workflow.yaml diff --git a/utils/arcaflow/ocp-chaos/README.md b/utils/arcaflow/ocp-chaos/README.md new file mode 100644 index 00000000..e645fbaf --- /dev/null +++ b/utils/arcaflow/ocp-chaos/README.md @@ -0,0 +1,304 @@ +# OpenShift Shenanigans + +## Workflow Description + +Given a target OpenShift cluster, this workflow executes a +[kube-burner plugin](https://github.com/redhat-performance/arcaflow-plugin-kube-burner) +workflow to place a load on the cluster, repeatedly removes a targeted pod at a given time frequency with the [kill-pod plugin](https://github.com/krkn-chaos/arcaflow-plugin-kill-pod), +and runs a [stress-ng](https://github.com/ColinIanKing/stress-ng) CPU workload on the cluster. +Target your OpenShift cluster with the appropriate `kubeconfig` file, and add its file path as +the value for `kubernetes_target.kubeconfig_path`, in the input file. Any combination of subworkflows can be disabled in the input file by setting either `cpu_hog_enabled`, `pod_chaos_enabled`, or `kubeburner_enabled` to `false`. + + +## Files + +- [`workflow.yaml`](workflow.yaml) -- Defines the workflow input schema, the plugins to run + and their data relationships, and the output to present to the user +- [`input.yaml`](input.yaml) -- The input parameters that the user provides for running + the workflow +- [`config.yaml`](config.yaml) -- Global config parameters that are passed to the Arcaflow + engine +- [`cpu-hog.yaml`](subworkflows/cpu-hog.yaml) -- The StressNG workload on the CPU. +- [`kubeburner.yaml`](subworkflows/kubeburner.yaml) -- The KubeBurner workload for the Kubernetes Cluster API. +- [`pod-chaos.yaml`](subworkflows/pod-chaos.yaml) -- The Kill Pod workflow for the Kubernetes infrastructure pods. + +## Running the Workflow + +### Workflow Dependencies + +Install Python, at least `3.9`. + +First, add the path to your Python interpreter to `config.yaml` as the value +for `pythonPath` as shown here. A common choice for users working in +distributions of Linux operating systems is `usr/bin/python`. Second, add a +directory to which your Arcaflow process will have write access as the +value for `workdir`, `/tmp` is a common choice because your process will likely be able to write to it. + +```yaml +deployers: + python: + pythonPath: /usr/bin/python + workdir: /tmp +``` + +To use this Python interpreter with our `kill-pod` plugin, go to the `deploy` section of the `kill_pod` step in [`pod-chaos.yaml`](subworkflows/pod-chaos.yaml). You can use the same `pythonPath` and `workdir` that you used in +your `config.yaml`. + +```yaml +deploy: + deployer_name: python + modulePullPolicy: Always + pythonPath: /usr/bin/python + workdir: /tmp +``` + +Download a Go binary of the latest version of the Arcaflow engine from: https://github.com/arcalot/arcaflow-engine/releases. + +#### OpenShift Target + +Target your desired OpenShift cluster by setting the `kubeconfig_path` variable for each subworkflow's parameter list in [`input.yaml`](input.yaml). + +#### Kube-Burner Plugin + +The `kube-burner` plugin generates and reports the UUID to which the +`kube-burner` data is associated in your search database. The `uuidgen` +workflow step uses the `arcaflow-plugin-utilities` `uuid` plugin step to +randomly generate a UUID for you. + +### Workflow Execution + +Run the workflow: +``` +$ export WFPATH= +$ arcaflow --context ${WFPATH} --input input.yaml --config config.yaml --workflow workflow.yaml +``` + +## Workflow Diagram +This diagram shows the complete end-to-end workflow logic. + +### Main Workflow + +```mermaid +%% Mermaid markdown workflow +flowchart LR +%% Success path +input-->steps.cpu_hog_wf.enabling +input-->steps.cpu_hog_wf.execute +input-->steps.kubeburner_wf.enabling +input-->steps.kubeburner_wf.execute +input-->steps.pod_chaos_wf.enabling +input-->steps.pod_chaos_wf.execute +outputs.workflow_success.cpu_hog-->outputs.workflow_success +outputs.workflow_success.cpu_hog.disabled-->outputs.workflow_success.cpu_hog +outputs.workflow_success.cpu_hog.enabled-->outputs.workflow_success.cpu_hog +outputs.workflow_success.kubeburner-->outputs.workflow_success +outputs.workflow_success.kubeburner.disabled-->outputs.workflow_success.kubeburner +outputs.workflow_success.kubeburner.enabled-->outputs.workflow_success.kubeburner +outputs.workflow_success.pod_chaos-->outputs.workflow_success +outputs.workflow_success.pod_chaos.disabled-->outputs.workflow_success.pod_chaos +outputs.workflow_success.pod_chaos.enabled-->outputs.workflow_success.pod_chaos +steps.cpu_hog_wf.closed-->steps.cpu_hog_wf.closed.result +steps.cpu_hog_wf.disabled-->steps.cpu_hog_wf.disabled.output +steps.cpu_hog_wf.disabled.output-->outputs.workflow_success.cpu_hog.disabled +steps.cpu_hog_wf.enabling-->steps.cpu_hog_wf.closed +steps.cpu_hog_wf.enabling-->steps.cpu_hog_wf.disabled +steps.cpu_hog_wf.enabling-->steps.cpu_hog_wf.enabling.resolved +steps.cpu_hog_wf.enabling-->steps.cpu_hog_wf.execute +steps.cpu_hog_wf.execute-->steps.cpu_hog_wf.outputs +steps.cpu_hog_wf.outputs-->steps.cpu_hog_wf.outputs.success +steps.cpu_hog_wf.outputs.success-->outputs.workflow_success.cpu_hog.enabled +steps.kubeburner_wf.closed-->steps.kubeburner_wf.closed.result +steps.kubeburner_wf.disabled-->steps.kubeburner_wf.disabled.output +steps.kubeburner_wf.disabled.output-->outputs.workflow_success.kubeburner.disabled +steps.kubeburner_wf.enabling-->steps.kubeburner_wf.closed +steps.kubeburner_wf.enabling-->steps.kubeburner_wf.disabled +steps.kubeburner_wf.enabling-->steps.kubeburner_wf.enabling.resolved +steps.kubeburner_wf.enabling-->steps.kubeburner_wf.execute +steps.kubeburner_wf.execute-->steps.kubeburner_wf.outputs +steps.kubeburner_wf.outputs-->steps.kubeburner_wf.outputs.success +steps.kubeburner_wf.outputs.success-->outputs.workflow_success.kubeburner.enabled +steps.pod_chaos_wf.closed-->steps.pod_chaos_wf.closed.result +steps.pod_chaos_wf.disabled-->steps.pod_chaos_wf.disabled.output +steps.pod_chaos_wf.disabled.output-->outputs.workflow_success.pod_chaos.disabled +steps.pod_chaos_wf.enabling-->steps.pod_chaos_wf.closed +steps.pod_chaos_wf.enabling-->steps.pod_chaos_wf.disabled +steps.pod_chaos_wf.enabling-->steps.pod_chaos_wf.enabling.resolved +steps.pod_chaos_wf.enabling-->steps.pod_chaos_wf.execute +steps.pod_chaos_wf.execute-->steps.pod_chaos_wf.outputs +steps.pod_chaos_wf.outputs-->steps.pod_chaos_wf.outputs.success +steps.pod_chaos_wf.outputs.success-->outputs.workflow_success.pod_chaos.enabled +%% Error path +steps.cpu_hog_wf.execute-->steps.cpu_hog_wf.failed +steps.cpu_hog_wf.failed-->steps.cpu_hog_wf.failed.error +steps.kubeburner_wf.execute-->steps.kubeburner_wf.failed +steps.kubeburner_wf.failed-->steps.kubeburner_wf.failed.error +steps.pod_chaos_wf.execute-->steps.pod_chaos_wf.failed +steps.pod_chaos_wf.failed-->steps.pod_chaos_wf.failed.error +%% Mermaid end +``` + +### Pod Chaos Workflow + +```mermaid +%% Mermaid markdown workflow +flowchart LR +%% Success path +input-->steps.kill_pod.starting +steps.kill_pod.cancelled-->steps.kill_pod.closed +steps.kill_pod.cancelled-->steps.kill_pod.outputs +steps.kill_pod.closed-->steps.kill_pod.closed.result +steps.kill_pod.deploy-->steps.kill_pod.closed +steps.kill_pod.deploy-->steps.kill_pod.starting +steps.kill_pod.disabled-->steps.kill_pod.disabled.output +steps.kill_pod.enabling-->steps.kill_pod.closed +steps.kill_pod.enabling-->steps.kill_pod.disabled +steps.kill_pod.enabling-->steps.kill_pod.enabling.resolved +steps.kill_pod.enabling-->steps.kill_pod.starting +steps.kill_pod.outputs-->steps.kill_pod.outputs.success +steps.kill_pod.outputs.success-->outputs.success +steps.kill_pod.running-->steps.kill_pod.closed +steps.kill_pod.running-->steps.kill_pod.outputs +steps.kill_pod.starting-->steps.kill_pod.closed +steps.kill_pod.starting-->steps.kill_pod.running +steps.kill_pod.starting-->steps.kill_pod.starting.started +%% Error path +steps.kill_pod.cancelled-->steps.kill_pod.crashed +steps.kill_pod.cancelled-->steps.kill_pod.deploy_failed +steps.kill_pod.crashed-->steps.kill_pod.crashed.error +steps.kill_pod.deploy-->steps.kill_pod.deploy_failed +steps.kill_pod.deploy_failed-->steps.kill_pod.deploy_failed.error +steps.kill_pod.enabling-->steps.kill_pod.crashed +steps.kill_pod.outputs-->steps.kill_pod.outputs.error +steps.kill_pod.running-->steps.kill_pod.crashed +steps.kill_pod.starting-->steps.kill_pod.crashed +%% Mermaid end +``` + +### StressNG (CPU Hog) Workflow + +```mermaid +%% Mermaid markdown workflow +flowchart LR +%% Success path +input-->steps.kubeconfig.starting +input-->steps.stressng.deploy +input-->steps.stressng.starting +steps.kubeconfig.cancelled-->steps.kubeconfig.closed +steps.kubeconfig.cancelled-->steps.kubeconfig.outputs +steps.kubeconfig.closed-->steps.kubeconfig.closed.result +steps.kubeconfig.deploy-->steps.kubeconfig.closed +steps.kubeconfig.deploy-->steps.kubeconfig.starting +steps.kubeconfig.disabled-->steps.kubeconfig.disabled.output +steps.kubeconfig.enabling-->steps.kubeconfig.closed +steps.kubeconfig.enabling-->steps.kubeconfig.disabled +steps.kubeconfig.enabling-->steps.kubeconfig.enabling.resolved +steps.kubeconfig.enabling-->steps.kubeconfig.starting +steps.kubeconfig.outputs-->steps.kubeconfig.outputs.success +steps.kubeconfig.outputs.success-->steps.stressng.deploy +steps.kubeconfig.running-->steps.kubeconfig.closed +steps.kubeconfig.running-->steps.kubeconfig.outputs +steps.kubeconfig.starting-->steps.kubeconfig.closed +steps.kubeconfig.starting-->steps.kubeconfig.running +steps.kubeconfig.starting-->steps.kubeconfig.starting.started +steps.stressng.cancelled-->steps.stressng.closed +steps.stressng.cancelled-->steps.stressng.outputs +steps.stressng.closed-->steps.stressng.closed.result +steps.stressng.deploy-->steps.stressng.closed +steps.stressng.deploy-->steps.stressng.starting +steps.stressng.disabled-->steps.stressng.disabled.output +steps.stressng.enabling-->steps.stressng.closed +steps.stressng.enabling-->steps.stressng.disabled +steps.stressng.enabling-->steps.stressng.enabling.resolved +steps.stressng.enabling-->steps.stressng.starting +steps.stressng.outputs-->steps.stressng.outputs.success +steps.stressng.outputs.success-->outputs.success +steps.stressng.running-->steps.stressng.closed +steps.stressng.running-->steps.stressng.outputs +steps.stressng.starting-->steps.stressng.closed +steps.stressng.starting-->steps.stressng.running +steps.stressng.starting-->steps.stressng.starting.started +%% Error path +steps.kubeconfig.cancelled-->steps.kubeconfig.crashed +steps.kubeconfig.cancelled-->steps.kubeconfig.deploy_failed +steps.kubeconfig.crashed-->steps.kubeconfig.crashed.error +steps.kubeconfig.deploy-->steps.kubeconfig.deploy_failed +steps.kubeconfig.deploy_failed-->steps.kubeconfig.deploy_failed.error +steps.kubeconfig.enabling-->steps.kubeconfig.crashed +steps.kubeconfig.outputs-->steps.kubeconfig.outputs.error +steps.kubeconfig.running-->steps.kubeconfig.crashed +steps.kubeconfig.starting-->steps.kubeconfig.crashed +steps.stressng.cancelled-->steps.stressng.crashed +steps.stressng.cancelled-->steps.stressng.deploy_failed +steps.stressng.crashed-->steps.stressng.crashed.error +steps.stressng.deploy-->steps.stressng.deploy_failed +steps.stressng.deploy_failed-->steps.stressng.deploy_failed.error +steps.stressng.enabling-->steps.stressng.crashed +steps.stressng.outputs-->steps.stressng.outputs.error +steps.stressng.running-->steps.stressng.crashed +steps.stressng.starting-->steps.stressng.crashed +%% Mermaid end +``` + +### Kube-Burner Workflow + +```mermaid +%% Mermaid markdown workflow +flowchart LR +%% Success path +input-->steps.kubeburner.starting +steps.kubeburner.cancelled-->steps.kubeburner.closed +steps.kubeburner.cancelled-->steps.kubeburner.outputs +steps.kubeburner.closed-->steps.kubeburner.closed.result +steps.kubeburner.deploy-->steps.kubeburner.closed +steps.kubeburner.deploy-->steps.kubeburner.starting +steps.kubeburner.disabled-->steps.kubeburner.disabled.output +steps.kubeburner.enabling-->steps.kubeburner.closed +steps.kubeburner.enabling-->steps.kubeburner.disabled +steps.kubeburner.enabling-->steps.kubeburner.enabling.resolved +steps.kubeburner.enabling-->steps.kubeburner.starting +steps.kubeburner.outputs-->steps.kubeburner.outputs.success +steps.kubeburner.outputs.success-->outputs.success +steps.kubeburner.running-->steps.kubeburner.closed +steps.kubeburner.running-->steps.kubeburner.outputs +steps.kubeburner.starting-->steps.kubeburner.closed +steps.kubeburner.starting-->steps.kubeburner.running +steps.kubeburner.starting-->steps.kubeburner.starting.started +steps.uuidgen.cancelled-->steps.uuidgen.closed +steps.uuidgen.cancelled-->steps.uuidgen.outputs +steps.uuidgen.closed-->steps.uuidgen.closed.result +steps.uuidgen.deploy-->steps.uuidgen.closed +steps.uuidgen.deploy-->steps.uuidgen.starting +steps.uuidgen.disabled-->steps.uuidgen.disabled.output +steps.uuidgen.enabling-->steps.uuidgen.closed +steps.uuidgen.enabling-->steps.uuidgen.disabled +steps.uuidgen.enabling-->steps.uuidgen.enabling.resolved +steps.uuidgen.enabling-->steps.uuidgen.starting +steps.uuidgen.outputs-->steps.uuidgen.outputs.success +steps.uuidgen.outputs.success-->steps.kubeburner.starting +steps.uuidgen.running-->steps.uuidgen.closed +steps.uuidgen.running-->steps.uuidgen.outputs +steps.uuidgen.starting-->steps.uuidgen.closed +steps.uuidgen.starting-->steps.uuidgen.running +steps.uuidgen.starting-->steps.uuidgen.starting.started +%% Error path +steps.kubeburner.cancelled-->steps.kubeburner.crashed +steps.kubeburner.cancelled-->steps.kubeburner.deploy_failed +steps.kubeburner.crashed-->steps.kubeburner.crashed.error +steps.kubeburner.deploy-->steps.kubeburner.deploy_failed +steps.kubeburner.deploy_failed-->steps.kubeburner.deploy_failed.error +steps.kubeburner.enabling-->steps.kubeburner.crashed +steps.kubeburner.outputs-->steps.kubeburner.outputs.error +steps.kubeburner.running-->steps.kubeburner.crashed +steps.kubeburner.starting-->steps.kubeburner.crashed +steps.uuidgen.cancelled-->steps.uuidgen.crashed +steps.uuidgen.cancelled-->steps.uuidgen.deploy_failed +steps.uuidgen.crashed-->steps.uuidgen.crashed.error +steps.uuidgen.deploy-->steps.uuidgen.deploy_failed +steps.uuidgen.deploy_failed-->steps.uuidgen.deploy_failed.error +steps.uuidgen.enabling-->steps.uuidgen.crashed +steps.uuidgen.outputs-->steps.uuidgen.outputs.error +steps.uuidgen.running-->steps.uuidgen.crashed +steps.uuidgen.starting-->steps.uuidgen.crashed +%% Mermaid end +``` + diff --git a/utils/arcaflow/ocp-chaos/config.yaml b/utils/arcaflow/ocp-chaos/config.yaml new file mode 100644 index 00000000..31ef455e --- /dev/null +++ b/utils/arcaflow/ocp-chaos/config.yaml @@ -0,0 +1,18 @@ +--- +deployers: + image: + deployer_name: podman + deployment: + imagePullPolicy: IfNotPresent + python: + deployer_name: python + modulePullPolicy: Always + pythonPath: /usr/bin/python + workdir: /tmp +log: + level: debug +logged_outputs: + error: + level: debug + success: + level: debug diff --git a/utils/arcaflow/ocp-chaos/input.yaml b/utils/arcaflow/ocp-chaos/input.yaml new file mode 100644 index 00000000..a48c2101 --- /dev/null +++ b/utils/arcaflow/ocp-chaos/input.yaml @@ -0,0 +1,41 @@ +kubernetes_target: + kubeconfig_path: +cpu_hog_enabled: true +pod_chaos_enabled: true +kubeburner_enabled: true + +kubeburner_list: + - kubeburner: + kubeconfig: 'given later in workflow by kubeconfig plugin' + workload: 'cluster-density' + qps: 20 + burst: 20 + log_level: 'info' + timeout: '1m' + iterations: 1 + churn: 'true' + churn_duration: 1s + churn_delay: 1s + churn_percent: 10 + alerting: 'true' + gc: 'true' + +pod_chaos_list: + - namespace_pattern: ^openshift-etcd$ + label_selector: k8s-app=etcd + kill: 1 + krkn_pod_recovery_time: 1 + +cpu_hog_list: + - namespace: default + # set the node selector as a key-value pair eg. + # node_selector: + # kubernetes.io/hostname: kind-worker2 + node_selector: {} + stressng_params: + timeout: 1 + stressors: + - stressor: cpu + workers: 1 + cpu-load: 20 + cpu-method: all diff --git a/utils/arcaflow/ocp-chaos/subworkflows/cpu-hog.yaml b/utils/arcaflow/ocp-chaos/subworkflows/cpu-hog.yaml new file mode 100644 index 00000000..db7718a8 --- /dev/null +++ b/utils/arcaflow/ocp-chaos/subworkflows/cpu-hog.yaml @@ -0,0 +1,75 @@ +version: v0.2.0 +input: + root: CpuHog__KubernetesTarget + objects: + CpuHog__KubernetesTarget: + id: CpuHog__KubernetesTarget + properties: + constant: + type: + type_id: ref + id: KubernetesTarget + item: + type: + type_id: ref + id: CpuHog + KubernetesTarget: + id: KubernetesTarget + properties: + kubeconfig_path: + type: + type_id: string + CpuHog: + id: CpuHog + properties: + namespace: + display: + description: The namespace where the container will be deployed + name: Namespace + type: + type_id: string + required: true + node_selector: + display: + description: kubernetes node name where the plugin must be deployed + type: + type_id: map + values: + type_id: string + keys: + type_id: string + required: true + stressng_params: + type: + type_id: ref + id: StressNGParams + namespace: $.steps.stressng.starting.inputs.input + +steps: + kubeconfig: + plugin: + src: quay.io/arcalot/arcaflow-plugin-kubeconfig:0.3.1 + deployment_type: image + input: + kubeconfig: !expr 'readFile($.input.constant.kubeconfig_path)' + stressng: + plugin: + src: quay.io/arcalot/arcaflow-plugin-stressng:0.8.0 + deployment_type: image + step: workload + input: !expr $.input.item.stressng_params + deploy: + deployer_name: kubernetes + connection: !expr $.steps.kubeconfig.outputs.success.connection + pod: + metadata: + namespace: !expr $.input.item.namespace + labels: + arcaflow: stressng + spec: + nodeSelector: !expr $.input.item.node_selector + pluginContainer: + imagePullPolicy: Always + +outputs: + success: !expr $.steps.stressng.outputs.success diff --git a/utils/arcaflow/ocp-chaos/subworkflows/kubeburner.yaml b/utils/arcaflow/ocp-chaos/subworkflows/kubeburner.yaml new file mode 100644 index 00000000..e1d9b50a --- /dev/null +++ b/utils/arcaflow/ocp-chaos/subworkflows/kubeburner.yaml @@ -0,0 +1,54 @@ +version: v0.2.0 +input: + root: KubeBurner__KubernetesTarget + objects: + KubeBurner__KubernetesTarget: + id: KubeBurner__KubernetesTarget + properties: + constant: + type: + type_id: ref + id: KubernetesTarget + item: + type: + type_id: ref + id: KubeBurner + KubernetesTarget: + id: KubernetesTarget + properties: + kubeconfig_path: + type: + type_id: string + KubeBurner: + id: KubeBurner + properties: + kubeburner: + type: + type_id: ref + id: KubeBurnerInputParams + namespace: $.steps.kubeburner.starting.inputs.input + +steps: + uuidgen: + plugin: + deployment_type: image + src: quay.io/arcalot/arcaflow-plugin-utilities:0.6.0 + step: uuid + input: {} + kubeburner: + plugin: + deployment_type: image + src: quay.io/redhat-performance/arcaflow-plugin-kube-burner:latest + step: kube-burner + input: + kubeconfig: !expr 'readFile($.input.constant.kubeconfig_path)' + uuid: !expr $.steps.uuidgen.outputs.success.uuid + workload: !expr $.input.item.kubeburner.workload + iterations: !expr $.input.item.kubeburner.iterations + churn: !expr $.input.item.kubeburner.churn + churn_duration: !expr $.input.item.kubeburner.churn_duration + churn_delay: !expr $.input.item.kubeburner.churn_delay + +outputs: + success: + burner: !expr $.steps.kubeburner.outputs.success diff --git a/utils/arcaflow/ocp-chaos/subworkflows/pod-chaos.yaml b/utils/arcaflow/ocp-chaos/subworkflows/pod-chaos.yaml new file mode 100644 index 00000000..5c28da9d --- /dev/null +++ b/utils/arcaflow/ocp-chaos/subworkflows/pod-chaos.yaml @@ -0,0 +1,108 @@ +version: v0.2.0 +input: + root: KillPodConfig__KubernetesTarget + objects: + KillPodConfig__KubernetesTarget: + id: KillPodConfig__KubernetesTarget + properties: + constant: + type: + type_id: ref + id: KubernetesTarget + item: + type: + type_id: ref + id: KillPodConfig + KubernetesTarget: + id: KubernetesTarget + properties: + kubeconfig_path: + type: + type_id: string + KillPodConfig: + id: KillPodConfig + properties: + backoff: + default: '1' + display: + description: How many seconds to wait between checks for the target + pod status. + name: Backoff + required: false + type: + type_id: integer + kill: + default: '1' + display: + description: How many pods should we attempt to kill? + name: Number of pods to kill + required: false + type: + min: 1 + type_id: integer + krkn_pod_recovery_time: + default: '60' + display: + description: The Expected Recovery time fo the pod (used by Krkn to + monitor the pod lifecycle) + name: Recovery Time + required: false + type: + type_id: integer + label_selector: + display: + description: 'Kubernetes label selector for the target pods. Required + if name_pattern is not set. + See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ + for details.' + name: Label selector + required: false + required_if_not: + - name_pattern + type: + type_id: string + name_pattern: + display: + description: Regular expression for target pods. Required if label_selector + is not set. + name: Name pattern + required: false + required_if_not: + - label_selector + type: + type_id: pattern + namespace_pattern: + display: + description: Regular expression for target pod namespaces. + name: Namespace pattern + required: true + type: + type_id: pattern + timeout: + default: '180' + display: + description: Timeout to wait for the target pod(s) to be removed in + seconds. + name: Timeout + required: false + type: + type_id: integer + +steps: + kill_pod: + step: kill-pods + plugin: + deployment_type: python + src: arcaflow-plugin-kill-pod@git+https://github.com/krkn-chaos/arcaflow-plugin-kill-pod.git@a9f87f88d8e7763d111613bd8b2c7862fc49624f + input: + namespace_pattern: !expr $.input.item.namespace_pattern + label_selector: !expr $.input.item.label_selector + kubeconfig_path: !expr $.input.constant.kubeconfig_path + deploy: + deployer_name: python + modulePullPolicy: Always + pythonPath: /usr/bin/python + workdir: /tmp + +outputs: + success: !expr $.steps.kill_pod.outputs.success diff --git a/utils/arcaflow/ocp-chaos/workflow.yaml b/utils/arcaflow/ocp-chaos/workflow.yaml new file mode 100644 index 00000000..c7eedead --- /dev/null +++ b/utils/arcaflow/ocp-chaos/workflow.yaml @@ -0,0 +1,73 @@ +version: v0.2.0 +input: + root: RootObject + objects: + KubernetesTarget: + id: KubernetesTarget + properties: + kubeconfig_path: + type: + type_id: string + RootObject: + id: RootObject + properties: + cpu_hog_enabled: + type: + type_id: bool + pod_chaos_enabled: + type: + type_id: bool + kubeburner_enabled: + type: + type_id: bool + kubernetes_target: + type: + type_id: ref + id: KubernetesTarget + kubeburner_list: + type: + type_id: list + items: + type_id: ref + id: KubeBurner + namespace: $.steps.kubeburner_wf.execute.inputs.items + pod_chaos_list: + type: + type_id: list + items: + type_id: ref + id: KillPodConfig + namespace: $.steps.pod_chaos_wf.execute.inputs.items + cpu_hog_list: + type: + type_id: list + items: + type_id: ref + id: CpuHog + namespace: $.steps.cpu_hog_wf.execute.inputs.items + +steps: + kubeburner_wf: + kind: foreach + items: !expr 'bindConstants($.input.kubeburner_list, $.input.kubernetes_target)' + workflow: subworkflows/kubeburner.yaml + parallelism: 1 + enabled: !expr $.input.kubeburner_enabled + pod_chaos_wf: + kind: foreach + items: !expr 'bindConstants($.input.pod_chaos_list, $.input.kubernetes_target)' + workflow: subworkflows/pod-chaos.yaml + parallelism: 1 + enabled: !expr $.input.pod_chaos_enabled + cpu_hog_wf: + kind: foreach + items: !expr 'bindConstants($.input.cpu_hog_list, $.input.kubernetes_target)' + workflow: subworkflows/cpu-hog.yaml + parallelism: 1 + enabled: !expr $.input.cpu_hog_enabled + +outputs: + workflow_success: + kubeburner: !ordisabled $.steps.kubeburner_wf.outputs.success + pod_chaos: !ordisabled $.steps.pod_chaos_wf.outputs.success + cpu_hog: !ordisabled $.steps.cpu_hog_wf.outputs.success