Compare commits
71 Commits
3.0.0-beta
...
master
Author | SHA1 | Date |
---|---|---|
|
e7b4e7dbe4 | |
|
62a4986c78 | |
|
d626cf3ec4 | |
|
59125424c3 | |
|
2e7ff836fc | |
|
e61d5b33be | |
|
14fe30c956 | |
|
4ae08899e0 | |
|
2c38220cca | |
|
07de11eeee | |
|
5c22472290 | |
|
e7b3fb6f9f | |
|
e1eaea9110 | |
|
491dc5e31a | |
|
caae228e35 | |
|
34a62d87f3 | |
|
8246ff891b | |
|
9b29558585 | |
|
c7ab5a3d7c | |
|
3bef3ad67e | |
|
b2f68a6ad1 | |
|
cd2ec26083 | |
|
7e08c69750 | |
|
3ef23b01f9 | |
|
0cd6c6fae3 | |
|
6a386d1410 | |
|
fc646d678c | |
|
6257c1abb8 | |
|
755a562efe | |
|
d0814df9ea | |
|
a6012039fd | |
|
a1f602ba98 | |
|
7476994a36 | |
|
3440fb84eb | |
|
652e6b8465 | |
|
996f3b3f5f | |
|
e73f3bfb21 | |
|
054d091dce | |
|
c362119e05 | |
|
31bf293140 | |
|
9569c8b2f4 | |
|
4f9f4e0540 | |
|
399ccd68a0 | |
|
35958eae38 | |
|
003a3dc02c | |
|
d4eed32a6d | |
|
af7322bece | |
|
bd853f6e25 | |
|
cfdb205ca3 | |
|
f051d5ac7c | |
|
10e9b774a8 | |
|
9689f74fce | |
|
d273ba628b | |
|
2315eaf2a4 | |
|
f2b2c2747a | |
|
66d01011bb | |
|
a440615a51 | |
|
78eec36b79 | |
|
b5a24b4044 | |
|
6d26c21506 | |
|
5554a29ea2 | |
|
5f0d882912 | |
|
eef3b4021d | |
|
96f6571e77 | |
|
b9f897be21 | |
|
c2f8f79ab9 | |
|
69927489d2 | |
|
bdddd0d803 | |
|
1b75f78632 | |
|
b710216113 | |
|
392ea29800 |
|
@ -12,19 +12,12 @@ jobs:
|
|||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: '1.20'
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
#TODO: Add Dockerfile linting
|
||||
# Running go-lint
|
||||
- name: Checking Go-Lint
|
||||
run : |
|
||||
sudo apt-get update && sudo apt-get install golint
|
||||
make gotasks
|
||||
|
||||
- name: gofmt check
|
||||
run: |
|
||||
if [ "$(gofmt -s -l . | wc -l)" -ne 0 ]
|
||||
|
@ -33,9 +26,21 @@ jobs:
|
|||
gofmt -s -l .
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
- name: golangci-lint
|
||||
uses: reviewdog/action-golangci-lint@v1
|
||||
uses: reviewdog/action-golangci-lint@v1
|
||||
|
||||
gitleaks-scan:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Run GitLeaks
|
||||
run: |
|
||||
wget https://github.com/gitleaks/gitleaks/releases/download/v8.18.2/gitleaks_8.18.2_linux_x64.tar.gz && \
|
||||
tar -zxvf gitleaks_8.18.2_linux_x64.tar.gz && \
|
||||
sudo mv gitleaks /usr/local/bin && gitleaks detect --source . -v
|
||||
|
||||
build:
|
||||
needs: pre-checks
|
||||
|
@ -44,7 +49,7 @@ jobs:
|
|||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: '1.20'
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
|
@ -68,6 +73,7 @@ jobs:
|
|||
file: build/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: litmuschaos/go-runner:ci
|
||||
build-args: LITMUS_VERSION=3.10.0
|
||||
|
||||
trivy:
|
||||
needs: pre-checks
|
||||
|
@ -79,8 +85,8 @@ jobs:
|
|||
|
||||
- name: Build an image from Dockerfile
|
||||
run: |
|
||||
docker build -f build/Dockerfile -t docker.io/litmuschaos/go-runner:${{ github.sha }} . --build-arg TARGETARCH=amd64
|
||||
|
||||
docker build -f build/Dockerfile -t docker.io/litmuschaos/go-runner:${{ github.sha }} . --build-arg TARGETARCH=amd64 --build-arg LITMUS_VERSION=3.10.0
|
||||
|
||||
- name: Run Trivy vulnerability scanner
|
||||
uses: aquasecurity/trivy-action@master
|
||||
with:
|
||||
|
@ -89,4 +95,4 @@ jobs:
|
|||
exit-code: '1'
|
||||
ignore-unfixed: true
|
||||
vuln-type: 'os,library'
|
||||
severity: 'CRITICAL,HIGH'
|
||||
severity: 'CRITICAL,HIGH'
|
|
@ -13,16 +13,9 @@ jobs:
|
|||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: '1.20'
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
#TODO: Add Dockerfile linting
|
||||
# Running go-lint
|
||||
- name: Checking Go-Lint
|
||||
run : |
|
||||
sudo apt-get update && sudo apt-get install golint
|
||||
make gotasks
|
||||
|
||||
- name: gofmt check
|
||||
run: |
|
||||
if [ "$(gofmt -s -l . | wc -l)" -ne 0 ]
|
||||
|
@ -31,9 +24,9 @@ jobs:
|
|||
gofmt -s -l .
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
- name: golangci-lint
|
||||
uses: reviewdog/action-golangci-lint@v1
|
||||
uses: reviewdog/action-golangci-lint@v1
|
||||
|
||||
push:
|
||||
needs: pre-checks
|
||||
|
@ -43,7 +36,7 @@ jobs:
|
|||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: '1.20'
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Set up QEMU
|
||||
|
@ -70,3 +63,4 @@ jobs:
|
|||
file: build/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: litmuschaos/go-runner:ci
|
||||
build-args: LITMUS_VERSION=3.10.0
|
|
@ -8,29 +8,21 @@ on:
|
|||
jobs:
|
||||
pre-checks:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
||||
steps:
|
||||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: '1.20'
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
#TODO: Add Dockerfile linting
|
||||
# Running go-lint
|
||||
- name: Checking Go-Lint
|
||||
run : |
|
||||
sudo apt-get update && sudo apt-get install golint
|
||||
make gotasks
|
||||
push:
|
||||
needs: pre-checks
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: '1.20'
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Set Tag
|
||||
|
@ -43,7 +35,7 @@ jobs:
|
|||
run: |
|
||||
echo "RELEASE TAG: ${RELEASE_TAG}"
|
||||
echo "${RELEASE_TAG}" > ${{ github.workspace }}/tag.txt
|
||||
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
with:
|
||||
|
@ -63,10 +55,11 @@ jobs:
|
|||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v2
|
||||
env:
|
||||
env:
|
||||
RELEASE_TAG: ${{ env.RELEASE_TAG }}
|
||||
with:
|
||||
push: true
|
||||
file: build/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: litmuschaos/go-runner:${{ env.RELEASE_TAG }},litmuschaos/go-runner:latest
|
||||
build-args: LITMUS_VERSION=3.10.0
|
|
@ -9,215 +9,15 @@ on:
|
|||
- '**.yaml'
|
||||
|
||||
jobs:
|
||||
# Helm_Install_Generic_Tests:
|
||||
# runs-on: ubuntu-18.04
|
||||
# steps:
|
||||
|
||||
# - uses: actions/checkout@v2
|
||||
# with:
|
||||
# ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
# - name: Generate go binary and build docker image
|
||||
# run: make build-amd64
|
||||
|
||||
# #Install and configure a kind cluster
|
||||
# - name: Installing KinD cluster for the test
|
||||
# uses: engineerd/setup-kind@v0.5.0
|
||||
# with:
|
||||
# version: "v0.7.0"
|
||||
# config: "build/kind-cluster/kind-config.yaml"
|
||||
|
||||
# - name: Configuring and testing the Installation
|
||||
# run: |
|
||||
# kubectl taint nodes kind-control-plane node-role.kubernetes.io/master-
|
||||
# kind get kubeconfig --internal >$HOME/.kube/config
|
||||
# kubectl cluster-info --context kind-kind
|
||||
# kubectl get nodes
|
||||
|
||||
# - name: Load docker image
|
||||
# run: /usr/local/bin/kind load docker-image litmuschaos/go-runner:ci
|
||||
|
||||
# - name: Deploy a sample application for chaos injection
|
||||
# run: |
|
||||
# kubectl apply -f https://raw.githubusercontent.com/litmuschaos/chaos-ci-lib/master/app/nginx.yml
|
||||
# kubectl wait --for=condition=Ready pods --all --namespace default --timeout=90s
|
||||
|
||||
# - name: Setting up kubeconfig ENV for Github Chaos Action
|
||||
# run: echo ::set-env name=KUBE_CONFIG_DATA::$(base64 -w 0 ~/.kube/config)
|
||||
# env:
|
||||
# ACTIONS_ALLOW_UNSECURE_COMMANDS: true
|
||||
|
||||
# - name: Setup Litmus
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# INSTALL_LITMUS: true
|
||||
|
||||
# - name: Running Litmus pod delete chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: pod-delete
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
|
||||
# - name: Running container kill chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: container-kill
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# CONTAINER_RUNTIME: containerd
|
||||
|
||||
# - name: Running node-cpu-hog chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: node-cpu-hog
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
|
||||
|
||||
# - name: Running node-memory-hog chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: node-memory-hog
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
|
||||
# - name: Running pod-cpu-hog chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: pod-cpu-hog
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# TARGET_CONTAINER: nginx
|
||||
# TOTAL_CHAOS_DURATION: 60
|
||||
# CPU_CORES: 1
|
||||
|
||||
# - name: Running pod-memory-hog chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: pod-memory-hog
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# TARGET_CONTAINER: nginx
|
||||
# TOTAL_CHAOS_DURATION: 60
|
||||
# MEMORY_CONSUMPTION: 500
|
||||
|
||||
# - name: Running pod network corruption chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: pod-network-corruption
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# TARGET_CONTAINER: nginx
|
||||
# TOTAL_CHAOS_DURATION: 60
|
||||
# NETWORK_INTERFACE: eth0
|
||||
# CONTAINER_RUNTIME: containerd
|
||||
|
||||
# - name: Running pod network duplication chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: pod-network-duplication
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# TARGET_CONTAINER: nginx
|
||||
# TOTAL_CHAOS_DURATION: 60
|
||||
# NETWORK_INTERFACE: eth0
|
||||
# CONTAINER_RUNTIME: containerd
|
||||
|
||||
# - name: Running pod-network-latency chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: pod-network-latency
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# TARGET_CONTAINER: nginx
|
||||
# TOTAL_CHAOS_DURATION: 60
|
||||
# NETWORK_INTERFACE: eth0
|
||||
# NETWORK_LATENCY: 60000
|
||||
# CONTAINER_RUNTIME: containerd
|
||||
|
||||
# - name: Running pod-network-loss chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: pod-network-loss
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# TARGET_CONTAINER: nginx
|
||||
# TOTAL_CHAOS_DURATION: 60
|
||||
# NETWORK_INTERFACE: eth0
|
||||
# NETWORK_PACKET_LOSS_PERCENTAGE: 100
|
||||
# CONTAINER_RUNTIME: containerd
|
||||
|
||||
# - name: Running pod autoscaler chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: pod-autoscaler
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# TOTAL_CHAOS_DURATION: 60
|
||||
|
||||
# - name: Running node-io-stress chaos experiment
|
||||
# if: always()
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# EXPERIMENT_NAME: node-io-stress
|
||||
# EXPERIMENT_IMAGE: litmuschaos/go-runner
|
||||
# EXPERIMENT_IMAGE_TAG: ci
|
||||
# IMAGE_PULL_POLICY: IfNotPresent
|
||||
# JOB_CLEANUP_POLICY: delete
|
||||
# TOTAL_CHAOS_DURATION: 120
|
||||
# FILESYSTEM_UTILIZATION_PERCENTAGE: 10
|
||||
|
||||
# - name: Uninstall Litmus
|
||||
# uses: litmuschaos/github-chaos-actions@master
|
||||
# env:
|
||||
# LITMUS_CLEANUP: true
|
||||
|
||||
# - name: Deleting KinD cluster
|
||||
# if: always()
|
||||
# run: kind delete cluster
|
||||
|
||||
Pod_Level_In_Serial_Mode:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: '1.20'
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
|
@ -226,94 +26,16 @@ jobs:
|
|||
- name: Generating Go binary and Building docker image
|
||||
run: |
|
||||
make build-amd64
|
||||
#Install and configure a kind cluster
|
||||
- name: Installing Prerequisites (K3S Cluster)
|
||||
env:
|
||||
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
|
||||
run: |
|
||||
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.21.11+k3s1 sh -s - --docker --write-kubeconfig-mode 664
|
||||
kubectl wait node --all --for condition=ready --timeout=90s
|
||||
kubectl get nodes
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: 'litmuschaos/litmus-e2e'
|
||||
ref: 'master'
|
||||
|
||||
- name: Running Pod level experiment with affected percentage 100 and in series mode
|
||||
env:
|
||||
GO_EXPERIMENT_IMAGE: litmuschaos/go-runner:ci
|
||||
EXPERIMENT_IMAGE_PULL_POLICY: IfNotPresent
|
||||
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
|
||||
run: |
|
||||
make build-litmus
|
||||
make app-deploy
|
||||
make pod-affected-perc-ton-series
|
||||
- name: Deleting K3S cluster
|
||||
if: always()
|
||||
run: /usr/local/bin/k3s-uninstall.sh
|
||||
|
||||
Pod_Level_In_Parallel_Mode:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.18
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
- name: Generating Go binary and Building docker image
|
||||
- name: Install KinD
|
||||
run: |
|
||||
make build-amd64
|
||||
#Install and configure a kind cluster
|
||||
- name: Installing Prerequisites (K3S Cluster)
|
||||
env:
|
||||
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
|
||||
run: |
|
||||
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.21.11+k3s1 sh -s - --docker --write-kubeconfig-mode 664
|
||||
kubectl wait node --all --for condition=ready --timeout=90s
|
||||
kubectl get nodes
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: 'litmuschaos/litmus-e2e'
|
||||
ref: 'master'
|
||||
|
||||
- name: Running Pod level experiment with affected percentage 100 and in parallel mode
|
||||
env:
|
||||
GO_EXPERIMENT_IMAGE: litmuschaos/go-runner:ci
|
||||
EXPERIMENT_IMAGE_PULL_POLICY: IfNotPresent
|
||||
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
|
||||
run: |
|
||||
make build-litmus
|
||||
make app-deploy
|
||||
make pod-affected-perc-ton-parallel
|
||||
- name: Deleting K3S cluster
|
||||
if: always()
|
||||
run: /usr/local/bin/k3s-uninstall.sh
|
||||
|
||||
Node_Level_Tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
# Install golang
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.18
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
- name: Generating Go binary and Building docker image
|
||||
run: |
|
||||
make build-amd64
|
||||
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
|
||||
chmod +x ./kind
|
||||
mv ./kind /usr/local/bin/kind
|
||||
|
||||
- name: Create KinD Cluster
|
||||
run: kind create cluster --config build/kind-cluster/kind-config.yaml
|
||||
run: |
|
||||
kind create cluster --config build/kind-cluster/kind-config.yaml
|
||||
|
||||
- name: Configuring and testing the Installation
|
||||
run: |
|
||||
|
@ -324,7 +46,123 @@ jobs:
|
|||
|
||||
- name: Load image on the nodes of the cluster
|
||||
run: |
|
||||
kind load docker-image --name=kind litmuschaos/go-runner:ci
|
||||
kind load docker-image --name=kind litmuschaos/go-runner:ci
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: 'litmuschaos/litmus-e2e'
|
||||
ref: 'master'
|
||||
|
||||
- name: Running Pod level experiment with affected percentage 100 and in series mode
|
||||
env:
|
||||
GO_EXPERIMENT_IMAGE: litmuschaos/go-runner:ci
|
||||
EXPERIMENT_IMAGE_PULL_POLICY: IfNotPresent
|
||||
KUBECONFIG: /home/runner/.kube/config
|
||||
run: |
|
||||
make build-litmus
|
||||
make app-deploy
|
||||
make pod-affected-perc-ton-series
|
||||
|
||||
- name: Deleting KinD cluster
|
||||
if: always()
|
||||
run: kind delete cluster
|
||||
|
||||
Pod_Level_In_Parallel_Mode:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
# Install golang
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.20'
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
- name: Generating Go binary and Building docker image
|
||||
run: |
|
||||
make build-amd64
|
||||
|
||||
- name: Install KinD
|
||||
run: |
|
||||
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
|
||||
chmod +x ./kind
|
||||
mv ./kind /usr/local/bin/kind
|
||||
|
||||
- name: Create KinD Cluster
|
||||
run: |
|
||||
kind create cluster --config build/kind-cluster/kind-config.yaml
|
||||
|
||||
- name: Configuring and testing the Installation
|
||||
env:
|
||||
KUBECONFIG: /home/runner/.kube/config
|
||||
run: |
|
||||
kubectl taint nodes kind-control-plane node-role.kubernetes.io/control-plane-
|
||||
kubectl cluster-info --context kind-kind
|
||||
kubectl wait node --all --for condition=ready --timeout=90s
|
||||
kubectl get nodes
|
||||
|
||||
- name: Load image on the nodes of the cluster
|
||||
run: |
|
||||
kind load docker-image --name=kind litmuschaos/go-runner:ci
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: 'litmuschaos/litmus-e2e'
|
||||
ref: 'master'
|
||||
|
||||
- name: Running Pod level experiment with affected percentage 100 and in parallel mode
|
||||
env:
|
||||
GO_EXPERIMENT_IMAGE: litmuschaos/go-runner:ci
|
||||
EXPERIMENT_IMAGE_PULL_POLICY: IfNotPresent
|
||||
KUBECONFIG: /home/runner/.kube/config
|
||||
run: |
|
||||
make build-litmus
|
||||
make app-deploy
|
||||
make pod-affected-perc-ton-parallel
|
||||
|
||||
- name: Deleting KinD cluster
|
||||
if: always()
|
||||
run: kind delete cluster
|
||||
|
||||
Node_Level_Tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
# Install golang
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.20'
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
- name: Generating Go binary and Building docker image
|
||||
run: |
|
||||
make build-amd64
|
||||
|
||||
- name: Install KinD
|
||||
run: |
|
||||
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
|
||||
chmod +x ./kind
|
||||
mv ./kind /usr/local/bin/kind
|
||||
|
||||
- name: Create KinD Cluster
|
||||
run: |
|
||||
kind create cluster --config build/kind-cluster/kind-config.yaml
|
||||
|
||||
- name: Configuring and testing the Installation
|
||||
run: |
|
||||
kubectl taint nodes kind-control-plane node-role.kubernetes.io/control-plane-
|
||||
kubectl cluster-info --context kind-kind
|
||||
kubectl wait node --all --for condition=ready --timeout=90s
|
||||
kubectl get nodes
|
||||
|
||||
- name: Load image on the nodes of the cluster
|
||||
run: |
|
||||
kind load docker-image --name=kind litmuschaos/go-runner:ci
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
|
@ -355,4 +193,6 @@ jobs:
|
|||
|
||||
- name: Deleting KinD cluster
|
||||
if: always()
|
||||
run: kind delete cluster
|
||||
run: |
|
||||
kubectl get nodes
|
||||
kind delete cluster
|
||||
|
|
|
@ -4,14 +4,6 @@ on:
|
|||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
snyk:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- name: Run Snyk to check for vulnerabilities
|
||||
uses: snyk/actions/golang@master
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
|
||||
trivy:
|
||||
runs-on: ubuntu-latest
|
||||
|
@ -22,7 +14,7 @@ jobs:
|
|||
|
||||
- name: Build an image from Dockerfile
|
||||
run: |
|
||||
docker build -f build/Dockerfile -t docker.io/litmuschaos/go-runner:${{ github.sha }} . --build-arg TARGETARCH=amd64
|
||||
docker build -f build/Dockerfile -t docker.io/litmuschaos/go-runner:${{ github.sha }} . --build-arg TARGETARCH=amd64 --build-arg LITMUS_VERSION=3.9.0
|
||||
|
||||
- name: Run Trivy vulnerability scanner
|
||||
uses: aquasecurity/trivy-action@master
|
||||
|
|
16
Makefile
16
Makefile
|
@ -31,7 +31,7 @@ deps: _build_check_docker
|
|||
|
||||
_build_check_docker:
|
||||
@echo "------------------"
|
||||
@echo "--> Check the Docker deps"
|
||||
@echo "--> Check the Docker deps"
|
||||
@echo "------------------"
|
||||
@if [ $(IS_DOCKER_INSTALLED) -eq 1 ]; \
|
||||
then echo "" \
|
||||
|
@ -56,7 +56,7 @@ unused-package-check:
|
|||
.PHONY: docker.buildx
|
||||
docker.buildx:
|
||||
@echo "------------------------------"
|
||||
@echo "--> Setting up Builder "
|
||||
@echo "--> Setting up Builder "
|
||||
@echo "------------------------------"
|
||||
@if ! docker buildx ls | grep -q multibuilder; then\
|
||||
docker buildx create --name multibuilder;\
|
||||
|
@ -69,27 +69,27 @@ push: docker.buildx image-push
|
|||
|
||||
image-push:
|
||||
@echo "------------------------"
|
||||
@echo "--> Push go-runner image"
|
||||
@echo "--> Push go-runner image"
|
||||
@echo "------------------------"
|
||||
@echo "Pushing $(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG)"
|
||||
@docker buildx build . --push --file build/Dockerfile --progress plane --platform linux/arm64,linux/amd64 --no-cache --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG)
|
||||
@docker buildx build . --push --file build/Dockerfile --progress plain --platform linux/arm64,linux/amd64 --no-cache --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG)
|
||||
|
||||
|
||||
.PHONY: build-amd64
|
||||
build-amd64:
|
||||
@echo "-------------------------"
|
||||
@echo "--> Build go-runner image"
|
||||
@echo "--> Build go-runner image"
|
||||
@echo "-------------------------"
|
||||
@sudo docker build --file build/Dockerfile --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) . --build-arg TARGETARCH=amd64
|
||||
@sudo docker build --file build/Dockerfile --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) . --build-arg TARGETARCH=amd64 --build-arg LITMUS_VERSION=3.9.0
|
||||
|
||||
.PHONY: push-amd64
|
||||
push-amd64:
|
||||
|
||||
@echo "------------------------------"
|
||||
@echo "--> Pushing image"
|
||||
@echo "--> Pushing image"
|
||||
@echo "------------------------------"
|
||||
@sudo docker push $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG)
|
||||
|
||||
|
||||
.PHONY: trivy-check
|
||||
trivy-check:
|
||||
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"flag"
|
||||
"os"
|
||||
|
||||
// Uncomment to load all auth plugins
|
||||
// _ "k8s.io/client-go/plugin/pkg/client/auth"
|
||||
|
||||
|
@ -11,6 +15,8 @@ import (
|
|||
// _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
|
||||
// _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
|
||||
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
awsSSMChaosByID "github.com/litmuschaos/litmus-go/experiments/aws-ssm/aws-ssm-chaos-by-id/experiment"
|
||||
awsSSMChaosByTag "github.com/litmuschaos/litmus-go/experiments/aws-ssm/aws-ssm-chaos-by-tag/experiment"
|
||||
azureDiskLoss "github.com/litmuschaos/litmus-go/experiments/azure/azure-disk-loss/experiment"
|
||||
|
@ -51,16 +57,19 @@ import (
|
|||
podNetworkLatency "github.com/litmuschaos/litmus-go/experiments/generic/pod-network-latency/experiment"
|
||||
podNetworkLoss "github.com/litmuschaos/litmus-go/experiments/generic/pod-network-loss/experiment"
|
||||
podNetworkPartition "github.com/litmuschaos/litmus-go/experiments/generic/pod-network-partition/experiment"
|
||||
podNetworkRateLimit "github.com/litmuschaos/litmus-go/experiments/generic/pod-network-rate-limit/experiment"
|
||||
kafkaBrokerPodFailure "github.com/litmuschaos/litmus-go/experiments/kafka/kafka-broker-pod-failure/experiment"
|
||||
ebsLossByID "github.com/litmuschaos/litmus-go/experiments/kube-aws/ebs-loss-by-id/experiment"
|
||||
ebsLossByTag "github.com/litmuschaos/litmus-go/experiments/kube-aws/ebs-loss-by-tag/experiment"
|
||||
ec2TerminateByID "github.com/litmuschaos/litmus-go/experiments/kube-aws/ec2-terminate-by-id/experiment"
|
||||
ec2TerminateByTag "github.com/litmuschaos/litmus-go/experiments/kube-aws/ec2-terminate-by-tag/experiment"
|
||||
rdsInstanceStop "github.com/litmuschaos/litmus-go/experiments/kube-aws/rds-instance-stop/experiment"
|
||||
k6Loadgen "github.com/litmuschaos/litmus-go/experiments/load/k6-loadgen/experiment"
|
||||
springBootFaults "github.com/litmuschaos/litmus-go/experiments/spring-boot/spring-boot-faults/experiment"
|
||||
vmpoweroff "github.com/litmuschaos/litmus-go/experiments/vmware/vm-poweroff/experiment"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
cli "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
|
@ -74,8 +83,25 @@ func init() {
|
|||
}
|
||||
|
||||
func main() {
|
||||
initCtx := context.Background()
|
||||
|
||||
clients := clients.ClientSets{}
|
||||
// Set up Observability.
|
||||
if otelExporterEndpoint := os.Getenv(telemetry.OTELExporterOTLPEndpoint); otelExporterEndpoint != "" {
|
||||
shutdown, err := telemetry.InitOTelSDK(initCtx, true, otelExporterEndpoint)
|
||||
if err != nil {
|
||||
log.Errorf("Failed to initialize OTel SDK: %v", err)
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
err = errors.Join(err, shutdown(initCtx))
|
||||
}()
|
||||
initCtx = telemetry.GetTraceParentContext()
|
||||
}
|
||||
|
||||
clients := cli.ClientSets{}
|
||||
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(initCtx, "ExecuteExperiment")
|
||||
defer span.End()
|
||||
|
||||
// parse the experiment name
|
||||
experimentName := flag.String("name", "pod-delete", "name of the chaos experiment")
|
||||
|
@ -91,99 +117,105 @@ func main() {
|
|||
// invoke the corresponding experiment based on the (-name) flag
|
||||
switch *experimentName {
|
||||
case "container-kill":
|
||||
containerKill.ContainerKill(clients)
|
||||
containerKill.ContainerKill(ctx, clients)
|
||||
case "disk-fill":
|
||||
diskFill.DiskFill(clients)
|
||||
diskFill.DiskFill(ctx, clients)
|
||||
case "kafka-broker-pod-failure":
|
||||
kafkaBrokerPodFailure.KafkaBrokerPodFailure(clients)
|
||||
kafkaBrokerPodFailure.KafkaBrokerPodFailure(ctx, clients)
|
||||
case "kubelet-service-kill":
|
||||
kubeletServiceKill.KubeletServiceKill(clients)
|
||||
kubeletServiceKill.KubeletServiceKill(ctx, clients)
|
||||
case "docker-service-kill":
|
||||
dockerServiceKill.DockerServiceKill(clients)
|
||||
dockerServiceKill.DockerServiceKill(ctx, clients)
|
||||
case "node-cpu-hog":
|
||||
nodeCPUHog.NodeCPUHog(clients)
|
||||
nodeCPUHog.NodeCPUHog(ctx, clients)
|
||||
case "node-drain":
|
||||
nodeDrain.NodeDrain(clients)
|
||||
nodeDrain.NodeDrain(ctx, clients)
|
||||
case "node-io-stress":
|
||||
nodeIOStress.NodeIOStress(clients)
|
||||
nodeIOStress.NodeIOStress(ctx, clients)
|
||||
case "node-memory-hog":
|
||||
nodeMemoryHog.NodeMemoryHog(clients)
|
||||
nodeMemoryHog.NodeMemoryHog(ctx, clients)
|
||||
case "node-taint":
|
||||
nodeTaint.NodeTaint(clients)
|
||||
nodeTaint.NodeTaint(ctx, clients)
|
||||
case "pod-autoscaler":
|
||||
podAutoscaler.PodAutoscaler(clients)
|
||||
podAutoscaler.PodAutoscaler(ctx, clients)
|
||||
case "pod-cpu-hog-exec":
|
||||
podCPUHogExec.PodCPUHogExec(clients)
|
||||
podCPUHogExec.PodCPUHogExec(ctx, clients)
|
||||
case "pod-delete":
|
||||
podDelete.PodDelete(clients)
|
||||
podDelete.PodDelete(ctx, clients)
|
||||
case "pod-io-stress":
|
||||
podIOStress.PodIOStress(clients)
|
||||
podIOStress.PodIOStress(ctx, clients)
|
||||
case "pod-memory-hog-exec":
|
||||
podMemoryHogExec.PodMemoryHogExec(clients)
|
||||
podMemoryHogExec.PodMemoryHogExec(ctx, clients)
|
||||
case "pod-network-corruption":
|
||||
podNetworkCorruption.PodNetworkCorruption(clients)
|
||||
podNetworkCorruption.PodNetworkCorruption(ctx, clients)
|
||||
case "pod-network-duplication":
|
||||
podNetworkDuplication.PodNetworkDuplication(clients)
|
||||
podNetworkDuplication.PodNetworkDuplication(ctx, clients)
|
||||
case "pod-network-latency":
|
||||
podNetworkLatency.PodNetworkLatency(clients)
|
||||
podNetworkLatency.PodNetworkLatency(ctx, clients)
|
||||
case "pod-network-loss":
|
||||
podNetworkLoss.PodNetworkLoss(clients)
|
||||
podNetworkLoss.PodNetworkLoss(ctx, clients)
|
||||
case "pod-network-partition":
|
||||
podNetworkPartition.PodNetworkPartition(clients)
|
||||
podNetworkPartition.PodNetworkPartition(ctx, clients)
|
||||
case "pod-network-rate-limit":
|
||||
podNetworkRateLimit.PodNetworkRateLimit(ctx, clients)
|
||||
case "pod-memory-hog":
|
||||
podMemoryHog.PodMemoryHog(clients)
|
||||
podMemoryHog.PodMemoryHog(ctx, clients)
|
||||
case "pod-cpu-hog":
|
||||
podCPUHog.PodCPUHog(clients)
|
||||
podCPUHog.PodCPUHog(ctx, clients)
|
||||
case "cassandra-pod-delete":
|
||||
cassandraPodDelete.CasssandraPodDelete(clients)
|
||||
cassandraPodDelete.CasssandraPodDelete(ctx, clients)
|
||||
case "aws-ssm-chaos-by-id":
|
||||
awsSSMChaosByID.AWSSSMChaosByID(clients)
|
||||
awsSSMChaosByID.AWSSSMChaosByID(ctx, clients)
|
||||
case "aws-ssm-chaos-by-tag":
|
||||
awsSSMChaosByTag.AWSSSMChaosByTag(clients)
|
||||
awsSSMChaosByTag.AWSSSMChaosByTag(ctx, clients)
|
||||
case "ec2-terminate-by-id":
|
||||
ec2TerminateByID.EC2TerminateByID(clients)
|
||||
ec2TerminateByID.EC2TerminateByID(ctx, clients)
|
||||
case "ec2-terminate-by-tag":
|
||||
ec2TerminateByTag.EC2TerminateByTag(clients)
|
||||
ec2TerminateByTag.EC2TerminateByTag(ctx, clients)
|
||||
case "ebs-loss-by-id":
|
||||
ebsLossByID.EBSLossByID(clients)
|
||||
ebsLossByID.EBSLossByID(ctx, clients)
|
||||
case "ebs-loss-by-tag":
|
||||
ebsLossByTag.EBSLossByTag(clients)
|
||||
ebsLossByTag.EBSLossByTag(ctx, clients)
|
||||
case "rds-instance-stop":
|
||||
rdsInstanceStop.RDSInstanceStop(ctx, clients)
|
||||
case "node-restart":
|
||||
nodeRestart.NodeRestart(clients)
|
||||
nodeRestart.NodeRestart(ctx, clients)
|
||||
case "pod-dns-error":
|
||||
podDNSError.PodDNSError(clients)
|
||||
podDNSError.PodDNSError(ctx, clients)
|
||||
case "pod-dns-spoof":
|
||||
podDNSSpoof.PodDNSSpoof(clients)
|
||||
podDNSSpoof.PodDNSSpoof(ctx, clients)
|
||||
case "pod-http-latency":
|
||||
podHttpLatency.PodHttpLatency(clients)
|
||||
podHttpLatency.PodHttpLatency(ctx, clients)
|
||||
case "pod-http-status-code":
|
||||
podHttpStatusCode.PodHttpStatusCode(clients)
|
||||
podHttpStatusCode.PodHttpStatusCode(ctx, clients)
|
||||
case "pod-http-modify-header":
|
||||
podHttpModifyHeader.PodHttpModifyHeader(clients)
|
||||
podHttpModifyHeader.PodHttpModifyHeader(ctx, clients)
|
||||
case "pod-http-modify-body":
|
||||
podHttpModifyBody.PodHttpModifyBody(clients)
|
||||
podHttpModifyBody.PodHttpModifyBody(ctx, clients)
|
||||
case "pod-http-reset-peer":
|
||||
podHttpResetPeer.PodHttpResetPeer(clients)
|
||||
podHttpResetPeer.PodHttpResetPeer(ctx, clients)
|
||||
case "vm-poweroff":
|
||||
vmpoweroff.VMPoweroff(clients)
|
||||
vmpoweroff.VMPoweroff(ctx, clients)
|
||||
case "azure-instance-stop":
|
||||
azureInstanceStop.AzureInstanceStop(clients)
|
||||
azureInstanceStop.AzureInstanceStop(ctx, clients)
|
||||
case "azure-disk-loss":
|
||||
azureDiskLoss.AzureDiskLoss(clients)
|
||||
azureDiskLoss.AzureDiskLoss(ctx, clients)
|
||||
case "gcp-vm-disk-loss":
|
||||
gcpVMDiskLoss.VMDiskLoss(clients)
|
||||
gcpVMDiskLoss.VMDiskLoss(ctx, clients)
|
||||
case "pod-fio-stress":
|
||||
podFioStress.PodFioStress(clients)
|
||||
podFioStress.PodFioStress(ctx, clients)
|
||||
case "gcp-vm-instance-stop":
|
||||
gcpVMInstanceStop.VMInstanceStop(clients)
|
||||
gcpVMInstanceStop.VMInstanceStop(ctx, clients)
|
||||
case "redfish-node-restart":
|
||||
redfishNodeRestart.NodeRestart(clients)
|
||||
redfishNodeRestart.NodeRestart(ctx, clients)
|
||||
case "gcp-vm-instance-stop-by-label":
|
||||
gcpVMInstanceStopByLabel.GCPVMInstanceStopByLabel(clients)
|
||||
gcpVMInstanceStopByLabel.GCPVMInstanceStopByLabel(ctx, clients)
|
||||
case "gcp-vm-disk-loss-by-label":
|
||||
gcpVMDiskLossByLabel.GCPVMDiskLossByLabel(clients)
|
||||
gcpVMDiskLossByLabel.GCPVMDiskLossByLabel(ctx, clients)
|
||||
case "spring-boot-cpu-stress", "spring-boot-memory-stress", "spring-boot-exceptions", "spring-boot-app-kill", "spring-boot-faults", "spring-boot-latency":
|
||||
springBootFaults.Experiment(clients, *experimentName)
|
||||
springBootFaults.Experiment(ctx, clients, *experimentName)
|
||||
case "k6-loadgen":
|
||||
k6Loadgen.Experiment(ctx, clients)
|
||||
default:
|
||||
log.Errorf("Unsupported -name %v, please provide the correct value of -name args", *experimentName)
|
||||
return
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"flag"
|
||||
"os"
|
||||
|
||||
// Uncomment to load all auth plugins
|
||||
// _ "k8s.io/client-go/plugin/pkg/client/auth"
|
||||
|
||||
|
@ -17,10 +21,11 @@ import (
|
|||
networkChaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/network-chaos/helper"
|
||||
dnsChaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/pod-dns-chaos/helper"
|
||||
stressChaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/stress-chaos/helper"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
cli "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
@ -33,8 +38,24 @@ func init() {
|
|||
}
|
||||
|
||||
func main() {
|
||||
ctx := context.Background()
|
||||
// Set up Observability.
|
||||
if otelExporterEndpoint := os.Getenv(telemetry.OTELExporterOTLPEndpoint); otelExporterEndpoint != "" {
|
||||
shutdown, err := telemetry.InitOTelSDK(ctx, true, otelExporterEndpoint)
|
||||
if err != nil {
|
||||
log.Errorf("Failed to initialize OTel SDK: %v", err)
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
err = errors.Join(err, shutdown(ctx))
|
||||
}()
|
||||
ctx = telemetry.GetTraceParentContext()
|
||||
}
|
||||
|
||||
clients := clients.ClientSets{}
|
||||
clients := cli.ClientSets{}
|
||||
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "ExecuteExperimentHelper")
|
||||
defer span.End()
|
||||
|
||||
// parse the helper name
|
||||
helperName := flag.String("name", "", "name of the helper pod")
|
||||
|
@ -50,17 +71,17 @@ func main() {
|
|||
// invoke the corresponding helper based on the the (-name) flag
|
||||
switch *helperName {
|
||||
case "container-kill":
|
||||
containerKill.Helper(clients)
|
||||
containerKill.Helper(ctx, clients)
|
||||
case "disk-fill":
|
||||
diskFill.Helper(clients)
|
||||
diskFill.Helper(ctx, clients)
|
||||
case "dns-chaos":
|
||||
dnsChaos.Helper(clients)
|
||||
dnsChaos.Helper(ctx, clients)
|
||||
case "stress-chaos":
|
||||
stressChaos.Helper(clients)
|
||||
stressChaos.Helper(ctx, clients)
|
||||
case "network-chaos":
|
||||
networkChaos.Helper(clients)
|
||||
networkChaos.Helper(ctx, clients)
|
||||
case "http-chaos":
|
||||
httpChaos.Helper(clients)
|
||||
httpChaos.Helper(ctx, clients)
|
||||
|
||||
default:
|
||||
log.Errorf("Unsupported -name %v, please provide the correct value of -name args", *helperName)
|
||||
|
|
112
build/Dockerfile
112
build/Dockerfile
|
@ -1,6 +1,6 @@
|
|||
# Multi-stage docker build
|
||||
# Build stage
|
||||
FROM golang:1.18 AS builder
|
||||
FROM golang:1.22 AS builder
|
||||
|
||||
ARG TARGETOS=linux
|
||||
ARG TARGETARCH
|
||||
|
@ -14,27 +14,99 @@ RUN export GOOS=${TARGETOS} && \
|
|||
RUN CGO_ENABLED=0 go build -o /output/experiments ./bin/experiment
|
||||
RUN CGO_ENABLED=0 go build -o /output/helpers ./bin/helper
|
||||
|
||||
FROM alpine:3.15.0 AS dep
|
||||
|
||||
# Install generally useful things
|
||||
RUN apk --update add \
|
||||
sudo \
|
||||
iproute2 \
|
||||
iptables
|
||||
|
||||
|
||||
# Packaging stage
|
||||
# Image source: https://github.com/litmuschaos/test-tools/blob/master/custom/hardened-alpine/experiment/Dockerfile
|
||||
# The base image is non-root (have litmus user) with default litmus directory.
|
||||
FROM litmuschaos/experiment-alpine
|
||||
FROM registry.access.redhat.com/ubi9/ubi:9.4
|
||||
|
||||
LABEL maintainer="LitmusChaos"
|
||||
|
||||
COPY --from=builder /output/ /litmus
|
||||
COPY --from=dep /usr/bin/sudo /usr/bin/sudo
|
||||
COPY --from=dep /usr/lib/sudo /usr/lib/sudo
|
||||
COPY --from=dep /sbin/tc /sbin/
|
||||
COPY --from=dep /sbin/iptables /sbin/
|
||||
ARG TARGETARCH
|
||||
ARG LITMUS_VERSION
|
||||
|
||||
#Copying Necessary Files
|
||||
COPY ./pkg/cloud/aws/common/ssm-docs/LitmusChaos-AWS-SSM-Docs.yml .
|
||||
# Install generally useful things
|
||||
RUN yum install -y \
|
||||
sudo \
|
||||
sshpass \
|
||||
procps \
|
||||
openssh-clients
|
||||
|
||||
# tc binary
|
||||
RUN yum install -y https://dl.rockylinux.org/vault/rocky/9.3/devel/$(uname -m)/os/Packages/i/iproute-6.2.0-5.el9.$(uname -m).rpm
|
||||
RUN yum install -y https://dl.rockylinux.org/vault/rocky/9.3/devel/$(uname -m)/os/Packages/i/iproute-tc-6.2.0-5.el9.$(uname -m).rpm
|
||||
|
||||
# iptables
|
||||
RUN yum install -y https://dl.rockylinux.org/vault/rocky/9.3/devel/$(uname -m)/os/Packages/i/iptables-libs-1.8.8-6.el9_1.$(uname -m).rpm
|
||||
RUN yum install -y https://dl.fedoraproject.org/pub/archive/epel/9.3/Everything/$(uname -m)/Packages/i/iptables-legacy-libs-1.8.8-6.el9.2.$(uname -m).rpm
|
||||
RUN yum install -y https://dl.fedoraproject.org/pub/archive/epel/9.3/Everything/$(uname -m)/Packages/i/iptables-legacy-1.8.8-6.el9.2.$(uname -m).rpm
|
||||
|
||||
# stress-ng
|
||||
RUN yum install -y https://yum.oracle.com/repo/OracleLinux/OL9/appstream/$(uname -m)/getPackage/Judy-1.0.5-28.el9.$(uname -m).rpm
|
||||
RUN yum install -y https://yum.oracle.com/repo/OracleLinux/OL9/appstream/$(uname -m)/getPackage/stress-ng-0.14.00-2.el9.$(uname -m).rpm
|
||||
|
||||
#Installing Kubectl
|
||||
ENV KUBE_LATEST_VERSION="v1.31.0"
|
||||
RUN curl -L https://storage.googleapis.com/kubernetes-release/release/${KUBE_LATEST_VERSION}/bin/linux/${TARGETARCH}/kubectl -o /usr/bin/kubectl && \
|
||||
chmod 755 /usr/bin/kubectl
|
||||
|
||||
#Installing crictl binaries
|
||||
RUN curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.31.1/crictl-v1.31.1-linux-${TARGETARCH}.tar.gz --output crictl-v1.31.1-linux-${TARGETARCH}.tar.gz && \
|
||||
tar zxvf crictl-v1.31.1-linux-${TARGETARCH}.tar.gz -C /sbin && \
|
||||
chmod 755 /sbin/crictl
|
||||
|
||||
#Installing promql cli binaries
|
||||
RUN curl -L https://github.com/chaosnative/promql-cli/releases/download/3.0.0-beta6/promql_linux_${TARGETARCH} --output /usr/bin/promql && chmod 755 /usr/bin/promql
|
||||
|
||||
#Installing pause cli binaries
|
||||
RUN curl -L https://github.com/litmuschaos/test-tools/releases/download/${LITMUS_VERSION}/pause-linux-${TARGETARCH} --output /usr/bin/pause && chmod 755 /usr/bin/pause
|
||||
|
||||
#Installing dns_interceptor cli binaries
|
||||
RUN curl -L https://github.com/litmuschaos/test-tools/releases/download/${LITMUS_VERSION}/dns_interceptor --output /sbin/dns_interceptor && chmod 755 /sbin/dns_interceptor
|
||||
|
||||
#Installing nsutil cli binaries
|
||||
RUN curl -L https://github.com/litmuschaos/test-tools/releases/download/${LITMUS_VERSION}/nsutil-linux-${TARGETARCH} --output /sbin/nsutil && chmod 755 /sbin/nsutil
|
||||
|
||||
#Installing nsutil shared lib
|
||||
RUN curl -L https://github.com/litmuschaos/test-tools/releases/download/${LITMUS_VERSION}/nsutil_${TARGETARCH}.so --output /usr/local/lib/nsutil.so && chmod 755 /usr/local/lib/nsutil.so
|
||||
|
||||
# Installing toxiproxy binaries
|
||||
RUN curl -L https://litmus-http-proxy.s3.amazonaws.com/cli/cli/toxiproxy-cli-linux-${TARGETARCH}.tar.gz --output toxiproxy-cli-linux-${TARGETARCH}.tar.gz && \
|
||||
tar zxvf toxiproxy-cli-linux-${TARGETARCH}.tar.gz -C /sbin/ && \
|
||||
chmod 755 /sbin/toxiproxy-cli
|
||||
RUN curl -L https://litmus-http-proxy.s3.amazonaws.com/server/server/toxiproxy-server-linux-${TARGETARCH}.tar.gz --output toxiproxy-server-linux-${TARGETARCH}.tar.gz && \
|
||||
tar zxvf toxiproxy-server-linux-${TARGETARCH}.tar.gz -C /sbin/ && \
|
||||
chmod 755 /sbin/toxiproxy-server
|
||||
|
||||
ENV APP_USER=litmus
|
||||
ENV APP_DIR="/$APP_USER"
|
||||
ENV DATA_DIR="$APP_DIR/data"
|
||||
|
||||
# The USERD_ID of user
|
||||
ENV APP_USER_ID=2000
|
||||
RUN useradd -s /bin/true -u $APP_USER_ID -m -d $APP_DIR $APP_USER
|
||||
|
||||
# change to 0(root) group because openshift will run container with arbitrary uid as a member of root group
|
||||
RUN chgrp -R 0 "$APP_DIR" && chmod -R g=u "$APP_DIR"
|
||||
|
||||
# Giving sudo to all users (required for almost all experiments)
|
||||
RUN echo 'ALL ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
|
||||
|
||||
WORKDIR $APP_DIR
|
||||
|
||||
COPY --from=builder /output/ .
|
||||
|
||||
COPY --from=docker:27.0.3 /usr/local/bin/docker /sbin/docker
|
||||
RUN chmod 755 /sbin/docker
|
||||
|
||||
# Set permissions and ownership for the copied binaries
|
||||
RUN chmod 755 ./experiments ./helpers && \
|
||||
chown ${APP_USER}:0 ./experiments ./helpers
|
||||
|
||||
# Set ownership for binaries in /sbin and /usr/bin
|
||||
RUN chown ${APP_USER}:0 /sbin/* /usr/bin/* && \
|
||||
chown root:root /usr/bin/sudo && \
|
||||
chmod 4755 /usr/bin/sudo
|
||||
|
||||
# Copying Necessary Files
|
||||
COPY ./pkg/cloud/aws/common/ssm-docs/LitmusChaos-AWS-SSM-Docs.yml ./LitmusChaos-AWS-SSM-Docs.yml
|
||||
RUN chown ${APP_USER}:0 ./LitmusChaos-AWS-SSM-Docs.yml && chmod 755 ./LitmusChaos-AWS-SSM-Docs.yml
|
||||
|
||||
USER ${APP_USER}
|
|
@ -1,7 +1,6 @@
|
|||
apiVersion: kind.x-k8s.io/v1alpha4
|
||||
kind: Cluster
|
||||
apiVersion: kind.x-k8s.io/v1alpha4
|
||||
nodes:
|
||||
- role: control-plane
|
||||
- role: worker
|
||||
- role: worker
|
||||
- role: worker
|
||||
|
|
|
@ -1,23 +1,28 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/aws-ssm/aws-ssm-chaos/types"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/aws/ssm"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
// InjectChaosInSerialMode will inject the aws ssm chaos in serial mode that is one after other
|
||||
func InjectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, inject chan os.Signal) error {
|
||||
func InjectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, inject chan os.Signal) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSSSMFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -60,7 +65,7 @@ func InjectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
@ -85,7 +90,9 @@ func InjectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// InjectChaosInParallelMode will inject the aws ssm chaos in parallel mode that is all at once
|
||||
func InjectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, inject chan os.Signal) error {
|
||||
func InjectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, inject chan os.Signal) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSSSMFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -125,7 +132,7 @@ func InjectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package ssm
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -10,12 +11,14 @@ import (
|
|||
"github.com/litmuschaos/litmus-go/chaoslib/litmus/aws-ssm-chaos/lib"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/aws-ssm/aws-ssm-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/aws/ssm"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -24,7 +27,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareAWSSSMChaosByID contains the prepration and injection steps for the experiment
|
||||
func PrepareAWSSSMChaosByID(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareAWSSSMChaosByID(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareAWSSSMFaultByID")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -60,11 +65,11 @@ func PrepareAWSSSMChaosByID(experimentsDetails *experimentTypes.ExperimentDetail
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = lib.InjectChaosInSerialMode(experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails, inject); err != nil {
|
||||
if err = lib.InjectChaosInSerialMode(ctx, experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails, inject); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = lib.InjectChaosInParallelMode(experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails, inject); err != nil {
|
||||
if err = lib.InjectChaosInParallelMode(ctx, experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails, inject); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package ssm
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -10,16 +11,20 @@ import (
|
|||
"github.com/litmuschaos/litmus-go/chaoslib/litmus/aws-ssm-chaos/lib"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/aws-ssm/aws-ssm-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/aws/ssm"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
// PrepareAWSSSMChaosByTag contains the prepration and injection steps for the experiment
|
||||
func PrepareAWSSSMChaosByTag(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareAWSSSMChaosByTag(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSSSMFaultByTag")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -55,11 +60,11 @@ func PrepareAWSSSMChaosByTag(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = lib.InjectChaosInSerialMode(experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails, inject); err != nil {
|
||||
if err = lib.InjectChaosInSerialMode(ctx, experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails, inject); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = lib.InjectChaosInParallelMode(experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails, inject); err != nil {
|
||||
if err = lib.InjectChaosInParallelMode(ctx, experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails, inject); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -11,16 +12,18 @@ import (
|
|||
"github.com/Azure/azure-sdk-for-go/profiles/latest/compute/mgmt/compute"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/azure/disk-loss/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
diskStatus "github.com/litmuschaos/litmus-go/pkg/cloud/azure/disk"
|
||||
instanceStatus "github.com/litmuschaos/litmus-go/pkg/cloud/azure/instance"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/retry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -29,7 +32,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareChaos contains the prepration and injection steps for the experiment
|
||||
func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareAzureDiskLossFault")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -79,11 +84,11 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, instanceNamesWithDiskNames, attachedDisksWithInstance, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, instanceNamesWithDiskNames, attachedDisksWithInstance, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, instanceNamesWithDiskNames, attachedDisksWithInstance, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, instanceNamesWithDiskNames, attachedDisksWithInstance, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -100,7 +105,9 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the Azure disk loss chaos in parallel mode that is all at once
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesWithDiskNames map[string][]string, attachedDisksWithInstance map[string]*[]compute.DataDisk, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesWithDiskNames map[string][]string, attachedDisksWithInstance map[string]*[]compute.DataDisk, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAzureDiskLossFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
|
@ -139,7 +146,7 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
}
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
@ -178,7 +185,9 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode will inject the Azure disk loss chaos in serial mode that is one after other
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesWithDiskNames map[string][]string, attachedDisksWithInstance map[string]*[]compute.DataDisk, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesWithDiskNames map[string][]string, attachedDisksWithInstance map[string]*[]compute.DataDisk, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAzureDiskLossFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
|
@ -214,7 +223,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
// run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -10,15 +11,17 @@ import (
|
|||
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/azure/instance-stop/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
azureCommon "github.com/litmuschaos/litmus-go/pkg/cloud/azure/common"
|
||||
azureStatus "github.com/litmuschaos/litmus-go/pkg/cloud/azure/instance"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -27,7 +30,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareAzureStop will initialize instanceNameList and start chaos injection based on sequence method selected
|
||||
func PrepareAzureStop(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareAzureStop(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareAzureInstanceStopFault")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -55,11 +60,11 @@ func PrepareAzureStop(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, instanceNameList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, instanceNameList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, instanceNameList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, instanceNameList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -75,7 +80,10 @@ func PrepareAzureStop(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode will inject the Azure instance termination in serial mode that is one after the other
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceNameList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceNameList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAzureInstanceStopFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
// stopping the chaos execution, if abort signal received
|
||||
|
@ -119,7 +127,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
// Run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
@ -153,7 +161,10 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the Azure instance termination in parallel mode that is all at once
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceNameList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceNameList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAzureInstanceStopFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
// Stopping the chaos execution, if abort signal received
|
||||
|
@ -198,7 +209,7 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
|
||||
// Run probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +1,20 @@
|
|||
package helper
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/result"
|
||||
"github.com/palantir/stacktrace"
|
||||
"github.com/sirupsen/logrus"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
|
@ -26,7 +30,9 @@ import (
|
|||
var err error
|
||||
|
||||
// Helper injects the container-kill chaos
|
||||
func Helper(clients clients.ClientSets) {
|
||||
func Helper(ctx context.Context, clients clients.ClientSets) {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "SimulateContainerKillFault")
|
||||
defer span.End()
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
eventsDetails := types.EventDetails{}
|
||||
|
@ -149,10 +155,16 @@ func kill(experimentsDetails *experimentTypes.ExperimentDetails, containerIds []
|
|||
switch experimentsDetails.ContainerRuntime {
|
||||
case "docker":
|
||||
if err := stopDockerContainer(containerIds, experimentsDetails.SocketPath, experimentsDetails.Signal, experimentsDetails.ChaosPodName); err != nil {
|
||||
if isContextDeadlineExceeded(err) {
|
||||
return nil
|
||||
}
|
||||
return stacktrace.Propagate(err, "could not stop container")
|
||||
}
|
||||
case "containerd", "crio":
|
||||
if err := stopContainerdContainer(containerIds, experimentsDetails.SocketPath, experimentsDetails.Signal, experimentsDetails.ChaosPodName); err != nil {
|
||||
if err := stopContainerdContainer(containerIds, experimentsDetails.SocketPath, experimentsDetails.Signal, experimentsDetails.ChaosPodName, experimentsDetails.Timeout); err != nil {
|
||||
if isContextDeadlineExceeded(err) {
|
||||
return nil
|
||||
}
|
||||
return stacktrace.Propagate(err, "could not stop container")
|
||||
}
|
||||
default:
|
||||
|
@ -171,8 +183,8 @@ func validate(t targetDetails, timeout, delay int, clients clients.ClientSets) e
|
|||
return verifyRestartCount(t, timeout, delay, clients, t.RestartCountBefore)
|
||||
}
|
||||
|
||||
//stopContainerdContainer kill the application container
|
||||
func stopContainerdContainer(containerIDs []string, socketPath, signal, source string) error {
|
||||
// stopContainerdContainer kill the application container
|
||||
func stopContainerdContainer(containerIDs []string, socketPath, signal, source string, timeout int) error {
|
||||
if signal != "SIGKILL" && signal != "SIGTERM" {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: source, Reason: fmt.Sprintf("unsupported signal %s, use either SIGTERM or SIGKILL", signal)}
|
||||
}
|
||||
|
@ -180,37 +192,27 @@ func stopContainerdContainer(containerIDs []string, socketPath, signal, source s
|
|||
cmd := exec.Command("sudo", "crictl", "-i", fmt.Sprintf("unix://%s", socketPath), "-r", fmt.Sprintf("unix://%s", socketPath), "stop")
|
||||
if signal == "SIGKILL" {
|
||||
cmd.Args = append(cmd.Args, "--timeout=0")
|
||||
} else if timeout != -1 {
|
||||
cmd.Args = append(cmd.Args, fmt.Sprintf("--timeout=%v", timeout))
|
||||
}
|
||||
cmd.Args = append(cmd.Args, containerIDs...)
|
||||
|
||||
var errOut, out bytes.Buffer
|
||||
cmd.Stderr = &errOut
|
||||
cmd.Stdout = &out
|
||||
if err := cmd.Run(); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: source, Reason: fmt.Sprintf("failed to stop container :%s", out.String())}
|
||||
}
|
||||
return nil
|
||||
return common.RunCLICommands(cmd, source, "", "failed to stop container", cerrors.ErrorTypeChaosInject)
|
||||
}
|
||||
|
||||
//stopDockerContainer kill the application container
|
||||
// stopDockerContainer kill the application container
|
||||
func stopDockerContainer(containerIDs []string, socketPath, signal, source string) error {
|
||||
var errOut, out bytes.Buffer
|
||||
cmd := exec.Command("sudo", "docker", "--host", fmt.Sprintf("unix://%s", socketPath), "kill", "--signal", signal)
|
||||
cmd.Args = append(cmd.Args, containerIDs...)
|
||||
cmd.Stderr = &errOut
|
||||
cmd.Stdout = &out
|
||||
if err := cmd.Run(); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: source, Reason: fmt.Sprintf("failed to stop container :%s", out.String())}
|
||||
}
|
||||
return nil
|
||||
return common.RunCLICommands(cmd, source, "", "failed to stop container", cerrors.ErrorTypeChaosInject)
|
||||
}
|
||||
|
||||
//getRestartCount return the restart count of target container
|
||||
// getRestartCount return the restart count of target container
|
||||
func getRestartCount(target targetDetails, clients clients.ClientSets) (int, error) {
|
||||
pod, err := clients.KubeClient.CoreV1().Pods(target.Namespace).Get(context.Background(), target.Name, v1.GetOptions{})
|
||||
pod, err := clients.GetPod(target.Namespace, target.Name, 180, 2)
|
||||
if err != nil {
|
||||
return 0, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: target.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s}", target.Name, target.Namespace), Reason: err.Error()}
|
||||
}
|
||||
|
||||
restartCount := 0
|
||||
for _, container := range pod.Status.ContainerStatuses {
|
||||
if container.Name == target.TargetContainer {
|
||||
|
@ -221,7 +223,7 @@ func getRestartCount(target targetDetails, clients clients.ClientSets) (int, err
|
|||
return restartCount, nil
|
||||
}
|
||||
|
||||
//verifyRestartCount verify the restart count of target container that it is restarted or not after chaos injection
|
||||
// verifyRestartCount verify the restart count of target container that it is restarted or not after chaos injection
|
||||
func verifyRestartCount(t targetDetails, timeout, delay int, clients clients.ClientSets, restartCountBefore int) error {
|
||||
|
||||
restartCountAfter := 0
|
||||
|
@ -247,7 +249,7 @@ func verifyRestartCount(t targetDetails, timeout, delay int, clients clients.Cli
|
|||
})
|
||||
}
|
||||
|
||||
//getENV fetches all the env variables from the runner pod
|
||||
// getENV fetches all the env variables from the runner pod
|
||||
func getENV(experimentDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentDetails.ExperimentName = types.Getenv("EXPERIMENT_NAME", "")
|
||||
experimentDetails.InstanceID = types.Getenv("INSTANCE_ID", "")
|
||||
|
@ -262,6 +264,7 @@ func getENV(experimentDetails *experimentTypes.ExperimentDetails) {
|
|||
experimentDetails.Signal = types.Getenv("SIGNAL", "SIGKILL")
|
||||
experimentDetails.Delay, _ = strconv.Atoi(types.Getenv("STATUS_CHECK_DELAY", "2"))
|
||||
experimentDetails.Timeout, _ = strconv.Atoi(types.Getenv("STATUS_CHECK_TIMEOUT", "180"))
|
||||
experimentDetails.ContainerAPITimeout, _ = strconv.Atoi(types.Getenv("CONTAINER_API_TIMEOUT", "-1"))
|
||||
}
|
||||
|
||||
type targetDetails struct {
|
||||
|
@ -271,3 +274,7 @@ type targetDetails struct {
|
|||
RestartCountBefore int
|
||||
Source string
|
||||
}
|
||||
|
||||
func isContextDeadlineExceeded(err error) bool {
|
||||
return strings.Contains(err.Error(), "context deadline exceeded")
|
||||
}
|
||||
|
|
|
@ -3,17 +3,19 @@ package lib
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/container-kill/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
|
@ -22,8 +24,10 @@ import (
|
|||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
//PrepareContainerKill contains the preparation steps before chaos injection
|
||||
func PrepareContainerKill(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PrepareContainerKill contains the preparation steps before chaos injection
|
||||
func PrepareContainerKill(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareContainerKillFault")
|
||||
defer span.End()
|
||||
|
||||
var err error
|
||||
// Get the target pod details for the chaos execution
|
||||
|
@ -31,7 +35,7 @@ func PrepareContainerKill(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
if experimentsDetails.TargetPods == "" && chaosDetails.AppDetail == nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeTargetSelection, Reason: "provide one of the appLabel or TARGET_PODS"}
|
||||
}
|
||||
//Setup the tunables if provided in range
|
||||
//Set up the tunables if provided in range
|
||||
SetChaosTunables(experimentsDetails)
|
||||
|
||||
log.InfoWithValues("[Info]: The tunables are:", logrus.Fields{
|
||||
|
@ -54,7 +58,7 @@ func PrepareContainerKill(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
if experimentsDetails.ChaosServiceAccount == "" {
|
||||
experimentsDetails.ChaosServiceAccount, err = common.GetServiceAccount(experimentsDetails.ChaosNamespace, experimentsDetails.ChaosPodName, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not experiment service account")
|
||||
return stacktrace.Propagate(err, "could not get experiment service account")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,11 +71,11 @@ func PrepareContainerKill(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
experimentsDetails.IsTargetContainerProvided = experimentsDetails.TargetContainer != ""
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -87,10 +91,12 @@ func PrepareContainerKill(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode kill the container of all target application serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectContainerKillFaultInSerialMode")
|
||||
defer span.End()
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -105,42 +111,26 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
|
||||
runID := stringutils.GetRunID()
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, experimentsDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for container-kill chaos
|
||||
log.Info("[Cleanup]: Deleting all the helper pods")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// injectChaosInParallelMode kill the container of all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectContainerKillFaultInParallelMode")
|
||||
defer span.End()
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -154,40 +144,24 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
targetsPerNode = append(targetsPerNode, fmt.Sprintf("%s:%s:%s", k.Name, k.Namespace, k.TargetContainer))
|
||||
}
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, experimentsDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for container-kill chaos
|
||||
log.Info("[Cleanup]: Deleting all the helper pods")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateContainerKillFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
privilegedEnable := false
|
||||
if experimentsDetails.ContainerRuntime == "crio" {
|
||||
|
@ -231,7 +205,7 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
"./helpers -name container-kill",
|
||||
},
|
||||
Resources: chaosDetails.Resources,
|
||||
Env: getPodEnv(experimentsDetails, targets),
|
||||
Env: getPodEnv(ctx, experimentsDetails, targets),
|
||||
VolumeMounts: []apiv1.VolumeMount{
|
||||
{
|
||||
Name: "cri-socket",
|
||||
|
@ -251,15 +225,15 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getPodEnv derive all the env required for the helper pod
|
||||
func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets string) []apiv1.EnvVar {
|
||||
func getPodEnv(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targets string) []apiv1.EnvVar {
|
||||
|
||||
var envDetails common.ENVDetails
|
||||
envDetails.SetEnv("TARGETS", targets).
|
||||
|
@ -274,14 +248,17 @@ func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets st
|
|||
SetEnv("STATUS_CHECK_DELAY", strconv.Itoa(experimentsDetails.Delay)).
|
||||
SetEnv("STATUS_CHECK_TIMEOUT", strconv.Itoa(experimentsDetails.Timeout)).
|
||||
SetEnv("EXPERIMENT_NAME", experimentsDetails.ExperimentName).
|
||||
SetEnv("CONTAINER_API_TIMEOUT", strconv.Itoa(experimentsDetails.ContainerAPITimeout)).
|
||||
SetEnv("INSTANCE_ID", experimentsDetails.InstanceID).
|
||||
SetEnv("OTEL_EXPORTER_OTLP_ENDPOINT", os.Getenv(telemetry.OTELExporterOTLPEndpoint)).
|
||||
SetEnv("TRACE_PARENT", telemetry.GetMarshalledSpanFromContext(ctx)).
|
||||
SetEnvFromDownwardAPI("v1", "metadata.name")
|
||||
|
||||
return envDetails.ENV
|
||||
}
|
||||
|
||||
//SetChaosTunables will setup a random value within a given range of values
|
||||
//If the value is not provided in range it'll setup the initial provided value.
|
||||
// SetChaosTunables will setup a random value within a given range of values
|
||||
// If the value is not provided in range it'll setup the initial provided value.
|
||||
func SetChaosTunables(experimentsDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentsDetails.PodsAffectedPerc = common.ValidateRange(experimentsDetails.PodsAffectedPerc)
|
||||
experimentsDetails.Sequence = common.GetRandomSequence(experimentsDetails.Sequence)
|
||||
|
|
|
@ -3,8 +3,6 @@ package helper
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/palantir/stacktrace"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
|
@ -13,6 +11,11 @@ import (
|
|||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/disk-fill/types"
|
||||
|
@ -29,7 +32,9 @@ import (
|
|||
var inject, abort chan os.Signal
|
||||
|
||||
// Helper injects the disk-fill chaos
|
||||
func Helper(clients clients.ClientSets) {
|
||||
func Helper(ctx context.Context, clients clients.ClientSets) {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "SimulateDiskFillFault")
|
||||
defer span.End()
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
eventsDetails := types.EventDetails{}
|
||||
|
@ -185,14 +190,15 @@ func fillDisk(t targetDetails, bs int) error {
|
|||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
log.Error(err.Error())
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: string(out)}
|
||||
}
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: string(out)}
|
||||
return nil
|
||||
}
|
||||
|
||||
// getEphemeralStorageAttributes derive the ephemeral storage attributes from the target pod
|
||||
func getEphemeralStorageAttributes(t targetDetails, clients clients.ClientSets) (int64, error) {
|
||||
|
||||
pod, err := clients.KubeClient.CoreV1().Pods(t.Namespace).Get(context.Background(), t.Name, v1.GetOptions{})
|
||||
pod, err := clients.GetPod(t.Namespace, t.Name, 180, 2)
|
||||
if err != nil {
|
||||
return 0, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s}", t.Name, t.Namespace), Reason: err.Error()}
|
||||
}
|
||||
|
@ -246,7 +252,7 @@ func getSizeToBeFilled(experimentsDetails *experimentTypes.ExperimentDetails, us
|
|||
// revertDiskFill will delete the target pod if target pod is evicted
|
||||
// if target pod is still running then it will delete the files, which was created during chaos execution
|
||||
func revertDiskFill(t targetDetails, clients clients.ClientSets) error {
|
||||
pod, err := clients.KubeClient.CoreV1().Pods(t.Namespace).Get(context.Background(), t.Name, v1.GetOptions{})
|
||||
pod, err := clients.GetPod(t.Namespace, t.Name, 180, 2)
|
||||
if err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosRevert, Source: t.Source, Target: fmt.Sprintf("{podName: %s,namespace: %s}", t.Name, t.Namespace), Reason: err.Error()}
|
||||
}
|
||||
|
|
|
@ -3,17 +3,19 @@ package lib
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/disk-fill/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/exec"
|
||||
|
@ -23,8 +25,10 @@ import (
|
|||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
//PrepareDiskFill contains the preparation steps before chaos injection
|
||||
func PrepareDiskFill(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PrepareDiskFill contains the preparation steps before chaos injection
|
||||
func PrepareDiskFill(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareDiskFillFault")
|
||||
defer span.End()
|
||||
|
||||
var err error
|
||||
// It will contain all the pod & container details required for exec command
|
||||
|
@ -59,7 +63,7 @@ func PrepareDiskFill(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
if experimentsDetails.ChaosServiceAccount == "" {
|
||||
experimentsDetails.ChaosServiceAccount, err = common.GetServiceAccount(experimentsDetails.ChaosNamespace, experimentsDetails.ChaosPodName, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not experiment service account")
|
||||
return stacktrace.Propagate(err, "could not get experiment service account")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -72,11 +76,11 @@ func PrepareDiskFill(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
experimentsDetails.IsTargetContainerProvided = experimentsDetails.TargetContainer != ""
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, clients, chaosDetails, execCommandDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, execCommandDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, clients, chaosDetails, execCommandDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, execCommandDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -92,11 +96,12 @@ func PrepareDiskFill(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode fill the ephemeral storage of all target application serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, execCommandDetails exec.PodDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, execCommandDetails exec.PodDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectDiskFillFaultInSerialMode")
|
||||
defer span.End()
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -110,32 +115,14 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
runID := stringutils.GetRunID()
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for disk-fill chaos
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -144,12 +131,13 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode fill the ephemeral storage of of all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, execCommandDetails exec.PodDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, execCommandDetails exec.PodDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectDiskFillFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
var err error
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -163,40 +151,24 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
targetsPerNode = append(targetsPerNode, fmt.Sprintf("%s:%s:%s", k.Name, k.Namespace, k.TargetContainer))
|
||||
}
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for disk-fill chaos
|
||||
log.Info("[Cleanup]: Deleting all the helper pod")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, appNodeName, runID string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, appNodeName, runID string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateDiskFillFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
privilegedEnable := true
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
@ -239,7 +211,7 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
"./helpers -name disk-fill",
|
||||
},
|
||||
Resources: chaosDetails.Resources,
|
||||
Env: getPodEnv(experimentsDetails, targets),
|
||||
Env: getPodEnv(ctx, experimentsDetails, targets),
|
||||
VolumeMounts: []apiv1.VolumeMount{
|
||||
{
|
||||
Name: "socket-path",
|
||||
|
@ -259,15 +231,15 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getPodEnv derive all the env required for the helper pod
|
||||
func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets string) []apiv1.EnvVar {
|
||||
func getPodEnv(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targets string) []apiv1.EnvVar {
|
||||
|
||||
var envDetails common.ENVDetails
|
||||
envDetails.SetEnv("TARGETS", targets).
|
||||
|
@ -283,6 +255,8 @@ func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets st
|
|||
SetEnv("INSTANCE_ID", experimentsDetails.InstanceID).
|
||||
SetEnv("SOCKET_PATH", experimentsDetails.SocketPath).
|
||||
SetEnv("CONTAINER_RUNTIME", experimentsDetails.ContainerRuntime).
|
||||
SetEnv("OTEL_EXPORTER_OTLP_ENDPOINT", os.Getenv(telemetry.OTELExporterOTLPEndpoint)).
|
||||
SetEnv("TRACE_PARENT", telemetry.GetMarshalledSpanFromContext(ctx)).
|
||||
SetEnvFromDownwardAPI("v1", "metadata.name")
|
||||
|
||||
return envDetails.ENV
|
||||
|
|
|
@ -6,14 +6,14 @@ import (
|
|||
"strconv"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/docker-service-kill/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
|
@ -23,7 +23,9 @@ import (
|
|||
)
|
||||
|
||||
// PrepareDockerServiceKill contains prepration steps before chaos injection
|
||||
func PrepareDockerServiceKill(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareDockerServiceKill(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareDockerServiceKillFault")
|
||||
defer span.End()
|
||||
|
||||
var err error
|
||||
if experimentsDetails.TargetNode == "" {
|
||||
|
@ -59,46 +61,14 @@ func PrepareDockerServiceKill(experimentsDetails *experimentTypes.ExperimentDeta
|
|||
}
|
||||
|
||||
// Creating the helper pod to perform docker-service-kill
|
||||
if err = createHelperPod(experimentsDetails, clients, chaosDetails, experimentsDetails.TargetNode); err != nil {
|
||||
if err = createHelperPod(ctx, experimentsDetails, clients, chaosDetails, experimentsDetails.TargetNode); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, experimentsDetails.RunID)
|
||||
|
||||
//Checking the status of helper pod
|
||||
log.Info("[Status]: Checking the status of the helper pod")
|
||||
if err = status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteHelperPodBasedOnJobCleanupPolicy(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Checking for the node to be in not-ready state
|
||||
log.Info("[Status]: Check for the node to be in NotReady state")
|
||||
if err = status.CheckNodeNotReadyState(experimentsDetails.TargetNode, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteHelperPodBasedOnJobCleanupPolicy(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check for NOT READY state")
|
||||
}
|
||||
|
||||
// Wait till the completion of helper pod
|
||||
log.Info("[Wait]: Waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteHelperPodBasedOnJobCleanupPolicy(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, false)
|
||||
}
|
||||
|
||||
//Deleting the helper pod
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err = common.DeletePod(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
//Waiting for the ramp time after chaos injection
|
||||
|
@ -110,7 +80,9 @@ func PrepareDockerServiceKill(experimentsDetails *experimentTypes.ExperimentDeta
|
|||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, appNodeName string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, appNodeName string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateDockerServiceKillFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
privileged := true
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -9,12 +10,14 @@ import (
|
|||
|
||||
ebsloss "github.com/litmuschaos/litmus-go/chaoslib/litmus/ebs-loss/lib"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/kube-aws/ebs-loss/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -23,7 +26,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareEBSLossByID contains the prepration and injection steps for the experiment
|
||||
func PrepareEBSLossByID(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareEBSLossByID(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareAWSEBSLossFaultByID")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -57,11 +62,11 @@ func PrepareEBSLossByID(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = ebsloss.InjectChaosInSerialMode(experimentsDetails, volumeIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = ebsloss.InjectChaosInSerialMode(ctx, experimentsDetails, volumeIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = ebsloss.InjectChaosInParallelMode(experimentsDetails, volumeIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = ebsloss.InjectChaosInParallelMode(ctx, experimentsDetails, volumeIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -9,12 +10,14 @@ import (
|
|||
|
||||
ebsloss "github.com/litmuschaos/litmus-go/chaoslib/litmus/ebs-loss/lib"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/kube-aws/ebs-loss/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -23,7 +26,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareEBSLossByTag contains the prepration and injection steps for the experiment
|
||||
func PrepareEBSLossByTag(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareEBSLossByTag(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareAWSEBSLossFaultByTag")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -55,11 +60,11 @@ func PrepareEBSLossByTag(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = ebsloss.InjectChaosInSerialMode(experimentsDetails, targetEBSVolumeIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = ebsloss.InjectChaosInSerialMode(ctx, experimentsDetails, targetEBSVolumeIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = ebsloss.InjectChaosInParallelMode(experimentsDetails, targetEBSVolumeIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = ebsloss.InjectChaosInParallelMode(ctx, experimentsDetails, targetEBSVolumeIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -1,24 +1,29 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
ebs "github.com/litmuschaos/litmus-go/pkg/cloud/aws/ebs"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/kube-aws/ebs-loss/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
// InjectChaosInSerialMode will inject the ebs loss chaos in serial mode which means one after other
|
||||
func InjectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetEBSVolumeIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func InjectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetEBSVolumeIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSEBSLossFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
|
@ -56,7 +61,7 @@ func InjectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
// run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +100,9 @@ func InjectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// InjectChaosInParallelMode will inject the chaos in parallel mode that means all at once
|
||||
func InjectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetEBSVolumeIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func InjectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetEBSVolumeIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSEBSLossFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
var ec2InstanceIDList, deviceList []string
|
||||
|
||||
|
@ -152,7 +159,7 @@ func InjectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -9,15 +10,17 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
awslib "github.com/litmuschaos/litmus-go/pkg/cloud/aws/ec2"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/kube-aws/ec2-terminate-by-id/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -26,7 +29,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareEC2TerminateByID contains the prepration and injection steps for the experiment
|
||||
func PrepareEC2TerminateByID(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareEC2TerminateByID(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareAWSEC2TerminateFaultByID")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -55,11 +60,11 @@ func PrepareEC2TerminateByID(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -75,7 +80,9 @@ func PrepareEC2TerminateByID(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode will inject the ec2 instance termination in serial mode that is one after other
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSEC2TerminateFaultByIDInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -116,7 +123,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
// run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
@ -147,7 +154,9 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the ec2 instance termination in parallel mode that is all at once
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSEC2TerminateFaultByIDInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -189,7 +198,7 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -9,22 +10,26 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
awslib "github.com/litmuschaos/litmus-go/pkg/cloud/aws/ec2"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/kube-aws/ec2-terminate-by-tag/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var inject, abort chan os.Signal
|
||||
|
||||
// PrepareEC2TerminateByTag contains the prepration and injection steps for the experiment
|
||||
func PrepareEC2TerminateByTag(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareEC2TerminateByTag(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareAWSEC2TerminateFaultByTag")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -50,11 +55,11 @@ func PrepareEC2TerminateByTag(experimentsDetails *experimentTypes.ExperimentDeta
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err := injectChaosInSerialMode(experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := injectChaosInSerialMode(ctx, experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err := injectChaosInParallelMode(experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := injectChaosInParallelMode(ctx, experimentsDetails, instanceIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -70,7 +75,9 @@ func PrepareEC2TerminateByTag(experimentsDetails *experimentTypes.ExperimentDeta
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode will inject the ce2 instance termination in serial mode that is one after other
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSEC2TerminateFaultByTagInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -111,7 +118,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
// run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
@ -142,7 +149,9 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the ce2 instance termination in parallel mode that is all at once
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectAWSEC2TerminateFaultByTagInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -182,7 +191,7 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
@ -221,14 +230,14 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
// SetTargetInstance will select the target instance which are in running state and filtered from the given instance tag
|
||||
func SetTargetInstance(experimentsDetails *experimentTypes.ExperimentDetails) error {
|
||||
|
||||
instanceIDList, err := awslib.GetInstanceList(experimentsDetails.InstanceTag, experimentsDetails.Region)
|
||||
instanceIDList, err := awslib.GetInstanceList(experimentsDetails.Ec2InstanceTag, experimentsDetails.Region)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "failed to get the instance id list")
|
||||
}
|
||||
if len(instanceIDList) == 0 {
|
||||
return cerrors.Error{
|
||||
ErrorCode: cerrors.ErrorTypeTargetSelection,
|
||||
Reason: fmt.Sprintf("no instance found with the given tag %v, in region %v", experimentsDetails.InstanceTag, experimentsDetails.Region),
|
||||
Reason: fmt.Sprintf("no instance found with the given tag %v, in region %v", experimentsDetails.Ec2InstanceTag, experimentsDetails.Region),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -246,7 +255,7 @@ func SetTargetInstance(experimentsDetails *experimentTypes.ExperimentDetails) er
|
|||
return cerrors.Error{
|
||||
ErrorCode: cerrors.ErrorTypeChaosInject,
|
||||
Reason: "failed to get any running instance",
|
||||
Target: fmt.Sprintf("EC2 Instance Tag: %v", experimentsDetails.InstanceTag)}
|
||||
Target: fmt.Sprintf("EC2 Instance Tag: %v", experimentsDetails.Ec2InstanceTag)}
|
||||
}
|
||||
|
||||
log.InfoWithValues("[Info]: Targeting the running instances filtered from instance tag", logrus.Fields{
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -9,15 +10,17 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/gcp/gcp-vm-disk-loss/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
"google.golang.org/api/compute/v1"
|
||||
)
|
||||
|
||||
|
@ -27,7 +30,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareDiskVolumeLossByLabel contains the prepration and injection steps for the experiment
|
||||
func PrepareDiskVolumeLossByLabel(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareDiskVolumeLossByLabel(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareGCPDiskVolumeLossFaultByLabel")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -63,11 +68,11 @@ func PrepareDiskVolumeLossByLabel(computeService *compute.Service, experimentsDe
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(computeService, experimentsDetails, diskVolumeNamesList, experimentsDetails.TargetDiskInstanceNamesList, experimentsDetails.Zones, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, computeService, experimentsDetails, diskVolumeNamesList, experimentsDetails.TargetDiskInstanceNamesList, experimentsDetails.Zones, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(computeService, experimentsDetails, diskVolumeNamesList, experimentsDetails.TargetDiskInstanceNamesList, experimentsDetails.Zones, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, computeService, experimentsDetails, diskVolumeNamesList, experimentsDetails.TargetDiskInstanceNamesList, experimentsDetails.Zones, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -85,7 +90,9 @@ func PrepareDiskVolumeLossByLabel(computeService *compute.Service, experimentsDe
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode will inject the disk loss chaos in serial mode which means one after the other
|
||||
func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, targetDiskVolumeNamesList, instanceNamesList []string, zone string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, targetDiskVolumeNamesList, instanceNamesList []string, zone string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectGCPDiskVolumeLossFaultByLabelInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
|
@ -118,7 +125,7 @@ func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails
|
|||
// run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -160,7 +167,9 @@ func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the disk loss chaos in parallel mode that means all at once
|
||||
func injectChaosInParallelMode(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, targetDiskVolumeNamesList, instanceNamesList []string, zone string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, targetDiskVolumeNamesList, instanceNamesList []string, zone string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectGCPDiskVolumeLossFaultByLabelInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
|
@ -196,7 +205,7 @@ func injectChaosInParallelMode(computeService *compute.Service, experimentsDetai
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -10,15 +11,17 @@ import (
|
|||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
gcp "github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/gcp/gcp-vm-disk-loss/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"github.com/pkg/errors"
|
||||
"go.opentelemetry.io/otel"
|
||||
"google.golang.org/api/compute/v1"
|
||||
)
|
||||
|
||||
|
@ -28,7 +31,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareDiskVolumeLoss contains the prepration and injection steps for the experiment
|
||||
func PrepareDiskVolumeLoss(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareDiskVolumeLoss(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareVMDiskLossFault")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -68,11 +73,11 @@ func PrepareDiskVolumeLoss(computeService *compute.Service, experimentsDetails *
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(computeService, experimentsDetails, diskNamesList, diskZonesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, computeService, experimentsDetails, diskNamesList, diskZonesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(computeService, experimentsDetails, diskNamesList, diskZonesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, computeService, experimentsDetails, diskNamesList, diskZonesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -90,8 +95,9 @@ func PrepareDiskVolumeLoss(computeService *compute.Service, experimentsDetails *
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode will inject the disk loss chaos in serial mode which means one after the other
|
||||
func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, targetDiskVolumeNamesList, diskZonesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
func injectChaosInSerialMode(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, targetDiskVolumeNamesList, diskZonesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectVMDiskLossFaultInSerialMode")
|
||||
defer span.End()
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
duration := int(time.Since(ChaosStartTimeStamp).Seconds())
|
||||
|
@ -122,7 +128,7 @@ func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails
|
|||
// run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -161,7 +167,9 @@ func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the disk loss chaos in parallel mode that means all at once
|
||||
func injectChaosInParallelMode(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, targetDiskVolumeNamesList, diskZonesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, targetDiskVolumeNamesList, diskZonesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectVMDiskLossFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
|
@ -197,7 +205,7 @@ func injectChaosInParallelMode(computeService *compute.Service, experimentsDetai
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -9,22 +10,26 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
gcplib "github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/gcp/gcp-vm-instance-stop/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
"google.golang.org/api/compute/v1"
|
||||
)
|
||||
|
||||
var inject, abort chan os.Signal
|
||||
|
||||
// PrepareVMStopByLabel executes the experiment steps by injecting chaos into target VM instances
|
||||
func PrepareVMStopByLabel(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareVMStopByLabel(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareGCPVMInstanceStopFaultByLabel")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -50,11 +55,11 @@ func PrepareVMStopByLabel(computeService *compute.Service, experimentsDetails *e
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err := injectChaosInSerialMode(computeService, experimentsDetails, instanceNamesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := injectChaosInSerialMode(ctx, computeService, experimentsDetails, instanceNamesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err := injectChaosInParallelMode(computeService, experimentsDetails, instanceNamesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := injectChaosInParallelMode(ctx, computeService, experimentsDetails, instanceNamesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -71,7 +76,9 @@ func PrepareVMStopByLabel(computeService *compute.Service, experimentsDetails *e
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stops VM instances in serial mode i.e. one after the other
|
||||
func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectGCPVMInstanceStopFaultByLabelInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -112,7 +119,7 @@ func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails
|
|||
// run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -156,8 +163,9 @@ func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the VM instance termination in serial mode that is one after other
|
||||
func injectChaosInParallelMode(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
func injectChaosInParallelMode(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectGCPVMInstanceStopFaultByLabelInParallelMode")
|
||||
defer span.End()
|
||||
select {
|
||||
case <-inject:
|
||||
// stopping the chaos execution, if abort signal received
|
||||
|
@ -200,7 +208,7 @@ func injectChaosInParallelMode(computeService *compute.Service, experimentsDetai
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -9,15 +10,17 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
gcplib "github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/gcp/gcp-vm-instance-stop/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
"google.golang.org/api/compute/v1"
|
||||
)
|
||||
|
||||
|
@ -27,7 +30,9 @@ var (
|
|||
)
|
||||
|
||||
// PrepareVMStop contains the prepration and injection steps for the experiment
|
||||
func PrepareVMStop(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareVMStop(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareVMInstanceStopFault")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -55,11 +60,11 @@ func PrepareVMStop(computeService *compute.Service, experimentsDetails *experime
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(computeService, experimentsDetails, instanceNamesList, instanceZonesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, computeService, experimentsDetails, instanceNamesList, instanceZonesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(computeService, experimentsDetails, instanceNamesList, instanceZonesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, computeService, experimentsDetails, instanceNamesList, instanceZonesList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -76,7 +81,9 @@ func PrepareVMStop(computeService *compute.Service, experimentsDetails *experime
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stops VM instances in serial mode i.e. one after the other
|
||||
func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesList []string, instanceZonesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesList []string, instanceZonesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectVMInstanceStopFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -117,7 +124,7 @@ func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails
|
|||
// run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -161,7 +168,9 @@ func injectChaosInSerialMode(computeService *compute.Service, experimentsDetails
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode stops VM instances in parallel mode i.e. all at once
|
||||
func injectChaosInParallelMode(computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesList []string, instanceZonesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, computeService *compute.Service, experimentsDetails *experimentTypes.ExperimentDetails, instanceNamesList []string, instanceZonesList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectVMInstanceStopFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -205,7 +214,7 @@ func injectChaosInParallelMode(computeService *compute.Service, experimentsDetai
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package helper
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strconv"
|
||||
|
@ -27,7 +30,9 @@ var (
|
|||
)
|
||||
|
||||
// Helper injects the http chaos
|
||||
func Helper(clients clients.ClientSets) {
|
||||
func Helper(ctx context.Context, clients clients.ClientSets) {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "SimulatePodHTTPFault")
|
||||
defer span.End()
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
eventsDetails := types.EventDetails{}
|
||||
|
@ -225,7 +230,7 @@ const NoProxyToKill = "you need to specify whom to kill"
|
|||
// it is using nsenter command to enter into network namespace of target container
|
||||
// and execute the proxy related command inside it.
|
||||
func killProxy(pid int, source string) error {
|
||||
stopProxyServerCommand := fmt.Sprintf("sudo nsenter -t %d -n sudo kill -9 $(ps aux | grep [t]oxiproxy | awk 'FNR==1{print $1}')", pid)
|
||||
stopProxyServerCommand := fmt.Sprintf("sudo nsenter -t %d -n sudo kill -9 $(ps aux | grep [t]oxiproxy | awk 'FNR==2{print $2}')", pid)
|
||||
log.Infof("[Chaos]: Stopping proxy server")
|
||||
|
||||
if err := common.RunBashCommand(stopProxyServerCommand, "failed to stop proxy server", source); err != nil {
|
||||
|
|
|
@ -1,16 +1,22 @@
|
|||
package header
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
http_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/http-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/http-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
//PodHttpModifyHeaderChaos contains the steps to prepare and inject http modify header chaos
|
||||
func PodHttpModifyHeaderChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PodHttpModifyHeaderChaos contains the steps to prepare and inject http modify header chaos
|
||||
func PodHttpModifyHeaderChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodHTTPModifyHeaderFault")
|
||||
defer span.End()
|
||||
|
||||
log.InfoWithValues("[Info]: The chaos tunables are:", logrus.Fields{
|
||||
"Target Port": experimentsDetails.TargetServicePort,
|
||||
|
@ -27,5 +33,5 @@ func PodHttpModifyHeaderChaos(experimentsDetails *experimentTypes.ExperimentDeta
|
|||
stream = "upstream"
|
||||
}
|
||||
args := "-t header --" + stream + " -a headers='" + (experimentsDetails.HeadersMap) + "' -a mode=" + experimentsDetails.HeaderMode
|
||||
return http_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
return http_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
|
|
@ -3,17 +3,19 @@ package lib
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/http-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
|
@ -22,8 +24,8 @@ import (
|
|||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
//PrepareAndInjectChaos contains the preparation & injection steps
|
||||
func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, args string) error {
|
||||
// PrepareAndInjectChaos contains the preparation & injection steps
|
||||
func PrepareAndInjectChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, args string) error {
|
||||
|
||||
var err error
|
||||
// Get the target pod details for the chaos execution
|
||||
|
@ -49,7 +51,7 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
if experimentsDetails.ChaosServiceAccount == "" {
|
||||
experimentsDetails.ChaosServiceAccount, err = common.GetServiceAccount(experimentsDetails.ChaosNamespace, experimentsDetails.ChaosPodName, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not experiment service account")
|
||||
return stacktrace.Propagate(err, "could not get experiment service account")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,11 +65,11 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, args, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, args, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, args, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, args, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -78,11 +80,13 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode inject the http chaos in all target application serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, args string, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, args string, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodHTTPFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -102,32 +106,14 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
})
|
||||
|
||||
runID := stringutils.GetRunID()
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID, args); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID, args); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for http chaos
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err := common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -135,11 +121,13 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode inject the http chaos in all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, args string, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, args string, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodHTTPFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -153,40 +141,24 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
targetsPerNode = append(targetsPerNode, fmt.Sprintf("%s:%s:%s", k.Name, k.Namespace, k.TargetContainer))
|
||||
}
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID, args); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID, args); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
// Deleting all the helper pod for http chaos
|
||||
log.Info("[Cleanup]: Deleting all the helper pod")
|
||||
if err := common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID, args string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID, args string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateHTTPChaosHelperPod")
|
||||
defer span.End()
|
||||
|
||||
privilegedEnable := true
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
@ -229,7 +201,7 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
"./helpers -name http-chaos",
|
||||
},
|
||||
Resources: chaosDetails.Resources,
|
||||
Env: getPodEnv(experimentsDetails, targets, args),
|
||||
Env: getPodEnv(ctx, experimentsDetails, targets, args),
|
||||
VolumeMounts: []apiv1.VolumeMount{
|
||||
{
|
||||
Name: "cri-socket",
|
||||
|
@ -255,15 +227,15 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getPodEnv derive all the env required for the helper pod
|
||||
func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets, args string) []apiv1.EnvVar {
|
||||
func getPodEnv(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targets, args string) []apiv1.EnvVar {
|
||||
|
||||
var envDetails common.ENVDetails
|
||||
envDetails.SetEnv("TARGETS", targets).
|
||||
|
@ -279,13 +251,15 @@ func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets, a
|
|||
SetEnv("TARGET_SERVICE_PORT", strconv.Itoa(experimentsDetails.TargetServicePort)).
|
||||
SetEnv("PROXY_PORT", strconv.Itoa(experimentsDetails.ProxyPort)).
|
||||
SetEnv("TOXICITY", strconv.Itoa(experimentsDetails.Toxicity)).
|
||||
SetEnv("OTEL_EXPORTER_OTLP_ENDPOINT", os.Getenv(telemetry.OTELExporterOTLPEndpoint)).
|
||||
SetEnv("TRACE_PARENT", telemetry.GetMarshalledSpanFromContext(ctx)).
|
||||
SetEnvFromDownwardAPI("v1", "metadata.name")
|
||||
|
||||
return envDetails.ENV
|
||||
}
|
||||
|
||||
//SetChaosTunables will set up a random value within a given range of values
|
||||
//If the value is not provided in range it'll set up the initial provided value.
|
||||
// SetChaosTunables will set up a random value within a given range of values
|
||||
// If the value is not provided in range it'll set up the initial provided value.
|
||||
func SetChaosTunables(experimentsDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentsDetails.PodsAffectedPerc = common.ValidateRange(experimentsDetails.PodsAffectedPerc)
|
||||
experimentsDetails.Sequence = common.GetRandomSequence(experimentsDetails.Sequence)
|
||||
|
|
|
@ -1,18 +1,23 @@
|
|||
package latency
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
http_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/http-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/http-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
//PodHttpLatencyChaos contains the steps to prepare and inject http latency chaos
|
||||
func PodHttpLatencyChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PodHttpLatencyChaos contains the steps to prepare and inject http latency chaos
|
||||
func PodHttpLatencyChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodHttpLatencyFault")
|
||||
defer span.End()
|
||||
|
||||
log.InfoWithValues("[Info]: The chaos tunables are:", logrus.Fields{
|
||||
"Target Port": experimentsDetails.TargetServicePort,
|
||||
|
@ -24,5 +29,5 @@ func PodHttpLatencyChaos(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
})
|
||||
|
||||
args := "-t latency -a latency=" + strconv.Itoa(experimentsDetails.Latency)
|
||||
return http_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
return http_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
|
|
@ -1,20 +1,25 @@
|
|||
package modifybody
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
|
||||
http_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/http-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/http-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
// PodHttpModifyBodyChaos contains the steps to prepare and inject http modify body chaos
|
||||
func PodHttpModifyBodyChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PodHttpModifyBodyChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodHTTPModifyBodyFault")
|
||||
defer span.End()
|
||||
|
||||
// responseBodyMaxLength defines the max length of response body string to be printed. It is taken as
|
||||
// the min of length of body and 120 characters to avoid printing large response body.
|
||||
|
@ -34,7 +39,7 @@ func PodHttpModifyBodyChaos(experimentsDetails *experimentTypes.ExperimentDetail
|
|||
args := fmt.Sprintf(
|
||||
`-t modify_body -a body="%v" -a content_type=%v -a content_encoding=%v`,
|
||||
EscapeQuotes(experimentsDetails.ResponseBody), experimentsDetails.ContentType, experimentsDetails.ContentEncoding)
|
||||
return http_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
return http_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
||||
// EscapeQuotes escapes the quotes in the given string
|
||||
|
|
|
@ -1,18 +1,23 @@
|
|||
package reset
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
http_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/http-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/http-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
//PodHttpResetPeerChaos contains the steps to prepare and inject http reset peer chaos
|
||||
func PodHttpResetPeerChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PodHttpResetPeerChaos contains the steps to prepare and inject http reset peer chaos
|
||||
func PodHttpResetPeerChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodHTTPResetPeerFault")
|
||||
defer span.End()
|
||||
|
||||
log.InfoWithValues("[Info]: The chaos tunables are:", logrus.Fields{
|
||||
"Target Port": experimentsDetails.TargetServicePort,
|
||||
|
@ -24,5 +29,5 @@ func PodHttpResetPeerChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
})
|
||||
|
||||
args := "-t reset_peer -a timeout=" + strconv.Itoa(experimentsDetails.ResetTimeout)
|
||||
return http_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
return http_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
|
|
@ -1,17 +1,21 @@
|
|||
package statuscode
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"math"
|
||||
"math/rand"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
http_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/http-chaos/lib"
|
||||
body "github.com/litmuschaos/litmus-go/chaoslib/litmus/http-chaos/lib/modify-body"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/http-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
|
@ -26,7 +30,9 @@ var acceptedStatusCodes = []string{
|
|||
}
|
||||
|
||||
// PodHttpStatusCodeChaos contains the steps to prepare and inject http status code chaos
|
||||
func PodHttpStatusCodeChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PodHttpStatusCodeChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodHttpStatusCodeFault")
|
||||
defer span.End()
|
||||
|
||||
// responseBodyMaxLength defines the max length of response body string to be printed. It is taken as
|
||||
// the min of length of body and 120 characters to avoid printing large response body.
|
||||
|
@ -49,7 +55,7 @@ func PodHttpStatusCodeChaos(experimentsDetails *experimentTypes.ExperimentDetail
|
|||
`-t status_code -a status_code=%s -a modify_response_body=%d -a response_body="%v" -a content_type=%s -a content_encoding=%s`,
|
||||
experimentsDetails.StatusCode, stringBoolToInt(experimentsDetails.ModifyResponseBody), body.EscapeQuotes(experimentsDetails.ResponseBody),
|
||||
experimentsDetails.ContentType, experimentsDetails.ContentEncoding)
|
||||
return http_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
return http_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
||||
// GetStatusCode performs two functions:
|
||||
|
|
|
@ -0,0 +1,165 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/load/k6-loadgen/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
func experimentExecution(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectK6LoadGenFault")
|
||||
defer span.End()
|
||||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
msg := "Injecting " + experimentsDetails.ExperimentName + " chaos"
|
||||
types.SetEngineEventAttributes(eventsDetails, types.ChaosInject, msg, "Normal", chaosDetails)
|
||||
events.GenerateEvents(eventsDetails, clients, chaosDetails, "ChaosEngine")
|
||||
}
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
runID := stringutils.GetRunID()
|
||||
|
||||
// creating the helper pod to perform k6-loadgen chaos
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// PrepareChaos contains the preparation steps before chaos injection
|
||||
func PrepareChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareK6LoadGenFault")
|
||||
defer span.End()
|
||||
|
||||
// Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
log.Infof("[Ramp]: Waiting for the %vs ramp time before injecting chaos", experimentsDetails.RampTime)
|
||||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
|
||||
// Starting the k6-loadgen experiment
|
||||
if err := experimentExecution(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not execute chaos")
|
||||
}
|
||||
|
||||
// Waiting for the ramp time after chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
log.Infof("[Ramp]: Waiting for the %vs ramp time after injecting chaos", experimentsDetails.RampTime)
|
||||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, runID string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateK6LoadGenFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
const volumeName = "script-volume"
|
||||
const mountPath = "/mnt"
|
||||
|
||||
var envs []corev1.EnvVar
|
||||
args := []string{
|
||||
mountPath + "/" + experimentsDetails.ScriptSecretKey,
|
||||
"-q",
|
||||
"--duration",
|
||||
strconv.Itoa(experimentsDetails.ChaosDuration) + "s",
|
||||
"--tag",
|
||||
"trace_id=" + span.SpanContext().TraceID().String(),
|
||||
}
|
||||
|
||||
if otelExporterEndpoint := os.Getenv(telemetry.OTELExporterOTLPEndpoint); otelExporterEndpoint != "" {
|
||||
envs = []corev1.EnvVar{
|
||||
{
|
||||
Name: "K6_OTEL_METRIC_PREFIX",
|
||||
Value: experimentsDetails.OTELMetricPrefix,
|
||||
},
|
||||
{
|
||||
Name: "K6_OTEL_GRPC_EXPORTER_INSECURE",
|
||||
Value: "true",
|
||||
},
|
||||
{
|
||||
Name: "K6_OTEL_GRPC_EXPORTER_ENDPOINT",
|
||||
Value: otelExporterEndpoint,
|
||||
},
|
||||
}
|
||||
args = append(args, "--out", "experimental-opentelemetry")
|
||||
}
|
||||
|
||||
helperPod := &corev1.Pod{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
GenerateName: experimentsDetails.ExperimentName + "-helper-",
|
||||
Namespace: experimentsDetails.ChaosNamespace,
|
||||
Labels: common.GetHelperLabels(chaosDetails.Labels, runID, experimentsDetails.ExperimentName),
|
||||
Annotations: chaosDetails.Annotations,
|
||||
},
|
||||
Spec: corev1.PodSpec{
|
||||
RestartPolicy: corev1.RestartPolicyNever,
|
||||
ImagePullSecrets: chaosDetails.ImagePullSecrets,
|
||||
Containers: []corev1.Container{
|
||||
{
|
||||
Name: experimentsDetails.ExperimentName,
|
||||
Image: experimentsDetails.LIBImage,
|
||||
ImagePullPolicy: corev1.PullPolicy(experimentsDetails.LIBImagePullPolicy),
|
||||
Command: []string{
|
||||
"k6",
|
||||
"run",
|
||||
},
|
||||
Args: args,
|
||||
Env: envs,
|
||||
Resources: chaosDetails.Resources,
|
||||
VolumeMounts: []corev1.VolumeMount{
|
||||
{
|
||||
Name: volumeName,
|
||||
MountPath: mountPath,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Volumes: []corev1.Volume{
|
||||
{
|
||||
Name: volumeName,
|
||||
VolumeSource: corev1.VolumeSource{
|
||||
Secret: &corev1.SecretVolumeSource{
|
||||
SecretName: experimentsDetails.ScriptSecretName,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -8,10 +8,12 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/workloads"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/kafka/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -24,7 +26,9 @@ import (
|
|||
)
|
||||
|
||||
// PreparePodDelete contains the prepration steps before chaos injection
|
||||
func PreparePodDelete(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PreparePodDelete(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareKafkaPodDeleteFault")
|
||||
defer span.End()
|
||||
|
||||
//Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.ChaoslibDetail.RampTime != 0 {
|
||||
|
@ -34,11 +38,11 @@ func PreparePodDelete(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
|
||||
switch strings.ToLower(experimentsDetails.ChaoslibDetail.Sequence) {
|
||||
case "serial":
|
||||
if err := injectChaosInSerialMode(experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
if err := injectChaosInSerialMode(ctx, experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err := injectChaosInParallelMode(experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
if err := injectChaosInParallelMode(ctx, experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -54,11 +58,12 @@ func PreparePodDelete(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode delete the kafka broker pods in serial mode(one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectKafkaPodDeleteFaultInSerialMode")
|
||||
defer span.End()
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -149,11 +154,12 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode delete the kafka broker pods in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectKafkaPodDeleteFaultInParallelMode")
|
||||
defer span.End()
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,13 +6,14 @@ import (
|
|||
"strconv"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/kubelet-service-kill/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
|
@ -23,7 +24,9 @@ import (
|
|||
)
|
||||
|
||||
// PrepareKubeletKill contains prepration steps before chaos injection
|
||||
func PrepareKubeletKill(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareKubeletKill(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareKubeletServiceKillFault")
|
||||
defer span.End()
|
||||
|
||||
var err error
|
||||
if experimentsDetails.TargetNode == "" {
|
||||
|
@ -59,48 +62,28 @@ func PrepareKubeletKill(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
}
|
||||
|
||||
// Creating the helper pod to perform node memory hog
|
||||
if err = createHelperPod(experimentsDetails, clients, chaosDetails, experimentsDetails.TargetNode); err != nil {
|
||||
if err = createHelperPod(ctx, experimentsDetails, clients, chaosDetails, experimentsDetails.TargetNode); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, experimentsDetails.RunID)
|
||||
|
||||
//Checking the status of helper pod
|
||||
log.Info("[Status]: Checking the status of the helper pod")
|
||||
if err = status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteHelperPodBasedOnJobCleanupPolicy(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
common.SetTargets(experimentsDetails.TargetNode, "targeted", "node", chaosDetails)
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return err
|
||||
}
|
||||
if err := common.CheckHelperStatusAndRunProbes(ctx, appLabel, experimentsDetails.TargetNode, chaosDetails, clients, resultDetails, eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Checking for the node to be in not-ready state
|
||||
log.Info("[Status]: Check for the node to be in NotReady state")
|
||||
if err = status.CheckNodeNotReadyState(experimentsDetails.TargetNode, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteHelperPodBasedOnJobCleanupPolicy(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, chaosDetails, clients)
|
||||
if deleteErr := common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients); deleteErr != nil {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[err: %v, delete error: %v]", err, deleteErr)}
|
||||
}
|
||||
return stacktrace.Propagate(err, "could not check for NOT READY state")
|
||||
}
|
||||
|
||||
// Wait till the completion of helper pod
|
||||
log.Info("[Wait]: Waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteHelperPodBasedOnJobCleanupPolicy(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, false)
|
||||
}
|
||||
|
||||
//Deleting the helper pod
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err = common.DeletePod(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod")
|
||||
if err := common.WaitForCompletionAndDeleteHelperPods(appLabel, chaosDetails, clients, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
//Waiting for the ramp time after chaos injection
|
||||
|
@ -108,11 +91,14 @@ func PrepareKubeletKill(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
log.Infof("[Ramp]: Waiting for the %vs ramp time after injecting chaos", experimentsDetails.RampTime)
|
||||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, appNodeName string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, appNodeName string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateKubeletServiceKillFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
privileged := true
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
@ -198,10 +184,10 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
package helper
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/palantir/stacktrace"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
|
@ -13,6 +11,12 @@ import (
|
|||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/network-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -28,14 +32,15 @@ const (
|
|||
)
|
||||
|
||||
var (
|
||||
err error
|
||||
inject, abort chan os.Signal
|
||||
err error
|
||||
inject, abort chan os.Signal
|
||||
sPorts, dPorts, whitelistDPorts, whitelistSPorts []string
|
||||
)
|
||||
|
||||
var destIps, sPorts, dPorts []string
|
||||
|
||||
// Helper injects the network chaos
|
||||
func Helper(clients clients.ClientSets) {
|
||||
func Helper(ctx context.Context, clients clients.ClientSets) {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "SimulatePodNetworkFault")
|
||||
defer span.End()
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
eventsDetails := types.EventDetails{}
|
||||
|
@ -77,9 +82,8 @@ func Helper(clients clients.ClientSets) {
|
|||
|
||||
}
|
||||
|
||||
//preparePodNetworkChaos contains the prepration steps before chaos injection
|
||||
// preparePodNetworkChaos contains the prepration steps before chaos injection
|
||||
func preparePodNetworkChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails) error {
|
||||
|
||||
targetEnv := os.Getenv("TARGETS")
|
||||
if targetEnv == "" {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: chaosDetails.ChaosPodName, Reason: "no target found, provide atleast one target"}
|
||||
|
@ -105,10 +109,10 @@ func preparePodNetworkChaos(experimentsDetails *experimentTypes.ExperimentDetail
|
|||
return stacktrace.Propagate(err, "could not get container id")
|
||||
}
|
||||
|
||||
// extract out the pid of the target container
|
||||
td.Pid, err = common.GetPauseAndSandboxPID(experimentsDetails.ContainerRuntime, td.ContainerId, experimentsDetails.SocketPath, td.Source)
|
||||
// extract out the network ns path of the pod sandbox or pause container
|
||||
td.NetworkNsPath, err = common.GetNetworkNsPath(experimentsDetails.ContainerRuntime, td.ContainerId, experimentsDetails.SocketPath, td.Source)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not get container pid")
|
||||
return stacktrace.Propagate(err, "could not get container network ns path")
|
||||
}
|
||||
|
||||
targets = append(targets, td)
|
||||
|
@ -124,14 +128,17 @@ func preparePodNetworkChaos(experimentsDetails *experimentTypes.ExperimentDetail
|
|||
default:
|
||||
}
|
||||
|
||||
for _, t := range targets {
|
||||
for index, t := range targets {
|
||||
// injecting network chaos inside target container
|
||||
if err = injectChaos(experimentsDetails.NetworkInterface, t); err != nil {
|
||||
if revertErr := revertChaosForAllTargets(targets, experimentsDetails.NetworkInterface, resultDetails, chaosDetails.ChaosNamespace, index-1); revertErr != nil {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s,%s]", stacktrace.RootCause(err).Error(), stacktrace.RootCause(revertErr).Error())}
|
||||
}
|
||||
return stacktrace.Propagate(err, "could not inject chaos")
|
||||
}
|
||||
log.Infof("successfully injected chaos on target: {name: %s, namespace: %v, container: %v}", t.Name, t.Namespace, t.TargetContainer)
|
||||
if err = result.AnnotateChaosResult(resultDetails.Name, chaosDetails.ChaosNamespace, "injected", "pod", t.Name); err != nil {
|
||||
if _, revertErr := killnetem(t, experimentsDetails.NetworkInterface); err != nil {
|
||||
if revertErr := revertChaosForAllTargets(targets, experimentsDetails.NetworkInterface, resultDetails, chaosDetails.ChaosNamespace, index); revertErr != nil {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s,%s]", stacktrace.RootCause(err).Error(), stacktrace.RootCause(revertErr).Error())}
|
||||
}
|
||||
return stacktrace.Propagate(err, "could not annotate chaosresult")
|
||||
|
@ -148,18 +155,25 @@ func preparePodNetworkChaos(experimentsDetails *experimentTypes.ExperimentDetail
|
|||
|
||||
common.WaitForDuration(experimentsDetails.ChaosDuration)
|
||||
|
||||
log.Info("[Chaos]: duration is over, reverting chaos")
|
||||
log.Info("[Chaos]: Duration is over, reverting chaos")
|
||||
|
||||
if err := revertChaosForAllTargets(targets, experimentsDetails.NetworkInterface, resultDetails, chaosDetails.ChaosNamespace, len(targets)-1); err != nil {
|
||||
return stacktrace.Propagate(err, "could not revert chaos")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func revertChaosForAllTargets(targets []targetDetails, networkInterface string, resultDetails *types.ResultDetails, chaosNs string, index int) error {
|
||||
var errList []string
|
||||
for _, t := range targets {
|
||||
// cleaning the netem process after chaos injection
|
||||
killed, err := killnetem(t, experimentsDetails.NetworkInterface)
|
||||
for i := 0; i <= index; i++ {
|
||||
killed, err := killnetem(targets[i], networkInterface)
|
||||
if !killed && err != nil {
|
||||
errList = append(errList, err.Error())
|
||||
continue
|
||||
}
|
||||
if killed && err == nil {
|
||||
if err = result.AnnotateChaosResult(resultDetails.Name, chaosDetails.ChaosNamespace, "reverted", "pod", t.Name); err != nil {
|
||||
if err = result.AnnotateChaosResult(resultDetails.Name, chaosNs, "reverted", "pod", targets[i].Name); err != nil {
|
||||
errList = append(errList, err.Error())
|
||||
}
|
||||
}
|
||||
|
@ -178,27 +192,16 @@ func injectChaos(netInterface string, target targetDetails) error {
|
|||
|
||||
netemCommands := os.Getenv("NETEM_COMMAND")
|
||||
|
||||
if len(destIps) == 0 && len(sPorts) == 0 && len(dPorts) == 0 {
|
||||
tc := fmt.Sprintf("sudo nsenter -t %d -n tc qdisc replace dev %s root netem %v", target.Pid, netInterface, netemCommands)
|
||||
if len(target.DestinationIps) == 0 && len(sPorts) == 0 && len(dPorts) == 0 && len(whitelistDPorts) == 0 && len(whitelistSPorts) == 0 {
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc qdisc replace dev %s root %v", target.NetworkNsPath, netInterface, netemCommands)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create tc rules", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
|
||||
ips := strings.Split(target.DestinationIps, ",")
|
||||
var uniqueIps []string
|
||||
|
||||
// removing duplicates ips from the list, if any
|
||||
for i := range ips {
|
||||
if !common.Contains(ips[i], uniqueIps) {
|
||||
uniqueIps = append(uniqueIps, ips[i])
|
||||
}
|
||||
}
|
||||
|
||||
// Create a priority-based queue
|
||||
// This instantly creates classes 1:1, 1:2, 1:3
|
||||
priority := fmt.Sprintf("sudo nsenter -t %v -n tc qdisc replace dev %v root handle 1: prio", target.Pid, netInterface)
|
||||
priority := fmt.Sprintf("sudo nsenter --net=%s tc qdisc replace dev %v root handle 1: prio", target.NetworkNsPath, netInterface)
|
||||
log.Info(priority)
|
||||
if err := common.RunBashCommand(priority, "failed to create priority-based queue", target.Source); err != nil {
|
||||
return err
|
||||
|
@ -206,39 +209,95 @@ func injectChaos(netInterface string, target targetDetails) error {
|
|||
|
||||
// Add queueing discipline for 1:3 class.
|
||||
// No traffic is going through 1:3 yet
|
||||
traffic := fmt.Sprintf("sudo nsenter -t %v -n tc qdisc replace dev %v parent 1:3 netem %v", target.Pid, netInterface, netemCommands)
|
||||
traffic := fmt.Sprintf("sudo nsenter --net=%s tc qdisc replace dev %v parent 1:3 %v", target.NetworkNsPath, netInterface, netemCommands)
|
||||
log.Info(traffic)
|
||||
if err := common.RunBashCommand(traffic, "failed to create netem queueing discipline", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, ip := range uniqueIps {
|
||||
// redirect traffic to specific IP through band 3
|
||||
tc := fmt.Sprintf("sudo nsenter -t %v -n tc filter add dev %v protocol ip parent 1:0 prio 3 u32 match ip dst %v flowid 1:3", target.Pid, netInterface, ip)
|
||||
if strings.Contains(ip, ":") {
|
||||
tc = fmt.Sprintf("sudo nsenter -t %v -n tc filter add dev %v protocol ip parent 1:0 prio 3 u32 match ip6 dst %v flowid 1:3", target.Pid, netInterface, ip)
|
||||
if len(whitelistDPorts) != 0 || len(whitelistSPorts) != 0 {
|
||||
for _, port := range whitelistDPorts {
|
||||
//redirect traffic to specific dport through band 2
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc filter add dev %v protocol ip parent 1:0 prio 2 u32 match ip dport %v 0xffff flowid 1:2", target.NetworkNsPath, netInterface, port)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create whitelist dport match filters", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create destination ips match filters", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, port := range sPorts {
|
||||
//redirect traffic to specific sport through band 3
|
||||
tc := fmt.Sprintf("sudo nsenter -t %v -n tc filter add dev %v protocol ip parent 1:0 prio 3 u32 match ip sport %v 0xffff flowid 1:3", target.Pid, netInterface, port)
|
||||
for _, port := range whitelistSPorts {
|
||||
//redirect traffic to specific sport through band 2
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc filter add dev %v protocol ip parent 1:0 prio 2 u32 match ip sport %v 0xffff flowid 1:2", target.NetworkNsPath, netInterface, port)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create whitelist sport match filters", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc filter add dev %v protocol ip parent 1:0 prio 3 u32 match ip dst 0.0.0.0/0 flowid 1:3", target.NetworkNsPath, netInterface)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create source ports match filters", target.Source); err != nil {
|
||||
if err := common.RunBashCommand(tc, "failed to create rule for all ports match filters", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for i := range target.DestinationIps {
|
||||
var (
|
||||
ip = target.DestinationIps[i]
|
||||
ports []string
|
||||
isIPV6 = strings.Contains(target.DestinationIps[i], ":")
|
||||
)
|
||||
// extracting the destination ports from the ips
|
||||
// ip format is ip(|port1|port2....|portx)
|
||||
if strings.Contains(target.DestinationIps[i], "|") {
|
||||
ip = strings.Split(target.DestinationIps[i], "|")[0]
|
||||
ports = strings.Split(target.DestinationIps[i], "|")[1:]
|
||||
}
|
||||
|
||||
for _, port := range dPorts {
|
||||
//redirect traffic to specific dport through band 3
|
||||
tc := fmt.Sprintf("sudo nsenter -t %v -n tc filter add dev %v protocol ip parent 1:0 prio 3 u32 match ip dport %v 0xffff flowid 1:3", target.Pid, netInterface, port)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create destination ports match filters", target.Source); err != nil {
|
||||
return err
|
||||
// redirect traffic to specific IP through band 3
|
||||
filter := fmt.Sprintf("match ip dst %v", ip)
|
||||
if isIPV6 {
|
||||
filter = fmt.Sprintf("match ip6 dst %v", ip)
|
||||
}
|
||||
|
||||
if len(ports) != 0 {
|
||||
for _, port := range ports {
|
||||
portFilter := fmt.Sprintf("%s match ip dport %v 0xffff", filter, port)
|
||||
if isIPV6 {
|
||||
portFilter = fmt.Sprintf("%s match ip6 dport %v 0xffff", filter, port)
|
||||
}
|
||||
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc filter add dev %v protocol ip parent 1:0 prio 3 u32 %s flowid 1:3", target.NetworkNsPath, netInterface, portFilter)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create destination ips match filters", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc filter add dev %v protocol ip parent 1:0 prio 3 u32 %s flowid 1:3", target.NetworkNsPath, netInterface, filter)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create destination ips match filters", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, port := range sPorts {
|
||||
//redirect traffic to specific sport through band 3
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc filter add dev %v protocol ip parent 1:0 prio 3 u32 match ip sport %v 0xffff flowid 1:3", target.NetworkNsPath, netInterface, port)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create source ports match filters", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, port := range dPorts {
|
||||
//redirect traffic to specific dport through band 3
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc filter add dev %v protocol ip parent 1:0 prio 3 u32 match ip dport %v 0xffff flowid 1:3", target.NetworkNsPath, netInterface, port)
|
||||
log.Info(tc)
|
||||
if err := common.RunBashCommand(tc, "failed to create destination ports match filters", target.Source); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -249,8 +308,7 @@ func injectChaos(netInterface string, target targetDetails) error {
|
|||
|
||||
// killnetem kill the netem process for all the target containers
|
||||
func killnetem(target targetDetails, networkInterface string) (bool, error) {
|
||||
|
||||
tc := fmt.Sprintf("sudo nsenter -t %d -n tc qdisc delete dev %s root", target.Pid, networkInterface)
|
||||
tc := fmt.Sprintf("sudo nsenter --net=%s tc qdisc delete dev %s root", target.NetworkNsPath, networkInterface)
|
||||
cmd := exec.Command("/bin/bash", "-c", tc)
|
||||
out, err := cmd.CombinedOutput()
|
||||
|
||||
|
@ -272,14 +330,14 @@ type targetDetails struct {
|
|||
Name string
|
||||
Namespace string
|
||||
ServiceMesh string
|
||||
DestinationIps string
|
||||
DestinationIps []string
|
||||
TargetContainer string
|
||||
ContainerId string
|
||||
Pid int
|
||||
Source string
|
||||
NetworkNsPath string
|
||||
}
|
||||
|
||||
//getENV fetches all the env variables from the runner pod
|
||||
// getENV fetches all the env variables from the runner pod
|
||||
func getENV(experimentDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentDetails.ExperimentName = types.Getenv("EXPERIMENT_NAME", "")
|
||||
experimentDetails.InstanceID = types.Getenv("INSTANCE_ID", "")
|
||||
|
@ -295,29 +353,20 @@ func getENV(experimentDetails *experimentTypes.ExperimentDetails) {
|
|||
experimentDetails.SourcePorts = types.Getenv("SOURCE_PORTS", "")
|
||||
experimentDetails.DestinationPorts = types.Getenv("DESTINATION_PORTS", "")
|
||||
|
||||
destIps = getDestinationIPs(experimentDetails.DestinationIPs)
|
||||
if strings.TrimSpace(experimentDetails.DestinationPorts) != "" {
|
||||
dPorts = strings.Split(strings.TrimSpace(experimentDetails.DestinationPorts), ",")
|
||||
}
|
||||
if strings.TrimSpace(experimentDetails.SourcePorts) != "" {
|
||||
sPorts = strings.Split(strings.TrimSpace(experimentDetails.SourcePorts), ",")
|
||||
}
|
||||
}
|
||||
|
||||
func getDestinationIPs(ips string) []string {
|
||||
if strings.TrimSpace(ips) == "" {
|
||||
return nil
|
||||
}
|
||||
destIPs := strings.Split(strings.TrimSpace(ips), ",")
|
||||
var uniqueIps []string
|
||||
|
||||
// removing duplicates ips from the list, if any
|
||||
for i := range destIPs {
|
||||
if !common.Contains(destIPs[i], uniqueIps) {
|
||||
uniqueIps = append(uniqueIps, destIPs[i])
|
||||
if strings.Contains(experimentDetails.DestinationPorts, "!") {
|
||||
whitelistDPorts = strings.Split(strings.TrimPrefix(strings.TrimSpace(experimentDetails.DestinationPorts), "!"), ",")
|
||||
} else {
|
||||
dPorts = strings.Split(strings.TrimSpace(experimentDetails.DestinationPorts), ",")
|
||||
}
|
||||
}
|
||||
if strings.TrimSpace(experimentDetails.SourcePorts) != "" {
|
||||
if strings.Contains(experimentDetails.SourcePorts, "!") {
|
||||
whitelistSPorts = strings.Split(strings.TrimPrefix(strings.TrimSpace(experimentDetails.SourcePorts), "!"), ",")
|
||||
} else {
|
||||
sPorts = strings.Split(strings.TrimSpace(experimentDetails.SourcePorts), ",")
|
||||
}
|
||||
}
|
||||
return uniqueIps
|
||||
}
|
||||
|
||||
// abortWatcher continuously watch for the abort signals
|
||||
|
@ -347,9 +396,28 @@ func abortWatcher(targets []targetDetails, networkInterface, resultName, chaosNS
|
|||
log.Info("Chaos Revert Completed")
|
||||
os.Exit(1)
|
||||
}
|
||||
func getDestIps(serviceMesh string) string {
|
||||
if serviceMesh == "false" {
|
||||
return os.Getenv("DESTINATION_IPS")
|
||||
func getDestIps(serviceMesh string) []string {
|
||||
var (
|
||||
destIps = os.Getenv("DESTINATION_IPS")
|
||||
uniqueIps []string
|
||||
)
|
||||
|
||||
if serviceMesh == "true" {
|
||||
destIps = os.Getenv("DESTINATION_IPS_SERVICE_MESH")
|
||||
}
|
||||
return os.Getenv("DESTINATION_IPS_SERVICE_MESH")
|
||||
|
||||
if strings.TrimSpace(destIps) == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
ips := strings.Split(strings.TrimSpace(destIps), ",")
|
||||
|
||||
// removing duplicates ips from the list, if any
|
||||
for i := range ips {
|
||||
if !common.Contains(ips[i], uniqueIps) {
|
||||
uniqueIps = append(uniqueIps, ips[i])
|
||||
}
|
||||
}
|
||||
|
||||
return uniqueIps
|
||||
}
|
||||
|
|
|
@ -1,15 +1,26 @@
|
|||
package corruption
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
network_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/network-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/network-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
//PodNetworkCorruptionChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkCorruptionChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PodNetworkCorruptionChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkCorruptionChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodNetworkCorruptionFault")
|
||||
defer span.End()
|
||||
|
||||
args := "corrupt " + experimentsDetails.NetworkPacketCorruptionPercentage
|
||||
return network_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
args := "netem corrupt " + experimentsDetails.NetworkPacketCorruptionPercentage
|
||||
if experimentsDetails.Correlation > 0 {
|
||||
args = fmt.Sprintf("%s %d", args, experimentsDetails.Correlation)
|
||||
}
|
||||
|
||||
return network_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
|
|
@ -1,15 +1,26 @@
|
|||
package duplication
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
network_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/network-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/network-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
//PodNetworkDuplicationChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkDuplicationChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PodNetworkDuplicationChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkDuplicationChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodNetworkDuplicationFault")
|
||||
defer span.End()
|
||||
|
||||
args := "duplicate " + experimentsDetails.NetworkPacketDuplicationPercentage
|
||||
return network_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
args := "netem duplicate " + experimentsDetails.NetworkPacketDuplicationPercentage
|
||||
if experimentsDetails.Correlation > 0 {
|
||||
args = fmt.Sprintf("%s %d", args, experimentsDetails.Correlation)
|
||||
}
|
||||
|
||||
return network_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
|
|
@ -1,17 +1,27 @@
|
|||
package latency
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
network_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/network-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/network-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
//PodNetworkLatencyChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkLatencyChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PodNetworkLatencyChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkLatencyChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodNetworkLatencyFault")
|
||||
defer span.End()
|
||||
|
||||
args := "delay " + strconv.Itoa(experimentsDetails.NetworkLatency) + "ms " + strconv.Itoa(experimentsDetails.Jitter) + "ms"
|
||||
return network_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
args := "netem delay " + strconv.Itoa(experimentsDetails.NetworkLatency) + "ms " + strconv.Itoa(experimentsDetails.Jitter) + "ms"
|
||||
if experimentsDetails.Correlation > 0 {
|
||||
args = fmt.Sprintf("%s %d", args, experimentsDetails.Correlation)
|
||||
}
|
||||
|
||||
return network_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
|
|
@ -1,15 +1,26 @@
|
|||
package loss
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
network_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/network-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/network-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
//PodNetworkLossChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkLossChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PodNetworkLossChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkLossChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodNetworkLossFault")
|
||||
defer span.End()
|
||||
|
||||
args := "loss " + experimentsDetails.NetworkPacketLossPercentage
|
||||
return network_chaos.PrepareAndInjectChaos(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
args := "netem loss " + experimentsDetails.NetworkPacketLossPercentage
|
||||
if experimentsDetails.Correlation > 0 {
|
||||
args = fmt.Sprintf("%s %d", args, experimentsDetails.Correlation)
|
||||
}
|
||||
|
||||
return network_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
||||
|
|
|
@ -4,18 +4,20 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
k8serrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/network-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
|
@ -28,8 +30,8 @@ var serviceMesh = []string{"istio", "envoy"}
|
|||
var destIpsSvcMesh string
|
||||
var destIps string
|
||||
|
||||
//PrepareAndInjectChaos contains the preparation & injection steps
|
||||
func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, args string) error {
|
||||
// PrepareAndInjectChaos contains the preparation & injection steps
|
||||
func PrepareAndInjectChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, args string) error {
|
||||
|
||||
var err error
|
||||
// Get the target pod details for the chaos execution
|
||||
|
@ -56,7 +58,7 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
if experimentsDetails.ChaosServiceAccount == "" {
|
||||
experimentsDetails.ChaosServiceAccount, err = common.GetServiceAccount(experimentsDetails.ChaosNamespace, experimentsDetails.ChaosPodName, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not experiment service account")
|
||||
return stacktrace.Propagate(err, "could not get experiment service account")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -69,11 +71,11 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
experimentsDetails.IsTargetContainerProvided = experimentsDetails.TargetContainer != ""
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, clients, chaosDetails, args, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, args, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, clients, chaosDetails, args, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, args, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -84,10 +86,13 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode inject the network chaos in all target application serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, args string, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, args string, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodNetworkFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -107,32 +112,15 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
|
||||
runID := stringutils.GetRunID()
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer, serviceMesh), pod.Spec.NodeName, runID, args); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer, serviceMesh), pod.Spec.NodeName, runID, args); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for network chaos
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err := common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,12 +128,14 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode inject the network chaos in all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, args string, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, args string, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodNetworkFaultInParallelMode")
|
||||
defer span.End()
|
||||
var err error
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -163,55 +153,43 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
targetsPerNode = append(targetsPerNode, fmt.Sprintf("%s:%s:%s:%s", k.Name, k.Namespace, k.TargetContainer, k.ServiceMesh))
|
||||
}
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID, args); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID, args); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for container-kill chaos
|
||||
log.Info("[Cleanup]: Deleting all the helper pod")
|
||||
if err := common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets string, nodeName, runID, args string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets string, nodeName, runID, args string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreatePodNetworkFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
privilegedEnable := true
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
var (
|
||||
privilegedEnable = true
|
||||
terminationGracePeriodSeconds = int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
helperName = fmt.Sprintf("%s-helper-%s", experimentsDetails.ExperimentName, stringutils.GetRunID())
|
||||
)
|
||||
|
||||
helperPod := &apiv1.Pod{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
GenerateName: experimentsDetails.ExperimentName + "-helper-",
|
||||
Namespace: experimentsDetails.ChaosNamespace,
|
||||
Labels: common.GetHelperLabels(chaosDetails.Labels, runID, experimentsDetails.ExperimentName),
|
||||
Annotations: chaosDetails.Annotations,
|
||||
Name: helperName,
|
||||
Namespace: experimentsDetails.ChaosNamespace,
|
||||
Labels: common.GetHelperLabels(chaosDetails.Labels, runID, experimentsDetails.ExperimentName),
|
||||
Annotations: chaosDetails.Annotations,
|
||||
},
|
||||
Spec: apiv1.PodSpec{
|
||||
HostPID: true,
|
||||
TerminationGracePeriodSeconds: &terminationGracePeriodSeconds,
|
||||
ImagePullSecrets: chaosDetails.ImagePullSecrets,
|
||||
Tolerations: chaosDetails.Tolerations,
|
||||
ServiceAccountName: experimentsDetails.ChaosServiceAccount,
|
||||
RestartPolicy: apiv1.RestartPolicyNever,
|
||||
NodeName: nodeName,
|
||||
|
@ -239,7 +217,7 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
"./helpers -name network-chaos",
|
||||
},
|
||||
Resources: chaosDetails.Resources,
|
||||
Env: getPodEnv(experimentsDetails, targets, args),
|
||||
Env: getPodEnv(ctx, experimentsDetails, targets, args),
|
||||
VolumeMounts: []apiv1.VolumeMount{
|
||||
{
|
||||
Name: "cri-socket",
|
||||
|
@ -265,15 +243,32 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
// mount the network ns path for crio runtime
|
||||
// it is required to access the sandbox network ns
|
||||
if strings.ToLower(experimentsDetails.ContainerRuntime) == "crio" {
|
||||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, apiv1.Volume{
|
||||
Name: "netns-path",
|
||||
VolumeSource: apiv1.VolumeSource{
|
||||
HostPath: &apiv1.HostPathVolumeSource{
|
||||
Path: "/var/run/netns",
|
||||
},
|
||||
},
|
||||
})
|
||||
helperPod.Spec.Containers[0].VolumeMounts = append(helperPod.Spec.Containers[0].VolumeMounts, apiv1.VolumeMount{
|
||||
Name: "netns-path",
|
||||
MountPath: "/var/run/netns",
|
||||
})
|
||||
}
|
||||
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getPodEnv derive all the env required for the helper pod
|
||||
func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets string, args string) []apiv1.EnvVar {
|
||||
func getPodEnv(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targets string, args string) []apiv1.EnvVar {
|
||||
|
||||
var envDetails common.ENVDetails
|
||||
envDetails.SetEnv("TARGETS", targets).
|
||||
|
@ -291,6 +286,8 @@ func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets st
|
|||
SetEnv("DESTINATION_IPS_SERVICE_MESH", destIpsSvcMesh).
|
||||
SetEnv("SOURCE_PORTS", experimentsDetails.SourcePorts).
|
||||
SetEnv("DESTINATION_PORTS", experimentsDetails.DestinationPorts).
|
||||
SetEnv("OTEL_EXPORTER_OTLP_ENDPOINT", os.Getenv(telemetry.OTELExporterOTLPEndpoint)).
|
||||
SetEnv("TRACE_PARENT", telemetry.GetMarshalledSpanFromContext(ctx)).
|
||||
SetEnvFromDownwardAPI("v1", "metadata.name")
|
||||
|
||||
return envDetails.ENV
|
||||
|
@ -332,7 +329,7 @@ func getPodIPFromService(host string, clients clients.ClientSets) ([]string, err
|
|||
return ips, cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Target: fmt.Sprintf("{host: %s}", host), Reason: "provide the valid FQDN for service in '<svc-name>.<namespace>.svc.cluster.local format"}
|
||||
}
|
||||
svcName, svcNs := svcFields[0], svcFields[1]
|
||||
svc, err := clients.KubeClient.CoreV1().Services(svcNs).Get(context.Background(), svcName, v1.GetOptions{})
|
||||
svc, err := clients.GetService(svcNs, svcName)
|
||||
if err != nil {
|
||||
if k8serrors.IsForbidden(err) {
|
||||
log.Warnf("forbidden - failed to get %v service in %v namespace, err: %v", svcName, svcNs, err)
|
||||
|
@ -353,11 +350,14 @@ func getPodIPFromService(host string, clients clients.ClientSets) ([]string, err
|
|||
svcSelector += fmt.Sprintf(",%s=%s", k, v)
|
||||
}
|
||||
|
||||
pods, err := clients.KubeClient.CoreV1().Pods(svcNs).List(context.Background(), v1.ListOptions{LabelSelector: svcSelector})
|
||||
pods, err := clients.ListPods(svcNs, svcSelector)
|
||||
if err != nil {
|
||||
return ips, cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Target: fmt.Sprintf("{svcName: %s,podLabel: %s, namespace: %s}", svcNs, svcSelector, svcNs), Reason: fmt.Sprintf("failed to derive pods from service: %s", err.Error())}
|
||||
}
|
||||
for _, p := range pods.Items {
|
||||
if p.Status.PodIP == "" {
|
||||
continue
|
||||
}
|
||||
ips = append(ips, p.Status.PodIP)
|
||||
}
|
||||
|
||||
|
@ -374,27 +374,49 @@ func getIpsForTargetHosts(targetHosts string, clients clients.ClientSets, servic
|
|||
var commaSeparatedIPs []string
|
||||
for i := range hosts {
|
||||
hosts[i] = strings.TrimSpace(hosts[i])
|
||||
if strings.Contains(hosts[i], "svc.cluster.local") && serviceMesh {
|
||||
ips, err := getPodIPFromService(hosts[i], clients)
|
||||
var (
|
||||
hostName = hosts[i]
|
||||
ports []string
|
||||
)
|
||||
|
||||
if strings.Contains(hosts[i], "|") {
|
||||
host := strings.Split(hosts[i], "|")
|
||||
hostName = host[0]
|
||||
ports = host[1:]
|
||||
log.Infof("host and port: %v :%v", hostName, ports)
|
||||
}
|
||||
|
||||
if strings.Contains(hostName, "svc.cluster.local") && serviceMesh {
|
||||
ips, err := getPodIPFromService(hostName, clients)
|
||||
if err != nil {
|
||||
return "", stacktrace.Propagate(err, "could not get pod ips from service")
|
||||
}
|
||||
log.Infof("Host: {%v}, IP address: {%v}", hosts[i], ips)
|
||||
commaSeparatedIPs = append(commaSeparatedIPs, ips...)
|
||||
if ports != nil {
|
||||
for j := range ips {
|
||||
commaSeparatedIPs = append(commaSeparatedIPs, ips[j]+"|"+strings.Join(ports, "|"))
|
||||
}
|
||||
} else {
|
||||
commaSeparatedIPs = append(commaSeparatedIPs, ips...)
|
||||
}
|
||||
|
||||
if finalHosts == "" {
|
||||
finalHosts = hosts[i]
|
||||
} else {
|
||||
finalHosts = finalHosts + "," + hosts[i]
|
||||
}
|
||||
finalHosts = finalHosts + "," + hosts[i]
|
||||
continue
|
||||
}
|
||||
ips, err := net.LookupIP(hosts[i])
|
||||
ips, err := net.LookupIP(hostName)
|
||||
if err != nil {
|
||||
log.Warnf("Unknown host: {%v}, it won't be included in the scope of chaos", hosts[i])
|
||||
log.Warnf("Unknown host: {%v}, it won't be included in the scope of chaos", hostName)
|
||||
} else {
|
||||
for j := range ips {
|
||||
log.Infof("Host: {%v}, IP address: {%v}", hosts[i], ips[j])
|
||||
log.Infof("Host: {%v}, IP address: {%v}", hostName, ips[j])
|
||||
if ports != nil {
|
||||
commaSeparatedIPs = append(commaSeparatedIPs, ips[j].String()+"|"+strings.Join(ports, "|"))
|
||||
continue
|
||||
}
|
||||
commaSeparatedIPs = append(commaSeparatedIPs, ips[j].String())
|
||||
}
|
||||
if finalHosts == "" {
|
||||
|
@ -411,8 +433,8 @@ func getIpsForTargetHosts(targetHosts string, clients clients.ClientSets, servic
|
|||
return strings.Join(commaSeparatedIPs, ","), nil
|
||||
}
|
||||
|
||||
//SetChaosTunables will set up a random value within a given range of values
|
||||
//If the value is not provided in range it'll set up the initial provided value.
|
||||
// SetChaosTunables will set up a random value within a given range of values
|
||||
// If the value is not provided in range it'll set up the initial provided value.
|
||||
func SetChaosTunables(experimentsDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentsDetails.NetworkPacketLossPercentage = common.ValidateRange(experimentsDetails.NetworkPacketLossPercentage)
|
||||
experimentsDetails.NetworkPacketCorruptionPercentage = common.ValidateRange(experimentsDetails.NetworkPacketCorruptionPercentage)
|
||||
|
@ -490,6 +512,7 @@ func logExperimentFields(experimentsDetails *experimentTypes.ExperimentDetails)
|
|||
"NetworkPacketLossPercentage": experimentsDetails.NetworkPacketLossPercentage,
|
||||
"Sequence": experimentsDetails.Sequence,
|
||||
"PodsAffectedPerc": experimentsDetails.PodsAffectedPerc,
|
||||
"Correlation": experimentsDetails.Correlation,
|
||||
})
|
||||
case "network-latency":
|
||||
log.InfoWithValues("[Info]: The chaos tunables are:", logrus.Fields{
|
||||
|
@ -497,18 +520,28 @@ func logExperimentFields(experimentsDetails *experimentTypes.ExperimentDetails)
|
|||
"Jitter": experimentsDetails.Jitter,
|
||||
"Sequence": experimentsDetails.Sequence,
|
||||
"PodsAffectedPerc": experimentsDetails.PodsAffectedPerc,
|
||||
"Correlation": experimentsDetails.Correlation,
|
||||
})
|
||||
case "network-corruption":
|
||||
log.InfoWithValues("[Info]: The chaos tunables are:", logrus.Fields{
|
||||
"NetworkPacketCorruptionPercentage": experimentsDetails.NetworkPacketCorruptionPercentage,
|
||||
"Sequence": experimentsDetails.Sequence,
|
||||
"PodsAffectedPerc": experimentsDetails.PodsAffectedPerc,
|
||||
"Correlation": experimentsDetails.Correlation,
|
||||
})
|
||||
case "network-duplication":
|
||||
log.InfoWithValues("[Info]: The chaos tunables are:", logrus.Fields{
|
||||
"NetworkPacketDuplicationPercentage": experimentsDetails.NetworkPacketDuplicationPercentage,
|
||||
"Sequence": experimentsDetails.Sequence,
|
||||
"PodsAffectedPerc": experimentsDetails.PodsAffectedPerc,
|
||||
"Correlation": experimentsDetails.Correlation,
|
||||
})
|
||||
case "network-rate-limit":
|
||||
log.InfoWithValues("[Info]: The chaos tunables are:", logrus.Fields{
|
||||
"NetworkBandwidth": experimentsDetails.NetworkBandwidth,
|
||||
"Sequence": experimentsDetails.Sequence,
|
||||
"PodsAffectedPerc": experimentsDetails.PodsAffectedPerc,
|
||||
"Correlation": experimentsDetails.Correlation,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
package rate
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
network_chaos "github.com/litmuschaos/litmus-go/chaoslib/litmus/network-chaos/lib"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/network-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
// PodNetworkRateChaos contains the steps to prepare and inject chaos
|
||||
func PodNetworkRateChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodNetworkRateLimit")
|
||||
defer span.End()
|
||||
|
||||
args := fmt.Sprintf("tbf rate %s burst %s limit %s", experimentsDetails.NetworkBandwidth, experimentsDetails.Burst, experimentsDetails.Limit)
|
||||
if experimentsDetails.PeakRate != "" {
|
||||
args = fmt.Sprintf("%s peakrate %s", args, experimentsDetails.PeakRate)
|
||||
}
|
||||
if experimentsDetails.MinBurst != "" {
|
||||
args = fmt.Sprintf("%s mtu %s", args, experimentsDetails.MinBurst)
|
||||
}
|
||||
|
||||
return network_chaos.PrepareAndInjectChaos(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails, args)
|
||||
}
|
|
@ -7,9 +7,11 @@ import (
|
|||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-cpu-hog/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -24,7 +26,9 @@ import (
|
|||
)
|
||||
|
||||
// PrepareNodeCPUHog contains preparation steps before chaos injection
|
||||
func PrepareNodeCPUHog(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareNodeCPUHog(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareNodeCPUHogFault")
|
||||
defer span.End()
|
||||
|
||||
//set up the tunables if provided in range
|
||||
setChaosTunables(experimentsDetails)
|
||||
|
@ -62,11 +66,11 @@ func PrepareNodeCPUHog(experimentsDetails *experimentTypes.ExperimentDetails, cl
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -82,13 +86,15 @@ func PrepareNodeCPUHog(experimentsDetails *experimentTypes.ExperimentDetails, cl
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stress the cpu of all the target nodes serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectNodeCPUHogFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
nodeCPUCores := experimentsDetails.NodeCPUcores
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -116,7 +122,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
experimentsDetails.RunID = stringutils.GetRunID()
|
||||
|
||||
// Creating the helper pod to perform node cpu hog
|
||||
if err := createHelperPod(experimentsDetails, chaosDetails, appNode, clients); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, chaosDetails, appNode, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
|
@ -149,12 +155,15 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode stress the cpu of all the target nodes in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectNodeCPUHogFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
nodeCPUCores := experimentsDetails.NodeCPUcores
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -182,44 +191,23 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
})
|
||||
|
||||
// Creating the helper pod to perform node cpu hog
|
||||
if err := createHelperPod(experimentsDetails, chaosDetails, appNode, clients); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, chaosDetails, appNode, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, experimentsDetails.RunID)
|
||||
|
||||
//Checking the status of helper pod
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
for _, appNode := range targetNodeList {
|
||||
common.SetTargets(appNode, "targeted", "node", chaosDetails)
|
||||
}
|
||||
|
||||
// Wait till the completion of helper pod
|
||||
log.Info("[Wait]: Waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, false)
|
||||
}
|
||||
|
||||
//Deleting the helper pod
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
//setCPUCapacity fetch the node cpu capacity
|
||||
// setCPUCapacity fetch the node cpu capacity
|
||||
func setCPUCapacity(experimentsDetails *experimentTypes.ExperimentDetails, appNode string, clients clients.ClientSets) error {
|
||||
node, err := clients.KubeClient.CoreV1().Nodes().Get(context.Background(), appNode, v1.GetOptions{})
|
||||
node, err := clients.GetNode(appNode, experimentsDetails.Timeout, experimentsDetails.Delay)
|
||||
if err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Target: fmt.Sprintf("{nodeName: %s}", appNode), Reason: err.Error()}
|
||||
}
|
||||
|
@ -228,7 +216,9 @@ func setCPUCapacity(experimentsDetails *experimentTypes.ExperimentDetails, appNo
|
|||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, chaosDetails *types.ChaosDetails, appNode string, clients clients.ClientSets) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, chaosDetails *types.ChaosDetails, appNode string, clients clients.ClientSets) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateNodeCPUHogFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
||||
|
@ -271,15 +261,15 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, chao
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
//setChaosTunables will set up a random value within a given range of values
|
||||
//If the value is not provided in range it'll set up the initial provided value.
|
||||
// setChaosTunables will set up a random value within a given range of values
|
||||
// If the value is not provided in range it'll set up the initial provided value.
|
||||
func setChaosTunables(experimentsDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentsDetails.NodeCPUcores = common.ValidateRange(experimentsDetails.NodeCPUcores)
|
||||
experimentsDetails.CPULoad = common.ValidateRange(experimentsDetails.CPULoad)
|
||||
|
|
|
@ -3,8 +3,6 @@ package lib
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/palantir/stacktrace"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
|
@ -13,7 +11,12 @@ import (
|
|||
"syscall"
|
||||
"time"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-drain/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -31,8 +34,10 @@ var (
|
|||
inject, abort chan os.Signal
|
||||
)
|
||||
|
||||
//PrepareNodeDrain contains the preparation steps before chaos injection
|
||||
func PrepareNodeDrain(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PrepareNodeDrain contains the preparation steps before chaos injection
|
||||
func PrepareNodeDrain(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareNodeDrainFault")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -66,7 +71,7 @@ func PrepareNodeDrain(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -75,7 +80,11 @@ func PrepareNodeDrain(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
go abortWatcher(experimentsDetails, clients, resultDetails, chaosDetails, eventsDetails)
|
||||
|
||||
// Drain the application node
|
||||
if err := drainNode(experimentsDetails, clients, chaosDetails); err != nil {
|
||||
if err := drainNode(ctx, experimentsDetails, clients, chaosDetails); err != nil {
|
||||
log.Info("[Revert]: Reverting chaos because error during draining of node")
|
||||
if uncordonErr := uncordonNode(experimentsDetails, clients, chaosDetails); uncordonErr != nil {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s,%s]", stacktrace.RootCause(err).Error(), stacktrace.RootCause(uncordonErr).Error())}
|
||||
}
|
||||
return stacktrace.Propagate(err, "could not drain node")
|
||||
}
|
||||
|
||||
|
@ -121,7 +130,9 @@ func PrepareNodeDrain(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
}
|
||||
|
||||
// drainNode drain the target node
|
||||
func drainNode(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails) error {
|
||||
func drainNode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectNodeDrainFault")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -161,7 +172,7 @@ func uncordonNode(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
for _, targetNode := range targetNodes {
|
||||
|
||||
//Check node exist before uncordon the node
|
||||
_, err := clients.KubeClient.CoreV1().Nodes().Get(context.Background(), targetNode, v1.GetOptions{})
|
||||
_, err := clients.GetNode(targetNode, chaosDetails.Timeout, chaosDetails.Delay)
|
||||
if err != nil {
|
||||
if apierrors.IsNotFound(err) {
|
||||
log.Infof("[Info]: The %v node is no longer exist, skip uncordon the node", targetNode)
|
||||
|
|
|
@ -7,9 +7,11 @@ import (
|
|||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-io-stress/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -24,8 +26,9 @@ import (
|
|||
)
|
||||
|
||||
// PrepareNodeIOStress contains preparation steps before chaos injection
|
||||
func PrepareNodeIOStress(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
func PrepareNodeIOStress(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareNodeIOStressFault")
|
||||
defer span.End()
|
||||
//set up the tunables if provided in range
|
||||
setChaosTunables(experimentsDetails)
|
||||
|
||||
|
@ -63,11 +66,11 @@ func PrepareNodeIOStress(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -83,11 +86,13 @@ func PrepareNodeIOStress(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stress the io of all the target nodes serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectNodeIOStressFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -109,7 +114,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
experimentsDetails.RunID = stringutils.GetRunID()
|
||||
|
||||
// Creating the helper pod to perform node io stress
|
||||
if err := createHelperPod(experimentsDetails, chaosDetails, appNode, clients); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, chaosDetails, appNode, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
|
@ -121,31 +126,24 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
common.SetTargets(appNode, "injected", "node", chaosDetails)
|
||||
|
||||
log.Info("[Wait]: Waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, experimentsDetails.ExperimentName)
|
||||
common.SetTargets(appNode, "reverted", "node", chaosDetails)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, false)
|
||||
}
|
||||
common.SetTargets(appNode, "targeted", "node", chaosDetails)
|
||||
|
||||
//Deleting the helper pod
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err := common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, false); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// injectChaosInParallelMode stress the io of all the target nodes in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectNodeIOStressFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -167,46 +165,28 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
})
|
||||
|
||||
// Creating the helper pod to perform node io stress
|
||||
if err := createHelperPod(experimentsDetails, chaosDetails, appNode, clients); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, chaosDetails, appNode, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, experimentsDetails.RunID)
|
||||
|
||||
//Checking the status of helper pod
|
||||
log.Info("[Status]: Checking the status of the helper pod")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
for _, appNode := range targetNodeList {
|
||||
common.SetTargets(appNode, "injected", "node", chaosDetails)
|
||||
common.SetTargets(appNode, "targeted", "node", chaosDetails)
|
||||
}
|
||||
|
||||
log.Info("[Wait]: Waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
for _, appNode := range targetNodeList {
|
||||
common.SetTargets(appNode, "reverted", "node", chaosDetails)
|
||||
}
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, false)
|
||||
}
|
||||
|
||||
//Deleting the helper pod
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, chaosDetails *types.ChaosDetails, appNode string, clients clients.ClientSets) error {
|
||||
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, chaosDetails *types.ChaosDetails, appNode string, clients clients.ClientSets) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateNodeIOStressFaultHelperPod")
|
||||
defer span.End()
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
||||
helperPod := &apiv1.Pod{
|
||||
|
@ -241,10 +221,10 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, chao
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -287,8 +267,8 @@ func getContainerArguments(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
return stressArgs
|
||||
}
|
||||
|
||||
//setChaosTunables will set up a random value within a given range of values
|
||||
//If the value is not provided in range it'll set up the initial provided value.
|
||||
// setChaosTunables will set up a random value within a given range of values
|
||||
// If the value is not provided in range it'll set up the initial provided value.
|
||||
func setChaosTunables(experimentsDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentsDetails.FilesystemUtilizationBytes = common.ValidateRange(experimentsDetails.FilesystemUtilizationBytes)
|
||||
experimentsDetails.FilesystemUtilizationPercentage = common.ValidateRange(experimentsDetails.FilesystemUtilizationPercentage)
|
||||
|
|
|
@ -7,25 +7,27 @@ import (
|
|||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-memory-hog/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
apiv1 "k8s.io/api/core/v1"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// PrepareNodeMemoryHog contains preparation steps before chaos injection
|
||||
func PrepareNodeMemoryHog(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareNodeMemoryHog(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareNodeMemoryHogFault")
|
||||
defer span.End()
|
||||
|
||||
//set up the tunables if provided in range
|
||||
setChaosTunables(experimentsDetails)
|
||||
|
@ -64,11 +66,11 @@ func PrepareNodeMemoryHog(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetNodeList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -84,11 +86,13 @@ func PrepareNodeMemoryHog(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stress the memory of all the target nodes serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectNodeMemoryHogFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -122,47 +126,29 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// Creating the helper pod to perform node memory hog
|
||||
if err = createHelperPod(experimentsDetails, chaosDetails, appNode, clients, MemoryConsumption); err != nil {
|
||||
if err = createHelperPod(ctx, experimentsDetails, chaosDetails, appNode, clients, MemoryConsumption); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, experimentsDetails.RunID)
|
||||
|
||||
//Checking the status of helper pod
|
||||
log.Info("[Status]: Checking the status of the helper pod")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
common.SetTargets(appNode, "targeted", "node", chaosDetails)
|
||||
|
||||
// Wait till the completion of helper pod
|
||||
log.Info("[Wait]: Waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, experimentsDetails.ExperimentName)
|
||||
if err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, false)
|
||||
} else if podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return errors.Errorf("helper pod status is %v", podStatus)
|
||||
}
|
||||
|
||||
//Deleting the helper pod
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err := common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, false); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// injectChaosInParallelMode stress the memory all the target nodes in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetNodeList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectNodeMemoryHogFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -196,36 +182,19 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
}
|
||||
|
||||
// Creating the helper pod to perform node memory hog
|
||||
if err = createHelperPod(experimentsDetails, chaosDetails, appNode, clients, MemoryConsumption); err != nil {
|
||||
if err = createHelperPod(ctx, experimentsDetails, chaosDetails, appNode, clients, MemoryConsumption); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, experimentsDetails.RunID)
|
||||
|
||||
//Checking the status of helper pod
|
||||
log.Info("[Status]: Checking the status of the helper pod")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
for _, appNode := range targetNodeList {
|
||||
common.SetTargets(appNode, "targeted", "node", chaosDetails)
|
||||
}
|
||||
|
||||
// Wait till the completion of helper pod
|
||||
log.Info("[Wait]: Waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, false)
|
||||
}
|
||||
|
||||
//Deleting the helper pod
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -233,8 +202,7 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
|
||||
// getNodeMemoryDetails will return the total memory capacity and memory allocatable of an application node
|
||||
func getNodeMemoryDetails(appNodeName string, clients clients.ClientSets) (int, int, error) {
|
||||
|
||||
nodeDetails, err := clients.KubeClient.CoreV1().Nodes().Get(context.Background(), appNodeName, v1.GetOptions{})
|
||||
nodeDetails, err := clients.GetNode(appNodeName, 180, 2)
|
||||
if err != nil {
|
||||
return 0, 0, cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Target: fmt.Sprintf("{nodeName: %s}", appNodeName), Reason: err.Error()}
|
||||
}
|
||||
|
@ -312,7 +280,9 @@ func calculateMemoryConsumption(experimentsDetails *experimentTypes.ExperimentDe
|
|||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, chaosDetails *types.ChaosDetails, appNode string, clients clients.ClientSets, MemoryConsumption string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, chaosDetails *types.ChaosDetails, appNode string, clients clients.ClientSets, MemoryConsumption string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateNodeMemoryHogFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
||||
|
@ -355,15 +325,15 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, chao
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
//setChaosTunables will set up a random value within a given range of values
|
||||
//If the value is not provided in range it'll set up the initial provided value.
|
||||
// setChaosTunables will set up a random value within a given range of values
|
||||
// If the value is not provided in range it'll set up the initial provided value.
|
||||
func setChaosTunables(experimentsDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentsDetails.MemoryConsumptionMebibytes = common.ValidateRange(experimentsDetails.MemoryConsumptionMebibytes)
|
||||
experimentsDetails.MemoryConsumptionPercentage = common.ValidateRange(experimentsDetails.MemoryConsumptionPercentage)
|
||||
|
|
|
@ -7,14 +7,14 @@ import (
|
|||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-restart/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
|
@ -38,7 +38,9 @@ const (
|
|||
)
|
||||
|
||||
// PrepareNodeRestart contains preparation steps before chaos injection
|
||||
func PrepareNodeRestart(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareNodeRestart(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareNodeRestartFault")
|
||||
defer span.End()
|
||||
|
||||
//Select the node
|
||||
if experimentsDetails.TargetNode == "" {
|
||||
|
@ -81,41 +83,19 @@ func PrepareNodeRestart(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
}
|
||||
|
||||
// Creating the helper pod to perform node restart
|
||||
if err = createHelperPod(experimentsDetails, chaosDetails, clients); err != nil {
|
||||
if err = createHelperPod(ctx, experimentsDetails, chaosDetails, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, experimentsDetails.RunID)
|
||||
|
||||
//Checking the status of helper pod
|
||||
log.Info("[Status]: Checking the status of the helper pod")
|
||||
if err = status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteHelperPodBasedOnJobCleanupPolicy(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
if err := common.CheckHelperStatusAndRunProbes(ctx, appLabel, experimentsDetails.TargetNode, chaosDetails, clients, resultDetails, eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
common.SetTargets(experimentsDetails.TargetNode, "targeted", "node", chaosDetails)
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Wait till the completion of helper pod
|
||||
log.Info("[Wait]: Waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteHelperPodBasedOnJobCleanupPolicy(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, false)
|
||||
}
|
||||
|
||||
//Deleting the helper pod
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err = common.DeletePod(experimentsDetails.ExperimentName+"-helper-"+experimentsDetails.RunID, appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod")
|
||||
if err := common.WaitForCompletionAndDeleteHelperPods(appLabel, chaosDetails, clients, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
//Waiting for the ramp time after chaos injection
|
||||
|
@ -123,14 +103,17 @@ func PrepareNodeRestart(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
log.Infof("[Ramp]: Waiting for the %vs ramp time after injecting chaos", strconv.Itoa(experimentsDetails.RampTime))
|
||||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, chaosDetails *types.ChaosDetails, clients clients.ClientSets) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, chaosDetails *types.ChaosDetails, clients clients.ClientSets) error {
|
||||
// This method is attaching emptyDir along with secret volume, and copy data from secret
|
||||
// to the emptyDir, because secret is mounted as readonly and with 777 perms and it can't be changed
|
||||
// because of: https://github.com/kubernetes/kubernetes/issues/57923
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreateNodeRestartFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
||||
|
@ -208,16 +191,16 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, chao
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getInternalIP gets the internal ip of the given node
|
||||
func getInternalIP(nodeName string, clients clients.ClientSets) (string, error) {
|
||||
node, err := clients.KubeClient.CoreV1().Nodes().Get(context.Background(), nodeName, v1.GetOptions{})
|
||||
node, err := clients.GetNode(nodeName, 180, 2)
|
||||
if err != nil {
|
||||
return "", cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Target: fmt.Sprintf("{nodeName: %s}", nodeName), Reason: err.Error()}
|
||||
}
|
||||
|
|
|
@ -3,15 +3,18 @@ package lib
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/palantir/stacktrace"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-taint/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -20,7 +23,6 @@ import (
|
|||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
apiv1 "k8s.io/api/core/v1"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -28,8 +30,10 @@ var (
|
|||
inject, abort chan os.Signal
|
||||
)
|
||||
|
||||
//PrepareNodeTaint contains the preparation steps before chaos injection
|
||||
func PrepareNodeTaint(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PrepareNodeTaint contains the preparation steps before chaos injection
|
||||
func PrepareNodeTaint(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareNodeTaintFault")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -63,7 +67,7 @@ func PrepareNodeTaint(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -72,7 +76,7 @@ func PrepareNodeTaint(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
go abortWatcher(experimentsDetails, clients, resultDetails, chaosDetails, eventsDetails)
|
||||
|
||||
// taint the application node
|
||||
if err := taintNode(experimentsDetails, clients, chaosDetails); err != nil {
|
||||
if err := taintNode(ctx, experimentsDetails, clients, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not taint node")
|
||||
}
|
||||
|
||||
|
@ -117,7 +121,9 @@ func PrepareNodeTaint(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
}
|
||||
|
||||
// taintNode taint the application node
|
||||
func taintNode(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails) error {
|
||||
func taintNode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectNodeTaintFault")
|
||||
defer span.End()
|
||||
|
||||
// get the taint labels & effect
|
||||
taintKey, taintValue, taintEffect := getTaintDetails(experimentsDetails)
|
||||
|
@ -125,7 +131,7 @@ func taintNode(experimentsDetails *experimentTypes.ExperimentDetails, clients cl
|
|||
log.Infof("Add %v taints to the %v node", taintKey+"="+taintValue+":"+taintEffect, experimentsDetails.TargetNode)
|
||||
|
||||
// get the node details
|
||||
node, err := clients.KubeClient.CoreV1().Nodes().Get(context.Background(), experimentsDetails.TargetNode, v1.GetOptions{})
|
||||
node, err := clients.GetNode(experimentsDetails.TargetNode, chaosDetails.Timeout, chaosDetails.Delay)
|
||||
if err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Target: fmt.Sprintf("{nodeName: %s}", experimentsDetails.TargetNode), Reason: err.Error()}
|
||||
}
|
||||
|
@ -151,8 +157,7 @@ func taintNode(experimentsDetails *experimentTypes.ExperimentDetails, clients cl
|
|||
Effect: apiv1.TaintEffect(taintEffect),
|
||||
})
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Nodes().Update(context.Background(), node, v1.UpdateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.UpdateNode(chaosDetails, node); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Target: fmt.Sprintf("{nodeName: %s}", node.Name), Reason: fmt.Sprintf("failed to add taints: %s", err.Error())}
|
||||
}
|
||||
}
|
||||
|
@ -172,7 +177,7 @@ func removeTaintFromNode(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
taintKey := strings.Split(taintLabel[0], "=")[0]
|
||||
|
||||
// get the node details
|
||||
node, err := clients.KubeClient.CoreV1().Nodes().Get(context.Background(), experimentsDetails.TargetNode, v1.GetOptions{})
|
||||
node, err := clients.GetNode(experimentsDetails.TargetNode, chaosDetails.Timeout, chaosDetails.Delay)
|
||||
if err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosRevert, Target: fmt.Sprintf("{nodeName: %s}", experimentsDetails.TargetNode), Reason: err.Error()}
|
||||
}
|
||||
|
@ -195,8 +200,7 @@ func removeTaintFromNode(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
}
|
||||
}
|
||||
node.Spec.Taints = newTaints
|
||||
updatedNodeWithTaint, err := clients.KubeClient.CoreV1().Nodes().Update(context.Background(), node, v1.UpdateOptions{})
|
||||
if err != nil || updatedNodeWithTaint == nil {
|
||||
if err := clients.UpdateNode(chaosDetails, node); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosRevert, Target: fmt.Sprintf("{nodeName: %s}", node.Name), Reason: fmt.Sprintf("failed to remove taints: %s", err.Error())}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,15 +3,18 @@ package lib
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/palantir/stacktrace"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-autoscaler/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/math"
|
||||
|
@ -31,8 +34,10 @@ var (
|
|||
appsv1StatefulsetClient appsv1.StatefulSetInterface
|
||||
)
|
||||
|
||||
//PreparePodAutoscaler contains the preparation steps and chaos injection steps
|
||||
func PreparePodAutoscaler(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PreparePodAutoscaler contains the preparation steps and chaos injection steps
|
||||
func PreparePodAutoscaler(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodAutoscalerFault")
|
||||
defer span.End()
|
||||
|
||||
//Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
|
@ -64,7 +69,7 @@ func PreparePodAutoscaler(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
//calling go routine which will continuously watch for the abort signal
|
||||
go abortPodAutoScalerChaos(appsUnderTest, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails)
|
||||
|
||||
if err = podAutoscalerChaosInDeployment(experimentsDetails, clients, appsUnderTest, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = podAutoscalerChaosInDeployment(ctx, experimentsDetails, clients, appsUnderTest, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not scale deployment")
|
||||
}
|
||||
|
||||
|
@ -91,7 +96,7 @@ func PreparePodAutoscaler(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
//calling go routine which will continuously watch for the abort signal
|
||||
go abortPodAutoScalerChaos(appsUnderTest, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails)
|
||||
|
||||
if err = podAutoscalerChaosInStatefulset(experimentsDetails, clients, appsUnderTest, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = podAutoscalerChaosInStatefulset(ctx, experimentsDetails, clients, appsUnderTest, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not scale statefulset")
|
||||
}
|
||||
|
||||
|
@ -117,7 +122,7 @@ func getSliceOfTotalApplicationsTargeted(appList []experimentTypes.ApplicationUn
|
|||
return appList[:newAppListLength]
|
||||
}
|
||||
|
||||
//getDeploymentDetails is used to get the name and total number of replicas of the deployment
|
||||
// getDeploymentDetails is used to get the name and total number of replicas of the deployment
|
||||
func getDeploymentDetails(experimentsDetails *experimentTypes.ExperimentDetails) ([]experimentTypes.ApplicationUnderTest, error) {
|
||||
|
||||
deploymentList, err := appsv1DeploymentClient.List(context.Background(), metav1.ListOptions{LabelSelector: experimentsDetails.AppLabel})
|
||||
|
@ -135,7 +140,7 @@ func getDeploymentDetails(experimentsDetails *experimentTypes.ExperimentDetails)
|
|||
return getSliceOfTotalApplicationsTargeted(appsUnderTest, experimentsDetails), nil
|
||||
}
|
||||
|
||||
//getStatefulsetDetails is used to get the name and total number of replicas of the statefulsets
|
||||
// getStatefulsetDetails is used to get the name and total number of replicas of the statefulsets
|
||||
func getStatefulsetDetails(experimentsDetails *experimentTypes.ExperimentDetails) ([]experimentTypes.ApplicationUnderTest, error) {
|
||||
|
||||
statefulsetList, err := appsv1StatefulsetClient.List(context.Background(), metav1.ListOptions{LabelSelector: experimentsDetails.AppLabel})
|
||||
|
@ -154,8 +159,8 @@ func getStatefulsetDetails(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
return getSliceOfTotalApplicationsTargeted(appsUnderTest, experimentsDetails), nil
|
||||
}
|
||||
|
||||
//podAutoscalerChaosInDeployment scales up the replicas of deployment and verify the status
|
||||
func podAutoscalerChaosInDeployment(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// podAutoscalerChaosInDeployment scales up the replicas of deployment and verify the status
|
||||
func podAutoscalerChaosInDeployment(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// Scale Application
|
||||
retryErr := retries.RetryOnConflict(retries.DefaultRetry, func() error {
|
||||
|
@ -182,11 +187,11 @@ func podAutoscalerChaosInDeployment(experimentsDetails *experimentTypes.Experime
|
|||
}
|
||||
log.Info("[Info]: The application started scaling")
|
||||
|
||||
return deploymentStatusCheck(experimentsDetails, clients, appsUnderTest, resultDetails, eventsDetails, chaosDetails)
|
||||
return deploymentStatusCheck(ctx, experimentsDetails, clients, appsUnderTest, resultDetails, eventsDetails, chaosDetails)
|
||||
}
|
||||
|
||||
//podAutoscalerChaosInStatefulset scales up the replicas of statefulset and verify the status
|
||||
func podAutoscalerChaosInStatefulset(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// podAutoscalerChaosInStatefulset scales up the replicas of statefulset and verify the status
|
||||
func podAutoscalerChaosInStatefulset(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// Scale Application
|
||||
retryErr := retries.RetryOnConflict(retries.DefaultRetry, func() error {
|
||||
|
@ -212,11 +217,11 @@ func podAutoscalerChaosInStatefulset(experimentsDetails *experimentTypes.Experim
|
|||
}
|
||||
log.Info("[Info]: The application started scaling")
|
||||
|
||||
return statefulsetStatusCheck(experimentsDetails, clients, appsUnderTest, resultDetails, eventsDetails, chaosDetails)
|
||||
return statefulsetStatusCheck(ctx, experimentsDetails, clients, appsUnderTest, resultDetails, eventsDetails, chaosDetails)
|
||||
}
|
||||
|
||||
// deploymentStatusCheck check the status of deployment and verify the available replicas
|
||||
func deploymentStatusCheck(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func deploymentStatusCheck(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
|
@ -246,7 +251,7 @@ func deploymentStatusCheck(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -261,7 +266,7 @@ func deploymentStatusCheck(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
}
|
||||
|
||||
// statefulsetStatusCheck check the status of statefulset and verify the available replicas
|
||||
func statefulsetStatusCheck(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func statefulsetStatusCheck(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
|
@ -291,7 +296,7 @@ func statefulsetStatusCheck(experimentsDetails *experimentTypes.ExperimentDetail
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -305,7 +310,7 @@ func statefulsetStatusCheck(experimentsDetails *experimentTypes.ExperimentDetail
|
|||
return nil
|
||||
}
|
||||
|
||||
//autoscalerRecoveryInDeployment rollback the replicas to initial values in deployment
|
||||
// autoscalerRecoveryInDeployment rollback the replicas to initial values in deployment
|
||||
func autoscalerRecoveryInDeployment(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// Scale back to initial number of replicas
|
||||
|
@ -351,7 +356,7 @@ func autoscalerRecoveryInDeployment(experimentsDetails *experimentTypes.Experime
|
|||
})
|
||||
}
|
||||
|
||||
//autoscalerRecoveryInStatefulset rollback the replicas to initial values in deployment
|
||||
// autoscalerRecoveryInStatefulset rollback the replicas to initial values in deployment
|
||||
func autoscalerRecoveryInStatefulset(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, appsUnderTest []experimentTypes.ApplicationUnderTest, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// Scale back to initial number of replicas
|
||||
|
@ -399,7 +404,7 @@ func autoscalerRecoveryInStatefulset(experimentsDetails *experimentTypes.Experim
|
|||
|
||||
func int32Ptr(i int32) *int32 { return &i }
|
||||
|
||||
//abortPodAutoScalerChaos go routine will continuously watch for the abort signal for the entire chaos duration and generate the required events and result
|
||||
// abortPodAutoScalerChaos go routine will continuously watch for the abort signal for the entire chaos duration and generate the required events and result
|
||||
func abortPodAutoScalerChaos(appsUnderTest []experimentTypes.ApplicationUnderTest, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) {
|
||||
|
||||
// signChan channel is used to transmit signal notifications.
|
||||
|
|
|
@ -1,16 +1,20 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/palantir/stacktrace"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-cpu-hog-exec/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -25,9 +29,10 @@ import (
|
|||
|
||||
var inject chan os.Signal
|
||||
|
||||
//PrepareCPUExecStress contains the chaos preparation and injection steps
|
||||
func PrepareCPUExecStress(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// PrepareCPUExecStress contains the chaos preparation and injection steps
|
||||
func PrepareCPUExecStress(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodCPUHogExecFault")
|
||||
defer span.End()
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
// Catch and relay certain signal(s) to inject channel.
|
||||
|
@ -39,7 +44,7 @@ func PrepareCPUExecStress(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
//Starting the CPU stress experiment
|
||||
if err := experimentCPU(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := experimentCPU(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not stress cpu")
|
||||
}
|
||||
//Waiting for the ramp time after chaos injection
|
||||
|
@ -54,7 +59,7 @@ func PrepareCPUExecStress(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
// The function will be constantly increasing the CPU utilisation until it reaches the maximum available or allowed number.
|
||||
// Using the TOTAL_CHAOS_DURATION we will need to specify for how long this experiment will last
|
||||
func stressCPU(experimentsDetails *experimentTypes.ExperimentDetails, podName, ns string, clients clients.ClientSets, stressErr chan error) {
|
||||
// It will contains all the pod & container details required for exec command
|
||||
// It will contain all the pod & container details required for exec command
|
||||
execCommandDetails := litmusexec.PodDetails{}
|
||||
command := []string{"/bin/sh", "-c", experimentsDetails.ChaosInjectCmd}
|
||||
litmusexec.SetExecCommandAttributes(&execCommandDetails, podName, experimentsDetails.TargetContainer, ns)
|
||||
|
@ -62,9 +67,8 @@ func stressCPU(experimentsDetails *experimentTypes.ExperimentDetails, podName, n
|
|||
stressErr <- err
|
||||
}
|
||||
|
||||
//experimentCPU function orchestrates the experiment by calling the StressCPU function for every core, of every container, of every pod that is targeted
|
||||
func experimentCPU(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// experimentCPU function orchestrates the experiment by calling the StressCPU function for every core, of every container, of every pod that is targeted
|
||||
func experimentCPU(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// Get the target pod details for the chaos execution
|
||||
// if the target pod is not defined it will derive the random target pod list using pod affected percentage
|
||||
if experimentsDetails.TargetPods == "" && chaosDetails.AppDetail == nil {
|
||||
|
@ -85,11 +89,11 @@ func experimentCPU(experimentsDetails *experimentTypes.ExperimentDetails, client
|
|||
experimentsDetails.IsTargetContainerProvided = experimentsDetails.TargetContainer != ""
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -100,11 +104,13 @@ func experimentCPU(experimentsDetails *experimentTypes.ExperimentDetails, client
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stressed the cpu of all target application serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodCPUHogExecFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -197,13 +203,16 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode stressed the cpu of all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodCPUHogExecFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
// creating err channel to receive the error from the go routine
|
||||
stressErr := make(chan error)
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -287,7 +296,8 @@ loop:
|
|||
}
|
||||
|
||||
// killStressCPUSerial function to kill a stress process running inside target container
|
||||
// Triggered by either timeout of chaos duration or termination of the experiment
|
||||
//
|
||||
// Triggered by either timeout of chaos duration or termination of the experiment
|
||||
func killStressCPUSerial(experimentsDetails *experimentTypes.ExperimentDetails, podName, ns string, clients clients.ClientSets, chaosDetails *types.ChaosDetails) error {
|
||||
// It will contain all the pod & container details required for exec command
|
||||
execCommandDetails := litmusexec.PodDetails{}
|
||||
|
|
|
@ -8,23 +8,26 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/workloads"
|
||||
"github.com/palantir/stacktrace"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-delete/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/workloads"
|
||||
"github.com/palantir/stacktrace"
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opentelemetry.io/otel"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
// PreparePodDelete contains the prepration steps before chaos injection
|
||||
func PreparePodDelete(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PreparePodDelete contains the preparation steps before chaos injection
|
||||
func PreparePodDelete(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodDeleteFault")
|
||||
defer span.End()
|
||||
|
||||
//Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
|
@ -42,11 +45,11 @@ func PreparePodDelete(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err := injectChaosInSerialMode(experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
if err := injectChaosInSerialMode(ctx, experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err := injectChaosInParallelMode(experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
if err := injectChaosInParallelMode(ctx, experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -62,11 +65,13 @@ func PreparePodDelete(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode delete the target application pods serial mode(one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodDeleteFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -159,11 +164,13 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode delete the target application pods in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodDeleteFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,9 +2,12 @@ package helper
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
|
@ -34,7 +37,9 @@ const (
|
|||
)
|
||||
|
||||
// Helper injects the dns chaos
|
||||
func Helper(clients clients.ClientSets) {
|
||||
func Helper(ctx context.Context, clients clients.ClientSets) {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "SimulatePodDNSFault")
|
||||
defer span.End()
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
eventsDetails := types.EventDetails{}
|
||||
|
@ -74,7 +79,7 @@ func Helper(clients clients.ClientSets) {
|
|||
|
||||
}
|
||||
|
||||
//preparePodDNSChaos contains the preparation steps before chaos injection
|
||||
// preparePodDNSChaos contains the preparation steps before chaos injection
|
||||
func preparePodDNSChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails) error {
|
||||
|
||||
targetList, err := common.ParseTargets(chaosDetails.ChaosPodName)
|
||||
|
@ -264,7 +269,7 @@ func abortWatcher(targets []targetDetails, resultName, chaosNS string) {
|
|||
os.Exit(1)
|
||||
}
|
||||
|
||||
//getENV fetches all the env variables from the runner pod
|
||||
// getENV fetches all the env variables from the runner pod
|
||||
func getENV(experimentDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentDetails.ExperimentName = types.Getenv("EXPERIMENT_NAME", "")
|
||||
experimentDetails.InstanceID = types.Getenv("INSTANCE_ID", "")
|
||||
|
|
|
@ -3,29 +3,31 @@ package lib
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-dns-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
apiv1 "k8s.io/api/core/v1"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
//PrepareAndInjectChaos contains the preparation & injection steps
|
||||
func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// PrepareAndInjectChaos contains the preparation & injection steps
|
||||
func PrepareAndInjectChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodDNSFault")
|
||||
defer span.End()
|
||||
// Get the target pod details for the chaos execution
|
||||
// if the target pod is not defined it will derive the random target pod list using pod affected percentage
|
||||
if experimentsDetails.TargetPods == "" && chaosDetails.AppDetail == nil {
|
||||
|
@ -52,7 +54,7 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
if experimentsDetails.ChaosServiceAccount == "" {
|
||||
experimentsDetails.ChaosServiceAccount, err = common.GetServiceAccount(experimentsDetails.ChaosNamespace, experimentsDetails.ChaosPodName, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not experiment service account")
|
||||
return stacktrace.Propagate(err, "could not get experiment service account")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -65,11 +67,11 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
experimentsDetails.IsTargetContainerProvided = experimentsDetails.TargetContainer != ""
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -80,11 +82,13 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode inject the DNS Chaos in all target application serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodDNSFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -103,32 +107,14 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
"ContainerName": experimentsDetails.TargetContainer,
|
||||
})
|
||||
runID := stringutils.GetRunID()
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return errors.Errorf("helper pods are not in running state, err: %v", err)
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for pod-dns chaos
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -136,12 +122,13 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode inject the DNS Chaos in all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodDNSFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
var err error
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -155,45 +142,24 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
targetsPerNode = append(targetsPerNode, fmt.Sprintf("%s:%s:%s", k.Name, k.Namespace, k.TargetContainer))
|
||||
}
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
containerNames := []string{experimentsDetails.ExperimentName}
|
||||
if chaosDetails.SideCar != nil {
|
||||
containerNames = append(containerNames, experimentsDetails.ExperimentName+"-sidecar")
|
||||
}
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, containerNames...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for pod-dns chaos
|
||||
log.Info("[Cleanup]: Deleting all the helper pod")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID string) error {
|
||||
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreatePodDNSFaultHelperPod")
|
||||
defer span.End()
|
||||
privilegedEnable := true
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
||||
|
@ -235,7 +201,7 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
"./helpers -name dns-chaos",
|
||||
},
|
||||
Resources: chaosDetails.Resources,
|
||||
Env: getPodEnv(experimentsDetails, targets),
|
||||
Env: getPodEnv(ctx, experimentsDetails, targets),
|
||||
VolumeMounts: []apiv1.VolumeMount{
|
||||
{
|
||||
Name: "cri-socket",
|
||||
|
@ -255,15 +221,15 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getPodEnv derive all the env required for the helper pod
|
||||
func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets string) []apiv1.EnvVar {
|
||||
func getPodEnv(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targets string) []apiv1.EnvVar {
|
||||
|
||||
var envDetails common.ENVDetails
|
||||
envDetails.SetEnv("TARGETS", targets).
|
||||
|
@ -279,6 +245,8 @@ func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets st
|
|||
SetEnv("MATCH_SCHEME", experimentsDetails.MatchScheme).
|
||||
SetEnv("CHAOS_TYPE", experimentsDetails.ChaosType).
|
||||
SetEnv("INSTANCE_ID", experimentsDetails.InstanceID).
|
||||
SetEnv("OTEL_EXPORTER_OTLP_ENDPOINT", os.Getenv(telemetry.OTELExporterOTLPEndpoint)).
|
||||
SetEnv("TRACE_PARENT", telemetry.GetMarshalledSpanFromContext(ctx)).
|
||||
SetEnvFromDownwardAPI("v1", "metadata.name")
|
||||
|
||||
return envDetails.ENV
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -10,9 +11,11 @@ import (
|
|||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/result"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-fio-stress/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -24,8 +27,10 @@ import (
|
|||
corev1 "k8s.io/api/core/v1"
|
||||
)
|
||||
|
||||
//PrepareChaos contains the chaos preparation and injection steps
|
||||
func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PrepareChaos contains the chaos preparation and injection steps
|
||||
func PrepareChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodFIOStressFault")
|
||||
defer span.End()
|
||||
|
||||
//Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
|
@ -33,7 +38,7 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
//Starting the Fio stress experiment
|
||||
if err := experimentExecution(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := experimentExecution(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not inject chaos")
|
||||
}
|
||||
//Waiting for the ramp time after chaos injection
|
||||
|
@ -66,8 +71,8 @@ func stressStorage(experimentDetails *experimentTypes.ExperimentDetails, podName
|
|||
stressErr <- err
|
||||
}
|
||||
|
||||
//experimentExecution function orchestrates the experiment by calling the StressStorage function, of every container, of every pod that is targeted
|
||||
func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// experimentExecution function orchestrates the experiment by calling the StressStorage function, of every container, of every pod that is targeted
|
||||
func experimentExecution(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// Get the target pod details for the chaos execution
|
||||
// if the target pod is not defined it will derive the random target pod list using pod affected percentage
|
||||
|
@ -89,11 +94,11 @@ func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
experimentsDetails.IsTargetContainerProvided = experimentsDetails.TargetContainer != ""
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -104,12 +109,15 @@ func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stressed the storage of all target application in serial mode (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodFIOStressFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// creating err channel to receive the error from the go routine
|
||||
stressErr := make(chan error)
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -185,12 +193,15 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode stressed the storage of all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodFIOStressFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
// creating err channel to receive the error from the go routine
|
||||
stressErr := make(chan error)
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -265,7 +276,8 @@ loop:
|
|||
}
|
||||
|
||||
// killStressSerial function to kill a stress process running inside target container
|
||||
// Triggered by either timeout of chaos duration or termination of the experiment
|
||||
//
|
||||
// Triggered by either timeout of chaos duration or termination of the experiment
|
||||
func killStressSerial(containerName, podName, namespace, KillCmd string, clients clients.ClientSets) error {
|
||||
// It will contain all the pod & container details required for exec command
|
||||
execCommandDetails := litmusexec.PodDetails{}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -10,9 +11,11 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-memory-hog-exec/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
|
@ -27,8 +30,10 @@ import (
|
|||
|
||||
var inject chan os.Signal
|
||||
|
||||
//PrepareMemoryExecStress contains the chaos preparation and injection steps
|
||||
func PrepareMemoryExecStress(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PrepareMemoryExecStress contains the chaos preparation and injection steps
|
||||
func PrepareMemoryExecStress(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodMemoryHogExecFault")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -41,7 +46,7 @@ func PrepareMemoryExecStress(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
//Starting the Memory stress experiment
|
||||
if err := experimentMemory(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := experimentMemory(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not stress memory")
|
||||
}
|
||||
//Waiting for the ramp time after chaos injection
|
||||
|
@ -71,8 +76,8 @@ func stressMemory(MemoryConsumption, containerName, podName, namespace string, c
|
|||
stressErr <- err
|
||||
}
|
||||
|
||||
//experimentMemory function orchestrates the experiment by calling the StressMemory function, of every container, of every pod that is targeted
|
||||
func experimentMemory(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// experimentMemory function orchestrates the experiment by calling the StressMemory function, of every container, of every pod that is targeted
|
||||
func experimentMemory(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// Get the target pod details for the chaos execution
|
||||
// if the target pod is not defined it will derive the random target pod list using pod affected percentage
|
||||
|
@ -94,11 +99,11 @@ func experimentMemory(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
experimentsDetails.IsTargetContainerProvided = experimentsDetails.TargetContainer != ""
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -109,11 +114,13 @@ func experimentMemory(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stressed the memory of all target application serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodMemoryHogExecFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -203,12 +210,15 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode stressed the memory of all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodMemoryHogExecFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
// creating err channel to receive the error from the go routine
|
||||
stressErr := make(chan error)
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -291,7 +301,8 @@ loop:
|
|||
}
|
||||
|
||||
// killStressMemorySerial function to kill a stress process running inside target container
|
||||
// Triggered by either timeout of chaos duration or termination of the experiment
|
||||
//
|
||||
// Triggered by either timeout of chaos duration or termination of the experiment
|
||||
func killStressMemorySerial(containerName, podName, namespace, memFreeCmd string, clients clients.ClientSets, chaosDetails *types.ChaosDetails) error {
|
||||
// It will contains all the pod & container details required for exec command
|
||||
execCommandDetails := litmusexec.PodDetails{}
|
||||
|
|
|
@ -10,7 +10,9 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-network-partition/types"
|
||||
|
@ -31,8 +33,10 @@ var (
|
|||
inject, abort chan os.Signal
|
||||
)
|
||||
|
||||
//PrepareAndInjectChaos contains the prepration & injection steps
|
||||
func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// PrepareAndInjectChaos contains the prepration & injection steps
|
||||
func PrepareAndInjectChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodNetworkPartitionFault")
|
||||
defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -91,7 +95,7 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -102,7 +106,7 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
os.Exit(0)
|
||||
default:
|
||||
// creating the network policy to block the traffic
|
||||
if err := createNetworkPolicy(experimentsDetails, clients, np, runID); err != nil {
|
||||
if err := createNetworkPolicy(ctx, experimentsDetails, clients, np, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create network policy")
|
||||
}
|
||||
// updating chaos status to injected for the target pods
|
||||
|
@ -140,7 +144,9 @@ func PrepareAndInjectChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
|
||||
// createNetworkPolicy creates the network policy in the application namespace
|
||||
// it blocks ingress/egress traffic for the targeted application for specific/all IPs
|
||||
func createNetworkPolicy(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, networkPolicy *NetworkPolicy, runID string) error {
|
||||
func createNetworkPolicy(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, networkPolicy *NetworkPolicy, runID string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodNetworkPartitionFault")
|
||||
defer span.End()
|
||||
|
||||
np := &networkv1.NetworkPolicy{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
|
|
|
@ -0,0 +1,260 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel"
|
||||
"golang.org/x/net/context"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
awslib "github.com/litmuschaos/litmus-go/pkg/cloud/aws/rds"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/kube-aws/rds-instance-stop/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
)
|
||||
|
||||
var (
|
||||
err error
|
||||
inject, abort chan os.Signal
|
||||
)
|
||||
|
||||
func PrepareRDSInstanceStop(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareRDSInstanceStop")
|
||||
defer span.End()
|
||||
|
||||
// Inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
// Catch and relay certain signal(s) to inject channel.
|
||||
signal.Notify(inject, os.Interrupt, syscall.SIGTERM)
|
||||
|
||||
// Abort channel is used to transmit signal notifications.
|
||||
abort = make(chan os.Signal, 1)
|
||||
// Catch and relay certain signal(s) to abort channel.
|
||||
signal.Notify(abort, os.Interrupt, syscall.SIGTERM)
|
||||
|
||||
// Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
log.Infof("[Ramp]: Waiting for the %vs ramp time before injecting chaos", experimentsDetails.RampTime)
|
||||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
|
||||
// Get the instance identifier or list of instance identifiers
|
||||
instanceIdentifierList := strings.Split(experimentsDetails.RDSInstanceIdentifier, ",")
|
||||
if experimentsDetails.RDSInstanceIdentifier == "" || len(instanceIdentifierList) == 0 {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeTargetSelection, Reason: "no RDS instance identifier found to stop"}
|
||||
}
|
||||
|
||||
instanceIdentifierList = common.FilterBasedOnPercentage(experimentsDetails.InstanceAffectedPerc, instanceIdentifierList)
|
||||
log.Infof("[Chaos]:Number of Instance targeted: %v", len(instanceIdentifierList))
|
||||
|
||||
// Watching for the abort signal and revert the chaos
|
||||
go abortWatcher(experimentsDetails, instanceIdentifierList, chaosDetails)
|
||||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, instanceIdentifierList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, instanceIdentifierList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeTargetSelection, Reason: fmt.Sprintf("'%s' sequence is not supported", experimentsDetails.Sequence)}
|
||||
}
|
||||
|
||||
// Waiting for the ramp time after chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
log.Infof("[Ramp]: Waiting for the %vs ramp time after injecting chaos", experimentsDetails.RampTime)
|
||||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// injectChaosInSerialMode will inject the rds instance state in serial mode that is one after other
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceIdentifierList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
// Stopping the chaos execution, if abort signal received
|
||||
os.Exit(0)
|
||||
default:
|
||||
// ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
duration := int(time.Since(ChaosStartTimeStamp).Seconds())
|
||||
|
||||
for duration < experimentsDetails.ChaosDuration {
|
||||
|
||||
log.Infof("[Info]: Target instance identifier list, %v", instanceIdentifierList)
|
||||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
msg := "Injecting " + experimentsDetails.ExperimentName + " chaos on rds instance"
|
||||
types.SetEngineEventAttributes(eventsDetails, types.ChaosInject, msg, "Normal", chaosDetails)
|
||||
events.GenerateEvents(eventsDetails, clients, chaosDetails, "ChaosEngine")
|
||||
}
|
||||
|
||||
for i, identifier := range instanceIdentifierList {
|
||||
|
||||
// Stopping the RDS instance
|
||||
log.Info("[Chaos]: Stopping the desired RDS instance")
|
||||
if err := awslib.RDSInstanceStop(identifier, experimentsDetails.Region); err != nil {
|
||||
return stacktrace.Propagate(err, "rds instance failed to stop")
|
||||
}
|
||||
|
||||
common.SetTargets(identifier, "injected", "RDS", chaosDetails)
|
||||
|
||||
// Wait for rds instance to completely stop
|
||||
log.Infof("[Wait]: Wait for RDS instance '%v' to get in stopped state", identifier)
|
||||
if err := awslib.WaitForRDSInstanceDown(experimentsDetails.Timeout, experimentsDetails.Delay, identifier, experimentsDetails.Region); err != nil {
|
||||
return stacktrace.Propagate(err, "rds instance failed to stop")
|
||||
}
|
||||
|
||||
// Run the probes during chaos
|
||||
// the OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for chaos interval
|
||||
log.Infof("[Wait]: Waiting for chaos interval of %vs", experimentsDetails.ChaosInterval)
|
||||
time.Sleep(time.Duration(experimentsDetails.ChaosInterval) * time.Second)
|
||||
|
||||
// Starting the RDS instance
|
||||
log.Info("[Chaos]: Starting back the RDS instance")
|
||||
if err = awslib.RDSInstanceStart(identifier, experimentsDetails.Region); err != nil {
|
||||
return stacktrace.Propagate(err, "rds instance failed to start")
|
||||
}
|
||||
|
||||
// Wait for rds instance to get in available state
|
||||
log.Infof("[Wait]: Wait for RDS instance '%v' to get in available state", identifier)
|
||||
if err := awslib.WaitForRDSInstanceUp(experimentsDetails.Timeout, experimentsDetails.Delay, experimentsDetails.Region, identifier); err != nil {
|
||||
return stacktrace.Propagate(err, "rds instance failed to start")
|
||||
}
|
||||
|
||||
common.SetTargets(identifier, "reverted", "RDS", chaosDetails)
|
||||
}
|
||||
duration = int(time.Since(ChaosStartTimeStamp).Seconds())
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the rds instance termination in parallel mode that is all at once
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, instanceIdentifierList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
// stopping the chaos execution, if abort signal received
|
||||
os.Exit(0)
|
||||
default:
|
||||
//ChaosStartTimeStamp contains the start timestamp, when the chaos injection begin
|
||||
ChaosStartTimeStamp := time.Now()
|
||||
duration := int(time.Since(ChaosStartTimeStamp).Seconds())
|
||||
|
||||
for duration < experimentsDetails.ChaosDuration {
|
||||
|
||||
log.Infof("[Info]: Target instance identifier list, %v", instanceIdentifierList)
|
||||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
msg := "Injecting " + experimentsDetails.ExperimentName + " chaos on rds instance"
|
||||
types.SetEngineEventAttributes(eventsDetails, types.ChaosInject, msg, "Normal", chaosDetails)
|
||||
events.GenerateEvents(eventsDetails, clients, chaosDetails, "ChaosEngine")
|
||||
}
|
||||
|
||||
// PowerOff the instance
|
||||
for _, identifier := range instanceIdentifierList {
|
||||
// Stopping the RDS instance
|
||||
log.Info("[Chaos]: Stopping the desired RDS instance")
|
||||
if err := awslib.RDSInstanceStop(identifier, experimentsDetails.Region); err != nil {
|
||||
return stacktrace.Propagate(err, "rds instance failed to stop")
|
||||
}
|
||||
common.SetTargets(identifier, "injected", "RDS", chaosDetails)
|
||||
}
|
||||
|
||||
for _, identifier := range instanceIdentifierList {
|
||||
// Wait for rds instance to completely stop
|
||||
log.Infof("[Wait]: Wait for RDS instance '%v' to get in stopped state", identifier)
|
||||
if err := awslib.WaitForRDSInstanceDown(experimentsDetails.Timeout, experimentsDetails.Delay, experimentsDetails.Region, identifier); err != nil {
|
||||
return stacktrace.Propagate(err, "rds instance failed to stop")
|
||||
}
|
||||
common.SetTargets(identifier, "reverted", "RDS", chaosDetails)
|
||||
}
|
||||
|
||||
// Run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for chaos interval
|
||||
log.Infof("[Wait]: Waiting for chaos interval of %vs", experimentsDetails.ChaosInterval)
|
||||
time.Sleep(time.Duration(experimentsDetails.ChaosInterval) * time.Second)
|
||||
|
||||
// Starting the RDS instance
|
||||
for _, identifier := range instanceIdentifierList {
|
||||
log.Info("[Chaos]: Starting back the RDS instance")
|
||||
if err = awslib.RDSInstanceStart(identifier, experimentsDetails.Region); err != nil {
|
||||
return stacktrace.Propagate(err, "rds instance failed to start")
|
||||
}
|
||||
}
|
||||
|
||||
for _, identifier := range instanceIdentifierList {
|
||||
// Wait for rds instance to get in available state
|
||||
log.Infof("[Wait]: Wait for RDS instance '%v' to get in available state", identifier)
|
||||
if err := awslib.WaitForRDSInstanceUp(experimentsDetails.Timeout, experimentsDetails.Delay, experimentsDetails.Region, identifier); err != nil {
|
||||
return stacktrace.Propagate(err, "rds instance failed to start")
|
||||
}
|
||||
}
|
||||
|
||||
for _, identifier := range instanceIdentifierList {
|
||||
common.SetTargets(identifier, "reverted", "RDS", chaosDetails)
|
||||
}
|
||||
duration = int(time.Since(ChaosStartTimeStamp).Seconds())
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// watching for the abort signal and revert the chaos
|
||||
func abortWatcher(experimentsDetails *experimentTypes.ExperimentDetails, instanceIdentifierList []string, chaosDetails *types.ChaosDetails) {
|
||||
|
||||
<-abort
|
||||
|
||||
log.Info("[Abort]: Chaos Revert Started")
|
||||
for _, identifier := range instanceIdentifierList {
|
||||
instanceState, err := awslib.GetRDSInstanceStatus(identifier, experimentsDetails.Region)
|
||||
if err != nil {
|
||||
log.Errorf("Failed to get instance status when an abort signal is received: %v", err)
|
||||
}
|
||||
if instanceState != "running" {
|
||||
|
||||
log.Info("[Abort]: Waiting for the RDS instance to get down")
|
||||
if err := awslib.WaitForRDSInstanceDown(experimentsDetails.Timeout, experimentsDetails.Delay, experimentsDetails.Region, identifier); err != nil {
|
||||
log.Errorf("Unable to wait till stop of the instance: %v", err)
|
||||
}
|
||||
|
||||
log.Info("[Abort]: Starting RDS instance as abort signal received")
|
||||
err := awslib.RDSInstanceStart(identifier, experimentsDetails.Region)
|
||||
if err != nil {
|
||||
log.Errorf("RDS instance failed to start when an abort signal is received: %v", err)
|
||||
}
|
||||
}
|
||||
common.SetTargets(identifier, "reverted", "RDS", chaosDetails)
|
||||
}
|
||||
log.Info("[Abort]: Chaos Revert Completed")
|
||||
os.Exit(1)
|
||||
}
|
|
@ -1,32 +1,38 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
redfishLib "github.com/litmuschaos/litmus-go/pkg/baremetal/redfish"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/baremetal/redfish-node-restart/types"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
// injectChaos initiates node restart chaos on the target node
|
||||
func injectChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets) error {
|
||||
func injectChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectRedfishNodeRestartFault")
|
||||
defer span.End()
|
||||
|
||||
URL := fmt.Sprintf("https://%v/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset", experimentsDetails.IPMIIP)
|
||||
return redfishLib.RebootNode(URL, experimentsDetails.User, experimentsDetails.Password)
|
||||
}
|
||||
|
||||
// experimentExecution function orchestrates the experiment by calling the injectChaos function
|
||||
func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func experimentExecution(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +43,7 @@ func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
events.GenerateEvents(eventsDetails, clients, chaosDetails, "ChaosEngine")
|
||||
}
|
||||
|
||||
if err := injectChaos(experimentsDetails, clients); err != nil {
|
||||
if err := injectChaos(ctx, experimentsDetails, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "chaos injection failed")
|
||||
}
|
||||
|
||||
|
@ -47,7 +53,9 @@ func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
}
|
||||
|
||||
// PrepareChaos contains the chaos prepration and injection steps
|
||||
func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareRedfishNodeRestartFault")
|
||||
defer span.End()
|
||||
|
||||
//Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
|
@ -55,7 +63,7 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
//Starting the Redfish node restart experiment
|
||||
if err := experimentExecution(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := experimentExecution(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
common.SetTargets(experimentsDetails.IPMIIP, "targeted", "node", chaosDetails)
|
||||
|
|
|
@ -2,6 +2,7 @@ package lib
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
@ -12,7 +13,9 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
|
@ -51,7 +54,10 @@ func SetTargetPodList(experimentsDetails *experimentTypes.ExperimentDetails, cli
|
|||
}
|
||||
|
||||
// PrepareChaos contains the preparation steps before chaos injection
|
||||
func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareSpringBootFault")
|
||||
defer span.End()
|
||||
|
||||
// Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
log.Infof("[Ramp]: Waiting for the %vs ramp time before injecting chaos", experimentsDetails.RampTime)
|
||||
|
@ -69,11 +75,11 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err := injectChaosInSerialMode(experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
if err := injectChaosInSerialMode(ctx, experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err := injectChaosInParallelMode(experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
if err := injectChaosInParallelMode(ctx, experimentsDetails, clients, chaosDetails, eventsDetails, resultDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -187,7 +193,7 @@ func setChaosMonkeyAssault(chaosMonkeyPort string, chaosMonkeyPath string, assau
|
|||
}
|
||||
|
||||
// disableChaosMonkey disables chaos monkey on selected pods
|
||||
func disableChaosMonkey(chaosMonkeyPort string, chaosMonkeyPath string, pod corev1.Pod) error {
|
||||
func disableChaosMonkey(ctx context.Context, chaosMonkeyPort string, chaosMonkeyPath string, pod corev1.Pod) error {
|
||||
log.Infof("[Chaos]: disabling assaults on pod %s", pod.Name)
|
||||
jsonValue, err := json.Marshal(revertAssault)
|
||||
if err != nil {
|
||||
|
@ -211,11 +217,13 @@ func disableChaosMonkey(chaosMonkeyPort string, chaosMonkeyPath string, pod core
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode injects chaos monkey assault on pods in serial mode(one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectSpringBootFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -269,7 +277,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
select {
|
||||
case <-signChan:
|
||||
log.Info("[Chaos]: Revert Started")
|
||||
if err := disableChaosMonkey(experimentsDetails.ChaosMonkeyPort, experimentsDetails.ChaosMonkeyPath, pod); err != nil {
|
||||
if err := disableChaosMonkey(ctx, experimentsDetails.ChaosMonkeyPort, experimentsDetails.ChaosMonkeyPath, pod); err != nil {
|
||||
log.Errorf("Error in disabling chaos monkey, err: %v", err)
|
||||
} else {
|
||||
common.SetTargets(pod.Name, "reverted", "pod", chaosDetails)
|
||||
|
@ -287,7 +295,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
}
|
||||
|
||||
if err := disableChaosMonkey(experimentsDetails.ChaosMonkeyPort, experimentsDetails.ChaosMonkeyPath, pod); err != nil {
|
||||
if err := disableChaosMonkey(ctx, experimentsDetails.ChaosMonkeyPort, experimentsDetails.ChaosMonkeyPath, pod); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -299,11 +307,13 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode injects chaos monkey assault on pods in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, eventsDetails *types.EventDetails, resultDetails *types.ResultDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectSpringBootFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -358,7 +368,7 @@ loop:
|
|||
case <-signChan:
|
||||
log.Info("[Chaos]: Revert Started")
|
||||
for _, pod := range experimentsDetails.TargetPodList.Items {
|
||||
if err := disableChaosMonkey(experimentsDetails.ChaosMonkeyPort, experimentsDetails.ChaosMonkeyPath, pod); err != nil {
|
||||
if err := disableChaosMonkey(ctx, experimentsDetails.ChaosMonkeyPort, experimentsDetails.ChaosMonkeyPath, pod); err != nil {
|
||||
log.Errorf("Error in disabling chaos monkey, err: %v", err)
|
||||
} else {
|
||||
common.SetTargets(pod.Name, "reverted", "pod", chaosDetails)
|
||||
|
@ -379,7 +389,7 @@ loop:
|
|||
|
||||
var errorList []string
|
||||
for _, pod := range experimentsDetails.TargetPodList.Items {
|
||||
if err := disableChaosMonkey(experimentsDetails.ChaosMonkeyPort, experimentsDetails.ChaosMonkeyPath, pod); err != nil {
|
||||
if err := disableChaosMonkey(ctx, experimentsDetails.ChaosMonkeyPort, experimentsDetails.ChaosMonkeyPath, pod); err != nil {
|
||||
errorList = append(errorList, err.Error())
|
||||
continue
|
||||
}
|
||||
|
|
|
@ -3,9 +3,8 @@ package helper
|
|||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/palantir/stacktrace"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
|
@ -18,19 +17,26 @@ import (
|
|||
|
||||
"github.com/containerd/cgroups"
|
||||
cgroupsv2 "github.com/containerd/cgroups/v2"
|
||||
"github.com/palantir/stacktrace"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opentelemetry.io/otel"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
clientTypes "k8s.io/apimachinery/pkg/types"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/stress-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/result"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
clientTypes "k8s.io/apimachinery/pkg/types"
|
||||
)
|
||||
|
||||
//list of cgroups in a container
|
||||
// list of cgroups in a container
|
||||
var (
|
||||
cgroupSubsystemList = []string{"cpu", "memory", "systemd", "net_cls",
|
||||
"net_prio", "freezer", "blkio", "perf_event", "devices", "cpuset",
|
||||
|
@ -51,7 +57,9 @@ const (
|
|||
)
|
||||
|
||||
// Helper injects the stress chaos
|
||||
func Helper(clients clients.ClientSets) {
|
||||
func Helper(ctx context.Context, clients clients.ClientSets) {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "SimulatePodStressFault")
|
||||
defer span.End()
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
eventsDetails := types.EventDetails{}
|
||||
|
@ -91,7 +99,7 @@ func Helper(clients clients.ClientSets) {
|
|||
}
|
||||
}
|
||||
|
||||
//prepareStressChaos contains the chaos preparation and injection steps
|
||||
// prepareStressChaos contains the chaos preparation and injection steps
|
||||
func prepareStressChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails) error {
|
||||
// get stressors in list format
|
||||
stressorList := prepareStressor(experimentsDetails)
|
||||
|
@ -105,31 +113,49 @@ func prepareStressChaos(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
return stacktrace.Propagate(err, "could not parse targets")
|
||||
}
|
||||
|
||||
var targets []targetDetails
|
||||
var targets []*targetDetails
|
||||
|
||||
for _, t := range targetList.Target {
|
||||
td := targetDetails{
|
||||
Name: t.Name,
|
||||
Namespace: t.Namespace,
|
||||
TargetContainer: t.TargetContainer,
|
||||
Source: chaosDetails.ChaosPodName,
|
||||
td := &targetDetails{
|
||||
Name: t.Name,
|
||||
Namespace: t.Namespace,
|
||||
Source: chaosDetails.ChaosPodName,
|
||||
}
|
||||
|
||||
td.ContainerId, err = common.GetContainerID(td.Namespace, td.Name, td.TargetContainer, clients, td.Source)
|
||||
td.TargetContainers, err = common.GetTargetContainers(t.Name, t.Namespace, t.TargetContainer, chaosDetails.ChaosPodName, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not get container id")
|
||||
return stacktrace.Propagate(err, "could not get target containers")
|
||||
}
|
||||
|
||||
// extract out the pid of the target container
|
||||
td.Pid, err = common.GetPID(experimentsDetails.ContainerRuntime, td.ContainerId, experimentsDetails.SocketPath, td.Source)
|
||||
td.ContainerIds, err = common.GetContainerIDs(td.Namespace, td.Name, td.TargetContainers, clients, td.Source)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not get container pid")
|
||||
return stacktrace.Propagate(err, "could not get container ids")
|
||||
}
|
||||
|
||||
td.CGroupManager, err = getCGroupManager(td)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not get cgroup manager")
|
||||
for _, cid := range td.ContainerIds {
|
||||
// extract out the pid of the target container
|
||||
pid, err := common.GetPID(experimentsDetails.ContainerRuntime, cid, experimentsDetails.SocketPath, td.Source)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not get container pid")
|
||||
}
|
||||
td.Pids = append(td.Pids, pid)
|
||||
}
|
||||
|
||||
for i := range td.Pids {
|
||||
cGroupManagers, err, grpPath := getCGroupManager(td, i)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not get cgroup manager")
|
||||
}
|
||||
td.GroupPath = grpPath
|
||||
td.CGroupManagers = append(td.CGroupManagers, cGroupManagers)
|
||||
}
|
||||
|
||||
log.InfoWithValues("[Info]: Details of application under chaos injection", logrus.Fields{
|
||||
"PodName": td.Name,
|
||||
"Namespace": td.Namespace,
|
||||
"TargetContainers": td.TargetContainers,
|
||||
})
|
||||
|
||||
targets = append(targets, td)
|
||||
}
|
||||
|
||||
|
@ -146,13 +172,20 @@ func prepareStressChaos(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
done := make(chan error, 1)
|
||||
|
||||
for index, t := range targets {
|
||||
targets[index].Cmd, err = injectChaos(t, stressors)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not inject chaos")
|
||||
for i := range t.Pids {
|
||||
cmd, err := injectChaos(t, stressors, i, experimentsDetails.StressType)
|
||||
if err != nil {
|
||||
if revertErr := revertChaosForAllTargets(targets, resultDetails, chaosDetails.ChaosNamespace, index-1); revertErr != nil {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s,%s]", stacktrace.RootCause(err).Error(), stacktrace.RootCause(revertErr).Error())}
|
||||
}
|
||||
return stacktrace.Propagate(err, "could not inject chaos")
|
||||
}
|
||||
targets[index].Cmds = append(targets[index].Cmds, cmd)
|
||||
log.Infof("successfully injected chaos on target: {name: %s, namespace: %v, container: %v}", t.Name, t.Namespace, t.TargetContainers[i])
|
||||
}
|
||||
log.Infof("successfully injected chaos on target: {name: %s, namespace: %v, container: %v}", t.Name, t.Namespace, t.TargetContainer)
|
||||
|
||||
if err = result.AnnotateChaosResult(resultDetails.Name, chaosDetails.ChaosNamespace, "injected", "pod", t.Name); err != nil {
|
||||
if revertErr := terminateProcess(t); revertErr != nil {
|
||||
if revertErr := revertChaosForAllTargets(targets, resultDetails, chaosDetails.ChaosNamespace, index); revertErr != nil {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s,%s]", stacktrace.RootCause(err).Error(), stacktrace.RootCause(revertErr).Error())}
|
||||
}
|
||||
return stacktrace.Propagate(err, "could not annotate chaosresult")
|
||||
|
@ -172,18 +205,35 @@ func prepareStressChaos(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
var errList []string
|
||||
var exitErr error
|
||||
for _, t := range targets {
|
||||
if err := t.Cmd.Wait(); err != nil {
|
||||
if _, ok := err.(*exec.ExitError); ok {
|
||||
exitErr = err
|
||||
continue
|
||||
for i := range t.Cmds {
|
||||
if err := t.Cmds[i].Cmd.Wait(); err != nil {
|
||||
log.Infof("stress process failed, err: %v, out: %v", err, t.Cmds[i].Buffer.String())
|
||||
if _, ok := err.(*exec.ExitError); ok {
|
||||
exitErr = err
|
||||
continue
|
||||
}
|
||||
errList = append(errList, err.Error())
|
||||
}
|
||||
errList = append(errList, err.Error())
|
||||
}
|
||||
}
|
||||
if exitErr != nil {
|
||||
done <- exitErr
|
||||
oomKilled, err := checkOOMKilled(targets, clients, exitErr)
|
||||
if err != nil {
|
||||
log.Infof("could not check oomkilled, err: %v", err)
|
||||
}
|
||||
if !oomKilled {
|
||||
done <- exitErr
|
||||
}
|
||||
done <- nil
|
||||
} else if len(errList) != 0 {
|
||||
done <- fmt.Errorf("err: %v", strings.Join(errList, ", "))
|
||||
oomKilled, err := checkOOMKilled(targets, clients, fmt.Errorf("err: %v", strings.Join(errList, ", ")))
|
||||
if err != nil {
|
||||
log.Infof("could not check oomkilled, err: %v", err)
|
||||
}
|
||||
if !oomKilled {
|
||||
done <- fmt.Errorf("err: %v", strings.Join(errList, ", "))
|
||||
}
|
||||
done <- nil
|
||||
} else {
|
||||
done <- nil
|
||||
}
|
||||
|
@ -198,24 +248,17 @@ func prepareStressChaos(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
// the stress process gets timeout before completion
|
||||
log.Infof("[Chaos] The stress process is not yet completed after the chaos duration of %vs", experimentsDetails.ChaosDuration+30)
|
||||
log.Info("[Timeout]: Killing the stress process")
|
||||
var errList []string
|
||||
for _, t := range targets {
|
||||
if err = terminateProcess(t); err != nil {
|
||||
errList = append(errList, err.Error())
|
||||
continue
|
||||
}
|
||||
if err = result.AnnotateChaosResult(resultDetails.Name, chaosDetails.ChaosNamespace, "reverted", "pod", t.Name); err != nil {
|
||||
errList = append(errList, err.Error())
|
||||
}
|
||||
}
|
||||
if len(errList) != 0 {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s]", strings.Join(errList, ","))}
|
||||
if err := revertChaosForAllTargets(targets, resultDetails, chaosDetails.ChaosNamespace, len(targets)-1); err != nil {
|
||||
return stacktrace.Propagate(err, "could not revert chaos")
|
||||
}
|
||||
case err := <-done:
|
||||
if err != nil {
|
||||
exitErr, ok := err.(*exec.ExitError)
|
||||
if ok {
|
||||
status := exitErr.Sys().(syscall.WaitStatus)
|
||||
if status.Signaled() {
|
||||
log.Infof("process stopped with signal: %v", status.Signal())
|
||||
}
|
||||
if status.Signaled() && status.Signal() == syscall.SIGKILL {
|
||||
// wait for the completion of abort handler
|
||||
time.Sleep(10 * time.Second)
|
||||
|
@ -225,38 +268,83 @@ func prepareStressChaos(experimentsDetails *experimentTypes.ExperimentDetails, c
|
|||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: chaosDetails.ChaosPodName, Reason: err.Error()}
|
||||
}
|
||||
log.Info("[Info]: Reverting Chaos")
|
||||
var errList []string
|
||||
if err := revertChaosForAllTargets(targets, resultDetails, chaosDetails.ChaosNamespace, len(targets)-1); err != nil {
|
||||
return stacktrace.Propagate(err, "could not revert chaos")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func revertChaosForAllTargets(targets []*targetDetails, resultDetails *types.ResultDetails, chaosNs string, index int) error {
|
||||
var errList []string
|
||||
for i := 0; i <= index; i++ {
|
||||
if err := terminateProcess(targets[i]); err != nil {
|
||||
errList = append(errList, err.Error())
|
||||
continue
|
||||
}
|
||||
if err := result.AnnotateChaosResult(resultDetails.Name, chaosNs, "reverted", "pod", targets[i].Name); err != nil {
|
||||
errList = append(errList, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
if len(errList) != 0 {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s]", strings.Join(errList, ","))}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// checkOOMKilled checks if the container within the target pods failed due to an OOMKilled error.
|
||||
func checkOOMKilled(targets []*targetDetails, clients clients.ClientSets, chaosError error) (bool, error) {
|
||||
// Check each container in the pod
|
||||
for i := 0; i < 3; i++ {
|
||||
for _, t := range targets {
|
||||
if err := terminateProcess(t); err != nil {
|
||||
errList = append(errList, err.Error())
|
||||
// Fetch the target pod
|
||||
targetPod, err := clients.KubeClient.CoreV1().Pods(t.Namespace).Get(context.Background(), t.Name, v1.GetOptions{})
|
||||
if err != nil {
|
||||
return false, cerrors.Error{
|
||||
ErrorCode: cerrors.ErrorTypeStatusChecks,
|
||||
Target: fmt.Sprintf("{podName: %s, namespace: %s}", t.Name, t.Namespace),
|
||||
Reason: err.Error(),
|
||||
}
|
||||
}
|
||||
for _, c := range targetPod.Status.ContainerStatuses {
|
||||
if utils.Contains(c.Name, t.TargetContainers) {
|
||||
// Check for OOMKilled and restart
|
||||
if c.LastTerminationState.Terminated != nil && c.LastTerminationState.Terminated.ExitCode == 137 {
|
||||
log.Warnf("[Warning]: The target container '%s' of pod '%s' got OOM Killed, err: %v", c.Name, t.Name, chaosError)
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// terminateProcess will remove the stress process from the target container after chaos completion
|
||||
func terminateProcess(t *targetDetails) error {
|
||||
var errList []string
|
||||
for i := range t.Cmds {
|
||||
if t.Cmds[i] != nil && t.Cmds[i].Cmd.Process != nil {
|
||||
if err := syscall.Kill(-t.Cmds[i].Cmd.Process.Pid, syscall.SIGKILL); err != nil {
|
||||
if strings.Contains(err.Error(), ProcessAlreadyKilled) || strings.Contains(err.Error(), ProcessAlreadyFinished) {
|
||||
continue
|
||||
}
|
||||
errList = append(errList, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosRevert, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[i]), Reason: fmt.Sprintf("failed to revert chaos: %s", err.Error())}.Error())
|
||||
continue
|
||||
}
|
||||
log.Infof("successfully reverted chaos on target: {name: %s, namespace: %v, container: %v}", t.Name, t.Namespace, t.TargetContainer)
|
||||
if err = result.AnnotateChaosResult(resultDetails.Name, chaosDetails.ChaosNamespace, "reverted", "pod", t.Name); err != nil {
|
||||
errList = append(errList, err.Error())
|
||||
}
|
||||
}
|
||||
if len(errList) != 0 {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s]", strings.Join(errList, ","))}
|
||||
log.Infof("successfully reverted chaos on target: {name: %s, namespace: %v, container: %v}", t.Name, t.Namespace, t.TargetContainers[i])
|
||||
}
|
||||
}
|
||||
|
||||
if len(errList) != 0 {
|
||||
return cerrors.PreserveError{ErrString: fmt.Sprintf("[%s]", strings.Join(errList, ","))}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
//terminateProcess will remove the stress process from the target container after chaos completion
|
||||
func terminateProcess(t targetDetails) error {
|
||||
if err := syscall.Kill(-t.Cmd.Process.Pid, syscall.SIGKILL); err != nil {
|
||||
if strings.Contains(err.Error(), ProcessAlreadyKilled) || strings.Contains(err.Error(), ProcessAlreadyFinished) {
|
||||
return nil
|
||||
}
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosRevert, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("failed to revert chaos: %s", err.Error())}
|
||||
}
|
||||
log.Infof("successfully reverted chaos on target: {name: %s, namespace: %v, container: %v}", t.Name, t.Namespace, t.TargetContainer)
|
||||
return nil
|
||||
}
|
||||
|
||||
//prepareStressor will set the required stressors for the given experiment
|
||||
// prepareStressor will set the required stressors for the given experiment
|
||||
func prepareStressor(experimentDetails *experimentTypes.ExperimentDetails) []string {
|
||||
|
||||
stressArgs := []string{
|
||||
|
@ -319,33 +407,33 @@ func prepareStressor(experimentDetails *experimentTypes.ExperimentDetails) []str
|
|||
}
|
||||
|
||||
default:
|
||||
log.Fatalf("stressor for %v experiment is not suported", experimentDetails.ExperimentName)
|
||||
log.Fatalf("stressor for %v experiment is not supported", experimentDetails.ExperimentName)
|
||||
}
|
||||
return stressArgs
|
||||
}
|
||||
|
||||
//pidPath will get the pid path of the container
|
||||
func pidPath(t targetDetails) cgroups.Path {
|
||||
processPath := "/proc/" + strconv.Itoa(t.Pid) + "/cgroup"
|
||||
paths, err := parseCgroupFile(processPath, t)
|
||||
// pidPath will get the pid path of the container
|
||||
func pidPath(t *targetDetails, index int) cgroups.Path {
|
||||
processPath := "/proc/" + strconv.Itoa(t.Pids[index]) + "/cgroup"
|
||||
paths, err := parseCgroupFile(processPath, t, index)
|
||||
if err != nil {
|
||||
return getErrorPath(errors.Wrapf(err, "parse cgroup file %s", processPath))
|
||||
}
|
||||
return getExistingPath(paths, t.Pid, "")
|
||||
return getExistingPath(paths, t.Pids[index], "")
|
||||
}
|
||||
|
||||
//parseCgroupFile will read and verify the cgroup file entry of a container
|
||||
func parseCgroupFile(path string, t targetDetails) (map[string]string, error) {
|
||||
// parseCgroupFile will read and verify the cgroup file entry of a container
|
||||
func parseCgroupFile(path string, t *targetDetails, index int) (map[string]string, error) {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("fail to parse cgroup: %s", err.Error())}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("fail to parse cgroup: %s", err.Error())}
|
||||
}
|
||||
defer file.Close()
|
||||
return parseCgroupFromReader(file, t)
|
||||
return parseCgroupFromReader(file, t, index)
|
||||
}
|
||||
|
||||
//parseCgroupFromReader will parse the cgroup file from the reader
|
||||
func parseCgroupFromReader(r io.Reader, t targetDetails) (map[string]string, error) {
|
||||
// parseCgroupFromReader will parse the cgroup file from the reader
|
||||
func parseCgroupFromReader(r io.Reader, t *targetDetails, index int) (map[string]string, error) {
|
||||
var (
|
||||
cgroups = make(map[string]string)
|
||||
s = bufio.NewScanner(r)
|
||||
|
@ -356,7 +444,7 @@ func parseCgroupFromReader(r io.Reader, t targetDetails) (map[string]string, err
|
|||
parts = strings.SplitN(text, ":", 3)
|
||||
)
|
||||
if len(parts) < 3 {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("invalid cgroup entry: %q", text)}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("invalid cgroup entry: %q", text)}
|
||||
}
|
||||
for _, subs := range strings.Split(parts[1], ",") {
|
||||
if subs != "" {
|
||||
|
@ -365,13 +453,13 @@ func parseCgroupFromReader(r io.Reader, t targetDetails) (map[string]string, err
|
|||
}
|
||||
}
|
||||
if err := s.Err(); err != nil {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("buffer scanner failed: %s", err.Error())}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("buffer scanner failed: %s", err.Error())}
|
||||
}
|
||||
|
||||
return cgroups, nil
|
||||
}
|
||||
|
||||
//getExistingPath will be used to get the existing valid cgroup path
|
||||
// getExistingPath will be used to get the existing valid cgroup path
|
||||
func getExistingPath(paths map[string]string, pid int, suffix string) cgroups.Path {
|
||||
for n, p := range paths {
|
||||
dest, err := getCgroupDestination(pid, n)
|
||||
|
@ -401,14 +489,14 @@ func getExistingPath(paths map[string]string, pid int, suffix string) cgroups.Pa
|
|||
}
|
||||
}
|
||||
|
||||
//getErrorPath will give the invalid cgroup path
|
||||
// getErrorPath will give the invalid cgroup path
|
||||
func getErrorPath(err error) cgroups.Path {
|
||||
return func(_ cgroups.Name) (string, error) {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
||||
//getCgroupDestination will validate the subsystem with the mountpath in container mountinfo file.
|
||||
// getCgroupDestination will validate the subsystem with the mountpath in container mountinfo file.
|
||||
func getCgroupDestination(pid int, subsystem string) (string, error) {
|
||||
mountinfoPath := fmt.Sprintf("/proc/%d/mountinfo", pid)
|
||||
file, err := os.Open(mountinfoPath)
|
||||
|
@ -431,22 +519,22 @@ func getCgroupDestination(pid int, subsystem string) (string, error) {
|
|||
return "", errors.Errorf("no destination found for %v ", subsystem)
|
||||
}
|
||||
|
||||
//findValidCgroup will be used to get a valid cgroup path
|
||||
func findValidCgroup(path cgroups.Path, t targetDetails) (string, error) {
|
||||
// findValidCgroup will be used to get a valid cgroup path
|
||||
func findValidCgroup(path cgroups.Path, t *targetDetails, index int) (string, error) {
|
||||
for _, subsystem := range cgroupSubsystemList {
|
||||
path, err := path(cgroups.Name(subsystem))
|
||||
if err != nil {
|
||||
log.Errorf("fail to retrieve the cgroup path, subsystem: %v, target: %v, err: %v", subsystem, t.ContainerId, err)
|
||||
log.Errorf("fail to retrieve the cgroup path, subsystem: %v, target: %v, err: %v", subsystem, t.ContainerIds[index], err)
|
||||
continue
|
||||
}
|
||||
if strings.Contains(path, t.ContainerId) {
|
||||
if strings.Contains(path, t.ContainerIds[index]) {
|
||||
return path, nil
|
||||
}
|
||||
}
|
||||
return "", cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: "could not find valid cgroup"}
|
||||
return "", cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: "could not find valid cgroup"}
|
||||
}
|
||||
|
||||
//getENV fetches all the env variables from the runner pod
|
||||
// getENV fetches all the env variables from the runner pod
|
||||
func getENV(experimentDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentDetails.ExperimentName = types.Getenv("EXPERIMENT_NAME", "")
|
||||
experimentDetails.InstanceID = types.Getenv("INSTANCE_ID", "")
|
||||
|
@ -468,7 +556,7 @@ func getENV(experimentDetails *experimentTypes.ExperimentDetails) {
|
|||
}
|
||||
|
||||
// abortWatcher continuously watch for the abort signals
|
||||
func abortWatcher(targets []targetDetails, resultName, chaosNS string) {
|
||||
func abortWatcher(targets []*targetDetails, resultName, chaosNS string) {
|
||||
|
||||
<-abort
|
||||
|
||||
|
@ -494,45 +582,67 @@ func abortWatcher(targets []targetDetails, resultName, chaosNS string) {
|
|||
}
|
||||
|
||||
// getCGroupManager will return the cgroup for the given pid of the process
|
||||
func getCGroupManager(t targetDetails) (interface{}, error) {
|
||||
func getCGroupManager(t *targetDetails, index int) (interface{}, error, string) {
|
||||
if cgroups.Mode() == cgroups.Unified {
|
||||
groupPath, err := cgroupsv2.PidGroupPath(t.Pid)
|
||||
groupPath := ""
|
||||
output, err := exec.Command("bash", "-c", fmt.Sprintf("nsenter -t 1 -C -m -- cat /proc/%v/cgroup", t.Pids[index])).CombinedOutput()
|
||||
if err != nil {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("fail to get pid group path: %s", err.Error())}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("fail to get the cgroup: %s :%v", err.Error(), output)}, ""
|
||||
}
|
||||
log.Infof("cgroup output: %s", string(output))
|
||||
parts := strings.Split(string(output), ":")
|
||||
if len(parts) < 3 {
|
||||
return "", fmt.Errorf("invalid cgroup entry: %s", string(output)), ""
|
||||
}
|
||||
if strings.HasSuffix(parts[len(parts)-3], "0") && parts[len(parts)-2] == "" {
|
||||
groupPath = parts[len(parts)-1]
|
||||
}
|
||||
log.Infof("group path: %s", groupPath)
|
||||
|
||||
cgroup2, err := cgroupsv2.LoadManager("/sys/fs/cgroup", groupPath)
|
||||
cgroup2, err := cgroupsv2.LoadManager("/sys/fs/cgroup", string(groupPath))
|
||||
if err != nil {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("fail to load the cgroup: %s", err.Error())}
|
||||
return nil, errors.Errorf("Error loading cgroup v2 manager, %v", err), ""
|
||||
}
|
||||
return cgroup2, nil
|
||||
return cgroup2, nil, groupPath
|
||||
}
|
||||
path := pidPath(t)
|
||||
cgroup, err := findValidCgroup(path, t)
|
||||
path := pidPath(t, index)
|
||||
cgroup, err := findValidCgroup(path, t, index)
|
||||
if err != nil {
|
||||
return nil, stacktrace.Propagate(err, "could not find valid cgroup")
|
||||
return nil, stacktrace.Propagate(err, "could not find valid cgroup"), ""
|
||||
}
|
||||
cgroup1, err := cgroups.Load(cgroups.V1, cgroups.StaticPath(cgroup))
|
||||
if err != nil {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("fail to load the cgroup: %s", err.Error())}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeHelper, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("fail to load the cgroup: %s", err.Error())}, ""
|
||||
}
|
||||
|
||||
return cgroup1, nil
|
||||
return cgroup1, nil, ""
|
||||
}
|
||||
|
||||
// addProcessToCgroup will add the process to cgroup
|
||||
// By default it will add to v1 cgroup
|
||||
func addProcessToCgroup(pid int, control interface{}) error {
|
||||
func addProcessToCgroup(pid int, control interface{}, groupPath string) error {
|
||||
if cgroups.Mode() == cgroups.Unified {
|
||||
var cgroup1 = control.(*cgroupsv2.Manager)
|
||||
return cgroup1.AddProc(uint64(pid))
|
||||
args := []string{"-t", "1", "-C", "--", "sudo", "sh", "-c", fmt.Sprintf("echo %d >> /sys/fs/cgroup%s/cgroup.procs", pid, strings.ReplaceAll(groupPath, "\n", ""))}
|
||||
output, err := exec.Command("nsenter", args...).CombinedOutput()
|
||||
if err != nil {
|
||||
return cerrors.Error{
|
||||
ErrorCode: cerrors.ErrorTypeChaosInject,
|
||||
Reason: fmt.Sprintf("failed to add process to cgroup %s: %v", string(output), err),
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
var cgroup1 = control.(cgroups.Cgroup)
|
||||
return cgroup1.Add(cgroups.Process{Pid: pid})
|
||||
}
|
||||
|
||||
func injectChaos(t targetDetails, stressors string) (*exec.Cmd, error) {
|
||||
stressCommand := "pause nsutil -t " + strconv.Itoa(t.Pid) + " -p -- " + stressors
|
||||
func injectChaos(t *targetDetails, stressors string, index int, stressType string) (*Command, error) {
|
||||
stressCommand := fmt.Sprintf("pause nsutil -t %v -p -- %v", strconv.Itoa(t.Pids[index]), stressors)
|
||||
// for io stress,we need to enter into mount ns of the target container
|
||||
// enabling it by passing -m flag
|
||||
if stressType == "pod-io-stress" {
|
||||
stressCommand = fmt.Sprintf("pause nsutil -t %v -p -m -- %v", strconv.Itoa(t.Pids[index]), stressors)
|
||||
}
|
||||
log.Infof("[Info]: starting process: %v", stressCommand)
|
||||
|
||||
// launch the stress-ng process on the target container in paused mode
|
||||
|
@ -540,17 +650,18 @@ func injectChaos(t targetDetails, stressors string) (*exec.Cmd, error) {
|
|||
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
|
||||
var buf bytes.Buffer
|
||||
cmd.Stdout = &buf
|
||||
cmd.Stderr = &buf
|
||||
err = cmd.Start()
|
||||
if err != nil {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("failed to start stress process: %s", err.Error())}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("failed to start stress process: %s", err.Error())}
|
||||
}
|
||||
|
||||
// add the stress process to the cgroup of target container
|
||||
if err = addProcessToCgroup(cmd.Process.Pid, t.CGroupManager); err != nil {
|
||||
if err = addProcessToCgroup(cmd.Process.Pid, t.CGroupManagers[index], t.GroupPath); err != nil {
|
||||
if killErr := cmd.Process.Kill(); killErr != nil {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("fail to add the stress process to cgroup %s and kill stress process: %s", err.Error(), killErr.Error())}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("fail to add the stress process to cgroup %s and kill stress process: %s", err.Error(), killErr.Error())}
|
||||
}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("fail to add the stress process to cgroup: %s", err.Error())}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("fail to add the stress process to cgroup: %s", err.Error())}
|
||||
}
|
||||
|
||||
log.Info("[Info]: Sending signal to resume the stress process")
|
||||
|
@ -560,18 +671,27 @@ func injectChaos(t targetDetails, stressors string) (*exec.Cmd, error) {
|
|||
|
||||
// remove pause and resume or start the stress process
|
||||
if err := cmd.Process.Signal(syscall.SIGCONT); err != nil {
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainer), Reason: fmt.Sprintf("fail to remove pause and start the stress process: %s", err.Error())}
|
||||
return nil, cerrors.Error{ErrorCode: cerrors.ErrorTypeChaosInject, Source: t.Source, Target: fmt.Sprintf("{podName: %s, namespace: %s, container: %s}", t.Name, t.Namespace, t.TargetContainers[index]), Reason: fmt.Sprintf("fail to remove pause and start the stress process: %s", err.Error())}
|
||||
}
|
||||
return cmd, nil
|
||||
return &Command{
|
||||
Cmd: cmd,
|
||||
Buffer: buf,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type targetDetails struct {
|
||||
Name string
|
||||
Namespace string
|
||||
TargetContainer string
|
||||
ContainerId string
|
||||
Pid int
|
||||
CGroupManager interface{}
|
||||
Cmd *exec.Cmd
|
||||
Source string
|
||||
Name string
|
||||
Namespace string
|
||||
TargetContainers []string
|
||||
ContainerIds []string
|
||||
Pids []int
|
||||
CGroupManagers []interface{}
|
||||
Cmds []*Command
|
||||
Source string
|
||||
GroupPath string
|
||||
}
|
||||
|
||||
type Command struct {
|
||||
Cmd *exec.Cmd
|
||||
Buffer bytes.Buffer
|
||||
}
|
||||
|
|
|
@ -3,17 +3,19 @@ package lib
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/stress-chaos/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/status"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/stringutils"
|
||||
|
@ -22,9 +24,10 @@ import (
|
|||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
//PrepareAndInjectStressChaos contains the prepration & injection steps for the stress experiments.
|
||||
func PrepareAndInjectStressChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// PrepareAndInjectStressChaos contains the prepration & injection steps for the stress experiments.
|
||||
func PrepareAndInjectStressChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PreparePodStressFault")
|
||||
defer span.End()
|
||||
var err error
|
||||
//Set up the tunables if provided in range
|
||||
SetChaosTunables(experimentsDetails)
|
||||
|
@ -76,7 +79,7 @@ func PrepareAndInjectStressChaos(experimentsDetails *experimentTypes.ExperimentD
|
|||
if experimentsDetails.ChaosServiceAccount == "" {
|
||||
experimentsDetails.ChaosServiceAccount, err = common.GetServiceAccount(experimentsDetails.ChaosNamespace, experimentsDetails.ChaosPodName, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not experiment service account")
|
||||
return stacktrace.Propagate(err, "could not get experiment service account")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,11 +92,11 @@ func PrepareAndInjectStressChaos(experimentsDetails *experimentTypes.ExperimentD
|
|||
experimentsDetails.IsTargetContainerProvided = experimentsDetails.TargetContainer != ""
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetPodList, clients, chaosDetails, resultDetails, eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -104,11 +107,13 @@ func PrepareAndInjectStressChaos(experimentsDetails *experimentTypes.ExperimentD
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode inject the stress chaos in all target application serially (one by one)
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodStressFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -127,45 +132,27 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
"ContainerName": experimentsDetails.TargetContainer,
|
||||
})
|
||||
runID := stringutils.GetRunID()
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, fmt.Sprintf("%s:%s:%s", pod.Name, pod.Namespace, experimentsDetails.TargetContainer), pod.Spec.NodeName, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for stress chaos
|
||||
log.Info("[Cleanup]: Deleting the helper pod")
|
||||
err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// injectChaosInParallelMode inject the stress chaos in all target application in parallel mode (all at once)
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList apiv1.PodList, clients clients.ClientSets, chaosDetails *types.ChaosDetails, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectPodStressFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
var err error
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -179,41 +166,24 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
targetsPerNode = append(targetsPerNode, fmt.Sprintf("%s:%s:%s", k.Name, k.Namespace, k.TargetContainer))
|
||||
}
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, strings.Join(targetsPerNode, ";"), node, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
}
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pods, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pods")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, chaosDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for stress chaos
|
||||
log.Info("[Cleanup]: Deleting all the helper pod")
|
||||
err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "CreatePodStressFaultHelperPod")
|
||||
defer span.End()
|
||||
|
||||
privilegedEnable := true
|
||||
terminationGracePeriodSeconds := int64(experimentsDetails.TerminationGracePeriodSeconds)
|
||||
|
@ -265,7 +235,7 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
"./helpers -name stress-chaos",
|
||||
},
|
||||
Resources: chaosDetails.Resources,
|
||||
Env: getPodEnv(experimentsDetails, targets),
|
||||
Env: getPodEnv(ctx, experimentsDetails, targets),
|
||||
VolumeMounts: []apiv1.VolumeMount{
|
||||
{
|
||||
Name: "socket-path",
|
||||
|
@ -295,15 +265,15 @@ func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clie
|
|||
helperPod.Spec.Volumes = append(helperPod.Spec.Volumes, common.GetSidecarVolumes(chaosDetails)...)
|
||||
}
|
||||
|
||||
_, err := clients.KubeClient.CoreV1().Pods(experimentsDetails.ChaosNamespace).Create(context.Background(), helperPod, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if err := clients.CreatePod(experimentsDetails.ChaosNamespace, helperPod); err != nil {
|
||||
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: fmt.Sprintf("unable to create helper pod: %s", err.Error())}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getPodEnv derive all the env required for the helper pod
|
||||
func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets string) []apiv1.EnvVar {
|
||||
func getPodEnv(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targets string) []apiv1.EnvVar {
|
||||
|
||||
var envDetails common.ENVDetails
|
||||
envDetails.SetEnv("TARGETS", targets).
|
||||
|
@ -323,6 +293,8 @@ func getPodEnv(experimentsDetails *experimentTypes.ExperimentDetails, targets st
|
|||
SetEnv("VOLUME_MOUNT_PATH", experimentsDetails.VolumeMountPath).
|
||||
SetEnv("STRESS_TYPE", experimentsDetails.StressType).
|
||||
SetEnv("INSTANCE_ID", experimentsDetails.InstanceID).
|
||||
SetEnv("OTEL_EXPORTER_OTLP_ENDPOINT", os.Getenv(telemetry.OTELExporterOTLPEndpoint)).
|
||||
SetEnv("TRACE_PARENT", telemetry.GetMarshalledSpanFromContext(ctx)).
|
||||
SetEnvFromDownwardAPI("v1", "metadata.name")
|
||||
|
||||
return envDetails.ENV
|
||||
|
@ -332,8 +304,8 @@ func ptrint64(p int64) *int64 {
|
|||
return &p
|
||||
}
|
||||
|
||||
//SetChaosTunables will set up a random value within a given range of values
|
||||
//If the value is not provided in range it'll set up the initial provided value.
|
||||
// SetChaosTunables will set up a random value within a given range of values
|
||||
// If the value is not provided in range it'll set up the initial provided value.
|
||||
func SetChaosTunables(experimentsDetails *experimentTypes.ExperimentDetails) {
|
||||
experimentsDetails.CPUcores = common.ValidateRange(experimentsDetails.CPUcores)
|
||||
experimentsDetails.CPULoad = common.ValidateRange(experimentsDetails.CPULoad)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
@ -9,22 +10,25 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/vmware"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
"github.com/litmuschaos/litmus-go/pkg/telemetry"
|
||||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/vmware/vm-poweroff/types"
|
||||
"github.com/palantir/stacktrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var inject, abort chan os.Signal
|
||||
|
||||
// InjectVMPowerOffChaos injects the chaos in serial or parallel mode
|
||||
func InjectVMPowerOffChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, cookie string) error {
|
||||
|
||||
func InjectVMPowerOffChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails, cookie string) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "PrepareVMPowerOffFault")
|
||||
defer span.End()
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
// Catch and relay certain signal(s) to inject channel.
|
||||
|
@ -49,11 +53,11 @@ func InjectVMPowerOffChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err := injectChaosInSerialMode(experimentsDetails, vmIdList, cookie, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := injectChaosInSerialMode(ctx, experimentsDetails, vmIdList, cookie, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err := injectChaosInParallelMode(experimentsDetails, vmIdList, cookie, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err := injectChaosInParallelMode(ctx, experimentsDetails, vmIdList, cookie, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -70,7 +74,10 @@ func InjectVMPowerOffChaos(experimentsDetails *experimentTypes.ExperimentDetails
|
|||
}
|
||||
|
||||
// injectChaosInSerialMode stops VMs in serial mode i.e. one after the other
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, vmIdList []string, cookie string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, vmIdList []string, cookie string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "injectVMPowerOffFaultInSerialMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
// stopping the chaos execution, if abort signal received
|
||||
|
@ -109,7 +116,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
//Run the probes during the chaos
|
||||
//The OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
@ -141,7 +148,9 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode stops VMs in parallel mode i.e. all at once
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, vmIdList []string, cookie string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, vmIdList []string, cookie string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "injectVMPowerOffFaultInParallelMode")
|
||||
defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -184,7 +193,7 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
|
||||
//Running the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "failed to run probes")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cerrors"
|
||||
|
@ -32,7 +33,7 @@ func injectChaos(experimentsDetails *experimentTypes.ExperimentDetails, podName
|
|||
return nil
|
||||
}
|
||||
|
||||
func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func experimentExecution(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// Get the target pod details for the chaos execution
|
||||
// if the target pod is not defined it will derive the random target pod list using pod affected percentage
|
||||
|
@ -53,13 +54,13 @@ func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
}
|
||||
log.Infof("Target pods list for chaos, %v", podNames)
|
||||
|
||||
return runChaos(experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails)
|
||||
return runChaos(ctx, experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails)
|
||||
}
|
||||
|
||||
func runChaos(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func runChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +121,10 @@ func runChaos(experimentsDetails *experimentTypes.ExperimentDetails, targetPodLi
|
|||
}
|
||||
|
||||
//PrepareChaos contains the preparation steps before chaos injection
|
||||
func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// @TODO: setup tracing
|
||||
// ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "InjectChaos")
|
||||
// defer span.End()
|
||||
|
||||
//Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
|
@ -128,7 +132,7 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
//Starting the CPU stress experiment
|
||||
if err := experimentExecution(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails);err != nil {
|
||||
if err := experimentExecution(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails);err != nil {
|
||||
return stacktrace.Propagate(err, "could not execute experiment")
|
||||
}
|
||||
//Waiting for the ramp time after chaos injection
|
||||
|
|
|
@ -19,7 +19,7 @@ import (
|
|||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func experimentExecution(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
|
||||
// Get the target pod details for the chaos execution
|
||||
// if the target pod is not defined it will derive the random target pod list using pod affected percentage
|
||||
|
@ -44,7 +44,7 @@ func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
if experimentsDetails.ChaosServiceAccount == "" {
|
||||
experimentsDetails.ChaosServiceAccount, err = common.GetServiceAccount(experimentsDetails.ChaosNamespace, experimentsDetails.ChaosPodName, clients)
|
||||
if err != nil {
|
||||
return stacktrace.Propagate(err, "could not experiment service account")
|
||||
return stacktrace.Propagate(err, "could not get experiment service account")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,10 +54,10 @@ func experimentExecution(experimentsDetails *experimentTypes.ExperimentDetails,
|
|||
}
|
||||
}
|
||||
|
||||
return runChaos(experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails)
|
||||
return runChaos(ctx, experimentsDetails, targetPodList, clients, resultDetails, eventsDetails, chaosDetails)
|
||||
}
|
||||
|
||||
func runChaos(experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func runChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetPodList corev1.PodList, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
if experimentsDetails.EngineName != "" {
|
||||
msg := "Injecting " + experimentsDetails.ExperimentName + " chaos on target pod"
|
||||
types.SetEngineEventAttributes(eventsDetails, types.ChaosInject, msg, "Normal", chaosDetails)
|
||||
|
@ -66,7 +66,7 @@ func runChaos(experimentsDetails *experimentTypes.ExperimentDetails, targetPodLi
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -89,34 +89,16 @@ func runChaos(experimentsDetails *experimentTypes.ExperimentDetails, targetPodLi
|
|||
"Target Container": experimentsDetails.TargetContainer,
|
||||
})
|
||||
|
||||
if err := createHelperPod(experimentsDetails, clients, chaosDetails, pod.Name, pod.Spec.NodeName, runID); err != nil {
|
||||
if err := createHelperPod(ctx, experimentsDetails, clients, chaosDetails, pod.Name, pod.Spec.NodeName, runID); err != nil {
|
||||
return stacktrace.Propagate(err, "could not create helper pod")
|
||||
}
|
||||
|
||||
common.SetTargets(pod.Name, "targeted", "pod", chaosDetails)
|
||||
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
appLabel := fmt.Sprintf("app=%s-helper-%s", experimentsDetails.ExperimentName, runID)
|
||||
|
||||
//checking the status of the helper pod, wait till the pod comes to running state else fail the experiment
|
||||
log.Info("[Status]: Checking the status of the helper pod")
|
||||
if err := status.CheckHelperStatus(experimentsDetails.ChaosNamespace, appLabel, experimentsDetails.Timeout, experimentsDetails.Delay, clients); err != nil {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return stacktrace.Propagate(err, "could not check helper status")
|
||||
}
|
||||
|
||||
// Wait till the completion of the helper pod
|
||||
// set an upper limit for the waiting time
|
||||
log.Info("[Wait]: waiting till the completion of the helper pod")
|
||||
podStatus, err := status.WaitForCompletion(experimentsDetails.ChaosNamespace, appLabel, clients, experimentsDetails.ChaosDuration+experimentsDetails.Timeout, common.GetContainerNames(chaosDetails)...)
|
||||
if err != nil || podStatus == "Failed" {
|
||||
common.DeleteAllHelperPodBasedOnJobCleanupPolicy(appLabel, chaosDetails, clients)
|
||||
return common.HelperFailedError(err, appLabel, experimentsDetails.ChaosNamespace, true)
|
||||
}
|
||||
|
||||
//Deleting all the helper pod for container-kill chaos
|
||||
log.Info("[Cleanup]: Deleting all the helper pods")
|
||||
if err = common.DeleteAllPod(appLabel, experimentsDetails.ChaosNamespace, chaosDetails.Timeout, chaosDetails.Delay, clients); err != nil {
|
||||
return stacktrace.Propagate(err, "could not delete helper pod(s)")
|
||||
if err := common.ManagerHelperLifecycle(appLabel, chaosDetails, clients, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -124,7 +106,10 @@ func runChaos(experimentsDetails *experimentTypes.ExperimentDetails, targetPodLi
|
|||
}
|
||||
|
||||
//PrepareChaos contains the preparation steps before chaos injection
|
||||
func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// @TODO: setup tracing
|
||||
// ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "Prepare[name-your-chaos]Fault")
|
||||
// defer span.End()
|
||||
|
||||
//Waiting for the ramp time before chaos injection
|
||||
if experimentsDetails.RampTime != 0 {
|
||||
|
@ -132,7 +117,7 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
common.WaitForDuration(experimentsDetails.RampTime)
|
||||
}
|
||||
//Starting the CPU stress experiment
|
||||
if err := experimentExecution(experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails);err != nil {
|
||||
if err := experimentExecution(ctx, experimentsDetails, clients, resultDetails, eventsDetails, chaosDetails);err != nil {
|
||||
return stacktrace.Propagate(err, "could not execute chaos")
|
||||
}
|
||||
//Waiting for the ramp time after chaos injection
|
||||
|
@ -144,7 +129,10 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
}
|
||||
|
||||
// createHelperPod derive the attributes for helper pod and create the helper pod
|
||||
func createHelperPod(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID string) error {
|
||||
func createHelperPod(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, chaosDetails *types.ChaosDetails, targets, nodeName, runID string) error {
|
||||
// @TODO: setup tracing
|
||||
// ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "Create[name-your-chaos]FaultHelperPod")
|
||||
// defer span.End()
|
||||
|
||||
helperPod := &corev1.Pod{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
|
@ -22,7 +23,10 @@ var (
|
|||
)
|
||||
|
||||
//PrepareChaos contains the preparation and injection steps for the experiment
|
||||
func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func PrepareChaos(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// @TODO: setup tracing
|
||||
// ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "Prepare[name-your-chaos]Fault")
|
||||
// defer span.End()
|
||||
|
||||
// inject channel is used to transmit signal notifications.
|
||||
inject = make(chan os.Signal, 1)
|
||||
|
@ -53,11 +57,11 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
|
||||
switch strings.ToLower(experimentsDetails.Sequence) {
|
||||
case "serial":
|
||||
if err = injectChaosInSerialMode(experimentsDetails, targetIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInSerialMode(ctx, experimentsDetails, targetIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in serial mode")
|
||||
}
|
||||
case "parallel":
|
||||
if err = injectChaosInParallelMode(experimentsDetails, targetIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
if err = injectChaosInParallelMode(ctx, experimentsDetails, targetIDList, clients, resultDetails, eventsDetails, chaosDetails); err != nil {
|
||||
return stacktrace.Propagate(err, "could not run chaos in parallel mode")
|
||||
}
|
||||
default:
|
||||
|
@ -73,7 +77,10 @@ func PrepareChaos(experimentsDetails *experimentTypes.ExperimentDetails, clients
|
|||
}
|
||||
|
||||
//injectChaosInSerialMode will inject the chaos on the target one after other
|
||||
func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetails, targetIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInSerialMode(ctx context.Contxt, experimentsDetails *experimentTypes.ExperimentDetails, targetIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// @TODO: setup tracing
|
||||
// ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "Inject[name-your-chaos]FaultInSerialMode")
|
||||
// defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -111,7 +118,7 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
|
||||
// The OnChaos probes execution will start in the first iteration and keep running for the entire chaos duration
|
||||
if len(resultDetails.ProbeDetails) != 0 && i == 0 {
|
||||
if err = probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -136,7 +143,10 @@ func injectChaosInSerialMode(experimentsDetails *experimentTypes.ExperimentDetai
|
|||
}
|
||||
|
||||
// injectChaosInParallelMode will inject the chaos on the target all at once
|
||||
func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDetails, targetIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
func injectChaosInParallelMode(ctx context.Context, experimentsDetails *experimentTypes.ExperimentDetails, targetIDList []string, clients clients.ClientSets, resultDetails *types.ResultDetails, eventsDetails *types.EventDetails, chaosDetails *types.ChaosDetails) error {
|
||||
// @TODO: setup tracing
|
||||
// ctx, span := otel.Tracer(telemetry.TracerName).Start(ctx, "Inject[name-your-chaos]FaultInParallelMode")
|
||||
// defer span.End()
|
||||
|
||||
select {
|
||||
case <-inject:
|
||||
|
@ -177,7 +187,7 @@ func injectChaosInParallelMode(experimentsDetails *experimentTypes.ExperimentDet
|
|||
|
||||
// run the probes during chaos
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, chaosDetails, clients, resultDetails, "DuringChaos", eventsDetails); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/{{ .Name }}/lib"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// Experiment contains steps to inject chaos
|
||||
func Experiment(clients clients.ClientSets){
|
||||
func Experiment(ctx context.Context, clients clients.ClientSets){
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -90,7 +91,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -111,7 +112,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// @TODO: user INVOKE-CHAOSLIB
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -142,7 +143,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// Experiment contains steps to inject chaos
|
||||
func Experiment(clients clients.ClientSets){
|
||||
func Experiment(ctx context.Context, clients clients.ClientSets){
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -40,7 +41,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -99,7 +100,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -120,7 +121,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// @TODO: user INVOKE-CHAOSLIB
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -148,7 +149,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -38,7 +39,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -98,7 +99,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -119,7 +120,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// @TODO: user INVOKE-CHAOSLIB
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
failStep := "[chaos]: Failed inside the chaoslib, err: " + err.Error()
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, failStep, clients, &eventsDetails)
|
||||
|
@ -149,7 +150,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// Experiment contains steps to inject chaos
|
||||
func Experiment(clients clients.ClientSets){
|
||||
func Experiment(ctx context.Context, clients clients.ClientSets){
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -104,7 +105,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -125,7 +126,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// @TODO: user INVOKE-CHAOSLIB
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -168,7 +169,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/{{ .Name }}/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
|
@ -19,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// Experiment contains steps to inject chaos
|
||||
func Experiment(clients clients.ClientSets){
|
||||
func Experiment(ctx context.Context, clients clients.ClientSets){
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -97,7 +99,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -118,7 +120,7 @@ func Experiment(clients clients.ClientSets){
|
|||
// @TODO: user INVOKE-CHAOSLIB
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
failStep := "[chaos]: Failed inside the chaoslib, err: " + err.Error()
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, failStep, clients, &eventsDetails)
|
||||
|
@ -148,7 +150,7 @@ func Experiment(clients clients.ClientSets){
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails);err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/aws-ssm-chaos/lib/ssm"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/aws-ssm/aws-ssm-chaos/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/aws-ssm/aws-ssm-chaos/types"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
ec2 "github.com/litmuschaos/litmus-go/pkg/cloud/aws/ec2"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/aws/ssm"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// AWSSSMChaosByID inject the ssm chaos on ec2 instance
|
||||
func AWSSSMChaosByID(clients clients.ClientSets) {
|
||||
func AWSSSMChaosByID(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -39,7 +40,7 @@ func AWSSSMChaosByID(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -80,7 +81,7 @@ func AWSSSMChaosByID(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -118,7 +119,7 @@ func AWSSSMChaosByID(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err := litmusLIB.PrepareAWSSSMChaosByID(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareAWSSSMChaosByID(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
//Delete the ssm document on the given aws service monitoring docs
|
||||
|
@ -152,7 +153,7 @@ func AWSSSMChaosByID(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/aws-ssm-chaos/lib/ssm"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/aws-ssm/aws-ssm-chaos/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/aws-ssm/aws-ssm-chaos/types"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
ec2 "github.com/litmuschaos/litmus-go/pkg/cloud/aws/ec2"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/aws/ssm"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// AWSSSMChaosByTag inject the ssm chaos on ec2 instance
|
||||
func AWSSSMChaosByTag(clients clients.ClientSets) {
|
||||
func AWSSSMChaosByTag(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -39,7 +40,7 @@ func AWSSSMChaosByTag(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -88,7 +89,7 @@ func AWSSSMChaosByTag(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -109,7 +110,7 @@ func AWSSSMChaosByTag(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err := litmusLIB.PrepareAWSSSMChaosByTag(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareAWSSSMChaosByTag(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
//Delete the ssm document on the given aws service monitoring docs
|
||||
|
@ -143,7 +144,7 @@ func AWSSSMChaosByTag(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/azure-disk-loss/lib"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/azure/disk-loss/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/azure/disk-loss/types"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
azureCommon "github.com/litmuschaos/litmus-go/pkg/cloud/azure/common"
|
||||
azureStatus "github.com/litmuschaos/litmus-go/pkg/cloud/azure/disk"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// AzureDiskLoss contains steps to inject chaos
|
||||
func AzureDiskLoss(clients clients.ClientSets) {
|
||||
func AzureDiskLoss(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
var err error
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
|
@ -40,7 +41,7 @@ func AzureDiskLoss(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err = types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err = common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -99,7 +100,7 @@ func AzureDiskLoss(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -120,7 +121,7 @@ func AzureDiskLoss(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err = litmusLIB.PrepareChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err = litmusLIB.PrepareChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
log.Errorf("Chaos injection failed: %v", err)
|
||||
return
|
||||
|
@ -147,7 +148,7 @@ func AzureDiskLoss(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/azure-instance-stop/lib"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/azure/instance-stop/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/azure/instance-stop/types"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
azureCommon "github.com/litmuschaos/litmus-go/pkg/cloud/azure/common"
|
||||
azureStatus "github.com/litmuschaos/litmus-go/pkg/cloud/azure/instance"
|
||||
|
||||
|
@ -21,7 +22,7 @@ import (
|
|||
)
|
||||
|
||||
// AzureInstanceStop inject the azure instance stop chaos
|
||||
func AzureInstanceStop(clients clients.ClientSets) {
|
||||
func AzureInstanceStop(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
var err error
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
|
@ -41,7 +42,7 @@ func AzureInstanceStop(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err = types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err = common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes: %v", err)
|
||||
}
|
||||
}
|
||||
|
@ -90,7 +91,7 @@ func AzureInstanceStop(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails)
|
||||
err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails)
|
||||
if err != nil {
|
||||
log.Errorf("Probe Failed: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
|
@ -122,7 +123,7 @@ func AzureInstanceStop(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err = litmusLIB.PrepareAzureStop(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err = litmusLIB.PrepareAzureStop(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -149,7 +150,7 @@ func AzureInstanceStop(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails)
|
||||
err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails)
|
||||
if err != nil {
|
||||
log.Errorf("Probes Failed: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -8,7 +9,7 @@ import (
|
|||
redfishLib "github.com/litmuschaos/litmus-go/pkg/baremetal/redfish"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/baremetal/redfish-node-restart/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/baremetal/redfish-node-restart/types"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// NodeRestart contains steps to inject chaos
|
||||
func NodeRestart(clients clients.ClientSets) {
|
||||
func NodeRestart(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -39,7 +40,7 @@ func NodeRestart(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -112,7 +113,7 @@ func NodeRestart(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -129,7 +130,7 @@ func NodeRestart(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err := litmusLIB.PrepareChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
return
|
||||
|
@ -181,7 +182,7 @@ func NodeRestart(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -8,7 +9,7 @@ import (
|
|||
"github.com/litmuschaos/litmus-go/pkg/cassandra"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/cassandra/pod-delete/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/cassandra/pod-delete/types"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
"github.com/litmuschaos/litmus-go/pkg/log"
|
||||
"github.com/litmuschaos/litmus-go/pkg/probe"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// CasssandraPodDelete inject the cassandra-pod-delete chaos
|
||||
func CasssandraPodDelete(clients clients.ClientSets) {
|
||||
func CasssandraPodDelete(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
var err error
|
||||
var ResourceVersionBefore string
|
||||
|
@ -41,7 +42,7 @@ func CasssandraPodDelete(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.ChaoslibDetail.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err = types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err = common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -102,7 +103,7 @@ func CasssandraPodDelete(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg = common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -132,7 +133,7 @@ func CasssandraPodDelete(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err = litmusLIB.PreparePodDelete(experimentsDetails.ChaoslibDetail, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err = litmusLIB.PreparePodDelete(ctx, experimentsDetails.ChaoslibDetail, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -169,7 +170,7 @@ func CasssandraPodDelete(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg = common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/gcp-vm-disk-loss-by-label/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/gcp/gcp-vm-disk-loss/environment"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// GCPVMDiskLossByLabel contains steps to inject chaos
|
||||
func GCPVMDiskLossByLabel(clients clients.ClientSets) {
|
||||
func GCPVMDiskLossByLabel(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
var (
|
||||
computeService *compute.Service
|
||||
|
@ -44,7 +45,7 @@ func GCPVMDiskLossByLabel(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -83,7 +84,7 @@ func GCPVMDiskLossByLabel(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -117,7 +118,7 @@ func GCPVMDiskLossByLabel(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err := litmusLIB.PrepareDiskVolumeLossByLabel(computeService, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareDiskVolumeLossByLabel(ctx, computeService, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -146,7 +147,7 @@ func GCPVMDiskLossByLabel(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/gcp-vm-disk-loss/lib"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
gcp "github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/gcp/gcp-vm-disk-loss/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/gcp/gcp-vm-disk-loss/types"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// VMDiskLoss injects the disk volume loss chaos
|
||||
func VMDiskLoss(clients clients.ClientSets) {
|
||||
func VMDiskLoss(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
var (
|
||||
computeService *compute.Service
|
||||
|
@ -44,7 +45,7 @@ func VMDiskLoss(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err = types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err = common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -83,7 +84,7 @@ func VMDiskLoss(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -125,7 +126,7 @@ func VMDiskLoss(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err = litmusLIB.PrepareDiskVolumeLoss(computeService, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err = litmusLIB.PrepareDiskVolumeLoss(ctx, computeService, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -152,7 +153,7 @@ func VMDiskLoss(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/gcp-vm-instance-stop-by-label/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/cloud/gcp"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/gcp/gcp-vm-instance-stop/environment"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// GCPVMInstanceStopByLabel contains steps to inject chaos
|
||||
func GCPVMInstanceStopByLabel(clients clients.ClientSets) {
|
||||
func GCPVMInstanceStopByLabel(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
var (
|
||||
computeService *compute.Service
|
||||
|
@ -44,7 +45,7 @@ func GCPVMInstanceStopByLabel(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -84,7 +85,7 @@ func GCPVMInstanceStopByLabel(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -118,7 +119,7 @@ func GCPVMInstanceStopByLabel(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err := litmusLIB.PrepareVMStopByLabel(computeService, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareVMStopByLabel(ctx, computeService, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -146,7 +147,7 @@ func GCPVMInstanceStopByLabel(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -20,7 +21,7 @@ import (
|
|||
)
|
||||
|
||||
// VMInstanceStop executes the experiment steps by injecting chaos into the specified vm instances
|
||||
func VMInstanceStop(clients clients.ClientSets) {
|
||||
func VMInstanceStop(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
var (
|
||||
computeService *compute.Service
|
||||
|
@ -44,7 +45,7 @@ func VMInstanceStop(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -83,7 +84,7 @@ func VMInstanceStop(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -119,7 +120,7 @@ func VMInstanceStop(clients clients.ClientSets) {
|
|||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
|
||||
if err := litmusLIB.PrepareVMStop(computeService, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareVMStop(ctx, computeService, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -147,7 +148,7 @@ func VMInstanceStop(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "AUT: Running, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/container-kill/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/container-kill/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/container-kill/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// ContainerKill inject the container-kill chaos
|
||||
func ContainerKill(clients clients.ClientSets) {
|
||||
func ContainerKill(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func ContainerKill(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -90,7 +91,7 @@ func ContainerKill(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg = common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -106,7 +107,7 @@ func ContainerKill(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareContainerKill(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareContainerKill(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -134,7 +135,7 @@ func ContainerKill(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg = common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/disk-fill/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/disk-fill/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/disk-fill/types"
|
||||
|
@ -14,11 +17,10 @@ import (
|
|||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/sirupsen/logrus"
|
||||
"os"
|
||||
)
|
||||
|
||||
// DiskFill inject the disk-fill chaos
|
||||
func DiskFill(clients clients.ClientSets) {
|
||||
func DiskFill(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -37,7 +39,7 @@ func DiskFill(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -88,7 +90,7 @@ func DiskFill(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg = common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -104,7 +106,7 @@ func DiskFill(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareDiskFill(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareDiskFill(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -132,7 +134,7 @@ func DiskFill(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg = common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/docker-service-kill/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/docker-service-kill/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/docker-service-kill/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// DockerServiceKill inject the docker-service-kill chaos
|
||||
func DockerServiceKill(clients clients.ClientSets) {
|
||||
func DockerServiceKill(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func DockerServiceKill(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -107,7 +108,7 @@ func DockerServiceKill(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -123,7 +124,7 @@ func DockerServiceKill(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareDockerServiceKill(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareDockerServiceKill(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
return
|
||||
|
@ -167,7 +168,7 @@ func DockerServiceKill(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/kubelet-service-kill/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/kubelet-service-kill/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/kubelet-service-kill/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// KubeletServiceKill inject the kubelet-service-kill chaos
|
||||
func KubeletServiceKill(clients clients.ClientSets) {
|
||||
func KubeletServiceKill(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func KubeletServiceKill(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -107,7 +108,7 @@ func KubeletServiceKill(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -123,7 +124,7 @@ func KubeletServiceKill(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareKubeletKill(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareKubeletKill(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -167,7 +168,7 @@ func KubeletServiceKill(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/node-cpu-hog/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/node-cpu-hog/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-cpu-hog/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// NodeCPUHog inject the node-cpu-hog chaos
|
||||
func NodeCPUHog(clients clients.ClientSets) {
|
||||
func NodeCPUHog(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func NodeCPUHog(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -108,7 +109,7 @@ func NodeCPUHog(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -124,7 +125,7 @@ func NodeCPUHog(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareNodeCPUHog(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareNodeCPUHog(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("[Error]: CPU hog failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -168,7 +169,7 @@ func NodeCPUHog(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -18,8 +19,8 @@ import (
|
|||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
//NodeDrain inject the node-drain chaos
|
||||
func NodeDrain(clients clients.ClientSets) {
|
||||
// NodeDrain inject the node-drain chaos
|
||||
func NodeDrain(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func NodeDrain(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -107,7 +108,7 @@ func NodeDrain(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -123,7 +124,7 @@ func NodeDrain(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareNodeDrain(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareNodeDrain(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -167,7 +168,7 @@ func NodeDrain(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/node-io-stress/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/node-io-stress/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-io-stress/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// NodeIOStress inject the node-io-stress chaos
|
||||
func NodeIOStress(clients clients.ClientSets) {
|
||||
func NodeIOStress(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func NodeIOStress(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -110,7 +111,7 @@ func NodeIOStress(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -126,7 +127,7 @@ func NodeIOStress(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareNodeIOStress(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareNodeIOStress(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("[Error]: node io stress failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -170,7 +171,7 @@ func NodeIOStress(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/node-memory-hog/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/node-memory-hog/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-memory-hog/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// NodeMemoryHog inject the node-memory-hog chaos
|
||||
func NodeMemoryHog(clients clients.ClientSets) {
|
||||
func NodeMemoryHog(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func NodeMemoryHog(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -109,7 +110,7 @@ func NodeMemoryHog(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -125,7 +126,7 @@ func NodeMemoryHog(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareNodeMemoryHog(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareNodeMemoryHog(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("[Error]: node memory hog failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -169,7 +170,7 @@ func NodeMemoryHog(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/node-restart/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/node-restart/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-restart/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// NodeRestart inject the node-restart chaos
|
||||
func NodeRestart(clients clients.ClientSets) {
|
||||
func NodeRestart(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func NodeRestart(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -107,7 +108,7 @@ func NodeRestart(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -123,7 +124,7 @@ func NodeRestart(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareNodeRestart(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareNodeRestart(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("[Error]: Node restart failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -167,7 +168,7 @@ func NodeRestart(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/node-taint/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/node-taint/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/node-taint/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// NodeTaint inject the node-taint chaos
|
||||
func NodeTaint(clients clients.ClientSets) {
|
||||
func NodeTaint(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func NodeTaint(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -108,7 +109,7 @@ func NodeTaint(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -124,7 +125,7 @@ func NodeTaint(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareNodeTaint(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareNodeTaint(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -168,7 +169,7 @@ func NodeTaint(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := "NUT: Ready, Probes: Unsuccessful"
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/pod-autoscaler/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/pod-autoscaler/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-autoscaler/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// PodAutoscaler inject the pod-autoscaler chaos
|
||||
func PodAutoscaler(clients clients.ClientSets) {
|
||||
func PodAutoscaler(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func PodAutoscaler(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -91,7 +92,7 @@ func PodAutoscaler(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -107,7 +108,7 @@ func PodAutoscaler(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PreparePodAutoscaler(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PreparePodAutoscaler(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -136,7 +137,7 @@ func PodAutoscaler(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/pod-cpu-hog-exec/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/pod-cpu-hog-exec/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/pod-cpu-hog-exec/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// PodCPUHogExec inject the pod-cpu-hog-exec chaos
|
||||
func PodCPUHogExec(clients clients.ClientSets) {
|
||||
func PodCPUHogExec(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func PodCPUHogExec(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -90,7 +91,7 @@ func PodCPUHogExec(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -106,7 +107,7 @@ func PodCPUHogExec(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareCPUExecStress(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareCPUExecStress(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("[Error]: CPU hog failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -134,7 +135,7 @@ func PodCPUHogExec(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/stress-chaos/lib"
|
||||
clients "github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
"github.com/litmuschaos/litmus-go/pkg/events"
|
||||
experimentEnv "github.com/litmuschaos/litmus-go/pkg/generic/stress-chaos/environment"
|
||||
experimentTypes "github.com/litmuschaos/litmus-go/pkg/generic/stress-chaos/types"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// PodCPUHog inject the pod-cpu-hog chaos
|
||||
func PodCPUHog(clients clients.ClientSets) {
|
||||
func PodCPUHog(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func PodCPUHog(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -90,7 +91,7 @@ func PodCPUHog(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -106,7 +107,7 @@ func PodCPUHog(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareAndInjectStressChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareAndInjectStressChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("[Error]: CPU hog failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -134,7 +135,7 @@ func PodCPUHog(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
litmusLIB "github.com/litmuschaos/litmus-go/chaoslib/litmus/pod-delete/lib"
|
||||
"github.com/litmuschaos/litmus-go/pkg/clients"
|
||||
|
@ -14,12 +17,10 @@ import (
|
|||
"github.com/litmuschaos/litmus-go/pkg/types"
|
||||
"github.com/litmuschaos/litmus-go/pkg/utils/common"
|
||||
"github.com/sirupsen/logrus"
|
||||
"os"
|
||||
)
|
||||
|
||||
// PodDelete inject the pod-delete chaos
|
||||
func PodDelete(clients clients.ClientSets) {
|
||||
|
||||
func PodDelete(ctx context.Context, clients clients.ClientSets) {
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
eventsDetails := types.EventDetails{}
|
||||
|
@ -37,7 +38,7 @@ func PodDelete(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -58,7 +59,7 @@ func PodDelete(clients clients.ClientSets) {
|
|||
return
|
||||
}
|
||||
|
||||
// generating the event in chaosresult to marked the verdict as awaited
|
||||
// generating the event in chaosresult to mark the verdict as awaited
|
||||
msg := "experiment: " + experimentsDetails.ExperimentName + ", Result: Awaited"
|
||||
types.SetResultEventAttributes(&eventsDetails, types.AwaitedVerdict, msg, "Normal", &resultDetails)
|
||||
if err := events.GenerateEvents(&eventsDetails, clients, &chaosDetails, "ChaosResult"); err != nil {
|
||||
|
@ -95,7 +96,7 @@ func PodDelete(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg = common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -113,7 +114,7 @@ func PodDelete(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PreparePodDelete(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PreparePodDelete(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -141,7 +142,7 @@ func PodDelete(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg = common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// PodDNSError contains steps to inject chaos
|
||||
func PodDNSError(clients clients.ClientSets) {
|
||||
func PodDNSError(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
resultDetails := types.ResultDetails{}
|
||||
|
@ -38,7 +39,7 @@ func PodDNSError(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err := types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err := common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -91,7 +92,7 @@ func PodDNSError(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PreChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
@ -107,7 +108,7 @@ func PodDNSError(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err := litmusLIB.PrepareAndInjectChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err := litmusLIB.PrepareAndInjectChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -135,7 +136,7 @@ func PodDNSError(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err := probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err := probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package experiment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
|
||||
|
@ -19,7 +20,7 @@ import (
|
|||
)
|
||||
|
||||
// PodDNSSpoof contains steps to inject chaos
|
||||
func PodDNSSpoof(clients clients.ClientSets) {
|
||||
func PodDNSSpoof(ctx context.Context, clients clients.ClientSets) {
|
||||
|
||||
var err error
|
||||
experimentsDetails := experimentTypes.ExperimentDetails{}
|
||||
|
@ -39,7 +40,7 @@ func PodDNSSpoof(clients clients.ClientSets) {
|
|||
|
||||
if experimentsDetails.EngineName != "" {
|
||||
// Get values from chaosengine. Bail out upon error, as we haven't entered exp business logic yet
|
||||
if err = types.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
if err = common.GetValuesFromChaosEngine(&chaosDetails, clients, &resultDetails); err != nil {
|
||||
log.Errorf("Unable to initialize the probes, err: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -92,7 +93,7 @@ func PodDNSSpoof(clients clients.ClientSets) {
|
|||
// run the probes in the pre-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
|
||||
err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails)
|
||||
err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PreChaos", &eventsDetails)
|
||||
if err != nil {
|
||||
log.Errorf("Probe Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
|
@ -109,7 +110,7 @@ func PodDNSSpoof(clients clients.ClientSets) {
|
|||
}
|
||||
|
||||
chaosDetails.Phase = types.ChaosInjectPhase
|
||||
if err = litmusLIB.PrepareAndInjectChaos(&experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
if err = litmusLIB.PrepareAndInjectChaos(ctx, &experimentsDetails, clients, &resultDetails, &eventsDetails, &chaosDetails); err != nil {
|
||||
log.Errorf("Chaos injection failed, err: %v", err)
|
||||
result.RecordAfterFailure(&chaosDetails, &resultDetails, err, clients, &eventsDetails)
|
||||
return
|
||||
|
@ -137,7 +138,7 @@ func PodDNSSpoof(clients clients.ClientSets) {
|
|||
|
||||
// run the probes in the post-chaos check
|
||||
if len(resultDetails.ProbeDetails) != 0 {
|
||||
if err = probe.RunProbes(&chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
if err = probe.RunProbes(ctx, &chaosDetails, clients, &resultDetails, "PostChaos", &eventsDetails); err != nil {
|
||||
log.Errorf("Probes Failed, err: %v", err)
|
||||
msg := common.GetStatusMessage(chaosDetails.DefaultHealthCheck, "AUT: Running", "Unsuccessful")
|
||||
types.SetEngineEventAttributes(&eventsDetails, types.PostChaosCheck, msg, "Warning", &chaosDetails)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue