Path: blob/main/install/installer/pkg/common/render_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"testing"89"github.com/google/go-cmp/cmp"10"github.com/stretchr/testify/require"11corev1 "k8s.io/api/core/v1"12"k8s.io/apimachinery/pkg/api/resource"13"k8s.io/apimachinery/pkg/runtime"14"k8s.io/utils/pointer"1516"github.com/gitpod-io/gitpod/installer/pkg/common"17content_service "github.com/gitpod-io/gitpod/installer/pkg/components/content-service"18"github.com/gitpod-io/gitpod/installer/pkg/components/dashboard"19"github.com/gitpod-io/gitpod/installer/pkg/components/server"20config "github.com/gitpod-io/gitpod/installer/pkg/config/v1"21"github.com/gitpod-io/gitpod/installer/pkg/config/versions"22)2324func TestCompositeRenderFunc_NilObjectsNilError(t *testing.T) {25f := common.CompositeRenderFunc(26func(cfg *common.RenderContext) ([]runtime.Object, error) {27return nil, nil28})2930ctx, err := common.NewRenderContext(config.Config{}, versions.Manifest{}, "test_namespace")31require.NoError(t, err)3233objects, err := f(ctx)34require.NoError(t, err)35require.Len(t, objects, 0)36}3738func TestReplicas(t *testing.T) {39testCases := []struct {40Component string41Name string42ExpectedReplicas int3243}{44{45Component: server.Component,46Name: "server takes replica count from common config",47ExpectedReplicas: 123,48},49{50Component: dashboard.Component,51Name: "dashboard takes replica count from common config",52ExpectedReplicas: 456,53},54{55Component: content_service.Component,56Name: "content_service takes default replica count",57ExpectedReplicas: 1,58},59}60ctx, err := common.NewRenderContext(config.Config{61Components: &config.Components{62PodConfig: map[string]*config.PodConfig{63"server": {Replicas: pointer.Int32(123)},64"dashboard": {Replicas: pointer.Int32(456)},65},66},67}, versions.Manifest{}, "test_namespace")68require.NoError(t, err)6970for _, testCase := range testCases {71t.Run(testCase.Name, func(t *testing.T) {72actualReplicas := common.Replicas(ctx, testCase.Component)7374if *actualReplicas != testCase.ExpectedReplicas {75t.Errorf("expected %d replicas for %q component, but got %d",76testCase.ExpectedReplicas, testCase.Component, *actualReplicas)77}78})79}80}8182func TestResourceRequirements(t *testing.T) {83defaultResources := corev1.ResourceRequirements{84Requests: corev1.ResourceList{85"cpu": resource.MustParse("200m"),86"memory": resource.MustParse("200Mi"),87},88Limits: corev1.ResourceList{89"cpu": resource.MustParse("200m"),90"memory": resource.MustParse("200Mi"),91},92}9394serverResources := corev1.ResourceRequirements{95Requests: corev1.ResourceList{96"cpu": resource.MustParse("50m"),97"memory": resource.MustParse("100Mi"),98},99Limits: corev1.ResourceList{100"cpu": resource.MustParse("500m"),101"memory": resource.MustParse("800Mi"),102},103}104105dashboardResources := corev1.ResourceRequirements{106Requests: corev1.ResourceList{107"cpu": resource.MustParse("60m"),108"memory": resource.MustParse("100Mi"),109},110Limits: corev1.ResourceList{111"cpu": resource.MustParse("100m"),112"memory": resource.MustParse("500Mi"),113},114}115116testCases := []struct {117Component string118ContainerName string119Name string120ExpectedResources corev1.ResourceRequirements121}{122{123Component: server.Component,124ContainerName: server.Component,125Name: "server takes resource requirements from config",126ExpectedResources: serverResources,127},128{129Component: dashboard.Component,130ContainerName: dashboard.Component,131Name: "dashboard takes resource requirements from config",132ExpectedResources: dashboardResources,133},134{135Component: content_service.Component,136Name: "content_service takes default resource requirements",137ExpectedResources: defaultResources,138},139}140ctx, err := common.NewRenderContext(config.Config{141Components: &config.Components{142PodConfig: map[string]*config.PodConfig{143server.Component: {144Resources: map[string]*corev1.ResourceRequirements{145server.Component: &serverResources,146},147},148dashboard.Component: {149Resources: map[string]*corev1.ResourceRequirements{150dashboard.Component: &dashboardResources,151},152},153},154},155}, versions.Manifest{}, "test_namespace")156require.NoError(t, err)157158for _, testCase := range testCases {159t.Run(testCase.Name, func(t *testing.T) {160actualResources := common.ResourceRequirements(ctx, testCase.Component, testCase.ContainerName, defaultResources)161162if actualResources.Limits["cpu"] != testCase.ExpectedResources.Limits["cpu"] {163t.Errorf("expected cpu limits for container %q in component %q to be %+v, but got %+v",164testCase.Component, testCase.ContainerName, testCase.ExpectedResources.Limits["cpu"], actualResources.Limits["cpu"])165}166if actualResources.Limits["memory"] != testCase.ExpectedResources.Limits["memory"] {167t.Errorf("expected memory limits for container %q in component %q to be %+v, but got %+v",168testCase.Component, testCase.ContainerName, testCase.ExpectedResources.Limits["memory"], actualResources.Limits["memory"])169}170if actualResources.Requests["cpu"] != testCase.ExpectedResources.Requests["cpu"] {171t.Errorf("expected cpu requests for container %q in component %q to be %+v, but got %+v",172testCase.Component, testCase.ContainerName, testCase.ExpectedResources.Requests["cpu"], actualResources.Requests["cpu"])173}174if actualResources.Requests["memory"] != testCase.ExpectedResources.Requests["memory"] {175t.Errorf("expected memory requests for container %q in component %q to be %+v, but got %+v",176testCase.Component, testCase.ContainerName, testCase.ExpectedResources.Requests["memory"], actualResources.Requests["memory"])177}178})179}180}181182func TestRepoName(t *testing.T) {183type Expectation struct {184Result string185Panics bool186}187tests := []struct {188Repo string189Name string190Expectation Expectation191CfgRepo string192DropImageRepo *bool193}{194{195Name: "gitpod-io/workspace-full",196Expectation: Expectation{197Result: "docker.io/gitpod-io/workspace-full",198},199},200{201Repo: "some-repo.com",202Name: "some-image",203Expectation: Expectation{204Result: "some-repo.com/some-image",205},206},207{208Repo: "some-repo",209Name: "not@avalid#image-name",210Expectation: Expectation{211Panics: true,212},213},214// Drop repo, no namespace215{216Name: "gitpod-io/workspace-full",217Expectation: Expectation{218Result: "some.registry.com/workspace-full",219},220CfgRepo: "some.registry.com",221DropImageRepo: pointer.Bool(true),222},223{224Repo: "some-repo.com",225Name: "some-image",226Expectation: Expectation{227Result: "some.registry.com/some-image",228},229CfgRepo: "some.registry.com",230DropImageRepo: pointer.Bool(true),231},232{233Repo: "some-repo",234Name: "not@avalid#image-name",235Expectation: Expectation{236Panics: true,237},238CfgRepo: "some.registry.com",239DropImageRepo: pointer.Bool(true),240},241// Drop repo, namespace242{243Name: "gitpod-io/workspace-full",244Expectation: Expectation{245Result: "some.registry.com/gitpod/workspace-full",246},247CfgRepo: "some.registry.com/gitpod",248DropImageRepo: pointer.Bool(true),249},250{251Repo: "some-repo.com",252Name: "some-image",253Expectation: Expectation{254Result: "some.registry.com/gitpod/some-image",255},256CfgRepo: "some.registry.com/gitpod",257DropImageRepo: pointer.Bool(true),258},259{260Repo: "some-repo",261Name: "not@avalid#image-name",262Expectation: Expectation{263Panics: true,264},265CfgRepo: "some.registry.com/gitpod",266DropImageRepo: pointer.Bool(true),267},268}269270for _, test := range tests {271t.Run(test.Repo+"/"+test.Name, func(t *testing.T) {272var act Expectation273func() {274defer func() {275if recover() != nil {276act.Panics = true277}278}()279280ctx, err := common.NewRenderContext(config.Config{281DropImageRepo: test.DropImageRepo,282Repository: test.CfgRepo,283}, versions.Manifest{}, "test_namespace")284require.NoError(t, err)285286act.Result = ctx.RepoName(test.Repo, test.Name)287}()288289if diff := cmp.Diff(test.Expectation, act); diff != "" {290t.Errorf("RepoName() mismatch (-want +got):\n%s", diff)291}292})293}294}295296297