Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/public-api-server/pkg/apiv1/ide_client.go
2499 views
1
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package apiv1
6
7
import (
8
"context"
9
"fmt"
10
11
connect "github.com/bufbuild/connect-go"
12
"github.com/gitpod-io/gitpod/common-go/log"
13
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
14
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
15
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
16
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
17
)
18
19
func NewIDEClientService(pool proxy.ServerConnectionPool) *IDEClientService {
20
return &IDEClientService{
21
connectionPool: pool,
22
}
23
}
24
25
var _ v1connect.IDEClientServiceHandler = (*IDEClientService)(nil)
26
27
type IDEClientService struct {
28
connectionPool proxy.ServerConnectionPool
29
30
v1connect.UnimplementedIDEClientServiceHandler
31
}
32
33
func (this *IDEClientService) SendHeartbeat(ctx context.Context, req *connect.Request[v1.SendHeartbeatRequest]) (*connect.Response[v1.SendHeartbeatResponse], error) {
34
conn, err := getConnection(ctx, this.connectionPool)
35
if err != nil {
36
return nil, err
37
}
38
39
workspace, err := conn.GetWorkspace(ctx, req.Msg.GetWorkspaceId())
40
if err != nil {
41
log.Extract(ctx).WithError(err).Error("Failed to get workspace.")
42
return nil, proxy.ConvertError(err)
43
}
44
45
if workspace.LatestInstance == nil {
46
log.Extract(ctx).WithError(err).Error("Failed to get latest instance.")
47
return nil, connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("instance not found"))
48
}
49
50
err = conn.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{
51
InstanceID: workspace.LatestInstance.ID,
52
WasClosed: false,
53
})
54
if err != nil {
55
return nil, proxy.ConvertError(err)
56
}
57
58
return connect.NewResponse(&v1.SendHeartbeatResponse{}), nil
59
}
60
61
func (this *IDEClientService) SendDidClose(ctx context.Context, req *connect.Request[v1.SendDidCloseRequest]) (*connect.Response[v1.SendDidCloseResponse], error) {
62
conn, err := getConnection(ctx, this.connectionPool)
63
if err != nil {
64
return nil, err
65
}
66
67
workspace, err := conn.GetWorkspace(ctx, req.Msg.GetWorkspaceId())
68
if err != nil {
69
log.Extract(ctx).WithError(err).Error("Failed to get workspace.")
70
return nil, proxy.ConvertError(err)
71
}
72
73
if workspace.LatestInstance == nil {
74
log.Extract(ctx).WithError(err).Error("Failed to get latest instance.")
75
return nil, connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("instance not found"))
76
}
77
78
err = conn.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{
79
InstanceID: workspace.LatestInstance.ID,
80
WasClosed: true,
81
})
82
if err != nil {
83
return nil, proxy.ConvertError(err)
84
}
85
86
return connect.NewResponse(&v1.SendDidCloseResponse{}), nil
87
}
88
89
func (s *IDEClientService) UpdateGitStatus(ctx context.Context, req *connect.Request[v1.UpdateGitStatusRequest]) (*connect.Response[v1.UpdateGitStatusResponse], error) {
90
workspaceID, err := validateWorkspaceID(ctx, req.Msg.GetWorkspaceId())
91
if err != nil {
92
return nil, err
93
}
94
95
conn, err := getConnection(ctx, s.connectionPool)
96
if err != nil {
97
return nil, err
98
}
99
100
var status *protocol.WorkspaceInstanceRepoStatus
101
if req.Msg.GetStatus() != nil {
102
status = &protocol.WorkspaceInstanceRepoStatus{
103
Branch: req.Msg.GetStatus().GetBranch(),
104
LatestCommit: req.Msg.GetStatus().GetLatestCommit(),
105
TotalUncommitedFiles: float64(req.Msg.GetStatus().GetTotalUncommitedFiles()),
106
TotalUntrackedFiles: float64(req.Msg.GetStatus().GetTotalUntrackedFiles()),
107
TotalUnpushedCommits: float64(req.Msg.GetStatus().GetTotalUnpushedCommits()),
108
UncommitedFiles: req.Msg.GetStatus().GetUncommitedFiles(),
109
UntrackedFiles: req.Msg.GetStatus().GetUntrackedFiles(),
110
UnpushedCommits: req.Msg.GetStatus().GetUnpushedCommits(),
111
}
112
}
113
114
err = conn.UpdateGitStatus(ctx, workspaceID, status)
115
if err != nil {
116
log.Extract(ctx).Error("Failed to update repo status")
117
return nil, proxy.ConvertError(err)
118
}
119
120
return connect.NewResponse(
121
&v1.UpdateGitStatusResponse{},
122
), nil
123
}
124
125