From 7b8cc85245d42a4a8d6a75a71992cb026052fde5 Mon Sep 17 00:00:00 2001 From: baschno Date: Wed, 5 Feb 2025 20:48:41 +0100 Subject: [PATCH] implementing reconciler --- config/rbac/role.yaml | 12 +++++ internal/controller/tdset_controller.go | 60 +++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index cb303fd..0b8641a 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -4,6 +4,18 @@ kind: ClusterRole metadata: name: manager-role rules: +- apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - schedule.rs resources: diff --git a/internal/controller/tdset_controller.go b/internal/controller/tdset_controller.go index 6f65881..ee0e488 100644 --- a/internal/controller/tdset_controller.go +++ b/internal/controller/tdset_controller.go @@ -18,7 +18,9 @@ package controller import ( "context" + "time" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -27,6 +29,10 @@ import ( schedulev1 "github.com/baschno/tdset-operator/api/v1" ) +const ( + DefaultReconciliationInterval = 5 +) + // TDSetReconciler reconciles a TDSet object type TDSetReconciler struct { client.Client @@ -36,6 +42,7 @@ type TDSetReconciler struct { // +kubebuilder:rbac:groups=schedule.rs,resources=tdsets,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=schedule.rs,resources=tdsets/status,verbs=get;update;patch // +kubebuilder:rbac:groups=schedule.rs,resources=tdsets/finalizers,verbs=update +// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete // Reconcile is part of the main kubernetes reconciliation loop which aims to // move the current state of the cluster closer to the desired state. @@ -47,12 +54,59 @@ type TDSetReconciler struct { // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.19.0/pkg/reconcile func (r *TDSetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - _ = log.FromContext(ctx) + log := log.FromContext(ctx) log.Info("Starting reconciliation") - // TODO(user): your logic here - return ctrl.Result{}, nil + tdSet := &schedulev1.TDSet{} + + // Get TDSet + err := r.GetTDSet(ctx, req, tdSet) + if err != nil { + if apierrors.IsNotFound(err) { + log.Info("TDSet not found - ignoring since object must be deleted") + + return ctrl.Result{}, nil + } + log.Error(err, "Failed to get TDSet") + return ctrl.Result{}, err + } + + // Try to set initial status + err = r.SetInitialCondition(ctx, req, tdSet) + if err != nil { + log.Error(err, "Failed to set initial condition") + return ctrl.Result{}, err + } + + // TODO Delete finalizer + + // Deployment if not exist + ok, err := r.DeploymentIfNotExist(ctx, req, tdSet) + if err != nil { + log.Error(err, "Failed to check deployment for TDSet") + return ctrl.Result{}, err + } + if ok { + return ctrl.Result{RequeueAfter: time.Minute}, nil + } + + // Update deployment replica if mismatched + err = r.UpdateDeploymentReplica(ctx, req, tdSet) + if err != nil { + log.Log.Error(err, "Failed to update deployment replica for TDSet") + return ctrl.Result{}, err + } + + interval := DefaultReconciliationInterval + if tdSet.Spec.IntervalMint != 0 { + interval = int(tdSet.Spec.IntervalMint) + } + + log.Info("Reconciliation done", "RequeueAfter", interval) + + return ctrl.Result{RequeueAfter: time.Duration(time.Minute * time.Duration(interval))}, nil + } // SetupWithManager sets up the controller with the Manager.