From 94245c98080edf25dbd5909ef01d8251fdc88625 Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Wed, 18 May 2022 22:40:30 +0000 Subject: [PATCH 1/2] feature: disable provisionerd listen endpoint Signed-off-by: Spike Curtis --- coderd/coderd.go | 5 --- coderd/coderd_test.go | 2 - coderd/provisionerdaemons.go | 73 ---------------------------------- codersdk/provisionerdaemons.go | 36 ----------------- 4 files changed, 116 deletions(-) diff --git a/coderd/coderd.go b/coderd/coderd.go index 9acc78f16fd59..343da27bf55cf 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -209,11 +209,6 @@ func newRouter(options *Options, a *api) chi.Router { r.Get("/resources", a.templateVersionResources) r.Get("/logs", a.templateVersionLogs) }) - r.Route("/provisionerdaemons", func(r chi.Router) { - r.Route("/me", func(r chi.Router) { - r.Get("/listen", a.provisionerDaemonsListen) - }) - }) r.Route("/users", func(r chi.Router) { r.Get("/first", a.firstUser) r.Post("/first", a.postFirstUser) diff --git a/coderd/coderd_test.go b/coderd/coderd_test.go index f3d13dc8b8b75..f6d555fb3d015 100644 --- a/coderd/coderd_test.go +++ b/coderd/coderd_test.go @@ -106,8 +106,6 @@ func TestAuthorizeAllEndpoints(t *testing.T) { "GET:/api/v2/parameters/{scope}/{id}": {NoAuthorize: true}, "DELETE:/api/v2/parameters/{scope}/{id}/{name}": {NoAuthorize: true}, - "GET:/api/v2/provisionerdaemons/me/listen": {NoAuthorize: true}, - "DELETE:/api/v2/templates/{template}": {NoAuthorize: true}, "GET:/api/v2/templates/{template}": {NoAuthorize: true}, "GET:/api/v2/templates/{template}/versions": {NoAuthorize: true}, diff --git a/coderd/provisionerdaemons.go b/coderd/provisionerdaemons.go index 9c0c6592226c6..bb3fa21361bdd 100644 --- a/coderd/provisionerdaemons.go +++ b/coderd/provisionerdaemons.go @@ -13,12 +13,10 @@ import ( "time" "github.com/google/uuid" - "github.com/hashicorp/yamux" "github.com/moby/moby/pkg/namesgenerator" "github.com/tabbed/pqtype" "golang.org/x/xerrors" protobuf "google.golang.org/protobuf/proto" - "nhooyr.io/websocket" "storj.io/drpc/drpcmux" "storj.io/drpc/drpcserver" @@ -49,77 +47,6 @@ func (api *api) provisionerDaemonsByOrganization(rw http.ResponseWriter, r *http httpapi.Write(rw, http.StatusOK, daemons) } -// Serves the provisioner daemon protobuf API over a WebSocket. -func (api *api) provisionerDaemonsListen(rw http.ResponseWriter, r *http.Request) { - api.websocketWaitMutex.Lock() - api.websocketWaitGroup.Add(1) - api.websocketWaitMutex.Unlock() - defer api.websocketWaitGroup.Done() - - conn, err := websocket.Accept(rw, r, &websocket.AcceptOptions{ - // Need to disable compression to avoid a data-race. - CompressionMode: websocket.CompressionDisabled, - }) - if err != nil { - httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("accept websocket: %s", err), - }) - return - } - // Align with the frame size of yamux. - conn.SetReadLimit(256 * 1024) - - daemon, err := api.Database.InsertProvisionerDaemon(r.Context(), database.InsertProvisionerDaemonParams{ - ID: uuid.New(), - CreatedAt: database.Now(), - Name: namesgenerator.GetRandomName(1), - Provisioners: []database.ProvisionerType{database.ProvisionerTypeEcho, database.ProvisionerTypeTerraform}, - }) - if err != nil { - _ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("insert provisioner daemon: %s", err)) - return - } - - // Multiplexes the incoming connection using yamux. - // This allows multiple function calls to occur over - // the same connection. - config := yamux.DefaultConfig() - config.LogOutput = io.Discard - session, err := yamux.Server(websocket.NetConn(r.Context(), conn, websocket.MessageBinary), config) - if err != nil { - _ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("multiplex server: %s", err)) - return - } - mux := drpcmux.New() - err = proto.DRPCRegisterProvisionerDaemon(mux, &provisionerdServer{ - AccessURL: api.AccessURL, - ID: daemon.ID, - Database: api.Database, - Pubsub: api.Pubsub, - Provisioners: daemon.Provisioners, - Logger: api.Logger.Named(fmt.Sprintf("provisionerd-%s", daemon.Name)), - }) - if err != nil { - _ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("drpc register provisioner daemon: %s", err)) - return - } - server := drpcserver.NewWithOptions(mux, drpcserver.Options{ - Log: func(err error) { - if xerrors.Is(err, io.EOF) { - return - } - api.Logger.Debug(r.Context(), "drpc server error", slog.Error(err)) - }, - }) - err = server.Serve(r.Context(), session) - if err != nil && !xerrors.Is(err, io.EOF) { - api.Logger.Debug(r.Context(), "provisioner daemon disconnected", slog.Error(err)) - _ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("serve: %s", err)) - return - } - _ = conn.Close(websocket.StatusGoingAway, "") -} - // ListenProvisionerDaemon is an in-memory connection to a provisionerd. Useful when starting coderd and provisionerd // in the same process. func (c *coderD) ListenProvisionerDaemon(ctx context.Context) (client proto.DRPCProvisionerDaemonClient, err error) { diff --git a/codersdk/provisionerdaemons.go b/codersdk/provisionerdaemons.go index 308e3a803f09c..7d2fd3717896b 100644 --- a/codersdk/provisionerdaemons.go +++ b/codersdk/provisionerdaemons.go @@ -5,19 +5,12 @@ import ( "database/sql" "encoding/json" "fmt" - "io" "net/http" "net/url" "strconv" "time" "github.com/google/uuid" - "github.com/hashicorp/yamux" - "golang.org/x/xerrors" - "nhooyr.io/websocket" - - "github.com/coder/coder/provisionerd/proto" - "github.com/coder/coder/provisionersdk" ) type LogSource string @@ -86,35 +79,6 @@ type ProvisionerJobLog struct { Output string `json:"output"` } -// ListenProvisionerDaemon returns the gRPC service for a provisioner daemon implementation. -func (c *Client) ListenProvisionerDaemon(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) { - serverURL, err := c.URL.Parse("/api/v2/provisionerdaemons/me/listen") - if err != nil { - return nil, xerrors.Errorf("parse url: %w", err) - } - conn, res, err := websocket.Dial(ctx, serverURL.String(), &websocket.DialOptions{ - HTTPClient: c.HTTPClient, - // Need to disable compression to avoid a data-race. - CompressionMode: websocket.CompressionDisabled, - }) - if err != nil { - if res == nil { - return nil, err - } - return nil, readBodyAsError(res) - } - // Align with the frame size of yamux. - conn.SetReadLimit(256 * 1024) - - config := yamux.DefaultConfig() - config.LogOutput = io.Discard - session, err := yamux.Client(websocket.NetConn(ctx, conn, websocket.MessageBinary), config) - if err != nil { - return nil, xerrors.Errorf("multiplex client: %w", err) - } - return proto.NewDRPCProvisionerDaemonClient(provisionersdk.Conn(session)), nil -} - // provisionerJobLogsBefore provides log output that occurred before a time. // This is abstracted from a specific job type to provide consistency between // APIs. Logs is the only shared route between jobs. From c6b32d10bb3f879e09ea5ede5797c3e65a52cc81 Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Thu, 19 May 2022 16:40:12 -0700 Subject: [PATCH 2/2] Regenerate ts types Signed-off-by: Spike Curtis --- site/src/api/typesGenerated.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 9a2c74675761d..30c0367a1fdd4 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -183,7 +183,7 @@ export interface ParameterSchema { readonly validation_contains: string[] } -// From codersdk/provisionerdaemons.go:40:6 +// From codersdk/provisionerdaemons.go:33:6 export interface ProvisionerDaemon { readonly id: string readonly created_at: string @@ -193,7 +193,7 @@ export interface ProvisionerDaemon { readonly provisioners: ProvisionerType[] } -// From codersdk/provisionerdaemons.go:70:6 +// From codersdk/provisionerdaemons.go:63:6 export interface ProvisionerJob { readonly id: string readonly created_at: string @@ -204,7 +204,7 @@ export interface ProvisionerJob { readonly worker_id?: string } -// From codersdk/provisionerdaemons.go:80:6 +// From codersdk/provisionerdaemons.go:73:6 export interface ProvisionerJobLog { readonly id: string readonly created_at: string @@ -445,10 +445,10 @@ export interface WorkspaceResource { readonly agents?: WorkspaceAgent[] } -// From codersdk/provisionerdaemons.go:30:6 +// From codersdk/provisionerdaemons.go:23:6 export type LogLevel = "debug" | "error" | "info" | "trace" | "warn" -// From codersdk/provisionerdaemons.go:23:6 +// From codersdk/provisionerdaemons.go:16:6 export type LogSource = "provisioner" | "provisioner_daemon" // From codersdk/parameters.go:30:6 @@ -463,7 +463,7 @@ export type ParameterSourceScheme = "data" | "none" // From codersdk/parameters.go:38:6 export type ParameterTypeSystem = "hcl" | "none" -// From codersdk/provisionerdaemons.go:50:6 +// From codersdk/provisionerdaemons.go:43:6 export type ProvisionerJobStatus = "canceled" | "canceling" | "failed" | "pending" | "running" | "succeeded" // From codersdk/organizations.go:14:6