Path: blob/main/install/installer/pkg/common/customize_test.go
2500 views
// Copyright (c) 2022 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 common_test56import (7"reflect"8"testing"910"github.com/stretchr/testify/require"11corev1 "k8s.io/api/core/v1"12metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"1314"github.com/gitpod-io/gitpod/installer/pkg/common"15"github.com/gitpod-io/gitpod/installer/pkg/components/proxy"16config "github.com/gitpod-io/gitpod/installer/pkg/config/v1"17"github.com/gitpod-io/gitpod/installer/pkg/config/versions"18)1920func TestCustomizeAnnotation(t *testing.T) {21testCases := []struct {22Name string23Customization []config.Customization24Component string25TypeMeta metav1.TypeMeta26ExistingAnnotations []func() map[string]string27Expect map[string]string28}{29{30Name: "no customization",31Customization: nil,32Component: "component",33TypeMeta: common.TypeMetaDeployment,34Expect: map[string]string{},35},36{37Customization: []config.Customization{},38Name: "empty customization",39Component: "component",40TypeMeta: common.TypeMetaDeployment,41Expect: map[string]string{},42},43{44Customization: []config.Customization{45{46TypeMeta: common.TypeMetaBatchJob,47Metadata: metav1.ObjectMeta{48Name: "component",49Annotations: map[string]string{50"key1": "value1",51},52},53},54},55Name: "ignore different typeMeta annotations",56Component: "component",57TypeMeta: common.TypeMetaDeployment,58Expect: map[string]string{},59},60{61Customization: []config.Customization{62{63TypeMeta: common.TypeMetaDeployment,64Metadata: metav1.ObjectMeta{65Name: "component2",66Annotations: map[string]string{67"key1": "value1",68},69},70},71},72Name: "ignore same typeMeta, different name annotations",73Component: "component",74TypeMeta: common.TypeMetaDeployment,75Expect: map[string]string{},76},77{78Customization: []config.Customization{79{80TypeMeta: common.TypeMetaDeployment,81Metadata: metav1.ObjectMeta{82Name: "component",83Annotations: map[string]string{84"key1": "value1",85},86},87},88},89Name: "single component annotations",90Component: "component",91TypeMeta: common.TypeMetaDeployment,92Expect: map[string]string{93"key1": "value1",94},95},96{97Customization: []config.Customization{98{99TypeMeta: common.TypeMetaDeployment,100Metadata: metav1.ObjectMeta{101Name: "component",102Annotations: map[string]string{103"key1": "value1",104"key2": "value2",105},106},107},108{109TypeMeta: common.TypeMetaDeployment,110Metadata: metav1.ObjectMeta{111Name: "component",112Annotations: map[string]string{113"key3": "value3",114},115},116},117},118Name: "multiple component annotations",119Component: "component",120TypeMeta: common.TypeMetaDeployment,121Expect: map[string]string{122"key1": "value1",123"key2": "value2",124"key3": "value3",125},126},127{128Customization: []config.Customization{129{130TypeMeta: metav1.TypeMeta{131APIVersion: "*",132Kind: "*",133},134Metadata: metav1.ObjectMeta{135Name: "*",136Annotations: map[string]string{137"key1": "value1",138},139},140},141},142Name: "wildcard annotations",143Component: "component",144TypeMeta: common.TypeMetaDeployment,145Expect: map[string]string{146"key1": "value1",147},148},149{150Customization: []config.Customization{151{152TypeMeta: metav1.TypeMeta{153APIVersion: "*",154Kind: "*",155},156Metadata: metav1.ObjectMeta{157Name: "*",158Annotations: map[string]string{159"key1": "value1",160"key2": "override",161"key3": "",162},163},164},165},166Name: "override input, do not override existing",167Component: "component",168TypeMeta: common.TypeMetaDeployment,169ExistingAnnotations: []func() map[string]string{170func() map[string]string {171return map[string]string{172"key2": "original",173}174},175},176Expect: map[string]string{177"key1": "value1",178"key2": "original",179"key3": "",180},181},182{183Customization: []config.Customization{184{185TypeMeta: metav1.TypeMeta{186APIVersion: "v1",187Kind: "Service",188},189Metadata: metav1.ObjectMeta{190Name: "proxy",191Annotations: map[string]string{192"service.beta.kubernetes.io/aws-load-balancer-ip-address-type": "ipv4",193},194},195},196},197Name: "Test service #11106",198TypeMeta: common.TypeMetaService,199Component: proxy.Component,200Expect: map[string]string{201"service.beta.kubernetes.io/aws-load-balancer-ip-address-type": "ipv4",202},203},204}205206for _, testCase := range testCases {207t.Run(testCase.Name, func(t *testing.T) {208ctx, err := common.NewRenderContext(config.Config{209Customization: &testCase.Customization,210}, versions.Manifest{}, "test_namespace")211require.NoError(t, err)212213result := common.CustomizeAnnotation(ctx, testCase.Component, testCase.TypeMeta, testCase.ExistingAnnotations...)214215if !reflect.DeepEqual(testCase.Expect, result) {216t.Errorf("expected %v but got %v", testCase.Expect, result)217}218})219}220}221222func TestCustomizeLabel(t *testing.T) {223testCases := []struct {224Name string225Customization []config.Customization226Component string227TypeMeta metav1.TypeMeta228ExistingLabels []func() map[string]string229Expect map[string]string230}{231{232Name: "no customization",233Customization: nil,234Component: "component",235TypeMeta: common.TypeMetaDeployment,236Expect: map[string]string{},237},238{239Customization: []config.Customization{},240Name: "empty customization",241Component: "component",242TypeMeta: common.TypeMetaDeployment,243Expect: map[string]string{},244},245{246Customization: []config.Customization{247{248TypeMeta: common.TypeMetaBatchJob,249Metadata: metav1.ObjectMeta{250Name: "component",251Labels: map[string]string{252"key1": "value1",253},254},255},256},257Name: "ignore different typeMeta labels",258Component: "component",259TypeMeta: common.TypeMetaDeployment,260Expect: map[string]string{},261},262{263Customization: []config.Customization{264{265TypeMeta: common.TypeMetaDeployment,266Metadata: metav1.ObjectMeta{267Name: "component2",268Labels: map[string]string{269"key1": "value1",270},271},272},273},274Name: "ignore same typeMeta, different name labels",275Component: "component",276TypeMeta: common.TypeMetaDeployment,277Expect: map[string]string{},278},279{280Customization: []config.Customization{281{282TypeMeta: common.TypeMetaDeployment,283Metadata: metav1.ObjectMeta{284Name: "component",285Labels: map[string]string{286"key1": "value1",287},288},289},290},291Name: "single component labels",292Component: "component",293TypeMeta: common.TypeMetaDeployment,294Expect: map[string]string{295"key1": "value1",296},297},298{299Customization: []config.Customization{300{301TypeMeta: common.TypeMetaDeployment,302Metadata: metav1.ObjectMeta{303Name: "component",304Labels: map[string]string{305"key1": "value1",306"key2": "value2",307},308},309},310{311TypeMeta: common.TypeMetaDeployment,312Metadata: metav1.ObjectMeta{313Name: "component",314Labels: map[string]string{315"key3": "value3",316},317},318},319},320Name: "multiple component labels",321Component: "component",322TypeMeta: common.TypeMetaDeployment,323Expect: map[string]string{324"key1": "value1",325"key2": "value2",326"key3": "value3",327},328},329{330Customization: []config.Customization{331{332TypeMeta: metav1.TypeMeta{333APIVersion: "*",334Kind: "*",335},336Metadata: metav1.ObjectMeta{337Name: "*",338Labels: map[string]string{339"key1": "value1",340},341},342},343},344Name: "wildcard labels",345Component: "component",346TypeMeta: common.TypeMetaDeployment,347Expect: map[string]string{348"key1": "value1",349},350},351{352Customization: []config.Customization{353{354TypeMeta: metav1.TypeMeta{355APIVersion: "*",356Kind: "*",357},358Metadata: metav1.ObjectMeta{359Name: "*",360Labels: map[string]string{361"key1": "value1",362"key2": "override",363"key3": "",364},365},366},367},368Name: "override input, do not override existing",369Component: "component",370TypeMeta: common.TypeMetaDeployment,371ExistingLabels: []func() map[string]string{372func() map[string]string {373return map[string]string{374"key2": "original",375}376},377},378Expect: map[string]string{379"key1": "value1",380"key2": "original",381"key3": "",382},383},384}385386for _, testCase := range testCases {387t.Run(testCase.Name, func(t *testing.T) {388ctx, err := common.NewRenderContext(config.Config{389Customization: &testCase.Customization,390}, versions.Manifest{}, "test_namespace")391require.NoError(t, err)392393result := common.CustomizeLabel(ctx, testCase.Component, testCase.TypeMeta, testCase.ExistingLabels...)394395// These all have the default labels - add these in396expectation := common.DefaultLabels(testCase.Component)397for k, v := range testCase.Expect {398expectation[k] = v399}400401if !reflect.DeepEqual(expectation, result) {402t.Errorf("expected %v but got %v", expectation, result)403}404})405}406}407408func TestCustomizeEnvvar(t *testing.T) {409testCases := []struct {410Name string411Customization []config.Customization412Component string413ExistingEnnvars []corev1.EnvVar414Expect []corev1.EnvVar415}{416{417Name: "no customization",418Customization: nil,419Component: "component",420Expect: []corev1.EnvVar{},421},422{423Customization: []config.Customization{},424Name: "empty customization",425Component: "component",426Expect: []corev1.EnvVar{},427},428{429Customization: []config.Customization{430{431TypeMeta: common.TypeMetaDeployment,432Metadata: metav1.ObjectMeta{433Name: "component2",434},435Spec: config.CustomizationSpec{436Env: []corev1.EnvVar{437{438Name: "key1",439Value: "value1",440},441},442},443},444},445Name: "ignore different name envvars",446Component: "component",447Expect: []corev1.EnvVar{},448},449{450Customization: []config.Customization{451{452TypeMeta: common.TypeMetaDeployment,453Metadata: metav1.ObjectMeta{454Name: "component",455},456Spec: config.CustomizationSpec{457Env: []corev1.EnvVar{458{459Name: "key1",460Value: "value1",461},462},463},464},465},466Name: "add in name envvars",467Component: "component",468Expect: []corev1.EnvVar{469{470Name: "key1",471Value: "value1",472},473},474},475{476Customization: []config.Customization{477{478Metadata: metav1.ObjectMeta{479Name: "*",480},481Spec: config.CustomizationSpec{482Env: []corev1.EnvVar{483{484Name: "key1",485Value: "original",486},487{488Name: "key2",489Value: "original",490},491{492Name: "key3",493Value: "override",494},495},496},497},498{499Metadata: metav1.ObjectMeta{500Name: "component",501},502Spec: config.CustomizationSpec{503Env: []corev1.EnvVar{504{505Name: "key1",506Value: "override",507},508},509},510},511},512ExistingEnnvars: []corev1.EnvVar{513{514Name: "key4",515Value: "value",516},517{518Name: "key3",519Value: "original",520},521},522Name: "full-house envvars",523Component: "component",524Expect: []corev1.EnvVar{525{526Name: "key4",527Value: "value",528},529{530Name: "key3",531Value: "original",532},533{534Name: "key1",535Value: "override",536},537{538Name: "key2",539Value: "original",540},541},542},543}544545for _, testCase := range testCases {546t.Run(testCase.Name, func(t *testing.T) {547ctx, err := common.NewRenderContext(config.Config{548Customization: &testCase.Customization,549}, versions.Manifest{}, "test_namespace")550require.NoError(t, err)551552result := common.CustomizeEnvvar(ctx, testCase.Component, testCase.ExistingEnnvars)553554if !reflect.DeepEqual(testCase.Expect, result) {555t.Errorf("expected %v but got %v", testCase.Expect, result)556}557})558}559}560561562