Move some calls to container.LogEvent down lower so that there's
less of a chance of them being missed. Also add a few more events
that appear to have been missed.
Added testcases for new events: commit, copy, resize, attach, rename, top
Signed-off-by: Doug Davis <dug@us.ibm.com>
... | ... |
@@ -242,6 +242,7 @@ func (container *Container) Start() (err error) { |
242 | 242 |
} |
243 | 243 |
container.toDisk() |
244 | 244 |
container.cleanup() |
245 |
+ container.LogEvent("die") |
|
245 | 246 |
} |
246 | 247 |
}() |
247 | 248 |
|
... | ... |
@@ -375,7 +376,11 @@ func (container *Container) KillSig(sig int) error { |
375 | 375 |
return nil |
376 | 376 |
} |
377 | 377 |
|
378 |
- return container.daemon.Kill(container, sig) |
|
378 |
+ if err := container.daemon.Kill(container, sig); err != nil { |
|
379 |
+ return err |
|
380 |
+ } |
|
381 |
+ container.LogEvent("kill") |
|
382 |
+ return nil |
|
379 | 383 |
} |
380 | 384 |
|
381 | 385 |
// Wrapper aroung KillSig() suppressing "no such process" error. |
... | ... |
@@ -406,6 +411,7 @@ func (container *Container) Pause() error { |
406 | 406 |
return err |
407 | 407 |
} |
408 | 408 |
container.Paused = true |
409 |
+ container.LogEvent("pause") |
|
409 | 410 |
return nil |
410 | 411 |
} |
411 | 412 |
|
... | ... |
@@ -427,6 +433,7 @@ func (container *Container) Unpause() error { |
427 | 427 |
return err |
428 | 428 |
} |
429 | 429 |
container.Paused = false |
430 |
+ container.LogEvent("unpause") |
|
430 | 431 |
return nil |
431 | 432 |
} |
432 | 433 |
|
... | ... |
@@ -488,6 +495,7 @@ func (container *Container) Stop(seconds int) error { |
488 | 488 |
} |
489 | 489 |
} |
490 | 490 |
|
491 |
+ container.LogEvent("stop") |
|
491 | 492 |
return nil |
492 | 493 |
} |
493 | 494 |
|
... | ... |
@@ -502,14 +510,24 @@ func (container *Container) Restart(seconds int) error { |
502 | 502 |
if err := container.Stop(seconds); err != nil { |
503 | 503 |
return err |
504 | 504 |
} |
505 |
- return container.Start() |
|
505 |
+ |
|
506 |
+ if err := container.Start(); err != nil { |
|
507 |
+ return err |
|
508 |
+ } |
|
509 |
+ |
|
510 |
+ container.LogEvent("restart") |
|
511 |
+ return nil |
|
506 | 512 |
} |
507 | 513 |
|
508 | 514 |
func (container *Container) Resize(h, w int) error { |
509 | 515 |
if !container.IsRunning() { |
510 | 516 |
return fmt.Errorf("Cannot resize container %s, container is not running", container.ID) |
511 | 517 |
} |
512 |
- return container.command.ProcessConfig.Terminal.Resize(h, w) |
|
518 |
+ if err := container.command.ProcessConfig.Terminal.Resize(h, w); err != nil { |
|
519 |
+ return err |
|
520 |
+ } |
|
521 |
+ container.LogEvent("resize") |
|
522 |
+ return nil |
|
513 | 523 |
} |
514 | 524 |
|
515 | 525 |
func (container *Container) Export() (archive.Archive, error) { |
... | ... |
@@ -522,12 +540,13 @@ func (container *Container) Export() (archive.Archive, error) { |
522 | 522 |
container.Unmount() |
523 | 523 |
return nil, err |
524 | 524 |
} |
525 |
- return ioutils.NewReadCloserWrapper(archive, func() error { |
|
526 |
- err := archive.Close() |
|
527 |
- container.Unmount() |
|
528 |
- return err |
|
529 |
- }), |
|
530 |
- nil |
|
525 |
+ arch := ioutils.NewReadCloserWrapper(archive, func() error { |
|
526 |
+ err := archive.Close() |
|
527 |
+ container.Unmount() |
|
528 |
+ return err |
|
529 |
+ }) |
|
530 |
+ container.LogEvent("export") |
|
531 |
+ return arch, err |
|
531 | 532 |
} |
532 | 533 |
|
533 | 534 |
func (container *Container) Mount() error { |
... | ... |
@@ -628,13 +647,14 @@ func (container *Container) Copy(resource string) (io.ReadCloser, error) { |
628 | 628 |
if err != nil { |
629 | 629 |
return nil, err |
630 | 630 |
} |
631 |
- return ioutils.NewReadCloserWrapper(archive, func() error { |
|
632 |
- err := archive.Close() |
|
633 |
- container.UnmountVolumes(true) |
|
634 |
- container.Unmount() |
|
635 |
- return err |
|
636 |
- }), |
|
637 |
- nil |
|
631 |
+ reader := ioutils.NewReadCloserWrapper(archive, func() error { |
|
632 |
+ err := archive.Close() |
|
633 |
+ container.UnmountVolumes(true) |
|
634 |
+ container.Unmount() |
|
635 |
+ return err |
|
636 |
+ }) |
|
637 |
+ container.LogEvent("copy") |
|
638 |
+ return reader, nil |
|
638 | 639 |
} |
639 | 640 |
|
640 | 641 |
// Returns true if the container exposes a certain port |
... | ... |
@@ -826,6 +846,7 @@ func (c *Container) Attach(stdin io.ReadCloser, stdout io.Writer, stderr io.Writ |
826 | 826 |
} |
827 | 827 |
|
828 | 828 |
func (c *Container) AttachWithLogs(stdin io.ReadCloser, stdout, stderr io.Writer, logs, stream bool) error { |
829 |
+ |
|
829 | 830 |
if logs { |
830 | 831 |
logDriver, err := c.getLogger() |
831 | 832 |
cLog, err := logDriver.GetReader() |
... | ... |
@@ -855,6 +876,8 @@ func (c *Container) AttachWithLogs(stdin io.ReadCloser, stdout, stderr io.Writer |
855 | 855 |
} |
856 | 856 |
} |
857 | 857 |
|
858 |
+ c.LogEvent("attach") |
|
859 |
+ |
|
858 | 860 |
//stream |
859 | 861 |
if stream { |
860 | 862 |
var stdinPipe io.ReadCloser |
... | ... |
@@ -39,7 +39,6 @@ func (daemon *Daemon) ContainerCreate(name string, config *runconfig.Config, hos |
39 | 39 |
return "", warnings, err |
40 | 40 |
} |
41 | 41 |
|
42 |
- container.LogEvent("create") |
|
43 | 42 |
warnings = append(warnings, buildWarnings...) |
44 | 43 |
|
45 | 44 |
return container.ID, warnings, nil |
... | ... |
@@ -142,6 +141,7 @@ func (daemon *Daemon) Create(config *runconfig.Config, hostConfig *runconfig.Hos |
142 | 142 |
if err := container.ToDisk(); err != nil { |
143 | 143 |
return nil, nil, err |
144 | 144 |
} |
145 |
+ container.LogEvent("create") |
|
145 | 146 |
return container, warnings, nil |
146 | 147 |
} |
147 | 148 |
|
... | ... |
@@ -48,8 +48,6 @@ func (daemon *Daemon) ContainerRm(name string, config *ContainerRmConfig) error |
48 | 48 |
return fmt.Errorf("Cannot destroy container %s: %v", name, err) |
49 | 49 |
} |
50 | 50 |
|
51 |
- container.LogEvent("destroy") |
|
52 |
- |
|
53 | 51 |
if config.RemoveVolume { |
54 | 52 |
container.removeMountPoints() |
55 | 53 |
} |
... | ... |
@@ -102,6 +100,7 @@ func (daemon *Daemon) rm(container *Container, forceRemove bool) (err error) { |
102 | 102 |
daemon.idIndex.Delete(container.ID) |
103 | 103 |
daemon.containers.Delete(container.ID) |
104 | 104 |
os.RemoveAll(container.root) |
105 |
+ container.LogEvent("destroy") |
|
105 | 106 |
} |
106 | 107 |
}() |
107 | 108 |
|
... | ... |
@@ -130,6 +129,7 @@ func (daemon *Daemon) rm(container *Container, forceRemove bool) (err error) { |
130 | 130 |
daemon.idIndex.Delete(container.ID) |
131 | 131 |
daemon.containers.Delete(container.ID) |
132 | 132 |
|
133 |
+ container.LogEvent("destroy") |
|
133 | 134 |
return nil |
134 | 135 |
} |
135 | 136 |
|
... | ... |
@@ -141,10 +141,10 @@ func (d *Daemon) ContainerExecCreate(config *runconfig.ExecConfig) (string, erro |
141 | 141 |
Running: false, |
142 | 142 |
} |
143 | 143 |
|
144 |
- container.LogEvent("exec_create: " + execConfig.ProcessConfig.Entrypoint + " " + strings.Join(execConfig.ProcessConfig.Arguments, " ")) |
|
145 |
- |
|
146 | 144 |
d.registerExecCommand(execConfig) |
147 | 145 |
|
146 |
+ container.LogEvent("exec_create: " + execConfig.ProcessConfig.Entrypoint + " " + strings.Join(execConfig.ProcessConfig.Arguments, " ")) |
|
147 |
+ |
|
148 | 148 |
return execConfig.ID, nil |
149 | 149 |
|
150 | 150 |
} |
... | ... |
@@ -21,7 +21,5 @@ func (daemon *Daemon) ContainerExport(name string, out io.Writer) error { |
21 | 21 |
if _, err := io.Copy(out, data); err != nil { |
22 | 22 |
return fmt.Errorf("%s: %s", name, err) |
23 | 23 |
} |
24 |
- // FIXME: factor job-specific LogEvent to engine.Job.Run() |
|
25 |
- container.LogEvent("export") |
|
26 | 24 |
return nil |
27 | 25 |
} |
... | ... |
@@ -1794,7 +1794,7 @@ polling (using since). |
1794 | 1794 |
|
1795 | 1795 |
Docker containers report the following events: |
1796 | 1796 |
|
1797 |
- create, destroy, die, exec_create, exec_start, export, kill, oom, pause, restart, start, stop, unpause |
|
1797 |
+ attach, commit, copy, create, destroy, die, exec_create, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause |
|
1798 | 1798 |
|
1799 | 1799 |
and Docker images report: |
1800 | 1800 |
|
... | ... |
@@ -3,6 +3,7 @@ package main |
3 | 3 |
import ( |
4 | 4 |
"bufio" |
5 | 5 |
"fmt" |
6 |
+ "net/http" |
|
6 | 7 |
"os/exec" |
7 | 8 |
"regexp" |
8 | 9 |
"strconv" |
... | ... |
@@ -141,16 +142,20 @@ func (s *DockerSuite) TestEventsContainerEvents(c *check.C) { |
141 | 141 |
} |
142 | 142 |
events := strings.Split(out, "\n") |
143 | 143 |
events = events[:len(events)-1] |
144 |
- if len(events) < 4 { |
|
144 |
+ if len(events) < 5 { |
|
145 | 145 |
c.Fatalf("Missing expected event") |
146 | 146 |
} |
147 |
- createEvent := strings.Fields(events[len(events)-4]) |
|
147 |
+ createEvent := strings.Fields(events[len(events)-5]) |
|
148 |
+ attachEvent := strings.Fields(events[len(events)-4]) |
|
148 | 149 |
startEvent := strings.Fields(events[len(events)-3]) |
149 | 150 |
dieEvent := strings.Fields(events[len(events)-2]) |
150 | 151 |
destroyEvent := strings.Fields(events[len(events)-1]) |
151 | 152 |
if createEvent[len(createEvent)-1] != "create" { |
152 | 153 |
c.Fatalf("event should be create, not %#v", createEvent) |
153 | 154 |
} |
155 |
+ if attachEvent[len(createEvent)-1] != "attach" { |
|
156 |
+ c.Fatalf("event should be attach, not %#v", attachEvent) |
|
157 |
+ } |
|
154 | 158 |
if startEvent[len(startEvent)-1] != "start" { |
155 | 159 |
c.Fatalf("event should be start, not %#v", startEvent) |
156 | 160 |
} |
... | ... |
@@ -175,16 +180,20 @@ func (s *DockerSuite) TestEventsContainerEventsSinceUnixEpoch(c *check.C) { |
175 | 175 |
} |
176 | 176 |
events := strings.Split(out, "\n") |
177 | 177 |
events = events[:len(events)-1] |
178 |
- if len(events) < 4 { |
|
178 |
+ if len(events) < 5 { |
|
179 | 179 |
c.Fatalf("Missing expected event") |
180 | 180 |
} |
181 |
- createEvent := strings.Fields(events[len(events)-4]) |
|
181 |
+ createEvent := strings.Fields(events[len(events)-5]) |
|
182 |
+ attachEvent := strings.Fields(events[len(events)-4]) |
|
182 | 183 |
startEvent := strings.Fields(events[len(events)-3]) |
183 | 184 |
dieEvent := strings.Fields(events[len(events)-2]) |
184 | 185 |
destroyEvent := strings.Fields(events[len(events)-1]) |
185 | 186 |
if createEvent[len(createEvent)-1] != "create" { |
186 | 187 |
c.Fatalf("event should be create, not %#v", createEvent) |
187 | 188 |
} |
189 |
+ if attachEvent[len(attachEvent)-1] != "attach" { |
|
190 |
+ c.Fatalf("event should be attach, not %#v", attachEvent) |
|
191 |
+ } |
|
188 | 192 |
if startEvent[len(startEvent)-1] != "start" { |
189 | 193 |
c.Fatalf("event should be start, not %#v", startEvent) |
190 | 194 |
} |
... | ... |
@@ -433,7 +442,7 @@ func (s *DockerSuite) TestEventsFilterContainer(c *check.C) { |
433 | 433 |
until := fmt.Sprintf("%d", daemonTime(c).Unix()) |
434 | 434 |
|
435 | 435 |
checkEvents := func(id string, events []string) error { |
436 |
- if len(events) != 3 { // create, start, die |
|
436 |
+ if len(events) != 4 { // create, attach, start, die |
|
437 | 437 |
return fmt.Errorf("expected 3 events, got %v", events) |
438 | 438 |
} |
439 | 439 |
for _, event := range events { |
... | ... |
@@ -563,3 +572,208 @@ func (s *DockerSuite) TestEventsStreaming(c *check.C) { |
563 | 563 |
// ignore, done |
564 | 564 |
} |
565 | 565 |
} |
566 |
+ |
|
567 |
+func (s *DockerSuite) TestEventsCommit(c *check.C) { |
|
568 |
+ since := daemonTime(c).Unix() |
|
569 |
+ |
|
570 |
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top") |
|
571 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
572 |
+ if err != nil { |
|
573 |
+ c.Fatalf("Couldn't run top: %s\n%q", out, err) |
|
574 |
+ } |
|
575 |
+ cID := strings.TrimSpace(out) |
|
576 |
+ c.Assert(waitRun(cID), check.IsNil) |
|
577 |
+ |
|
578 |
+ cmd := exec.Command(dockerBinary, "commit", "-m", "test", cID) |
|
579 |
+ out, _, err = runCommandWithOutput(cmd) |
|
580 |
+ if err != nil { |
|
581 |
+ c.Fatalf("Couldn't commit: %s\n%q", out, err) |
|
582 |
+ } |
|
583 |
+ |
|
584 |
+ cmd = exec.Command(dockerBinary, "stop", cID) |
|
585 |
+ out, _, err = runCommandWithOutput(cmd) |
|
586 |
+ if err != nil { |
|
587 |
+ c.Fatalf("Couldn't stop: %s\n%q", out, err) |
|
588 |
+ } |
|
589 |
+ |
|
590 |
+ cmd = exec.Command(dockerBinary, "events", "-f", "container="+cID, "--until="+strconv.Itoa(int(since))) |
|
591 |
+ out, _, err = runCommandWithOutput(cmd) |
|
592 |
+ if err != nil { |
|
593 |
+ c.Fatalf("Couldn't get events: %s\n%q", out, err) |
|
594 |
+ } |
|
595 |
+ |
|
596 |
+ if !strings.Contains(out, " commit\n") { |
|
597 |
+ c.Fatalf("Missing 'commit' log event\n%s", out) |
|
598 |
+ } |
|
599 |
+} |
|
600 |
+ |
|
601 |
+func (s *DockerSuite) TestEventsCopy(c *check.C) { |
|
602 |
+ since := daemonTime(c).Unix() |
|
603 |
+ |
|
604 |
+ id, err := buildImage("cpimg", ` |
|
605 |
+ FROM busybox |
|
606 |
+ RUN echo HI > /tmp/file`, true) |
|
607 |
+ if err != nil { |
|
608 |
+ c.Fatalf("Couldn't create image: %q", err) |
|
609 |
+ } |
|
610 |
+ |
|
611 |
+ runCmd := exec.Command(dockerBinary, "run", "--name=cptest", id, "true") |
|
612 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
613 |
+ if err != nil { |
|
614 |
+ c.Fatalf("Couldn't run top: %s\n%q", out, err) |
|
615 |
+ } |
|
616 |
+ |
|
617 |
+ cmd := exec.Command(dockerBinary, "cp", "cptest:/tmp/file", "-") |
|
618 |
+ out, _, err = runCommandWithOutput(cmd) |
|
619 |
+ if err != nil { |
|
620 |
+ c.Fatalf("Failed getting file:%q\n%q", out, err) |
|
621 |
+ } |
|
622 |
+ |
|
623 |
+ cmd = exec.Command(dockerBinary, "events", "-f", "container=cptest", "--until="+strconv.Itoa(int(since))) |
|
624 |
+ out, _, err = runCommandWithOutput(cmd) |
|
625 |
+ if err != nil { |
|
626 |
+ c.Fatalf("Couldn't get events: %s\n%q", out, err) |
|
627 |
+ } |
|
628 |
+ |
|
629 |
+ if !strings.Contains(out, " copy\n") { |
|
630 |
+ c.Fatalf("Missing 'copy' log event\n%s", out) |
|
631 |
+ } |
|
632 |
+} |
|
633 |
+ |
|
634 |
+func (s *DockerSuite) TestEventsResize(c *check.C) { |
|
635 |
+ since := daemonTime(c).Unix() |
|
636 |
+ |
|
637 |
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top") |
|
638 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
639 |
+ if err != nil { |
|
640 |
+ c.Fatalf("Couldn't run top: %s\n%q", out, err) |
|
641 |
+ } |
|
642 |
+ cID := strings.TrimSpace(out) |
|
643 |
+ c.Assert(waitRun(cID), check.IsNil) |
|
644 |
+ |
|
645 |
+ endpoint := "/containers/" + cID + "/resize?h=80&w=24" |
|
646 |
+ status, _, err := sockRequest("POST", endpoint, nil) |
|
647 |
+ c.Assert(status, check.Equals, http.StatusOK) |
|
648 |
+ c.Assert(err, check.IsNil) |
|
649 |
+ |
|
650 |
+ cmd := exec.Command(dockerBinary, "stop", cID) |
|
651 |
+ out, _, err = runCommandWithOutput(cmd) |
|
652 |
+ if err != nil { |
|
653 |
+ c.Fatalf("Couldn't stop: %s\n%q", out, err) |
|
654 |
+ } |
|
655 |
+ |
|
656 |
+ cmd = exec.Command(dockerBinary, "events", "-f", "container="+cID, "--until="+strconv.Itoa(int(since))) |
|
657 |
+ out, _, err = runCommandWithOutput(cmd) |
|
658 |
+ if err != nil { |
|
659 |
+ c.Fatalf("Couldn't get events: %s\n%q", out, err) |
|
660 |
+ } |
|
661 |
+ |
|
662 |
+ if !strings.Contains(out, " resize\n") { |
|
663 |
+ c.Fatalf("Missing 'resize' log event\n%s", out) |
|
664 |
+ } |
|
665 |
+} |
|
666 |
+ |
|
667 |
+func (s *DockerSuite) TestEventsAttach(c *check.C) { |
|
668 |
+ since := daemonTime(c).Unix() |
|
669 |
+ |
|
670 |
+ out, _ := dockerCmd(c, "run", "-di", "busybox", "/bin/cat") |
|
671 |
+ cID := strings.TrimSpace(out) |
|
672 |
+ |
|
673 |
+ cmd := exec.Command(dockerBinary, "attach", cID) |
|
674 |
+ stdin, err := cmd.StdinPipe() |
|
675 |
+ c.Assert(err, check.IsNil) |
|
676 |
+ defer stdin.Close() |
|
677 |
+ stdout, err := cmd.StdoutPipe() |
|
678 |
+ c.Assert(err, check.IsNil) |
|
679 |
+ defer stdout.Close() |
|
680 |
+ c.Assert(cmd.Start(), check.IsNil) |
|
681 |
+ defer cmd.Process.Kill() |
|
682 |
+ |
|
683 |
+ // Make sure we're done attaching by writing/reading some stuff |
|
684 |
+ if _, err := stdin.Write([]byte("hello\n")); err != nil { |
|
685 |
+ c.Fatal(err) |
|
686 |
+ } |
|
687 |
+ out, err = bufio.NewReader(stdout).ReadString('\n') |
|
688 |
+ c.Assert(err, check.IsNil) |
|
689 |
+ if strings.TrimSpace(out) != "hello" { |
|
690 |
+ c.Fatalf("expected 'hello', got %q", out) |
|
691 |
+ } |
|
692 |
+ |
|
693 |
+ c.Assert(stdin.Close(), check.IsNil) |
|
694 |
+ |
|
695 |
+ cmd = exec.Command(dockerBinary, "stop", cID) |
|
696 |
+ out, _, err = runCommandWithOutput(cmd) |
|
697 |
+ if err != nil { |
|
698 |
+ c.Fatalf("Couldn't stop: %s\n%q", out, err) |
|
699 |
+ } |
|
700 |
+ |
|
701 |
+ cmd = exec.Command(dockerBinary, "events", "-f", "container="+cID, "--until="+strconv.Itoa(int(since))) |
|
702 |
+ out, _, err = runCommandWithOutput(cmd) |
|
703 |
+ if err != nil { |
|
704 |
+ c.Fatalf("Couldn't get events: %s\n%q", out, err) |
|
705 |
+ } |
|
706 |
+ |
|
707 |
+ if !strings.Contains(out, " attach\n") { |
|
708 |
+ c.Fatalf("Missing 'attach' log event\n%s", out) |
|
709 |
+ } |
|
710 |
+} |
|
711 |
+ |
|
712 |
+func (s *DockerSuite) TestEventsRename(c *check.C) { |
|
713 |
+ since := daemonTime(c).Unix() |
|
714 |
+ |
|
715 |
+ runCmd := exec.Command(dockerBinary, "run", "--name", "oldName", "busybox", "true") |
|
716 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
717 |
+ if err != nil { |
|
718 |
+ c.Fatalf("Couldn't run true: %s\n%q", out, err) |
|
719 |
+ } |
|
720 |
+ |
|
721 |
+ renameCmd := exec.Command(dockerBinary, "rename", "oldName", "newName") |
|
722 |
+ out, _, err = runCommandWithOutput(renameCmd) |
|
723 |
+ if err != nil { |
|
724 |
+ c.Fatalf("Couldn't rename: %s\n%q", out, err) |
|
725 |
+ } |
|
726 |
+ |
|
727 |
+ cmd := exec.Command(dockerBinary, "events", "-f", "container=newName", "--until="+strconv.Itoa(int(since))) |
|
728 |
+ out, _, err = runCommandWithOutput(cmd) |
|
729 |
+ if err != nil { |
|
730 |
+ c.Fatalf("Couldn't get events: %s\n%q", out, err) |
|
731 |
+ } |
|
732 |
+ |
|
733 |
+ if !strings.Contains(out, " rename\n") { |
|
734 |
+ c.Fatalf("Missing 'rename' log event\n%s", out) |
|
735 |
+ } |
|
736 |
+} |
|
737 |
+ |
|
738 |
+func (s *DockerSuite) TestEventsTop(c *check.C) { |
|
739 |
+ since := daemonTime(c).Unix() |
|
740 |
+ |
|
741 |
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top") |
|
742 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
743 |
+ if err != nil { |
|
744 |
+ c.Fatalf("Couldn't run true: %s\n%q", out, err) |
|
745 |
+ } |
|
746 |
+ cID := strings.TrimSpace(out) |
|
747 |
+ c.Assert(waitRun(cID), check.IsNil) |
|
748 |
+ |
|
749 |
+ cmd := exec.Command(dockerBinary, "top", cID) |
|
750 |
+ out, _, err = runCommandWithOutput(cmd) |
|
751 |
+ if err != nil { |
|
752 |
+ c.Fatalf("Couldn't run docker top: %s\n%q", out, err) |
|
753 |
+ } |
|
754 |
+ |
|
755 |
+ cmd = exec.Command(dockerBinary, "stop", cID) |
|
756 |
+ out, _, err = runCommandWithOutput(cmd) |
|
757 |
+ if err != nil { |
|
758 |
+ c.Fatalf("Couldn't stop: %s\n%q", out, err) |
|
759 |
+ } |
|
760 |
+ |
|
761 |
+ cmd = exec.Command(dockerBinary, "events", "-f", "container="+cID, "--until="+strconv.Itoa(int(since))) |
|
762 |
+ out, _, err = runCommandWithOutput(cmd) |
|
763 |
+ if err != nil { |
|
764 |
+ c.Fatalf("Couldn't get events: %s\n%q", out, err) |
|
765 |
+ } |
|
766 |
+ |
|
767 |
+ if !strings.Contains(out, " top\n") { |
|
768 |
+ c.Fatalf("Missing 'top' log event\n%s", out) |
|
769 |
+ } |
|
770 |
+} |