And log it when provided in map responses. The test uses the date on which I joined Tailscale. :) Signed-off-by: Josh Bleecher Snyder <[email protected]>
@@ -772,6 +772,9 @@ func (c *Direct) sendMapRequest(ctx context.Context, maxPolls int, cb func(*netm
go answerPing(c.logf, c.httpc, pr)
}
+ if !resp.ControlTime.IsZero() {
+ c.logf("netmap: control time is %v", resp.ControlTime.UTC().Format(time.RFC3339Nano))
+ }
if resp.KeepAlive {
vlogf("netmap: got keep-alive")
} else {
@@ -1291,6 +1291,9 @@ type MapResponse struct {
// SSH connections should be handled.
SSHPolicy *SSHPolicy `json:",omitempty"`
+ // ControlTime, if non-zero, is the current timestamp according to the control server.
+ ControlTime time.Time `json:",omitempty"`
+
// Debug is normally nil, except for when the control server
// is setting debug settings on a node.
Debug *Debug `json:",omitempty"`
@@ -146,6 +146,27 @@ func TestCollectPanic(t *testing.T) {
+func TestControlTimeLogLine(t *testing.T) {
+ t.Parallel()
+ env := newTestEnv(t)
+ n := newTestNode(t, env)
+ n.StartDaemon()
+ n.AwaitResponding()
+ n.MustUp()
+ n.AwaitRunning()
+ if err := tstest.WaitFor(20*time.Second, func() error {
+ const sub = `netmap: control time is 2020-08-03T00:00:00.000000001Z`
+ if !n.env.LogCatcher.logsContains(mem.S(sub)) {
+ return fmt.Errorf("log catcher didn't see %#q; got %s", sub, n.env.LogCatcher.logsString())
+ return nil
+ }); err != nil {
+ t.Fatal(err)
+}
// test Issue 2321: Start with UpdatePrefs should save prefs to disk
func TestStateSavedOnStart(t *testing.T) {
t.Parallel()
@@ -730,7 +730,8 @@ func (s *Server) MapResponse(req *tailcfg.MapRequest) (res *tailcfg.MapResponse,
Debug: &tailcfg.Debug{
DisableUPnP: "true",
},
- DNSConfig: s.DNSConfig,
+ DNSConfig: s.DNSConfig,
+ ControlTime: time.Date(2020, 8, 3, 0, 0, 0, 1, time.UTC),
for _, p := range s.AllNodes() {
if p.StableID != node.StableID {