mirror of
https://github.com/gitpod-io/gitpod.git
synced 2025-12-08 17:36:30 +00:00
180 lines
4.7 KiB
Go
180 lines
4.7 KiB
Go
// Copyright (c) 2022 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 (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/rpc"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
"sigs.k8s.io/e2e-framework/klient"
|
|
"sigs.k8s.io/e2e-framework/pkg/envconf"
|
|
"sigs.k8s.io/e2e-framework/pkg/features"
|
|
|
|
csapi "github.com/gitpod-io/gitpod/content-service/api"
|
|
agent "github.com/gitpod-io/gitpod/test/pkg/agent/workspace/api"
|
|
"github.com/gitpod-io/gitpod/test/pkg/integration"
|
|
wsmanapi "github.com/gitpod-io/gitpod/ws-manager/api"
|
|
)
|
|
|
|
func TestDotfiles(t *testing.T) {
|
|
userToken, _ := os.LookupEnv("USER_TOKEN")
|
|
integration.SkipWithoutUsername(t, username)
|
|
integration.SkipWithoutUserToken(t, userToken)
|
|
|
|
f := features.New("dotfiles").WithLabel("component", "ws-manager").Assess("ensure dotfiles are loaded", func(_ context.Context, t *testing.T, cfg *envconf.Config) context.Context {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
|
|
defer cancel()
|
|
|
|
api := integration.NewComponentAPI(ctx, cfg.Namespace(), kubeconfig, cfg.Client())
|
|
t.Cleanup(func() {
|
|
api.Done(t)
|
|
})
|
|
|
|
userId, err := api.CreateUser(username, userToken)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenId, err := api.CreateOAuth2Token(username, []string{
|
|
"function:getToken",
|
|
"function:openPort",
|
|
"function:getOpenPorts",
|
|
"function:guessGitTokenScopes",
|
|
"function:getWorkspace",
|
|
"resource:token::*::get",
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
swr := func(req *wsmanapi.StartWorkspaceRequest) error {
|
|
req.Spec.Envvars = append(req.Spec.Envvars,
|
|
&wsmanapi.EnvironmentVariable{
|
|
Name: "SUPERVISOR_DOTFILE_REPO",
|
|
Value: "https://github.com/gitpod-io/test-dotfiles-support",
|
|
},
|
|
&wsmanapi.EnvironmentVariable{
|
|
Name: "THEIA_SUPERVISOR_TOKENS",
|
|
Value: fmt.Sprintf(`[{
|
|
"token": "%v",
|
|
"kind": "gitpod",
|
|
"host": "%v",
|
|
"scope": ["function:getToken", "function:openPort", "function:getOpenPorts", "function:guessGitTokenScopes", "getWorkspace", "resource:token::*::get"],
|
|
"expiryDate": "2022-10-26T10:38:05.232Z",
|
|
"reuse": 4
|
|
}]`, tokenId, getHostUrl(ctx, t, cfg.Client())),
|
|
},
|
|
)
|
|
|
|
req.Spec.Initializer = &csapi.WorkspaceInitializer{
|
|
Spec: &csapi.WorkspaceInitializer_Git{
|
|
Git: &csapi.GitInitializer{
|
|
RemoteUri: "https://github.com/gitpod-io/empty",
|
|
CheckoutLocation: "empty",
|
|
Config: &csapi.GitConfig{},
|
|
},
|
|
},
|
|
}
|
|
|
|
req.Metadata.Owner = userId
|
|
req.Spec.WorkspaceLocation = "empty"
|
|
return nil
|
|
}
|
|
|
|
ws, stopWs, err := integration.LaunchWorkspaceDirectly(t, ctx, api, integration.WithRequestModifier(swr))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
defer func() {
|
|
sctx, scancel := context.WithTimeout(context.Background(), 5*time.Minute)
|
|
defer scancel()
|
|
|
|
sapi := integration.NewComponentAPI(sctx, cfg.Namespace(), kubeconfig, cfg.Client())
|
|
defer sapi.Done(t)
|
|
|
|
_, err = stopWs(true, sapi)
|
|
if err != nil {
|
|
t.Errorf("cannot stop workspace: %q", err)
|
|
}
|
|
}()
|
|
|
|
rsa, closer, err := integration.Instrument(integration.ComponentWorkspace, "workspace", cfg.Namespace(), kubeconfig, cfg.Client(),
|
|
integration.WithInstanceID(ws.Req.Id),
|
|
integration.WithContainer("workspace"),
|
|
integration.WithWorkspacekitLift(true),
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
integration.DeferCloser(t, closer)
|
|
defer rsa.Close()
|
|
|
|
assertDotfiles(t, rsa)
|
|
|
|
return ctx
|
|
}).Feature()
|
|
|
|
testEnv.Test(t, f)
|
|
}
|
|
|
|
func getHostUrl(ctx context.Context, t *testing.T, k8sClient klient.Client) string {
|
|
var configmap corev1.ConfigMap
|
|
if err := k8sClient.Resources().Get(ctx, "server-config", "default", &configmap); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
config, ok := configmap.Data["config.json"]
|
|
if !ok {
|
|
t.Fatal("server config map does not contain config.json")
|
|
}
|
|
|
|
c := make(map[string]json.RawMessage)
|
|
if err := json.Unmarshal([]byte(config), &c); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
hostUrlRaw, ok := c["hostUrl"]
|
|
if !ok {
|
|
t.Fatal("server config map does not contain host url")
|
|
}
|
|
|
|
return strings.TrimPrefix(strings.Trim(string(hostUrlRaw), "\""), "https://")
|
|
}
|
|
|
|
func assertDotfiles(t *testing.T, rsa *rpc.Client) error {
|
|
var ls agent.ListDirResponse
|
|
err := rsa.Call("WorkspaceAgent.ListDir", &agent.ListDirRequest{
|
|
Dir: "/home/gitpod/.dotfiles",
|
|
}, &ls)
|
|
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
dotfiles := map[string]bool{
|
|
"bash_aliases": false,
|
|
"git": false,
|
|
}
|
|
|
|
for _, dir := range ls.Files {
|
|
delete(dotfiles, dir)
|
|
}
|
|
|
|
if len(dotfiles) > 0 {
|
|
t.Fatalf("dotfiles were not installed successfully: %+v", dotfiles)
|
|
}
|
|
|
|
return nil
|
|
}
|