Skip to content

Commit 8aeb5e1

Browse files
easyCZroboquat
authored andcommitted
[public-api] Reduce duplication when establishing connection to server
1 parent 015b30b commit 8aeb5e1

File tree

4 files changed

+30
-96
lines changed

4 files changed

+30
-96
lines changed

components/public-api-server/pkg/apiv1/team.go

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@ package apiv1
66

77
import (
88
"context"
9-
"errors"
109
"fmt"
1110

1211
connect "github.com/bufbuild/connect-go"
1312
"github.com/gitpod-io/gitpod/common-go/log"
1413
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
1514
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
1615
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
17-
"github.com/gitpod-io/gitpod/public-api-server/pkg/auth"
1816
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
1917
"github.com/google/uuid"
2018
"github.com/relvacode/iso8601"
@@ -40,7 +38,7 @@ func (s *TeamService) CreateTeam(ctx context.Context, req *connect.Request[v1.Cr
4038
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Name is a required argument when creating a team."))
4139
}
4240

43-
conn, err := s.getConnection(ctx)
41+
conn, err := getConnection(ctx, s.connectionPool)
4442
if err != nil {
4543
return nil, err
4644
}
@@ -68,7 +66,7 @@ func (s *TeamService) GetTeam(ctx context.Context, req *connect.Request[v1.GetTe
6866
return nil, err
6967
}
7068

71-
conn, err := s.getConnection(ctx)
69+
conn, err := getConnection(ctx, s.connectionPool)
7270
if err != nil {
7371
return nil, err
7472
}
@@ -89,7 +87,7 @@ func (s *TeamService) GetTeam(ctx context.Context, req *connect.Request[v1.GetTe
8987
}
9088

9189
func (s *TeamService) ListTeams(ctx context.Context, req *connect.Request[v1.ListTeamsRequest]) (*connect.Response[v1.ListTeamsResponse], error) {
92-
conn, err := s.getConnection(ctx)
90+
conn, err := getConnection(ctx, s.connectionPool)
9391
if err != nil {
9492
return nil, err
9593
}
@@ -122,7 +120,7 @@ func (s *TeamService) DeleteTeam(ctx context.Context, req *connect.Request[v1.De
122120
return nil, err
123121
}
124122

125-
conn, err := s.getConnection(ctx)
123+
conn, err := getConnection(ctx, s.connectionPool)
126124
if err != nil {
127125
return nil, err
128126
}
@@ -140,7 +138,7 @@ func (s *TeamService) JoinTeam(ctx context.Context, req *connect.Request[v1.Join
140138
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("invitation id is a required argument to join a team"))
141139
}
142140

143-
conn, err := s.getConnection(ctx)
141+
conn, err := getConnection(ctx, s.connectionPool)
144142
if err != nil {
145143
return nil, err
146144
}
@@ -167,7 +165,7 @@ func (s *TeamService) ResetTeamInvitation(ctx context.Context, req *connect.Requ
167165
return nil, err
168166
}
169167

170-
conn, err := s.getConnection(ctx)
168+
conn, err := getConnection(ctx, s.connectionPool)
171169
if err != nil {
172170
return nil, err
173171
}
@@ -203,7 +201,7 @@ func (s *TeamService) UpdateTeamMember(ctx context.Context, req *connect.Request
203201
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Unknown TeamMember.Role specified."))
204202
}
205203

206-
conn, err := s.getConnection(ctx)
204+
conn, err := getConnection(ctx, s.connectionPool)
207205
if err != nil {
208206
return nil, err
209207
}
@@ -230,7 +228,7 @@ func (s *TeamService) DeleteTeamMember(ctx context.Context, req *connect.Request
230228
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Team Member ID is a required parameter to delete team member."))
231229
}
232230

233-
conn, err := s.getConnection(ctx)
231+
conn, err := getConnection(ctx, s.connectionPool)
234232
if err != nil {
235233
return nil, err
236234
}
@@ -243,21 +241,6 @@ func (s *TeamService) DeleteTeamMember(ctx context.Context, req *connect.Request
243241
return connect.NewResponse(&v1.DeleteTeamMemberResponse{}), nil
244242
}
245243

246-
func (s *TeamService) getConnection(ctx context.Context) (protocol.APIInterface, error) {
247-
token, err := auth.TokenFromContext(ctx)
248-
if err != nil {
249-
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
250-
}
251-
252-
conn, err := s.connectionPool.Get(ctx, token)
253-
if err != nil {
254-
log.Log.WithError(err).Error("Failed to get connection to server.")
255-
return nil, connect.NewError(connect.CodeInternal, errors.New("Failed to establish connection to downstream services. If this issue persists, please contact Gitpod Support."))
256-
}
257-
258-
return conn, nil
259-
}
260-
261244
func (s *TeamService) toTeamAPIResponse(ctx context.Context, conn protocol.APIInterface, team *protocol.Team) (*v1.Team, error) {
262245
members, err := conn.GetTeamMembers(ctx, team.ID)
263246
if err != nil {

components/public-api-server/pkg/apiv1/tokens.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ type TokensService struct {
3636

3737
func (s *TokensService) CreatePersonalAccessToken(ctx context.Context, req *connect.Request[v1.CreatePersonalAccessTokenRequest]) (*connect.Response[v1.CreatePersonalAccessTokenResponse], error) {
3838

39-
conn, err := s.getConnection(ctx)
39+
conn, err := getConnection(ctx, s.connectionPool)
4040
if err != nil {
4141
return nil, err
4242
}
@@ -55,13 +55,13 @@ func (s *TokensService) CreatePersonalAccessToken(ctx context.Context, req *conn
5555
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.CreatePersonalAccessToken is not implemented"))
5656
}
5757

58-
func (s *TokensService) getConnection(ctx context.Context) (protocol.APIInterface, error) {
58+
func getConnection(ctx context.Context, pool proxy.ServerConnectionPool) (protocol.APIInterface, error) {
5959
token, err := auth.TokenFromContext(ctx)
6060
if err != nil {
6161
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
6262
}
6363

64-
conn, err := s.connectionPool.Get(ctx, token)
64+
conn, err := pool.Get(ctx, token)
6565
if err != nil {
6666
log.Log.WithError(err).Error("Failed to get connection to server.")
6767
return nil, connect.NewError(connect.CodeInternal, errors.New("Failed to establish connection to downstream services. If this issue persists, please contact Gitpod Support."))

components/public-api-server/pkg/apiv1/user.go

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,11 @@ package apiv1
66

77
import (
88
"context"
9-
"fmt"
109

1110
connect "github.com/bufbuild/connect-go"
12-
"github.com/gitpod-io/gitpod/common-go/log"
1311
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
1412
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
1513
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
16-
"github.com/gitpod-io/gitpod/public-api-server/pkg/auth"
1714
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
1815
)
1916

@@ -32,15 +29,9 @@ type UserService struct {
3229
}
3330

3431
func (s *UserService) GetAuthenticatedUser(ctx context.Context, req *connect.Request[v1.GetAuthenticatedUserRequest]) (*connect.Response[v1.GetAuthenticatedUserResponse], error) {
35-
token, err := auth.TokenFromContext(ctx)
32+
conn, err := getConnection(ctx, s.connectionPool)
3633
if err != nil {
37-
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
38-
}
39-
40-
conn, err := s.connectionPool.Get(ctx, token)
41-
if err != nil {
42-
log.Log.WithError(err).Error("Failed to get connection to server.")
43-
return nil, connect.NewError(connect.CodeInternal, err)
34+
return nil, err
4435
}
4536

4637
user, err := conn.GetLoggedInUser(ctx)
@@ -56,15 +47,9 @@ func (s *UserService) GetAuthenticatedUser(ctx context.Context, req *connect.Req
5647
}
5748

5849
func (s *UserService) ListSSHKeys(ctx context.Context, req *connect.Request[v1.ListSSHKeysRequest]) (*connect.Response[v1.ListSSHKeysResponse], error) {
59-
token, err := auth.TokenFromContext(ctx)
60-
if err != nil {
61-
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
62-
}
63-
64-
conn, err := s.connectionPool.Get(ctx, token)
50+
conn, err := getConnection(ctx, s.connectionPool)
6551
if err != nil {
66-
log.Log.WithError(err).Error("Failed to get connection to server.")
67-
return nil, connect.NewError(connect.CodeInternal, err)
52+
return nil, err
6853
}
6954

7055
sshKeys, err := conn.GetSSHPublicKeys(ctx)

components/public-api-server/pkg/apiv1/workspace.go

Lines changed: 15 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
1313
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
1414
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
15-
"github.com/gitpod-io/gitpod/public-api-server/pkg/auth"
1615
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
1716
"github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus"
1817
"github.com/relvacode/iso8601"
@@ -32,20 +31,14 @@ type WorkspaceService struct {
3231
}
3332

3433
func (s *WorkspaceService) GetWorkspace(ctx context.Context, req *connect.Request[v1.GetWorkspaceRequest]) (*connect.Response[v1.GetWorkspaceResponse], error) {
35-
token, err := auth.TokenFromContext(ctx)
36-
if err != nil {
37-
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
38-
}
39-
4034
logger := ctxlogrus.Extract(ctx)
4135

42-
server, err := s.connectionPool.Get(ctx, token)
36+
conn, err := getConnection(ctx, s.connectionPool)
4337
if err != nil {
44-
logger.WithError(err).Error("Failed to get connection to server.")
45-
return nil, connect.NewError(connect.CodeInternal, err)
38+
return nil, err
4639
}
4740

48-
workspace, err := server.GetWorkspace(ctx, req.Msg.GetWorkspaceId())
41+
workspace, err := conn.GetWorkspace(ctx, req.Msg.GetWorkspaceId())
4942
if err != nil {
5043
logger.WithError(err).Error("Failed to get workspace.")
5144
return nil, proxy.ConvertError(err)
@@ -79,18 +72,12 @@ func (s *WorkspaceService) GetWorkspace(ctx context.Context, req *connect.Reques
7972

8073
func (s *WorkspaceService) GetOwnerToken(ctx context.Context, req *connect.Request[v1.GetOwnerTokenRequest]) (*connect.Response[v1.GetOwnerTokenResponse], error) {
8174
logger := ctxlogrus.Extract(ctx)
82-
token, err := auth.TokenFromContext(ctx)
83-
if err != nil {
84-
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
85-
}
86-
87-
server, err := s.connectionPool.Get(ctx, token)
75+
conn, err := getConnection(ctx, s.connectionPool)
8876
if err != nil {
89-
logger.WithError(err).Error("Failed to get connection to server.")
90-
return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to establish connection to downstream services"))
77+
return nil, err
9178
}
9279

93-
ownerToken, err := server.GetOwnerToken(ctx, req.Msg.GetWorkspaceId())
80+
ownerToken, err := conn.GetOwnerToken(ctx, req.Msg.GetWorkspaceId())
9481

9582
if err != nil {
9683
logger.WithError(err).Error("Failed to get owner token.")
@@ -101,24 +88,17 @@ func (s *WorkspaceService) GetOwnerToken(ctx context.Context, req *connect.Reque
10188
}
10289

10390
func (s *WorkspaceService) ListWorkspaces(ctx context.Context, req *connect.Request[v1.ListWorkspacesRequest]) (*connect.Response[v1.ListWorkspacesResponse], error) {
104-
logger := ctxlogrus.Extract(ctx)
105-
token, err := auth.TokenFromContext(ctx)
106-
if err != nil {
107-
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
108-
}
109-
110-
server, err := s.connectionPool.Get(ctx, token)
91+
conn, err := getConnection(ctx, s.connectionPool)
11192
if err != nil {
112-
logger.WithError(err).Error("Failed to get connection to server.")
113-
return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to establish connection to downstream services"))
93+
return nil, err
11494
}
11595

11696
limit, err := getLimitFromPagination(req.Msg.GetPagination())
11797
if err != nil {
11898
// getLimitFromPagination returns gRPC errors
11999
return nil, err
120100
}
121-
serverResp, err := server.GetWorkspaces(ctx, &protocol.GetWorkspacesOptions{
101+
serverResp, err := conn.GetWorkspaces(ctx, &protocol.GetWorkspacesOptions{
122102
Limit: float64(limit),
123103
})
124104
if err != nil {
@@ -143,19 +123,12 @@ func (s *WorkspaceService) ListWorkspaces(ctx context.Context, req *connect.Requ
143123
}
144124

145125
func (s *WorkspaceService) SendHeartbeat(ctx context.Context, req *connect.Request[v1.SendHeartbeatRequest]) (*connect.Response[v1.SendHeartbeatResponse], error) {
146-
logger := ctxlogrus.Extract(ctx)
147-
token, err := auth.TokenFromContext(ctx)
148-
if err != nil {
149-
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
150-
}
151-
152-
server, err := s.connectionPool.Get(ctx, token)
126+
conn, err := getConnection(ctx, s.connectionPool)
153127
if err != nil {
154-
logger.WithError(err).Error("Failed to get connection to server.")
155-
return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to establish connection to downstream services"))
128+
return nil, err
156129
}
157130

158-
err = server.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{
131+
err = conn.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{
159132
InstanceID: req.Msg.GetWorkspaceId(),
160133
WasClosed: false,
161134
})
@@ -167,19 +140,12 @@ func (s *WorkspaceService) SendHeartbeat(ctx context.Context, req *connect.Reque
167140
}
168141

169142
func (s *WorkspaceService) SendCloseSignal(ctx context.Context, req *connect.Request[v1.SendCloseSignalRequest]) (*connect.Response[v1.SendCloseSignalResponse], error) {
170-
logger := ctxlogrus.Extract(ctx)
171-
token, err := auth.TokenFromContext(ctx)
143+
conn, err := getConnection(ctx, s.connectionPool)
172144
if err != nil {
173-
return nil, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No credentials present on request."))
174-
}
175-
176-
server, err := s.connectionPool.Get(ctx, token)
177-
if err != nil {
178-
logger.WithError(err).Error("Failed to get connection to server.")
179-
return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to establish connection to downstream services"))
145+
return nil, err
180146
}
181147

182-
err = server.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{
148+
err = conn.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{
183149
InstanceID: req.Msg.GetWorkspaceId(),
184150
WasClosed: true,
185151
})

0 commit comments

Comments
 (0)