code: func (o TaintOptions) updateTaints(obj runtime.Object) (string, error) {
  	node, ok := obj.(*v1.Node)
  	if !ok {
  		return "", fmt.Errorf("unexpected type %T, expected Node", obj)
  	}
  	if !o.overwrite {
  		if exists := checkIfTaintsAlreadyExists(node.Spec.Taints, o.taintsToAdd); len(exists) != 0 {
  			return "", fmt.Errorf("Node %s already has %v taint(s) with same effect(s) and --overwrite is false", node.Name, exists)
  		}
  	}
  	operation, newTaints, err := reorganizeTaints(node, o.overwrite, o.taintsToAdd, o.taintsToRemove)
  	if err != nil {
  		return "", err
  	}
  	node.Spec.Taints = newTaints
  	return operation, nil
  }
docs: // updateTaints applies a taint option(o) to a node in cluster after computing the net effect of operation(i.e. does it result in an overwrite?), it reports back the end result in a way that user can easily interpret.