package utils import ( "fmt" "strings" v1 "k8s.io/api/core/v1" apitypes "k8s.io/apimachinery/pkg/types" ) func MergeEnv(mode MergeMode, envs ...[]v1.EnvVar) []v1.EnvVar { envMap := make(map[string]v1.EnvVar) for _, envvars := range envs { for _, envvar := range envvars { switch mode { case MergeOverrideByFirst: if _, ok := envMap[envvar.Name]; !ok { envMap[envvar.Name] = envvar } case MergeOverrideByLatest: envMap[envvar.Name] = envvar case MergeValue: if old, ok := envMap[envvar.Name]; !ok { envMap[envvar.Name] = envvar } else { envMap[envvar.Name] = v1.EnvVar{ Name: envvar.Name, Value: strings.Join([]string{old.Value, envvar.Value}, " "), } } } } } res := []v1.EnvVar{} for _, v := range envMap { res = append(res, v) } return res } func MergeObjectReferences(mergeMode MergeMode, orList ...[]v1.ObjectReference) ([]v1.ObjectReference, error) { res := []v1.ObjectReference{} if mergeMode == MergeValue { return res, fmt.Errorf("cannot support merge value") } resMap := make(map[string]v1.ObjectReference) for _, ors := range orList { for _, or := range ors { key := strings.Join([]string{or.Namespace, or.Name}, ".") switch mergeMode { case MergeOverrideByFirst: if _, ok := resMap[key]; !ok { resMap[key] = or } case MergeOverrideByLatest: resMap[key] = or } } } for _, or := range resMap { res = append(res, or) } return res, nil } func MergeLocalObjectReferences(mergeMode MergeMode, orList ...[]v1.LocalObjectReference) ([]v1.LocalObjectReference, error) { res := []v1.LocalObjectReference{} if mergeMode == MergeValue { return res, fmt.Errorf("cannot support merge value") } resMap := make(map[string]v1.LocalObjectReference) for _, ors := range orList { for _, or := range ors { switch mergeMode { case MergeOverrideByFirst: if _, ok := resMap[or.Name]; !ok { resMap[or.Name] = or } case MergeOverrideByLatest: resMap[or.Name] = or } } } for _, or := range resMap { res = append(res, or) } return res, nil } func NamespacedNameFromObjectReference(ref v1.ObjectReference) apitypes.NamespacedName { return apitypes.NamespacedName{ Namespace: ref.Namespace, Name: ref.Name, } }