mirror of
https://github.com/tailscale/tailscale.git
synced 2025-12-01 15:32:05 +01:00
Remove the State enum (StateNew, StateNotAuthenticated, etc.) from controlclient and replace it with two explicit boolean fields: - LoginFinished: indicates successful authentication - Synced: indicates we've received at least one netmap This makes the state more composable and easier to reason about, as multiple conditions can be true independently rather than being encoded in a single enum value. The State enum was originally intended as the state machine for the whole client, but that abstraction moved to ipn.Backend long ago. This change continues moving away from the legacy state machine by representing state as a combination of independent facts. Also adds test helpers in ipnlocal that check independent, observable facts (hasValidNetMap, needsLogin, etc.) rather than relying on derived state enums, making tests more robust. Updates #12639 Signed-off-by: James Tucker <james@tailscale.com>
56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package controlclient
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"tailscale.com/types/netmap"
|
|
"tailscale.com/types/persist"
|
|
"tailscale.com/types/structs"
|
|
)
|
|
|
|
type Status struct {
|
|
_ structs.Incomparable
|
|
|
|
// Err, if non-nil, is an error that occurred while logging in.
|
|
//
|
|
// If it's of type UserVisibleError then it's meant to be shown to users in
|
|
// their Tailscale client. Otherwise it's just logged to tailscaled's logs.
|
|
Err error
|
|
|
|
// URL, if non-empty, is the interactive URL to visit to finish logging in.
|
|
URL string
|
|
|
|
// LoggedIn, if true, indicates that serveRegister has completed and no
|
|
// other login change is in progress.
|
|
LoggedIn bool
|
|
|
|
// InMapPoll, if true, indicates that we've received at least one netmap
|
|
// and are connected to receive updates.
|
|
InMapPoll bool
|
|
|
|
// NetMap is the latest server-pushed state of the tailnet network.
|
|
NetMap *netmap.NetworkMap
|
|
|
|
// Persist, when Valid, is the locally persisted configuration.
|
|
//
|
|
// TODO(bradfitz,maisem): clarify this.
|
|
Persist persist.PersistView
|
|
}
|
|
|
|
// Equal reports whether s and s2 are equal.
|
|
func (s *Status) Equal(s2 *Status) bool {
|
|
if s == nil && s2 == nil {
|
|
return true
|
|
}
|
|
return s != nil && s2 != nil &&
|
|
s.Err == s2.Err &&
|
|
s.URL == s2.URL &&
|
|
s.LoggedIn == s2.LoggedIn &&
|
|
s.InMapPoll == s2.InMapPoll &&
|
|
reflect.DeepEqual(s.Persist, s2.Persist) &&
|
|
reflect.DeepEqual(s.NetMap, s2.NetMap)
|
|
}
|