mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08: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:
@@ -204,7 +204,8 @@ func (c *configMaps) netMapLocked() *netmap.NetworkMap {
|
||||
nm.Addresses = make([]netip.Prefix, len(c.addresses))
|
||||
copy(nm.Addresses, c.addresses)
|
||||
|
||||
nm.DERPMap = c.derpMap.Clone()
|
||||
// we don't need to set the DERPMap in the network map because we separately
|
||||
// send the DERPMap directly via SetDERPMap
|
||||
nm.Peers = c.peerConfigLocked()
|
||||
nm.SelfNode.Addresses = nm.Addresses
|
||||
nm.SelfNode.AllowedIPs = nm.Addresses
|
||||
|
||||
+3
-4
@@ -116,9 +116,6 @@ func NewConn(options *Options) (conn *Conn, err error) {
|
||||
if len(options.Addresses) == 0 {
|
||||
return nil, xerrors.New("At least one IP range must be provided")
|
||||
}
|
||||
if options.DERPMap == nil {
|
||||
return nil, xerrors.New("DERPMap must be provided")
|
||||
}
|
||||
|
||||
nodePrivateKey := key.NewNode()
|
||||
var nodeID tailcfg.NodeID
|
||||
@@ -219,7 +216,9 @@ func NewConn(options *Options) (conn *Conn, err error) {
|
||||
magicConn.DiscoPublicKey(),
|
||||
)
|
||||
cfgMaps.setAddresses(options.Addresses)
|
||||
cfgMaps.setDERPMap(options.DERPMap)
|
||||
if options.DERPMap != nil {
|
||||
cfgMaps.setDERPMap(options.DERPMap)
|
||||
}
|
||||
cfgMaps.setBlockEndpoints(options.BlockEndpoints)
|
||||
|
||||
nodeUp := newNodeUpdater(
|
||||
|
||||
@@ -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