Merge pull request #267 from thaJeztah/19.03_backport_test_fixes
[19.03 backport] test-fixes and improvements
This commit is contained in:
commit
a33a82b42f
4 changed files with 51 additions and 40 deletions
|
@ -91,6 +91,8 @@ func (cli *DaemonCli) start(opts *daemonOptions) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logrus.Info("Starting up")
|
||||||
|
|
||||||
cli.configFile = &opts.configFile
|
cli.configFile = &opts.configFile
|
||||||
cli.flags = opts.flags
|
cli.flags = opts.flags
|
||||||
|
|
||||||
|
@ -266,6 +268,7 @@ func (cli *DaemonCli) start(opts *daemonOptions) (err error) {
|
||||||
return errors.Wrap(errAPI, "shutting down due to ServeAPI error")
|
return errors.Wrap(errAPI, "shutting down due to ServeAPI error")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logrus.Info("Daemon shutdown complete")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"github.com/docker/docker/pkg/homedir"
|
"github.com/docker/docker/pkg/homedir"
|
||||||
"github.com/docker/libnetwork/portallocator"
|
"github.com/docker/libnetwork/portallocator"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -152,6 +153,7 @@ func (cli *DaemonCli) initContainerD(ctx context.Context) (func(time.Duration) e
|
||||||
return nil, errors.Wrap(err, "could not determine whether the system containerd is running")
|
return nil, errors.Wrap(err, "could not determine whether the system containerd is running")
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
|
logrus.Debug("Containerd not running, starting daemon managed containerd")
|
||||||
opts, err := cli.getContainerdDaemonOpts()
|
opts, err := cli.getContainerdDaemonOpts()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to generate containerd options")
|
return nil, errors.Wrap(err, "failed to generate containerd options")
|
||||||
|
@ -161,6 +163,7 @@ func (cli *DaemonCli) initContainerD(ctx context.Context) (func(time.Duration) e
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to start containerd")
|
return nil, errors.Wrap(err, "failed to start containerd")
|
||||||
}
|
}
|
||||||
|
logrus.Debug("Started daemon managed containerd")
|
||||||
cli.Config.ContainerdAddr = r.Address()
|
cli.Config.ContainerdAddr = r.Address()
|
||||||
|
|
||||||
// Try to wait for containerd to shutdown
|
// Try to wait for containerd to shutdown
|
||||||
|
|
|
@ -439,15 +439,11 @@ func (s *DockerSuite) TestPsListContainersFilterLabel(c *check.C) {
|
||||||
func (s *DockerSuite) TestPsListContainersFilterExited(c *check.C) {
|
func (s *DockerSuite) TestPsListContainersFilterExited(c *check.C) {
|
||||||
runSleepingContainer(c, "--name=sleep")
|
runSleepingContainer(c, "--name=sleep")
|
||||||
|
|
||||||
dockerCmd(c, "run", "--name", "zero1", "busybox", "true")
|
firstZero, _ := dockerCmd(c, "run", "-d", "busybox", "true")
|
||||||
firstZero := getIDByName(c, "zero1")
|
secondZero, _ := dockerCmd(c, "run", "-d", "busybox", "true")
|
||||||
|
|
||||||
dockerCmd(c, "run", "--name", "zero2", "busybox", "true")
|
|
||||||
secondZero := getIDByName(c, "zero2")
|
|
||||||
|
|
||||||
out, _, err := dockerCmdWithError("run", "--name", "nonzero1", "busybox", "false")
|
out, _, err := dockerCmdWithError("run", "--name", "nonzero1", "busybox", "false")
|
||||||
c.Assert(err, checker.NotNil, check.Commentf("Should fail.", out, err))
|
c.Assert(err, checker.NotNil, check.Commentf("Should fail.", out, err))
|
||||||
|
|
||||||
firstNonZero := getIDByName(c, "nonzero1")
|
firstNonZero := getIDByName(c, "nonzero1")
|
||||||
|
|
||||||
out, _, err = dockerCmdWithError("run", "--name", "nonzero2", "busybox", "false")
|
out, _, err = dockerCmdWithError("run", "--name", "nonzero2", "busybox", "false")
|
||||||
|
@ -456,17 +452,16 @@ func (s *DockerSuite) TestPsListContainersFilterExited(c *check.C) {
|
||||||
|
|
||||||
// filter containers by exited=0
|
// filter containers by exited=0
|
||||||
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=exited=0")
|
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=exited=0")
|
||||||
ids := strings.Split(strings.TrimSpace(out), "\n")
|
c.Assert(out, checker.Contains, strings.TrimSpace(firstZero))
|
||||||
c.Assert(ids, checker.HasLen, 2, check.Commentf("Should be 2 zero exited containers got %d: %s", len(ids), out))
|
c.Assert(out, checker.Contains, strings.TrimSpace(secondZero))
|
||||||
c.Assert(ids[0], checker.Equals, secondZero, check.Commentf("First in list should be %q, got %q", secondZero, ids[0]))
|
c.Assert(out, checker.Not(checker.Contains), strings.TrimSpace(firstNonZero))
|
||||||
c.Assert(ids[1], checker.Equals, firstZero, check.Commentf("Second in list should be %q, got %q", firstZero, ids[1]))
|
c.Assert(out, checker.Not(checker.Contains), strings.TrimSpace(secondNonZero))
|
||||||
|
|
||||||
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=exited=1")
|
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=exited=1")
|
||||||
ids = strings.Split(strings.TrimSpace(out), "\n")
|
c.Assert(out, checker.Contains, strings.TrimSpace(firstNonZero))
|
||||||
c.Assert(ids, checker.HasLen, 2, check.Commentf("Should be 2 zero exited containers got %d", len(ids)))
|
c.Assert(out, checker.Contains, strings.TrimSpace(secondNonZero))
|
||||||
c.Assert(ids[0], checker.Equals, secondNonZero, check.Commentf("First in list should be %q, got %q", secondNonZero, ids[0]))
|
c.Assert(out, checker.Not(checker.Contains), strings.TrimSpace(firstZero))
|
||||||
c.Assert(ids[1], checker.Equals, firstNonZero, check.Commentf("Second in list should be %q, got %q", firstNonZero, ids[1]))
|
c.Assert(out, checker.Not(checker.Contains), strings.TrimSpace(secondZero))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DockerSuite) TestPsRightTagName(c *check.C) {
|
func (s *DockerSuite) TestPsRightTagName(c *check.C) {
|
||||||
|
|
|
@ -281,41 +281,44 @@ func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error {
|
||||||
|
|
||||||
d.Wait = wait
|
d.Wait = wait
|
||||||
|
|
||||||
|
clientConfig, err := d.getClientConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
client := &http.Client{
|
||||||
|
Transport: clientConfig.transport,
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequest("GET", "/_ping", nil)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "[%s] could not create new request", d.id)
|
||||||
|
}
|
||||||
|
req.URL.Host = clientConfig.addr
|
||||||
|
req.URL.Scheme = clientConfig.scheme
|
||||||
|
|
||||||
ticker := time.NewTicker(500 * time.Millisecond)
|
ticker := time.NewTicker(500 * time.Millisecond)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
tick := ticker.C
|
tick := ticker.C
|
||||||
|
|
||||||
|
timeout := time.NewTimer(60 * time.Second) // timeout for the whole loop
|
||||||
|
defer timeout.Stop()
|
||||||
|
|
||||||
// make sure daemon is ready to receive requests
|
// make sure daemon is ready to receive requests
|
||||||
startTime := time.Now().Unix()
|
|
||||||
for {
|
for {
|
||||||
d.log.Logf("[%s] waiting for daemon to start", d.id)
|
d.log.Logf("[%s] waiting for daemon to start", d.id)
|
||||||
if time.Now().Unix()-startTime > 5 {
|
|
||||||
// After 5 seconds, give up
|
|
||||||
return errors.Errorf("[%s] Daemon exited and never started", d.id)
|
|
||||||
}
|
|
||||||
select {
|
select {
|
||||||
case <-time.After(2 * time.Second):
|
case <-timeout.C:
|
||||||
return errors.Errorf("[%s] timeout: daemon does not respond", d.id)
|
return errors.Errorf("[%s] Daemon exited and never started", d.id)
|
||||||
case <-tick:
|
case <-tick:
|
||||||
clientConfig, err := d.getClientConfig()
|
ctx, cancel := context.WithTimeout(context.TODO(), 2*time.Second)
|
||||||
if err != nil {
|
resp, err := client.Do(req.WithContext(ctx))
|
||||||
return err
|
cancel()
|
||||||
}
|
|
||||||
|
|
||||||
client := &http.Client{
|
|
||||||
Transport: clientConfig.transport,
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", "/_ping", nil)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrapf(err, "[%s] could not create new request", d.id)
|
|
||||||
}
|
|
||||||
req.URL.Host = clientConfig.addr
|
|
||||||
req.URL.Scheme = clientConfig.scheme
|
|
||||||
resp, err := client.Do(req)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
d.log.Logf("[%s] error pinging daemon on start: %v", d.id, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
resp.Body.Close()
|
resp.Body.Close()
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
d.log.Logf("[%s] received status != 200 OK: %s\n", d.id, resp.Status)
|
d.log.Logf("[%s] received status != 200 OK: %s\n", d.id, resp.Status)
|
||||||
|
@ -411,12 +414,16 @@ func (d *Daemon) Stop(t testingT) {
|
||||||
// If it timeouts, a SIGKILL is sent.
|
// If it timeouts, a SIGKILL is sent.
|
||||||
// Stop will not delete the daemon directory. If a purged daemon is needed,
|
// Stop will not delete the daemon directory. If a purged daemon is needed,
|
||||||
// instantiate a new one with NewDaemon.
|
// instantiate a new one with NewDaemon.
|
||||||
func (d *Daemon) StopWithError() error {
|
func (d *Daemon) StopWithError() (err error) {
|
||||||
if d.cmd == nil || d.Wait == nil {
|
if d.cmd == nil || d.Wait == nil {
|
||||||
return errDaemonNotStarted
|
return errDaemonNotStarted
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
if err == nil {
|
||||||
|
d.log.Logf("[%s] Daemon stopped", d.id)
|
||||||
|
} else {
|
||||||
|
d.log.Logf("[%s] Error when stopping daemon: %v", d.id, err)
|
||||||
|
}
|
||||||
d.logFile.Close()
|
d.logFile.Close()
|
||||||
d.cmd = nil
|
d.cmd = nil
|
||||||
}()
|
}()
|
||||||
|
@ -426,12 +433,15 @@ func (d *Daemon) StopWithError() error {
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
tick := ticker.C
|
tick := ticker.C
|
||||||
|
|
||||||
|
d.log.Logf("[%s] Stopping daemon", d.id)
|
||||||
|
|
||||||
if err := d.cmd.Process.Signal(os.Interrupt); err != nil {
|
if err := d.cmd.Process.Signal(os.Interrupt); err != nil {
|
||||||
if strings.Contains(err.Error(), "os: process already finished") {
|
if strings.Contains(err.Error(), "os: process already finished") {
|
||||||
return errDaemonNotStarted
|
return errDaemonNotStarted
|
||||||
}
|
}
|
||||||
return errors.Errorf("could not send signal: %v", err)
|
return errors.Errorf("could not send signal: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
out1:
|
out1:
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
|
Loading…
Reference in a new issue