Path: blob/main/components/ide/code-desktop/status/main.go
2500 views
// Copyright (c) 2021 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 main56import (7"context"8"encoding/json"9"fmt"10"log"11"net/http"12"net/url"13"os"1415"golang.org/x/xerrors"16"google.golang.org/grpc"17"google.golang.org/grpc/credentials/insecure"1819"github.com/gitpod-io/gitpod/common-go/util"20supervisor "github.com/gitpod-io/gitpod/supervisor/api"21)2223func main() {24if len(os.Args) < 2 {25fmt.Printf("Usage: %s <port> [<link label>] [<schema>]\n", os.Args[0])26os.Exit(1)27}28port := os.Args[1]2930label := "Open in VS Code Desktop"31if len(os.Args) > 2 {32label = os.Args[2]33}3435schema := "vscode"36if len(os.Args) > 3 {37schema = os.Args[3]38}3940errlog := log.New(os.Stderr, "VS Code Desktop status: ", log.LstdFlags)4142http.HandleFunc("/status", func(w http.ResponseWriter, r *http.Request) {43wsInfo, err := GetWSInfo(context.Background())44if err != nil {45errlog.Printf("cannot get workspace info: %v\n", err)46http.Error(w, err.Error(), http.StatusServiceUnavailable)47}4849type Query struct {50InstanceId string `json:"instanceId"`51WorkspaceId string `json:"workspaceId"`52GitpodHost string `json:"gitpodHost"`53DebugWorkspace bool `json:"debugWorkspace"`54}55debugWorkspace := false56if wsInfo.GetDebugWorkspaceType() != supervisor.DebugWorkspaceType_noDebug {57debugWorkspace = true58}59query := &Query{60InstanceId: wsInfo.InstanceId,61WorkspaceId: wsInfo.WorkspaceId,62GitpodHost: wsInfo.GitpodHost,63DebugWorkspace: debugWorkspace,64}65b, err := json.Marshal(query)66if err != nil {67errlog.Printf("cannot marshal query: %v\n", err)68http.Error(w, err.Error(), http.StatusServiceUnavailable)69}70queryString := string(b)7172workspaceLocation := wsInfo.GetWorkspaceLocationFile()73if workspaceLocation == "" {74workspaceLocation = wsInfo.GetWorkspaceLocationFolder()75}7677link := url.URL{78Scheme: schema,79Host: "gitpod.gitpod-desktop",80Path: workspaceLocation,81RawQuery: url.QueryEscape(queryString),82}8384response := make(map[string]string)85response["link"] = link.String()86response["label"] = label87response["clientID"] = schema88response["kind"] = "code-desktop"89w.Header().Set("Content-Type", "application/json")90json.NewEncoder(w).Encode(response)91})9293fmt.Printf("Starting status proxy for desktop IDE at port %s\n", port)94if err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil); err != nil {95log.Fatal(err)96}97}9899func GetWSInfo(ctx context.Context) (*supervisor.WorkspaceInfoResponse, error) {100supervisorConn, err := grpc.Dial(util.GetSupervisorAddress(), grpc.WithTransportCredentials(insecure.NewCredentials()))101if err != nil {102return nil, xerrors.Errorf("failed connecting to supervisor: %w", err)103}104defer supervisorConn.Close()105wsinfo, err := supervisor.NewInfoServiceClient(supervisorConn).WorkspaceInfo(ctx, &supervisor.WorkspaceInfoRequest{})106if err != nil {107return nil, xerrors.Errorf("failed getting workspace info from supervisor: %w", err)108}109return wsinfo, nil110}111112113