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 util
9
10import (
11"errors"
12"fmt"
13"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/api/v1alpha1"
14"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/util/env"
15corev1 "k8s.io/api/core/v1"
16"reflect"
17"strings"
18)
19
20var ErrUnmarshalling = errors.New("unmarshalling error")
21
22type ConditionStatus string
23
24type RenderItem struct {
25Template v1alpha1.Template
26Render string
27Action string
28CreationIsUniqueName bool
29}
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.Volume
51targetNames := map[string]bool{}
52for _, v := range target {
53targetNames[v.Name] = true
54}
55for _, add := range added {
56if _, exists := targetNames[add.Name]; !exists {
57uniqueVolumes = append(uniqueVolumes, add)
58}
59}
60return uniqueVolumes
61}
62
63func GetLogLevel() string {
64return env.LogLevel
65}
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.Container
70targetNames := map[string]bool{}
71for _, v := range target {
72targetNames[v.Name] = true
73}
74for _, add := range added {
75if _, exists := targetNames[add.Name]; !exists {
76uniqueContainers = append(uniqueContainers, add)
77}
78}
79return uniqueContainers
80}
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.VolumeMount
85targetNames := map[string]bool{}
86for _, vm := range target {
87targetNames[vm.Name] = true
88}
89for _, add := range added {
90if _, exists := targetNames[add.Name]; !exists {
91uniqueVolumeMounts = append(uniqueVolumeMounts, add)
92}
93}
94return uniqueVolumeMounts
95}
96
97func MergeSliceWithoutDuplicate(aT, aS []interface{}) []interface{} {
98for _, item := range aS {
99found := false
100if 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 = true
109aT[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 aT
128}
129
130func contains(s []interface{}, e interface{}) bool {
131for _, a := range s {
132if a == e {
133return true
134}
135}
136return false
137}
138
139func MergeSliceCommon(aT []interface{}, aS []interface{}, dupl bool) []interface{} {
140if dupl {
141return MergeSliceWithoutDuplicate(aT, aS)
142} else {
143MergeSlice(aT, aS)
144}
145return nil
146}
147
148func MergeSlice(aT []interface{}, aS []interface{}) []interface{} {
149for _, item := range aS {
150found := false
151if 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 = true
163aT[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 aT
180}
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] = nil
186continue
187}
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] = item
194}
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] = item
201}
202} else {
203aT[k] = item
204}
205}
206return aT
207}
208
209func WrapString(field, render string) string {
210return field + ": " + render
211}
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" + render
219return render
220}
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 true
237}
238return false
239}
240
241func IsCreatorOnlyRole() bool {
242if env.KbltCreator && !env.KbltSideEffect && !env.KbltMutator && !env.KbltValidator {
243return true
244}
245return false
246}
247