in pkg/controllers/nodeclaim/status.go [57:101]
func (c *Controller) Reconcile(ctx context.Context, node *corev1.Node) (reconcile.Result, error) {
ctx = injection.WithControllerName(ctx, "nodeclaim.status")
if !node.GetDeletionTimestamp().IsZero() || len(node.Spec.ProviderID) == 0 {
return reconcile.Result{}, nil
}
// skip node which is not created from nodeclaim
if _, ok := node.Labels[v1.NodePoolLabelKey]; !ok {
return reconcile.Result{}, nil
}
nodeClaimList := &v1.NodeClaimList{}
if err := c.kubeClient.List(ctx, nodeClaimList, client.MatchingFields{"status.providerID": node.Spec.ProviderID}); err != nil {
return reconcile.Result{}, err
}
var nodeClaim *v1.NodeClaim
if len(nodeClaimList.Items) == 0 {
return reconcile.Result{}, fmt.Errorf("nodeclaim not found for node(%s)", node.Name)
} else if len(nodeClaimList.Items) > 1 {
return reconcile.Result{}, fmt.Errorf("more than one nodeclaim found for node(%s)", node.Name)
} else {
nodeClaim = &nodeClaimList.Items[0]
}
stored := nodeClaim.DeepCopy()
if !nodeClaim.StatusConditions().Get(v1.ConditionTypeInitialized).IsTrue() {
nodeClaim.StatusConditions().SetUnknownWithReason(v1.ConditionTypeNodeReady, "NodeClaimNotInitialized", "node claim is not initialized")
} else {
if isNodeReady(node) {
nodeClaim.StatusConditions().SetTrue(v1.ConditionTypeNodeReady)
} else {
nodeClaim.StatusConditions().SetFalse(v1.ConditionTypeNodeReady, "NodeNotReady", "Node status is NotReady")
}
}
if !equality.Semantic.DeepEqual(stored, nodeClaim) {
log.FromContext(ctx).Info("update nodeclaim status because node ready status changed", "nodeclaim", nodeClaim.Name, "readyStatus", nodeClaim.StatusConditions().Get(v1.ConditionTypeNodeReady).GetStatus())
if err := c.kubeClient.Status().Patch(ctx, nodeClaim, client.MergeFrom(stored)); err != nil {
return reconcile.Result{}, client.IgnoreNotFound(err)
}
}
return reconcile.Result{}, nil
}