Skip to content

Commit 83ae54d

Browse files
committed
chore: add setBlockEndpoints to nodeUpdater
1 parent b050932 commit 83ae54d

File tree

2 files changed

+107
-1
lines changed

2 files changed

+107
-1
lines changed

tailnet/node.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type nodeUpdater struct {
3535
endpoints []string
3636
addresses []netip.Prefix
3737
lastStatus time.Time
38+
blockEndpoints bool
3839
}
3940

4041
// updateLoop waits until the config is dirty and then calls the callback with the newest node.
@@ -111,14 +112,18 @@ func newNodeUpdater(
111112

112113
// nodeLocked returns the current best node information. u.L must be held.
113114
func (u *nodeUpdater) nodeLocked() *Node {
115+
var endpoints []string
116+
if !u.blockEndpoints {
117+
endpoints = slices.Clone(u.endpoints)
118+
}
114119
return &Node{
115120
ID: u.id,
116121
AsOf: dbtime.Now(),
117122
Key: u.key,
118123
Addresses: slices.Clone(u.addresses),
119124
AllowedIPs: slices.Clone(u.addresses),
120125
DiscoKey: u.discoKey,
121-
Endpoints: slices.Clone(u.endpoints),
126+
Endpoints: endpoints,
122127
PreferredDERP: u.preferredDERP,
123128
DERPLatency: maps.Clone(u.derpLatency),
124129
DERPForcedWebsocket: maps.Clone(u.derpForcedWebsockets),
@@ -209,3 +214,17 @@ func (u *nodeUpdater) setCallback(callback func(node *Node)) {
209214
u.dirty = true
210215
u.Broadcast()
211216
}
217+
218+
// setBlockEndpoints sets whether we block reporting Node endpoints. u.L MUST NOT
219+
// be held.
220+
// nolint: revive
221+
func (u *nodeUpdater) setBlockEndpoints(blockEndpoints bool) {
222+
u.L.Lock()
223+
defer u.L.Unlock()
224+
if u.blockEndpoints == blockEndpoints {
225+
return
226+
}
227+
u.dirty = true
228+
u.blockEndpoints = blockEndpoints
229+
u.Broadcast()
230+
}

tailnet/node_internal_test.go

+87
Original file line numberDiff line numberDiff line change
@@ -482,3 +482,90 @@ func TestNodeUpdater_setCallback(t *testing.T) {
482482
}()
483483
_ = testutil.RequireRecvCtx(ctx, t, done)
484484
}
485+
486+
func TestNodeUpdater_setBlockEndpoints_different(t *testing.T) {
487+
t.Parallel()
488+
ctx := testutil.Context(t, testutil.WaitShort)
489+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
490+
id := tailcfg.NodeID(1)
491+
nodeKey := key.NewNode().Public()
492+
discoKey := key.NewDisco().Public()
493+
nodeCh := make(chan *Node)
494+
uut := newNodeUpdater(
495+
logger,
496+
func(n *Node) {
497+
nodeCh <- n
498+
},
499+
id, nodeKey, discoKey,
500+
)
501+
defer uut.close()
502+
503+
// Given: preferred DERP is 1, so we'll send an update && some endpoints
504+
uut.L.Lock()
505+
uut.preferredDERP = 1
506+
uut.endpoints = []string{"10.11.12.13:7890"}
507+
uut.L.Unlock()
508+
509+
// When: we setBlockEndpoints
510+
uut.setBlockEndpoints(true)
511+
512+
// Then: we receive an update without endpoints
513+
node := testutil.RequireRecvCtx(ctx, t, nodeCh)
514+
require.Equal(t, nodeKey, node.Key)
515+
require.Equal(t, discoKey, node.DiscoKey)
516+
require.Len(t, node.Endpoints, 0)
517+
518+
// When: we unset BlockEndpoints
519+
uut.setBlockEndpoints(false)
520+
521+
// Then: we receive an update with endpoints
522+
node = testutil.RequireRecvCtx(ctx, t, nodeCh)
523+
require.Equal(t, nodeKey, node.Key)
524+
require.Equal(t, discoKey, node.DiscoKey)
525+
require.Len(t, node.Endpoints, 1)
526+
527+
done := make(chan struct{})
528+
go func() {
529+
defer close(done)
530+
uut.close()
531+
}()
532+
_ = testutil.RequireRecvCtx(ctx, t, done)
533+
}
534+
535+
func TestNodeUpdater_setBlockEndpoints_same(t *testing.T) {
536+
t.Parallel()
537+
ctx := testutil.Context(t, testutil.WaitShort)
538+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
539+
id := tailcfg.NodeID(1)
540+
nodeKey := key.NewNode().Public()
541+
discoKey := key.NewDisco().Public()
542+
nodeCh := make(chan *Node)
543+
uut := newNodeUpdater(
544+
logger,
545+
func(n *Node) {
546+
nodeCh <- n
547+
},
548+
id, nodeKey, discoKey,
549+
)
550+
defer uut.close()
551+
552+
// Then: we don't configure
553+
requireNeverConfigures(ctx, t, &uut.phased)
554+
555+
// Given: preferred DERP is 1, so we would send an update on change &&
556+
// blockEndpoints already set
557+
uut.L.Lock()
558+
uut.preferredDERP = 1
559+
uut.blockEndpoints = true
560+
uut.L.Unlock()
561+
562+
// When: we set block endpoints
563+
uut.setBlockEndpoints(true)
564+
565+
done := make(chan struct{})
566+
go func() {
567+
defer close(done)
568+
uut.close()
569+
}()
570+
_ = testutil.RequireRecvCtx(ctx, t, done)
571+
}

0 commit comments

Comments
 (0)