Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 30 additions & 28 deletions cmd/thv-operator/controllers/mcpserver_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,36 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
return ctrl.Result{}, err
}

// Check if the MCPServer instance is marked to be deleted.
// This check is performed early to avoid unnecessary validation and external API calls during deletion.
if mcpServer.GetDeletionTimestamp() != nil {
// The object is being deleted
if controllerutil.ContainsFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") {
// Run finalization logic. If the finalization logic fails,
// don't remove the finalizer so that we can retry during the next reconciliation.
if err := r.finalizeMCPServer(ctx, mcpServer); err != nil {
return ctrl.Result{}, err
}

// Remove the finalizer. Once all finalizers have been removed, the object will be deleted.
controllerutil.RemoveFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer")
err := r.Update(ctx, mcpServer)
if err != nil {
return ctrl.Result{}, err
}
}
return ctrl.Result{}, nil
}

// Add finalizer for this CR
if !controllerutil.ContainsFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") {
controllerutil.AddFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer")
err = r.Update(ctx, mcpServer)
if err != nil {
return ctrl.Result{}, err
}
}

// Check if the restart annotation has been updated and trigger a rolling restart if needed
if shouldTriggerRestart, err := r.handleRestartAnnotation(ctx, mcpServer); err != nil {
ctxLogger.Error(err, "Failed to handle restart annotation")
Expand Down Expand Up @@ -306,34 +336,6 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
}
}

// Check if the MCPServer instance is marked to be deleted
if mcpServer.GetDeletionTimestamp() != nil {
// The object is being deleted
if controllerutil.ContainsFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") {
// Run finalization logic. If the finalization logic fails,
// don't remove the finalizer so that we can retry during the next reconciliation.
if err := r.finalizeMCPServer(ctx, mcpServer); err != nil {
return ctrl.Result{}, err
}

// Remove the finalizer. Once all finalizers have been removed, the object will be deleted.
controllerutil.RemoveFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer")
err := r.Update(ctx, mcpServer)
if err != nil {
return ctrl.Result{}, err
}
}
return ctrl.Result{}, nil
}

// Add finalizer for this CR
if !controllerutil.ContainsFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") {
controllerutil.AddFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer")
err = r.Update(ctx, mcpServer)
if err != nil {
return ctrl.Result{}, err
}
}

// Update the MCPServer status with the pod status
if err := r.updateMCPServerStatus(ctx, mcpServer); err != nil {
Expand Down