Path: blob/main/components/public-api-server/pkg/apiv1/ide_client.go
2499 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 apiv156import (7"context"8"fmt"910connect "github.com/bufbuild/connect-go"11"github.com/gitpod-io/gitpod/common-go/log"12v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"13"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"14protocol "github.com/gitpod-io/gitpod/gitpod-protocol"15"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"16)1718func NewIDEClientService(pool proxy.ServerConnectionPool) *IDEClientService {19return &IDEClientService{20connectionPool: pool,21}22}2324var _ v1connect.IDEClientServiceHandler = (*IDEClientService)(nil)2526type IDEClientService struct {27connectionPool proxy.ServerConnectionPool2829v1connect.UnimplementedIDEClientServiceHandler30}3132func (this *IDEClientService) SendHeartbeat(ctx context.Context, req *connect.Request[v1.SendHeartbeatRequest]) (*connect.Response[v1.SendHeartbeatResponse], error) {33conn, err := getConnection(ctx, this.connectionPool)34if err != nil {35return nil, err36}3738workspace, err := conn.GetWorkspace(ctx, req.Msg.GetWorkspaceId())39if err != nil {40log.Extract(ctx).WithError(err).Error("Failed to get workspace.")41return nil, proxy.ConvertError(err)42}4344if workspace.LatestInstance == nil {45log.Extract(ctx).WithError(err).Error("Failed to get latest instance.")46return nil, connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("instance not found"))47}4849err = conn.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{50InstanceID: workspace.LatestInstance.ID,51WasClosed: false,52})53if err != nil {54return nil, proxy.ConvertError(err)55}5657return connect.NewResponse(&v1.SendHeartbeatResponse{}), nil58}5960func (this *IDEClientService) SendDidClose(ctx context.Context, req *connect.Request[v1.SendDidCloseRequest]) (*connect.Response[v1.SendDidCloseResponse], error) {61conn, err := getConnection(ctx, this.connectionPool)62if err != nil {63return nil, err64}6566workspace, err := conn.GetWorkspace(ctx, req.Msg.GetWorkspaceId())67if err != nil {68log.Extract(ctx).WithError(err).Error("Failed to get workspace.")69return nil, proxy.ConvertError(err)70}7172if workspace.LatestInstance == nil {73log.Extract(ctx).WithError(err).Error("Failed to get latest instance.")74return nil, connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("instance not found"))75}7677err = conn.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{78InstanceID: workspace.LatestInstance.ID,79WasClosed: true,80})81if err != nil {82return nil, proxy.ConvertError(err)83}8485return connect.NewResponse(&v1.SendDidCloseResponse{}), nil86}8788func (s *IDEClientService) UpdateGitStatus(ctx context.Context, req *connect.Request[v1.UpdateGitStatusRequest]) (*connect.Response[v1.UpdateGitStatusResponse], error) {89workspaceID, err := validateWorkspaceID(ctx, req.Msg.GetWorkspaceId())90if err != nil {91return nil, err92}9394conn, err := getConnection(ctx, s.connectionPool)95if err != nil {96return nil, err97}9899var status *protocol.WorkspaceInstanceRepoStatus100if req.Msg.GetStatus() != nil {101status = &protocol.WorkspaceInstanceRepoStatus{102Branch: req.Msg.GetStatus().GetBranch(),103LatestCommit: req.Msg.GetStatus().GetLatestCommit(),104TotalUncommitedFiles: float64(req.Msg.GetStatus().GetTotalUncommitedFiles()),105TotalUntrackedFiles: float64(req.Msg.GetStatus().GetTotalUntrackedFiles()),106TotalUnpushedCommits: float64(req.Msg.GetStatus().GetTotalUnpushedCommits()),107UncommitedFiles: req.Msg.GetStatus().GetUncommitedFiles(),108UntrackedFiles: req.Msg.GetStatus().GetUntrackedFiles(),109UnpushedCommits: req.Msg.GetStatus().GetUnpushedCommits(),110}111}112113err = conn.UpdateGitStatus(ctx, workspaceID, status)114if err != nil {115log.Extract(ctx).Error("Failed to update repo status")116return nil, proxy.ConvertError(err)117}118119return connect.NewResponse(120&v1.UpdateGitStatusResponse{},121), nil122}123124125