in pkg/node/node.go [783:837]
func addTaint(node *corev1.Node, nth Node, taintKey string, taintValue string, effectType string) error {
effect := getTaintEffect(effectType)
if nth.nthConfig.DryRun {
log.Info().Msgf("Would have added taint (%s=%s:%s) to node %s, but dry-run flag was set", taintKey, taintValue, effect, nth.nthConfig.NodeName)
return nil
}
retryDeadline := time.Now().Add(maxRetryDeadline)
freshNode := node.DeepCopy()
client := nth.drainHelper.Client
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 {
nodeErr := fmt.Errorf("failed to get node %v: %w", node.Name, err)
log.Err(nodeErr).
Str("taint_key", taintKey).
Str("node_name", node.Name).
Msg("Error while adding taint on node")
return nodeErr
}
}
if !addTaintToSpec(freshNode, taintKey, taintValue, effect) {
if !refresh {
// Make sure we have the latest version before skipping update.
refresh = true
continue
}
return nil
}
_, 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 adding taint on node")
return err
}
log.Warn().
Str("taint_key", taintKey).
Str("node_name", node.Name).
Msg("Successfully added taint on node")
return nil
}
}