kubelatte-ce
Форк от sbertech/kubelatte-ce
246 строк · 6.2 Кб
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"strings"18)
19
20var ErrUnmarshalling = errors.New("unmarshalling error")21
22type ConditionStatus string23
24type RenderItem struct {25Template v1alpha1.Template26Render string27Action string28CreationIsUniqueName bool29}
30
31// GetAnnotation formats a fully qualified annotation from a prefix and a name.
32// For example, with prefix "annotation.io" and name "key", it returns "annotation.io/key".
33func GetAnnotation(prefix, name string) string {34// See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/.35return fmt.Sprintf("%s/%s", prefix, name)36}
37
38// MergeVolumes merges target with added, but only if a Volume does not exist in target.
39func MergeVolumes(target, added []corev1.Volume) []corev1.Volume {40return append(target, DeDuplicateVolumes(target, added)...)41}
42
43// MergeVolumeMounts merges target with added, but only if a Volume does not exist in target.
44func MergeVolumeMounts(target, added []corev1.VolumeMount) []corev1.VolumeMount {45return append(target, DeDuplicateVolumeMounts(target, added)...)46}
47
48// DeDuplicateVolumes returns all or some of added only if they do not already exist in target
49func DeDuplicateVolumes(target, added []corev1.Volume) []corev1.Volume {50var uniqueVolumes []corev1.Volume51targetNames := map[string]bool{}52for _, v := range target {53targetNames[v.Name] = true54}55for _, add := range added {56if _, exists := targetNames[add.Name]; !exists {57uniqueVolumes = append(uniqueVolumes, add)58}59}60return uniqueVolumes61}
62
63func GetLogLevel() string {64return env.LogLevel65}
66
67// DeDuplicateVolumes returns all or some of added only if they do not already exist in target
68func DeDuplicateContainers(target, added []corev1.Container) []corev1.Container {69var uniqueContainers []corev1.Container70targetNames := map[string]bool{}71for _, v := range target {72targetNames[v.Name] = true73}74for _, add := range added {75if _, exists := targetNames[add.Name]; !exists {76uniqueContainers = append(uniqueContainers, add)77}78}79return uniqueContainers80}
81
82// DeDuplicateVolumeMounts returns all or some of added only if they do not already exist in target
83func DeDuplicateVolumeMounts(target, added []corev1.VolumeMount) []corev1.VolumeMount {84var uniqueVolumeMounts []corev1.VolumeMount85targetNames := map[string]bool{}86for _, vm := range target {87targetNames[vm.Name] = true88}89for _, add := range added {90if _, exists := targetNames[add.Name]; !exists {91uniqueVolumeMounts = append(uniqueVolumeMounts, add)92}93}94return uniqueVolumeMounts95}
96
97func MergeSliceWithoutDuplicate(aT, aS []interface{}) []interface{} {98for _, item := range aS {99found := false100if reflect.TypeOf(item).Kind() == reflect.Map {101name, ok := item.(map[string]interface{})["name"]102if ok {103for i, origItem := range aT {104if reflect.TypeOf(origItem).Kind() == reflect.Map {105origName, ok := origItem.(map[string]interface{})["name"]106if ok {107if name == origName {108found = true109aT[i] = MergeStruct(origItem.(map[string]interface{}), item.(map[string]interface{}), true)110}111}112}113}114if !found {115aT = append(aT, item)116}117} else {118aT = append(aT, item)119}120} else {121if !contains(aT, item) {122aT = append(aT, item)123}124}125}126
127return aT128}
129
130func contains(s []interface{}, e interface{}) bool {131for _, a := range s {132if a == e {133return true134}135}136return false137}
138
139func MergeSliceCommon(aT []interface{}, aS []interface{}, dupl bool) []interface{} {140if dupl {141return MergeSliceWithoutDuplicate(aT, aS)142} else {143MergeSlice(aT, aS)144}145return nil146}
147
148func MergeSlice(aT []interface{}, aS []interface{}) []interface{} {149for _, item := range aS {150found := false151if item == nil {152aT = append(aT, nil)153}154if reflect.TypeOf(item).Kind() == reflect.Map {155name, ok := item.(map[string]interface{})["name"]156if ok {157for i, origItem := range aT {158if reflect.TypeOf(origItem).Kind() == reflect.Map {159origName, ok := origItem.(map[string]interface{})["name"]160if ok {161if name == origName {162found = true163aT[i] = MergeStruct(origItem.(map[string]interface{}), item.(map[string]interface{}), false)164}165}166}167}168if !found {169aT = append(aT, item)170}171} else {172aT = append(aT, item)173}174} else {175aT = append(aT, item)176}177}178
179return aT180}
181
182func MergeStruct(aT map[string]interface{}, aS map[string]interface{}, dupl bool) map[string]interface{} {183for k, item := range aS {184if item == nil {185aT[k] = nil186continue187}188if reflect.TypeOf(item).Kind() == reflect.Map {189val, ok := aT[k]190if ok {191aT[k] = MergeStruct(val.(map[string]interface{}), item.(map[string]interface{}), dupl)192} else {193aT[k] = item194}195} else if reflect.TypeOf(item).Kind() == reflect.Slice {196_, ok := aT[k]197if ok {198aT[k] = MergeSliceCommon(aT[k].([]interface{}), item.([]interface{}), dupl)199} else {200aT[k] = item201}202} else {203aT[k] = item204}205}206return aT207}
208
209func WrapString(field, render string) string {210return field + ": " + render211}
212
213func WrapList(field, render string) string {214if strings.Index(render, "-") < strings.Index(render, "\n") {215render = strings.Replace(render, "-", "\n-", 1)216}217render = strings.ReplaceAll(render, "\n", "\n ")218render = field + ":\n" + render219return render220}
221
222type Patch struct {223Op string `json:"op"`224From string `json:"from,omitempty"`225Path string `json:"path"`226OldValue interface{} `json:"-"`227Value interface{} `json:"value,omitempty"`228}
229
230func IsCreationInClusterMode() bool {231return env.CreationMode == "cluster"232}
233
234func IsFullRole() bool {235if env.KbltMutator && env.KbltValidator {236return true237}238return false239}
240
241func IsCreatorOnlyRole() bool {242if env.KbltCreator && !env.KbltSideEffect && !env.KbltMutator && !env.KbltValidator {243return true244}245return false246}
247