2022-12-08 13:05:19 -03:00

213 lines
6.1 KiB
Go

// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package wsmanager
import (
"encoding/json"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/require"
corev1 "k8s.io/api/core/v1"
"k8s.io/utils/pointer"
"github.com/gitpod-io/gitpod/installer/pkg/common"
config "github.com/gitpod-io/gitpod/installer/pkg/config/v1"
"github.com/gitpod-io/gitpod/installer/pkg/config/versions"
wsmancfg "github.com/gitpod-io/gitpod/ws-manager/api/config"
)
func TestBuildWorkspaceTemplates(t *testing.T) {
type Expectation struct {
TplConfig wsmancfg.WorkspacePodTemplateConfiguration
Data map[string]bool
}
tests := []struct {
Name string
ClassName string
Config *config.WorkspaceTemplates
ContainerRegistry *config.ContainerRegistry
Expectation Expectation
}{
{
Name: "no templates",
ClassName: "",
Expectation: Expectation{},
},
{
Name: "empty templates",
ClassName: "",
Config: &config.WorkspaceTemplates{},
Expectation: Expectation{},
},
{
Name: "default tpl",
ClassName: "",
Config: &config.WorkspaceTemplates{
Default: &corev1.Pod{},
},
Expectation: Expectation{
TplConfig: wsmancfg.WorkspacePodTemplateConfiguration{DefaultPath: "/workspace-templates/default.yaml"},
Data: map[string]bool{"default.yaml": true},
},
},
{
Name: "regular tpl",
ClassName: "",
Config: &config.WorkspaceTemplates{
Regular: &corev1.Pod{},
},
Expectation: Expectation{
TplConfig: wsmancfg.WorkspacePodTemplateConfiguration{
RegularPath: "/workspace-templates/regular.yaml",
},
Data: map[string]bool{
"regular.yaml": true,
},
},
},
{
Name: "prebuild tpl",
ClassName: "",
Config: &config.WorkspaceTemplates{
Prebuild: &corev1.Pod{},
},
Expectation: Expectation{
TplConfig: wsmancfg.WorkspacePodTemplateConfiguration{
PrebuildPath: "/workspace-templates/prebuild.yaml",
},
Data: map[string]bool{
"prebuild.yaml": true,
},
},
},
{
Name: "imgbuild tpl",
ClassName: "",
Config: &config.WorkspaceTemplates{
ImageBuild: &corev1.Pod{},
},
Expectation: Expectation{
TplConfig: wsmancfg.WorkspacePodTemplateConfiguration{
ImagebuildPath: "/workspace-templates/imagebuild.yaml",
},
Data: map[string]bool{
"imagebuild.yaml": true,
},
},
},
{
Name: "regular class tpl",
ClassName: "awesome-class",
Config: &config.WorkspaceTemplates{
Regular: &corev1.Pod{},
},
Expectation: Expectation{
TplConfig: wsmancfg.WorkspacePodTemplateConfiguration{
RegularPath: "/workspace-templates/awesome-class-regular.yaml",
},
Data: map[string]bool{
"awesome-class-regular.yaml": true,
},
},
},
}
for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
var (
act Expectation
tpls map[string]string
err error
)
if test.ContainerRegistry == nil {
test.ContainerRegistry = &config.ContainerRegistry{InCluster: pointer.Bool(true)}
}
act.TplConfig, tpls, err = buildWorkspaceTemplates(&common.RenderContext{Config: config.Config{
ContainerRegistry: *test.ContainerRegistry,
}}, test.Config, test.ClassName)
if err != nil {
t.Error(err)
}
if len(tpls) > 0 {
dt := make(map[string]bool)
for k := range tpls {
dt[k] = true
}
act.Data = dt
}
if diff := cmp.Diff(test.Expectation, act); diff != "" {
t.Errorf("Expectation mismatch (-want +got):\n%s", diff)
}
})
}
}
func TestWorkspaceURLTemplates(t *testing.T) {
tests := []struct {
Name string
Domain string
InstallationShortname string
ExpectedWorkspaceUrlTemplate string
ExpectedWorkspacePortURLTemplate string
}{
{
Name: "With an installation shortname",
Domain: "example.com",
InstallationShortname: "eu02",
ExpectedWorkspaceUrlTemplate: "https://{{ .Prefix }}.ws-eu02.example.com",
ExpectedWorkspacePortURLTemplate: "https://{{ .WorkspacePort }}-{{ .Prefix }}.ws-eu02.example.com",
},
{
Name: "Without an installation shortname",
Domain: "example.com",
InstallationShortname: "",
ExpectedWorkspaceUrlTemplate: "https://{{ .Prefix }}.ws.example.com",
ExpectedWorkspacePortURLTemplate: "https://{{ .WorkspacePort }}-{{ .Prefix }}.ws.example.com",
},
{
Name: "With old default installation shortname for existing self-hosted installations",
Domain: "example.com",
InstallationShortname: config.InstallationShortNameOldDefault,
ExpectedWorkspaceUrlTemplate: "https://{{ .Prefix }}.ws.example.com",
ExpectedWorkspacePortURLTemplate: "https://{{ .WorkspacePort }}-{{ .Prefix }}.ws.example.com",
},
}
for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
ctx, err := common.NewRenderContext(config.Config{
Domain: test.Domain,
Metadata: config.Metadata{
InstallationShortname: test.InstallationShortname,
},
ObjectStorage: config.ObjectStorage{
InCluster: pointer.Bool(true),
},
}, versions.Manifest{}, "test_namespace")
require.NoError(t, err)
objs, err := configmap(ctx)
require.NoError(t, err)
cfgmap, ok := objs[0].(*corev1.ConfigMap)
require.Truef(t, ok, "configmap function did not return a configmap")
configJson, ok := cfgmap.Data["config.json"]
require.Truef(t, ok, "configmap data did not contain %q key", "config.json")
serviceConfig := wsmancfg.ServiceConfiguration{}
json.Unmarshal([]byte(configJson), &serviceConfig)
require.Equal(t, test.ExpectedWorkspaceUrlTemplate, serviceConfig.Manager.WorkspaceURLTemplate)
require.Equal(t, test.ExpectedWorkspacePortURLTemplate, serviceConfig.Manager.WorkspacePortURLTemplate)
})
}
}