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:
Dean Sheather
2025-07-17 20:17:44 +10:00
committed by GitHub
parent fb00cd2c1a
commit a1b87a67c6
11 changed files with 248 additions and 56 deletions
+20 -1
View File
@@ -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
View File
@@ -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 {