From 192a95e87905ac069148ade3f912cda0690dedcd Mon Sep 17 00:00:00 2001 From: Rahul M Chheda <53308066+rahulchheda@users.noreply.github.com> Date: Thu, 12 Mar 2020 15:00:30 +0530 Subject: [PATCH 1/7] (feat) Removal of Default Resources, only when JobCleanUpPolicy is set to Delete (#168) * (feat) Removal of Default Resources, only when JobCleanUpPolicy is set to Delete * Renamed function from removeChaosReosources to forceRemoveAllChaosResources Signed-off-by: Rahul M Chheda --- .../chaosengine/chaosengine_controller.go | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/pkg/controller/chaosengine/chaosengine_controller.go b/pkg/controller/chaosengine/chaosengine_controller.go index e3b88c7b2..e2afaad7f 100644 --- a/pkg/controller/chaosengine/chaosengine_controller.go +++ b/pkg/controller/chaosengine/chaosengine_controller.go @@ -177,7 +177,7 @@ func (r *ReconcileChaosEngine) Reconcile(request reconcile.Request) (reconcile.R } // Verify that the engineStatus is set to completed, - // if thats the case, then reconcile for completed + // if thats the case, then return reconcileForComplete if checkEngineStatusForComplete(engine) { return r.reconcileForComplete(request) } @@ -191,7 +191,7 @@ func (r *ReconcileChaosEngine) Reconcile(request reconcile.Request) (reconcile.R } // Verify that the engineStatus is set to stopped, - // then reconcile for delete + // then return reconcileForDelete if checkEngineStatusForStopped(engine) { return r.reconcileForDelete(request) } @@ -594,7 +594,7 @@ func getAnnotationCheck() error { // reconcileForDelete func (r *ReconcileChaosEngine) reconcileForDelete(request reconcile.Request) (reconcile.Result, error) { - reconcileResult, err := r.removeChaosResources(engine, request) + reconcileResult, err := r.forceRemoveAllChaosResources(engine, request) if err != nil { return reconcileResult, err } @@ -632,7 +632,7 @@ func (r *ReconcileChaosEngine) removeChaosServices(engine *chaosTypes.EngineInfo return nil } -func (r *ReconcileChaosEngine) removeChaosResources(engine *chaosTypes.EngineInfo, request reconcile.Request) (reconcile.Result, error) { +func (r *ReconcileChaosEngine) forceRemoveAllChaosResources(engine *chaosTypes.EngineInfo, request reconcile.Request) (reconcile.Result, error) { optsDelete := []client.DeleteAllOfOption{ client.InNamespace(request.NamespacedName.Namespace), client.MatchingLabels{"chaosUID": string(engine.Instance.UID)}, @@ -709,16 +709,20 @@ func (r *ReconcileChaosEngine) checkRunnerPodCompleted(engine *chaosTypes.Engine } func (r *ReconcileChaosEngine) removeDefaultChaosResources(request reconcile.Request) (reconcile.Result, error) { - if err := r.removeChaosRunner(engine, request); err != nil { - return reconcile.Result{}, err - } - if err := r.removeChaosServices(engine, request); err != nil { - return reconcile.Result{}, err + + if engine.Instance.Spec.JobCleanUpPolicy == litmuschaosv1alpha1.CleanUpPolicyDelete { + if err := r.removeChaosRunner(engine, request); err != nil { + return reconcile.Result{}, err + } + if err := r.removeChaosServices(engine, request); err != nil { + return reconcile.Result{}, err + } } return reconcile.Result{}, nil } func (r *ReconcileChaosEngine) removeChaosRunner(engine *chaosTypes.EngineInfo, request reconcile.Request) error { + optsList := []client.ListOption{ client.InNamespace(request.NamespacedName.Namespace), client.MatchingLabels{"app": engine.Instance.Name, "chaosUID": string(engine.Instance.UID)}, @@ -750,6 +754,7 @@ func checkEngineStatusForComplete(engine *chaosTypes.EngineInfo) bool { return engine.Instance.Status.EngineStatus == litmuschaosv1alpha1.EngineStatusCompleted } + func (r *ReconcileChaosEngine) reconcileForComplete(request reconcile.Request) (reconcile.Result, error) { _, err := r.removeDefaultChaosResources(request) if err != nil { From 43f2ceb189078bf639915f4c41f9dc397f3e22bd Mon Sep 17 00:00:00 2001 From: Rahul M Chheda <53308066+rahulchheda@users.noreply.github.com> Date: Thu, 12 Mar 2020 17:44:22 +0530 Subject: [PATCH 2/7] (fix) Updated strings for completed Chaos Engine Event (#169) Signed-off-by: Rahul M Chheda --- pkg/controller/chaosengine/chaosengine_controller.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/controller/chaosengine/chaosengine_controller.go b/pkg/controller/chaosengine/chaosengine_controller.go index e2afaad7f..7628288b0 100644 --- a/pkg/controller/chaosengine/chaosengine_controller.go +++ b/pkg/controller/chaosengine/chaosengine_controller.go @@ -762,7 +762,12 @@ func (r *ReconcileChaosEngine) reconcileForComplete(request reconcile.Request) ( } if engine.Instance.ObjectMeta.Finalizers != nil { engine.Instance.ObjectMeta.Finalizers = utils.RemoveString(engine.Instance.ObjectMeta.Finalizers, "chaosengine.litmuschaos.io/finalizer") - r.recorder.Eventf(engine.Instance, corev1.EventTypeNormal, "ChaosEngine Stopped", "Removing all experiment resources allocated to ChaosEngine: %v in Namespace: %v", engine.Instance.Name, engine.Instance.Namespace) + if engine.Instance.Spec.JobCleanUpPolicy == litmuschaosv1alpha1.CleanUpPolicyDelete { + r.recorder.Eventf(engine.Instance, corev1.EventTypeNormal, "ChaosEngineStopped", "Deleted all experiment resources allocated to ChaosEngine: %v in Namespace: %v", engine.Instance.Name, engine.Instance.Namespace) + } else if engine.Instance.Spec.JobCleanUpPolicy == litmuschaosv1alpha1.CleanUpPolicyRetain { + r.recorder.Eventf(engine.Instance, corev1.EventTypeNormal, "ChaosEngineStopped", "Retained all experiment resources allocated to ChaosEngine: %v in Namespace: %v", engine.Instance.Name, engine.Instance.Namespace) + + } } err = r.updateState(engine, litmuschaosv1alpha1.EngineStateStop) if err != nil { From d2c4ee7568945bf082ee4b7df50849b55bf2fbae Mon Sep 17 00:00:00 2001 From: Rahul M Chheda <53308066+rahulchheda@users.noreply.github.com> Date: Thu, 12 Mar 2020 17:57:58 +0530 Subject: [PATCH 3/7] (chore) Updated BDD for Abort Functionality (#166) * (chore) Updated BDD for Abort Functionality Signed-off-by: Rahul M Chheda --- tests/bdd/bdd_test.go | 225 +++++++++++++++++++++++++++++++++++------- 1 file changed, 192 insertions(+), 33 deletions(-) diff --git a/tests/bdd/bdd_test.go b/tests/bdd/bdd_test.go index 27e77269f..50bed0442 100644 --- a/tests/bdd/bdd_test.go +++ b/tests/bdd/bdd_test.go @@ -28,6 +28,7 @@ import ( appv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" rbacV1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" scheme "k8s.io/client-go/kubernetes/scheme" @@ -57,47 +58,30 @@ var _ = BeforeSuite(func() { var err error kubeconfig = os.Getenv("HOME") + "/.kube/config" config, err = clientcmd.BuildConfigFromFlags("", kubeconfig) - - if err != nil { - Expect(err).To(BeNil(), "failed to get config") - } + Expect(err).To(BeNil(), "failed to get config") client, err = kubernetes.NewForConfig(config) - - if err != nil { - Expect(err).To(BeNil(), "failed to get client") - } + Expect(err).To(BeNil(), "failed to get client") clientSet, err = chaosClient.NewForConfig(config) - - if err != nil { - Expect(err).To(BeNil(), "failed to get clientSet") - } + Expect(err).To(BeNil(), "failed to get clientSet") err = v1alpha1.AddToScheme(scheme.Scheme) - if err != nil { - fmt.Println(err) - } + Expect(err).To(BeNil()) //Creating crds By("creating chaosengine crd") - err = exec.Command("kubectl", "create", "-f", "../../deploy/chaos_crds.yaml").Run() - if err != nil { - fmt.Println(err) - } + err = exec.Command("kubectl", "apply", "-f", "../../deploy/chaos_crds.yaml").Run() + Expect(err).To(BeNil()) //Creating rbacs - err = exec.Command("kubectl", "create", "-f", "../../deploy/rbac.yaml").Run() - if err != nil { - fmt.Println(err) - } + err = exec.Command("kubectl", "apply", "-f", "../../deploy/rbac.yaml").Run() + Expect(err).To(BeNil()) //Creating Chaos-Operator By("creating operator") - err = exec.Command("kubectl", "create", "-f", "../../deploy/operator.yaml").Run() - if err != nil { - fmt.Println(err) - } + err = exec.Command("kubectl", "apply", "-f", "../../deploy/operator.yaml").Run() + Expect(err).To(BeNil()) fmt.Println("chaos-operator created successfully") @@ -218,9 +202,7 @@ var _ = Describe("BDD on chaos-operator", func() { } _, err = clientSet.ChaosExperiments("litmus").Create(ChaosExperiment) - if err != nil { - fmt.Println(err) - } + Expect(err).To(BeNil()) fmt.Println("ChaosExperiment created successfully...") @@ -256,9 +238,7 @@ var _ = Describe("BDD on chaos-operator", func() { } _, err = clientSet.ChaosEngines("litmus").Create(chaosEngine) - if err != nil { - fmt.Println(err) - } + Expect(err).To(BeNil()) fmt.Println("Chaosengine created successfully...") @@ -271,9 +251,17 @@ var _ = Describe("BDD on chaos-operator", func() { exporter, err := client.CoreV1().Pods("litmus").Get("engine-nginx-monitor", metav1.GetOptions{}) //Check for the Availabilty and status of the runner pod fmt.Println("name : ", runner.Name) + Expect(err).To(BeNil()) Expect(string(runner.Status.Phase)).To(Or(Equal("Running"), Equal("Succeeded"))) Expect(string(exporter.Status.Phase)).To(Equal("Running")) + + // Check for EngineStatus + engine, err := clientSet.ChaosEngines("litmus").Get("engine-nginx", metav1.GetOptions{}) + Expect(err).To(BeNil()) + + isInit := engine.Status.EngineStatus == v1alpha1.EngineStatusInitialized + Expect(isInit).To(BeTrue()) }) }) @@ -282,12 +270,183 @@ var _ = Describe("BDD on chaos-operator", func() { It("Should check for creation of monitor service", func() { _, err := client.CoreV1().Services("litmus").Get("engine-nginx-monitor", metav1.GetOptions{}) + Expect(err).To(BeNil()) + + }) + + }) + Context("Setting the EngineState of ChaosEngine as Stop", func() { + + It("Should delete chaos-resources", func() { + + engine, err := clientSet.ChaosEngines("litmus").Get("engine-nginx", metav1.GetOptions{}) + Expect(err).To(BeNil()) + + // setting the EngineState of chaosEngine to stop + engine.Spec.EngineState = v1alpha1.EngineStateStop + + _, err = clientSet.ChaosEngines("litmus").Update(engine) Expect(err).To(BeNil()) + fmt.Println("Chaosengine updated successfully...") + + //Wait till the creation of runner pod and monitor svc + time.Sleep(50 * time.Second) + + }) + + }) + + Context("Checking Default ChaosResources", func() { + + It("Should delete chaos-runner pod", func() { + + //Fetching engine-nginx-runner pod + _, err := client.CoreV1().Pods("litmus").Get("engine-nginx-runner", metav1.GetOptions{}) + fmt.Printf("%v", err) + isNotFound := errors.IsNotFound(err) + Expect(isNotFound).To(BeTrue()) + fmt.Println("chaos-runner pod deletion verified") + + }) + + It("Should delete chaos-monitor pod ", func() { + + //Fetching engine-nginx-exporter pod + _, err := client.CoreV1().Pods("litmus").Get("engine-nginx-monitor", metav1.GetOptions{}) + fmt.Printf("%v", err) + isNotFound := errors.IsNotFound(err) + Expect(isNotFound).To(BeTrue()) + fmt.Println("chaos-monitor pod deletion verified") + + }) + + It("Should delete chaos-monitor service ", func() { + + //Fetching engine-nginx-exporter pod + _, err := client.CoreV1().Services("litmus").Get("engine-nginx-monitor", metav1.GetOptions{}) + fmt.Printf("%v", err) + isNotFound := errors.IsNotFound(err) + Expect(isNotFound).To(BeTrue()) + fmt.Println("chaos-monitor service deletion verified") + }) + It("Should change the engineStatus ", func() { + + //Fetching engineStatus + engine, err := clientSet.ChaosEngines("litmus").Get("engine-nginx", metav1.GetOptions{}) + Expect(err).To(BeNil()) + + isStopped := engine.Status.EngineStatus == v1alpha1.EngineStatusStopped + Expect(isStopped).To(BeTrue()) + }) }) + + Context("Deletion of ChaosEngine", func() { + + It("Should delete chaos engine", func() { + + err := clientSet.ChaosEngines("litmus").Delete("engine-nginx", &metav1.DeleteOptions{}) + Expect(err).To(BeNil()) + + fmt.Println("chaos engine deleted successfully") + + }) + + }) + + Context("Creation of ChaosEngine with invalid experiment", func() { + + It("Should create invalid chaos engine", func() { + + //Creating chaosEngine + By("Creating ChaosEngine") + chaosEngine := &v1alpha1.ChaosEngine{ + ObjectMeta: metav1.ObjectMeta{ + Name: "engine-nginx", + Namespace: "litmus", + }, + Spec: v1alpha1.ChaosEngineSpec{ + Appinfo: v1alpha1.ApplicationParams{ + Appns: "litmus", + Applabel: "app=nginx", + AppKind: "deployment", + }, + ChaosServiceAccount: "litmus", + Components: v1alpha1.ComponentParams{ + Runner: v1alpha1.RunnerInfo{ + Image: "litmuschaos/chaos-runner:ci", + Type: "go", + }, + }, + JobCleanUpPolicy: "delete", + Monitoring: true, + EngineState: "active", + Experiments: []v1alpha1.ExperimentList{ + { + Name: "pod-delete-1", + }, + }, + }, + } + + _, err := clientSet.ChaosEngines("litmus").Create(chaosEngine) + Expect(err).To(BeNil()) + + time.Sleep(50 * time.Second) + + }) + }) + + Context("Check for Chaos Resources for invalid engine", func() { + + It("Should delete chaos-runner pod", func() { + + //Fetching engine-nginx-runner pod + _, err := client.CoreV1().Pods("litmus").Get("engine-nginx-runner", metav1.GetOptions{}) + fmt.Printf("%v", err) + isNotFound := errors.IsNotFound(err) + Expect(isNotFound).To(BeTrue()) + fmt.Println("chaos-runner pod deletion verified") + + }) + + It("Should delete chaos-monitor pod ", func() { + + //Fetching engine-nginx-exporter pod + _, err := client.CoreV1().Pods("litmus").Get("engine-nginx-monitor", metav1.GetOptions{}) + fmt.Printf("%v", err) + isNotFound := errors.IsNotFound(err) + Expect(isNotFound).To(BeTrue()) + fmt.Println("chaos-monitor pod deletion verified") + + }) + + It("Should delete chaos-monitor service ", func() { + + //Fetching engine-nginx-exporter pod + _, err := client.CoreV1().Services("litmus").Get("engine-nginx-monitor", metav1.GetOptions{}) + fmt.Printf("%v\n", err) + isNotFound := errors.IsNotFound(err) + Expect(isNotFound).To(BeTrue()) + fmt.Println("chaos-monitor service deletion verified") + + }) + + It("Should change EngineStatus ", func() { + + //Fetching engineStatus + engine, err := clientSet.ChaosEngines("litmus").Get("engine-nginx", metav1.GetOptions{}) + Expect(err).To(BeNil()) + + isComplete := engine.Status.EngineStatus == v1alpha1.EngineStatusCompleted + Expect(isComplete).To(BeTrue()) + + }) + }) + }) //Deleting all unused resources From e2b765d55dd2dfac73a4d65d37d74235846f7fdd Mon Sep 17 00:00:00 2001 From: Rahul M Chheda <53308066+rahulchheda@users.noreply.github.com> Date: Thu, 12 Mar 2020 22:26:58 +0530 Subject: [PATCH 4/7] (fix) Added logic to delete resources after Deletion of ChaosEngine in Completed Status (#171) Signed-off-by: Rahul M Chheda --- .../chaosengine/chaosengine_controller.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/pkg/controller/chaosengine/chaosengine_controller.go b/pkg/controller/chaosengine/chaosengine_controller.go index 7628288b0..dd9ecf3c2 100644 --- a/pkg/controller/chaosengine/chaosengine_controller.go +++ b/pkg/controller/chaosengine/chaosengine_controller.go @@ -174,6 +174,7 @@ func (r *ReconcileChaosEngine) Reconcile(request reconcile.Request) (reconcile.R if err := r.updateStatus(engine, litmuschaosv1alpha1.EngineStatusCompleted); err != nil { return reconcile.Result{}, err } + r.recorder.Eventf(engine.Instance, corev1.EventTypeNormal, "ChaosEngineCompleted", "Chaos Engine completed, will delete or retain the resources according to jobCleanUpPolicy") } // Verify that the engineStatus is set to completed, @@ -756,19 +757,14 @@ func checkEngineStatusForComplete(engine *chaosTypes.EngineInfo) bool { } func (r *ReconcileChaosEngine) reconcileForComplete(request reconcile.Request) (reconcile.Result, error) { + deletetimeStamp := engine.Instance.ObjectMeta.GetDeletionTimestamp() + if deletetimeStamp != nil { + return r.reconcileForDelete(request) + } _, err := r.removeDefaultChaosResources(request) if err != nil { return reconcile.Result{}, err } - if engine.Instance.ObjectMeta.Finalizers != nil { - engine.Instance.ObjectMeta.Finalizers = utils.RemoveString(engine.Instance.ObjectMeta.Finalizers, "chaosengine.litmuschaos.io/finalizer") - if engine.Instance.Spec.JobCleanUpPolicy == litmuschaosv1alpha1.CleanUpPolicyDelete { - r.recorder.Eventf(engine.Instance, corev1.EventTypeNormal, "ChaosEngineStopped", "Deleted all experiment resources allocated to ChaosEngine: %v in Namespace: %v", engine.Instance.Name, engine.Instance.Namespace) - } else if engine.Instance.Spec.JobCleanUpPolicy == litmuschaosv1alpha1.CleanUpPolicyRetain { - r.recorder.Eventf(engine.Instance, corev1.EventTypeNormal, "ChaosEngineStopped", "Retained all experiment resources allocated to ChaosEngine: %v in Namespace: %v", engine.Instance.Name, engine.Instance.Namespace) - - } - } err = r.updateState(engine, litmuschaosv1alpha1.EngineStateStop) if err != nil { return reconcile.Result{}, err From 7041e3a9d8ab9975e3380ffac06ce13709a14aa2 Mon Sep 17 00:00:00 2001 From: Karthik Satchitanand Date: Fri, 13 Mar 2020 22:45:07 +0530 Subject: [PATCH 5/7] (chore)notice: add notice file (#167) * (chore)notice: add notice file Signed-off-by: ksatchit --- NOTICE.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 NOTICE.md diff --git a/NOTICE.md b/NOTICE.md new file mode 100644 index 000000000..acb14af20 --- /dev/null +++ b/NOTICE.md @@ -0,0 +1,5 @@ +The source code developed for the LitmusChaos Project is licensed under Apache 2.0. + +However, the LitmusChaos project contains modified subcomponents from other Open Source Projects with separate copyright notices and license terms. + +Your use of the source code for these subcomponents is subject to the terms and conditions as defined by those source projects. From e3746943e2c092b38f93b04a6aae097db2a12e98 Mon Sep 17 00:00:00 2001 From: fossabot Date: Fri, 13 Mar 2020 10:22:07 -0700 Subject: [PATCH 6/7] Add license scan report and status (#154) Signed-off-by: fossabot --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 0b1f21590..1204197f3 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,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) [![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) Litmus chaos operator is used by Kubernetes application developers and SREs to inject chaos into the applications and Kubernetes infrastructure in a managed fashion. Its objective is to make the process of validation and @@ -142,3 +143,7 @@ The Chaos Operator is in _alpha_ stage and needs all the help you can provide! P improving the documentation, contributing to the core framework and tooling, etc. Head over to the [Contribution guide](CONTRIBUTING.md) + + +## License +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Flitmuschaos%2Fchaos-operator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Flitmuschaos%2Fchaos-operator?ref=badge_large) \ No newline at end of file From 6ed44fc4f86e047ca254617ba13ad1b556593f7b Mon Sep 17 00:00:00 2001 From: Chandan Kumar Date: Sat, 14 Mar 2020 00:00:50 +0530 Subject: [PATCH 7/7] (codecov): Add codecov coverage (#173) Signed-off-by: Chandan Kumar --- .circleci/config.yml | 1 + Makefile | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6328ac663..0cc9c7685 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -51,6 +51,7 @@ jobs: - run: make test - run: | docker save -o workspace/image.tar ${REPONAME}/${IMGNAME}:${IMGTAG} + - run: bash <(curl -s https://codecov.io/bash) -vz - persist_to_workspace: root: workspace paths: diff --git a/Makefile b/Makefile index 21ca639e8..94f15369d 100644 --- a/Makefile +++ b/Makefile @@ -75,7 +75,7 @@ test: @echo "------------------" @echo "--> Run Go Test" @echo "------------------" - @go test ./... -v + @go test ./... -coverprofile=coverage.txt -covermode=atomic -v .PHONY: dockerops dockerops: