From 75d3214934b397692a2765ef6fd8ce086044831b Mon Sep 17 00:00:00 2001
From: Antonio Murdaca <runcom@redhat.com>
Date: Mon, 23 Apr 2018 11:17:53 +0200
Subject: [PATCH] restartmanager: do not apply restart policy on created
 containers

Signed-off-by: Antonio Murdaca <runcom@redhat.com>
---
 daemon/daemon.go                      |  4 ++--
 integration/container/restart_test.go | 14 ++++++++++++--
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/daemon/daemon.go b/daemon/daemon.go
index 9812c0be6c..e4c72be2cc 100644
--- a/daemon/daemon.go
+++ b/daemon/daemon.go
@@ -320,7 +320,7 @@ func (daemon *Daemon) restore() error {
 			// not initialized yet. We will start
 			// it after the cluster is
 			// initialized.
-			if daemon.configStore.AutoRestart && c.ShouldRestart() && !c.NetworkSettings.HasSwarmEndpoint {
+			if daemon.configStore.AutoRestart && c.ShouldRestart() && !c.NetworkSettings.HasSwarmEndpoint && c.HasBeenStartedBefore {
 				mapLock.Lock()
 				restartContainers[c] = make(chan struct{})
 				mapLock.Unlock()
@@ -450,7 +450,7 @@ func (daemon *Daemon) RestartSwarmContainers() {
 			// Autostart all the containers which has a
 			// swarm endpoint now that the cluster is
 			// initialized.
-			if daemon.configStore.AutoRestart && c.ShouldRestart() && c.NetworkSettings.HasSwarmEndpoint {
+			if daemon.configStore.AutoRestart && c.ShouldRestart() && c.NetworkSettings.HasSwarmEndpoint && c.HasBeenStartedBefore {
 				group.Add(1)
 				go func(c *container.Container) {
 					defer group.Done()
diff --git a/integration/container/restart_test.go b/integration/container/restart_test.go
index 630c50f42b..7cae183086 100644
--- a/integration/container/restart_test.go
+++ b/integration/container/restart_test.go
@@ -22,6 +22,7 @@ func TestDaemonRestartKillContainers(t *testing.T) {
 
 		xRunning            bool
 		xRunningLiveRestore bool
+		xStart              bool
 	}
 
 	for _, c := range []testCase{
@@ -29,6 +30,7 @@ func TestDaemonRestartKillContainers(t *testing.T) {
 			desc:                "container without restart policy",
 			config:              &container.Config{Image: "busybox", Cmd: []string{"top"}},
 			xRunningLiveRestore: true,
+			xStart:              true,
 		},
 		{
 			desc:                "container with restart=always",
@@ -36,6 +38,12 @@ func TestDaemonRestartKillContainers(t *testing.T) {
 			hostConfig:          &container.HostConfig{RestartPolicy: container.RestartPolicy{Name: "always"}},
 			xRunning:            true,
 			xRunningLiveRestore: true,
+			xStart:              true,
+		},
+		{
+			desc:       "container created should not be restarted",
+			config:     &container.Config{Image: "busybox", Cmd: []string{"top"}},
+			hostConfig: &container.HostConfig{RestartPolicy: container.RestartPolicy{Name: "always"}},
 		},
 	} {
 		for _, liveRestoreEnabled := range []bool{false, true} {
@@ -72,8 +80,10 @@ func TestDaemonRestartKillContainers(t *testing.T) {
 					assert.NilError(t, err)
 					defer client.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{Force: true})
 
-					err = client.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
-					assert.NilError(t, err)
+					if c.xStart {
+						err = client.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
+						assert.NilError(t, err)
+					}
 
 					stopDaemon(t, d)
 					d.Start(t, args...)