From e3a6da65e407a304d07d26474e1be600ca9b19ab Mon Sep 17 00:00:00 2001 From: Vishal-Ramani Date: Mon, 11 Jul 2022 23:56:50 +0530 Subject: [PATCH 1/3] Update: Event Recorder Code in Delete Condition --- operator-application/controllers/application/conditions.go | 1 + operator-application/controllers/application/controller.go | 4 +++- operator-application/main.go | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/operator-application/controllers/application/conditions.go b/operator-application/controllers/application/conditions.go index db3b2d2..2e412fc 100644 --- a/operator-application/controllers/application/conditions.go +++ b/operator-application/controllers/application/conditions.go @@ -145,6 +145,7 @@ func (reconciler *ApplicationReconciler) deleteCondition(ctx context.Context, ap if err != nil { log.Info("Application resource status update failed.") } + reconciler.recorder.Event(application, "Warning", "Warning", "Application resource status update failed.") return nil } diff --git a/operator-application/controllers/application/controller.go b/operator-application/controllers/application/controller.go index 42f423f..348a76a 100644 --- a/operator-application/controllers/application/controller.go +++ b/operator-application/controllers/application/controller.go @@ -8,6 +8,7 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/client-go/rest" + "k8s.io/client-go/tools/record" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" @@ -34,7 +35,8 @@ var countReconcileLaunched = prometheus.NewCounter( type ApplicationReconciler struct { client.Client - Scheme *runtime.Scheme + Scheme *runtime.Scheme + recorder record.EventRecorder } //+kubebuilder:rbac:groups=database.sample.third.party,resources=databases,verbs=get;list;watch;create;update;patch;delete diff --git a/operator-application/main.go b/operator-application/main.go index f740bf6..2c62869 100644 --- a/operator-application/main.go +++ b/operator-application/main.go @@ -69,6 +69,7 @@ func main() { if err = (&applicationcontroller.ApplicationReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), + //recorder: mgr.GetRecorder("containerset-controller"), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Application") os.Exit(1) From 28e4725f80d0980b68b5179aa5cf941bb0fbbc97 Mon Sep 17 00:00:00 2001 From: Vishal-Ramani Date: Tue, 19 Jul 2022 13:47:06 +0530 Subject: [PATCH 2/3] Update: K8s Event feature in application condition --- .../controllers/application/conditions.go | 16 ++++++++++++++-- .../controllers/application/controller.go | 2 +- .../controllers/application/deployment.go | 1 + operator-application/main.go | 5 +++-- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/operator-application/controllers/application/conditions.go b/operator-application/controllers/application/conditions.go index 2e412fc..8c236c3 100644 --- a/operator-application/controllers/application/conditions.go +++ b/operator-application/controllers/application/conditions.go @@ -5,6 +5,7 @@ import ( applicationsamplev1beta1 "github.com/ibm/operator-sample-go/operator-application/api/v1beta1" "github.com/ibm/operator-sample-go/operator-application/utilities" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -22,6 +23,7 @@ func (reconciler *ApplicationReconciler) setConditionResourceFound(ctx context.C application *applicationsamplev1beta1.Application) error { if !reconciler.containsCondition(ctx, application, CONDITION_REASON_RESOURCE_FOUND) { + reconciler.Recorder.Event(application, corev1.EventTypeNormal, CONDITION_REASON_RESOURCE_FOUND, CONDITION_MESSAGE_RESOURCE_FOUND) return utilities.AppendCondition(ctx, reconciler.Client, application, CONDITION_TYPE_RESOURCE_FOUND, CONDITION_STATUS_TRUE, CONDITION_REASON_RESOURCE_FOUND, CONDITION_MESSAGE_RESOURCE_FOUND) } @@ -38,6 +40,7 @@ func (reconciler *ApplicationReconciler) setConditionInstallReady(ctx context.Co reconciler.deleteCondition(ctx, application, CONDITION_TYPE_FAILED, CONDITION_REASON_FAILED_INSTALL_READY) if !reconciler.containsCondition(ctx, application, CONDITION_REASON_INSTALL_READY) { + reconciler.Recorder.Event(application, corev1.EventTypeNormal, CONDITION_TYPE_INSTALL_READY, CONDITION_MESSAGE_INSTALL_READY) return utilities.AppendCondition(ctx, reconciler.Client, application, CONDITION_TYPE_INSTALL_READY, CONDITION_STATUS_TRUE, CONDITION_REASON_INSTALL_READY, CONDITION_MESSAGE_INSTALL_READY) } @@ -59,6 +62,7 @@ func (reconciler *ApplicationReconciler) setConditionFailed(ctx context.Context, } if !reconciler.containsCondition(ctx, application, reason) { + reconciler.Recorder.Event(application, corev1.EventTypeWarning, CONDITION_TYPE_FAILED, CONDITION_MESSAGE_FAILED_INSTALL_READY) return utilities.AppendCondition(ctx, reconciler.Client, application, CONDITION_TYPE_FAILED, CONDITION_STATUS_TRUE, reason, message) } @@ -79,6 +83,7 @@ func (reconciler *ApplicationReconciler) setConditionDatabaseExists(ctx context. } else { currentStatus := reconciler.getConditionStatus(ctx, application, CONDITION_TYPE_DATABASE_EXISTS) if currentStatus != status { + reconciler.Recorder.Event(application, corev1.EventTypeWarning, CONDITION_TYPE_DATABASE_EXISTS, CONDITION_MESSAGE_DATABASE_EXISTS) reconciler.deleteCondition(ctx, application, CONDITION_TYPE_DATABASE_EXISTS, CONDITION_REASON_DATABASE_EXISTS) return utilities.AppendCondition(ctx, reconciler.Client, application, CONDITION_TYPE_DATABASE_EXISTS, status, CONDITION_REASON_DATABASE_EXISTS, CONDITION_MESSAGE_DATABASE_EXISTS) @@ -96,6 +101,7 @@ func (reconciler *ApplicationReconciler) setConditionSucceeded(ctx context.Conte application *applicationsamplev1beta1.Application) error { if !reconciler.containsCondition(ctx, application, CONDITION_REASON_SUCCEEDED) { + reconciler.Recorder.Event(application, corev1.EventTypeNormal, CONDITION_REASON_SUCCEEDED, CONDITION_MESSAGE_SUCCEEDED) return utilities.AppendCondition(ctx, reconciler.Client, application, CONDITION_TYPE_SUCCEEDED, CONDITION_STATUS_TRUE, CONDITION_REASON_SUCCEEDED, CONDITION_MESSAGE_SUCCEEDED) } @@ -111,6 +117,7 @@ func (reconciler *ApplicationReconciler) setConditionDeletionRequestReceived(ctx application *applicationsamplev1beta1.Application) error { if !reconciler.containsCondition(ctx, application, CONDITION_REASON_DELETION_REQUEST_RECEIVED) { + reconciler.Recorder.Event(application, corev1.EventTypeNormal, CONDITION_TYPE_DELETION_REQUEST_RECEIVED, CONDITION_MESSAGE_DELETION_REQUEST_RECEIVED) return utilities.AppendCondition(ctx, reconciler.Client, application, CONDITION_TYPE_DELETION_REQUEST_RECEIVED, CONDITION_STATUS_TRUE, CONDITION_REASON_DELETION_REQUEST_RECEIVED, CONDITION_MESSAGE_DELETION_REQUEST_RECEIVED) } @@ -129,6 +136,11 @@ func (reconciler *ApplicationReconciler) getConditionStatus(ctx context.Context, return output } +// Note: Status of DELETION_REQUEST_RECEIVED can only be True +const CONDITION_TYPE_DELETECONDITION = "Update failed" +const CONDITION_REASON_DELETECONDITION = "Update failed" +const CONDITION_MESSAGE_DELETECONDITION = "Application resource status update failed." + func (reconciler *ApplicationReconciler) deleteCondition(ctx context.Context, application *applicationsamplev1beta1.Application, typeName string, reason string) error { @@ -143,9 +155,9 @@ func (reconciler *ApplicationReconciler) deleteCondition(ctx context.Context, ap err := reconciler.Client.Status().Update(ctx, application) if err != nil { - log.Info("Application resource status update failed.") + log.Info(CONDITION_MESSAGE_DELETECONDITION) + reconciler.Recorder.Event(application, corev1.EventTypeWarning, CONDITION_REASON_DELETECONDITION, CONDITION_MESSAGE_DELETECONDITION) } - reconciler.recorder.Event(application, "Warning", "Warning", "Application resource status update failed.") return nil } diff --git a/operator-application/controllers/application/controller.go b/operator-application/controllers/application/controller.go index 348a76a..1611706 100644 --- a/operator-application/controllers/application/controller.go +++ b/operator-application/controllers/application/controller.go @@ -36,7 +36,7 @@ var countReconcileLaunched = prometheus.NewCounter( type ApplicationReconciler struct { client.Client Scheme *runtime.Scheme - recorder record.EventRecorder + Recorder record.EventRecorder } //+kubebuilder:rbac:groups=database.sample.third.party,resources=databases,verbs=get;list;watch;create;update;patch;delete diff --git a/operator-application/controllers/application/deployment.go b/operator-application/controllers/application/deployment.go index 699518d..7131fe3 100644 --- a/operator-application/controllers/application/deployment.go +++ b/operator-application/controllers/application/deployment.go @@ -95,6 +95,7 @@ func (reconciler *ApplicationReconciler) reconcileDeployment(ctx context.Context log.Info("Failed to create deployment resource. Re-running reconcile.") return ctrl.Result{}, err } + reconciler.Recorder.Eventf(application, corev1.EventTypeWarning, "Created", "Created deployment %s", deploymentDefinition.Name) } else { log.Info("Failed to get deployment resource " + variables.DeploymentName + ". Re-running reconcile.") return ctrl.Result{}, err diff --git a/operator-application/main.go b/operator-application/main.go index 2c62869..af24b1c 100644 --- a/operator-application/main.go +++ b/operator-application/main.go @@ -67,8 +67,9 @@ func main() { } if err = (&applicationcontroller.ApplicationReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Recorder: mgr.GetEventRecorderFor("application-controller"), //recorder: mgr.GetRecorder("containerset-controller"), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Application") From 0d6f925280e76b9aae1967163a30762d40937937 Mon Sep 17 00:00:00 2001 From: Vishal Ramani Date: Tue, 16 Aug 2022 16:17:45 +0530 Subject: [PATCH 3/3] Feature/event recorder #104 --- operator-application/controllers/application/conditions.go | 1 - operator-application/controllers/application/deployment.go | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/operator-application/controllers/application/conditions.go b/operator-application/controllers/application/conditions.go index 8c236c3..4d79999 100644 --- a/operator-application/controllers/application/conditions.go +++ b/operator-application/controllers/application/conditions.go @@ -155,7 +155,6 @@ func (reconciler *ApplicationReconciler) deleteCondition(ctx context.Context, ap err := reconciler.Client.Status().Update(ctx, application) if err != nil { - log.Info(CONDITION_MESSAGE_DELETECONDITION) reconciler.Recorder.Event(application, corev1.EventTypeWarning, CONDITION_REASON_DELETECONDITION, CONDITION_MESSAGE_DELETECONDITION) } return nil diff --git a/operator-application/controllers/application/deployment.go b/operator-application/controllers/application/deployment.go index 7131fe3..8b6721d 100644 --- a/operator-application/controllers/application/deployment.go +++ b/operator-application/controllers/application/deployment.go @@ -95,7 +95,7 @@ func (reconciler *ApplicationReconciler) reconcileDeployment(ctx context.Context log.Info("Failed to create deployment resource. Re-running reconcile.") return ctrl.Result{}, err } - reconciler.Recorder.Eventf(application, corev1.EventTypeWarning, "Created", "Created deployment %s", deploymentDefinition.Name) + reconciler.Recorder.Eventf(application, corev1.EventTypeNormal, "Created", "Created deployment %s", deploymentDefinition.Name) } else { log.Info("Failed to get deployment resource " + variables.DeploymentName + ". Re-running reconcile.") return ctrl.Result{}, err