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:
Spike Curtis
2024-02-15 10:51:12 +04:00
committed by GitHub
parent 1bb4aecf49
commit 2d0b9106c0
5 changed files with 81 additions and 34 deletions

View File

@ -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