in pkg/controllers/node/controller.go [62:116]
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))
// 1. Retrieve Node, ignore if not provisioned or terminating
stored := &v1.Node{}
if err := c.kubeClient.Get(ctx, req.NamespacedName, stored); err != nil {
if errors.IsNotFound(err) {
return reconcile.Result{}, nil
}
return reconcile.Result{}, err
}
if _, ok := stored.Labels[v1alpha5.ProvisionerNameLabelKey]; !ok {
return reconcile.Result{}, nil
}
if !stored.DeletionTimestamp.IsZero() {
return reconcile.Result{}, nil
}
// 2. Retrieve Provisioner
provisioner := &v1alpha5.Provisioner{}
if err := c.kubeClient.Get(ctx, types.NamespacedName{Name: stored.Labels[v1alpha5.ProvisionerNameLabelKey]}, provisioner); err != nil {
if errors.IsNotFound(err) {
return reconcile.Result{}, nil
}
return reconcile.Result{}, err
}
// 3. Execute reconcilers
node := stored.DeepCopy()
var results []reconcile.Result
var errs error
for _, reconciler := range []interface {
Reconcile(context.Context, *v1alpha5.Provisioner, *v1.Node) (reconcile.Result, error)
}{
c.initialization,
c.expiration,
c.emptiness,
c.finalizer,
} {
res, err := reconciler.Reconcile(ctx, provisioner, node)
errs = multierr.Append(errs, err)
results = append(results, res)
}
// 4. Patch any changes, regardless of errors
if !equality.Semantic.DeepEqual(node, stored) {
if err := c.kubeClient.Patch(ctx, node, client.MergeFrom(stored)); err != nil {
return reconcile.Result{}, fmt.Errorf("patching node, %w", err)
}
}
// 5. Requeue if error or if retryAfter is set
if errs != nil {
return reconcile.Result{}, errs
}
return result.Min(results...), nil
}