Skip to content

Commit 3022f7b

Browse files
committed
Move to Enterprise
1 parent 1497980 commit 3022f7b

File tree

2 files changed

+132
-113
lines changed

2 files changed

+132
-113
lines changed

coderd/provisionerdaemons.go

Lines changed: 0 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,17 @@ import (
1313
"time"
1414

1515
"github.com/google/uuid"
16-
"github.com/hashicorp/yamux"
1716
"github.com/moby/moby/pkg/namesgenerator"
1817
"github.com/tabbed/pqtype"
1918
"golang.org/x/xerrors"
2019
protobuf "google.golang.org/protobuf/proto"
21-
"nhooyr.io/websocket"
2220
"storj.io/drpc/drpcmux"
2321
"storj.io/drpc/drpcserver"
2422

2523
"cdr.dev/slog"
2624

2725
"github.com/coder/coder/coderd/database"
2826
"github.com/coder/coder/coderd/httpapi"
29-
"github.com/coder/coder/coderd/httpmw"
3027
"github.com/coder/coder/coderd/parameter"
3128
"github.com/coder/coder/coderd/rbac"
3229
"github.com/coder/coder/coderd/telemetry"
@@ -65,100 +62,6 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) {
6562
httpapi.Write(ctx, rw, http.StatusOK, daemons)
6663
}
6764

68-
// Serves the provisioner daemon protobuf API over a WebSocket.
69-
func (api *API) provisionerDaemonsListen(rw http.ResponseWriter, r *http.Request) {
70-
daemon := httpmw.ProvisionerDaemon(r)
71-
api.Logger.Warn(r.Context(), "daemon connected", slog.F("daemon", daemon.Name))
72-
73-
api.websocketWaitMutex.Lock()
74-
api.websocketWaitGroup.Add(1)
75-
api.websocketWaitMutex.Unlock()
76-
defer api.websocketWaitGroup.Done()
77-
78-
conn, err := websocket.Accept(rw, r, &websocket.AcceptOptions{
79-
// Need to disable compression to avoid a data-race.
80-
CompressionMode: websocket.CompressionDisabled,
81-
})
82-
if err != nil {
83-
httpapi.Write(r.Context(), rw, http.StatusBadRequest, codersdk.Response{
84-
Message: "Internal error accepting websocket connection.",
85-
Detail: err.Error(),
86-
})
87-
return
88-
}
89-
// Align with the frame size of yamux.
90-
conn.SetReadLimit(256 * 1024)
91-
92-
// Multiplexes the incoming connection using yamux.
93-
// This allows multiple function calls to occur over
94-
// the same connection.
95-
config := yamux.DefaultConfig()
96-
config.LogOutput = io.Discard
97-
session, err := yamux.Server(websocket.NetConn(r.Context(), conn, websocket.MessageBinary), config)
98-
if err != nil {
99-
_ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("multiplex server: %s", err))
100-
return
101-
}
102-
mux := drpcmux.New()
103-
err = proto.DRPCRegisterProvisionerDaemon(mux, &provisionerdServer{
104-
AccessURL: api.AccessURL,
105-
ID: daemon.ID,
106-
Database: api.Database,
107-
Pubsub: api.Pubsub,
108-
Provisioners: daemon.Provisioners,
109-
Telemetry: api.Telemetry,
110-
Logger: api.Logger.Named(fmt.Sprintf("provisionerd-%s", daemon.Name)),
111-
})
112-
if err != nil {
113-
_ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("drpc register provisioner daemon: %s", err))
114-
return
115-
}
116-
server := drpcserver.NewWithOptions(mux, drpcserver.Options{
117-
Log: func(err error) {
118-
if xerrors.Is(err, io.EOF) {
119-
return
120-
}
121-
api.Logger.Debug(r.Context(), "drpc server error", slog.Error(err))
122-
},
123-
})
124-
err = server.Serve(r.Context(), session)
125-
if err != nil && !xerrors.Is(err, io.EOF) {
126-
api.Logger.Debug(r.Context(), "provisioner daemon disconnected", slog.Error(err))
127-
_ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("serve: %s", err))
128-
return
129-
}
130-
_ = conn.Close(websocket.StatusGoingAway, "")
131-
}
132-
133-
func (api *API) postProvisionerDaemon(rw http.ResponseWriter, r *http.Request) {
134-
if !api.Authorize(r, rbac.ActionCreate, rbac.ResourceProvisionerDaemon) {
135-
httpapi.Forbidden(rw)
136-
return
137-
}
138-
139-
var req codersdk.CreateProvisionerDaemonRequest
140-
if !httpapi.Read(r.Context(), rw, r, &req) {
141-
return
142-
}
143-
144-
provisioner, err := api.Database.InsertProvisionerDaemon(r.Context(), database.InsertProvisionerDaemonParams{
145-
ID: uuid.New(),
146-
CreatedAt: database.Now(),
147-
Name: req.Name,
148-
Provisioners: []database.ProvisionerType{database.ProvisionerTypeTerraform},
149-
AuthToken: uuid.NullUUID{Valid: true, UUID: uuid.New()},
150-
})
151-
if err != nil {
152-
httpapi.Write(r.Context(), rw, http.StatusInternalServerError, codersdk.Response{
153-
Message: "Error inserting provisioner daemon.",
154-
Detail: err.Error(),
155-
})
156-
return
157-
}
158-
159-
httpapi.Write(r.Context(), rw, http.StatusCreated, convertProvisionerDaemon(provisioner))
160-
}
161-
16265
// CreateInMemoryProvisionerDaemon is an in-memory connection to a provisionerd. Useful when starting coderd and provisionerd
16366
// in the same process.
16467
func (api *API) CreateInMemoryProvisionerDaemon(ctx context.Context) (client proto.DRPCProvisionerDaemonClient, err error) {
@@ -1106,19 +1009,3 @@ func convertWorkspaceTransition(transition database.WorkspaceTransition) (sdkpro
11061009
return 0, xerrors.Errorf("unrecognized transition: %q", transition)
11071010
}
11081011
}
1109-
1110-
func convertProvisionerDaemon(daemon database.ProvisionerDaemon) codersdk.ProvisionerDaemon {
1111-
result := codersdk.ProvisionerDaemon{
1112-
ID: daemon.ID,
1113-
CreatedAt: daemon.CreatedAt,
1114-
UpdatedAt: daemon.UpdatedAt,
1115-
Name: daemon.Name,
1116-
}
1117-
for _, provisionerType := range daemon.Provisioners {
1118-
result.Provisioners = append(result.Provisioners, codersdk.ProvisionerType(provisionerType))
1119-
}
1120-
if daemon.AuthToken.Valid {
1121-
result.AuthToken = &daemon.AuthToken.UUID
1122-
}
1123-
return result
1124-
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package coderd
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"net/http"
7+
8+
"cdr.dev/slog"
9+
"github.com/google/uuid"
10+
"github.com/hashicorp/yamux"
11+
"golang.org/x/xerrors"
12+
"nhooyr.io/websocket"
13+
"storj.io/drpc/drpcmux"
14+
"storj.io/drpc/drpcserver"
15+
16+
"github.com/coder/coder/coderd/database"
17+
"github.com/coder/coder/coderd/httpapi"
18+
"github.com/coder/coder/coderd/httpmw"
19+
"github.com/coder/coder/coderd/rbac"
20+
"github.com/coder/coder/codersdk"
21+
"github.com/coder/coder/provisionerd/proto"
22+
)
23+
24+
func (api *API) postProvisionerDaemon(rw http.ResponseWriter, r *http.Request) {
25+
if !api.Authorize(r, rbac.ActionCreate, rbac.ResourceProvisionerDaemon) {
26+
httpapi.Forbidden(rw)
27+
return
28+
}
29+
30+
var req codersdk.CreateProvisionerDaemonRequest
31+
if !httpapi.Read(r.Context(), rw, r, &req) {
32+
return
33+
}
34+
35+
provisioner, err := api.Database.InsertProvisionerDaemon(r.Context(), database.InsertProvisionerDaemonParams{
36+
ID: uuid.New(),
37+
CreatedAt: database.Now(),
38+
Name: req.Name,
39+
Provisioners: []database.ProvisionerType{database.ProvisionerTypeTerraform},
40+
AuthToken: uuid.NullUUID{Valid: true, UUID: uuid.New()},
41+
})
42+
if err != nil {
43+
httpapi.Write(r.Context(), rw, http.StatusInternalServerError, codersdk.Response{
44+
Message: "Error inserting provisioner daemon.",
45+
Detail: err.Error(),
46+
})
47+
return
48+
}
49+
50+
httpapi.Write(r.Context(), rw, http.StatusCreated, convertProvisionerDaemon(provisioner))
51+
}
52+
53+
// Serves the provisioner daemon protobuf API over a WebSocket.
54+
func (api *API) provisionerDaemonsListen(rw http.ResponseWriter, r *http.Request) {
55+
daemon := httpmw.ProvisionerDaemon(r)
56+
api.Logger.Warn(r.Context(), "daemon connected", slog.F("daemon", daemon.Name))
57+
58+
api.websocketWaitMutex.Lock()
59+
api.websocketWaitGroup.Add(1)
60+
api.websocketWaitMutex.Unlock()
61+
defer api.websocketWaitGroup.Done()
62+
63+
conn, err := websocket.Accept(rw, r, &websocket.AcceptOptions{
64+
// Need to disable compression to avoid a data-race.
65+
CompressionMode: websocket.CompressionDisabled,
66+
})
67+
if err != nil {
68+
httpapi.Write(r.Context(), rw, http.StatusBadRequest, codersdk.Response{
69+
Message: "Internal error accepting websocket connection.",
70+
Detail: err.Error(),
71+
})
72+
return
73+
}
74+
// Align with the frame size of yamux.
75+
conn.SetReadLimit(256 * 1024)
76+
77+
// Multiplexes the incoming connection using yamux.
78+
// This allows multiple function calls to occur over
79+
// the same connection.
80+
config := yamux.DefaultConfig()
81+
config.LogOutput = io.Discard
82+
session, err := yamux.Server(websocket.NetConn(r.Context(), conn, websocket.MessageBinary), config)
83+
if err != nil {
84+
_ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("multiplex server: %s", err))
85+
return
86+
}
87+
mux := drpcmux.New()
88+
err = proto.DRPCRegisterProvisionerDaemon(mux, &provisionerdServer{
89+
AccessURL: api.AccessURL,
90+
ID: daemon.ID,
91+
Database: api.Database,
92+
Pubsub: api.Pubsub,
93+
Provisioners: daemon.Provisioners,
94+
Telemetry: api.Telemetry,
95+
Logger: api.Logger.Named(fmt.Sprintf("provisionerd-%s", daemon.Name)),
96+
})
97+
if err != nil {
98+
_ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("drpc register provisioner daemon: %s", err))
99+
return
100+
}
101+
server := drpcserver.NewWithOptions(mux, drpcserver.Options{
102+
Log: func(err error) {
103+
if xerrors.Is(err, io.EOF) {
104+
return
105+
}
106+
api.Logger.Debug(r.Context(), "drpc server error", slog.Error(err))
107+
},
108+
})
109+
err = server.Serve(r.Context(), session)
110+
if err != nil && !xerrors.Is(err, io.EOF) {
111+
api.Logger.Debug(r.Context(), "provisioner daemon disconnected", slog.Error(err))
112+
_ = conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("serve: %s", err))
113+
return
114+
}
115+
_ = conn.Close(websocket.StatusGoingAway, "")
116+
}
117+
118+
func convertProvisionerDaemon(daemon database.ProvisionerDaemon) codersdk.ProvisionerDaemon {
119+
result := codersdk.ProvisionerDaemon{
120+
ID: daemon.ID,
121+
CreatedAt: daemon.CreatedAt,
122+
UpdatedAt: daemon.UpdatedAt,
123+
Name: daemon.Name,
124+
}
125+
for _, provisionerType := range daemon.Provisioners {
126+
result.Provisioners = append(result.Provisioners, codersdk.ProvisionerType(provisionerType))
127+
}
128+
if daemon.AuthToken.Valid {
129+
result.AuthToken = &daemon.AuthToken.UUID
130+
}
131+
return result
132+
}

0 commit comments

Comments
 (0)