mirror of
https://github.com/coder/coder.git
synced 2025-07-08 11:39:50 +00:00
fix: change servertailnet to register the DERP dialer before setting DERP map (#12137)
I noticed a possible race where tailnet.Conn can try to dial the embedded region before we've set our custom dialer that send the DERP in-memory. This closes that race and adds a test case for servertailnet with no STUN and an embedded relay
This commit is contained in:
@ -32,22 +32,47 @@ import (
|
||||
//go:generate mockgen -destination ./coordinatormock.go -package tailnettest github.com/coder/coder/v2/tailnet Coordinator
|
||||
//go:generate mockgen -destination ./coordinateemock.go -package tailnettest github.com/coder/coder/v2/tailnet Coordinatee
|
||||
|
||||
type derpAndSTUNCfg struct {
|
||||
DisableSTUN bool
|
||||
DERPIsEmbedded bool
|
||||
}
|
||||
|
||||
type DERPAndStunOption func(cfg *derpAndSTUNCfg)
|
||||
|
||||
func DisableSTUN(cfg *derpAndSTUNCfg) {
|
||||
cfg.DisableSTUN = true
|
||||
}
|
||||
|
||||
func DERPIsEmbedded(cfg *derpAndSTUNCfg) {
|
||||
cfg.DERPIsEmbedded = true
|
||||
}
|
||||
|
||||
// RunDERPAndSTUN creates a DERP mapping for tests.
|
||||
func RunDERPAndSTUN(t *testing.T) (*tailcfg.DERPMap, *derp.Server) {
|
||||
func RunDERPAndSTUN(t *testing.T, opts ...DERPAndStunOption) (*tailcfg.DERPMap, *derp.Server) {
|
||||
cfg := new(derpAndSTUNCfg)
|
||||
for _, o := range opts {
|
||||
o(cfg)
|
||||
}
|
||||
logf := tailnet.Logger(slogtest.Make(t, nil))
|
||||
d := derp.NewServer(key.NewNode(), logf)
|
||||
server := httptest.NewUnstartedServer(derphttp.Handler(d))
|
||||
server.Config.ErrorLog = tslogger.StdLogger(logf)
|
||||
server.Config.TLSNextProto = make(map[string]func(*http.Server, *tls.Conn, http.Handler))
|
||||
server.StartTLS()
|
||||
|
||||
stunAddr, stunCleanup := stuntest.ServeWithPacketListener(t, nettype.Std{})
|
||||
t.Cleanup(func() {
|
||||
server.CloseClientConnections()
|
||||
server.Close()
|
||||
d.Close()
|
||||
stunCleanup()
|
||||
})
|
||||
|
||||
stunPort := -1
|
||||
if !cfg.DisableSTUN {
|
||||
stunAddr, stunCleanup := stuntest.ServeWithPacketListener(t, nettype.Std{})
|
||||
t.Cleanup(func() {
|
||||
stunCleanup()
|
||||
})
|
||||
stunPort = stunAddr.Port
|
||||
}
|
||||
tcpAddr, ok := server.Listener.Addr().(*net.TCPAddr)
|
||||
if !ok {
|
||||
t.FailNow()
|
||||
@ -65,11 +90,12 @@ func RunDERPAndSTUN(t *testing.T) (*tailcfg.DERPMap, *derp.Server) {
|
||||
RegionID: 1,
|
||||
IPv4: "127.0.0.1",
|
||||
IPv6: "none",
|
||||
STUNPort: stunAddr.Port,
|
||||
STUNPort: stunPort,
|
||||
DERPPort: tcpAddr.Port,
|
||||
InsecureForTests: true,
|
||||
},
|
||||
},
|
||||
EmbeddedRelay: cfg.DERPIsEmbedded,
|
||||
},
|
||||
},
|
||||
}, d
|
||||
|
Reference in New Issue
Block a user