diff --git a/components/public-api-server/go.mod b/components/public-api-server/go.mod index dbabd0812e4f41..c5e118d8ff1c7b 100644 --- a/components/public-api-server/go.mod +++ b/components/public-api-server/go.mod @@ -4,12 +4,13 @@ go 1.19 require ( github.com/AdaLogics/go-fuzz-headers v0.0.0-20220708163326-82d177caec6e + github.com/bufbuild/connect-go v1.0.0 github.com/gitpod-io/gitpod/common-go v0.0.0-00010101000000-000000000000 github.com/gitpod-io/gitpod/gitpod-protocol v0.0.0-00010101000000-000000000000 github.com/gitpod-io/gitpod/public-api v0.0.0-00010101000000-000000000000 github.com/gitpod-io/gitpod/usage-api v0.0.0-00010101000000-000000000000 github.com/golang/mock v1.6.0 - github.com/google/go-cmp v0.5.8 + github.com/google/go-cmp v0.5.9 github.com/gorilla/handlers v1.5.1 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/prometheus/client_golang v1.13.0 diff --git a/components/public-api-server/go.sum b/components/public-api-server/go.sum index 4e72611783047b..6c1029e89b6ec0 100644 --- a/components/public-api-server/go.sum +++ b/components/public-api-server/go.sum @@ -46,6 +46,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/bufbuild/connect-go v1.0.0 h1:htSflKUT8y1jxhoPhPYTZMrsY3ipUXjjrbcZR5O2cVo= +github.com/bufbuild/connect-go v1.0.0/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -124,8 +126,8 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= diff --git a/components/public-api-server/pkg/server/integration_test.go b/components/public-api-server/pkg/server/integration_test.go index c2d8fe27f3cefb..edc428ae709817 100644 --- a/components/public-api-server/pkg/server/integration_test.go +++ b/components/public-api-server/pkg/server/integration_test.go @@ -6,12 +6,14 @@ package server import ( "context" + "net/http" "net/url" "testing" + "github.com/bufbuild/connect-go" "github.com/gitpod-io/gitpod/common-go/baseserver" v1 "github.com/gitpod-io/gitpod/public-api/v1" - "github.com/prometheus/client_golang/prometheus" + "github.com/gitpod-io/gitpod/public-api/v1/v1connect" "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -25,12 +27,11 @@ func TestPublicAPIServer_v1_WorkspaceService(t *testing.T) { srv := baseserver.NewForTests(t, baseserver.WithGRPC(baseserver.MustUseRandomLocalAddress(t)), ) - registry := prometheus.NewRegistry() gitpodAPI, err := url.Parse("wss://main.preview.gitpod-dev.com/api/v1") require.NoError(t, err) - require.NoError(t, register(srv, gitpodAPI, registry)) + require.NoError(t, register(srv, gitpodAPI)) baseserver.StartServerForTests(t, srv) conn, err := grpc.Dial(srv.GRPCAddress(), grpc.WithTransportCredentials(insecure.NewCredentials())) @@ -69,12 +70,11 @@ func TestPublicAPIServer_v1_WorkspaceService(t *testing.T) { func TestPublicAPIServer_v1_PrebuildService(t *testing.T) { ctx := context.Background() srv := baseserver.NewForTests(t, baseserver.WithGRPC(baseserver.MustUseRandomLocalAddress(t))) - registry := prometheus.NewRegistry() gitpodAPI, err := url.Parse("wss://main.preview.gitpod-dev.com/api/v1") require.NoError(t, err) - require.NoError(t, register(srv, gitpodAPI, registry)) + require.NoError(t, register(srv, gitpodAPI)) baseserver.StartServerForTests(t, srv) @@ -100,6 +100,58 @@ func TestPublicAPIServer_v1_PrebuildService(t *testing.T) { requireErrorStatusCode(t, codes.Unimplemented, err) } +func TestPublicAPIServer_WorkspaceServiceHandler(t *testing.T) { + ctx := context.Background() + srv := baseserver.NewForTests(t, + baseserver.WithGRPC(baseserver.MustUseRandomLocalAddress(t)), + baseserver.WithHTTP(baseserver.MustUseRandomLocalAddress(t)), + ) + + gitpodAPI, err := url.Parse("wss://main.preview.gitpod-dev.com/api/v1") + require.NoError(t, err) + + require.NoError(t, register(srv, gitpodAPI)) + baseserver.StartServerForTests(t, srv) + + client := v1connect.NewWorkspacesServiceClient(http.DefaultClient, srv.HTTPAddress()) + + _, err = client.ListWorkspaces(ctx, connect.NewRequest(&v1.ListWorkspacesRequest{})) + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(err).String()) + + _, err = client.GetWorkspace(ctx, connect.NewRequest(&v1.GetWorkspaceRequest{})) + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(err).String()) + + _, err = client.GetOwnerToken(ctx, connect.NewRequest(&v1.GetOwnerTokenRequest{})) + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(err).String()) + + _, err = client.CreateAndStartWorkspace(ctx, connect.NewRequest(&v1.CreateAndStartWorkspaceRequest{})) + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(err).String()) + + _, err = client.StartWorkspace(ctx, connect.NewRequest(&v1.StartWorkspaceRequest{})) + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(err).String()) + + _, err = client.GetActiveWorkspaceInstance(ctx, connect.NewRequest(&v1.GetActiveWorkspaceInstanceRequest{})) + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(err).String()) + + _, err = client.GetWorkspaceInstanceOwnerToken(ctx, connect.NewRequest(&v1.GetWorkspaceInstanceOwnerTokenRequest{})) + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(err).String()) + + stream, err := client.ListenToWorkspaceInstance(ctx, connect.NewRequest(&v1.ListenToWorkspaceInstanceRequest{})) + require.NoError(t, err) + stream.Receive() + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(stream.Err()).String()) + + logsStream, err := client.ListenToImageBuildLogs(ctx, connect.NewRequest(&v1.ListenToImageBuildLogsRequest{})) + require.NoError(t, err) + logsStream.Receive() + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(logsStream.Err()).String()) + + stopStream, err := client.StopWorkspace(ctx, connect.NewRequest(&v1.StopWorkspaceRequest{})) + require.NoError(t, err) + stopStream.Receive() + require.Equal(t, connect.CodeUnimplemented.String(), connect.CodeOf(stopStream.Err()).String()) +} + func requireErrorStatusCode(t *testing.T, expected codes.Code, err error) { require.Error(t, err) st, ok := status.FromError(err) diff --git a/components/public-api-server/pkg/server/server.go b/components/public-api-server/pkg/server/server.go index 92f4e3e3c7a938..5d704ea46d4ea7 100644 --- a/components/public-api-server/pkg/server/server.go +++ b/components/public-api-server/pkg/server/server.go @@ -14,6 +14,7 @@ import ( "github.com/gitpod-io/gitpod/common-go/log" "github.com/gitpod-io/gitpod/public-api/config" + "github.com/gitpod-io/gitpod/public-api/v1/v1connect" "github.com/gorilla/handlers" "github.com/gitpod-io/gitpod/common-go/baseserver" @@ -22,7 +23,6 @@ import ( "github.com/gitpod-io/gitpod/public-api-server/pkg/proxy" "github.com/gitpod-io/gitpod/public-api-server/pkg/webhooks" v1 "github.com/gitpod-io/gitpod/public-api/v1" - "github.com/prometheus/client_golang/prometheus" "github.com/sirupsen/logrus" ) @@ -62,12 +62,9 @@ func Start(logger *logrus.Entry, version string, cfg *config.Configuration) erro log.Info("No stripe webhook secret is configured, endpoints will return NotImplemented") } - srv.HTTPMux().Handle("/test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte(`test`)) - })) srv.HTTPMux().Handle("/stripe/invoices/webhook", handlers.ContentTypeHandler(stripeWebhookHandler, "application/json")) - if registerErr := register(srv, gitpodAPI, srv.MetricsRegistry()); registerErr != nil { + if registerErr := register(srv, gitpodAPI); registerErr != nil { return fmt.Errorf("failed to register services: %w", registerErr) } @@ -78,14 +75,17 @@ func Start(logger *logrus.Entry, version string, cfg *config.Configuration) erro return nil } -func register(srv *baseserver.Server, serverAPIURL *url.URL, registry *prometheus.Registry) error { - proxy.RegisterMetrics(registry) +func register(srv *baseserver.Server, serverAPIURL *url.URL) error { + proxy.RegisterMetrics(srv.MetricsRegistry()) connPool := &proxy.NoConnectionPool{ServerAPI: serverAPIURL} v1.RegisterWorkspacesServiceServer(srv.GRPC(), apiv1.NewWorkspaceService(connPool)) v1.RegisterPrebuildsServiceServer(srv.GRPC(), v1.UnimplementedPrebuildsServiceServer{}) + workspacesRoute, workspacesServiceHandler := v1connect.NewWorkspacesServiceHandler(&v1connect.UnimplementedWorkspacesServiceHandler{}) + srv.HTTPMux().Handle(workspacesRoute, workspacesServiceHandler) + return nil }