shdsbilling/on-premise/main/rancher_v2.9.1/source/rancher-2.9.1/pkg/taints/utils.go

148 lines
3.4 KiB
Go

package taints
import (
"fmt"
"strings"
rketypes "github.com/rancher/rke/types"
"github.com/sirupsen/logrus"
v1 "k8s.io/api/core/v1"
)
func GetTaintsString(taint v1.Taint) string {
return fmt.Sprintf("%s=%s:%s", taint.Key, taint.Value, taint.Effect)
}
func GetRKETaintsString(taint rketypes.RKETaint) string {
return fmt.Sprintf("%s=%s:%s", taint.Key, taint.Value, taint.Effect)
}
func GetKeyEffectString(taint v1.Taint) string {
return fmt.Sprintf("%s:%s", taint.Key, taint.Effect)
}
func GetTaintFromString(taintStr string) *v1.Taint {
taintStruct := strings.Split(taintStr, "=")
if len(taintStruct) != 2 {
logrus.Warnf("taint string %s is not validated", taintStr)
return nil
}
tmp := strings.Split(taintStruct[1], ":")
if len(tmp) != 2 {
logrus.Warnf("taint string %s is not validated", taintStr)
return nil
}
key := taintStruct[0]
value := tmp[0]
effect := v1.TaintEffect(tmp[1])
return &v1.Taint{
Key: key,
Value: value,
Effect: effect,
}
}
func GetTaintSet(taints []v1.Taint) map[string]int {
rtn := map[string]int{}
for i, taint := range taints {
rtn[GetTaintsString(taint)] = i
}
return rtn
}
func GetKeyEffectTaintSet(taints []v1.Taint) map[string]int {
rtn := map[string]int{}
for i, taint := range taints {
rtn[GetKeyEffectString(taint)] = i
}
return rtn
}
func GetToDiffTaints(current, desired []v1.Taint) (toAdd map[int]v1.Taint, toDel map[int]v1.Taint) {
toAdd, toDel = map[int]v1.Taint{}, map[int]v1.Taint{}
currentSet := GetTaintSet(current)
desiredSet := GetTaintSet(desired)
for k, index := range currentSet {
if _, ok := desiredSet[k]; !ok {
toDel[index] = current[index]
}
}
for k, index := range desiredSet {
if _, ok := currentSet[k]; !ok {
toAdd[index] = desired[index]
}
}
return toAdd, toDel
}
func GetRKETaintsFromStrings(sources []string) []rketypes.RKETaint {
rtn := make([]rketypes.RKETaint, len(sources))
for i, source := range sources {
t := GetTaintFromString(source)
rtn[i] = rketypes.RKETaint{
Key: t.Key,
Value: t.Value,
Effect: t.Effect,
TimeAdded: t.TimeAdded,
}
}
return rtn
}
func GetStringsFromRKETaint(taints []rketypes.RKETaint) []string {
var rtn []string
for _, taint := range taints {
rtn = append(rtn, GetRKETaintsString(taint))
}
return rtn
}
func GetRKETaintsFromTaints(sources []v1.Taint) []rketypes.RKETaint {
rtn := make([]rketypes.RKETaint, len(sources))
for i, source := range sources {
rtn[i] = rketypes.RKETaint{
Key: source.Key,
Effect: source.Effect,
Value: source.Value,
TimeAdded: source.TimeAdded,
}
}
return rtn
}
func GetStringsFromTaint(taints []v1.Taint) []string {
var rtn []string
for _, taint := range taints {
rtn = append(rtn, GetTaintsString(taint))
}
return rtn
}
func GetTaintsFromStrings(sources []string) []v1.Taint {
var rtn []v1.Taint
for _, source := range sources {
taint := GetTaintFromString(source)
if taint == nil {
continue
}
rtn = append(rtn, *taint)
}
return rtn
}
// MergeTaints will override t1 taint by t2 with same key and effect
func MergeTaints(t1 []v1.Taint, t2 []v1.Taint) []v1.Taint {
set1 := GetKeyEffectTaintSet(t1)
set2 := GetKeyEffectTaintSet(t2)
rtn := t2
for key, i := range set1 {
if j, ok := set2[key]; ok {
logrus.Infof("overriding taint %s with %s", GetTaintsString(t1[i]), GetTaintsString(t2[j]))
continue
}
rtn = append(rtn, t1[i])
}
return rtn
}