Compare commits

..

No commits in common. "master" and "3.0.0-beta5" have entirely different histories.

34 changed files with 3342 additions and 3004 deletions

10
.bettercodehub.yml Normal file
View File

@ -0,0 +1,10 @@
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.
* @ksatchit @ispeakc0de @imrajdas
* @rahulchheda @ksatchit @chandankumar4 @rajdas98

View File

@ -11,7 +11,7 @@ jobs:
# Install golang
- uses: actions/setup-go@v2
with:
go-version: 1.22
go-version: 1.18
# Checkout to the latest commit
# On specific directory/path
@ -22,13 +22,27 @@ jobs:
run: make gofmt-check
- name: golangci-lint
uses: reviewdog/action-golangci-lint@v2
with:
golangci_lint_flags: "--timeout=10m"
uses: reviewdog/action-golangci-lint@v1
- 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
@ -40,7 +54,7 @@ jobs:
- name: Build an image from Dockerfile
run: |
docker build -f build/Dockerfile -t docker.io/litmuschaos/chaos-operator:${{ github.sha }} . --build-arg TARGETPLATFORM=linux/amd64
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
@ -49,19 +63,7 @@ jobs:
exit-code: '1'
ignore-unfixed: true
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
severity: 'CRITICAL,HIGH'
image-build:
runs-on: ubuntu-latest
@ -81,9 +83,9 @@ jobs:
make build-amd64
docker save -o ${{ github.workspace }}/image.tar litmuschaos/chaos-operator:ci
chmod +x ${{ github.workspace }}/image.tar
- name: Upload artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v2
with:
name: myimage
path: |
@ -96,7 +98,7 @@ jobs:
# Install golang
- uses: actions/setup-go@v2
with:
go-version: 1.22
go-version: 1.18
# Checkout to the latest commit
# On specific directory/path
@ -105,7 +107,7 @@ jobs:
#Install and configure a kind cluster
- name: Installing Prerequisites (K3S Cluster)
env:
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
@ -119,15 +121,15 @@ jobs:
make deps
- name: Download artifact
uses: actions/download-artifact@v4
uses: actions/download-artifact@v2
with:
name: myimage
path: ${{ github.workspace }}
- name: Load Docker image
run: |
docker load --input ${{ github.workspace }}/image.tar
shell: bash
shell: bash
- name: Running Go BDD Test
run: |

View File

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

View File

@ -13,7 +13,7 @@ jobs:
# Install golang
- uses: actions/setup-go@v2
with:
go-version: 1.22
go-version: 1.18
# Checkout to the latest commit
# On specific directory/path
@ -24,13 +24,14 @@ jobs:
run: make gofmt-check
- name: golangci-lint
uses: reviewdog/action-golangci-lint@v2
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
@ -58,4 +59,45 @@ jobs:
DOCKER_TAG: ci
DNAME: ${{ secrets.DNAME }}
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,15 +11,25 @@ jobs:
# Install golang
- uses: actions/setup-go@v2
with:
go-version: 1.22
go-version: 1.18
# 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
@ -63,3 +73,44 @@ 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

@ -1,23 +0,0 @@
---
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
build-chaos-operator:
@echo "-------------------------"
@echo "--> Build go-runner image"
@echo "--> Build go-runner image"
@echo "-------------------------"
@docker buildx build --file build/Dockerfile --progress plain --no-cache --platform linux/arm64,linux/amd64 --tag $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) .
@docker buildx build --file build/Dockerfile --progress plane --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 "--> Pushing image"
@echo "------------------------------"
@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) .
@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) .
.PHONY: build-amd64
build-amd64:
@echo "-------------------------"
@echo "--> Build go-runner image"
@echo "--> Build go-runner image"
@echo "-------------------------"
@docker build -f build/Dockerfile --no-cache -t $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(DOCKER_IMAGE):$(DOCKER_TAG) . --build-arg TARGETPLATFORM="linux/amd64"

View File

@ -8,6 +8,7 @@
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/2597079b1b5240d3866a6deb4112a2f2)](https://www.codacy.com/manual/litmuschaos/chaos-operator?utm_source=github.com&utm_medium=referral&utm_content=litmuschaos/chaos-operator&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 bool `json:"defaultHealthCheck,omitempty"`
DefaultHealthCheck string `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,6 +208,8 @@ 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"`
@ -219,24 +221,22 @@ 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"`
Name string `json:"name,omitempty"`
// Type of probe
Type string `json:"type"`
Type string `json:"type,omitempty"`
// 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"`
// inputs needed for the SLO probe
SLOProbeInputs *SLOProbeInputs `json:"sloProbe/inputs,omitempty"`
PromProbeInputs PromProbeInputs `json:"promProbe/inputs,omitempty"`
// RunProperty contains timeout, retry and interval for the probe
RunProperties RunProperty `json:"runProperties"`
RunProperties RunProperty `json:"runProperties,omitempty"`
// mode for k8s probe
// it can be SOT, EOT, Edge
Mode string `json:"mode"`
Mode string `json:"mode,omitempty"`
// 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"`
Version string `json:"version,omitempty"`
// kind of resource
Resource string `json:"resource"`
Resource string `json:"resource,omitempty"`
// 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"`
Operation string `json:"operation,omitempty"`
}
// 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"`
Command string `json:"command,omitempty"`
// Comparator check for the correctness of the probe output
Comparator ComparatorInfo `json:"comparator"`
Comparator ComparatorInfo `json:"comparator,omitempty"`
// 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"`
Image string `json:"image,omitempty"`
// HostNetwork define the hostNetwork of the external pod
// it supports boolean values and default value is false
HostNetwork bool `json:"hostNetwork,omitempty"`
@ -300,8 +300,6 @@ 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
@ -310,57 +308,16 @@ 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"`
Endpoint string `json:"endpoint,omitempty"`
// 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"`
}
// 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"`
Comparator ComparatorInfo `json:"comparator,omitempty"`
}
// ComparatorInfo contains the comparator details
@ -371,34 +328,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"`
Criteria string `json:"criteria,omitempty"`
// Value contains relative value for criteria
Value string `json:"value"`
Value string `json:"value,omitempty"`
}
// 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"`
URL string `json:"url,omitempty"`
// 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"`
Method HTTPMethod `json:"method,omitempty"`
}
// 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"`
Criteria string `json:"criteria,omitempty"`
// Value contains relative value for criteria
ResponseCode string `json:"responseCode"`
ResponseCode string `json:"responseCode,omitempty"`
}
// PostMethod define the http Post method
@ -411,33 +368,26 @@ type PostMethod struct {
BodyPath string `json:"bodyPath,omitempty"`
// Criteria for matching data
// it supports == != operations
Criteria string `json:"criteria"`
Criteria string `json:"criteria,omitempty"`
// Value contains relative value for criteria
ResponseCode string `json:"responseCode"`
ResponseCode string `json:"responseCode,omitempty"`
}
// 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 string `json:"probeTimeout"`
ProbeTimeout int `json:"probeTimeout,omitempty"`
// Interval contains the interval for the probe
Interval string `json:"interval"`
Interval int `json:"interval,omitempty"`
// 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 string `json:"probePollingInterval,omitempty"`
ProbePollingInterval int `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,10 +40,8 @@ const (
ResultPhaseRunning ResultPhase = "Running"
// ResultPhaseCompleted is phase of chaosresult which is in completed state
ResultPhaseCompleted ResultPhase = "Completed"
// Retained For Backward Compatibility: ResultPhaseCompletedWithError is phase of chaosresult when probe is failed in 3.0beta5
// ResultPhaseCompletedWithError is phase of chaosresult when probe is failed
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,11 +346,7 @@ func (in *ChaosResultStatus) DeepCopy() *ChaosResultStatus {
func (in *CmdProbeInputs) DeepCopyInto(out *CmdProbeInputs) {
*out = *in
out.Comparator = in.Comparator
if in.Source != nil {
in, out := &in.Source, &out.Source
*out = new(SourceDetails)
(*in).DeepCopyInto(*out)
}
in.Source.DeepCopyInto(&out.Source)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CmdProbeInputs.
@ -438,21 +434,6 @@ 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
@ -659,16 +640,8 @@ 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
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
}
out.Get = in.Get
out.Post = in.Post
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPMethod.
@ -684,7 +657,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
in.Method.DeepCopyInto(&out.Method)
out.Method = in.Method
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPProbeInputs.
@ -732,21 +705,6 @@ 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
@ -795,31 +753,10 @@ 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
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.K8sProbeInputs = in.K8sProbeInputs
out.HTTPProbeInputs = in.HTTPProbeInputs
in.CmdProbeInputs.DeepCopyInto(&out.CmdProbeInputs)
out.PromProbeInputs = in.PromProbeInputs
out.RunProperties = in.RunProperties
}
@ -966,44 +903,6 @@ 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
@ -1136,13 +1035,6 @@ 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,15 +17,13 @@ RUN go env
RUN CGO_ENABLED=0 go build -buildvcs=false -o /output/chaos-operator -v ./main.go
# Packaging stage
FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5
# 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
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,11 +19,6 @@ 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"
@ -42,10 +37,14 @@ 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"
@ -112,7 +111,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
@ -169,11 +168,6 @@ 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().
@ -202,10 +196,6 @@ 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).
@ -231,10 +221,6 @@ 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
@ -680,11 +666,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) {
@ -827,7 +813,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,11 +329,6 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
},
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -360,11 +355,6 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
},
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -392,11 +382,6 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
},
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -424,11 +409,6 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
},
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -441,13 +421,6 @@ 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"},
},
@ -462,11 +435,6 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
},
Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -483,11 +451,6 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
},
Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -509,11 +472,6 @@ func TestNewGoRunnerPodForCR(t *testing.T) {
Image: "",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "pod-delete",
},
},
},
},
@ -525,15 +483,6 @@ 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)
@ -1010,11 +959,6 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1036,11 +980,6 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1063,11 +1002,6 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1090,11 +1024,6 @@ func TestCheckEngineRunnerPod(t *testing.T) {
Image: "fake-runner-image",
},
},
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1107,13 +1036,6 @@ 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"},
@ -1129,11 +1051,6 @@ func TestCheckEngineRunnerPod(t *testing.T) {
},
Spec: v1alpha1.ChaosEngineSpec{
ChaosServiceAccount: "fake-serviceAccount",
Experiments: []v1alpha1.ExperimentList{
{
Name: "exp-1",
},
},
},
},
@ -1182,15 +1099,6 @@ 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 {
@ -1598,15 +1506,6 @@ 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 {
@ -1621,7 +1520,7 @@ func TestReconcileForCreationAndRunning(t *testing.T) {
func CreateFakeClient(t *testing.T) *ChaosEngineReconciler {
fakeClient := litmusFakeClientset.NewClientBuilder().WithRuntimeObjects().Build()
fakeClient := litmusFakeClientset.NewFakeClient()
if fakeClient == nil {
fmt.Println("litmusClient is not created")
}
@ -1635,18 +1534,11 @@ 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, exp)
s.AddKnownTypes(v1alpha1.SchemeGroupVersion, engineR, chaosResultList)
recorder := record.NewFakeRecorder(1024)

File diff suppressed because it is too large Load Diff

View File

@ -40,7 +40,8 @@ spec:
# - pattern: '^delete$'
# - pattern: '^retain$'
defaultHealthCheck:
type: boolean
type: string
pattern: ^(true|false)$
appinfo:
type: object
properties:
@ -335,9 +336,6 @@ spec:
items:
type: object
required:
- name
- type
- mode
- runProperties
properties:
name:
@ -345,13 +343,9 @@ spec:
type:
type: string
minLength: 1
pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe|sloProbe)$
pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe)$
k8sProbe/inputs:
type: object
required:
- version
- resource
- operation
properties:
group:
type: string
@ -373,19 +367,12 @@ 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
@ -398,8 +385,6 @@ 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:
@ -575,29 +560,6 @@ 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
@ -2206,9 +2168,6 @@ spec:
type: object
httpProbe/inputs:
type: object
required:
- url
- method
properties:
url:
type: string
@ -2221,9 +2180,6 @@ spec:
properties:
get:
type: object
required:
- criteria
- responseCode
properties:
criteria:
type: string
@ -2233,9 +2189,6 @@ spec:
minLength: 1
post:
type: object
required:
- criteria
- responseCode
properties:
contentType:
type: string
@ -2252,9 +2205,6 @@ spec:
minLength: 1
promProbe/inputs:
type: object
required:
- endpoint
- comparator
properties:
endpoint:
type: string
@ -2264,9 +2214,6 @@ spec:
type: string
comparator:
type: object
required:
- criteria
- value
properties:
criteria:
type: string
@ -2279,112 +2226,20 @@ spec:
- probeTimeout
- interval
properties:
evaluationTimeout:
type: string
probeTimeout:
type: string
type: integer
interval:
type: string
type: integer
retry:
type: integer
attempt:
type: integer
probePollingInterval:
type: string
type: integer
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.docker.scarf.sh/litmuschaos/chaos-runner:ci"
value: "litmuschaos/chaos-runner:ci"
- name: WATCH_NAMESPACE
value: ""
- name: POD_NAME

139
go.mod
View File

@ -1,108 +1,113 @@
module github.com/litmuschaos/chaos-operator
go 1.22
go 1.18
require (
github.com/go-logr/logr v1.4.2
github.com/google/go-cmp v0.5.9 // indirect
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/jpillora/go-ogle-analytics v0.0.0-20161213085824-14b04e0594ef
github.com/litmuschaos/elves v0.0.0-20230607095010-c7119636b529
github.com/litmuschaos/elves v0.0.0-20201107015738-552d74669e3c
github.com/pkg/errors v0.9.1
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/oauth2 v0.7.0 // indirect
k8s.io/api v0.26.15
k8s.io/apimachinery v0.26.15
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
k8s.io/client-go v12.0.0+incompatible
sigs.k8s.io/controller-runtime v0.14.6
sigs.k8s.io/controller-runtime v0.10.0
)
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.5
github.com/onsi/gomega v1.24.2
github.com/stretchr/testify v1.8.2
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
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.2.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/davecgh/go-spew v1.1.1 // 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/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/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/uuid v1.3.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/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/mailru/easyjson v0.7.6 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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.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
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
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // 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
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
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.33.0 // indirect
google.golang.org/protobuf v1.26.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.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
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
)
// Pinned to kubernetes-1.26
// Pinned to kubernetes-1.21.2
replace (
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
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
)
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,13 +19,12 @@ 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"
@ -72,9 +71,9 @@ func main() {
printVersion()
namespace, found := os.LookupEnv("WATCH_NAMESPACE")
if !found {
setupLog.Error(errors.New("WATCH_NAMESPACE env is not set"), "failed to get watch namespace")
namespace, err := k8sutil.GetWatchNamespace()
if err != nil {
setupLog.Error(err, "failed to get watch namespace")
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
// of clientsets, like in:
//
// import (
// "k8s.io/client-go/kubernetes"
// clientsetscheme "k8s.io/client-go/kubernetes/scheme"
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
// )
// import (
// "k8s.io/client-go/kubernetes"
// clientsetscheme "k8s.io/client-go/kubernetes/scheme"
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
// )
//
// kclientset, _ := kubernetes.NewForConfig(c)
// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
// kclientset, _ := kubernetes.NewForConfig(c)
// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
//
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
// 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
// of clientsets, like in:
//
// import (
// "k8s.io/client-go/kubernetes"
// clientsetscheme "k8s.io/client-go/kubernetes/scheme"
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
// )
// import (
// "k8s.io/client-go/kubernetes"
// clientsetscheme "k8s.io/client-go/kubernetes/scheme"
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
// )
//
// kclientset, _ := kubernetes.NewForConfig(c)
// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
// kclientset, _ := kubernetes.NewForConfig(c)
// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
//
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
// correctly.

View File

@ -36,9 +36,9 @@ type FakeChaosEngines struct {
ns string
}
var chaosenginesResource = schema.GroupVersionResource{Group: "litmuschaos.io", Version: "v1alpha1", Resource: "chaosengines"}
var chaosenginesResource = schema.GroupVersionResource{Group: "litmuschaos", Version: "v1alpha1", Resource: "chaosengines"}
var chaosenginesKind = schema.GroupVersionKind{Group: "litmuschaos.io", Version: "v1alpha1", Kind: "ChaosEngine"}
var chaosenginesKind = schema.GroupVersionKind{Group: "litmuschaos", 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.io", Version: "v1alpha1", Resource: "chaosexperiments"}
var chaosexperimentsResource = schema.GroupVersionResource{Group: "litmuschaos", Version: "v1alpha1", Resource: "chaosexperiments"}
var chaosexperimentsKind = schema.GroupVersionKind{Group: "litmuschaos.io", Version: "v1alpha1", Kind: "ChaosExperiment"}
var chaosexperimentsKind = schema.GroupVersionKind{Group: "litmuschaos", 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.io", Version: "v1alpha1", Resource: "chaosresults"}
var chaosresultsResource = schema.GroupVersionResource{Group: "litmuschaos", Version: "v1alpha1", Resource: "chaosresults"}
var chaosresultsKind = schema.GroupVersionKind{Group: "litmuschaos.io", Version: "v1alpha1", Kind: "ChaosResult"}
var chaosresultsKind = schema.GroupVersionKind{Group: "litmuschaos", 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,9 +22,6 @@ 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
@ -36,7 +33,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 key != "" && value != "" {
if value != "" {
envDetails.ENV = append(envDetails.ENV, corev1.EnvVar{
Name: key,
Value: value,

View File

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