Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a5b1014

Browse files
committed
chore: add setAddresses to nodeUpdater
1 parent fc0a15c commit a5b1014

File tree

2 files changed

+93
-1
lines changed

2 files changed

+93
-1
lines changed

tailnet/node.go

+12
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,15 @@ func (u *nodeUpdater) setStatus(s *wgengine.Status, err error) {
180180
u.dirty = true
181181
u.Broadcast()
182182
}
183+
184+
func (u *nodeUpdater) setAddresses(ips []netip.Prefix) {
185+
u.L.Lock()
186+
defer u.L.Unlock()
187+
if d := prefixesDifferent(u.addresses, ips); !d {
188+
return
189+
}
190+
u.addresses = make([]netip.Prefix, len(ips))
191+
copy(u.addresses, ips)
192+
u.dirty = true
193+
u.Broadcast()
194+
}

tailnet/node_internal_test.go

+81-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ func TestNodeUpdater_setStatus_different(t *testing.T) {
227227
node := testutil.RequireRecvCtx(ctx, t, nodeCh)
228228
require.Equal(t, nodeKey, node.Key)
229229
require.Equal(t, discoKey, node.DiscoKey)
230-
require.True(t, slices.Equal([]string{"[fe80::1]:5678"}, node.Endpoints))
230+
require.Equal(t, []string{"[fe80::1]:5678"}, node.Endpoints)
231231

232232
// Then: we store the AsOf time as lastStatus
233233
uut.L.Lock()
@@ -361,3 +361,83 @@ func TestNodeUpdater_setStatus_outdated(t *testing.T) {
361361
}()
362362
_ = testutil.RequireRecvCtx(ctx, t, done)
363363
}
364+
365+
func TestNodeUpdater_setAddresses_different(t *testing.T) {
366+
t.Parallel()
367+
ctx := testutil.Context(t, testutil.WaitShort)
368+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
369+
id := tailcfg.NodeID(1)
370+
nodeKey := key.NewNode().Public()
371+
discoKey := key.NewDisco().Public()
372+
nodeCh := make(chan *Node)
373+
uut := newNodeUpdater(
374+
logger,
375+
func(n *Node) {
376+
nodeCh <- n
377+
},
378+
id, nodeKey, discoKey,
379+
)
380+
defer uut.close()
381+
382+
// Given: preferred DERP is 1, so we'll send an update
383+
uut.L.Lock()
384+
uut.preferredDERP = 1
385+
uut.L.Unlock()
386+
387+
// When: we set addresses
388+
addrs := []netip.Prefix{netip.MustParsePrefix("192.168.0.200/32")}
389+
uut.setAddresses(addrs)
390+
391+
// Then: we receive an update with the addresses
392+
node := testutil.RequireRecvCtx(ctx, t, nodeCh)
393+
require.Equal(t, nodeKey, node.Key)
394+
require.Equal(t, discoKey, node.DiscoKey)
395+
require.Equal(t, addrs, node.Addresses)
396+
require.Equal(t, addrs, node.AllowedIPs)
397+
398+
done := make(chan struct{})
399+
go func() {
400+
defer close(done)
401+
uut.close()
402+
}()
403+
_ = testutil.RequireRecvCtx(ctx, t, done)
404+
}
405+
406+
func TestNodeUpdater_setAddresses_same(t *testing.T) {
407+
t.Parallel()
408+
ctx := testutil.Context(t, testutil.WaitShort)
409+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
410+
id := tailcfg.NodeID(1)
411+
nodeKey := key.NewNode().Public()
412+
discoKey := key.NewDisco().Public()
413+
nodeCh := make(chan *Node)
414+
uut := newNodeUpdater(
415+
logger,
416+
func(n *Node) {
417+
nodeCh <- n
418+
},
419+
id, nodeKey, discoKey,
420+
)
421+
defer uut.close()
422+
423+
// Then: we don't configure
424+
requireNeverConfigures(ctx, t, &uut.phased)
425+
426+
// Given: preferred DERP is 1, so we would send an update on change &&
427+
// addrs already set
428+
addrs := []netip.Prefix{netip.MustParsePrefix("192.168.0.200/32")}
429+
uut.L.Lock()
430+
uut.preferredDERP = 1
431+
uut.addresses = slices.Clone(addrs)
432+
uut.L.Unlock()
433+
434+
// When: we set addrs
435+
uut.setAddresses(addrs)
436+
437+
done := make(chan struct{})
438+
go func() {
439+
defer close(done)
440+
uut.close()
441+
}()
442+
_ = testutil.RequireRecvCtx(ctx, t, done)
443+
}

0 commit comments

Comments
 (0)