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.
# 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
- uses: actions/setup-go@v2
with:
go-version: 1.18
go-version: 1.22
# Checkout to the latest commit
# On specific directory/path
@ -22,27 +22,13 @@ jobs:
run: make gofmt-check
- 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
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:
needs: pre-checks
runs-on: ubuntu-latest
@ -65,6 +51,18 @@ jobs:
vuln-type: 'os,library'
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:
runs-on: ubuntu-latest
needs: pre-checks
@ -85,7 +83,7 @@ jobs:
chmod +x ${{ github.workspace }}/image.tar
- name: Upload artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: myimage
path: |
@ -98,7 +96,7 @@ jobs:
# Install golang
- uses: actions/setup-go@v2
with:
go-version: 1.18
go-version: 1.22
# Checkout to the latest commit
# On specific directory/path
@ -121,7 +119,7 @@ jobs:
make deps
- name: Download artifact
uses: actions/download-artifact@v2
uses: actions/download-artifact@v4
with:
name: myimage
path: ${{ github.workspace }}

View File

@ -19,7 +19,7 @@ jobs:
- uses: actions/setup-go@v2
with:
go-version: 1.18
go-version: 1.22
- name: Setting up GOPATH
run: |
@ -61,12 +61,14 @@ jobs:
- name: Installing Prerequisites (KinD Cluster)
uses: engineerd/setup-kind@v0.5.0
with:
version: "v0.7.0"
version: "v0.22.0"
- name: Configuring and testing kind Installation
run: |
kubectl cluster-info --context kind-kind
kind get kubeconfig --internal >$HOME/.kube/config
kubectl cluster-info
kubectl get pods -n kube-system
echo "current-context:" $(kubectl config current-context)
echo "environment-kubeconfig:" ${KUBECONFIG}
kubectl get nodes
- name: Load image on the nodes of the cluster
@ -76,7 +78,7 @@ jobs:
- name: Getting litmus-e2e repository
run: |
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
run: |
@ -93,7 +95,7 @@ jobs:
run: |
export PATH=$PATH:$(go env GOPATH)/bin
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:
KUBECONFIG: /home/runner/.kube/config
@ -102,7 +104,7 @@ jobs:
run: |
export PATH=$PATH:$(go env GOPATH)/bin
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:
KUBECONFIG: /home/runner/.kube/config
@ -150,7 +152,7 @@ jobs:
with:
comment-id: "${{ github.event.comment.id }}"
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 }})
reactions: eyes
env:

View File

@ -13,7 +13,7 @@ jobs:
# Install golang
- uses: actions/setup-go@v2
with:
go-version: 1.18
go-version: 1.22
# Checkout to the latest commit
# On specific directory/path
@ -24,14 +24,13 @@ jobs:
run: make gofmt-check
- name: golangci-lint
uses: reviewdog/action-golangci-lint@v1
uses: reviewdog/action-golangci-lint@v2
- name: unused-package check
run: make unused-package-check
image-build:
runs-on: ubuntu-latest
needs: tests
steps:
# Checkout to the latest commit
# On specific directory/path
@ -60,44 +59,3 @@ jobs:
DNAME: ${{ secrets.DNAME }}
DPASS: ${{ secrets.DPASS }}
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
- uses: actions/setup-go@v2
with:
go-version: 1.18
go-version: 1.22
# Checkout to the latest commit
# On specific directory/path
- name: Checkout
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:
runs-on: ubuntu-latest
needs: tests
steps:
# Checkout to the latest commit
# On specific directory/path
@ -73,44 +63,3 @@ jobs:
DNAME: ${{ secrets.DNAME }}
DPASS: ${{ secrets.DPASS }}
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

@ -74,14 +74,14 @@ build-chaos-operator:
@echo "-------------------------"
@echo "--> Build go-runner image"
@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
push-chaos-operator:
@echo "------------------------------"
@echo "--> Pushing image"
@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
build-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)
[![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)
[![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)
[![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)

View File

@ -29,7 +29,7 @@ type ChaosEngineSpec struct {
Appinfo ApplicationParams `json:"appinfo,omitempty"`
//DefaultHealthCheck defines whether default health checks should be executed or not. It can be true or false
// default value is true
DefaultHealthCheck string `json:"defaultHealthCheck,omitempty"`
DefaultHealthCheck bool `json:"defaultHealthCheck,omitempty"`
//ChaosServiceAccount is the SvcAcc specified for chaos runner pods
ChaosServiceAccount string `json:"chaosServiceAccount"`
//Components contains the image, imagePullPolicy, arguments, and commands of runner
@ -208,8 +208,6 @@ type ExperimentList struct {
// ExperimentAttributes defines attributes of experiments
type ExperimentAttributes struct {
//Execution priority of the chaos experiment
Rank uint32 `json:"rank"`
// It contains env, configmaps, secrets, experimentImage, node selector, custom experiment annotation
// which can be provided or overridden from the chaos engine
Components ExperimentComponents `json:"components,omitempty"`
@ -221,22 +219,24 @@ type ExperimentAttributes struct {
// ProbeAttributes contains details of probe, which can be applied on the experiments
type ProbeAttributes struct {
// Name of probe
Name string `json:"name,omitempty"`
Name string `json:"name"`
// Type of probe
Type string `json:"type,omitempty"`
Type string `json:"type"`
// inputs needed for the k8s probe
K8sProbeInputs K8sProbeInputs `json:"k8sProbe/inputs,omitempty"`
K8sProbeInputs *K8sProbeInputs `json:"k8sProbe/inputs,omitempty"`
// inputs needed for the http probe
HTTPProbeInputs HTTPProbeInputs `json:"httpProbe/inputs,omitempty"`
HTTPProbeInputs *HTTPProbeInputs `json:"httpProbe/inputs,omitempty"`
// inputs needed for the cmd probe
CmdProbeInputs CmdProbeInputs `json:"cmdProbe/inputs,omitempty"`
CmdProbeInputs *CmdProbeInputs `json:"cmdProbe/inputs,omitempty"`
// 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
RunProperties RunProperty `json:"runProperties,omitempty"`
RunProperties RunProperty `json:"runProperties"`
// mode for k8s probe
// 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
// it supported for create operation only
Data string `json:"data,omitempty"`
@ -247,9 +247,9 @@ type K8sProbeInputs struct {
// group of the resource
Group string `json:"group,omitempty"`
// apiversion of the resource
Version string `json:"version,omitempty"`
Version string `json:"version"`
// 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 string `json:"resourceNames,omitempty"`
// namespace of the resource
@ -260,24 +260,24 @@ type K8sProbeInputs struct {
LabelSelector string `json:"labelSelector,omitempty"`
// Operation performed by the k8s probe
// 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 {
// 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 ComparatorInfo `json:"comparator,omitempty"`
Comparator ComparatorInfo `json:"comparator"`
// The source where we have to run the command
// 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
type SourceDetails struct {
// Image for the source pod
Image string `json:"image,omitempty"`
Image string `json:"image"`
// HostNetwork define the hostNetwork of the external pod
// it supports boolean values and default value is false
HostNetwork bool `json:"hostNetwork,omitempty"`
@ -300,6 +300,8 @@ type SourceDetails struct {
Privileged bool `json:"privileged,omitempty"`
// NodeSelector for the source pod
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
// Tolerations for the source pod
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
// Volumes for the source pod
Volumes []corev1.Volume `json:"volumes,omitempty"`
// VolumesMount for the source pod
@ -308,16 +310,57 @@ type SourceDetails struct {
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 {
// Endpoint for the prometheus probe
Endpoint string `json:"endpoint,omitempty"`
Endpoint string `json:"endpoint"`
// Query to get promethus metrics
Query string `json:"query,omitempty"`
// QueryPath contains filePath, which contains prometheus query
QueryPath string `json:"queryPath,omitempty"`
// 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
@ -328,34 +371,34 @@ type ComparatorInfo struct {
// Criteria for matching data
// it supports >=, <=, ==, >, <, != for int and float
// it supports equal, notEqual, contains for string
Criteria string `json:"criteria,omitempty"`
Criteria string `json:"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 {
// 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 bool `json:"insecureSkipVerify,omitempty"`
// 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
type HTTPMethod struct {
Get GetMethod `json:"get,omitempty"`
Post PostMethod `json:"post,omitempty"`
Get *GetMethod `json:"get,omitempty"`
Post *PostMethod `json:"post,omitempty"`
}
// GetMethod define the http Get method
type GetMethod struct {
// Criteria for matching data
// it supports == != operations
Criteria string `json:"criteria,omitempty"`
Criteria string `json:"criteria"`
// Value contains relative value for criteria
ResponseCode string `json:"responseCode,omitempty"`
ResponseCode string `json:"responseCode"`
}
// PostMethod define the http Post method
@ -368,26 +411,33 @@ type PostMethod struct {
BodyPath string `json:"bodyPath,omitempty"`
// Criteria for matching data
// it supports == != operations
Criteria string `json:"criteria,omitempty"`
Criteria string `json:"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 {
//ProbeTimeout contains timeout for the probe
ProbeTimeout int `json:"probeTimeout,omitempty"`
ProbeTimeout string `json:"probeTimeout"`
// 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 int `json:"retry,omitempty"`
// Attempt contains the total attempt count for the probe
Attempt int `json:"attempt,omitempty"`
//ProbePollingInterval contains time interval, for which continuous probe should be sleep
// after each iteration
ProbePollingInterval int `json:"probePollingInterval,omitempty"`
ProbePollingInterval string `json:"probePollingInterval,omitempty"`
//InitialDelaySeconds time interval for which probe will wait before run
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
// it will stop the experiment execution, if provided true
// it will continue the experiment execution, if provided false or not provided(default case)

View File

@ -40,8 +40,10 @@ const (
ResultPhaseRunning ResultPhase = "Running"
// ResultPhaseCompleted is phase of chaosresult which is in completed state
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"
// 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 ResultPhase = "Stopped"
// 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
//+kubebuilder:object:generate=true
//+groupName=litmuschaos.io
// +kubebuilder:object:generate=true
// +groupName=litmuschaos.io
package v1alpha1
import (

View File

@ -346,7 +346,11 @@ func (in *ChaosResultStatus) DeepCopy() *ChaosResultStatus {
func (in *CmdProbeInputs) DeepCopyInto(out *CmdProbeInputs) {
*out = *in
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.
@ -434,6 +438,21 @@ func (in *ErrorOutput) DeepCopy() *ErrorOutput {
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.
func (in *ExperimentAttributes) DeepCopyInto(out *ExperimentAttributes) {
*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.
func (in *HTTPMethod) DeepCopyInto(out *HTTPMethod) {
*out = *in
out.Get = in.Get
out.Post = in.Post
if in.Get != nil {
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.
@ -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.
func (in *HTTPProbeInputs) DeepCopyInto(out *HTTPProbeInputs) {
*out = *in
out.Method = in.Method
in.Method.DeepCopyInto(&out.Method)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPProbeInputs.
@ -705,6 +732,21 @@ func (in *HostFile) DeepCopy() *HostFile {
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.
func (in *K8sProbeInputs) DeepCopyInto(out *K8sProbeInputs) {
*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.
func (in *ProbeAttributes) DeepCopyInto(out *ProbeAttributes) {
*out = *in
out.K8sProbeInputs = in.K8sProbeInputs
out.HTTPProbeInputs = in.HTTPProbeInputs
in.CmdProbeInputs.DeepCopyInto(&out.CmdProbeInputs)
out.PromProbeInputs = in.PromProbeInputs
if in.K8sProbeInputs != nil {
in, out := &in.K8sProbeInputs, &out.K8sProbeInputs
*out = new(K8sProbeInputs)
**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
}
@ -903,6 +966,44 @@ func (in *RunnerInfo) DeepCopy() *RunnerInfo {
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.
func (in *Secret) DeepCopyInto(out *Secret) {
*out = *in
@ -1035,6 +1136,13 @@ func (in *SourceDetails) DeepCopyInto(out *SourceDetails) {
(*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 {
in, out := &in.Volumes, &out.Volumes
*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
# Packaging stage
# Image source: https://github.com/litmuschaos/test-tools/blob/master/custom/hardened-alpine/infra/Dockerfile
# The base image is non-root (have litmus user) with default litmus directory.
FROM litmuschaos/infra-alpine
FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5
LABEL maintainer="LitmusChaos"
ENV OPERATOR=/usr/local/bin/chaos-operator
COPY --from=builder /output/chaos-operator ${OPERATOR}
RUN chown 65534:0 ${OPERATOR} && chmod 755 ${OPERATOR}
USER 65534
ENTRYPOINT ["/usr/local/bin/chaos-operator"]

View File

@ -19,6 +19,11 @@ package controllers
import (
"context"
"fmt"
"os"
"reflect"
"strings"
"time"
"github.com/go-logr/logr"
litmuschaosv1alpha1 "github.com/litmuschaos/chaos-operator/api/litmuschaos/v1alpha1"
"github.com/litmuschaos/chaos-operator/pkg/analytics"
@ -37,14 +42,10 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/tools/record"
"os"
"reflect"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
"strings"
"time"
)
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
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
@ -168,6 +169,11 @@ func getChaosRunnerLabels(cr *litmuschaosv1alpha1.ChaosEngine) map[string]string
// newGoRunnerPodForCR defines a new go-based Runner Pod
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)
containerForRunner := container.NewBuilder().
@ -196,6 +202,10 @@ func (r *ChaosEngineReconciler) newGoRunnerPodForCR(engine *chaosTypes.EngineInf
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().
WithName(engine.Instance.Name + "-runner").
WithNamespace(engine.Instance.Namespace).
@ -221,6 +231,10 @@ func (r *ChaosEngineReconciler) newGoRunnerPodForCR(engine *chaosTypes.EngineInf
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()
if err != nil {
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.Info("Reconciling ChaosEngine")
return reqLogger
return &reqLogger
}
func (r *ChaosEngineReconciler) updateEngineForComplete(engine *chaosTypes.EngineInfo, isCompleted bool) (bool, error) {
@ -813,7 +827,7 @@ func isResultCRDAvailable() (bool, error) {
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 {
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{
Instance: &v1alpha1.ChaosEngine{
ObjectMeta: metav1.ObjectMeta{},
Spec: v1alpha1.ChaosEngineSpec{
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
AppExperiments: []string{"exp-1"},
},
@ -435,6 +462,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
},
Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -451,6 +483,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
},
Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -472,6 +509,11 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
Image: "",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -483,6 +525,15 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
for name, mock := range tests {
t.Run(name, func(t *testing.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)
if mock.isErr && err == nil {
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",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -980,6 +1036,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1002,6 +1063,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1024,6 +1090,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1036,6 +1107,13 @@ func TestCheckEngineRunnerPod(t *testing.T) {
engine: chaosTypes.EngineInfo{
Instance: &v1alpha1.ChaosEngine{
ObjectMeta: metav1.ObjectMeta{},
Spec: v1alpha1.ChaosEngineSpec{
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
AppExperiments: []string{"exp-1"},
@ -1051,6 +1129,11 @@ func TestCheckEngineRunnerPod(t *testing.T) {
},
Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1099,6 +1182,15 @@ func TestCheckEngineRunnerPod(t *testing.T) {
for name, mock := range tests {
t.Run(name, func(t *testing.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()
err := r.checkEngineRunnerPod(&mock.engine, reqLogger)
if mock.isErr && err == nil {
@ -1506,6 +1598,15 @@ func TestReconcileForCreationAndRunning(t *testing.T) {
for name, mock := range tests {
t.Run(name, func(t *testing.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()
_, err := r.reconcileForCreationAndRunning(&mock.engine, reqLogger)
if mock.isErr && err == nil {
@ -1520,7 +1621,7 @@ func TestReconcileForCreationAndRunning(t *testing.T) {
func CreateFakeClient(t *testing.T) *ChaosEngineReconciler {
fakeClient := litmusFakeClientset.NewFakeClient()
fakeClient := litmusFakeClientset.NewClientBuilder().WithRuntimeObjects().Build()
if fakeClient == nil {
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{
Items: []v1alpha1.ChaosResult{},
}
s.AddKnownTypes(v1alpha1.SchemeGroupVersion, engineR, chaosResultList)
s.AddKnownTypes(v1alpha1.SchemeGroupVersion, engineR, chaosResultList, exp)
recorder := record.NewFakeRecorder(1024)

View File

@ -41,8 +41,7 @@ spec:
# - pattern: '^delete$'
# - pattern: '^retain$'
defaultHealthCheck:
type: string
pattern: ^(true|false)$
type: boolean
appinfo:
type: object
properties:
@ -107,7 +106,6 @@ spec:
type: array
items:
type: object
x-kubernetes-preserve-unknown-fields: true
properties:
env:
description: ENV contains ENV passed to the sidecar container
@ -338,6 +336,9 @@ spec:
items:
type: object
required:
- name
- type
- mode
- runProperties
properties:
name:
@ -345,9 +346,13 @@ spec:
type:
type: string
minLength: 1
pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe)$
pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe|sloProbe)$
k8sProbe/inputs:
type: object
required:
- version
- resource
- operation
properties:
group:
type: string
@ -369,12 +374,19 @@ spec:
minLength: 1
cmdProbe/inputs:
type: object
required:
- command
- comparator
properties:
command:
type: string
minLength: 1
comparator:
type: object
required:
- type
- criteria
- value
properties:
type:
type: string
@ -387,6 +399,8 @@ spec:
source:
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
required:
- image
properties:
annotations:
additionalProperties:
@ -562,6 +576,29 @@ spec:
type: string
description: NodeSelector for the source pod
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:
description: Privileged for the source pod
type: boolean
@ -2170,6 +2207,9 @@ spec:
type: object
httpProbe/inputs:
type: object
required:
- url
- method
properties:
url:
type: string
@ -2182,6 +2222,9 @@ spec:
properties:
get:
type: object
required:
- criteria
- responseCode
properties:
criteria:
type: string
@ -2191,6 +2234,9 @@ spec:
minLength: 1
post:
type: object
required:
- criteria
- responseCode
properties:
contentType:
type: string
@ -2207,6 +2253,9 @@ spec:
minLength: 1
promProbe/inputs:
type: object
required:
- endpoint
- comparator
properties:
endpoint:
type: string
@ -2216,6 +2265,9 @@ spec:
type: string
comparator:
type: object
required:
- criteria
- value
properties:
criteria:
type: string
@ -2228,20 +2280,110 @@ spec:
- probeTimeout
- interval
properties:
evaluationTimeout:
type: string
probeTimeout:
type: integer
type: string
interval:
type: integer
type: string
retry:
type: integer
attempt:
type: integer
probePollingInterval:
type: integer
initialDelaySeconds:
type: integer
type: string
initialDelay:
type: string
verbosity:
type: string
stopOnFailure:
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:
type: string
pattern: ^(SOT|EOT|Edge|Continuous|OnChaos)$

View File

@ -40,8 +40,7 @@ spec:
# - pattern: '^delete$'
# - pattern: '^retain$'
defaultHealthCheck:
type: string
pattern: ^(true|false)$
type: boolean
appinfo:
type: object
properties:
@ -336,6 +335,9 @@ spec:
items:
type: object
required:
- name
- type
- mode
- runProperties
properties:
name:
@ -343,9 +345,13 @@ spec:
type:
type: string
minLength: 1
pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe)$
pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe|sloProbe)$
k8sProbe/inputs:
type: object
required:
- version
- resource
- operation
properties:
group:
type: string
@ -367,12 +373,19 @@ spec:
minLength: 1
cmdProbe/inputs:
type: object
required:
- command
- comparator
properties:
command:
type: string
minLength: 1
comparator:
type: object
required:
- type
- criteria
- value
properties:
type:
type: string
@ -385,6 +398,8 @@ spec:
source:
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
required:
- image
properties:
annotations:
additionalProperties:
@ -560,6 +575,29 @@ spec:
type: string
description: NodeSelector for the source pod
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:
description: Privileged for the source pod
type: boolean
@ -2168,6 +2206,9 @@ spec:
type: object
httpProbe/inputs:
type: object
required:
- url
- method
properties:
url:
type: string
@ -2180,6 +2221,9 @@ spec:
properties:
get:
type: object
required:
- criteria
- responseCode
properties:
criteria:
type: string
@ -2189,6 +2233,9 @@ spec:
minLength: 1
post:
type: object
required:
- criteria
- responseCode
properties:
contentType:
type: string
@ -2205,6 +2252,9 @@ spec:
minLength: 1
promProbe/inputs:
type: object
required:
- endpoint
- comparator
properties:
endpoint:
type: string
@ -2214,6 +2264,9 @@ spec:
type: string
comparator:
type: object
required:
- criteria
- value
properties:
criteria:
type: string
@ -2226,20 +2279,112 @@ spec:
- probeTimeout
- interval
properties:
evaluationTimeout:
type: string
probeTimeout:
type: integer
type: string
interval:
type: integer
type: string
retry:
type: integer
attempt:
type: integer
probePollingInterval:
type: integer
type: string
initialDelaySeconds:
type: integer
initialDelay:
type: string
verbosity:
type: string
stopOnFailure:
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:
type: string
pattern: ^(SOT|EOT|Edge|Continuous|OnChaos)$

View File

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

139
go.mod
View File

@ -1,113 +1,108 @@
module github.com/litmuschaos/chaos-operator
go 1.18
go 1.22
require (
cloud.google.com/go v0.81.0 // indirect
github.com/go-logr/logr v0.4.0
github.com/google/go-cmp v0.5.6 // indirect
github.com/go-logr/logr v1.4.2
github.com/google/go-cmp v0.5.9 // indirect
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/spf13/pflag v1.0.5 // indirect
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b // indirect
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
k8s.io/api v0.22.1
k8s.io/apimachinery v0.22.1
golang.org/x/oauth2 v0.7.0 // indirect
k8s.io/api v0.26.15
k8s.io/apimachinery v0.26.15
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 (
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24
github.com/google/martian v2.1.0+incompatible
github.com/onsi/ginkgo v1.16.4
github.com/onsi/gomega v1.15.0
github.com/operator-framework/operator-sdk v0.19.0
github.com/stretchr/testify v1.7.0
github.com/onsi/ginkgo v1.16.5
github.com/onsi/gomega v1.24.2
github.com/stretchr/testify v1.8.2
k8s.io/klog v1.0.0
)
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/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/evanphx/json-patch v4.11.0+incompatible // indirect
github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/go-logr/zapr v0.4.0 // indirect
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/evanphx/json-patch v4.12.0+incompatible // indirect
github.com/evanphx/json-patch/v5 v5.6.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/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/uuid v1.1.2 // indirect
github.com/googleapis/gnostic v0.5.5 // indirect
github.com/hashicorp/golang-lru v0.5.3 // indirect
github.com/google/uuid v1.3.0 // 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/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/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/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.12.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/prometheus/client_golang v1.14.0 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.37.0 // indirect
github.com/prometheus/procfs v0.8.0 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.19.0 // indirect
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect
golang.org/x/net v0.0.0-20220906165146-f3363e06e74c // indirect
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
golang.org/x/text v0.3.8 // indirect
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
go.uber.org/zap v1.24.0 // indirect
golang.org/x/net v0.19.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/term v0.15.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.3.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.2.0 // 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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apiextensions-apiserver v0.22.1 // indirect
k8s.io/component-base v0.22.2 // indirect
k8s.io/klog/v2 v2.9.0 // indirect
k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect
k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
k8s.io/apiextensions-apiserver v0.26.1 // indirect
k8s.io/component-base v0.26.15 // indirect
k8s.io/klog/v2 v2.80.1 // indirect
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // 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 (
k8s.io/api => k8s.io/api v0.21.2
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.21.2
k8s.io/apimachinery => k8s.io/apimachinery v0.21.2
k8s.io/apiserver => k8s.io/apiserver v0.21.2
k8s.io/cli-runtime => k8s.io/cli-runtime v0.21.2
k8s.io/client-go => k8s.io/client-go v0.21.2
k8s.io/cloud-provider => k8s.io/cloud-provider v0.21.2
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.21.2
k8s.io/code-generator => k8s.io/code-generator v0.21.2
k8s.io/component-base => k8s.io/component-base v0.21.2
k8s.io/cri-api => k8s.io/cri-api v0.21.2
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.21.2
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.21.2
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.21.2
k8s.io/kube-proxy => k8s.io/kube-proxy v0.21.2
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.21.2
k8s.io/kubectl => k8s.io/kubectl v0.21.2
k8s.io/kubelet => k8s.io/kubelet v0.21.2
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.21.2
k8s.io/metrics => k8s.io/metrics v0.21.2
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.21.2
sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.14.6
github.com/go-logr/logr => github.com/go-logr/logr v1.4.2
k8s.io/api => k8s.io/api v0.26.15
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.26.15
k8s.io/apimachinery => k8s.io/apimachinery v0.26.15
k8s.io/client-go => k8s.io/client-go v0.26.15
k8s.io/cloud-provider => k8s.io/cloud-provider v0.26.15
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.26.15
k8s.io/component-base => k8s.io/component-base v0.26.15
k8s.io/cri-api => k8s.io/cri-api v0.26.15
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.26.15
k8s.io/klog/v2 => k8s.io/klog/v2 v2.80.1
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.26.15
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.26.15
k8s.io/kube-proxy => k8s.io/kube-proxy v0.26.15
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.26.15
k8s.io/kubelet => k8s.io/kubelet v0.26.15
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.26.15
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.26.15
)
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 (
"flag"
"fmt"
"github.com/litmuschaos/chaos-operator/pkg/analytics"
"github.com/operator-framework/operator-sdk/pkg/k8sutil"
"os"
"runtime"
"strings"
"github.com/litmuschaos/chaos-operator/pkg/analytics"
"github.com/pkg/errors"
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them.
_ "k8s.io/client-go/plugin/pkg/client/auth"
@ -71,9 +72,9 @@ func main() {
printVersion()
namespace, err := k8sutil.GetWatchNamespace()
if err != nil {
setupLog.Error(err, "failed to get watch namespace")
namespace, found := os.LookupEnv("WATCH_NAMESPACE")
if !found {
setupLog.Error(errors.New("WATCH_NAMESPACE env is not set"), "failed to get watch namespace")
os.Exit(1)
}

View File

@ -36,9 +36,9 @@ type FakeChaosEngines struct {
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.
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
}
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.
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
}
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.
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
func CreateClientSet() (*dynamic.Interface, error) {
func CreateClientSet() (dynamic.Interface, error) {
restConfig, err := config.GetConfig()
if err != nil {
return nil, err
@ -15,5 +15,5 @@ func CreateClientSet() (*dynamic.Interface, error) {
if err != nil {
return nil, err
}
return &clientSet, nil
return clientSet, nil
}

View File

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

View File

@ -36,7 +36,7 @@ import (
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 {
VolumeMounts []corev1.VolumeMount
VolumeBuilders []*volume.Builder

View File

@ -22,6 +22,9 @@ import (
// RemoveString removes a particular string from a slice of strings
func RemoveString(slice []string, s string) (result []string) {
if len(slice) == 0 {
return
}
for _, item := range slice {
if item == s {
continue
@ -33,7 +36,7 @@ func RemoveString(slice []string, s string) (result []string) {
// SetEnv sets the env inside envDetails struct
func (envDetails *ENVDetails) SetEnv(key, value string) *ENVDetails {
if value != "" {
if key != "" && value != "" {
envDetails.ENV = append(envDetails.ENV, corev1.EnvVar{
Name: key,
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"
)
var (
// hostpathTypeFile represents the hostpath type
hostpathTypeFile = corev1.HostPathFile
)
// CreateVolumeBuilders build Volume needed in execution of experiments
func CreateVolumeBuilders(configMaps []v1alpha1.ConfigMap, secrets []v1alpha1.Secret) []*volume.Builder {
volumeBuilderList := []*volume.Builder{}

View File

@ -119,7 +119,7 @@ var _ = BeforeSuite(func() {
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() {
// BDD TEST CASE 1
@ -437,25 +437,6 @@ var _ = Describe("BDD on chaos-operator", func() {
})
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() {
@ -505,7 +486,7 @@ var _ = Describe("BDD on chaos-operator", func() {
})
//Deleting all unused resources
// Deleting all unused resources
var _ = AfterSuite(func() {
//Deleting Pod Delete sa