Skip to content

Commit

Permalink
handle route updates correctly
Browse files Browse the repository at this point in the history
Signed-off-by: Kristoffer Dalby <[email protected]>
  • Loading branch information
kradalby committed Sep 19, 2023
1 parent c957f89 commit 096ac31
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 8 deletions.
6 changes: 6 additions & 0 deletions hscontrol/db/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,12 @@ func (hsdb *HSDatabase) saveMachineRoutes(machine *types.Machine) error {
advertisedRoutes[prefix] = false
}

log.Trace().
Str("machine", machine.Hostname).
Interface("advertisedRoutes", advertisedRoutes).
Interface("currentRoutes", currentRoutes).
Msg("updating routes")

for pos, route := range currentRoutes {
if _, ok := advertisedRoutes[netip.Prefix(route.Prefix)]; ok {
if !route.Advertised {
Expand Down
18 changes: 17 additions & 1 deletion hscontrol/poll.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ func (h *Headscale) handlePoll(
) {
logInfo, logErr := logPollFunc(mapRequest, machine, isNoise)

// This is the mechanism where the node gives us inforamtion about its
// current configuration.
//
// If OmitPeers is true, Stream is false, and ReadOnly is false,
// then te server will let clients update their endpoints without
// breaking existing long-polling (Stream == true) connections.
Expand All @@ -84,8 +87,11 @@ func (h *Headscale) handlePoll(
Msg("Received endpoint update")

now := time.Now().UTC()
machine.Endpoints = mapRequest.Endpoints
machine.LastSeen = &now
machine.Hostname = mapRequest.Hostinfo.Hostname
machine.HostInfo = types.HostInfo(*mapRequest.Hostinfo)
machine.DiscoKey = util.DiscoPublicKeyStripPrefix(mapRequest.DiscoKey)
machine.Endpoints = mapRequest.Endpoints

if err := h.db.MachineSave(machine); err != nil {
logErr(err, "Failed to persist/update machine in the database")
Expand All @@ -94,6 +100,14 @@ func (h *Headscale) handlePoll(
return
}

err := h.db.SaveMachineRoutes(machine)
if err != nil {
logErr(err, "Error processing machine routes")
http.Error(writer, "", http.StatusInternalServerError)

return
}

h.nodeNotifier.NotifyWithIgnore(
types.StateUpdate{
Type: types.StatePeerChanged,
Expand Down Expand Up @@ -134,6 +148,8 @@ func (h *Headscale) handlePoll(
return
}

now := time.Now().UTC()
machine.LastSeen = &now
machine.Hostname = mapRequest.Hostinfo.Hostname
machine.HostInfo = types.HostInfo(*mapRequest.Hostinfo)
machine.DiscoKey = util.DiscoPublicKeyStripPrefix(mapRequest.DiscoKey)
Expand Down
13 changes: 6 additions & 7 deletions integration/cli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -413,14 +413,12 @@ func TestEnablingRoutes(t *testing.T) {
// advertise routes using the up command
for i, client := range allClients {
routeStr := fmt.Sprintf("10.0.%d.0/24", i)
hostname, _ := client.FQDN()
_, _, err = client.Execute([]string{
command := []string{
"tailscale",
"up",
fmt.Sprintf("--advertise-routes=%s", routeStr),
"-login-server", headscale.GetEndpoint(),
"--hostname", hostname,
})
"set",
"--advertise-routes=" + routeStr,
}
_, _, err := client.Execute(command)
assertNoErrf(t, "failed to advertise route: %s", err)
}

Expand Down Expand Up @@ -474,6 +472,7 @@ func TestEnablingRoutes(t *testing.T) {
&enablingRoutes,
)
assertNoErr(t, err)
assert.Len(t, enablingRoutes, 3)

for _, route := range enablingRoutes {
assert.Equal(t, route.Advertised, true)
Expand Down

0 comments on commit 096ac31

Please sign in to comment.