Browse code

testutil/daemon: prefix all logs with daemon-id

This makes it easier to debug issues with tests that
start multiple daemons.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2019/10/09 20:17:52
Showing 3 changed files
... ...
@@ -196,7 +196,7 @@ func (d *Daemon) NewClientT(t testing.TB, extraOpts ...client.Opt) *client.Clien
196 196
 	t.Helper()
197 197
 
198 198
 	c, err := d.NewClient(extraOpts...)
199
-	assert.NilError(t, err, "cannot create daemon client")
199
+	assert.NilError(t, err, "[%s] could not create daemon client", d.id)
200 200
 	return c
201 201
 }
202 202
 
... ...
@@ -215,16 +215,15 @@ func (d *Daemon) NewClient(extraOpts ...client.Opt) (*client.Client, error) {
215 215
 func (d *Daemon) Cleanup(t testing.TB) {
216 216
 	t.Helper()
217 217
 	cleanupMount(t, d)
218
-	// Cleanup swarmkit wal files if present
219
-	cleanupRaftDir(t, d.Root)
220
-	cleanupNetworkNamespace(t, d.execRoot)
218
+	cleanupRaftDir(t, d)
219
+	cleanupNetworkNamespace(t, d)
221 220
 }
222 221
 
223 222
 // Start starts the daemon and return once it is ready to receive requests.
224 223
 func (d *Daemon) Start(t testing.TB, args ...string) {
225 224
 	t.Helper()
226 225
 	if err := d.StartWithError(args...); err != nil {
227
-		t.Fatalf("failed to start daemon with arguments %v : %v", args, err)
226
+		t.Fatalf("[%s] failed to start daemon with arguments %v : %v", d.id, args, err)
228 227
 	}
229 228
 }
230 229
 
... ...
@@ -233,7 +232,7 @@ func (d *Daemon) Start(t testing.TB, args ...string) {
233 233
 func (d *Daemon) StartWithError(args ...string) error {
234 234
 	logFile, err := os.OpenFile(filepath.Join(d.Folder, "docker.log"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600)
235 235
 	if err != nil {
236
-		return errors.Wrapf(err, "[%s] Could not create %s/docker.log", d.id, d.Folder)
236
+		return errors.Wrapf(err, "[%s] failed to create logfile", d.id)
237 237
 	}
238 238
 
239 239
 	return d.StartWithLogFile(logFile, args...)
... ...
@@ -437,9 +436,9 @@ func (d *Daemon) Stop(t testing.TB) {
437 437
 	err := d.StopWithError()
438 438
 	if err != nil {
439 439
 		if err != errDaemonNotStarted {
440
-			t.Fatalf("Error while stopping the daemon %s : %v", d.id, err)
440
+			t.Fatalf("[%s] error while stopping the daemon: %v", d.id, err)
441 441
 		} else {
442
-			t.Logf("Daemon %s is not started", d.id)
442
+			t.Logf("[%s] daemon is not started", d.id)
443 443
 		}
444 444
 	}
445 445
 }
... ...
@@ -453,10 +452,10 @@ func (d *Daemon) StopWithError() (err error) {
453 453
 		return errDaemonNotStarted
454 454
 	}
455 455
 	defer func() {
456
-		if err == nil {
457
-			d.log.Logf("[%s] Daemon stopped", d.id)
456
+		if err != nil {
457
+			d.log.Logf("[%s] error while stopping daemon: %v", d.id, err)
458 458
 		} else {
459
-			d.log.Logf("[%s] Error when stopping daemon: %v", d.id, err)
459
+			d.log.Logf("[%s] daemon stopped", d.id)
460 460
 		}
461 461
 		d.logFile.Close()
462 462
 		d.cmd = nil
... ...
@@ -467,13 +466,13 @@ func (d *Daemon) StopWithError() (err error) {
467 467
 	defer ticker.Stop()
468 468
 	tick := ticker.C
469 469
 
470
-	d.log.Logf("[%s] Stopping daemon", d.id)
470
+	d.log.Logf("[%s] stopping daemon", d.id)
471 471
 
472 472
 	if err := d.cmd.Process.Signal(os.Interrupt); err != nil {
473 473
 		if strings.Contains(err.Error(), "os: process already finished") {
474 474
 			return errDaemonNotStarted
475 475
 		}
476
-		return errors.Errorf("could not send signal: %v", err)
476
+		return errors.Errorf("[%s] could not send signal: %v", d.id, err)
477 477
 	}
478 478
 
479 479
 out1:
... ...
@@ -483,7 +482,7 @@ out1:
483 483
 			return err
484 484
 		case <-time.After(20 * time.Second):
485 485
 			// time for stopping jobs and run onShutdown hooks
486
-			d.log.Logf("[%s] daemon stop timeout", d.id)
486
+			d.log.Logf("[%s] daemon stop timed out after 20 seconds", d.id)
487 487
 			break out1
488 488
 		}
489 489
 	}
... ...
@@ -496,18 +495,18 @@ out2:
496 496
 		case <-tick:
497 497
 			i++
498 498
 			if i > 5 {
499
-				d.log.Logf("tried to interrupt daemon for %d times, now try to kill it", i)
499
+				d.log.Logf("[%s] tried to interrupt daemon for %d times, now try to kill it", d.id, i)
500 500
 				break out2
501 501
 			}
502
-			d.log.Logf("Attempt #%d: daemon is still running with pid %d", i, d.cmd.Process.Pid)
502
+			d.log.Logf("[%d] attempt #%d/5: daemon is still running with pid %d", i, d.cmd.Process.Pid)
503 503
 			if err := d.cmd.Process.Signal(os.Interrupt); err != nil {
504
-				return errors.Errorf("could not send signal: %v", err)
504
+				return errors.Errorf("[%s] attempt #%d/5 could not send signal: %v", d.id, i, err)
505 505
 			}
506 506
 		}
507 507
 	}
508 508
 
509 509
 	if err := d.cmd.Process.Kill(); err != nil {
510
-		d.log.Logf("Could not kill daemon: %v", err)
510
+		d.log.Logf("[%s] failed to kill daemon: %v", d.id, err)
511 511
 		return err
512 512
 	}
513 513
 
... ...
@@ -578,15 +577,15 @@ func (d *Daemon) ReloadConfig() error {
578 578
 
579 579
 	<-started
580 580
 	if err := signalDaemonReload(d.cmd.Process.Pid); err != nil {
581
-		return errors.Errorf("error signaling daemon reload: %v", err)
581
+		return errors.Errorf("[%s] error signaling daemon reload: %v", d.id, err)
582 582
 	}
583 583
 	select {
584 584
 	case err := <-errCh:
585 585
 		if err != nil {
586
-			return errors.Errorf("error waiting for daemon reload event: %v", err)
586
+			return errors.Wrapf(err, "[%s] error waiting for daemon reload event", d.id)
587 587
 		}
588 588
 	case <-time.After(30 * time.Second):
589
-		return errors.New("timeout waiting for daemon reload event")
589
+		return errors.Errorf("[%s] daemon reload event timed out after 30 seconds", d.id)
590 590
 	}
591 591
 	return nil
592 592
 }
... ...
@@ -595,19 +594,19 @@ func (d *Daemon) ReloadConfig() error {
595 595
 func (d *Daemon) LoadBusybox(t testing.TB) {
596 596
 	t.Helper()
597 597
 	clientHost, err := client.NewClientWithOpts(client.FromEnv)
598
-	assert.NilError(t, err, "failed to create client")
598
+	assert.NilError(t, err, "[%s] failed to create client", d.id)
599 599
 	defer clientHost.Close()
600 600
 
601 601
 	ctx := context.Background()
602 602
 	reader, err := clientHost.ImageSave(ctx, []string{"busybox:latest"})
603
-	assert.NilError(t, err, "failed to download busybox")
603
+	assert.NilError(t, err, "[%s] failed to download busybox", d.id)
604 604
 	defer reader.Close()
605 605
 
606 606
 	c := d.NewClientT(t)
607 607
 	defer c.Close()
608 608
 
609 609
 	resp, err := c.ImageLoad(ctx, reader, true)
610
-	assert.NilError(t, err, "failed to load busybox")
610
+	assert.NilError(t, err, "[%s] failed to load busybox", d.id)
611 611
 	defer resp.Body.Close()
612 612
 }
613 613
 
... ...
@@ -721,12 +720,13 @@ func cleanupMount(t testing.TB, d *Daemon) {
721 721
 	}
722 722
 }
723 723
 
724
-func cleanupRaftDir(t testing.TB, rootPath string) {
724
+// cleanupRaftDir removes swarmkit wal files if present
725
+func cleanupRaftDir(t testing.TB, d *Daemon) {
725 726
 	t.Helper()
726 727
 	for _, p := range []string{"wal", "wal-v3-encrypted", "snap-v3-encrypted"} {
727
-		dir := filepath.Join(rootPath, "swarm/raft", p)
728
+		dir := filepath.Join(d.Root, "swarm/raft", p)
728 729
 		if err := os.RemoveAll(dir); err != nil {
729
-			t.Logf("error removing %v: %v", dir, err)
730
+			t.Logf("[%s] error removing %v: %v", d.id, dir, err)
730 731
 		}
731 732
 	}
732 733
 }
... ...
@@ -13,17 +13,17 @@ import (
13 13
 	"gotest.tools/assert"
14 14
 )
15 15
 
16
-func cleanupNetworkNamespace(t testing.TB, execRoot string) {
16
+func cleanupNetworkNamespace(t testing.TB, d *Daemon) {
17 17
 	t.Helper()
18 18
 	// Cleanup network namespaces in the exec root of this
19 19
 	// daemon because this exec root is specific to this
20 20
 	// daemon instance and has no chance of getting
21 21
 	// cleaned up when a new daemon is instantiated with a
22 22
 	// new exec root.
23
-	netnsPath := filepath.Join(execRoot, "netns")
23
+	netnsPath := filepath.Join(d.execRoot, "netns")
24 24
 	filepath.Walk(netnsPath, func(path string, info os.FileInfo, err error) error {
25 25
 		if err := unix.Unmount(path, unix.MNT_DETACH); err != nil && err != unix.EINVAL && err != unix.ENOENT {
26
-			t.Logf("unmount of %s failed: %v", path, err)
26
+			t.Logf("[%s] unmount of %s failed: %v", d.id, path, err)
27 27
 		}
28 28
 		os.Remove(path)
29 29
 		return nil
... ...
@@ -23,8 +23,7 @@ func signalDaemonReload(pid int) error {
23 23
 	return fmt.Errorf("daemon reload not supported")
24 24
 }
25 25
 
26
-func cleanupNetworkNamespace(t testing.TB, execRoot string) {
27
-}
26
+func cleanupNetworkNamespace(_ testing.TB, _ *Daemon) {}
28 27
 
29 28
 // CgroupNamespace returns the cgroup namespace the daemon is running in
30 29
 func (d *Daemon) CgroupNamespace(t testing.TB) string {