This makes it easier to debug issues with tests that
start multiple daemons.
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
| ... | ... |
@@ -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 {
|