kubelatte-ce
Форк от sbertech/kubelatte-ce
251 строка · 6.3 Кб
1/*
2* Copyright (c) 2020, salesforce.com, inc.
3* All rights reserved.
4* SPDX-License-Identifier: BSD-3-Clause
5* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6*/
7
8package util9
10import (11"errors"12"fmt"13"gitverse.ru/synapse/kubelatte/pkg/api/v1alpha1"14"gitverse.ru/synapse/kubelatte/pkg/util/env"15corev1 "k8s.io/api/core/v1"16"reflect"17"runtime"18"strings"19)
20
21var ErrUnmarshalling = errors.New("unmarshalling error")22
23type ConditionStatus string24
25type RenderItem struct {26Template v1alpha1.Template27Render string28Action string29CreationIsUniqueName bool30}
31
32// GetAnnotation formats a fully qualified annotation from a prefix and a name.
33// For example, with prefix "annotation.io" and name "key", it returns "annotation.io/key".
34func GetAnnotation(prefix, name string) string {35// See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/.36return fmt.Sprintf("%s/%s", prefix, name)37}
38
39func GetFunctionName(i interface{}) string {40return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name()41}
42
43// MergeVolumes merges target with added, but only if a Volume does not exist in target.
44func MergeVolumes(target, added []corev1.Volume) []corev1.Volume {45return append(target, DeDuplicateVolumes(target, added)...)46}
47
48// MergeVolumeMounts merges target with added, but only if a Volume does not exist in target.
49func MergeVolumeMounts(target, added []corev1.VolumeMount) []corev1.VolumeMount {50return append(target, DeDuplicateVolumeMounts(target, added)...)51}
52
53// DeDuplicateVolumes returns all or some of added only if they do not already exist in target
54func DeDuplicateVolumes(target, added []corev1.Volume) []corev1.Volume {55var uniqueVolumes []corev1.Volume56targetNames := map[string]bool{}57for _, v := range target {58targetNames[v.Name] = true59}60for _, add := range added {61if _, exists := targetNames[add.Name]; !exists {62uniqueVolumes = append(uniqueVolumes, add)63}64}65return uniqueVolumes66}
67
68func GetLogLevel() string {69return env.LogLevel70}
71
72// DeDuplicateVolumes returns all or some of added only if they do not already exist in target
73func DeDuplicateContainers(target, added []corev1.Container) []corev1.Container {74var uniqueContainers []corev1.Container75targetNames := map[string]bool{}76for _, v := range target {77targetNames[v.Name] = true78}79for _, add := range added {80if _, exists := targetNames[add.Name]; !exists {81uniqueContainers = append(uniqueContainers, add)82}83}84return uniqueContainers85}
86
87// DeDuplicateVolumeMounts returns all or some of added only if they do not already exist in target
88func DeDuplicateVolumeMounts(target, added []corev1.VolumeMount) []corev1.VolumeMount {89var uniqueVolumeMounts []corev1.VolumeMount90targetNames := map[string]bool{}91for _, vm := range target {92targetNames[vm.Name] = true93}94for _, add := range added {95if _, exists := targetNames[add.Name]; !exists {96uniqueVolumeMounts = append(uniqueVolumeMounts, add)97}98}99return uniqueVolumeMounts100}
101
102func MergeSliceWithoutDuplicate(aT, aS []interface{}) []interface{} {103for _, item := range aS {104found := false105if reflect.TypeOf(item).Kind() == reflect.Map {106name, ok := item.(map[string]interface{})["name"]107if ok {108for i, origItem := range aT {109if reflect.TypeOf(origItem).Kind() == reflect.Map {110origName, ok := origItem.(map[string]interface{})["name"]111if ok {112if name == origName {113found = true114aT[i] = MergeStruct(origItem.(map[string]interface{}), item.(map[string]interface{}), true)115}116}117}118}119if !found {120aT = append(aT, item)121}122} else {123aT = append(aT, item)124}125} else {126if !contains(aT, item) {127aT = append(aT, item)128}129}130}131
132return aT133}
134
135func contains(s []interface{}, e interface{}) bool {136for _, a := range s {137if a == e {138return true139}140}141return false142}
143
144func MergeSliceCommon(aT []interface{}, aS []interface{}, dupl bool) []interface{} {145if dupl {146return MergeSliceWithoutDuplicate(aT, aS)147} else {148MergeSlice(aT, aS)149}150return nil151}
152
153func MergeSlice(aT []interface{}, aS []interface{}) []interface{} {154for _, item := range aS {155found := false156if item == nil {157aT = append(aT, nil)158}159if reflect.TypeOf(item).Kind() == reflect.Map {160name, ok := item.(map[string]interface{})["name"]161if ok {162for i, origItem := range aT {163if reflect.TypeOf(origItem).Kind() == reflect.Map {164origName, ok := origItem.(map[string]interface{})["name"]165if ok {166if name == origName {167found = true168aT[i] = MergeStruct(origItem.(map[string]interface{}), item.(map[string]interface{}), false)169}170}171}172}173if !found {174aT = append(aT, item)175}176} else {177aT = append(aT, item)178}179} else {180aT = append(aT, item)181}182}183
184return aT185}
186
187func MergeStruct(aT map[string]interface{}, aS map[string]interface{}, dupl bool) map[string]interface{} {188for k, item := range aS {189if item == nil {190aT[k] = nil191continue192}193if reflect.TypeOf(item).Kind() == reflect.Map {194val, ok := aT[k]195if ok {196aT[k] = MergeStruct(val.(map[string]interface{}), item.(map[string]interface{}), dupl)197} else {198aT[k] = item199}200} else if reflect.TypeOf(item).Kind() == reflect.Slice {201_, ok := aT[k]202if ok {203aT[k] = MergeSliceCommon(aT[k].([]interface{}), item.([]interface{}), dupl)204} else {205aT[k] = item206}207} else {208aT[k] = item209}210}211return aT212}
213
214func WrapString(field, render string) string {215return field + ": " + render216}
217
218func WrapList(field, render string) string {219if strings.Index(render, "-") < strings.Index(render, "\n") {220render = strings.Replace(render, "-", "\n-", 1)221}222render = strings.ReplaceAll(render, "\n", "\n ")223render = field + ":\n" + render224return render225}
226
227type Patch struct {228Op string `json:"op"`229From string `json:"from,omitempty"`230Path string `json:"path"`231OldValue interface{} `json:"-"`232Value interface{} `json:"value,omitempty"`233}
234
235func IsCreationInClusterMode() bool {236return env.CreationMode == "cluster"237}
238
239func IsFullRole() bool {240if env.KbltMutator && env.KbltValidator {241return true242}243return false244}
245
246func IsCreatorOnlyRole() bool {247if env.KbltCreator && !env.KbltSideEffect && !env.KbltMutator && !env.KbltValidator {248return true249}250return false251}
252