in pkg/k8s/wrapper.go [153:196]
func (k *k8sWrapper) AdvertiseCapacityIfNotSet(nodeName string, resourceName string, capacity int) error {
request := types.NamespacedName{
Name: nodeName,
}
err := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
node := &v1.Node{}
if err := k.cacheClient.Get(k.context, request, node); err != nil {
return err
}
// in case if the node is returned without initialized Capacity map for any reason
// we need to handle the nil map gracefully and retry
// metav1.Status{Reason: metav1.StatusReasonConflict} is an error that is retriable regarding
// https://github.com/kubernetes/client-go/blob/v0.21.3/util/retry/util.go#L103-L105
if node.Status.Capacity == nil {
return &errors.StatusError{
ErrStatus: metav1.Status{
Reason: metav1.StatusReasonConflict,
},
}
}
existingCapacity := node.Status.Capacity[v1.ResourceName(resourceName)]
if !existingCapacity.IsZero() && existingCapacity.Value() == int64(capacity) {
return nil
}
// Capacity doesn't match the expected capacity, need to advertise again
advertiseResourceRequestCallCount.WithLabelValues(resourceName).Inc()
newNode := node.DeepCopy()
newNode.Status.Capacity[v1.ResourceName(resourceName)] = resource.MustParse(strconv.Itoa(capacity))
return k.cacheClient.Status().Patch(k.context, newNode, client.MergeFrom(node))
})
if err != nil {
advertiseResourceRequestErrCount.WithLabelValues(resourceName).Inc()
}
return err
}