Path: blob/main/install/installer/pkg/postprocess/override.go
2501 views
// Copyright (c) 2023 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package postprocess56import (7"fmt"8"os"9"path"10"strings"1112"github.com/gitpod-io/gitpod/installer/pkg/common"13"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"14"github.com/gitpod-io/gitpod/installer/pkg/yq"15"sigs.k8s.io/yaml"16)1718func generateOverrideKey(apiVersion, kind, name string) string {19return strings.ToLower(fmt.Sprintf("%s-%s-%s", apiVersion, kind, name))20}2122// Merge two YAML strings together23func Merge(original string, data string) (*string, error) {24// Generate a temp directory and file25dir, err := os.MkdirTemp("", "override")26if err != nil {27return nil, err28}29fileName := path.Join(dir, "data.yaml")3031// Write the override file32if err := os.WriteFile(fileName, []byte(data), 0644); err != nil {33return nil, err34}3536// Use yq to merge two files together37// @link https://mikefarah.gitbook.io/yq/operators/multiply-merge#merge-two-files-together38output, err := yq.Process(original, fmt.Sprintf(`. *= load("%s")`, fileName))39if err != nil {40return nil, err41}4243return output, nil44}4546// Override the generated data from the overrides in the config47// This is an experimental feature until Gitpod Dedicated is in GA48func Override(overrideCfg *[]experimental.Overrides, objects []common.RuntimeObject) ([]common.RuntimeObject, error) {49if overrideCfg != nil && len(*overrideCfg) > 0 {50overrides := make(map[string]experimental.Overrides)5152for _, component := range *overrideCfg {53key := generateOverrideKey(component.APIVersion, component.Kind, component.Metadata.GetName())5455overrides[key] = component56}5758for k, v := range objects {59key := generateOverrideKey(v.APIVersion, v.Kind, v.Metadata.GetName())6061if override, ok := overrides[key]; ok {62// Marshal the override data to raw YAML63data, err := yaml.Marshal(override.Override)64if err != nil {65return nil, err66}6768if err != nil {69return nil, err70}7172// Merge the two YAML objects73content, err := Merge(v.Content, string(data))74if err != nil {75return nil, err76}7778// Update the output with the overriden YAML79objects[k].Content = *content80}81}82}8384return objects, nil85}868788