github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/integration/container/restart_test.go (about)

     1  package container // import "github.com/docker/docker/integration/container"
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/docker/docker/api/types"
    10  	"github.com/docker/docker/api/types/container"
    11  	"github.com/docker/docker/testutil/daemon"
    12  	"gotest.tools/v3/assert"
    13  	"gotest.tools/v3/skip"
    14  )
    15  
    16  func TestDaemonRestartKillContainers(t *testing.T) {
    17  	skip.If(t, testEnv.IsRemoteDaemon, "cannot start daemon on remote test run")
    18  	skip.If(t, testEnv.DaemonInfo.OSType == "windows")
    19  	skip.If(t, testEnv.IsRootless, "rootless mode doesn't support live-restore")
    20  	type testCase struct {
    21  		desc       string
    22  		config     *container.Config
    23  		hostConfig *container.HostConfig
    24  
    25  		xRunning            bool
    26  		xRunningLiveRestore bool
    27  		xStart              bool
    28  	}
    29  
    30  	for _, tc := range []testCase{
    31  		{
    32  			desc:                "container without restart policy",
    33  			config:              &container.Config{Image: "busybox", Cmd: []string{"top"}},
    34  			xRunningLiveRestore: true,
    35  			xStart:              true,
    36  		},
    37  		{
    38  			desc:                "container with restart=always",
    39  			config:              &container.Config{Image: "busybox", Cmd: []string{"top"}},
    40  			hostConfig:          &container.HostConfig{RestartPolicy: container.RestartPolicy{Name: "always"}},
    41  			xRunning:            true,
    42  			xRunningLiveRestore: true,
    43  			xStart:              true,
    44  		},
    45  		{
    46  			desc:       "container created should not be restarted",
    47  			config:     &container.Config{Image: "busybox", Cmd: []string{"top"}},
    48  			hostConfig: &container.HostConfig{RestartPolicy: container.RestartPolicy{Name: "always"}},
    49  		},
    50  	} {
    51  		for _, liveRestoreEnabled := range []bool{false, true} {
    52  			for fnName, stopDaemon := range map[string]func(*testing.T, *daemon.Daemon){
    53  				"kill-daemon": func(t *testing.T, d *daemon.Daemon) {
    54  					err := d.Kill()
    55  					assert.NilError(t, err)
    56  				},
    57  				"stop-daemon": func(t *testing.T, d *daemon.Daemon) {
    58  					d.Stop(t)
    59  				},
    60  			} {
    61  				t.Run(fmt.Sprintf("live-restore=%v/%s/%s", liveRestoreEnabled, tc.desc, fnName), func(t *testing.T) {
    62  					c := tc
    63  					liveRestoreEnabled := liveRestoreEnabled
    64  					stopDaemon := stopDaemon
    65  
    66  					t.Parallel()
    67  
    68  					d := daemon.New(t)
    69  					client := d.NewClientT(t)
    70  
    71  					args := []string{"--iptables=false"}
    72  					if liveRestoreEnabled {
    73  						args = append(args, "--live-restore")
    74  					}
    75  
    76  					d.StartWithBusybox(t, args...)
    77  					defer d.Stop(t)
    78  					ctx := context.Background()
    79  
    80  					resp, err := client.ContainerCreate(ctx, c.config, c.hostConfig, nil, nil, "")
    81  					assert.NilError(t, err)
    82  					defer client.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{Force: true})
    83  
    84  					if c.xStart {
    85  						err = client.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})
    86  						assert.NilError(t, err)
    87  					}
    88  
    89  					stopDaemon(t, d)
    90  					d.Start(t, args...)
    91  
    92  					expected := c.xRunning
    93  					if liveRestoreEnabled {
    94  						expected = c.xRunningLiveRestore
    95  					}
    96  
    97  					var running bool
    98  					for i := 0; i < 30; i++ {
    99  						inspect, err := client.ContainerInspect(ctx, resp.ID)
   100  						assert.NilError(t, err)
   101  
   102  						running = inspect.State.Running
   103  						if running == expected {
   104  							break
   105  						}
   106  						time.Sleep(2 * time.Second)
   107  
   108  					}
   109  					assert.Equal(t, expected, running, "got unexpected running state, expected %v, got: %v", expected, running)
   110  					// TODO(cpuguy83): test pause states... this seems to be rather undefined currently
   111  				})
   112  			}
   113  		}
   114  	}
   115  }