func()

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
}