Compare commits

...

40 Commits

Author SHA1 Message Date
Namkyu Park af8244e53a
update: pinning k8s version to 1.26 (#507)
* update: pinning k8s version to 1.26

Signed-off-by: namkyu1999 <lak9348@gmail.com>

* Fix: add flags to the golangci

Signed-off-by: namkyu1999 <lak9348@gmail.com>

* fix: update base image because of the CVE-2024-3596

Signed-off-by: namkyu1999 <lak9348@gmail.com>

---------

Signed-off-by: namkyu1999 <lak9348@gmail.com>
2025-04-02 11:48:47 +05:30
Shubham Chaudhary 0e85028f68
(chore): Fix the release pipeline (#506)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2024-10-15 23:40:33 +05:30
Shubham Chaudhary 63281440c1
(chore): Fix the release pipeline (#505)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2024-10-15 23:07:33 +05:30
Shubham Chaudhary 7e4ac4cc45
(chore): Fix the release pipelines (#504)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2024-10-15 22:55:25 +05:30
Shubham Chaudhary 9fb5e5a384
chore(go): upgrade the go version (#497)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2024-09-14 00:11:11 +05:30
Vedant Shrotria 0b10874e04
Merge pull request #499 from dusdjhyeon/ubi-migration
UBI migration of Images - chaos-operator
2024-08-06 12:57:54 +05:30
Vedant Shrotria 77a6191735
Merge branch 'master' into ubi-migration 2024-07-24 15:43:15 +05:30
Shubham Chaudhary bb7ea39bcd
chore(operator): Fix the lint (#500)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2024-07-16 11:47:00 +05:30
dusdjhyeon 3a8ff7b8fa
feat: migration base image
Signed-off-by: dusdjhyeon <dusdj0813@gmail.com>
2024-07-16 10:47:11 +09:00
Shubham Chaudhary e96a7ee7f1
fix(logs): fix the rank warning in logs (#496)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2024-06-01 12:04:04 +05:30
Vedant Shrotria 31aa78b0cf
Merge pull request #495 from Jonsy13/add-gitleaks
Adding `gitleaks` as PR Check
2024-05-20 10:27:29 +05:30
Vedant Shrotria 9d6dfb2d65
Merge branch 'master' into add-gitleaks 2024-05-17 17:37:17 +05:30
Jonsy13 a4c31076d4
Added gitleaks
Signed-off-by: Jonsy13 <vedant.shrotria@harness.io>
2024-05-17 17:33:41 +05:30
Udit Gaurav 2b2646ea7e
Fix: Adds fixes for pipeline issues (#493)
* Vulnerability: Fix vulnerabilities

---------

Signed-off-by: Udit Gaurav <udit.gaurav@harness.io>
2024-04-26 14:35:49 +05:30
Saranya Jena dc17ee1399
Merge pull request #488 from shovanmaity/fuz-2
add fuzz test for remove string utility function
2024-04-04 08:36:04 +02:00
Shovan Maity fe0bf63328
Update golang ci version
Signed-off-by: Shovan Maity <shovan.maity@harness.io>
2024-04-04 11:48:02 +05:30
Shovan Maity 361a7649cb
add fuzz test for remove string utility function
Signed-off-by: Shovan Maity <shovan.maity@harness.io>
2024-03-14 12:02:36 +05:30
Shovan Maity f1afe838dd
add fuzz test for set env utility function (#485)
* add fuzz test for set env utility function

Signed-off-by: Shovan Maity <shovan.maity@harness.io>
2024-03-08 21:16:51 +05:30
Nageshbansal ba4d2f704c
Support taints and tolerations for source cmd Probe (#483)
* Support tolerations for source cmd Probe

Signed-off-by: nagesh bansal <nageshbansal59@gmail.com>
2024-03-01 14:25:54 +05:30
Nageshbansal 2d84728732
Adds verbosity property (#481)
Signed-off-by: nagesh bansal <nageshbansal59@gmail.com>
2024-01-04 16:19:15 +05:30
Shubham Chaudhary d864dde90f
fix the go deps (#479)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-12-15 14:14:45 +05:30
Shubham Chaudhary e2641540a9
Integrate the operator image with scarf gateway (#478)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-11-16 11:15:51 +05:30
Adarshkumar14 6819a4be12
Upgrading the go version in build files (#474)
* updating the go version in build files

Signed-off-by: Adarsh kumar <adarsh.kumar@harness.io>

* Updating go version

Signed-off-by: Adarsh kumar <adarsh.kumar@harness.io>

---------

Signed-off-by: Adarsh kumar <adarsh.kumar@harness.io>
2023-07-18 17:06:17 +05:30
Shubham Chaudhary de73ffdd63
fixing the group of the fake clients (#472)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-06-29 09:34:37 +05:30
Shubham Chaudhary 522c4dd8d8
fixing the docker buildx progess argument (#473)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-06-20 11:53:11 +05:30
Shubham Chaudhary d2a310ac30
add the pod security context (#470)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-06-20 00:06:03 +05:30
Vedant Shrotria dc8f3597d3
Merge pull request #469 from uditgaurav/add-initialDelaySeconds
Add initialDelaySeconds for backward compatibility of probes
2023-06-05 16:52:23 +05:30
Udit Gaurav 8909abc5c2 Add initialDelaySeconds for backward compatibility 2023-06-05 16:43:45 +05:30
Vedant Shrotria d019f63af5
Merge pull request #468 from ispeakc0de/k8s-group
Group should be optional incase of k8s probes
2023-06-02 22:30:15 +05:30
Shubham Chaudhary ed0899559a Group should be optional incase of k8s probes
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-06-01 12:35:16 +05:30
Vedant Shrotria 06ff37d414
Merge pull request #464 from Adarshkumar14/master
updating go version to 1.19 for resolving vulnerabilities
2023-05-26 15:01:35 +05:30
Adarsh kumar ccd88854bd fixing gofmt check
Signed-off-by: Adarsh kumar <adarsh.kumar@harness.io>
2023-05-24 00:39:06 +05:30
Adarsh kumar 852d1203d4 updating go version to 1.19
Signed-off-by: Adarsh kumar <adarsh.kumar@harness.io>
2023-05-19 17:32:06 +05:30
Shubham Chaudhary c97b2b90e1
chore(fields): Converting optional fields to pointer type (#461)
* chore(fields): Converting optional fields to pointer type

Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>

* add sloprobe fields

Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>

---------

Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-04-25 12:00:39 +05:30
Shubham Chaudhary 3a5f576c5b
run workflow on dispatch event and use token from secrets (#460)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-04-20 13:20:54 +05:30
Shubham Chaudhary 5ea32522f0
chore(unit): Adding units to the duration fields (#459)
Signed-off-by: Shubham Chaudhary <shubham.chaudhary@harness.io>
2023-04-18 12:51:31 +05:30
Karthik Satchitanand 184224e2d2
(enhancement)schema: additional statuses for result phase (#458)
Signed-off-by: ksatchit <karthik.s@harness.io>
2023-04-13 20:43:51 +05:30
Amit Kumar Das 9cf6a6b9b7
Updated insecure skip verify type (#457)
Signed-off-by: Amit Kumar Das <amit.das@harness.io>
2023-04-08 21:46:28 +05:30
Amit Kumar Das 3998ae9f43
Added insecureSkipVerify in SLO Probe (#456)
Signed-off-by: Amit Kumar Das <amit.das@harness.io>
2023-04-08 09:30:18 +05:30
Amit Kumar Das aa8bea8162
feat: [CHAOS-126]: Added SLO probe schema (#455)
* feat: [CHAOS-126]: Added SLO probe schema

Signed-off-by: Amit Kumar Das <amit.das@harness.io>
2023-04-05 16:36:06 +05:30
34 changed files with 2999 additions and 3337 deletions

View File

@ -1,10 +0,0 @@
component_depth: 2
languages:
- go
exclude:
- /vendor/.*
- /pkg/client/.*
- /pkg/apis/litmuschaos/v1alpha1/zz_generated.*\.go
test:
include:
- .*/test/.*\.go

2
.github/CODEOWNERS vendored
View File

@ -2,4 +2,4 @@
# Each line is a file pattern followed by one or more owners. # Each line is a file pattern followed by one or more owners.
# These owners will be the default owners for everything in the repo. # These owners will be the default owners for everything in the repo.
* @rahulchheda @ksatchit @chandankumar4 @rajdas98 * @ksatchit @ispeakc0de @imrajdas

View File

@ -11,7 +11,7 @@ jobs:
# Install golang # Install golang
- uses: actions/setup-go@v2 - uses: actions/setup-go@v2
with: with:
go-version: 1.18 go-version: 1.22
# Checkout to the latest commit # Checkout to the latest commit
# On specific directory/path # On specific directory/path
@ -22,27 +22,13 @@ jobs:
run: make gofmt-check run: make gofmt-check
- name: golangci-lint - name: golangci-lint
uses: reviewdog/action-golangci-lint@v1 uses: reviewdog/action-golangci-lint@v2
with:
golangci_lint_flags: "--timeout=10m"
- name: unused-package check - name: unused-package check
run: make unused-package-check run: make unused-package-check
security:
container:
image: litmuschaos/snyk:1.0
volumes:
- /home/runner/work/_actions/:/home/runner/work/_actions/
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: snyk/actions/setup@master
- run: snyk auth ${SNYK_TOKEN}
- uses: actions/setup-go@v1
with:
go-version: 1.18
- name: Snyk monitor
run: snyk test
trivy: trivy:
needs: pre-checks needs: pre-checks
runs-on: ubuntu-latest runs-on: ubuntu-latest
@ -54,7 +40,7 @@ jobs:
- name: Build an image from Dockerfile - name: Build an image from Dockerfile
run: | run: |
docker build -f build/Dockerfile -t docker.io/litmuschaos/chaos-operator:${{ github.sha }} . --build-arg TARGETPLATFORM=linux/amd64 docker build -f build/Dockerfile -t docker.io/litmuschaos/chaos-operator:${{ github.sha }} . --build-arg TARGETPLATFORM=linux/amd64
- name: Run Trivy vulnerability scanner - name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master uses: aquasecurity/trivy-action@master
with: with:
@ -63,7 +49,19 @@ jobs:
exit-code: '1' exit-code: '1'
ignore-unfixed: true ignore-unfixed: true
vuln-type: 'os,library' vuln-type: 'os,library'
severity: 'CRITICAL,HIGH' severity: 'CRITICAL,HIGH'
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
image-build: image-build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@ -83,9 +81,9 @@ jobs:
make build-amd64 make build-amd64
docker save -o ${{ github.workspace }}/image.tar litmuschaos/chaos-operator:ci docker save -o ${{ github.workspace }}/image.tar litmuschaos/chaos-operator:ci
chmod +x ${{ github.workspace }}/image.tar chmod +x ${{ github.workspace }}/image.tar
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: myimage name: myimage
path: | path: |
@ -98,7 +96,7 @@ jobs:
# Install golang # Install golang
- uses: actions/setup-go@v2 - uses: actions/setup-go@v2
with: with:
go-version: 1.18 go-version: 1.22
# Checkout to the latest commit # Checkout to the latest commit
# On specific directory/path # On specific directory/path
@ -107,7 +105,7 @@ jobs:
#Install and configure a kind cluster #Install and configure a kind cluster
- name: Installing Prerequisites (K3S Cluster) - name: Installing Prerequisites (K3S Cluster)
env: env:
KUBECONFIG: /etc/rancher/k3s/k3s.yaml KUBECONFIG: /etc/rancher/k3s/k3s.yaml
run: | run: |
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.20.14-rc1+k3s1 sh -s - --docker --write-kubeconfig-mode 664 curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.20.14-rc1+k3s1 sh -s - --docker --write-kubeconfig-mode 664
@ -121,15 +119,15 @@ jobs:
make deps make deps
- name: Download artifact - name: Download artifact
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: myimage name: myimage
path: ${{ github.workspace }} path: ${{ github.workspace }}
- name: Load Docker image - name: Load Docker image
run: | run: |
docker load --input ${{ github.workspace }}/image.tar docker load --input ${{ github.workspace }}/image.tar
shell: bash shell: bash
- name: Running Go BDD Test - name: Running Go BDD Test
run: | run: |

View File

@ -2,13 +2,13 @@ name: ChaosOperator-E2E-pipeline
on: on:
issue_comment: issue_comment:
types: [created] types: [created]
jobs: jobs:
Tests: Tests:
if: contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/run-e2e') if: contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/run-e2e')
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Notification for e2e Start - name: Notification for e2e Start
uses: peter-evans/create-or-update-comment@v1 uses: peter-evans/create-or-update-comment@v1
with: with:
@ -19,13 +19,13 @@ jobs:
- uses: actions/setup-go@v2 - uses: actions/setup-go@v2
with: with:
go-version: 1.18 go-version: 1.22
- name: Setting up GOPATH - name: Setting up GOPATH
run: | run: |
echo ::set-env name=GOPATH::${GITHUB_WORKSPACE}/go echo ::set-env name=GOPATH::${GITHUB_WORKSPACE}/go
env: env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: true ACTIONS_ALLOW_UNSECURE_COMMANDS: true
#Using the last commit id of pull request #Using the last commit id of pull request
- uses: octokit/request-action@v2.x - uses: octokit/request-action@v2.x
@ -36,20 +36,20 @@ jobs:
pull_number: ${{ github.event.issue.number }} pull_number: ${{ github.event.issue.number }}
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: set commit to output - name: set commit to output
id: getcommit id: getcommit
run: | run: |
prsha=$(echo $response | jq '.[-1].sha' | tr -d '"') prsha=$(echo $response | jq '.[-1].sha' | tr -d '"')
echo "::set-output name=sha::$prsha" echo "::set-output name=sha::$prsha"
env: env:
response: ${{ steps.get_PR_commits.outputs.data }} response: ${{ steps.get_PR_commits.outputs.data }}
- uses: actions/checkout@v2 - uses: actions/checkout@v2
with: with:
ref: ${{steps.getcommit.outputs.sha}} ref: ${{steps.getcommit.outputs.sha}}
path: go/src/github.com/litmuschaos/chaos-operator path: go/src/github.com/litmuschaos/chaos-operator
- name: Build docker image - name: Build docker image
run: | run: |
export PATH=$PATH:$(go env GOPATH)/bin export PATH=$PATH:$(go env GOPATH)/bin
@ -61,12 +61,14 @@ jobs:
- name: Installing Prerequisites (KinD Cluster) - name: Installing Prerequisites (KinD Cluster)
uses: engineerd/setup-kind@v0.5.0 uses: engineerd/setup-kind@v0.5.0
with: with:
version: "v0.7.0" version: "v0.22.0"
- name: Configuring and testing kind Installation - name: Configuring and testing kind Installation
run: | run: |
kubectl cluster-info --context kind-kind kubectl cluster-info
kind get kubeconfig --internal >$HOME/.kube/config kubectl get pods -n kube-system
echo "current-context:" $(kubectl config current-context)
echo "environment-kubeconfig:" ${KUBECONFIG}
kubectl get nodes kubectl get nodes
- name: Load image on the nodes of the cluster - name: Load image on the nodes of the cluster
@ -76,7 +78,7 @@ jobs:
- name: Getting litmus-e2e repository - name: Getting litmus-e2e repository
run: | run: |
cd ${GOPATH}/src/github.com/litmuschaos/ cd ${GOPATH}/src/github.com/litmuschaos/
git clone https://github.com/litmuschaos/litmus-e2e.git -b generic git clone https://github.com/litmuschaos/litmus-e2e.git -b master
- name: Install LitmusChaos - name: Install LitmusChaos
run: | run: |
@ -86,25 +88,25 @@ jobs:
env: env:
OPERATOR_IMAGE: litmuschaos/chaos-operator:ci OPERATOR_IMAGE: litmuschaos/chaos-operator:ci
IMAGE_PULL_POLICY: IfNotPresent IMAGE_PULL_POLICY: IfNotPresent
KUBECONFIG: /home/runner/.kube/config KUBECONFIG: /home/runner/.kube/config
- name: Run Admin mode test - name: Run Admin mode test
if: startsWith(github.event.comment.body, '/run-e2e-admin-mode') || startsWith(github.event.comment.body, '/run-e2e-all') if: startsWith(github.event.comment.body, '/run-e2e-admin-mode') || startsWith(github.event.comment.body, '/run-e2e-all')
run: | run: |
export PATH=$PATH:$(go env GOPATH)/bin export PATH=$PATH:$(go env GOPATH)/bin
cd ${GOPATH}/src/github.com/litmuschaos/litmus-e2e cd ${GOPATH}/src/github.com/litmuschaos/litmus-e2e
go test operator/admin-mode_test.go -v -count=1 go test components/operator/admin-mode_test.go -v -count=1
env: env:
KUBECONFIG: /home/runner/.kube/config KUBECONFIG: /home/runner/.kube/config
- name: Run Reconcile Resiliency test - name: Run Reconcile Resiliency test
if: startsWith(github.event.comment.body, '/run-e2e-reconcile-resiliency') || startsWith(github.event.comment.body, '/run-e2e-all') if: startsWith(github.event.comment.body, '/run-e2e-reconcile-resiliency') || startsWith(github.event.comment.body, '/run-e2e-all')
run: | run: |
export PATH=$PATH:$(go env GOPATH)/bin export PATH=$PATH:$(go env GOPATH)/bin
cd ${GOPATH}/src/github.com/litmuschaos/litmus-e2e cd ${GOPATH}/src/github.com/litmuschaos/litmus-e2e
go test operator/reconcile-resiliency_test.go -v -count=1 go test components/operator/reconcile-resiliency_test.go -v -count=1
env: env:
KUBECONFIG: /home/runner/.kube/config KUBECONFIG: /home/runner/.kube/config
- name: Check the test run - name: Check the test run
if: | if: |
@ -113,7 +115,7 @@ jobs:
run: | run: |
echo ::set-env name=TEST_RUN::true echo ::set-env name=TEST_RUN::true
env: env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: true ACTIONS_ALLOW_UNSECURE_COMMANDS: true
- name: Check for all the jobs are succeeded - name: Check for all the jobs are succeeded
if: ${{ success() && env.TEST_RUN == 'true' }} if: ${{ success() && env.TEST_RUN == 'true' }}
@ -123,11 +125,11 @@ jobs:
body: | body: |
**Test Result:** All tests are passed **Test Result:** All tests are passed
**Logs:** [${{ env.RUN_ID }}](https://github.com/litmuschaos/chaos-operator/actions/runs/${{ env.RUN_ID }}) **Logs:** [${{ env.RUN_ID }}](https://github.com/litmuschaos/chaos-operator/actions/runs/${{ env.RUN_ID }})
reactions: hooray reactions: hooray
env: env:
RUN_ID: ${{ github.run_id }} RUN_ID: ${{ github.run_id }}
- name: Check for any job failed - name: Check for any job failed
if: ${{ failure() }} if: ${{ failure() }}
uses: peter-evans/create-or-update-comment@v1 uses: peter-evans/create-or-update-comment@v1
@ -135,23 +137,23 @@ jobs:
comment-id: "${{ github.event.comment.id }}" comment-id: "${{ github.event.comment.id }}"
body: | body: |
**Test Failed:** Some tests are failed please check **Test Failed:** Some tests are failed please check
**Logs:** [${{ env.RUN_ID }}](https://github.com/litmuschaos/chaos-operator/actions/runs/${{ env.RUN_ID }}) **Logs:** [${{ env.RUN_ID }}](https://github.com/litmuschaos/chaos-operator/actions/runs/${{ env.RUN_ID }})
reactions: confused reactions: confused
env: env:
RUN_ID: ${{ github.run_id }} RUN_ID: ${{ github.run_id }}
- name: Deleting KinD cluster - name: Deleting KinD cluster
if: ${{ always() }} if: ${{ always() }}
run: kind delete cluster run: kind delete cluster
- name: Check if any test ran or not - name: Check if any test ran or not
if: env.TEST_RUN != 'true' if: env.TEST_RUN != 'true'
uses: peter-evans/create-or-update-comment@v1 uses: peter-evans/create-or-update-comment@v1
with: with:
comment-id: "${{ github.event.comment.id }}" comment-id: "${{ github.event.comment.id }}"
body: | body: |
**Test Result:** No test found **Test Result:** No test found try /run-e2e-all
**Logs:** [${{ env.RUN_ID }}](https://github.com/litmuschaos/chaos-operator/actions/runs/${{ env.RUN_ID }}) **Logs:** [${{ env.RUN_ID }}](https://github.com/litmuschaos/chaos-operator/actions/runs/${{ env.RUN_ID }})
reactions: eyes reactions: eyes
env: env:
RUN_ID: ${{ github.run_id }} RUN_ID: ${{ github.run_id }}

View File

@ -13,7 +13,7 @@ jobs:
# Install golang # Install golang
- uses: actions/setup-go@v2 - uses: actions/setup-go@v2
with: with:
go-version: 1.18 go-version: 1.22
# Checkout to the latest commit # Checkout to the latest commit
# On specific directory/path # On specific directory/path
@ -24,14 +24,13 @@ jobs:
run: make gofmt-check run: make gofmt-check
- name: golangci-lint - name: golangci-lint
uses: reviewdog/action-golangci-lint@v1 uses: reviewdog/action-golangci-lint@v2
- name: unused-package check - name: unused-package check
run: make unused-package-check run: make unused-package-check
image-build: image-build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: tests
steps: steps:
# Checkout to the latest commit # Checkout to the latest commit
# On specific directory/path # On specific directory/path
@ -59,45 +58,4 @@ jobs:
DOCKER_TAG: ci DOCKER_TAG: ci
DNAME: ${{ secrets.DNAME }} DNAME: ${{ secrets.DNAME }}
DPASS: ${{ secrets.DPASS }} DPASS: ${{ secrets.DPASS }}
run: make push-chaos-operator run: make push-chaos-operator
tests:
needs: pre-checks
runs-on: ubuntu-latest
steps:
# Checkout to the latest commit
# On specific directory/path
- name: Checkout
uses: actions/checkout@v2
# Install golang
- uses: actions/setup-go@v2
with:
go-version: 1.18
#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.20.14-rc1+k3s1 sh -s - --docker --write-kubeconfig-mode 664
kubectl wait node --all --for condition=ready --timeout=90s
mkdir -p $HOME/.kube
cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
kubectl get nodes
- name: Dependency checks
run: |
make deps
- name: Build Docker Image
env:
DOCKER_REPO: litmuschaos
DOCKER_IMAGE: chaos-operator
DOCKER_TAG: ci
run: |
make build-amd64
- name: Running Go BDD Test
run: |
make test

View File

@ -11,25 +11,15 @@ jobs:
# Install golang # Install golang
- uses: actions/setup-go@v2 - uses: actions/setup-go@v2
with: with:
go-version: 1.18 go-version: 1.22
# Checkout to the latest commit # Checkout to the latest commit
# On specific directory/path # On specific directory/path
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: gofmt check
run: make gofmt-check
- name: golangci-lint
uses: reviewdog/action-golangci-lint@v1
- name: unused-package check
run: make unused-package-check
image-build: image-build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: tests
steps: steps:
# Checkout to the latest commit # Checkout to the latest commit
# On specific directory/path # On specific directory/path
@ -73,44 +63,3 @@ jobs:
DNAME: ${{ secrets.DNAME }} DNAME: ${{ secrets.DNAME }}
DPASS: ${{ secrets.DPASS }} DPASS: ${{ secrets.DPASS }}
run: make push-chaos-operator run: make push-chaos-operator
tests:
needs: pre-checks
runs-on: ubuntu-latest
steps:
# Checkout to the latest commit
# On specific directory/path
- name: Checkout
uses: actions/checkout@v2
# Install golang
- uses: actions/setup-go@v2
with:
go-version: 1.18
#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.20.14-rc1+k3s1 sh -s - --docker --write-kubeconfig-mode 664
kubectl wait node --all --for condition=ready --timeout=90s
mkdir -p $HOME/.kube
cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
kubectl get nodes
- name: Dependency checks
run: |
make deps
- name: Build Docker Image
env:
DOCKER_REPO: litmuschaos
DOCKER_IMAGE: chaos-operator
DOCKER_TAG: ci
run: |
make build-amd64
- name: Running Go BDD Test
run: |
make test

23
.github/workflows/security-scan.yml vendored Normal file
View File

@ -0,0 +1,23 @@
---
name: Security Scan
on:
workflow_dispatch:
jobs:
trivy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Build an image from Dockerfile
run: |
docker build -f build/Dockerfile -t docker.io/litmuschaos/chaos-operator:${{ github.sha }} . --build-arg TARGETARCH=amd64
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'docker.io/litmuschaos/chaos-operator:${{ github.sha }}'
format: 'table'
exit-code: '1'
ignore-unfixed: true
vuln-type: 'os,library'
severity: 'CRITICAL,HIGH'

View File

@ -72,21 +72,21 @@ gofmt-check:
.PHONY: build-chaos-operator .PHONY: build-chaos-operator
build-chaos-operator: build-chaos-operator:
@echo "-------------------------" @echo "-------------------------"
@echo "--> Build go-runner image" @echo "--> Build go-runner image"
@echo "-------------------------" @echo "-------------------------"
@docker buildx build --file build/Dockerfile --progress plane --no-cache --platform linux/arm64,linux/amd64 --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) . @docker buildx build --file build/Dockerfile --progress plain --no-cache --platform linux/arm64,linux/amd64 --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) .
.PHONY: push-chaos-operator .PHONY: push-chaos-operator
push-chaos-operator: push-chaos-operator:
@echo "------------------------------" @echo "------------------------------"
@echo "--> Pushing image" @echo "--> Pushing image"
@echo "------------------------------" @echo "------------------------------"
@docker buildx build --file build/Dockerfile --progress plane --no-cache --push --platform linux/arm64,linux/amd64 --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) . @docker buildx build --file build/Dockerfile --progress plain --no-cache --push --platform linux/arm64,linux/amd64 --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) .
.PHONY: build-amd64 .PHONY: build-amd64
build-amd64: build-amd64:
@echo "-------------------------" @echo "-------------------------"
@echo "--> Build go-runner image" @echo "--> Build go-runner image"
@echo "-------------------------" @echo "-------------------------"
@docker build -f build/Dockerfile --no-cache -t $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) . --build-arg TARGETPLATFORM="linux/amd64" @docker build -f build/Dockerfile --no-cache -t $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) . --build-arg TARGETPLATFORM="linux/amd64"

View File

@ -8,7 +8,6 @@
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/2597079b1b5240d3866a6deb4112a2f2)](https://www.codacy.com/manual/litmuschaos/chaos-operator?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=litmuschaos/chaos-operator&amp;utm_campaign=Badge_Grade) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/2597079b1b5240d3866a6deb4112a2f2)](https://www.codacy.com/manual/litmuschaos/chaos-operator?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=litmuschaos/chaos-operator&amp;utm_campaign=Badge_Grade)
[![Go Report Card](https://goreportcard.com/badge/github.com/litmuschaos/chaos-operator)](https://goreportcard.com/report/github.com/litmuschaos/chaos-operator) [![Go Report Card](https://goreportcard.com/badge/github.com/litmuschaos/chaos-operator)](https://goreportcard.com/report/github.com/litmuschaos/chaos-operator)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5290/badge)](https://bestpractices.coreinfrastructure.org/projects/5290) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5290/badge)](https://bestpractices.coreinfrastructure.org/projects/5290)
[![BCH compliance](https://bettercodehub.com/edge/badge/litmuschaos/chaos-operator?branch=master)](https://bettercodehub.com/)
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Flitmuschaos%2Fchaos-operator.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Flitmuschaos%2Fchaos-operator?ref=badge_shield) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Flitmuschaos%2Fchaos-operator.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Flitmuschaos%2Fchaos-operator?ref=badge_shield)
[![codecov](https://codecov.io/gh/litmuschaos/chaos-operator/branch/master/graph/badge.svg)](https://codecov.io/gh/litmuschaos/chaos-operator) [![codecov](https://codecov.io/gh/litmuschaos/chaos-operator/branch/master/graph/badge.svg)](https://codecov.io/gh/litmuschaos/chaos-operator)
[![YouTube Channel](https://img.shields.io/badge/YouTube-Subscribe-red)](https://www.youtube.com/channel/UCa57PMqmz_j0wnteRa9nCaw) [![YouTube Channel](https://img.shields.io/badge/YouTube-Subscribe-red)](https://www.youtube.com/channel/UCa57PMqmz_j0wnteRa9nCaw)

View File

@ -29,7 +29,7 @@ type ChaosEngineSpec struct {
Appinfo ApplicationParams `json:"appinfo,omitempty"` Appinfo ApplicationParams `json:"appinfo,omitempty"`
//DefaultHealthCheck defines whether default health checks should be executed or not. It can be true or false //DefaultHealthCheck defines whether default health checks should be executed or not. It can be true or false
// default value is true // default value is true
DefaultHealthCheck string `json:"defaultHealthCheck,omitempty"` DefaultHealthCheck bool `json:"defaultHealthCheck,omitempty"`
//ChaosServiceAccount is the SvcAcc specified for chaos runner pods //ChaosServiceAccount is the SvcAcc specified for chaos runner pods
ChaosServiceAccount string `json:"chaosServiceAccount"` ChaosServiceAccount string `json:"chaosServiceAccount"`
//Components contains the image, imagePullPolicy, arguments, and commands of runner //Components contains the image, imagePullPolicy, arguments, and commands of runner
@ -208,8 +208,6 @@ type ExperimentList struct {
// ExperimentAttributes defines attributes of experiments // ExperimentAttributes defines attributes of experiments
type ExperimentAttributes struct { type ExperimentAttributes struct {
//Execution priority of the chaos experiment
Rank uint32 `json:"rank"`
// It contains env, configmaps, secrets, experimentImage, node selector, custom experiment annotation // It contains env, configmaps, secrets, experimentImage, node selector, custom experiment annotation
// which can be provided or overridden from the chaos engine // which can be provided or overridden from the chaos engine
Components ExperimentComponents `json:"components,omitempty"` Components ExperimentComponents `json:"components,omitempty"`
@ -221,22 +219,24 @@ type ExperimentAttributes struct {
// ProbeAttributes contains details of probe, which can be applied on the experiments // ProbeAttributes contains details of probe, which can be applied on the experiments
type ProbeAttributes struct { type ProbeAttributes struct {
// Name of probe // Name of probe
Name string `json:"name,omitempty"` Name string `json:"name"`
// Type of probe // Type of probe
Type string `json:"type,omitempty"` Type string `json:"type"`
// inputs needed for the k8s probe // inputs needed for the k8s probe
K8sProbeInputs K8sProbeInputs `json:"k8sProbe/inputs,omitempty"` K8sProbeInputs *K8sProbeInputs `json:"k8sProbe/inputs,omitempty"`
// inputs needed for the http probe // inputs needed for the http probe
HTTPProbeInputs HTTPProbeInputs `json:"httpProbe/inputs,omitempty"` HTTPProbeInputs *HTTPProbeInputs `json:"httpProbe/inputs,omitempty"`
// inputs needed for the cmd probe // inputs needed for the cmd probe
CmdProbeInputs CmdProbeInputs `json:"cmdProbe/inputs,omitempty"` CmdProbeInputs *CmdProbeInputs `json:"cmdProbe/inputs,omitempty"`
// inputs needed for the prometheus probe // inputs needed for the prometheus probe
PromProbeInputs PromProbeInputs `json:"promProbe/inputs,omitempty"` PromProbeInputs *PromProbeInputs `json:"promProbe/inputs,omitempty"`
// inputs needed for the SLO probe
SLOProbeInputs *SLOProbeInputs `json:"sloProbe/inputs,omitempty"`
// RunProperty contains timeout, retry and interval for the probe // RunProperty contains timeout, retry and interval for the probe
RunProperties RunProperty `json:"runProperties,omitempty"` RunProperties RunProperty `json:"runProperties"`
// mode for k8s probe // mode for k8s probe
// it can be SOT, EOT, Edge // it can be SOT, EOT, Edge
Mode string `json:"mode,omitempty"` Mode string `json:"mode"`
// Data contains the manifest/data for the resource, which need to be created // Data contains the manifest/data for the resource, which need to be created
// it supported for create operation only // it supported for create operation only
Data string `json:"data,omitempty"` Data string `json:"data,omitempty"`
@ -247,9 +247,9 @@ type K8sProbeInputs struct {
// group of the resource // group of the resource
Group string `json:"group,omitempty"` Group string `json:"group,omitempty"`
// apiversion of the resource // apiversion of the resource
Version string `json:"version,omitempty"` Version string `json:"version"`
// kind of resource // kind of resource
Resource string `json:"resource,omitempty"` Resource string `json:"resource"`
// ResourceNames to get the resources using their list of comma separated names // ResourceNames to get the resources using their list of comma separated names
ResourceNames string `json:"resourceNames,omitempty"` ResourceNames string `json:"resourceNames,omitempty"`
// namespace of the resource // namespace of the resource
@ -260,24 +260,24 @@ type K8sProbeInputs struct {
LabelSelector string `json:"labelSelector,omitempty"` LabelSelector string `json:"labelSelector,omitempty"`
// Operation performed by the k8s probe // Operation performed by the k8s probe
// it can be create, delete, present, absent // it can be create, delete, present, absent
Operation string `json:"operation,omitempty"` Operation string `json:"operation"`
} }
//CmdProbeInputs contains all the inputs required for cmd probe // CmdProbeInputs contains all the inputs required for cmd probe
type CmdProbeInputs struct { type CmdProbeInputs struct {
// Command need to be executed for the probe // Command need to be executed for the probe
Command string `json:"command,omitempty"` Command string `json:"command"`
// Comparator check for the correctness of the probe output // Comparator check for the correctness of the probe output
Comparator ComparatorInfo `json:"comparator,omitempty"` Comparator ComparatorInfo `json:"comparator"`
// The source where we have to run the command // The source where we have to run the command
// It will run in inline(inside experiment itself) mode if source is nil // It will run in inline(inside experiment itself) mode if source is nil
Source SourceDetails `json:"source,omitempty"` Source *SourceDetails `json:"source,omitempty"`
} }
// SourceDetails contains source details of the cmdProbe // SourceDetails contains source details of the cmdProbe
type SourceDetails struct { type SourceDetails struct {
// Image for the source pod // Image for the source pod
Image string `json:"image,omitempty"` Image string `json:"image"`
// HostNetwork define the hostNetwork of the external pod // HostNetwork define the hostNetwork of the external pod
// it supports boolean values and default value is false // it supports boolean values and default value is false
HostNetwork bool `json:"hostNetwork,omitempty"` HostNetwork bool `json:"hostNetwork,omitempty"`
@ -300,6 +300,8 @@ type SourceDetails struct {
Privileged bool `json:"privileged,omitempty"` Privileged bool `json:"privileged,omitempty"`
// NodeSelector for the source pod // NodeSelector for the source pod
NodeSelector map[string]string `json:"nodeSelector,omitempty"` NodeSelector map[string]string `json:"nodeSelector,omitempty"`
// Tolerations for the source pod
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
// Volumes for the source pod // Volumes for the source pod
Volumes []corev1.Volume `json:"volumes,omitempty"` Volumes []corev1.Volume `json:"volumes,omitempty"`
// VolumesMount for the source pod // VolumesMount for the source pod
@ -308,16 +310,57 @@ type SourceDetails struct {
ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"` ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
} }
//PromProbeInputs contains all the inputs required for prometheus probe // PromProbeInputs contains all the inputs required for prometheus probe
type PromProbeInputs struct { type PromProbeInputs struct {
// Endpoint for the prometheus probe // Endpoint for the prometheus probe
Endpoint string `json:"endpoint,omitempty"` Endpoint string `json:"endpoint"`
// Query to get promethus metrics // Query to get promethus metrics
Query string `json:"query,omitempty"` Query string `json:"query,omitempty"`
// QueryPath contains filePath, which contains prometheus query // QueryPath contains filePath, which contains prometheus query
QueryPath string `json:"queryPath,omitempty"` QueryPath string `json:"queryPath,omitempty"`
// Comparator check for the correctness of the probe output // Comparator check for the correctness of the probe output
Comparator ComparatorInfo `json:"comparator,omitempty"` Comparator ComparatorInfo `json:"comparator"`
}
// SLOProbeInputs contains all the inputs required for SLO probe
type SLOProbeInputs struct {
// PlatformEndpoint for the monitoring service endpoint
PlatformEndpoint string `json:"platformEndpoint"`
// SLOIdentifier for fetching the details of the SLO
SLOIdentifier string `json:"sloIdentifier"`
// InsecureSkipVerify flag to skip certificate checks
InsecureSkipVerify bool `json:"insecureSkipVerify,omitempty"`
// EvaluationWindow is the time period for which the metrics will be evaluated
EvaluationWindow *EvaluationWindow `json:"evaluationWindow,omitempty"`
// SLOSourceMetadata consists of required metadata details to fetch metric data
SLOSourceMetadata SLOSourceMetadata `json:"sloSourceMetadata"`
// Comparator check for the correctness of the probe output
Comparator ComparatorInfo `json:"comparator"`
}
// EvaluationWindow is the time period for which the SLO probe will work
type EvaluationWindow struct {
// Start time of evaluation
EvaluationStartTime int `json:"evaluationStartTime,omitempty"`
// End time of evaluation
EvaluationEndTime int `json:"evaluationEndTime,omitempty"`
}
type SLOSourceMetadata struct {
// APITokenSecret for authenticating with the platform service
APITokenSecret string `json:"apiTokenSecret"`
// Scope required for fetching details
Scope Identifier `json:"scope"`
}
// Identifier required for fetching details from the Platform APIs
type Identifier struct {
// AccountIdentifier for account ID
AccountIdentifier string `json:"accountIdentifier"`
// OrgIdentifier for organization ID
OrgIdentifier string `json:"orgIdentifier"`
// ProjectIdentifier for project ID
ProjectIdentifier string `json:"projectIdentifier"`
} }
// ComparatorInfo contains the comparator details // ComparatorInfo contains the comparator details
@ -328,34 +371,34 @@ type ComparatorInfo struct {
// Criteria for matching data // Criteria for matching data
// it supports >=, <=, ==, >, <, != for int and float // it supports >=, <=, ==, >, <, != for int and float
// it supports equal, notEqual, contains for string // it supports equal, notEqual, contains for string
Criteria string `json:"criteria,omitempty"` Criteria string `json:"criteria"`
// Value contains relative value for criteria // Value contains relative value for criteria
Value string `json:"value,omitempty"` Value string `json:"value"`
} }
//HTTPProbeInputs contains all the inputs required for http probe // HTTPProbeInputs contains all the inputs required for http probe
type HTTPProbeInputs struct { type HTTPProbeInputs struct {
// URL which needs to curl, to check the status // URL which needs to curl, to check the status
URL string `json:"url,omitempty"` URL string `json:"url"`
// InsecureSkipVerify flag to skip certificate checks // InsecureSkipVerify flag to skip certificate checks
InsecureSkipVerify bool `json:"insecureSkipVerify,omitempty"` InsecureSkipVerify bool `json:"insecureSkipVerify,omitempty"`
// Method define the http method, it can be get or post // Method define the http method, it can be get or post
Method HTTPMethod `json:"method,omitempty"` Method HTTPMethod `json:"method"`
} }
// HTTPMethod define the http method details // HTTPMethod define the http method details
type HTTPMethod struct { type HTTPMethod struct {
Get GetMethod `json:"get,omitempty"` Get *GetMethod `json:"get,omitempty"`
Post PostMethod `json:"post,omitempty"` Post *PostMethod `json:"post,omitempty"`
} }
// GetMethod define the http Get method // GetMethod define the http Get method
type GetMethod struct { type GetMethod struct {
// Criteria for matching data // Criteria for matching data
// it supports == != operations // it supports == != operations
Criteria string `json:"criteria,omitempty"` Criteria string `json:"criteria"`
// Value contains relative value for criteria // Value contains relative value for criteria
ResponseCode string `json:"responseCode,omitempty"` ResponseCode string `json:"responseCode"`
} }
// PostMethod define the http Post method // PostMethod define the http Post method
@ -368,26 +411,33 @@ type PostMethod struct {
BodyPath string `json:"bodyPath,omitempty"` BodyPath string `json:"bodyPath,omitempty"`
// Criteria for matching data // Criteria for matching data
// it supports == != operations // it supports == != operations
Criteria string `json:"criteria,omitempty"` Criteria string `json:"criteria"`
// Value contains relative value for criteria // Value contains relative value for criteria
ResponseCode string `json:"responseCode,omitempty"` ResponseCode string `json:"responseCode"`
} }
//RunProperty contains timeout, retry and interval for the probe // RunProperty contains timeout, retry and interval for the probe
type RunProperty struct { type RunProperty struct {
//ProbeTimeout contains timeout for the probe //ProbeTimeout contains timeout for the probe
ProbeTimeout int `json:"probeTimeout,omitempty"` ProbeTimeout string `json:"probeTimeout"`
// Interval contains the interval for the probe // Interval contains the interval for the probe
Interval int `json:"interval,omitempty"` Interval string `json:"interval"`
// Retry contains the retry count for the probe // Retry contains the retry count for the probe
Retry int `json:"retry,omitempty"` Retry int `json:"retry,omitempty"`
// Attempt contains the total attempt count for the probe // Attempt contains the total attempt count for the probe
Attempt int `json:"attempt,omitempty"` Attempt int `json:"attempt,omitempty"`
//ProbePollingInterval contains time interval, for which continuous probe should be sleep //ProbePollingInterval contains time interval, for which continuous probe should be sleep
// after each iteration // after each iteration
ProbePollingInterval int `json:"probePollingInterval,omitempty"` ProbePollingInterval string `json:"probePollingInterval,omitempty"`
//InitialDelaySeconds time interval for which probe will wait before run //InitialDelaySeconds time interval for which probe will wait before run
InitialDelaySeconds int `json:"initialDelaySeconds,omitempty"` InitialDelaySeconds int `json:"initialDelaySeconds,omitempty"`
//InitialDelay time interval for which probe will wait before run
InitialDelay string `json:"initialDelay,omitempty"`
// EvaluationTimeout is the timeout window in which the SLO metrics
// will be fetched and will be evaluated
EvaluationTimeout string `json:"evaluationTimeout,omitempty"`
// Verbosity contains flags for type of logging while running the Continuous and onChaos Probes
Verbosity string `json:"verbosity,omitempty"`
// StopOnFailure contains flag to stop/continue experiment execution, if probe fails // StopOnFailure contains flag to stop/continue experiment execution, if probe fails
// it will stop the experiment execution, if provided true // it will stop the experiment execution, if provided true
// it will continue the experiment execution, if provided false or not provided(default case) // it will continue the experiment execution, if provided false or not provided(default case)

View File

@ -40,8 +40,10 @@ const (
ResultPhaseRunning ResultPhase = "Running" ResultPhaseRunning ResultPhase = "Running"
// ResultPhaseCompleted is phase of chaosresult which is in completed state // ResultPhaseCompleted is phase of chaosresult which is in completed state
ResultPhaseCompleted ResultPhase = "Completed" ResultPhaseCompleted ResultPhase = "Completed"
// ResultPhaseCompletedWithError is phase of chaosresult when probe is failed // Retained For Backward Compatibility: ResultPhaseCompletedWithError is phase of chaosresult when probe is failed in 3.0beta5
ResultPhaseCompletedWithError ResultPhase = "Completed_With_Error" ResultPhaseCompletedWithError ResultPhase = "Completed_With_Error"
// ResultPhaseCompletedWithProbeFailure is phase of chaosresult when probe is failed from 3.0beta6
ResultPhaseCompletedWithProbeFailure ResultPhase = "Completed_With_Probe_Failure"
// ResultPhaseStopped is phase of chaosresult which is in stopped state // ResultPhaseStopped is phase of chaosresult which is in stopped state
ResultPhaseStopped ResultPhase = "Stopped" ResultPhaseStopped ResultPhase = "Stopped"
// ResultPhaseError is phase of chaosresult, which indicates that the experiment is terminated due to an error // ResultPhaseError is phase of chaosresult, which indicates that the experiment is terminated due to an error

View File

@ -15,8 +15,8 @@ limitations under the License.
*/ */
// Package v1alpha1 contains API Schema definitions for the litmuschaos.io v1alpha1 API group // Package v1alpha1 contains API Schema definitions for the litmuschaos.io v1alpha1 API group
//+kubebuilder:object:generate=true // +kubebuilder:object:generate=true
//+groupName=litmuschaos.io // +groupName=litmuschaos.io
package v1alpha1 package v1alpha1
import ( import (

View File

@ -346,7 +346,11 @@ func (in *ChaosResultStatus) DeepCopy() *ChaosResultStatus {
func (in *CmdProbeInputs) DeepCopyInto(out *CmdProbeInputs) { func (in *CmdProbeInputs) DeepCopyInto(out *CmdProbeInputs) {
*out = *in *out = *in
out.Comparator = in.Comparator out.Comparator = in.Comparator
in.Source.DeepCopyInto(&out.Source) if in.Source != nil {
in, out := &in.Source, &out.Source
*out = new(SourceDetails)
(*in).DeepCopyInto(*out)
}
} }
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CmdProbeInputs. // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CmdProbeInputs.
@ -434,6 +438,21 @@ func (in *ErrorOutput) DeepCopy() *ErrorOutput {
return out return out
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EvaluationWindow) DeepCopyInto(out *EvaluationWindow) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EvaluationWindow.
func (in *EvaluationWindow) DeepCopy() *EvaluationWindow {
if in == nil {
return nil
}
out := new(EvaluationWindow)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ExperimentAttributes) DeepCopyInto(out *ExperimentAttributes) { func (in *ExperimentAttributes) DeepCopyInto(out *ExperimentAttributes) {
*out = *in *out = *in
@ -640,8 +659,16 @@ func (in *GetMethod) DeepCopy() *GetMethod {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HTTPMethod) DeepCopyInto(out *HTTPMethod) { func (in *HTTPMethod) DeepCopyInto(out *HTTPMethod) {
*out = *in *out = *in
out.Get = in.Get if in.Get != nil {
out.Post = in.Post in, out := &in.Get, &out.Get
*out = new(GetMethod)
**out = **in
}
if in.Post != nil {
in, out := &in.Post, &out.Post
*out = new(PostMethod)
**out = **in
}
} }
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPMethod. // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPMethod.
@ -657,7 +684,7 @@ func (in *HTTPMethod) DeepCopy() *HTTPMethod {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HTTPProbeInputs) DeepCopyInto(out *HTTPProbeInputs) { func (in *HTTPProbeInputs) DeepCopyInto(out *HTTPProbeInputs) {
*out = *in *out = *in
out.Method = in.Method in.Method.DeepCopyInto(&out.Method)
} }
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPProbeInputs. // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPProbeInputs.
@ -705,6 +732,21 @@ func (in *HostFile) DeepCopy() *HostFile {
return out return out
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Identifier) DeepCopyInto(out *Identifier) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Identifier.
func (in *Identifier) DeepCopy() *Identifier {
if in == nil {
return nil
}
out := new(Identifier)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *K8sProbeInputs) DeepCopyInto(out *K8sProbeInputs) { func (in *K8sProbeInputs) DeepCopyInto(out *K8sProbeInputs) {
*out = *in *out = *in
@ -753,10 +795,31 @@ func (in *PostMethod) DeepCopy() *PostMethod {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ProbeAttributes) DeepCopyInto(out *ProbeAttributes) { func (in *ProbeAttributes) DeepCopyInto(out *ProbeAttributes) {
*out = *in *out = *in
out.K8sProbeInputs = in.K8sProbeInputs if in.K8sProbeInputs != nil {
out.HTTPProbeInputs = in.HTTPProbeInputs in, out := &in.K8sProbeInputs, &out.K8sProbeInputs
in.CmdProbeInputs.DeepCopyInto(&out.CmdProbeInputs) *out = new(K8sProbeInputs)
out.PromProbeInputs = in.PromProbeInputs **out = **in
}
if in.HTTPProbeInputs != nil {
in, out := &in.HTTPProbeInputs, &out.HTTPProbeInputs
*out = new(HTTPProbeInputs)
(*in).DeepCopyInto(*out)
}
if in.CmdProbeInputs != nil {
in, out := &in.CmdProbeInputs, &out.CmdProbeInputs
*out = new(CmdProbeInputs)
(*in).DeepCopyInto(*out)
}
if in.PromProbeInputs != nil {
in, out := &in.PromProbeInputs, &out.PromProbeInputs
*out = new(PromProbeInputs)
**out = **in
}
if in.SLOProbeInputs != nil {
in, out := &in.SLOProbeInputs, &out.SLOProbeInputs
*out = new(SLOProbeInputs)
(*in).DeepCopyInto(*out)
}
out.RunProperties = in.RunProperties out.RunProperties = in.RunProperties
} }
@ -903,6 +966,44 @@ func (in *RunnerInfo) DeepCopy() *RunnerInfo {
return out return out
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SLOProbeInputs) DeepCopyInto(out *SLOProbeInputs) {
*out = *in
if in.EvaluationWindow != nil {
in, out := &in.EvaluationWindow, &out.EvaluationWindow
*out = new(EvaluationWindow)
**out = **in
}
out.SLOSourceMetadata = in.SLOSourceMetadata
out.Comparator = in.Comparator
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SLOProbeInputs.
func (in *SLOProbeInputs) DeepCopy() *SLOProbeInputs {
if in == nil {
return nil
}
out := new(SLOProbeInputs)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SLOSourceMetadata) DeepCopyInto(out *SLOSourceMetadata) {
*out = *in
out.Scope = in.Scope
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SLOSourceMetadata.
func (in *SLOSourceMetadata) DeepCopy() *SLOSourceMetadata {
if in == nil {
return nil
}
out := new(SLOSourceMetadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Secret) DeepCopyInto(out *Secret) { func (in *Secret) DeepCopyInto(out *Secret) {
*out = *in *out = *in
@ -1035,6 +1136,13 @@ func (in *SourceDetails) DeepCopyInto(out *SourceDetails) {
(*out)[key] = val (*out)[key] = val
} }
} }
if in.Tolerations != nil {
in, out := &in.Tolerations, &out.Tolerations
*out = make([]v1.Toleration, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.Volumes != nil { if in.Volumes != nil {
in, out := &in.Volumes, &out.Volumes in, out := &in.Volumes, &out.Volumes
*out = make([]v1.Volume, len(*in)) *out = make([]v1.Volume, len(*in))

View File

@ -17,13 +17,15 @@ RUN go env
RUN CGO_ENABLED=0 go build -buildvcs=false -o /output/chaos-operator -v ./main.go RUN CGO_ENABLED=0 go build -buildvcs=false -o /output/chaos-operator -v ./main.go
# Packaging stage # Packaging stage
# Image source: https://github.com/litmuschaos/test-tools/blob/master/custom/hardened-alpine/infra/Dockerfile FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5
# The base image is non-root (have litmus user) with default litmus directory.
FROM litmuschaos/infra-alpine
LABEL maintainer="LitmusChaos" LABEL maintainer="LitmusChaos"
ENV OPERATOR=/usr/local/bin/chaos-operator ENV OPERATOR=/usr/local/bin/chaos-operator
COPY --from=builder /output/chaos-operator ${OPERATOR} COPY --from=builder /output/chaos-operator ${OPERATOR}
RUN chown 65534:0 ${OPERATOR} && chmod 755 ${OPERATOR}
USER 65534
ENTRYPOINT ["/usr/local/bin/chaos-operator"] ENTRYPOINT ["/usr/local/bin/chaos-operator"]

View File

@ -19,6 +19,11 @@ package controllers
import ( import (
"context" "context"
"fmt" "fmt"
"os"
"reflect"
"strings"
"time"
"github.com/go-logr/logr" "github.com/go-logr/logr"
litmuschaosv1alpha1 "github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1" litmuschaosv1alpha1 "github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
"github.com/litmuschaos/chaos-operator/pkg/analytics" "github.com/litmuschaos/chaos-operator/pkg/analytics"
@ -37,14 +42,10 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
"os"
"reflect"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/reconcile"
"strings"
"time"
) )
const finalizer = "chaosengine.litmuschaos.io/finalizer" const finalizer = "chaosengine.litmuschaos.io/finalizer"
@ -111,7 +112,7 @@ func (r *ChaosEngineReconciler) Reconcile(ctx context.Context, request ctrl.Requ
// Handling of normal execution of ChaosEngine // Handling of normal execution of ChaosEngine
if engine.Instance.Spec.EngineState == litmuschaosv1alpha1.EngineStateActive && engine.Instance.Status.EngineStatus == litmuschaosv1alpha1.EngineStatusInitialized { if engine.Instance.Spec.EngineState == litmuschaosv1alpha1.EngineStateActive && engine.Instance.Status.EngineStatus == litmuschaosv1alpha1.EngineStatusInitialized {
return r.reconcileForCreationAndRunning(engine, reqLogger) return r.reconcileForCreationAndRunning(engine, *reqLogger)
} }
// Handling Graceful completion of ChaosEngine // Handling Graceful completion of ChaosEngine
@ -168,6 +169,11 @@ func getChaosRunnerLabels(cr *litmuschaosv1alpha1.ChaosEngine) map[string]string
// newGoRunnerPodForCR defines a new go-based Runner Pod // newGoRunnerPodForCR defines a new go-based Runner Pod
func (r *ChaosEngineReconciler) newGoRunnerPodForCR(engine *chaosTypes.EngineInfo) (*corev1.Pod, error) { func (r *ChaosEngineReconciler) newGoRunnerPodForCR(engine *chaosTypes.EngineInfo) (*corev1.Pod, error) {
var experiment litmuschaosv1alpha1.ChaosExperiment
if err := r.Client.Get(context.TODO(), types.NamespacedName{Name: engine.Instance.Spec.Experiments[0].Name, Namespace: engine.Instance.Namespace}, &experiment); err != nil {
return nil, err
}
engine.VolumeOpts.VolumeOperations(engine.Instance.Spec.Components.Runner.ConfigMaps, engine.Instance.Spec.Components.Runner.Secrets) engine.VolumeOpts.VolumeOperations(engine.Instance.Spec.Components.Runner.ConfigMaps, engine.Instance.Spec.Components.Runner.Secrets)
containerForRunner := container.NewBuilder(). containerForRunner := container.NewBuilder().
@ -196,6 +202,10 @@ func (r *ChaosEngineReconciler) newGoRunnerPodForCR(engine *chaosTypes.EngineInf
containerForRunner.WithResourceRequirements(engine.Instance.Spec.Components.Runner.Resources) containerForRunner.WithResourceRequirements(engine.Instance.Spec.Components.Runner.Resources)
} }
if !reflect.DeepEqual(experiment.Spec.Definition.SecurityContext.ContainerSecurityContext, corev1.SecurityContext{}) {
containerForRunner.WithSecurityContext(experiment.Spec.Definition.SecurityContext.ContainerSecurityContext)
}
podForRunner := pod.NewBuilder(). podForRunner := pod.NewBuilder().
WithName(engine.Instance.Name + "-runner"). WithName(engine.Instance.Name + "-runner").
WithNamespace(engine.Instance.Namespace). WithNamespace(engine.Instance.Namespace).
@ -221,6 +231,10 @@ func (r *ChaosEngineReconciler) newGoRunnerPodForCR(engine *chaosTypes.EngineInf
podForRunner.WithImagePullSecrets(engine.Instance.Spec.Components.Runner.ImagePullSecrets) podForRunner.WithImagePullSecrets(engine.Instance.Spec.Components.Runner.ImagePullSecrets)
} }
if !reflect.DeepEqual(experiment.Spec.Definition.SecurityContext.PodSecurityContext, corev1.PodSecurityContext{}) {
podForRunner.WithSecurityContext(experiment.Spec.Definition.SecurityContext.PodSecurityContext)
}
runnerPod, err := podForRunner.Build() runnerPod, err := podForRunner.Build()
if err != nil { if err != nil {
return nil, err return nil, err
@ -666,11 +680,11 @@ func updateExperimentStatusesForStop(engine *chaosTypes.EngineInfo) {
} }
} }
func startReqLogger(request reconcile.Request) logr.Logger { func startReqLogger(request reconcile.Request) *logr.Logger {
reqLogger := chaosTypes.Log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) reqLogger := chaosTypes.Log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name)
reqLogger.Info("Reconciling ChaosEngine") reqLogger.Info("Reconciling ChaosEngine")
return reqLogger return &reqLogger
} }
func (r *ChaosEngineReconciler) updateEngineForComplete(engine *chaosTypes.EngineInfo, isCompleted bool) (bool, error) { func (r *ChaosEngineReconciler) updateEngineForComplete(engine *chaosTypes.EngineInfo, isCompleted bool) (bool, error) {
@ -813,7 +827,7 @@ func isResultCRDAvailable() (bool, error) {
Resource: "customresourcedefinitions", Resource: "customresourcedefinitions",
} }
resultList, err := (*dynamicClient).Resource(gvr).List(context.Background(), v1.ListOptions{}) resultList, err := dynamicClient.Resource(gvr).List(context.Background(), v1.ListOptions{})
if err != nil { if err != nil {
return false, err return false, err
} }

View File

@ -329,6 +329,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
}, },
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
}, },
}, },
@ -355,6 +360,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
}, },
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
}, },
}, },
@ -382,6 +392,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
}, },
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
}, },
}, },
@ -409,6 +424,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
}, },
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
}, },
}, },
@ -421,6 +441,13 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
engine: chaosTypes.EngineInfo{ engine: chaosTypes.EngineInfo{
Instance: &v1alpha1.ChaosEngine{ Instance: &v1alpha1.ChaosEngine{
ObjectMeta: metav1.ObjectMeta{}, ObjectMeta: metav1.ObjectMeta{},
Spec: v1alpha1.ChaosEngineSpec{
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
}, },
AppExperiments: []string{"exp-1"}, AppExperiments: []string{"exp-1"},
}, },
@ -435,6 +462,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
}, },
Spec: v1alpha1.ChaosEngineSpec{ Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount", ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
}, },
}, },
@ -451,6 +483,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
}, },
Spec: v1alpha1.ChaosEngineSpec{ Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount", ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
}, },
}, },
@ -472,6 +509,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
Image: "", Image: "",
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
}, },
}, },
@ -483,6 +525,15 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
for name, mock := range tests { for name, mock := range tests {
t.Run(name, func(t *testing.T) { t.Run(name, func(t *testing.T) {
r := CreateFakeClient(t) r := CreateFakeClient(t)
exp := v1alpha1.ChaosExperiment{
ObjectMeta: metav1.ObjectMeta{
Name: "pod-delete",
Namespace: "test",
},
}
if err := r.Client.Create(context.TODO(), &exp); err != nil {
t.Fatalf("Test %q failed: expected error not to be nil", name)
}
_, err := r.newGoRunnerPodForCR(&mock.engine) _, err := r.newGoRunnerPodForCR(&mock.engine)
if mock.isErr && err == nil { if mock.isErr && err == nil {
t.Fatalf("Test %q failed: expected error not to be nil", name) t.Fatalf("Test %q failed: expected error not to be nil", name)
@ -959,6 +1010,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image", Image: "fake-runner-image",
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
}, },
}, },
@ -980,6 +1036,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image", Image: "fake-runner-image",
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
}, },
}, },
@ -1002,6 +1063,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image", Image: "fake-runner-image",
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
}, },
}, },
@ -1024,6 +1090,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image", Image: "fake-runner-image",
}, },
}, },
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
}, },
}, },
@ -1036,6 +1107,13 @@ func TestCheckEngineRunnerPod(t *testing.T) {
engine: chaosTypes.EngineInfo{ engine: chaosTypes.EngineInfo{
Instance: &v1alpha1.ChaosEngine{ Instance: &v1alpha1.ChaosEngine{
ObjectMeta: metav1.ObjectMeta{}, ObjectMeta: metav1.ObjectMeta{},
Spec: v1alpha1.ChaosEngineSpec{
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
}, },
AppExperiments: []string{"exp-1"}, AppExperiments: []string{"exp-1"},
@ -1051,6 +1129,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
}, },
Spec: v1alpha1.ChaosEngineSpec{ Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount", ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
}, },
}, },
@ -1099,6 +1182,15 @@ func TestCheckEngineRunnerPod(t *testing.T) {
for name, mock := range tests { for name, mock := range tests {
t.Run(name, func(t *testing.T) { t.Run(name, func(t *testing.T) {
r := CreateFakeClient(t) r := CreateFakeClient(t)
exp := v1alpha1.ChaosExperiment{
ObjectMeta: metav1.ObjectMeta{
Name: "exp-1",
Namespace: "test",
},
}
if err := r.Client.Create(context.TODO(), &exp); err != nil {
t.Fatalf("Test %q failed: expected error not to be nil", name)
}
reqLogger := chaosTypes.Log.WithValues() reqLogger := chaosTypes.Log.WithValues()
err := r.checkEngineRunnerPod(&mock.engine, reqLogger) err := r.checkEngineRunnerPod(&mock.engine, reqLogger)
if mock.isErr && err == nil { if mock.isErr && err == nil {
@ -1506,6 +1598,15 @@ func TestReconcileForCreationAndRunning(t *testing.T) {
for name, mock := range tests { for name, mock := range tests {
t.Run(name, func(t *testing.T) { t.Run(name, func(t *testing.T) {
r := CreateFakeClient(t) r := CreateFakeClient(t)
exp := v1alpha1.ChaosExperiment{
ObjectMeta: metav1.ObjectMeta{
Name: "exp-1",
Namespace: "test",
},
}
if err := r.Client.Create(context.TODO(), &exp); err != nil {
t.Fatalf("Test %q failed: expected error not to be nil", name)
}
reqLogger := chaosTypes.Log.WithValues() reqLogger := chaosTypes.Log.WithValues()
_, err := r.reconcileForCreationAndRunning(&mock.engine, reqLogger) _, err := r.reconcileForCreationAndRunning(&mock.engine, reqLogger)
if mock.isErr && err == nil { if mock.isErr && err == nil {
@ -1520,7 +1621,7 @@ func TestReconcileForCreationAndRunning(t *testing.T) {
func CreateFakeClient(t *testing.T) *ChaosEngineReconciler { func CreateFakeClient(t *testing.T) *ChaosEngineReconciler {
fakeClient := litmusFakeClientset.NewFakeClient() fakeClient := litmusFakeClientset.NewClientBuilder().WithRuntimeObjects().Build()
if fakeClient == nil { if fakeClient == nil {
fmt.Println("litmusClient is not created") fmt.Println("litmusClient is not created")
} }
@ -1534,11 +1635,18 @@ func CreateFakeClient(t *testing.T) *ChaosEngineReconciler {
}, },
} }
exp := &v1alpha1.ChaosExperiment{
ObjectMeta: metav1.ObjectMeta{
Labels: make(map[string]string),
Name: "dummyexp",
},
}
chaosResultList := &v1alpha1.ChaosResultList{ chaosResultList := &v1alpha1.ChaosResultList{
Items: []v1alpha1.ChaosResult{}, Items: []v1alpha1.ChaosResult{},
} }
s.AddKnownTypes(v1alpha1.SchemeGroupVersion, engineR, chaosResultList) s.AddKnownTypes(v1alpha1.SchemeGroupVersion, engineR, chaosResultList, exp)
recorder := record.NewFakeRecorder(1024) recorder := record.NewFakeRecorder(1024)

File diff suppressed because it is too large Load Diff

View File

@ -40,8 +40,7 @@ spec:
# - pattern: '^delete$' # - pattern: '^delete$'
# - pattern: '^retain$' # - pattern: '^retain$'
defaultHealthCheck: defaultHealthCheck:
type: string type: boolean
pattern: ^(true|false)$
appinfo: appinfo:
type: object type: object
properties: properties:
@ -336,6 +335,9 @@ spec:
items: items:
type: object type: object
required: required:
- name
- type
- mode
- runProperties - runProperties
properties: properties:
name: name:
@ -343,9 +345,13 @@ spec:
type: type:
type: string type: string
minLength: 1 minLength: 1
pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe)$ pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe|sloProbe)$
k8sProbe/inputs: k8sProbe/inputs:
type: object type: object
required:
- version
- resource
- operation
properties: properties:
group: group:
type: string type: string
@ -367,12 +373,19 @@ spec:
minLength: 1 minLength: 1
cmdProbe/inputs: cmdProbe/inputs:
type: object type: object
required:
- command
- comparator
properties: properties:
command: command:
type: string type: string
minLength: 1 minLength: 1
comparator: comparator:
type: object type: object
required:
- type
- criteria
- value
properties: properties:
type: type:
type: string type: string
@ -385,6 +398,8 @@ spec:
source: source:
description: The external pod where we have to run the description: The external pod where we have to run the
probe commands. It will run the commands inside the experiment pod itself(inline mode) if source contains a nil value probe commands. It will run the commands inside the experiment pod itself(inline mode) if source contains a nil value
required:
- image
properties: properties:
annotations: annotations:
additionalProperties: additionalProperties:
@ -560,6 +575,29 @@ spec:
type: string type: string
description: NodeSelector for the source pod description: NodeSelector for the source pod
type: object type: object
tolerations:
description: Tolerations for the source pod
items:
description: The pod with this Toleration tolerates any taint matches the <key,value,effect> using the matching operator <operator>.
properties:
effect:
description: Effect to match. Empty means all effects.
type: string
key:
description: Taint key the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists.
type: string
operator:
description: Operators are Exists or Equal. Defaults to Equal.
type: string
tolerationSeconds:
description: Period of time the toleration tolerates the taint.
format: int64
type: integer
value:
description: If the operator is Exists, the value should be empty, otherwise just a regular string.
type: string
type: object
type: array
privileged: privileged:
description: Privileged for the source pod description: Privileged for the source pod
type: boolean type: boolean
@ -2168,6 +2206,9 @@ spec:
type: object type: object
httpProbe/inputs: httpProbe/inputs:
type: object type: object
required:
- url
- method
properties: properties:
url: url:
type: string type: string
@ -2180,6 +2221,9 @@ spec:
properties: properties:
get: get:
type: object type: object
required:
- criteria
- responseCode
properties: properties:
criteria: criteria:
type: string type: string
@ -2189,6 +2233,9 @@ spec:
minLength: 1 minLength: 1
post: post:
type: object type: object
required:
- criteria
- responseCode
properties: properties:
contentType: contentType:
type: string type: string
@ -2205,6 +2252,9 @@ spec:
minLength: 1 minLength: 1
promProbe/inputs: promProbe/inputs:
type: object type: object
required:
- endpoint
- comparator
properties: properties:
endpoint: endpoint:
type: string type: string
@ -2214,6 +2264,9 @@ spec:
type: string type: string
comparator: comparator:
type: object type: object
required:
- criteria
- value
properties: properties:
criteria: criteria:
type: string type: string
@ -2226,20 +2279,112 @@ spec:
- probeTimeout - probeTimeout
- interval - interval
properties: properties:
evaluationTimeout:
type: string
probeTimeout: probeTimeout:
type: integer type: string
interval: interval:
type: integer type: string
retry: retry:
type: integer type: integer
attempt: attempt:
type: integer type: integer
probePollingInterval: probePollingInterval:
type: integer type: string
initialDelaySeconds: initialDelaySeconds:
type: integer type: integer
initialDelay:
type: string
verbosity:
type: string
stopOnFailure: stopOnFailure:
type: boolean type: boolean
sloProbe/inputs:
description: inputs needed for the SLO probe
required:
- platformEndpoint
- sloIdentifier
- sloSourceMetadata
- comparator
properties:
comparator:
description: Comparator check for the correctness
of the probe output
required:
- criteria
- value
properties:
criteria:
description: Criteria for matching data it
supports >=, <=, ==, >, <, != for int and
float it supports equal, notEqual, contains
for string
type: string
type:
description: Type of data it can be int, float,
string
type: string
value:
description: Value contains relative value
for criteria
type: string
type: object
evaluationWindow:
description: EvaluationWindow is the time period
for which the metrics will be evaluated
properties:
evaluationEndTime:
description: End time of evaluation
type: integer
evaluationStartTime:
description: Start time of evaluation
type: integer
type: object
platformEndpoint:
description: PlatformEndpoint for the monitoring
service endpoint
type: string
insecureSkipVerify:
description: InsecureSkipVerify flag to skip certificate
checks
type: boolean
sloIdentifier:
description: SLOIdentifier for fetching the details
of the SLO
type: string
sloSourceMetadata:
description: SLOSourceMetadata consists of required
metadata details to fetch metric data
required:
- apiTokenSecret
- scope
properties:
apiTokenSecret:
description: APITokenSecret for authenticating
with the platform service
type: string
scope:
description: Scope required for fetching details
required:
- accountIdentifier
- orgIdentifier
- projectIdentifier
properties:
accountIdentifier:
description: AccountIdentifier for account
ID
type: string
orgIdentifier:
description: OrgIdentifier for organization
ID
type: string
projectIdentifier:
description: ProjectIdentifier for project
ID
type: string
type: object
type: object
type: object
mode: mode:
type: string type: string
pattern: ^(SOT|EOT|Edge|Continuous|OnChaos)$ pattern: ^(SOT|EOT|Edge|Continuous|OnChaos)$

View File

@ -40,7 +40,7 @@ spec:
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
env: env:
- name: CHAOS_RUNNER_IMAGE - name: CHAOS_RUNNER_IMAGE
value: "litmuschaos/chaos-runner:ci" value: "litmuschaos.docker.scarf.sh/litmuschaos/chaos-runner:ci"
- name: WATCH_NAMESPACE - name: WATCH_NAMESPACE
value: "" value: ""
- name: POD_NAME - name: POD_NAME

139
go.mod
View File

@ -1,113 +1,108 @@
module github.com/litmuschaos/chaos-operator module github.com/litmuschaos/chaos-operator
go 1.18 go 1.22
require ( require (
cloud.google.com/go v0.81.0 // indirect github.com/go-logr/logr v1.4.2
github.com/go-logr/logr v0.4.0 github.com/google/go-cmp v0.5.9 // indirect
github.com/google/go-cmp v0.5.6 // indirect
github.com/jpillora/go-ogle-analytics v0.0.0-20161213085824-14b04e0594ef github.com/jpillora/go-ogle-analytics v0.0.0-20161213085824-14b04e0594ef
github.com/litmuschaos/elves v0.0.0-20201107015738-552d74669e3c github.com/litmuschaos/elves v0.0.0-20230607095010-c7119636b529
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b // indirect golang.org/x/oauth2 v0.7.0 // indirect
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c // indirect k8s.io/api v0.26.15
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect k8s.io/apimachinery v0.26.15
k8s.io/api v0.22.1
k8s.io/apimachinery v0.22.1
k8s.io/client-go v12.0.0+incompatible k8s.io/client-go v12.0.0+incompatible
sigs.k8s.io/controller-runtime v0.10.0 sigs.k8s.io/controller-runtime v0.14.6
) )
require ( require (
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24
github.com/google/martian v2.1.0+incompatible github.com/google/martian v2.1.0+incompatible
github.com/onsi/ginkgo v1.16.4 github.com/onsi/ginkgo v1.16.5
github.com/onsi/gomega v1.15.0 github.com/onsi/gomega v1.24.2
github.com/operator-framework/operator-sdk v0.19.0 github.com/stretchr/testify v1.8.2
github.com/stretchr/testify v1.7.0
k8s.io/klog v1.0.0 k8s.io/klog v1.0.0
) )
require ( require (
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
github.com/Azure/go-autorest/autorest v0.11.18 // indirect
github.com/Azure/go-autorest/autorest/adal v0.9.13 // indirect
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
github.com/Azure/go-autorest/logger v0.2.1 // indirect
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/evanphx/json-patch v4.11.0+incompatible // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect
github.com/go-logr/zapr v0.4.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-logr/zapr v1.2.3 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/gofuzz v1.1.0 // indirect github.com/google/gofuzz v1.1.0 // indirect
github.com/google/uuid v1.1.2 // indirect github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/gnostic v0.5.5 // indirect
github.com/hashicorp/golang-lru v0.5.3 // indirect
github.com/imdario/mergo v0.3.12 // indirect github.com/imdario/mergo v0.3.12 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect github.com/json-iterator/go v1.1.12 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mailru/easyjson v0.7.6 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nxadm/tail v1.4.8 // indirect github.com/nxadm/tail v1.4.8 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/common v0.37.0 // indirect
github.com/prometheus/procfs v0.7.3 // indirect github.com/prometheus/procfs v0.8.0 // indirect
go.uber.org/atomic v1.7.0 // indirect go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.19.0 // indirect go.uber.org/zap v1.24.0 // indirect
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/net v0.19.0 // indirect
golang.org/x/net v0.0.0-20220906165146-f3363e06e74c // indirect golang.org/x/sys v0.15.0 // indirect
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect golang.org/x/term v0.15.0 // indirect
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.14.0 // indirect
golang.org/x/text v0.3.8 // indirect golang.org/x/time v0.3.0 // indirect
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
google.golang.org/appengine v1.6.7 // indirect google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.26.0 // indirect google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apiextensions-apiserver v0.22.1 // indirect k8s.io/apiextensions-apiserver v0.26.1 // indirect
k8s.io/component-base v0.22.2 // indirect k8s.io/component-base v0.26.15 // indirect
k8s.io/klog/v2 v2.9.0 // indirect k8s.io/klog/v2 v2.80.1 // indirect
k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a // indirect k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
) )
// Pinned to kubernetes-1.21.2 // Pinned to kubernetes-1.26
replace ( replace (
k8s.io/api => k8s.io/api v0.21.2 sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.14.6
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.21.2 github.com/go-logr/logr => github.com/go-logr/logr v1.4.2
k8s.io/apimachinery => k8s.io/apimachinery v0.21.2 k8s.io/api => k8s.io/api v0.26.15
k8s.io/apiserver => k8s.io/apiserver v0.21.2 k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.26.15
k8s.io/cli-runtime => k8s.io/cli-runtime v0.21.2 k8s.io/apimachinery => k8s.io/apimachinery v0.26.15
k8s.io/client-go => k8s.io/client-go v0.21.2 k8s.io/client-go => k8s.io/client-go v0.26.15
k8s.io/cloud-provider => k8s.io/cloud-provider v0.21.2 k8s.io/cloud-provider => k8s.io/cloud-provider v0.26.15
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.21.2 k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.26.15
k8s.io/code-generator => k8s.io/code-generator v0.21.2 k8s.io/component-base => k8s.io/component-base v0.26.15
k8s.io/component-base => k8s.io/component-base v0.21.2 k8s.io/cri-api => k8s.io/cri-api v0.26.15
k8s.io/cri-api => k8s.io/cri-api v0.21.2 k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.26.15
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.21.2 k8s.io/klog/v2 => k8s.io/klog/v2 v2.80.1
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.21.2 k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.26.15
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.21.2 k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.26.15
k8s.io/kube-proxy => k8s.io/kube-proxy v0.21.2 k8s.io/kube-proxy => k8s.io/kube-proxy v0.26.15
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.21.2 k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.26.15
k8s.io/kubectl => k8s.io/kubectl v0.21.2 k8s.io/kubelet => k8s.io/kubelet v0.26.15
k8s.io/kubelet => k8s.io/kubelet v0.21.2 k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.26.15
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.21.2 k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.26.15
k8s.io/metrics => k8s.io/metrics v0.21.2
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.21.2
) )
replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm

1144
go.sum

File diff suppressed because it is too large Load Diff

11
main.go
View File

@ -19,12 +19,13 @@ package main
import ( import (
"flag" "flag"
"fmt" "fmt"
"github.com/litmuschaos/chaos-operator/pkg/analytics"
"github.com/operator-framework/operator-sdk/pkg/k8sutil"
"os" "os"
"runtime" "runtime"
"strings" "strings"
"github.com/litmuschaos/chaos-operator/pkg/analytics"
"github.com/pkg/errors"
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them. // to ensure that exec-entrypoint and run can make use of them.
_ "k8s.io/client-go/plugin/pkg/client/auth" _ "k8s.io/client-go/plugin/pkg/client/auth"
@ -71,9 +72,9 @@ func main() {
printVersion() printVersion()
namespace, err := k8sutil.GetWatchNamespace() namespace, found := os.LookupEnv("WATCH_NAMESPACE")
if err != nil { if !found {
setupLog.Error(err, "failed to get watch namespace") setupLog.Error(errors.New("WATCH_NAMESPACE env is not set"), "failed to get watch namespace")
os.Exit(1) os.Exit(1)
} }

View File

@ -37,14 +37,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{
// AddToScheme adds all types of this clientset into the given scheme. This allows composition // AddToScheme adds all types of this clientset into the given scheme. This allows composition
// of clientsets, like in: // of clientsets, like in:
// //
// import ( // import (
// "k8s.io/client-go/kubernetes" // "k8s.io/client-go/kubernetes"
// clientsetscheme "k8s.io/client-go/kubernetes/scheme" // clientsetscheme "k8s.io/client-go/kubernetes/scheme"
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" // aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
// ) // )
// //
// kclientset, _ := kubernetes.NewForConfig(c) // kclientset, _ := kubernetes.NewForConfig(c)
// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
// //
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
// correctly. // correctly.

View File

@ -37,14 +37,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{
// AddToScheme adds all types of this clientset into the given scheme. This allows composition // AddToScheme adds all types of this clientset into the given scheme. This allows composition
// of clientsets, like in: // of clientsets, like in:
// //
// import ( // import (
// "k8s.io/client-go/kubernetes" // "k8s.io/client-go/kubernetes"
// clientsetscheme "k8s.io/client-go/kubernetes/scheme" // clientsetscheme "k8s.io/client-go/kubernetes/scheme"
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" // aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
// ) // )
// //
// kclientset, _ := kubernetes.NewForConfig(c) // kclientset, _ := kubernetes.NewForConfig(c)
// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
// //
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
// correctly. // correctly.

View File

@ -36,9 +36,9 @@ type FakeChaosEngines struct {
ns string ns string
} }
var chaosenginesResource = schema.GroupVersionResource{Group: "litmuschaos", Version: "v1alpha1", Resource: "chaosengines"} var chaosenginesResource = schema.GroupVersionResource{Group: "litmuschaos.io", Version: "v1alpha1", Resource: "chaosengines"}
var chaosenginesKind = schema.GroupVersionKind{Group: "litmuschaos", Version: "v1alpha1", Kind: "ChaosEngine"} var chaosenginesKind = schema.GroupVersionKind{Group: "litmuschaos.io", Version: "v1alpha1", Kind: "ChaosEngine"}
// Get takes name of the chaosEngine, and returns the corresponding chaosEngine object, and an error if there is any. // Get takes name of the chaosEngine, and returns the corresponding chaosEngine object, and an error if there is any.
func (c *FakeChaosEngines) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ChaosEngine, err error) { func (c *FakeChaosEngines) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ChaosEngine, err error) {

View File

@ -36,9 +36,9 @@ type FakeChaosExperiments struct {
ns string ns string
} }
var chaosexperimentsResource = schema.GroupVersionResource{Group: "litmuschaos", Version: "v1alpha1", Resource: "chaosexperiments"} var chaosexperimentsResource = schema.GroupVersionResource{Group: "litmuschaos.io", Version: "v1alpha1", Resource: "chaosexperiments"}
var chaosexperimentsKind = schema.GroupVersionKind{Group: "litmuschaos", Version: "v1alpha1", Kind: "ChaosExperiment"} var chaosexperimentsKind = schema.GroupVersionKind{Group: "litmuschaos.io", Version: "v1alpha1", Kind: "ChaosExperiment"}
// Get takes name of the chaosExperiment, and returns the corresponding chaosExperiment object, and an error if there is any. // Get takes name of the chaosExperiment, and returns the corresponding chaosExperiment object, and an error if there is any.
func (c *FakeChaosExperiments) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ChaosExperiment, err error) { func (c *FakeChaosExperiments) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ChaosExperiment, err error) {

View File

@ -36,9 +36,9 @@ type FakeChaosResults struct {
ns string ns string
} }
var chaosresultsResource = schema.GroupVersionResource{Group: "litmuschaos", Version: "v1alpha1", Resource: "chaosresults"} var chaosresultsResource = schema.GroupVersionResource{Group: "litmuschaos.io", Version: "v1alpha1", Resource: "chaosresults"}
var chaosresultsKind = schema.GroupVersionKind{Group: "litmuschaos", Version: "v1alpha1", Kind: "ChaosResult"} var chaosresultsKind = schema.GroupVersionKind{Group: "litmuschaos.io", Version: "v1alpha1", Kind: "ChaosResult"}
// Get takes name of the chaosResult, and returns the corresponding chaosResult object, and an error if there is any. // Get takes name of the chaosResult, and returns the corresponding chaosResult object, and an error if there is any.
func (c *FakeChaosResults) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ChaosResult, err error) { func (c *FakeChaosResults) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ChaosResult, err error) {

View File

@ -6,7 +6,7 @@ import (
) )
// CreateClientSet returns a Dynamic Kubernetes ClientSet // CreateClientSet returns a Dynamic Kubernetes ClientSet
func CreateClientSet() (*dynamic.Interface, error) { func CreateClientSet() (dynamic.Interface, error) {
restConfig, err := config.GetConfig() restConfig, err := config.GetConfig()
if err != nil { if err != nil {
return nil, err return nil, err
@ -15,5 +15,5 @@ func CreateClientSet() (*dynamic.Interface, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &clientSet, nil return clientSet, nil
} }

View File

@ -49,7 +49,7 @@ var (
ResultCRDName = "chaosresults.litmuschaos.io" ResultCRDName = "chaosresults.litmuschaos.io"
) )
//EngineInfo Related information // EngineInfo Related information
type EngineInfo struct { type EngineInfo struct {
Instance *litmuschaosv1alpha1.ChaosEngine Instance *litmuschaosv1alpha1.ChaosEngine
AppInfo litmuschaosv1alpha1.ApplicationParams AppInfo litmuschaosv1alpha1.ApplicationParams

View File

@ -36,7 +36,7 @@ import (
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
) )
//VolumeOpts is a strcuture for all volume related operations // VolumeOpts is a strcuture for all volume related operations
type VolumeOpts struct { type VolumeOpts struct {
VolumeMounts []corev1.VolumeMount VolumeMounts []corev1.VolumeMount
VolumeBuilders []*volume.Builder VolumeBuilders []*volume.Builder

View File

@ -22,6 +22,9 @@ import (
// RemoveString removes a particular string from a slice of strings // RemoveString removes a particular string from a slice of strings
func RemoveString(slice []string, s string) (result []string) { func RemoveString(slice []string, s string) (result []string) {
if len(slice) == 0 {
return
}
for _, item := range slice { for _, item := range slice {
if item == s { if item == s {
continue continue
@ -33,7 +36,7 @@ func RemoveString(slice []string, s string) (result []string) {
// SetEnv sets the env inside envDetails struct // SetEnv sets the env inside envDetails struct
func (envDetails *ENVDetails) SetEnv(key, value string) *ENVDetails { func (envDetails *ENVDetails) SetEnv(key, value string) *ENVDetails {
if value != "" { if key != "" && value != "" {
envDetails.ENV = append(envDetails.ENV, corev1.EnvVar{ envDetails.ENV = append(envDetails.ENV, corev1.EnvVar{
Name: key, Name: key,
Value: value, Value: value,

View File

@ -0,0 +1,117 @@
/*
Copyright 2024 LitmusChaos Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package utils
import (
"math/rand"
"testing"
"unicode"
fuzzheaders "github.com/AdaLogics/go-fuzz-headers"
"github.com/stretchr/testify/assert"
v1 "k8s.io/api/core/v1"
)
func FuzzSetEnv(f *testing.F) {
kv := map[string]string{
"KEY1": "VALUE1",
"KEY2": "VALUE2",
}
for k, v := range kv {
f.Add(k, v)
}
f.Fuzz(func(t *testing.T, key, value string) {
ed := ENVDetails{
ENV: make([]v1.EnvVar, 0),
}
edUpdated := ed.SetEnv(key, value)
if edUpdated == nil {
t.Error("nil object not expected")
}
if key == "" && edUpdated != nil {
assert.Equal(t, 0, len(edUpdated.ENV))
}
if value == "" && edUpdated != nil {
assert.Equal(t, 0, len(edUpdated.ENV))
}
if key != "" && value != "" && edUpdated != nil {
assert.Equal(t, 1, len(edUpdated.ENV))
}
if key != "" && value != "" && edUpdated != nil && len(edUpdated.ENV) == 1 {
env := edUpdated.ENV[0]
assert.Equal(t, key, env.Name)
assert.Equal(t, value, env.Value)
}
})
}
func FuzzRemoveString(f *testing.F) {
f.Fuzz(func(t *testing.T, extra string, data []byte) {
consumer := fuzzheaders.NewConsumer(data)
testInput := &struct {
Data map[string]int
}{}
err := consumer.GenerateStruct(testInput)
if err != nil {
return
}
max := len(testInput.Data) - 1
if max < 0 {
max = 0
}
randomNumber := func(min, max int) int {
if max == 0 {
return 0
}
return rand.Intn(max-min) + min
}(0, max)
index := 0
full := make([]string, 0)
exclude := ""
result := make([]string, 0)
for k := range testInput.Data {
if k == "" {
continue
}
if !func() bool {
for _, r := range k {
if !unicode.IsLetter(r) {
return false
}
}
return true
}() {
continue
}
full = append(full, k)
if index == randomNumber {
exclude = k
}
if index != randomNumber {
result = append(result, k)
}
}
if exclude != "" {
return
}
got := RemoveString(full, exclude)
if got == nil {
got = make([]string, 0)
}
assert.Equal(t, result, got)
})
}

View File

@ -6,11 +6,6 @@ import (
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
) )
var (
// hostpathTypeFile represents the hostpath type
hostpathTypeFile = corev1.HostPathFile
)
// CreateVolumeBuilders build Volume needed in execution of experiments // CreateVolumeBuilders build Volume needed in execution of experiments
func CreateVolumeBuilders(configMaps []v1alpha1.ConfigMap, secrets []v1alpha1.Secret) []*volume.Builder { func CreateVolumeBuilders(configMaps []v1alpha1.ConfigMap, secrets []v1alpha1.Secret) []*volume.Builder {
volumeBuilderList := []*volume.Builder{} volumeBuilderList := []*volume.Builder{}

View File

@ -119,7 +119,7 @@ var _ = BeforeSuite(func() {
klog.Infoln("Chaos-Operator is in running state") klog.Infoln("Chaos-Operator is in running state")
}) })
//BDD Tests to check secondary resources // BDD Tests to check secondary resources
var _ = Describe("BDD on chaos-operator", func() { var _ = Describe("BDD on chaos-operator", func() {
// BDD TEST CASE 1 // BDD TEST CASE 1
@ -437,25 +437,6 @@ var _ = Describe("BDD on chaos-operator", func() {
}) })
Expect(err).To(BeNil()) Expect(err).To(BeNil())
}) })
It("Should change EngineStatus ", func() {
err := retry.
Times(uint(180 / 2)).
Wait(time.Duration(2) * time.Second).
Try(func(attempt uint) error {
//Fetching engineStatus
engine, err := clientSet.ChaosEngines("litmus").Get(context.Background(), "engine-nginx-1", metav1.GetOptions{})
if err != nil {
return err
}
if engine.Status.EngineStatus != v1alpha1.EngineStatusCompleted {
return fmt.Errorf("engine is not in completed state")
}
return nil
})
Expect(err).To(BeNil())
})
}) })
Context("Validate via Chaos-Operator Logs", func() { Context("Validate via Chaos-Operator Logs", func() {
@ -505,7 +486,7 @@ var _ = Describe("BDD on chaos-operator", func() {
}) })
//Deleting all unused resources // Deleting all unused resources
var _ = AfterSuite(func() { var _ = AfterSuite(func() {
//Deleting Pod Delete sa //Deleting Pod Delete sa