From f1ee747999bb1aecff788020a3b4429dfd0bb40e Mon Sep 17 00:00:00 2001 From: Ahmed ElSayed Date: Thu, 21 Jan 2021 13:24:10 -0800 Subject: [PATCH 1/6] Emit kubernetes events from KEDA Signed-off-by: Ahmed ElSayed --- CHANGELOG.md | 1 + adapter/main.go | 7 ++- controllers/scaledjob_controller.go | 9 +++- controllers/scaledjob_finalizer.go | 4 ++ controllers/scaledobject_controller.go | 9 +++- controllers/scaledobject_finalizer.go | 4 ++ go.sum | 1 + main.go | 2 + pkg/eventreason/eventreason.go | 52 +++++++++++++++++++++ pkg/scaling/executor/scale_executor.go | 6 ++- pkg/scaling/executor/scale_jobs.go | 3 ++ pkg/scaling/executor/scale_scaledobjects.go | 11 ++++- pkg/scaling/scale_handler.go | 13 +++++- 13 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 pkg/eventreason/eventreason.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 79f9a6160c6..7ff7033dcc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ - Global authentication credentials can be managed using `ClusterTriggerAuthentication` objects ([#1452](https://github.com/kedacore/keda/pull/1452)) - Introducing OpenStack Swift scaler ([#1342](https://github.com/kedacore/keda/issues/1342)) - Introducing MongoDB scaler ([#1467](https://github.com/kedacore/keda/pull/1467)) +- Emit Kubernetes Events on KEDA events ([#1523]()) ### Improvements diff --git a/adapter/main.go b/adapter/main.go index 655163fa968..a7103c050b2 100644 --- a/adapter/main.go +++ b/adapter/main.go @@ -8,6 +8,9 @@ import ( "strconv" "time" + corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/tools/record" + appsv1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/util/wait" openapinamer "k8s.io/apiserver/pkg/endpoints/openapi" @@ -70,7 +73,9 @@ func (a *Adapter) makeProvider(globalHTTPTimeout time.Duration) (provider.Metric return nil, fmt.Errorf("unable to construct new client (%s)", err) } - handler := scaling.NewScaleHandler(kubeclient, nil, scheme, globalHTTPTimeout) + broadcaster := record.NewBroadcaster() + recorder := broadcaster.NewRecorder(scheme, corev1.EventSource{Component: "keda-metrics-adapter"}) + handler := scaling.NewScaleHandler(kubeclient, nil, scheme, globalHTTPTimeout, recorder) namespace, err := getWatchNamespace() if err != nil { diff --git a/controllers/scaledjob_controller.go b/controllers/scaledjob_controller.go index 8585137b6e0..568509ebaed 100644 --- a/controllers/scaledjob_controller.go +++ b/controllers/scaledjob_controller.go @@ -5,6 +5,10 @@ import ( "fmt" "time" + "github.com/kedacore/keda/v2/pkg/eventreason" + corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/tools/record" + "github.com/go-logr/logr" batchv1 "k8s.io/api/batch/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -29,12 +33,13 @@ type ScaledJobReconciler struct { Log logr.Logger Scheme *runtime.Scheme GlobalHTTPTimeout time.Duration + Recorder record.EventRecorder scaleHandler scaling.ScaleHandler } // SetupWithManager initializes the ScaledJobReconciler instance and starts a new controller managed by the passed Manager instance. func (r *ScaledJobReconciler) SetupWithManager(mgr ctrl.Manager) error { - r.scaleHandler = scaling.NewScaleHandler(mgr.GetClient(), nil, mgr.GetScheme(), r.GlobalHTTPTimeout) + r.scaleHandler = scaling.NewScaleHandler(mgr.GetClient(), nil, mgr.GetScheme(), r.GlobalHTTPTimeout, mgr.GetEventRecorderFor("scale-handler")) return ctrl.NewControllerManagedBy(mgr). // Ignore updates to ScaledJob Status (in this case metadata.Generation does not change) @@ -84,9 +89,11 @@ func (r *ScaledJobReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { reqLogger.Error(err, msg) conditions.SetReadyCondition(metav1.ConditionFalse, "ScaledJobCheckFailed", msg) conditions.SetActiveCondition(metav1.ConditionUnknown, "UnknownState", "ScaledJob check failed") + r.Recorder.Event(scaledJob, corev1.EventTypeWarning, eventreason.CheckFailed, msg) } else { reqLogger.V(1).Info(msg) conditions.SetReadyCondition(metav1.ConditionTrue, "ScaledJobReady", msg) + r.Recorder.Event(scaledJob, corev1.EventTypeNormal, eventreason.Ready, msg) } return ctrl.Result{}, err diff --git a/controllers/scaledjob_finalizer.go b/controllers/scaledjob_finalizer.go index aa0ca78c7a6..60646af2060 100644 --- a/controllers/scaledjob_finalizer.go +++ b/controllers/scaledjob_finalizer.go @@ -3,6 +3,9 @@ package controllers import ( "context" + "github.com/kedacore/keda/v2/pkg/eventreason" + corev1 "k8s.io/api/core/v1" + "github.com/go-logr/logr" kedav1alpha1 "github.com/kedacore/keda/v2/api/v1alpha1" @@ -33,6 +36,7 @@ func (r *ScaledJobReconciler) finalizeScaledJob(logger logr.Logger, scaledJob *k } logger.Info("Successfully finalized ScaledJob") + r.Recorder.Event(scaledJob, corev1.EventTypeNormal, eventreason.Deleted, "ScaledJob was deleted") return nil } diff --git a/controllers/scaledobject_controller.go b/controllers/scaledobject_controller.go index a308b8d9955..7b65406b99c 100644 --- a/controllers/scaledobject_controller.go +++ b/controllers/scaledobject_controller.go @@ -6,6 +6,10 @@ import ( "sync" "time" + "github.com/kedacore/keda/v2/pkg/eventreason" + corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/tools/record" + "github.com/go-logr/logr" autoscalingv1 "k8s.io/api/autoscaling/v1" autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2" @@ -46,6 +50,7 @@ type ScaledObjectReconciler struct { Client client.Client Scheme *runtime.Scheme GlobalHTTPTimeout time.Duration + Recorder record.EventRecorder scaleClient *scale.ScalesGetter restMapper meta.RESTMapper @@ -91,7 +96,7 @@ func (r *ScaledObjectReconciler) SetupWithManager(mgr ctrl.Manager) error { // Init the rest of ScaledObjectReconciler r.restMapper = mgr.GetRESTMapper() r.scaledObjectsGenerations = &sync.Map{} - r.scaleHandler = scaling.NewScaleHandler(mgr.GetClient(), r.scaleClient, mgr.GetScheme(), r.GlobalHTTPTimeout) + r.scaleHandler = scaling.NewScaleHandler(mgr.GetClient(), r.scaleClient, mgr.GetScheme(), r.GlobalHTTPTimeout, mgr.GetEventRecorderFor("scale-handler")) // Start controller return ctrl.NewControllerManagedBy(mgr). @@ -159,9 +164,11 @@ func (r *ScaledObjectReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error reqLogger.Error(err, msg) conditions.SetReadyCondition(metav1.ConditionFalse, "ScaledObjectCheckFailed", msg) conditions.SetActiveCondition(metav1.ConditionUnknown, "UnkownState", "ScaledObject check failed") + r.Recorder.Event(scaledObject, corev1.EventTypeWarning, eventreason.CheckFailed, msg) } else { reqLogger.V(1).Info(msg) conditions.SetReadyCondition(metav1.ConditionTrue, "ScaledObjectReady", msg) + r.Recorder.Event(scaledObject, corev1.EventTypeNormal, eventreason.Ready, msg) } if err := kedacontrollerutil.SetStatusConditions(r.Client, reqLogger, scaledObject, &conditions); err != nil { return ctrl.Result{}, err diff --git a/controllers/scaledobject_finalizer.go b/controllers/scaledobject_finalizer.go index 778ee67ee25..19ba28b46c1 100644 --- a/controllers/scaledobject_finalizer.go +++ b/controllers/scaledobject_finalizer.go @@ -3,6 +3,9 @@ package controllers import ( "context" + "github.com/kedacore/keda/v2/pkg/eventreason" + corev1 "k8s.io/api/core/v1" + "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -54,6 +57,7 @@ func (r *ScaledObjectReconciler) finalizeScaledObject(logger logr.Logger, scaled } logger.Info("Successfully finalized ScaledObject") + r.Recorder.Event(scaledObject, corev1.EventTypeNormal, eventreason.Deleted, "ScaledObject was deleted") return nil } diff --git a/go.sum b/go.sum index b2a877794fa..e9d1d2de36c 100644 --- a/go.sum +++ b/go.sum @@ -958,6 +958,7 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kedacore/keda v1.5.0 h1:c8xA1Vo3H7rPwFiWUX3CBXnjBSrbYDmUs9iEfDlf4bQ= github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= diff --git a/main.go b/main.go index 40f66988efe..47e78f3d1f4 100644 --- a/main.go +++ b/main.go @@ -129,6 +129,7 @@ func main() { Log: ctrl.Log.WithName("controllers").WithName("ScaledObject"), Scheme: mgr.GetScheme(), GlobalHTTPTimeout: globalHTTPTimeout, + Recorder: mgr.GetEventRecorderFor("scaledobject-controller"), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScaledObject") os.Exit(1) @@ -138,6 +139,7 @@ func main() { Log: ctrl.Log.WithName("controllers").WithName("ScaledJob"), Scheme: mgr.GetScheme(), GlobalHTTPTimeout: globalHTTPTimeout, + Recorder: mgr.GetEventRecorderFor("scaledjob-controller"), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScaledJob") os.Exit(1) diff --git a/pkg/eventreason/eventreason.go b/pkg/eventreason/eventreason.go new file mode 100644 index 00000000000..4adb1f690ae --- /dev/null +++ b/pkg/eventreason/eventreason.go @@ -0,0 +1,52 @@ +/* +Copyright 2020 The KEDA 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 eventreason + +const ( + // Ready is for event when ScaledObject or ScaledJob is ready + Ready = "Ready" + + // CheckFailed is for event when ScaledObject or ScaledJob validation check failed + CheckFailed = "CheckFailed" + + // Deleted is for event when ScaledObject or ScaledJob is deleted + Deleted = "Deleted" + + // ScalersStarted is for event when scalers watch started for ScaledObject or ScaledJob + ScalersStarted = "ScalersStarted" + + // ScalersRestarted is for event when scalers watch was restarted for ScaledObject or ScaledJob + ScalersRestarted = "ScalersRestarted" + + // ScalersStopped is for event when scalers watch was stopped for ScaledObject or ScaledJob + ScalersStopped = "ScalersStopped" + + // ScaleTargetActivated is for event when the scale target of ScaledObject was activated + ScaleTargetActivated = "ScaleTargetActivated" + + // ScaleTargetDeactivated is for event when the scale target for ScaledObject was deactivated + ScaleTargetDeactivated = "ScaleTargetDeactivated" + + // ScaleTargetActivationFailed is for event when the activation the scale target for ScaledObject fails + ScaleTargetActivationFailed = "ScaleTargetActivationFailed" + + // ScaleTargetDeactivationFailed is for event when the deactivation of the scale target for ScaledObject fails + ScaleTargetDeactivationFailed = "ScaleTargetDeactivationFailed" + + // JobsCreated is for event when jobs for ScaledJob are created + JobsCreated = "JobsCreated" +) diff --git a/pkg/scaling/executor/scale_executor.go b/pkg/scaling/executor/scale_executor.go index 4a703afe8d8..b8fd1d144ed 100644 --- a/pkg/scaling/executor/scale_executor.go +++ b/pkg/scaling/executor/scale_executor.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "k8s.io/client-go/tools/record" + "github.com/go-logr/logr" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -30,15 +32,17 @@ type scaleExecutor struct { scaleClient *scale.ScalesGetter reconcilerScheme *runtime.Scheme logger logr.Logger + recorder record.EventRecorder } // NewScaleExecutor creates a ScaleExecutor object -func NewScaleExecutor(client client.Client, scaleClient *scale.ScalesGetter, reconcilerScheme *runtime.Scheme) ScaleExecutor { +func NewScaleExecutor(client client.Client, scaleClient *scale.ScalesGetter, reconcilerScheme *runtime.Scheme, recorder record.EventRecorder) ScaleExecutor { return &scaleExecutor{ client: client, scaleClient: scaleClient, reconcilerScheme: reconcilerScheme, logger: logf.Log.WithName("scaleexecutor"), + recorder: recorder, } } diff --git a/pkg/scaling/executor/scale_jobs.go b/pkg/scaling/executor/scale_jobs.go index 43c72272ee5..bdd5e7b1060 100644 --- a/pkg/scaling/executor/scale_jobs.go +++ b/pkg/scaling/executor/scale_jobs.go @@ -5,6 +5,8 @@ import ( "sort" "strconv" + "github.com/kedacore/keda/v2/pkg/eventreason" + "github.com/go-logr/logr" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" @@ -108,6 +110,7 @@ func (e *scaleExecutor) createJobs(logger logr.Logger, scaledJob *kedav1alpha1.S } } logger.Info("Created jobs", "Number of jobs", scaleTo) + e.recorder.Eventf(scaledJob, corev1.EventTypeNormal, eventreason.JobsCreated, "Created %d jobs", scaleTo) } func (e *scaleExecutor) isJobFinished(j *batchv1.Job) bool { diff --git a/pkg/scaling/executor/scale_scaledobjects.go b/pkg/scaling/executor/scale_scaledobjects.go index 6e4a5c1cc4b..d6772020151 100644 --- a/pkg/scaling/executor/scale_scaledobjects.go +++ b/pkg/scaling/executor/scale_scaledobjects.go @@ -4,6 +4,9 @@ import ( "context" "time" + "github.com/kedacore/keda/v2/pkg/eventreason" + corev1 "k8s.io/api/core/v1" + "github.com/go-logr/logr" appsv1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" @@ -121,13 +124,16 @@ func (e *scaleExecutor) scaleToZero(ctx context.Context, logger logr.Logger, sca if scaledObject.Status.LastActiveTime == nil || scaledObject.Status.LastActiveTime.Add(cooldownPeriod).Before(time.Now()) { // or last time a trigger was active was > cooldown period, so scale down. - _, err := e.updateScaleOnScaleTarget(ctx, scaledObject, scale, 0) + currentReplicas, err := e.updateScaleOnScaleTarget(ctx, scaledObject, scale, 0) if err == nil { logger.Info("Successfully scaled ScaleTarget to 0 replicas") + e.recorder.Eventf(scaledObject, corev1.EventTypeNormal, eventreason.ScaleTargetDeactivated, "Deactivated %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, 0) if err := e.setActiveCondition(ctx, logger, scaledObject, metav1.ConditionFalse, "ScalerNotActive", "Scaling is not performed because triggers are not active"); err != nil { logger.Error(err, "Error in setting active condition") return } + } else { + e.recorder.Eventf(scaledObject, corev1.EventTypeWarning, eventreason.ScaleTargetDeactivationFailed, "Failed to deactivated %s %s/%s", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, 0) } } else { logger.V(1).Info("ScaleTarget cooling down", @@ -158,12 +164,15 @@ func (e *scaleExecutor) scaleFromZero(ctx context.Context, logger logr.Logger, s logger.Info("Successfully updated ScaleTarget", "Original Replicas Count", currentReplicas, "New Replicas Count", replicas) + e.recorder.Eventf(scaledObject, corev1.EventTypeNormal, eventreason.ScaleTargetActivated, "Scaled %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, replicas) // Scale was successful. Update lastScaleTime and lastActiveTime on the scaledObject if err := e.updateLastActiveTime(ctx, logger, scaledObject); err != nil { logger.Error(err, "Error in Updating lastScaleTime and lastActiveTime on the scaledObject") return } + } else { + e.recorder.Eventf(scaledObject, corev1.EventTypeWarning, eventreason.ScaleTargetActivationFailed, "Failed to scaled %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, replicas) } } diff --git a/pkg/scaling/scale_handler.go b/pkg/scaling/scale_handler.go index fc18381f2f6..3423cf3f371 100644 --- a/pkg/scaling/scale_handler.go +++ b/pkg/scaling/scale_handler.go @@ -6,6 +6,9 @@ import ( "sync" "time" + "github.com/kedacore/keda/v2/pkg/eventreason" + "k8s.io/client-go/tools/record" + "github.com/go-logr/logr" appsv1 "k8s.io/api/apps/v1" "k8s.io/api/autoscaling/v2beta2" @@ -44,16 +47,18 @@ type scaleHandler struct { scaleLoopContexts *sync.Map scaleExecutor executor.ScaleExecutor globalHTTPTimeout time.Duration + recorder record.EventRecorder } // NewScaleHandler creates a ScaleHandler object -func NewScaleHandler(client client.Client, scaleClient *scale.ScalesGetter, reconcilerScheme *runtime.Scheme, globalHTTPTimeout time.Duration) ScaleHandler { +func NewScaleHandler(client client.Client, scaleClient *scale.ScalesGetter, reconcilerScheme *runtime.Scheme, globalHTTPTimeout time.Duration, recorder record.EventRecorder) ScaleHandler { return &scaleHandler{ client: client, logger: logf.Log.WithName("scalehandler"), scaleLoopContexts: &sync.Map{}, - scaleExecutor: executor.NewScaleExecutor(client, scaleClient, reconcilerScheme), + scaleExecutor: executor.NewScaleExecutor(client, scaleClient, reconcilerScheme, recorder), globalHTTPTimeout: globalHTTPTimeout, + recorder: recorder, } } @@ -90,6 +95,9 @@ func (h *scaleHandler) HandleScalableObject(scalableObject interface{}) error { cancelValue() } h.scaleLoopContexts.Store(key, cancel) + h.recorder.Event(withTriggers, corev1.EventTypeNormal, eventreason.ScalersRestarted, "Restarted scalers watch") + } else { + h.recorder.Event(withTriggers, corev1.EventTypeNormal, eventreason.ScalersStarted, "Started scalers watch") } // a mutex is used to synchronize scale requests per scalableObject @@ -115,6 +123,7 @@ func (h *scaleHandler) DeleteScalableObject(scalableObject interface{}) error { cancel() } h.scaleLoopContexts.Delete(key) + h.recorder.Event(withTriggers, corev1.EventTypeNormal, eventreason.ScalersStopped, "Stopped scalers watch") } else { h.logger.V(1).Info("ScaleObject was not found in controller cache", "key", key) } From 2872b99f62738433d1b4636d04d819b90676726f Mon Sep 17 00:00:00 2001 From: Ahmed ElSayed Date: Fri, 29 Jan 2021 11:43:51 -0800 Subject: [PATCH 2/6] CR comments Signed-off-by: Ahmed ElSayed --- CHANGELOG.md | 2 +- api/v1alpha1/condition_types.go | 7 +++ controllers/scaledjob_controller.go | 11 ++-- controllers/scaledjob_finalizer.go | 2 +- controllers/scaledobject_controller.go | 11 +++- controllers/scaledobject_finalizer.go | 2 +- .../triggerauthentication_controller.go | 55 +++++++++++++++++++ main.go | 12 +++- pkg/eventreason/eventreason.go | 49 +++++++++++------ pkg/scaling/executor/scale_jobs.go | 2 +- pkg/scaling/executor/scale_scaledobjects.go | 8 +-- pkg/scaling/scale_handler.go | 12 ++-- 12 files changed, 134 insertions(+), 39 deletions(-) create mode 100644 controllers/triggerauthentication_controller.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ff7033dcc8..0dc55f31dec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,7 +43,7 @@ - Global authentication credentials can be managed using `ClusterTriggerAuthentication` objects ([#1452](https://github.com/kedacore/keda/pull/1452)) - Introducing OpenStack Swift scaler ([#1342](https://github.com/kedacore/keda/issues/1342)) - Introducing MongoDB scaler ([#1467](https://github.com/kedacore/keda/pull/1467)) -- Emit Kubernetes Events on KEDA events ([#1523]()) +- Emit Kubernetes Events on KEDA events ([#1523](https://github.com/kedacore/keda/pull/1523)):wq ### Improvements diff --git a/api/v1alpha1/condition_types.go b/api/v1alpha1/condition_types.go index 823a7893e50..b33d65acd99 100644 --- a/api/v1alpha1/condition_types.go +++ b/api/v1alpha1/condition_types.go @@ -115,6 +115,13 @@ func (c *Conditions) GetActiveCondition() Condition { return c.getCondition(ConditionActive) } +func (c *Conditions) GetReadyCondition() Condition { + if *c == nil { + c = GetInitializedConditions() + } + return c.getCondition(ConditionReady) +} + func (c Conditions) getCondition(conditionType ConditionType) Condition { for i := range c { if c[i].Type == conditionType { diff --git a/controllers/scaledjob_controller.go b/controllers/scaledjob_controller.go index 568509ebaed..ed031292a33 100644 --- a/controllers/scaledjob_controller.go +++ b/controllers/scaledjob_controller.go @@ -3,10 +3,10 @@ package controllers import ( "context" "fmt" - "time" - "github.com/kedacore/keda/v2/pkg/eventreason" corev1 "k8s.io/api/core/v1" + "time" + "k8s.io/client-go/tools/record" "github.com/go-logr/logr" @@ -89,11 +89,14 @@ func (r *ScaledJobReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { reqLogger.Error(err, msg) conditions.SetReadyCondition(metav1.ConditionFalse, "ScaledJobCheckFailed", msg) conditions.SetActiveCondition(metav1.ConditionUnknown, "UnknownState", "ScaledJob check failed") - r.Recorder.Event(scaledJob, corev1.EventTypeWarning, eventreason.CheckFailed, msg) + r.Recorder.Event(scaledJob, corev1.EventTypeWarning, eventreason.ScaledJobCheckFailed, msg) } else { + wasReady := conditions.GetReadyCondition() + if wasReady.IsFalse() || wasReady.IsUnknown() { + r.Recorder.Event(scaledJob, corev1.EventTypeNormal, eventreason.ScaledJobReady, "ScaledJob is ready for scaling") + } reqLogger.V(1).Info(msg) conditions.SetReadyCondition(metav1.ConditionTrue, "ScaledJobReady", msg) - r.Recorder.Event(scaledJob, corev1.EventTypeNormal, eventreason.Ready, msg) } return ctrl.Result{}, err diff --git a/controllers/scaledjob_finalizer.go b/controllers/scaledjob_finalizer.go index 60646af2060..a31ba4669f8 100644 --- a/controllers/scaledjob_finalizer.go +++ b/controllers/scaledjob_finalizer.go @@ -36,7 +36,7 @@ func (r *ScaledJobReconciler) finalizeScaledJob(logger logr.Logger, scaledJob *k } logger.Info("Successfully finalized ScaledJob") - r.Recorder.Event(scaledJob, corev1.EventTypeNormal, eventreason.Deleted, "ScaledJob was deleted") + r.Recorder.Event(scaledJob, corev1.EventTypeNormal, eventreason.ScaledJobDeleted, "ScaledJob was deleted") return nil } diff --git a/controllers/scaledobject_controller.go b/controllers/scaledobject_controller.go index 7b65406b99c..a25cbccf216 100644 --- a/controllers/scaledobject_controller.go +++ b/controllers/scaledobject_controller.go @@ -50,7 +50,7 @@ type ScaledObjectReconciler struct { Client client.Client Scheme *runtime.Scheme GlobalHTTPTimeout time.Duration - Recorder record.EventRecorder + Recorder record.EventRecorder scaleClient *scale.ScalesGetter restMapper meta.RESTMapper @@ -164,15 +164,20 @@ func (r *ScaledObjectReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error reqLogger.Error(err, msg) conditions.SetReadyCondition(metav1.ConditionFalse, "ScaledObjectCheckFailed", msg) conditions.SetActiveCondition(metav1.ConditionUnknown, "UnkownState", "ScaledObject check failed") - r.Recorder.Event(scaledObject, corev1.EventTypeWarning, eventreason.CheckFailed, msg) + r.Recorder.Event(scaledObject, corev1.EventTypeWarning, eventreason.ScaledObjectCheckFailed, msg) } else { + wasReady := conditions.GetReadyCondition() + if wasReady.IsFalse() || wasReady.IsUnknown() { + r.Recorder.Event(scaledObject, corev1.EventTypeNormal, eventreason.ScaledObjectReady, "ScaledObject is ready for scaling") + } reqLogger.V(1).Info(msg) conditions.SetReadyCondition(metav1.ConditionTrue, "ScaledObjectReady", msg) - r.Recorder.Event(scaledObject, corev1.EventTypeNormal, eventreason.Ready, msg) } + if err := kedacontrollerutil.SetStatusConditions(r.Client, reqLogger, scaledObject, &conditions); err != nil { return ctrl.Result{}, err } + return ctrl.Result{}, err } diff --git a/controllers/scaledobject_finalizer.go b/controllers/scaledobject_finalizer.go index 19ba28b46c1..a4e3c72b5c7 100644 --- a/controllers/scaledobject_finalizer.go +++ b/controllers/scaledobject_finalizer.go @@ -57,7 +57,7 @@ func (r *ScaledObjectReconciler) finalizeScaledObject(logger logr.Logger, scaled } logger.Info("Successfully finalized ScaledObject") - r.Recorder.Event(scaledObject, corev1.EventTypeNormal, eventreason.Deleted, "ScaledObject was deleted") + r.Recorder.Event(scaledObject, corev1.EventTypeNormal, eventreason.ScaledObjectDeleted, "ScaledObject was deleted") return nil } diff --git a/controllers/triggerauthentication_controller.go b/controllers/triggerauthentication_controller.go new file mode 100644 index 00000000000..52ae3dbcce3 --- /dev/null +++ b/controllers/triggerauthentication_controller.go @@ -0,0 +1,55 @@ +package controllers + +import ( + "context" + "github.com/go-logr/logr" + kedav1alpha1 "github.com/kedacore/keda/v2/api/v1alpha1" + "github.com/kedacore/keda/v2/pkg/eventreason" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/client-go/tools/record" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/predicate" +) + +// +kubebuilder:rbac:groups=keda.sh,resources=triggerauthentications;triggerauthentications/status,verbs="*" + +// TriggerAuthenticationReconciler reconciles a TriggerAuthentication object +type TriggerAuthenticationReconciler struct { + Client client.Client + Log logr.Logger + Recorder record.EventRecorder +} + +func (r *TriggerAuthenticationReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { + reqLogger := r.Log.WithValues("TriggerAuthentication.Namespace", req.Namespace, "TriggerAuthentication.Name", req.Name) + + triggerAuthentication := &kedav1alpha1.TriggerAuthentication{} + err := r.Client.Get(context.TODO(), req.NamespacedName, triggerAuthentication) + if err != nil { + if errors.IsNotFound(err) { + return ctrl.Result{}, nil + } + reqLogger.Error(err, "Failed ot get TriggerAuthentication") + return ctrl.Result{}, err + } + + if triggerAuthentication.GetDeletionTimestamp() != nil { + r.Recorder.Event(triggerAuthentication, corev1.EventTypeNormal, eventreason.TriggerAuthenticationDeleted, "TriggerAuthentication was deleted") + return ctrl.Result{}, nil + } + + if triggerAuthentication.ObjectMeta.Generation == 1 { + r.Recorder.Event(triggerAuthentication, corev1.EventTypeNormal, eventreason.TriggerAuthenticationAdded, "New TriggerAuthentication configured") + } + + return ctrl.Result{}, nil +} + +func (r *TriggerAuthenticationReconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + For(&kedav1alpha1.TriggerAuthentication{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). + Complete(r) +} diff --git a/main.go b/main.go index 47e78f3d1f4..c4c0b875e78 100644 --- a/main.go +++ b/main.go @@ -129,7 +129,7 @@ func main() { Log: ctrl.Log.WithName("controllers").WithName("ScaledObject"), Scheme: mgr.GetScheme(), GlobalHTTPTimeout: globalHTTPTimeout, - Recorder: mgr.GetEventRecorderFor("scaledobject-controller"), + Recorder: mgr.GetEventRecorderFor("scaledobject-controller"), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScaledObject") os.Exit(1) @@ -139,11 +139,19 @@ func main() { Log: ctrl.Log.WithName("controllers").WithName("ScaledJob"), Scheme: mgr.GetScheme(), GlobalHTTPTimeout: globalHTTPTimeout, - Recorder: mgr.GetEventRecorderFor("scaledjob-controller"), + Recorder: mgr.GetEventRecorderFor("scaledjob-controller"), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScaledJob") os.Exit(1) } + if err = (&controllers.TriggerAuthenticationReconciler{ + Client: mgr.GetClient(), + Log: ctrl.Log.WithName("controllers").WithName("TriggerAuthentication"), + Recorder: mgr.GetEventRecorderFor("triggerauthentication-controller"), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "TriggerAuthentication") + os.Exit(1) + } // +kubebuilder:scaffold:builder setupLog.Info("Starting manager") diff --git a/pkg/eventreason/eventreason.go b/pkg/eventreason/eventreason.go index 4adb1f690ae..b3789d812fd 100644 --- a/pkg/eventreason/eventreason.go +++ b/pkg/eventreason/eventreason.go @@ -17,36 +17,51 @@ limitations under the License. package eventreason const ( - // Ready is for event when ScaledObject or ScaledJob is ready - Ready = "Ready" + // ScaledObjectReady is for event when a new ScaledObject is ready + ScaledObjectReady = "ScaledObjectReady" - // CheckFailed is for event when ScaledObject or ScaledJob validation check failed - CheckFailed = "CheckFailed" + // ScaledJobReady is for event when a new ScaledJob is ready + ScaledJobReady = "ScaledJobReady" - // Deleted is for event when ScaledObject or ScaledJob is deleted - Deleted = "Deleted" + // ScaledObjectCheckFailed is for event when ScaledObject validation check fails + ScaledObjectCheckFailed = "ScaledObjectCheckFailed" - // ScalersStarted is for event when scalers watch started for ScaledObject or ScaledJob - ScalersStarted = "ScalersStarted" + // ScaledJobCheckFailed is for event when ScaledJob validation check fails + ScaledJobCheckFailed = "ScaledJobCheckFailed" - // ScalersRestarted is for event when scalers watch was restarted for ScaledObject or ScaledJob - ScalersRestarted = "ScalersRestarted" + // ScaledObjectDeleted is for event when ScaledObject is deleted + ScaledObjectDeleted = "ScaledObjectDeleted" - // ScalersStopped is for event when scalers watch was stopped for ScaledObject or ScaledJob - ScalersStopped = "ScalersStopped" + // ScaledJobDeleted is for event when ScaledJob is deleted + ScaledJobDeleted = "ScaledJobDeleted" + + // KEDAScalersStarted is for event when scalers watch started for ScaledObject or ScaledJob + KEDAScalersStarted = "KEDAScalersStarted" + + // KEDAScalersStopped is for event when scalers watch was stopped for ScaledObject or ScaledJob + KEDAScalersStopped = "KEDAScalersStopped" + + // KEDAScalerFailed is for event when a scaler fails for a ScaledJob or a ScaledObject + KEDAScalerFailed = "KEDAScalerFailed" // ScaleTargetActivated is for event when the scale target of ScaledObject was activated - ScaleTargetActivated = "ScaleTargetActivated" + KEDAScaleTargetActivated = "KEDAScaleTargetActivated" // ScaleTargetDeactivated is for event when the scale target for ScaledObject was deactivated - ScaleTargetDeactivated = "ScaleTargetDeactivated" + KEDAScaleTargetDeactivated = "KEDAScaleTargetDeactivated" // ScaleTargetActivationFailed is for event when the activation the scale target for ScaledObject fails - ScaleTargetActivationFailed = "ScaleTargetActivationFailed" + KEDAScaleTargetActivationFailed = "KEDAScaleTargetActivationFailed" // ScaleTargetDeactivationFailed is for event when the deactivation of the scale target for ScaledObject fails - ScaleTargetDeactivationFailed = "ScaleTargetDeactivationFailed" + KEDAScaleTargetDeactivationFailed = "KEDAScaleTargetDeactivationFailed" // JobsCreated is for event when jobs for ScaledJob are created - JobsCreated = "JobsCreated" + KEDAJobsCreated = "KEDAJobsCreated" + + // TriggerAuthenticationDeleted is for event when a TriggerAuthentication is deleted + TriggerAuthenticationDeleted = "TriggerAuthenticationDeleted" + + // TriggerAuthenticationAdded is for event when a TriggerAuthentication is added + TriggerAuthenticationAdded = "TriggerAuthenticationAdded" ) diff --git a/pkg/scaling/executor/scale_jobs.go b/pkg/scaling/executor/scale_jobs.go index bdd5e7b1060..57eb5b637d1 100644 --- a/pkg/scaling/executor/scale_jobs.go +++ b/pkg/scaling/executor/scale_jobs.go @@ -110,7 +110,7 @@ func (e *scaleExecutor) createJobs(logger logr.Logger, scaledJob *kedav1alpha1.S } } logger.Info("Created jobs", "Number of jobs", scaleTo) - e.recorder.Eventf(scaledJob, corev1.EventTypeNormal, eventreason.JobsCreated, "Created %d jobs", scaleTo) + e.recorder.Eventf(scaledJob, corev1.EventTypeNormal, eventreason.KEDAJobsCreated, "Created %d jobs", scaleTo) } func (e *scaleExecutor) isJobFinished(j *batchv1.Job) bool { diff --git a/pkg/scaling/executor/scale_scaledobjects.go b/pkg/scaling/executor/scale_scaledobjects.go index d6772020151..fd87bc1e5a3 100644 --- a/pkg/scaling/executor/scale_scaledobjects.go +++ b/pkg/scaling/executor/scale_scaledobjects.go @@ -127,13 +127,13 @@ func (e *scaleExecutor) scaleToZero(ctx context.Context, logger logr.Logger, sca currentReplicas, err := e.updateScaleOnScaleTarget(ctx, scaledObject, scale, 0) if err == nil { logger.Info("Successfully scaled ScaleTarget to 0 replicas") - e.recorder.Eventf(scaledObject, corev1.EventTypeNormal, eventreason.ScaleTargetDeactivated, "Deactivated %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, 0) + e.recorder.Eventf(scaledObject, corev1.EventTypeNormal, eventreason.KEDAScaleTargetDeactivated, "Deactivated %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, 0) if err := e.setActiveCondition(ctx, logger, scaledObject, metav1.ConditionFalse, "ScalerNotActive", "Scaling is not performed because triggers are not active"); err != nil { logger.Error(err, "Error in setting active condition") return } } else { - e.recorder.Eventf(scaledObject, corev1.EventTypeWarning, eventreason.ScaleTargetDeactivationFailed, "Failed to deactivated %s %s/%s", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, 0) + e.recorder.Eventf(scaledObject, corev1.EventTypeWarning, eventreason.KEDAScaleTargetDeactivationFailed, "Failed to deactivated %s %s/%s", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, 0) } } else { logger.V(1).Info("ScaleTarget cooling down", @@ -164,7 +164,7 @@ func (e *scaleExecutor) scaleFromZero(ctx context.Context, logger logr.Logger, s logger.Info("Successfully updated ScaleTarget", "Original Replicas Count", currentReplicas, "New Replicas Count", replicas) - e.recorder.Eventf(scaledObject, corev1.EventTypeNormal, eventreason.ScaleTargetActivated, "Scaled %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, replicas) + e.recorder.Eventf(scaledObject, corev1.EventTypeNormal, eventreason.KEDAScaleTargetActivated, "Scaled %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, replicas) // Scale was successful. Update lastScaleTime and lastActiveTime on the scaledObject if err := e.updateLastActiveTime(ctx, logger, scaledObject); err != nil { @@ -172,7 +172,7 @@ func (e *scaleExecutor) scaleFromZero(ctx context.Context, logger logr.Logger, s return } } else { - e.recorder.Eventf(scaledObject, corev1.EventTypeWarning, eventreason.ScaleTargetActivationFailed, "Failed to scaled %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, replicas) + e.recorder.Eventf(scaledObject, corev1.EventTypeWarning, eventreason.KEDAScaleTargetActivationFailed, "Failed to scaled %s %s/%s from %d to %d", scaledObject.Spec.ScaleTargetRef.Kind, scaledObject.Namespace, scaledObject.Spec.ScaleTargetRef.Name, currentReplicas, replicas) } } diff --git a/pkg/scaling/scale_handler.go b/pkg/scaling/scale_handler.go index 3423cf3f371..a840f107c0b 100644 --- a/pkg/scaling/scale_handler.go +++ b/pkg/scaling/scale_handler.go @@ -95,9 +95,8 @@ func (h *scaleHandler) HandleScalableObject(scalableObject interface{}) error { cancelValue() } h.scaleLoopContexts.Store(key, cancel) - h.recorder.Event(withTriggers, corev1.EventTypeNormal, eventreason.ScalersRestarted, "Restarted scalers watch") } else { - h.recorder.Event(withTriggers, corev1.EventTypeNormal, eventreason.ScalersStarted, "Started scalers watch") + h.recorder.Event(withTriggers, corev1.EventTypeNormal, eventreason.KEDAScalersStarted, "Started scalers watch") } // a mutex is used to synchronize scale requests per scalableObject @@ -123,7 +122,7 @@ func (h *scaleHandler) DeleteScalableObject(scalableObject interface{}) error { cancel() } h.scaleLoopContexts.Delete(key) - h.recorder.Event(withTriggers, corev1.EventTypeNormal, eventreason.ScalersStopped, "Stopped scalers watch") + h.recorder.Event(withTriggers, corev1.EventTypeNormal, eventreason.KEDAScalersStopped, "Stopped scalers watch") } else { h.logger.V(1).Info("ScaleObject was not found in controller cache", "key", key) } @@ -201,7 +200,7 @@ func (h *scaleHandler) checkScalers(ctx context.Context, scalableObject interfac defer scalingMutex.Unlock() switch obj := scalableObject.(type) { case *kedav1alpha1.ScaledObject: - h.scaleExecutor.RequestScale(ctx, obj, h.checkScaledObjectScalers(ctx, scalers)) + h.scaleExecutor.RequestScale(ctx, obj, h.checkScaledObjectScalers(ctx, scalers, obj)) case *kedav1alpha1.ScaledJob: scaledJob := scalableObject.(*kedav1alpha1.ScaledJob) isActive, scaleTo, maxScale := h.checkScaledJobScalers(ctx, scalers, scaledJob) @@ -209,7 +208,7 @@ func (h *scaleHandler) checkScalers(ctx context.Context, scalableObject interfac } } -func (h *scaleHandler) checkScaledObjectScalers(ctx context.Context, scalers []scalers.Scaler) bool { +func (h *scaleHandler) checkScaledObjectScalers(ctx context.Context, scalers []scalers.Scaler, scaledObject *kedav1alpha1.ScaledObject) bool { isActive := false for i, scaler := range scalers { isTriggerActive, err := scaler.IsActive(ctx) @@ -217,6 +216,7 @@ func (h *scaleHandler) checkScaledObjectScalers(ctx context.Context, scalers []s if err != nil { h.logger.V(1).Info("Error getting scale decision", "Error", err) + h.recorder.Event(scaledObject, corev1.EventTypeWarning, eventreason.KEDAScalerFailed, err.Error()) continue } else if isTriggerActive { isActive = true @@ -271,6 +271,7 @@ func (h *scaleHandler) checkScaledJobScalers(ctx context.Context, scalers []scal scaler.Close() if err != nil { scalerLogger.V(1).Info("Error getting scale decision, but continue", "Error", err) + h.recorder.Event(scaledJob, corev1.EventTypeWarning, eventreason.KEDAScalerFailed, err.Error()) continue } else if isTriggerActive { isActive = true @@ -371,6 +372,7 @@ func (h *scaleHandler) buildScalers(withTriggers *kedav1alpha1.WithTriggers, pod scaler, err := buildScaler(trigger.Type, config) if err != nil { closeScalers(scalersRes) + h.recorder.Event(withTriggers, corev1.EventTypeWarning, eventreason.KEDAScalerFailed, err.Error()) return []scalers.Scaler{}, fmt.Errorf("error getting scaler for trigger #%d: %s", i, err) } From ac1ebca9275c4469d596b2ad42ffe3d8607cb6a5 Mon Sep 17 00:00:00 2001 From: Ahmed ElSayed Date: Fri, 29 Jan 2021 12:21:24 -0800 Subject: [PATCH 3/6] Fix CI errors Signed-off-by: Ahmed ElSayed --- api/v1alpha1/condition_types.go | 1 + controllers/triggerauthentication_controller.go | 2 ++ pkg/eventreason/eventreason.go | 10 +++++----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/api/v1alpha1/condition_types.go b/api/v1alpha1/condition_types.go index b33d65acd99..2e1c68d450a 100644 --- a/api/v1alpha1/condition_types.go +++ b/api/v1alpha1/condition_types.go @@ -115,6 +115,7 @@ func (c *Conditions) GetActiveCondition() Condition { return c.getCondition(ConditionActive) } +// GetReadyCondition returns Condition of type Ready func (c *Conditions) GetReadyCondition() Condition { if *c == nil { c = GetInitializedConditions() diff --git a/controllers/triggerauthentication_controller.go b/controllers/triggerauthentication_controller.go index 52ae3dbcce3..2b4f6ca397d 100644 --- a/controllers/triggerauthentication_controller.go +++ b/controllers/triggerauthentication_controller.go @@ -23,6 +23,7 @@ type TriggerAuthenticationReconciler struct { Recorder record.EventRecorder } +// Reconcile performs reconciliation on the identified TriggerAuthentication resource based on the request information passed, returns the result and an error (if any). func (r *TriggerAuthenticationReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { reqLogger := r.Log.WithValues("TriggerAuthentication.Namespace", req.Namespace, "TriggerAuthentication.Name", req.Name) @@ -48,6 +49,7 @@ func (r *TriggerAuthenticationReconciler) Reconcile(req ctrl.Request) (ctrl.Resu return ctrl.Result{}, nil } +// SetupWithManager initializes the TriggerAuthenticationReconciler instance and starts a new controller managed by the passed Manager instance. func (r *TriggerAuthenticationReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&kedav1alpha1.TriggerAuthentication{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). diff --git a/pkg/eventreason/eventreason.go b/pkg/eventreason/eventreason.go index b3789d812fd..b9a3e15739f 100644 --- a/pkg/eventreason/eventreason.go +++ b/pkg/eventreason/eventreason.go @@ -44,19 +44,19 @@ const ( // KEDAScalerFailed is for event when a scaler fails for a ScaledJob or a ScaledObject KEDAScalerFailed = "KEDAScalerFailed" - // ScaleTargetActivated is for event when the scale target of ScaledObject was activated + // KEDAScaleTargetActivated is for event when the scale target of ScaledObject was activated KEDAScaleTargetActivated = "KEDAScaleTargetActivated" - // ScaleTargetDeactivated is for event when the scale target for ScaledObject was deactivated + // KEDAScaleTargetDeactivated is for event when the scale target for ScaledObject was deactivated KEDAScaleTargetDeactivated = "KEDAScaleTargetDeactivated" - // ScaleTargetActivationFailed is for event when the activation the scale target for ScaledObject fails + // KEDAScaleTargetActivationFailed is for event when the activation the scale target for ScaledObject fails KEDAScaleTargetActivationFailed = "KEDAScaleTargetActivationFailed" - // ScaleTargetDeactivationFailed is for event when the deactivation of the scale target for ScaledObject fails + // KEDAScaleTargetDeactivationFailed is for event when the deactivation of the scale target for ScaledObject fails KEDAScaleTargetDeactivationFailed = "KEDAScaleTargetDeactivationFailed" - // JobsCreated is for event when jobs for ScaledJob are created + // KEDAJobsCreated is for event when jobs for ScaledJob are created KEDAJobsCreated = "KEDAJobsCreated" // TriggerAuthenticationDeleted is for event when a TriggerAuthentication is deleted From 492406d7ef0eb84c416144e486fc6bbdab2f9ba8 Mon Sep 17 00:00:00 2001 From: Ahmed ElSayed Date: Fri, 29 Jan 2021 12:32:09 -0800 Subject: [PATCH 4/6] goimports Signed-off-by: Ahmed ElSayed --- controllers/scaledjob_controller.go | 3 ++- controllers/triggerauthentication_controller.go | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/controllers/scaledjob_controller.go b/controllers/scaledjob_controller.go index ed031292a33..8c4b0c84d67 100644 --- a/controllers/scaledjob_controller.go +++ b/controllers/scaledjob_controller.go @@ -3,9 +3,10 @@ package controllers import ( "context" "fmt" + "time" + "github.com/kedacore/keda/v2/pkg/eventreason" corev1 "k8s.io/api/core/v1" - "time" "k8s.io/client-go/tools/record" diff --git a/controllers/triggerauthentication_controller.go b/controllers/triggerauthentication_controller.go index 2b4f6ca397d..e96cc430391 100644 --- a/controllers/triggerauthentication_controller.go +++ b/controllers/triggerauthentication_controller.go @@ -2,6 +2,7 @@ package controllers import ( "context" + "github.com/go-logr/logr" kedav1alpha1 "github.com/kedacore/keda/v2/api/v1alpha1" "github.com/kedacore/keda/v2/pkg/eventreason" From 4f817c08174364d3775a5776f01bf69565af2a04 Mon Sep 17 00:00:00 2001 From: Ahmed ElSayed Date: Thu, 4 Feb 2021 15:37:16 -0800 Subject: [PATCH 5/6] Code review comments Signed-off-by: Ahmed ElSayed --- CHANGELOG.md | 2 +- controllers/scaledobject_controller.go | 2 +- main.go | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dc55f31dec..f7fc3535cbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - [v1.0.0](#v100) ## Unreleased +- Emit Kubernetes Events on KEDA events ([#1523](https://github.com/kedacore/keda/pull/1523)) ### New @@ -43,7 +44,6 @@ - Global authentication credentials can be managed using `ClusterTriggerAuthentication` objects ([#1452](https://github.com/kedacore/keda/pull/1452)) - Introducing OpenStack Swift scaler ([#1342](https://github.com/kedacore/keda/issues/1342)) - Introducing MongoDB scaler ([#1467](https://github.com/kedacore/keda/pull/1467)) -- Emit Kubernetes Events on KEDA events ([#1523](https://github.com/kedacore/keda/pull/1523)):wq ### Improvements diff --git a/controllers/scaledobject_controller.go b/controllers/scaledobject_controller.go index a25cbccf216..e9321f5f131 100644 --- a/controllers/scaledobject_controller.go +++ b/controllers/scaledobject_controller.go @@ -96,7 +96,7 @@ func (r *ScaledObjectReconciler) SetupWithManager(mgr ctrl.Manager) error { // Init the rest of ScaledObjectReconciler r.restMapper = mgr.GetRESTMapper() r.scaledObjectsGenerations = &sync.Map{} - r.scaleHandler = scaling.NewScaleHandler(mgr.GetClient(), r.scaleClient, mgr.GetScheme(), r.GlobalHTTPTimeout, mgr.GetEventRecorderFor("scale-handler")) + r.scaleHandler = scaling.NewScaleHandler(mgr.GetClient(), r.scaleClient, mgr.GetScheme(), r.GlobalHTTPTimeout, r.Recorder) // Start controller return ctrl.NewControllerManagedBy(mgr). diff --git a/main.go b/main.go index c4c0b875e78..8b3786f387b 100644 --- a/main.go +++ b/main.go @@ -123,13 +123,14 @@ func main() { } globalHTTPTimeout := time.Duration(globalHTTPTimeoutMS) * time.Millisecond + eventRecorder := mgr.GetEventRecorderFor("keda-operator") if err = (&controllers.ScaledObjectReconciler{ Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("ScaledObject"), Scheme: mgr.GetScheme(), GlobalHTTPTimeout: globalHTTPTimeout, - Recorder: mgr.GetEventRecorderFor("scaledobject-controller"), + Recorder: eventRecorder, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScaledObject") os.Exit(1) @@ -139,7 +140,7 @@ func main() { Log: ctrl.Log.WithName("controllers").WithName("ScaledJob"), Scheme: mgr.GetScheme(), GlobalHTTPTimeout: globalHTTPTimeout, - Recorder: mgr.GetEventRecorderFor("scaledjob-controller"), + Recorder: eventRecorder, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScaledJob") os.Exit(1) @@ -147,7 +148,7 @@ func main() { if err = (&controllers.TriggerAuthenticationReconciler{ Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("TriggerAuthentication"), - Recorder: mgr.GetEventRecorderFor("triggerauthentication-controller"), + Recorder: eventRecorder, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "TriggerAuthentication") os.Exit(1) From eb54f739b0162c50b96ca30290e4b6d1819f006c Mon Sep 17 00:00:00 2001 From: Ahmed ElSayed Date: Fri, 5 Feb 2021 13:04:46 -0800 Subject: [PATCH 6/6] Fix CHANGELOG.md Signed-off-by: Ahmed ElSayed --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7fc3535cbc..eb21f26989d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,11 +16,11 @@ - [v1.0.0](#v100) ## Unreleased -- Emit Kubernetes Events on KEDA events ([#1523](https://github.com/kedacore/keda/pull/1523)) ### New - TODO ([#XXX](https://github.com/kedacore/keda/issues/XXX)) +- Emit Kubernetes Events on KEDA events ([#1523](https://github.com/kedacore/keda/pull/1523)) ### Improvements