Skip to content

Commit

Permalink
(refactor) Changed scope of EngineInfo structure from Global to Local (
Browse files Browse the repository at this point in the history
…#179)

* Replaced global engine Varible with local variable
* - Fixed the local variable issues
    - Added Chaos-operator Logs in BDD test
* Introduce Patch for deletion of chaosengine

Signed-off-by: Rahul M Chheda <[email protected]>
  • Loading branch information
rahulchheda committed May 8, 2020
1 parent 7901608 commit ecbcef9
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 46 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ build/_output
*.swp
*.orig
.idea/
coverage.txt
19 changes: 13 additions & 6 deletions pkg/apis/litmuschaos/v1alpha1/chaosengine_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,22 @@ const (
EngineStateStop EngineState = "stop"
)

// ExperimentStatus is typecasted to string for supporting the values below.
type ExperimentStatus string

const (
ExperimentStatusRunning ExperimentStatus = "Running"
ExperimentStatusCompleted ExperimentStatus = "Completed"
ExperimentStatusWaiting ExperimentStatus = "Waiting for Job Creation"
ExperimentStatusNotFound ExperimentStatus = "ChaosExperiment Not Found"
// ExperimentStatusRunning is status of Experiment which is currently running
ExperimentStatusRunning ExperimentStatus = "Running"
// ExperimentStatusCompleted is status of Experiment which has been completed
ExperimentStatusCompleted ExperimentStatus = "Completed"
// ExperimentStatusWaiting is status of Experiment which will be executed via a Job
ExperimentStatusWaiting ExperimentStatus = "Waiting for Job Creation"
// ExperimentStatusNotFound is status of Experiment which is not found inside ChaosNamespace
ExperimentStatusNotFound ExperimentStatus = "ChaosExperiment Not Found"
// ExperimentStatusSuccessful is status of a Successful experiment execution
ExperimentStatusSuccessful ExperimentStatus = "Execution Successful"
ExperimentStatusAborted ExperimentStatus = "Forcefully Aborted"
// ExperimentStatusAborted is status of a Experiment is forcefully aborted
ExperimentStatusAborted ExperimentStatus = "Forcefully Aborted"
)

// EngineStatus provides interface for all supported strings in status.EngineStatus
Expand Down Expand Up @@ -95,7 +102,7 @@ const (

// ChaosEngineStatus derives information about status of individual experiments
type ChaosEngineStatus struct {
//
//EngineStatus is a typed string to support limited values for ChaosEngine Status
EngineStatus EngineStatus `json:"engineStatus"`
//Detailed status of individual experiments
Experiments []ExperimentStatuses `json:"experiments"`
Expand Down
42 changes: 19 additions & 23 deletions pkg/controller/chaosengine/chaosengine_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,6 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
return nil
}

var engine *chaosTypes.EngineInfo

// watchSecondaryResources watch's for changes in chaos resources
func watchChaosResources(clientSet client.Client, c controller.Controller) error {
// Watch for Primary Chaos Resource
Expand All @@ -125,8 +123,8 @@ func watchChaosResources(clientSet client.Client, c controller.Controller) error
// Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
func (r *ReconcileChaosEngine) Reconcile(request reconcile.Request) (reconcile.Result, error) {
reqLogger := startReqLogger(request)

err := r.getChaosEngineInstance(request)
engine := &chaosTypes.EngineInfo{}
err := r.getChaosEngineInstance(engine, request)
if err != nil {
if k8serrors.IsNotFound(err) {
// Request object not found, could have been deleted after reconcile request.
Expand All @@ -139,7 +137,7 @@ func (r *ReconcileChaosEngine) Reconcile(request reconcile.Request) (reconcile.R

//Handle deletion of Chaos Engine
if engine.Instance.ObjectMeta.GetDeletionTimestamp() != nil {
return r.reconcileForDelete(request)
return r.reconcileForDelete(engine, request)
}

// Start the reconcile by setting default values into Chaos Engine
Expand All @@ -154,17 +152,17 @@ func (r *ReconcileChaosEngine) Reconcile(request reconcile.Request) (reconcile.R

// Handling Graceful completion of Chaos Engine
if engine.Instance.Spec.EngineState == litmuschaosv1alpha1.EngineStateStop && engine.Instance.Status.EngineStatus == litmuschaosv1alpha1.EngineStatusCompleted {
return r.reconcileForComplete(request)
return r.reconcileForComplete(engine, request)
}

// Handling forceful Abort of Chaos Engine
if engine.Instance.Spec.EngineState == litmuschaosv1alpha1.EngineStateStop && engine.Instance.Status.EngineStatus != litmuschaosv1alpha1.EngineStatusCompleted {
return r.reconcileForDelete(request)
return r.reconcileForDelete(engine, request)
}

// Handling restarting of Chaos Engine
if engine.Instance.Spec.EngineState == litmuschaosv1alpha1.EngineStateActive && (engine.Instance.Status.EngineStatus == litmuschaosv1alpha1.EngineStatusCompleted || engine.Instance.Status.EngineStatus == litmuschaosv1alpha1.EngineStatusStopped) {
return r.reconcileForRestart(request)
return r.reconcileForRestart(engine, request)
}

return reconcile.Result{}, nil
Expand Down Expand Up @@ -319,16 +317,14 @@ func engineRunnerPod(runnerPod *podEngineRunner) error {
}

// Fetch the ChaosEngine instance
func (r *ReconcileChaosEngine) getChaosEngineInstance(request reconcile.Request) error {
func (r *ReconcileChaosEngine) getChaosEngineInstance(engine *chaosTypes.EngineInfo, request reconcile.Request) error {
instance := &litmuschaosv1alpha1.ChaosEngine{}
err := r.client.Get(context.TODO(), request.NamespacedName, instance)
if err != nil {
// Error reading the object - requeue the request.
return err
}
engine = &chaosTypes.EngineInfo{
Instance: instance,
}
engine.Instance = instance
return nil
}

Expand Down Expand Up @@ -396,7 +392,7 @@ func (r *ReconcileChaosEngine) checkEngineRunnerPod(engine *chaosTypes.EngineInf
//setChaosResourceImage take the runner image from engine spec
//if it is not there then it will take from chaos-operator env
//at last if it is not able to find image in engine spec and operator env then it will take default images
func setChaosResourceImage() {
func setChaosResourceImage(engine *chaosTypes.EngineInfo) {

ChaosRunnerImage := os.Getenv("CHAOS_RUNNER_IMAGE")

Expand All @@ -408,7 +404,7 @@ func setChaosResourceImage() {
}

// getAnnotationCheck() checks for annotation on the application
func getAnnotationCheck() error {
func getAnnotationCheck(engine *chaosTypes.EngineInfo) error {

if engine.Instance.Spec.AnnotationCheck == "" {
engine.Instance.Spec.AnnotationCheck = chaosTypes.DefaultAnnotationCheck
Expand All @@ -421,13 +417,13 @@ func getAnnotationCheck() error {
}

// reconcileForDelete reconciles for deletion/force deletion of Chaos Engine
func (r *ReconcileChaosEngine) reconcileForDelete(request reconcile.Request) (reconcile.Result, error) {
func (r *ReconcileChaosEngine) reconcileForDelete(engine *chaosTypes.EngineInfo, request reconcile.Request) (reconcile.Result, error) {
err := r.forceRemoveChaosResources(engine, request)
if err != nil {
r.recorder.Eventf(engine.Instance, corev1.EventTypeWarning, "ChaosResourcesOperationFailed", "Unable to delete chaos resources")
return reconcile.Result{}, err
}
opts := client.UpdateOptions{}
patch := client.MergeFrom(engine.Instance.DeepCopy())

if engine.Instance.ObjectMeta.Finalizers != nil {
engine.Instance.ObjectMeta.Finalizers = utils.RemoveString(engine.Instance.ObjectMeta.Finalizers, "chaosengine.litmuschaos.io/finalizer")
Expand All @@ -437,7 +433,7 @@ func (r *ReconcileChaosEngine) reconcileForDelete(request reconcile.Request) (re
updateExperimentStatusesForStop(engine)
engine.Instance.Status.EngineStatus = litmuschaosv1alpha1.EngineStatusStopped

if err := r.client.Update(context.TODO(), engine.Instance, &opts); err != nil {
if err := r.client.Patch(context.TODO(), engine.Instance, patch); err != nil {
r.recorder.Eventf(engine.Instance, corev1.EventTypeWarning, "ChaosResourcesOperationFailed", "Unable to update chaosengine")
return reconcile.Result{}, fmt.Errorf("Unable to remove Finalizer from chaosEngine Resource, due to error: %v", err)
}
Expand Down Expand Up @@ -492,7 +488,7 @@ func (r *ReconcileChaosEngine) checkRunnerPodCompletedStatus(engine *chaosTypes.
}

// gracefullyRemoveDefaultChaosResources removes all chaos-resources gracefully
func (r *ReconcileChaosEngine) gracefullyRemoveDefaultChaosResources(request reconcile.Request) (reconcile.Result, error) {
func (r *ReconcileChaosEngine) gracefullyRemoveDefaultChaosResources(engine *chaosTypes.EngineInfo, request reconcile.Request) (reconcile.Result, error) {

if engine.Instance.Spec.JobCleanUpPolicy == litmuschaosv1alpha1.CleanUpPolicyDelete {
if err := r.gracefullyRemoveChaosPods(engine, request); err != nil {
Expand Down Expand Up @@ -521,9 +517,9 @@ func (r *ReconcileChaosEngine) gracefullyRemoveChaosPods(engine *chaosTypes.Engi
}

// reconcileForComplete reconciles for graceful completion of Chaos Engine
func (r *ReconcileChaosEngine) reconcileForComplete(request reconcile.Request) (reconcile.Result, error) {
func (r *ReconcileChaosEngine) reconcileForComplete(engine *chaosTypes.EngineInfo, request reconcile.Request) (reconcile.Result, error) {

_, err := r.gracefullyRemoveDefaultChaosResources(request)
_, err := r.gracefullyRemoveDefaultChaosResources(engine, request)
if err != nil {
r.recorder.Eventf(engine.Instance, corev1.EventTypeWarning, "ChaosResourcesOperationFailed", "Unable to delete chaos resources")
return reconcile.Result{}, err
Expand All @@ -537,7 +533,7 @@ func (r *ReconcileChaosEngine) reconcileForComplete(request reconcile.Request) (
}

// reconcileForRestart reconciles for restart of Chaos Engine
func (r *ReconcileChaosEngine) reconcileForRestart(request reconcile.Request) (reconcile.Result, error) {
func (r *ReconcileChaosEngine) reconcileForRestart(engine *chaosTypes.EngineInfo, request reconcile.Request) (reconcile.Result, error) {
err := r.forceRemoveChaosResources(engine, request)
if err != nil {
return reconcile.Result{}, err
Expand Down Expand Up @@ -614,10 +610,10 @@ func startReqLogger(request reconcile.Request) logr.Logger {

func (r *ReconcileChaosEngine) validateAnnontatedApplication(engine *chaosTypes.EngineInfo) error {
// Get the image for runner pod from chaosengine spec,operator env or default values.
setChaosResourceImage()
setChaosResourceImage(engine)

//getAnnotationCheck fetch the annotationCheck from engine spec
err := getAnnotationCheck()
err := getAnnotationCheck(engine)
if err != nil {
return err
}
Expand Down
3 changes: 2 additions & 1 deletion pkg/controller/resource/deploymentconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ var (
Resource: "deploymentconfigs",
}
)
// CheckDeploymentAnnotation will check the annotation of deployment

// CheckDeploymentConfigAnnotation will check the annotation of deployment
func CheckDeploymentConfigAnnotation(clientSet dynamic.Interface, engine *chaosTypes.EngineInfo) (*chaosTypes.EngineInfo, error) {

deploymentConfigList, err := getDeploymentConfigList(clientSet, engine)
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/resource/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ import (
"os"
"strings"

dynamic "github.com/litmuschaos/chaos-operator/pkg/dynamic"
chaosTypes "github.com/litmuschaos/chaos-operator/pkg/controller/types"
dynamic "github.com/litmuschaos/chaos-operator/pkg/dynamic"
k8s "github.com/litmuschaos/chaos-operator/pkg/kubernetes"
)

Expand Down
5 changes: 3 additions & 2 deletions pkg/dynamic/dynamic.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client/config"
)

func CreateClientSet() (*dynamic.Interface, error){
// CreateClientSet returns a Dynamic Kubernetes ClientSet
func CreateClientSet() (*dynamic.Interface, error) {
restConfig, err := config.GetConfig()
if err != nil {
return nil, err
Expand All @@ -15,4 +16,4 @@ func CreateClientSet() (*dynamic.Interface, error){
return nil, err
}
return &clientSet, nil
}
}
Loading

0 comments on commit ecbcef9

Please sign in to comment.