-
Notifications
You must be signed in to change notification settings - Fork 11
/
values.go
97 lines (84 loc) · 2.73 KB
/
values.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package valuesutil
import (
"context"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/agoda-com/samsahai/api/v1beta1"
"github.com/agoda-com/samsahai/internal/util"
)
// GetStableComponentsMap returns map of StableComponents in the namespace
func GetStableComponentsMap(c client.Client, namespace string) (stableMap map[string]v1beta1.StableComponent, err error) {
// get stable
stableList := &v1beta1.StableComponentList{}
err = c.List(context.Background(), stableList, &client.ListOptions{Namespace: namespace})
if err != nil {
return
}
// create StableComponentMap
stableMap = map[string]v1beta1.StableComponent{}
for _, stable := range stableList.Items {
stable := stable
stableMap[stable.Name] = stable
}
return
}
// GenStableComponentValues returns Values of the component combine with stable version of itself and its dependencies
func GenStableComponentValues(
comp *v1beta1.Component,
stableMap map[string]v1beta1.StableComponent,
baseValues map[string]interface{},
) v1beta1.ComponentValues {
var values map[string]interface{}
if len(baseValues) > 0 {
values = util.CopyMap(baseValues)
values = MergeValues(values, comp.Values)
} else {
values = util.CopyMap(comp.Values)
}
// merge with StableComponent
if stableComp, exist := stableMap[comp.Name]; exist {
values = MergeValues(values, genCompValueFromStableComponent(&stableComp))
}
// merge dependencies with StableComponent
for _, dep := range comp.Dependencies {
if stableComp, exist := stableMap[dep.Name]; exist {
values = MergeValues(values, map[string]interface{}{
dep.Name: genCompValueFromStableComponent(&stableComp),
})
}
}
return values
}
func genCompValueFromStableComponent(stableComp *v1beta1.StableComponent) map[string]interface{} {
return map[string]interface{}{
"image": map[string]interface{}{
"repository": stableComp.Spec.Repository,
"tag": stableComp.Spec.Version,
},
}
}
// MergeValues merges source and destination map, preferring values from the source map
func MergeValues(base map[string]interface{}, target map[string]interface{}) map[string]interface{} {
for k, v := range target {
// If the key doesn't exist already, then just set the key to that value
if _, exists := base[k]; !exists {
base[k] = v
continue
}
nextMap, ok := v.(map[string]interface{})
// If it isn't another map, overwrite the value
if !ok {
base[k] = v
continue
}
// Edge case: If the key exists in the destination, but isn't a map
destMap, isMap := base[k].(map[string]interface{})
// If the source map has a map for this key, prefer it
if !isMap {
base[k] = v
continue
}
// If we got to this point, it is a map in both, so merge them
base[k] = MergeValues(destMap, nextMap)
}
return base
}