mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
fix: use client preferred URL for the default DERP (#18911)
The agentsdk currently does a remap of the DERP map to change the EmbeddedRelay node's URL to match the agent's access URL. This PR makes changes to the `workspacesdk` (used by clients like the CLI) and `vpn` (used by Coder Desktop) to match this behavior. This enables us the ability to try Coder clients in dogfood over a VPN without changing the global access URL.
This commit is contained in:
+20
-1
@@ -78,6 +78,19 @@ type Options struct {
|
||||
UpdateHandler tailnet.UpdatesHandler
|
||||
}
|
||||
|
||||
type derpMapRewriter struct {
|
||||
logger slog.Logger
|
||||
serverURL *url.URL
|
||||
}
|
||||
|
||||
var _ tailnet.DERPMapRewriter = &derpMapRewriter{}
|
||||
|
||||
// RewriteDERPMap implements tailnet.DERPMapRewriter. See
|
||||
// tailnet.RewriteDERPMapDefaultRelay for more details on why this is necessary.
|
||||
func (d *derpMapRewriter) RewriteDERPMap(derpMap *tailcfg.DERPMap) {
|
||||
tailnet.RewriteDERPMapDefaultRelay(context.Background(), d.logger, derpMap, d.serverURL)
|
||||
}
|
||||
|
||||
func (*client) NewConn(initCtx context.Context, serverURL *url.URL, token string, options *Options) (vpnC Conn, err error) {
|
||||
if options == nil {
|
||||
options = &Options{}
|
||||
@@ -135,6 +148,12 @@ func (*client) NewConn(initCtx context.Context, serverURL *url.URL, token string
|
||||
WorkspaceOwnerId: tailnet.UUIDToByteSlice(me.ID),
|
||||
}))
|
||||
|
||||
derpMapRewriter := &derpMapRewriter{
|
||||
logger: options.Logger,
|
||||
serverURL: serverURL,
|
||||
}
|
||||
derpMapRewriter.RewriteDERPMap(connInfo.DERPMap)
|
||||
|
||||
clonedHeaders := headers.Clone()
|
||||
ip := tailnet.CoderServicePrefix.RandomAddr()
|
||||
conn, err := tailnet.NewConn(&tailnet.Options{
|
||||
@@ -164,7 +183,7 @@ func (*client) NewConn(initCtx context.Context, serverURL *url.URL, token string
|
||||
coordCtrl := tailnet.NewTunnelSrcCoordController(options.Logger, conn)
|
||||
controller.ResumeTokenCtrl = tailnet.NewBasicResumeTokenController(options.Logger, clk)
|
||||
controller.CoordCtrl = coordCtrl
|
||||
controller.DERPCtrl = tailnet.NewBasicDERPController(options.Logger, conn)
|
||||
controller.DERPCtrl = tailnet.NewBasicDERPController(options.Logger, derpMapRewriter, conn)
|
||||
updatesCtrl := tailnet.NewTunnelAllWorkspaceUpdatesController(
|
||||
options.Logger,
|
||||
coordCtrl,
|
||||
|
||||
+11
-6
@@ -43,14 +43,19 @@ func TestClient_WorkspaceUpdates(t *testing.T) {
|
||||
hostnames []string
|
||||
}{
|
||||
{
|
||||
name: "empty",
|
||||
agentConnectionInfo: workspacesdk.AgentConnectionInfo{},
|
||||
hostnames: []string{"wrk.coder.", "agnt.wrk.me.coder.", "agnt.wrk.rootbeer.coder."},
|
||||
name: "empty",
|
||||
agentConnectionInfo: workspacesdk.AgentConnectionInfo{
|
||||
DERPMap: &tailcfg.DERPMap{},
|
||||
},
|
||||
hostnames: []string{"wrk.coder.", "agnt.wrk.me.coder.", "agnt.wrk.rootbeer.coder."},
|
||||
},
|
||||
{
|
||||
name: "suffix",
|
||||
agentConnectionInfo: workspacesdk.AgentConnectionInfo{HostnameSuffix: "float"},
|
||||
hostnames: []string{"wrk.float.", "agnt.wrk.me.float.", "agnt.wrk.rootbeer.float."},
|
||||
name: "suffix",
|
||||
agentConnectionInfo: workspacesdk.AgentConnectionInfo{
|
||||
HostnameSuffix: "float",
|
||||
DERPMap: &tailcfg.DERPMap{},
|
||||
},
|
||||
hostnames: []string{"wrk.float.", "agnt.wrk.me.float.", "agnt.wrk.rootbeer.float."},
|
||||
},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
|
||||
Reference in New Issue
Block a user