in pkg/controllers/termination/controller.go [63:97]
func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) {
ctx = logging.WithLogger(ctx, logging.FromContext(ctx).Named(controllerName).With("node", req.Name))
ctx = injection.WithControllerName(ctx, controllerName)
// 1. Retrieve node from reconcile request
node := &v1.Node{}
if err := c.KubeClient.Get(ctx, req.NamespacedName, node); err != nil {
if errors.IsNotFound(err) {
return reconcile.Result{}, nil
}
return reconcile.Result{}, err
}
// 2. Check if node is terminable
if node.DeletionTimestamp.IsZero() || !functional.ContainsString(node.Finalizers, provisioning.TerminationFinalizer) {
return reconcile.Result{}, nil
}
// 3. Cordon node
if err := c.Terminator.cordon(ctx, node); err != nil {
return reconcile.Result{}, fmt.Errorf("cordoning node %s, %w", node.Name, err)
}
// 4. Drain node
drained, err := c.Terminator.drain(ctx, node)
if err != nil {
return reconcile.Result{}, fmt.Errorf("draining node %s, %w", node.Name, err)
}
if !drained {
return reconcile.Result{Requeue: true}, nil
}
// 5. If fully drained, terminate the node
if err := c.Terminator.terminate(ctx, node); err != nil {
return reconcile.Result{}, fmt.Errorf("terminating node %s, %w", node.Name, err)
}
return reconcile.Result{}, nil
}