Add test TestRestartPolicyWithLiveRestore
@@ -27,7 +27,7 @@ import (
"github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/pkg/testutil"
icmd "github.com/docker/docker/pkg/testutil/cmd"
- "github.com/docker/go-units"
+ units "github.com/docker/go-units"
"github.com/docker/libnetwork/iptables"
"github.com/docker/libtrust"
"github.com/go-check/check"
@@ -2892,5 +2892,62 @@ func (s *DockerDaemonSuite) TestRemoveContainerAfterLiveRestore(c *check.C) {
out, err = s.d.Cmd("rm", "top")
c.Assert(err, check.IsNil, check.Commentf("Output: %s", out))
+}
+
+// #29598
+func (s *DockerDaemonSuite) TestRestartPolicyWithLiveRestore(c *check.C) {
+ testRequires(c, DaemonIsLinux, SameHostDaemon)
+ s.d.StartWithBusybox(c, "--live-restore")
+ out, err := s.d.Cmd("run", "-d", "--restart", "always", "busybox", "top")
+ c.Assert(err, check.IsNil, check.Commentf("output: %s", out))
+ id := strings.TrimSpace(out)
+
+ type state struct {
+ Running bool
+ StartedAt time.Time
+ }
+ out, err = s.d.Cmd("inspect", "-f", "{{json .State}}", id)
+ c.Assert(err, checker.IsNil, check.Commentf("output: %s", out))
+
+ var origState state
+ err = json.Unmarshal([]byte(strings.TrimSpace(out)), &origState)
+ c.Assert(err, checker.IsNil)
+
+ s.d.Restart(c, "--live-restore")
+
+ pid, err := s.d.Cmd("inspect", "-f", "{{.State.Pid}}", id)
+ c.Assert(err, check.IsNil)
+ pidint, err := strconv.Atoi(strings.TrimSpace(pid))
+ c.Assert(err, check.IsNil)
+ c.Assert(pidint, checker.GreaterThan, 0)
+ c.Assert(syscall.Kill(pidint, syscall.SIGKILL), check.IsNil)
+
+ ticker := time.NewTicker(50 * time.Millisecond)
+ timeout := time.After(10 * time.Second)
+
+ for range ticker.C {
+ select {
+ case <-timeout:
+ c.Fatal("timeout waiting for container restart")
+ default:
+ }
+
+ out, err := s.d.Cmd("inspect", "-f", "{{json .State}}", id)
+ c.Assert(err, checker.IsNil, check.Commentf("output: %s", out))
+
+ var newState state
+ err = json.Unmarshal([]byte(strings.TrimSpace(out)), &newState)
+ c.Assert(err, checker.IsNil)
+
+ if !newState.Running {
+ continue
+ }
+ if newState.StartedAt.After(origState.StartedAt) {
+ break
+ }
+ }
+
+ out, err = s.d.Cmd("stop", id)
+ c.Assert(err, check.IsNil, check.Commentf("output: %s", out))
}
