in pkg/node/node.go [858:913]
func removeTaint(node *corev1.Node, client kubernetes.Interface, taintKey string) (bool, error) {
retryDeadline := time.Now().Add(maxRetryDeadline)
freshNode := node.DeepCopy()
var err error
refresh := false
for {
if refresh {
// Get the newest version of the node.
freshNode, err = client.CoreV1().Nodes().Get(context.TODO(), node.Name, metav1.GetOptions{})
if err != nil || freshNode == nil {
return false, fmt.Errorf("failed to get node %v: %v", node.Name, err)
}
}
newTaints := make([]corev1.Taint, 0)
for _, taint := range freshNode.Spec.Taints {
if taint.Key == taintKey {
log.Info().
Interface("taint", taint).
Str("node_name", node.Name).
Msg("Releasing taint on node")
} else {
newTaints = append(newTaints, taint)
}
}
if len(newTaints) == len(freshNode.Spec.Taints) {
if !refresh {
// Make sure we have the latest version before skipping update.
refresh = true
continue
}
return false, nil
}
freshNode.Spec.Taints = newTaints
_, err = client.CoreV1().Nodes().Update(context.TODO(), freshNode, metav1.UpdateOptions{})
if err != nil && errors.IsConflict(err) && time.Now().Before(retryDeadline) {
refresh = true
time.Sleep(conflictRetryInterval)
continue
}
if err != nil {
log.Err(err).
Str("taint_key", taintKey).
Str("node_name", node.Name).
Msg("Error while releasing taint on node")
return false, err
}
log.Info().
Str("taint_key", taintKey).
Str("node_name", node.Name).
Msg("Successfully released taint on node")
return true, nil
}
}