From c7f3d2683ca740461fe2b99f29bb214be028757b Mon Sep 17 00:00:00 2001 From: Neelanjan Manna Date: Tue, 3 Oct 2023 13:45:04 +0530 Subject: [PATCH] chore: Fix ChaosHub for Litmus 3.0 (#612) * fixes broken links, adds missing icons and updates readme Signed-off-by: neelanjan00 --- README.md | 107 +++++++++--------- experiments/bank-of-anthos/experiment.yaml | 4 +- .../bank-of-anthos/experiment_cron.yaml | 4 +- experiments/icons/namespaced-scope-chaos.png | Bin 0 -> 959 bytes experiments/icons/node-cpu-hog.png | Bin 0 -> 2453 bytes experiments/icons/node-memory-hog.png | Bin 0 -> 1571 bytes experiments/icons/pod-cpu-hog.png | Bin 0 -> 2078 bytes experiments/icons/pod-delete.png | Bin 0 -> 959 bytes experiments/icons/pod-memory-hog.png | Bin 0 -> 1516 bytes .../namespaced-scope-chaos/experiment.yaml | 2 +- experiments/node-cpu-hog/experiment.yaml | 2 +- experiments/node-memory-hog/experiment.yaml | 2 +- experiments/pod-cpu-hog/experiment.yaml | 2 +- experiments/pod-delete/experiment.yaml | 2 +- experiments/pod-memory-hog/experiment.yaml | 2 +- experiments/podtato-head/experiment.yaml | 4 +- experiments/podtato-head/experiment_cron.yaml | 2 +- .../sock-shop-promProbe/experiment.yaml | 4 +- .../sock-shop-promProbe/experiment_cron.yaml | 4 +- experiments/sock-shop/experiment.yaml | 4 +- experiments/sock-shop/experiment_cron.yaml | 4 +- faults/aws/aws.chartserviceversion.yaml | 2 +- faults/azure/azure.chartserviceversion.yaml | 2 +- faults/gcp/gcp.chartserviceversion.yaml | 2 +- .../kubernetes.chartserviceversion.yaml | 2 +- .../spring-boot.chartserviceversion.yaml | 2 +- faults/vmware/vmware.chartserviceversion.yaml | 2 +- 27 files changed, 80 insertions(+), 81 deletions(-) create mode 100644 experiments/icons/namespaced-scope-chaos.png create mode 100644 experiments/icons/node-cpu-hog.png create mode 100644 experiments/icons/node-memory-hog.png create mode 100644 experiments/icons/pod-cpu-hog.png create mode 100644 experiments/icons/pod-delete.png create mode 100644 experiments/icons/pod-memory-hog.png diff --git a/README.md b/README.md index a0cc89a..90cfe93 100644 --- a/README.md +++ b/README.md @@ -7,213 +7,212 @@ [![YouTube Channel](https://img.shields.io/badge/YouTube-Subscribe-red)](https://www.youtube.com/channel/UCa57PMqmz_j0wnteRa9nCaw)

-This repository hosts the Litmus Chaos Charts. A set of related chaos experiments are bundled into a Chaos Chart. Chaos Charts are classified into the following categories. +This repository hosts the Litmus Chaos Charts. A set of related chaos faults are bundled into a Chaos Chart. Chaos Charts are classified into the following categories. -- [Generic Chaos](#generic-chaos) +- [Kubernetes Chaos](#kubernetes-chaos) - [Application Chaos](#application-chaos) - [Platform Chaos](#platform-chaos) -### Generic Chaos +### Kubernetes Chaos -Chaos actions that apply to generic Kubernetes resources are classified into this category. Following chaos experiments are supported under Generic Chaos Chart +Chaos faults that apply to Kubernetes resources are classified in this category. Following chaos faults are supported for Kubernetes: - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
Experiment Name Fault Name Description Link
Container Kill Kill one container in the application pod container-kill container-kill
Disk Fill Fill the Ephemeral Storage of the Pod disk-fill disk-fill
Docker Service Kill Kill docker service of the target node docker-service-kill docker-service-kill
Kubelet Service Kill Kill kubelet service of the target node kubelet-service-kill kubelet-service-kill
Node CPU Hog Stress the cpu of the target node node-cpu-hog node-cpu-hog
Node Drain Drain the target node node-drain node-drain
Node IO Stress Stress the IO of the target node node-io-stress node-io-stress
Node Memory Hog Stress the memory of the target node node-memory-hog node-memory-hog
Node Restart Restart the target node node-restart node-restart
Node Taint Taint the target node node-taint node-taint
Pod Autoscaler Scale the replicas of the target application pod-autoscaler pod-autoscaler
Pod CPU Hog Stress the CPU of the target pod pod-cpu-hog pod-cpu-hog
Pod Delete Delete the target pods pod-delete pod-delete
Pod DNS Spoof Spoof dns requests to desired target hostnames pod-dns-spoof pod-dns-spoof
Pod DNS Error Error the dns requests of the target pod pod-dns-error pod-dns-error
Pod IO Stress Stress the IO of the target pod pod-io-stress pod-io-stress
Pod Memory Hog Stress the memory of the target pod pod-memory-hog pod-memory-hog
Pod Network Latency Induce the network latency in target pod pod-network-latency pod-network-latency
Pod Network Corruption Induce the network packet corruption in target pod pod-network-corruption pod-network-corruption
Pod Network Duplication Induce the network packet duplication in target pod pod-network-duplication pod-network-duplication
Pod Network Loss Induce the network loss in target pod pod-network-loss pod-network-loss
Pod Network Partition Disrupt network connectivity to kubernetes pods pod-network-partition pod-network-partition
### Application Chaos -While Chaos Experiments under the Generic category offer the ability to induce chaos into Kubernetes resources, it is difficult to analyze and conclude if the chaos induced found a weakness in a given application. The application specific chaos experiments are built with some checks on *pre-conditions* and some expected outcomes after the chaos injection. The result of the chaos experiment is determined by matching the outcome with the expected outcome. +While chaos faults under the Kubernetes category offer the ability to induce chaos into Kubernetes resources, it is difficult to analyze and conclude if the induced chaos found a weakness in a given application. The application specific chaos faults are built with some checks on *pre-conditions* and some expected outcomes after the chaos injection. The result of the chaos faults is determined by matching the outcome with the expected outcome. - + - - - + + +
Experiment Name Fault Category Description Link
OpenEBS Experiments Injects faults in OpenEBS tool OpenEBS experiments Spring Boot Faults Injects faults in Spring Boot applications Spring Boot Faults
### Platform Chaos -Chaos experiments that inject chaos into the platform resources of Kubernetes are classified into this category. Management of platform resources vary significantly from each other, Chaos Charts may be maintained separately for each platform (For example, AWS, GCP, Azure, VMWare etc) +Chaos faults that inject chaos into the platform and infrastructure resources are classified into this category. Management of platform resources vary significantly from each other, Chaos Charts may be maintained separately for each platform (For example: AWS, GCP, Azure, VMWare etc.) -Following Platform Chaos experiments are available on ChaosHub +Following chaos faults are classified in this category: - + - + - + - + - + - + - + - + - +
Experiment Name Fault Category Description Link
AWS Experiments AWS Faults AWS Platform specific chaos AWS Experiments AWS Faults
Azure Experiments Azure Faults Azure Platform specific chaos Azure Experiments Azure Faults
GCP Experiments GCP Faults GCP Platform specific chaos GCP Experiments GCP Faults
VMWare Experiments VMWare Faults VMWare Platform specific chaos VMWare Experiments VMWare Faults
-## Installation Steps for Chart Releases +## Installation Steps for Chart Releases -*Note: Supported from release 1.1.0* +*Note: Supported from release 3.0.0* -- To install the chaos experiments from a specific chart for a given release, execute the following commands +- To install the chaos faults from a specific chart for a given release, execute the following commands with the desired ``, `` & `` ```bash ## downloads and unzips the released source tar -zxvf <(curl -sL https://github.com/litmuschaos/chaos-charts/archive/.tar.gz) -## installs the chaosexperiment resources +## installs the chaosexperiment resources find chaos-charts- -name experiments.yaml | grep | xargs kubectl apply -n -f -``` -- For example, to install the *generic* experiment chart bundle for release *1.1.0*, in the *sock-shop* namespace, run: +``` +- For example, to install the *Kubernetes* fault chart bundle for release *3.0.0*, in the *sock-shop* namespace, run: ```bash -tar -zxvf <(curl -sL https://github.com/litmuschaos/chaos-charts/archive/1.1.0.tar.gz) -find chaos-charts-1.1.0 -name experiments.yaml | grep generic | xargs kubectl apply -n sock-shop -f +tar -zxvf <(curl -sL https://github.com/litmuschaos/chaos-charts/archive/3.0.0.tar.gz) +find chaos-charts-3.0.0 -name experiments.yaml | grep kubernetes | xargs kubectl apply -n sock-shop -f ``` -- If you would like to install a specific experiment, replace the `experiments.yaml` in the above command with the relative -path of the experiment manifest within the parent chart. For example, to install only the *pod-delete* experiment, run: +- If you would like to install a specific fault, replace the `experiments.yaml` in the above command with the relative path of the fault manifest within the parent chart. For example, to install only the *pod-delete* fault, run: ```bash -find chaos-charts-1.1.0 -name experiment.yaml | grep 'generic/pod-delete' | xargs kubectl apply -n sock-shop -f +find chaos-charts-3.0.0 -name fault.yaml | grep 'kubernetes/pod-delete' | xargs kubectl apply -n sock-shop -f ``` diff --git a/experiments/bank-of-anthos/experiment.yaml b/experiments/bank-of-anthos/experiment.yaml index 7d086dc..b11b172 100644 --- a/experiments/bank-of-anthos/experiment.yaml +++ b/experiments/bank-of-anthos/experiment.yaml @@ -1,7 +1,7 @@ apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: - name: argowf-chaos-bank-of-anthos-resiliency- + name: argowf-chaos-bank-of-anthos-resiliency namespace: litmus labels: subject: "{{workflow.parameters.appNamespace}}_bank-of-anthos" @@ -41,7 +41,7 @@ spec: image: litmuschaos/k8s:latest command: [sh, -c] args: - - "kubectl apply -f https://hub.litmuschaos.io/api/chaos/master?file=charts/generic/experiments.yaml -n + - "kubectl apply -f https://hub.litmuschaos.io/api/chaos/master?file=faults/kubernetes/experiments.yaml -n {{workflow.parameters.adminModeNamespace}} ; sleep 30" - name: pod-network-loss diff --git a/experiments/bank-of-anthos/experiment_cron.yaml b/experiments/bank-of-anthos/experiment_cron.yaml index 3222b99..85ac8df 100644 --- a/experiments/bank-of-anthos/experiment_cron.yaml +++ b/experiments/bank-of-anthos/experiment_cron.yaml @@ -1,7 +1,7 @@ apiVersion: argoproj.io/v1alpha1 kind: CronWorkflow metadata: - name: argowf-chaos-bank-of-anthos-resiliency-cron-wf- + name: argowf-chaos-bank-of-anthos-resiliency-cron-wf namespace: litmus labels: subject: "{{workflow.parameters.appNamespace}}_bank-of-anthos" @@ -45,7 +45,7 @@ spec: image: litmuschaos/k8s:latest command: [sh, -c] args: - - "kubectl apply -f https://hub.litmuschaos.io/api/chaos/master?file=charts/generic/experiments.yaml -n + - "kubectl apply -f https://hub.litmuschaos.io/api/chaos/master?file=faults/kubernetes/experiments.yaml -n {{workflow.parameters.adminModeNamespace}} ; sleep 30" - name: pod-network-loss diff --git a/experiments/icons/namespaced-scope-chaos.png b/experiments/icons/namespaced-scope-chaos.png new file mode 100644 index 0000000000000000000000000000000000000000..16aa7b417698ef0d66f130fe9b3218f25fa6f356 GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49p>(E{-7;jBn@e_YV#fIeuQ7g^T4ylTJ`q zg1CrpkM->C&R^mk&6B&2oo)RkuFzBEkb1r1%RWh_y3XRYCsm3X9RilQCUiLj z_*vStc(X7GDZIzMgm4+nQtI%y}<9r|`+Y zT%_}SrPbzor*AKk;m%QSYu}ae%Eew*{{7-33+fV9vF>`;r>@7Uq4P-xpGRLliI)saTo`SRHK8kKn4p_?~3b<&(HG;{*eC@e$L}X zE*Q3sZDq9 zZk*-ez2Q}Kg7(t$Q97DiqaGYvFB?@i{rjylw?kLHROqW;xx4ChEoYAqXX=7g^IYE9 zp9q|?qxAEPS5`Ki5->-=g6zuc1CtePYqm?DVD3%ekml44nCeq7bMe~#Iaf}&ElE>3 zCwT3qaq|?LTaUBZuO-fCE7-dw?Do59Pi}ZUTK%PBzUIv~EB^9l_xvs27T*w? zxnRka;K|I5+y4K$CBNg7YtxncIv@47Dqpp|a>;n>Z)QVo>A?G*?_G8H_mr8g+~ucx zp*KQlE$eG&;K1E=TH@^~o2&<(M>yIxz+x8`h%PK?oGhuHEP8?*r&e*)xG89G`#rr< zWZ5E??*3c(wZ*xJp7hZ%i{pII^a|OoU4-B3~ z-23`!wp+ZLfpco7Cezo7?YmB8tbHg`QtG;7j^W%zpTd(|ChAO`Ug^K{nfB+Sa{n01 X?;ErEthk>7%x?^yu6{1-oD!Muz|EUCYsKzOu{|fY$HZ1owFVa0i-~Z4BS0sX!U7kOhT!o}BA&QPn&CMR zSWg-v@=vC<^{|+z2^vA*W26}n@8T9NY;~^4s4r?}nhlZeaqA1+S3!ZA$;N99g@m*u z@U*BtBxVN7X~v8@%wx@jL{9>F{`bJ_DyqM)(md8pNG6kJxYR$E7VE--Jh-leZbG7+ z1#;^{`~$+=0yPs7?Fi)YFMMy3xQg;g+6u`nVS#|ILZTIcJpRGzxa&fVC3F%Jtq6>= z>VsRHdaRR>XhmRzbzkO)4m8Ki8O#DT5)!>Eusgd2LPW~TlOI3F#6L-j8vi7? zsOTaj+7M_L|0HT_rkJmF5fW_(JjMEdYW$Pn7O0Dml!=b?P5K{>p=C4SRzlGT+|w4N zV~69k?WEj?5YX%3d(Xk_ObL@~H&m4QA&#+2ZbMw

HB7ZQq_VECp5r@><_$Ah)r1XEz-eM1~rs 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 literal 0 HcmV?d00001 diff --git a/experiments/icons/pod-cpu-hog.png b/experiments/icons/pod-cpu-hog.png new file mode 100644 index 0000000000000000000000000000000000000000..c152ab51866cfcfcf610aa67ad96de484026662b GIT binary patch literal 2078 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 S2e4KE0000