Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/install/installer/pkg/postprocess/override.go
2501 views
1
// Copyright (c) 2023 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package postprocess
6
7
import (
8
"fmt"
9
"os"
10
"path"
11
"strings"
12
13
"github.com/gitpod-io/gitpod/installer/pkg/common"
14
"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"
15
"github.com/gitpod-io/gitpod/installer/pkg/yq"
16
"sigs.k8s.io/yaml"
17
)
18
19
func generateOverrideKey(apiVersion, kind, name string) string {
20
return strings.ToLower(fmt.Sprintf("%s-%s-%s", apiVersion, kind, name))
21
}
22
23
// Merge two YAML strings together
24
func Merge(original string, data string) (*string, error) {
25
// Generate a temp directory and file
26
dir, err := os.MkdirTemp("", "override")
27
if err != nil {
28
return nil, err
29
}
30
fileName := path.Join(dir, "data.yaml")
31
32
// Write the override file
33
if err := os.WriteFile(fileName, []byte(data), 0644); err != nil {
34
return nil, err
35
}
36
37
// Use yq to merge two files together
38
// @link https://mikefarah.gitbook.io/yq/operators/multiply-merge#merge-two-files-together
39
output, err := yq.Process(original, fmt.Sprintf(`. *= load("%s")`, fileName))
40
if err != nil {
41
return nil, err
42
}
43
44
return output, nil
45
}
46
47
// Override the generated data from the overrides in the config
48
// This is an experimental feature until Gitpod Dedicated is in GA
49
func Override(overrideCfg *[]experimental.Overrides, objects []common.RuntimeObject) ([]common.RuntimeObject, error) {
50
if overrideCfg != nil && len(*overrideCfg) > 0 {
51
overrides := make(map[string]experimental.Overrides)
52
53
for _, component := range *overrideCfg {
54
key := generateOverrideKey(component.APIVersion, component.Kind, component.Metadata.GetName())
55
56
overrides[key] = component
57
}
58
59
for k, v := range objects {
60
key := generateOverrideKey(v.APIVersion, v.Kind, v.Metadata.GetName())
61
62
if override, ok := overrides[key]; ok {
63
// Marshal the override data to raw YAML
64
data, err := yaml.Marshal(override.Override)
65
if err != nil {
66
return nil, err
67
}
68
69
if err != nil {
70
return nil, err
71
}
72
73
// Merge the two YAML objects
74
content, err := Merge(v.Content, string(data))
75
if err != nil {
76
return nil, err
77
}
78
79
// Update the output with the overriden YAML
80
objects[k].Content = *content
81
}
82
}
83
}
84
85
return objects, nil
86
}
87
88