func()

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
}