Most of the code is now on pkg/integration.
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
| ... | ... |
@@ -19,6 +19,7 @@ import ( |
| 19 | 19 |
|
| 20 | 20 |
"github.com/docker/docker/builder/dockerfile/command" |
| 21 | 21 |
"github.com/docker/docker/pkg/archive" |
| 22 |
+ "github.com/docker/docker/pkg/integration" |
|
| 22 | 23 |
"github.com/docker/docker/pkg/integration/checker" |
| 23 | 24 |
icmd "github.com/docker/docker/pkg/integration/cmd" |
| 24 | 25 |
"github.com/docker/docker/pkg/stringutils" |
| ... | ... |
@@ -2085,7 +2086,7 @@ func (s *DockerSuite) TestBuildContextCleanup(c *check.C) {
|
| 2085 | 2085 |
if err != nil {
|
| 2086 | 2086 |
c.Fatalf("failed to list contents of tmp dir: %s", err)
|
| 2087 | 2087 |
} |
| 2088 |
- if err = compareDirectoryEntries(entries, entriesFinal); err != nil {
|
|
| 2088 |
+ if err = integration.CompareDirectoryEntries(entries, entriesFinal); err != nil {
|
|
| 2089 | 2089 |
c.Fatalf("context should have been deleted, but wasn't")
|
| 2090 | 2090 |
} |
| 2091 | 2091 |
|
| ... | ... |
@@ -2110,7 +2111,7 @@ func (s *DockerSuite) TestBuildContextCleanupFailedBuild(c *check.C) {
|
| 2110 | 2110 |
if err != nil {
|
| 2111 | 2111 |
c.Fatalf("failed to list contents of tmp dir: %s", err)
|
| 2112 | 2112 |
} |
| 2113 |
- if err = compareDirectoryEntries(entries, entriesFinal); err != nil {
|
|
| 2113 |
+ if err = integration.CompareDirectoryEntries(entries, entriesFinal); err != nil {
|
|
| 2114 | 2114 |
c.Fatalf("context should have been deleted, but wasn't")
|
| 2115 | 2115 |
} |
| 2116 | 2116 |
|
| ... | ... |
@@ -5341,7 +5342,7 @@ func (s *DockerSuite) TestBuildContainerWithCgroupParent(c *check.C) {
|
| 5341 | 5341 |
if err != nil {
|
| 5342 | 5342 |
c.Fatalf("failed to read '/proc/self/cgroup - %v", err)
|
| 5343 | 5343 |
} |
| 5344 |
- selfCgroupPaths := parseCgroupPaths(string(data)) |
|
| 5344 |
+ selfCgroupPaths := integration.ParseCgroupPaths(string(data)) |
|
| 5345 | 5345 |
_, found := selfCgroupPaths["memory"] |
| 5346 | 5346 |
if !found {
|
| 5347 | 5347 |
c.Fatalf("unable to find self memory cgroup path. CgroupsPath: %v", selfCgroupPaths)
|
| ... | ... |
@@ -6242,11 +6243,10 @@ func (s *DockerSuite) TestBuildMultipleTags(c *check.C) {
|
| 6242 | 6242 |
FROM busybox |
| 6243 | 6243 |
MAINTAINER test-15780 |
| 6244 | 6244 |
` |
| 6245 |
- cmd := exec.Command(dockerBinary, "build", "-t", "tag1", "-t", "tag2:v2", |
|
| 6246 |
- "-t", "tag1:latest", "-t", "tag1", "--no-cache", "-") |
|
| 6247 |
- cmd.Stdin = strings.NewReader(dockerfile) |
|
| 6248 |
- _, err := runCommand(cmd) |
|
| 6249 |
- c.Assert(err, check.IsNil) |
|
| 6245 |
+ icmd.RunCmd(icmd.Cmd{
|
|
| 6246 |
+ Command: []string{dockerBinary, "build", "-t", "tag1", "-t", "tag2:v2", "-t", "tag1:latest", "-t", "tag1", "--no-cache", "-"},
|
|
| 6247 |
+ Stdin: strings.NewReader(dockerfile), |
|
| 6248 |
+ }).Assert(c, icmd.Success) |
|
| 6250 | 6249 |
|
| 6251 | 6250 |
id1, err := getIDByName("tag1")
|
| 6252 | 6251 |
c.Assert(err, check.IsNil) |
| ... | ... |
@@ -10,6 +10,7 @@ import ( |
| 10 | 10 |
"path/filepath" |
| 11 | 11 |
"strings" |
| 12 | 12 |
|
| 13 |
+ "github.com/docker/docker/pkg/integration" |
|
| 13 | 14 |
"github.com/docker/docker/pkg/integration/checker" |
| 14 | 15 |
icmd "github.com/docker/docker/pkg/integration/cmd" |
| 15 | 16 |
"github.com/go-check/check" |
| ... | ... |
@@ -545,7 +546,7 @@ func (s *DockerSuite) TestCpToStdout(c *check.C) {
|
| 545 | 545 |
// failed to set up container |
| 546 | 546 |
c.Assert(strings.TrimSpace(out), checker.Equals, "0") |
| 547 | 547 |
|
| 548 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 548 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 549 | 549 |
exec.Command(dockerBinary, "cp", containerID+":/test", "-"), |
| 550 | 550 |
exec.Command("tar", "-vtf", "-"))
|
| 551 | 551 |
|
| ... | ... |
@@ -12,6 +12,7 @@ import ( |
| 12 | 12 |
|
| 13 | 13 |
"io/ioutil" |
| 14 | 14 |
|
| 15 |
+ "github.com/docker/docker/pkg/integration" |
|
| 15 | 16 |
"github.com/docker/docker/pkg/integration/checker" |
| 16 | 17 |
"github.com/docker/docker/pkg/stringid" |
| 17 | 18 |
"github.com/docker/go-connections/nat" |
| ... | ... |
@@ -355,7 +356,7 @@ func (s *DockerTrustSuite) TestCreateWhenCertExpired(c *check.C) {
|
| 355 | 355 |
// Certificates have 10 years of expiration |
| 356 | 356 |
elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) |
| 357 | 357 |
|
| 358 |
- runAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 358 |
+ integration.RunAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 359 | 359 |
// Try create |
| 360 | 360 |
createCmd := exec.Command(dockerBinary, "create", repoName) |
| 361 | 361 |
s.trustedCmd(createCmd) |
| ... | ... |
@@ -364,7 +365,7 @@ func (s *DockerTrustSuite) TestCreateWhenCertExpired(c *check.C) {
|
| 364 | 364 |
c.Assert(string(out), checker.Contains, "could not validate the path to a trusted root", check.Commentf("Missing expected output on trusted create in the distant future:\n%s", out))
|
| 365 | 365 |
}) |
| 366 | 366 |
|
| 367 |
- runAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 367 |
+ integration.RunAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 368 | 368 |
// Try create |
| 369 | 369 |
createCmd := exec.Command(dockerBinary, "create", "--disable-content-trust", repoName) |
| 370 | 370 |
s.trustedCmd(createCmd) |
| ... | ... |
@@ -21,6 +21,7 @@ import ( |
| 21 | 21 |
"time" |
| 22 | 22 |
|
| 23 | 23 |
"github.com/docker/docker/integration-cli/daemon" |
| 24 |
+ "github.com/docker/docker/pkg/integration" |
|
| 24 | 25 |
"github.com/docker/docker/pkg/integration/checker" |
| 25 | 26 |
icmd "github.com/docker/docker/pkg/integration/cmd" |
| 26 | 27 |
"github.com/docker/docker/pkg/mount" |
| ... | ... |
@@ -235,11 +236,7 @@ func (s *DockerDaemonSuite) TestDaemonStartBridgeWithoutIPAssociation(c *check.C |
| 235 | 235 |
s.d.Stop(c) |
| 236 | 236 |
|
| 237 | 237 |
// now we will remove the ip from docker0 and then try starting the daemon |
| 238 |
- ipCmd := exec.Command("ip", "addr", "flush", "dev", "docker0")
|
|
| 239 |
- stdout, stderr, _, err := runCommandWithStdoutStderr(ipCmd) |
|
| 240 |
- if err != nil {
|
|
| 241 |
- c.Fatalf("failed to remove docker0 IP association: %v, stdout: %q, stderr: %q", err, stdout, stderr)
|
|
| 242 |
- } |
|
| 238 |
+ icmd.RunCommand("ip", "addr", "flush", "dev", "docker0").Assert(c, icmd.Success)
|
|
| 243 | 239 |
|
| 244 | 240 |
if err := s.d.StartWithError(); err != nil {
|
| 245 | 241 |
warning := "**WARNING: Docker bridge network in bad state--delete docker0 bridge interface to fix" |
| ... | ... |
@@ -668,24 +665,16 @@ func (s *DockerDaemonSuite) TestDaemonBridgeIP(c *check.C) {
|
| 668 | 668 |
defer d.Restart(c) |
| 669 | 669 |
|
| 670 | 670 |
ifconfigSearchString := ip.String() |
| 671 |
- ifconfigCmd := exec.Command("ifconfig", defaultNetworkBridge)
|
|
| 672 |
- out, _, _, err := runCommandWithStdoutStderr(ifconfigCmd) |
|
| 673 |
- c.Assert(err, check.IsNil) |
|
| 674 |
- |
|
| 675 |
- c.Assert(strings.Contains(out, ifconfigSearchString), check.Equals, true, |
|
| 676 |
- check.Commentf("ifconfig output should have contained %q, but was %q",
|
|
| 677 |
- ifconfigSearchString, out)) |
|
| 671 |
+ icmd.RunCommand("ifconfig", defaultNetworkBridge).Assert(c, icmd.Expected{
|
|
| 672 |
+ Out: ifconfigSearchString, |
|
| 673 |
+ }) |
|
| 678 | 674 |
|
| 679 | 675 |
ipTablesSearchString := bridgeIPNet.String() |
| 680 |
- ipTablesCmd := exec.Command("iptables", "-t", "nat", "-nvL")
|
|
| 681 |
- out, _, err = runCommandWithOutput(ipTablesCmd) |
|
| 682 |
- c.Assert(err, check.IsNil) |
|
| 683 |
- |
|
| 684 |
- c.Assert(strings.Contains(out, ipTablesSearchString), check.Equals, true, |
|
| 685 |
- check.Commentf("iptables output should have contained %q, but was %q",
|
|
| 686 |
- ipTablesSearchString, out)) |
|
| 676 |
+ icmd.RunCommand("iptables", "-t", "nat", "-nvL").Assert(c, icmd.Expected{
|
|
| 677 |
+ Out: ipTablesSearchString, |
|
| 678 |
+ }) |
|
| 687 | 679 |
|
| 688 |
- out, err = d.Cmd("run", "-d", "--name", "test", "busybox", "top")
|
|
| 680 |
+ _, err := d.Cmd("run", "-d", "--name", "test", "busybox", "top")
|
|
| 689 | 681 |
c.Assert(err, check.IsNil) |
| 690 | 682 |
|
| 691 | 683 |
containerIP, err := d.FindContainerIP("test")
|
| ... | ... |
@@ -706,24 +695,15 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithBridgeIPChange(c *check.C) {
|
| 706 | 706 |
bridgeIP := "192.169.100.1/24" |
| 707 | 707 |
_, bridgeIPNet, _ := net.ParseCIDR(bridgeIP) |
| 708 | 708 |
|
| 709 |
- ipCmd := exec.Command("ifconfig", "docker0", bridgeIP)
|
|
| 710 |
- stdout, stderr, _, err := runCommandWithStdoutStderr(ipCmd) |
|
| 711 |
- if err != nil {
|
|
| 712 |
- c.Fatalf("failed to change docker0's IP association: %v, stdout: %q, stderr: %q", err, stdout, stderr)
|
|
| 713 |
- } |
|
| 709 |
+ icmd.RunCommand("ifconfig", "docker0", bridgeIP).Assert(c, icmd.Success)
|
|
| 714 | 710 |
|
| 715 | 711 |
s.d.Start(c, "--bip", bridgeIP) |
| 716 | 712 |
|
| 717 | 713 |
//check if the iptables contains new bridgeIP MASQUERADE rule |
| 718 | 714 |
ipTablesSearchString := bridgeIPNet.String() |
| 719 |
- ipTablesCmd := exec.Command("iptables", "-t", "nat", "-nvL")
|
|
| 720 |
- out, _, err := runCommandWithOutput(ipTablesCmd) |
|
| 721 |
- if err != nil {
|
|
| 722 |
- c.Fatalf("Could not run iptables -nvL: %s, %v", out, err)
|
|
| 723 |
- } |
|
| 724 |
- if !strings.Contains(out, ipTablesSearchString) {
|
|
| 725 |
- c.Fatalf("iptables output should have contained new MASQUERADE rule with IP %q, but was %q", ipTablesSearchString, out)
|
|
| 726 |
- } |
|
| 715 |
+ icmd.RunCommand("iptables", "-t", "nat", "-nvL").Assert(c, icmd.Expected{
|
|
| 716 |
+ Out: ipTablesSearchString, |
|
| 717 |
+ }) |
|
| 727 | 718 |
} |
| 728 | 719 |
|
| 729 | 720 |
func (s *DockerDaemonSuite) TestDaemonBridgeFixedCidr(c *check.C) {
|
| ... | ... |
@@ -1908,7 +1888,7 @@ func (s *DockerDaemonSuite) TestDaemonCgroupParent(c *check.C) {
|
| 1908 | 1908 |
|
| 1909 | 1909 |
out, err := s.d.Cmd("run", "--name", name, "busybox", "cat", "/proc/self/cgroup")
|
| 1910 | 1910 |
c.Assert(err, checker.IsNil) |
| 1911 |
- cgroupPaths := parseCgroupPaths(string(out)) |
|
| 1911 |
+ cgroupPaths := integration.ParseCgroupPaths(string(out)) |
|
| 1912 | 1912 |
c.Assert(len(cgroupPaths), checker.Not(checker.Equals), 0, check.Commentf("unexpected output - %q", string(out)))
|
| 1913 | 1913 |
out, err = s.d.Cmd("inspect", "-f", "{{.Id}}", name)
|
| 1914 | 1914 |
c.Assert(err, checker.IsNil) |
| ... | ... |
@@ -14,6 +14,7 @@ import ( |
| 14 | 14 |
|
| 15 | 15 |
eventtypes "github.com/docker/docker/api/types/events" |
| 16 | 16 |
eventstestutils "github.com/docker/docker/daemon/events/testutils" |
| 17 |
+ "github.com/docker/docker/pkg/integration" |
|
| 17 | 18 |
"github.com/docker/docker/pkg/integration/checker" |
| 18 | 19 |
icmd "github.com/docker/docker/pkg/integration/cmd" |
| 19 | 20 |
"github.com/go-check/check" |
| ... | ... |
@@ -221,7 +222,7 @@ func (s *DockerSuite) TestEventsImageImport(c *check.C) {
|
| 221 | 221 |
cleanedContainerID := strings.TrimSpace(out) |
| 222 | 222 |
|
| 223 | 223 |
since := daemonUnixTime(c) |
| 224 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 224 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 225 | 225 |
exec.Command(dockerBinary, "export", cleanedContainerID), |
| 226 | 226 |
exec.Command(dockerBinary, "import", "-"), |
| 227 | 227 |
) |
| ... | ... |
@@ -206,6 +206,7 @@ func (s *DockerSuite) TestExecTTYWithoutStdin(c *check.C) {
|
| 206 | 206 |
} |
| 207 | 207 |
} |
| 208 | 208 |
|
| 209 |
+// FIXME(vdemeester) this should be a unit tests on cli/command/container package |
|
| 209 | 210 |
func (s *DockerSuite) TestExecParseError(c *check.C) {
|
| 210 | 211 |
// TODO Windows CI: Requires some extra work. Consider copying the |
| 211 | 212 |
// runSleepingContainer helper to have an exec version. |
| ... | ... |
@@ -213,10 +214,11 @@ func (s *DockerSuite) TestExecParseError(c *check.C) {
|
| 213 | 213 |
dockerCmd(c, "run", "-d", "--name", "top", "busybox", "top") |
| 214 | 214 |
|
| 215 | 215 |
// Test normal (non-detached) case first |
| 216 |
- cmd := exec.Command(dockerBinary, "exec", "top") |
|
| 217 |
- _, stderr, _, err := runCommandWithStdoutStderr(cmd) |
|
| 218 |
- c.Assert(err, checker.NotNil) |
|
| 219 |
- c.Assert(stderr, checker.Contains, "See 'docker exec --help'") |
|
| 216 |
+ icmd.RunCommand(dockerBinary, "exec", "top").Assert(c, icmd.Expected{
|
|
| 217 |
+ ExitCode: 1, |
|
| 218 |
+ Error: "exit status 1", |
|
| 219 |
+ Err: "See 'docker exec --help'", |
|
| 220 |
+ }) |
|
| 220 | 221 |
} |
| 221 | 222 |
|
| 222 | 223 |
func (s *DockerSuite) TestExecStopNotHanging(c *check.C) {
|
| ... | ... |
@@ -147,56 +147,56 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
|
| 147 | 147 |
// various good and bad cases are what we expect |
| 148 | 148 |
|
| 149 | 149 |
// docker : stdout=all, stderr=empty, rc=0 |
| 150 |
- out, _, err := dockerCmdWithError() |
|
| 151 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 150 |
+ out, _ := dockerCmd(c) |
|
| 152 | 151 |
// Be really pick |
| 153 | 152 |
c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker'\n"))
|
| 154 | 153 |
|
| 155 | 154 |
// docker help: stdout=all, stderr=empty, rc=0 |
| 156 |
- out, _, err = dockerCmdWithError("help")
|
|
| 157 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 155 |
+ out, _ = dockerCmd(c, "help") |
|
| 158 | 156 |
// Be really pick |
| 159 | 157 |
c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker help'\n"))
|
| 160 | 158 |
|
| 161 | 159 |
// docker --help: stdout=all, stderr=empty, rc=0 |
| 162 |
- out, _, err = dockerCmdWithError("--help")
|
|
| 163 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 160 |
+ out, _ = dockerCmd(c, "--help") |
|
| 164 | 161 |
// Be really pick |
| 165 | 162 |
c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker --help'\n"))
|
| 166 | 163 |
|
| 167 | 164 |
// docker inspect busybox: stdout=all, stderr=empty, rc=0 |
| 168 | 165 |
// Just making sure stderr is empty on valid cmd |
| 169 |
- out, _, err = dockerCmdWithError("inspect", "busybox")
|
|
| 170 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 166 |
+ out, _ = dockerCmd(c, "inspect", "busybox") |
|
| 171 | 167 |
// Be really pick |
| 172 | 168 |
c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker inspect busyBox'\n"))
|
| 173 | 169 |
|
| 174 | 170 |
// docker rm: stdout=empty, stderr=all, rc!=0 |
| 175 | 171 |
// testing the min arg error msg |
| 176 |
- cmd := exec.Command(dockerBinary, "rm") |
|
| 177 |
- stdout, stderr, _, err := runCommandWithStdoutStderr(cmd) |
|
| 178 |
- c.Assert(err, checker.NotNil) |
|
| 179 |
- c.Assert(stdout, checker.Equals, "") |
|
| 180 |
- // Should not contain full help text but should contain info about |
|
| 181 |
- // # of args and Usage line |
|
| 182 |
- c.Assert(stderr, checker.Contains, "requires at least 1 argument", check.Commentf("Missing # of args text from 'docker rm'\n"))
|
|
| 172 |
+ icmd.RunCommand(dockerBinary, "rm").Assert(c, icmd.Expected{
|
|
| 173 |
+ ExitCode: 1, |
|
| 174 |
+ Error: "exit status 1", |
|
| 175 |
+ Out: "", |
|
| 176 |
+ // Should not contain full help text but should contain info about |
|
| 177 |
+ // # of args and Usage line |
|
| 178 |
+ Err: "requires at least 1 argument", |
|
| 179 |
+ }) |
|
| 183 | 180 |
|
| 184 | 181 |
// docker rm NoSuchContainer: stdout=empty, stderr=all, rc=0 |
| 185 | 182 |
// testing to make sure no blank line on error |
| 186 |
- cmd = exec.Command(dockerBinary, "rm", "NoSuchContainer") |
|
| 187 |
- stdout, stderr, _, err = runCommandWithStdoutStderr(cmd) |
|
| 188 |
- c.Assert(err, checker.NotNil) |
|
| 189 |
- c.Assert(len(stderr), checker.Not(checker.Equals), 0) |
|
| 190 |
- c.Assert(stdout, checker.Equals, "") |
|
| 183 |
+ result := icmd.RunCommand(dockerBinary, "rm", "NoSuchContainer") |
|
| 184 |
+ result.Assert(c, icmd.Expected{
|
|
| 185 |
+ ExitCode: 1, |
|
| 186 |
+ Error: "exit status 1", |
|
| 187 |
+ Out: "", |
|
| 188 |
+ }) |
|
| 191 | 189 |
// Be really picky |
| 192 |
- c.Assert(stderr, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker rm'\n"))
|
|
| 190 |
+ c.Assert(len(result.Stderr()), checker.Not(checker.Equals), 0) |
|
| 191 |
+ c.Assert(result.Stderr(), checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker rm'\n"))
|
|
| 193 | 192 |
|
| 194 | 193 |
// docker BadCmd: stdout=empty, stderr=all, rc=0 |
| 195 |
- cmd = exec.Command(dockerBinary, "BadCmd") |
|
| 196 |
- stdout, stderr, _, err = runCommandWithStdoutStderr(cmd) |
|
| 197 |
- c.Assert(err, checker.NotNil) |
|
| 198 |
- c.Assert(stdout, checker.Equals, "") |
|
| 199 |
- c.Assert(stderr, checker.Equals, "docker: 'BadCmd' is not a docker command.\nSee 'docker --help'\n", check.Commentf("Unexcepted output for 'docker badCmd'\n"))
|
|
| 194 |
+ icmd.RunCommand(dockerBinary, "BadCmd").Assert(c, icmd.Expected{
|
|
| 195 |
+ ExitCode: 1, |
|
| 196 |
+ Error: "exit status 1", |
|
| 197 |
+ Out: "", |
|
| 198 |
+ Err: "docker: 'BadCmd' is not a docker command.\nSee 'docker --help'\n", |
|
| 199 |
+ }) |
|
| 200 | 200 |
} |
| 201 | 201 |
|
| 202 | 202 |
func testCommand(cmd string, newEnvs []string, scanForHome bool, home string) error {
|
| ... | ... |
@@ -204,9 +204,13 @@ func testCommand(cmd string, newEnvs []string, scanForHome bool, home string) er |
| 204 | 204 |
args := strings.Split(cmd+" --help", " ") |
| 205 | 205 |
|
| 206 | 206 |
// Check the full usage text |
| 207 |
- helpCmd := exec.Command(dockerBinary, args...) |
|
| 208 |
- helpCmd.Env = newEnvs |
|
| 209 |
- out, stderr, _, err := runCommandWithStdoutStderr(helpCmd) |
|
| 207 |
+ result := icmd.RunCmd(icmd.Cmd{
|
|
| 208 |
+ Command: append([]string{dockerBinary}, args...),
|
|
| 209 |
+ Env: newEnvs, |
|
| 210 |
+ }) |
|
| 211 |
+ err := result.Error |
|
| 212 |
+ out := result.Stdout() |
|
| 213 |
+ stderr := result.Stderr() |
|
| 210 | 214 |
if len(stderr) != 0 {
|
| 211 | 215 |
return fmt.Errorf("Error on %q help. non-empty stderr:%q\n", cmd, stderr)
|
| 212 | 216 |
} |
| ... | ... |
@@ -9,6 +9,7 @@ import ( |
| 9 | 9 |
"regexp" |
| 10 | 10 |
"strings" |
| 11 | 11 |
|
| 12 |
+ "github.com/docker/docker/pkg/integration" |
|
| 12 | 13 |
"github.com/docker/docker/pkg/integration/checker" |
| 13 | 14 |
icmd "github.com/docker/docker/pkg/integration/cmd" |
| 14 | 15 |
"github.com/go-check/check" |
| ... | ... |
@@ -19,7 +20,7 @@ func (s *DockerSuite) TestImportDisplay(c *check.C) {
|
| 19 | 19 |
out, _ := dockerCmd(c, "run", "-d", "busybox", "true") |
| 20 | 20 |
cleanedContainerID := strings.TrimSpace(out) |
| 21 | 21 |
|
| 22 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 22 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 23 | 23 |
exec.Command(dockerBinary, "export", cleanedContainerID), |
| 24 | 24 |
exec.Command(dockerBinary, "import", "-"), |
| 25 | 25 |
) |
| ... | ... |
@@ -51,11 +52,10 @@ func (s *DockerSuite) TestImportFile(c *check.C) {
|
| 51 | 51 |
c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file"))
|
| 52 | 52 |
defer os.Remove(temporaryFile.Name()) |
| 53 | 53 |
|
| 54 |
- runCmd := exec.Command(dockerBinary, "export", "test-import") |
|
| 55 |
- runCmd.Stdout = bufio.NewWriter(temporaryFile) |
|
| 56 |
- |
|
| 57 |
- _, err = runCommand(runCmd) |
|
| 58 |
- c.Assert(err, checker.IsNil, check.Commentf("failed to export a container"))
|
|
| 54 |
+ icmd.RunCmd(icmd.Cmd{
|
|
| 55 |
+ Command: []string{dockerBinary, "export", "test-import"},
|
|
| 56 |
+ Stdout: bufio.NewWriter(temporaryFile), |
|
| 57 |
+ }).Assert(c, icmd.Success) |
|
| 59 | 58 |
|
| 60 | 59 |
out, _ := dockerCmd(c, "import", temporaryFile.Name()) |
| 61 | 60 |
c.Assert(out, checker.Count, "\n", 1, check.Commentf("display is expected 1 '\\n' but didn't"))
|
| ... | ... |
@@ -73,14 +73,12 @@ func (s *DockerSuite) TestImportGzipped(c *check.C) {
|
| 73 | 73 |
c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file"))
|
| 74 | 74 |
defer os.Remove(temporaryFile.Name()) |
| 75 | 75 |
|
| 76 |
- runCmd := exec.Command(dockerBinary, "export", "test-import") |
|
| 77 | 76 |
w := gzip.NewWriter(temporaryFile) |
| 78 |
- runCmd.Stdout = w |
|
| 79 |
- |
|
| 80 |
- _, err = runCommand(runCmd) |
|
| 81 |
- c.Assert(err, checker.IsNil, check.Commentf("failed to export a container"))
|
|
| 82 |
- err = w.Close() |
|
| 83 |
- c.Assert(err, checker.IsNil, check.Commentf("failed to close gzip writer"))
|
|
| 77 |
+ icmd.RunCmd(icmd.Cmd{
|
|
| 78 |
+ Command: []string{dockerBinary, "export", "test-import"},
|
|
| 79 |
+ Stdout: w, |
|
| 80 |
+ }).Assert(c, icmd.Success) |
|
| 81 |
+ c.Assert(w.Close(), checker.IsNil, check.Commentf("failed to close gzip writer"))
|
|
| 84 | 82 |
temporaryFile.Close() |
| 85 | 83 |
out, _ := dockerCmd(c, "import", temporaryFile.Name()) |
| 86 | 84 |
c.Assert(out, checker.Count, "\n", 1, check.Commentf("display is expected 1 '\\n' but didn't"))
|
| ... | ... |
@@ -98,11 +96,10 @@ func (s *DockerSuite) TestImportFileWithMessage(c *check.C) {
|
| 98 | 98 |
c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file"))
|
| 99 | 99 |
defer os.Remove(temporaryFile.Name()) |
| 100 | 100 |
|
| 101 |
- runCmd := exec.Command(dockerBinary, "export", "test-import") |
|
| 102 |
- runCmd.Stdout = bufio.NewWriter(temporaryFile) |
|
| 103 |
- |
|
| 104 |
- _, err = runCommand(runCmd) |
|
| 105 |
- c.Assert(err, checker.IsNil, check.Commentf("failed to export a container"))
|
|
| 101 |
+ icmd.RunCmd(icmd.Cmd{
|
|
| 102 |
+ Command: []string{dockerBinary, "export", "test-import"},
|
|
| 103 |
+ Stdout: bufio.NewWriter(temporaryFile), |
|
| 104 |
+ }).Assert(c, icmd.Success) |
|
| 106 | 105 |
|
| 107 | 106 |
message := "Testing commit message" |
| 108 | 107 |
out, _ := dockerCmd(c, "import", "-m", message, temporaryFile.Name()) |
| ... | ... |
@@ -4,7 +4,6 @@ import ( |
| 4 | 4 |
"encoding/json" |
| 5 | 5 |
"fmt" |
| 6 | 6 |
"os" |
| 7 |
- "os/exec" |
|
| 8 | 7 |
"strconv" |
| 9 | 8 |
"strings" |
| 10 | 9 |
"time" |
| ... | ... |
@@ -12,6 +11,7 @@ import ( |
| 12 | 12 |
"github.com/docker/docker/api/types" |
| 13 | 13 |
"github.com/docker/docker/api/types/container" |
| 14 | 14 |
"github.com/docker/docker/pkg/integration/checker" |
| 15 |
+ icmd "github.com/docker/docker/pkg/integration/cmd" |
|
| 15 | 16 |
"github.com/go-check/check" |
| 16 | 17 |
) |
| 17 | 18 |
|
| ... | ... |
@@ -142,11 +142,12 @@ func (s *DockerSuite) TestInspectImageFilterInt(c *check.C) {
|
| 142 | 142 |
} |
| 143 | 143 |
|
| 144 | 144 |
func (s *DockerSuite) TestInspectContainerFilterInt(c *check.C) {
|
| 145 |
- runCmd := exec.Command(dockerBinary, "run", "-i", "-a", "stdin", "busybox", "cat") |
|
| 146 |
- runCmd.Stdin = strings.NewReader("blahblah")
|
|
| 147 |
- out, _, _, err := runCommandWithStdoutStderr(runCmd) |
|
| 148 |
- c.Assert(err, checker.IsNil, check.Commentf("failed to run container: %v, output: %q", err, out))
|
|
| 149 |
- |
|
| 145 |
+ result := icmd.RunCmd(icmd.Cmd{
|
|
| 146 |
+ Command: []string{dockerBinary, "run", "-i", "-a", "stdin", "busybox", "cat"},
|
|
| 147 |
+ Stdin: strings.NewReader("blahblah"),
|
|
| 148 |
+ }) |
|
| 149 |
+ result.Assert(c, icmd.Success) |
|
| 150 |
+ out := result.Stdout() |
|
| 150 | 151 |
id := strings.TrimSpace(out) |
| 151 | 152 |
|
| 152 | 153 |
out = inspectField(c, id, "State.ExitCode") |
| ... | ... |
@@ -157,9 +158,9 @@ func (s *DockerSuite) TestInspectContainerFilterInt(c *check.C) {
|
| 157 | 157 |
//now get the exit code to verify |
| 158 | 158 |
formatStr := fmt.Sprintf("--format={{eq .State.ExitCode %d}}", exitCode)
|
| 159 | 159 |
out, _ = dockerCmd(c, "inspect", formatStr, id) |
| 160 |
- result, err := strconv.ParseBool(strings.TrimSuffix(out, "\n")) |
|
| 160 |
+ inspectResult, err := strconv.ParseBool(strings.TrimSuffix(out, "\n")) |
|
| 161 | 161 |
c.Assert(err, checker.IsNil) |
| 162 |
- c.Assert(result, checker.Equals, true) |
|
| 162 |
+ c.Assert(inspectResult, checker.Equals, true) |
|
| 163 | 163 |
} |
| 164 | 164 |
|
| 165 | 165 |
func (s *DockerSuite) TestInspectImageGraphDriver(c *check.C) {
|
| ... | ... |
@@ -6,6 +6,7 @@ import ( |
| 6 | 6 |
"regexp" |
| 7 | 7 |
"strings" |
| 8 | 8 |
|
| 9 |
+ "github.com/docker/docker/pkg/integration" |
|
| 9 | 10 |
"github.com/docker/docker/pkg/integration/checker" |
| 10 | 11 |
"github.com/docker/docker/runconfig" |
| 11 | 12 |
"github.com/go-check/check" |
| ... | ... |
@@ -101,7 +102,7 @@ func (s *DockerSuite) TestLinksInspectLinksStarted(c *check.C) {
|
| 101 | 101 |
err := json.Unmarshal([]byte(links), &result) |
| 102 | 102 |
c.Assert(err, checker.IsNil) |
| 103 | 103 |
|
| 104 |
- output := convertSliceOfStringsToMap(result) |
|
| 104 |
+ output := integration.ConvertSliceOfStringsToMap(result) |
|
| 105 | 105 |
|
| 106 | 106 |
c.Assert(output, checker.DeepEquals, expected) |
| 107 | 107 |
} |
| ... | ... |
@@ -120,7 +121,7 @@ func (s *DockerSuite) TestLinksInspectLinksStopped(c *check.C) {
|
| 120 | 120 |
err := json.Unmarshal([]byte(links), &result) |
| 121 | 121 |
c.Assert(err, checker.IsNil) |
| 122 | 122 |
|
| 123 |
- output := convertSliceOfStringsToMap(result) |
|
| 123 |
+ output := integration.ConvertSliceOfStringsToMap(result) |
|
| 124 | 124 |
|
| 125 | 125 |
c.Assert(output, checker.DeepEquals, expected) |
| 126 | 126 |
} |
| ... | ... |
@@ -8,6 +8,7 @@ import ( |
| 8 | 8 |
"strings" |
| 9 | 9 |
"time" |
| 10 | 10 |
|
| 11 |
+ "github.com/docker/docker/pkg/integration" |
|
| 11 | 12 |
"github.com/docker/docker/pkg/integration/checker" |
| 12 | 13 |
"github.com/docker/docker/pkg/jsonlog" |
| 13 | 14 |
"github.com/go-check/check" |
| ... | ... |
@@ -253,11 +254,11 @@ func (s *DockerSuite) TestLogsFollowSlowStdoutConsumer(c *check.C) {
|
| 253 | 253 |
c.Assert(logCmd.Start(), checker.IsNil) |
| 254 | 254 |
|
| 255 | 255 |
// First read slowly |
| 256 |
- bytes1, err := consumeWithSpeed(stdout, 10, 50*time.Millisecond, stopSlowRead) |
|
| 256 |
+ bytes1, err := integration.ConsumeWithSpeed(stdout, 10, 50*time.Millisecond, stopSlowRead) |
|
| 257 | 257 |
c.Assert(err, checker.IsNil) |
| 258 | 258 |
|
| 259 | 259 |
// After the container has finished we can continue reading fast |
| 260 |
- bytes2, err := consumeWithSpeed(stdout, 32*1024, 0, nil) |
|
| 260 |
+ bytes2, err := integration.ConsumeWithSpeed(stdout, 32*1024, 0, nil) |
|
| 261 | 261 |
c.Assert(err, checker.IsNil) |
| 262 | 262 |
|
| 263 | 263 |
actual := bytes1 + bytes2 |
| ... | ... |
@@ -7,6 +7,7 @@ import ( |
| 7 | 7 |
"strings" |
| 8 | 8 |
"time" |
| 9 | 9 |
|
| 10 |
+ "github.com/docker/docker/pkg/integration" |
|
| 10 | 11 |
"github.com/docker/docker/pkg/integration/checker" |
| 11 | 12 |
"github.com/go-check/check" |
| 12 | 13 |
) |
| ... | ... |
@@ -69,7 +70,7 @@ func (s *DockerTrustSuite) TestPullWhenCertExpired(c *check.C) {
|
| 69 | 69 |
// Certificates have 10 years of expiration |
| 70 | 70 |
elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) |
| 71 | 71 |
|
| 72 |
- runAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 72 |
+ integration.RunAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 73 | 73 |
// Try pull |
| 74 | 74 |
pullCmd := exec.Command(dockerBinary, "pull", repoName) |
| 75 | 75 |
s.trustedCmd(pullCmd) |
| ... | ... |
@@ -79,7 +80,7 @@ func (s *DockerTrustSuite) TestPullWhenCertExpired(c *check.C) {
|
| 79 | 79 |
c.Assert(string(out), checker.Contains, "could not validate the path to a trusted root", check.Commentf(out)) |
| 80 | 80 |
}) |
| 81 | 81 |
|
| 82 |
- runAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 82 |
+ integration.RunAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 83 | 83 |
// Try pull |
| 84 | 84 |
pullCmd := exec.Command(dockerBinary, "pull", "--disable-content-trust", repoName) |
| 85 | 85 |
s.trustedCmd(pullCmd) |
| ... | ... |
@@ -166,7 +167,7 @@ func (s *DockerTrustSuite) TestTrustedPullWithExpiredSnapshot(c *check.C) {
|
| 166 | 166 |
// Snapshots last for three years. This should be expired |
| 167 | 167 |
fourYearsLater := time.Now().Add(time.Hour * 24 * 365 * 4) |
| 168 | 168 |
|
| 169 |
- runAtDifferentDate(fourYearsLater, func() {
|
|
| 169 |
+ integration.RunAtDifferentDate(fourYearsLater, func() {
|
|
| 170 | 170 |
// Try pull |
| 171 | 171 |
pullCmd := exec.Command(dockerBinary, "pull", repoName) |
| 172 | 172 |
s.trustedCmd(pullCmd) |
| ... | ... |
@@ -15,6 +15,7 @@ import ( |
| 15 | 15 |
|
| 16 | 16 |
"github.com/docker/distribution/reference" |
| 17 | 17 |
cliconfig "github.com/docker/docker/cli/config" |
| 18 |
+ "github.com/docker/docker/pkg/integration" |
|
| 18 | 19 |
"github.com/docker/docker/pkg/integration/checker" |
| 19 | 20 |
"github.com/go-check/check" |
| 20 | 21 |
) |
| ... | ... |
@@ -437,7 +438,7 @@ func (s *DockerTrustSuite) TestTrustedPushWithExpiredSnapshot(c *check.C) {
|
| 437 | 437 |
// Snapshots last for three years. This should be expired |
| 438 | 438 |
fourYearsLater := time.Now().Add(time.Hour * 24 * 365 * 4) |
| 439 | 439 |
|
| 440 |
- runAtDifferentDate(fourYearsLater, func() {
|
|
| 440 |
+ integration.RunAtDifferentDate(fourYearsLater, func() {
|
|
| 441 | 441 |
// Push with wrong passphrases |
| 442 | 442 |
pushCmd = exec.Command(dockerBinary, "push", repoName) |
| 443 | 443 |
s.trustedCmd(pushCmd) |
| ... | ... |
@@ -464,7 +465,7 @@ func (s *DockerTrustSuite) TestTrustedPushWithExpiredTimestamp(c *check.C) {
|
| 464 | 464 |
threeWeeksLater := time.Now().Add(time.Hour * 24 * 21) |
| 465 | 465 |
|
| 466 | 466 |
// Should succeed because the server transparently re-signs one |
| 467 |
- runAtDifferentDate(threeWeeksLater, func() {
|
|
| 467 |
+ integration.RunAtDifferentDate(threeWeeksLater, func() {
|
|
| 468 | 468 |
pushCmd := exec.Command(dockerBinary, "push", repoName) |
| 469 | 469 |
s.trustedCmd(pushCmd) |
| 470 | 470 |
out, _, err := runCommandWithOutput(pushCmd) |
| ... | ... |
@@ -21,6 +21,7 @@ import ( |
| 21 | 21 |
"sync" |
| 22 | 22 |
"time" |
| 23 | 23 |
|
| 24 |
+ "github.com/docker/docker/pkg/integration" |
|
| 24 | 25 |
"github.com/docker/docker/pkg/integration/checker" |
| 25 | 26 |
icmd "github.com/docker/docker/pkg/integration/cmd" |
| 26 | 27 |
"github.com/docker/docker/pkg/mount" |
| ... | ... |
@@ -92,12 +93,12 @@ func (s *DockerSuite) TestRunExitCodeOne(c *check.C) {
|
| 92 | 92 |
func (s *DockerSuite) TestRunStdinPipe(c *check.C) {
|
| 93 | 93 |
// TODO Windows: This needs some work to make compatible. |
| 94 | 94 |
testRequires(c, DaemonIsLinux) |
| 95 |
- runCmd := exec.Command(dockerBinary, "run", "-i", "-a", "stdin", "busybox", "cat") |
|
| 96 |
- runCmd.Stdin = strings.NewReader("blahblah")
|
|
| 97 |
- out, _, _, err := runCommandWithStdoutStderr(runCmd) |
|
| 98 |
- if err != nil {
|
|
| 99 |
- c.Fatalf("failed to run container: %v, output: %q", err, out)
|
|
| 100 |
- } |
|
| 95 |
+ result := icmd.RunCmd(icmd.Cmd{
|
|
| 96 |
+ Command: []string{dockerBinary, "run", "-i", "-a", "stdin", "busybox", "cat"},
|
|
| 97 |
+ Stdin: strings.NewReader("blahblah"),
|
|
| 98 |
+ }) |
|
| 99 |
+ result.Assert(c, icmd.Success) |
|
| 100 |
+ out := result.Stdout() |
|
| 101 | 101 |
|
| 102 | 102 |
out = strings.TrimSpace(out) |
| 103 | 103 |
dockerCmd(c, "wait", out) |
| ... | ... |
@@ -497,7 +498,7 @@ func (s *DockerSuite) TestRunVolumesFromInReadWriteMode(c *check.C) {
|
| 497 | 497 |
func (s *DockerSuite) TestVolumesFromGetsProperMode(c *check.C) {
|
| 498 | 498 |
testRequires(c, SameHostDaemon) |
| 499 | 499 |
prefix, slash := getPrefixAndSlashFromDaemonPlatform() |
| 500 |
- hostpath := randomTmpDirPath("test", daemonPlatform)
|
|
| 500 |
+ hostpath := integration.RandomTmpDirPath("test", daemonPlatform)
|
|
| 501 | 501 |
if err := os.MkdirAll(hostpath, 0755); err != nil {
|
| 502 | 502 |
c.Fatalf("Failed to create %s: %q", hostpath, err)
|
| 503 | 503 |
} |
| ... | ... |
@@ -520,8 +521,8 @@ func (s *DockerSuite) TestVolumesFromGetsProperMode(c *check.C) {
|
| 520 | 520 |
|
| 521 | 521 |
// Test for GH#10618 |
| 522 | 522 |
func (s *DockerSuite) TestRunNoDupVolumes(c *check.C) {
|
| 523 |
- path1 := randomTmpDirPath("test1", daemonPlatform)
|
|
| 524 |
- path2 := randomTmpDirPath("test2", daemonPlatform)
|
|
| 523 |
+ path1 := integration.RandomTmpDirPath("test1", daemonPlatform)
|
|
| 524 |
+ path2 := integration.RandomTmpDirPath("test2", daemonPlatform)
|
|
| 525 | 525 |
|
| 526 | 526 |
someplace := ":/someplace" |
| 527 | 527 |
if daemonPlatform == "windows" {
|
| ... | ... |
@@ -1453,10 +1454,7 @@ func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) {
|
| 1453 | 1453 |
c.Fatal(err) |
| 1454 | 1454 |
} |
| 1455 | 1455 |
if mounted {
|
| 1456 |
- cmd := exec.Command("umount", "/etc/resolv.conf")
|
|
| 1457 |
- if _, err = runCommand(cmd); err != nil {
|
|
| 1458 |
- c.Fatal(err) |
|
| 1459 |
- } |
|
| 1456 |
+ icmd.RunCommand("umount", "/etc/resolv.conf").Assert(c, icmd.Success)
|
|
| 1460 | 1457 |
} |
| 1461 | 1458 |
|
| 1462 | 1459 |
//cleanup |
| ... | ... |
@@ -1656,13 +1654,11 @@ func (s *DockerSuite) TestRunAttachStdOutAndErrTTYMode(c *check.C) {
|
| 1656 | 1656 |
// Test for #10388 - this will run the same test as TestRunAttachStdOutAndErrTTYMode |
| 1657 | 1657 |
// but using --attach instead of -a to make sure we read the flag correctly |
| 1658 | 1658 |
func (s *DockerSuite) TestRunAttachWithDetach(c *check.C) {
|
| 1659 |
- cmd := exec.Command(dockerBinary, "run", "-d", "--attach", "stdout", "busybox", "true") |
|
| 1660 |
- _, stderr, _, err := runCommandWithStdoutStderr(cmd) |
|
| 1661 |
- if err == nil {
|
|
| 1662 |
- c.Fatal("Container should have exited with error code different than 0")
|
|
| 1663 |
- } else if !strings.Contains(stderr, "Conflicting options: -a and -d") {
|
|
| 1664 |
- c.Fatal("Should have been returned an error with conflicting options -a and -d")
|
|
| 1665 |
- } |
|
| 1659 |
+ icmd.RunCommand(dockerBinary, "run", "-d", "--attach", "stdout", "busybox", "true").Assert(c, icmd.Expected{
|
|
| 1660 |
+ ExitCode: 1, |
|
| 1661 |
+ Error: "exit status 1", |
|
| 1662 |
+ Err: "Conflicting options: -a and -d", |
|
| 1663 |
+ }) |
|
| 1666 | 1664 |
} |
| 1667 | 1665 |
|
| 1668 | 1666 |
func (s *DockerSuite) TestRunState(c *check.C) {
|
| ... | ... |
@@ -2279,7 +2275,7 @@ func (s *DockerSuite) TestVolumesNoCopyData(c *check.C) {
|
| 2279 | 2279 |
c.Fatalf("Data was copied on volumes-from but shouldn't be:\n%q", out)
|
| 2280 | 2280 |
} |
| 2281 | 2281 |
|
| 2282 |
- tmpDir := randomTmpDirPath("docker_test_bind_mount_copy_data", daemonPlatform)
|
|
| 2282 |
+ tmpDir := integration.RandomTmpDirPath("docker_test_bind_mount_copy_data", daemonPlatform)
|
|
| 2283 | 2283 |
if out, _, err := dockerCmdWithError("run", "-v", tmpDir+":/foo", "dataimage", "ls", "-lh", "/foo/bar"); err == nil || !strings.Contains(out, "No such file or directory") {
|
| 2284 | 2284 |
c.Fatalf("Data was copied on bind-mount but shouldn't be:\n%q", out)
|
| 2285 | 2285 |
} |
| ... | ... |
@@ -2348,7 +2344,7 @@ func (s *DockerSuite) TestRunSlowStdoutConsumer(c *check.C) {
|
| 2348 | 2348 |
if err := cont.Start(); err != nil {
|
| 2349 | 2349 |
c.Fatal(err) |
| 2350 | 2350 |
} |
| 2351 |
- n, err := consumeWithSpeed(stdout, 10000, 5*time.Millisecond, nil) |
|
| 2351 |
+ n, err := integration.ConsumeWithSpeed(stdout, 10000, 5*time.Millisecond, nil) |
|
| 2352 | 2352 |
if err != nil {
|
| 2353 | 2353 |
c.Fatal(err) |
| 2354 | 2354 |
} |
| ... | ... |
@@ -3330,7 +3326,7 @@ func (s *DockerTrustSuite) TestRunWhenCertExpired(c *check.C) {
|
| 3330 | 3330 |
// Certificates have 10 years of expiration |
| 3331 | 3331 |
elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) |
| 3332 | 3332 |
|
| 3333 |
- runAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 3333 |
+ integration.RunAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 3334 | 3334 |
// Try run |
| 3335 | 3335 |
runCmd := exec.Command(dockerBinary, "run", repoName) |
| 3336 | 3336 |
s.trustedCmd(runCmd) |
| ... | ... |
@@ -3344,7 +3340,7 @@ func (s *DockerTrustSuite) TestRunWhenCertExpired(c *check.C) {
|
| 3344 | 3344 |
} |
| 3345 | 3345 |
}) |
| 3346 | 3346 |
|
| 3347 |
- runAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 3347 |
+ integration.RunAtDifferentDate(elevenYearsFromNow, func() {
|
|
| 3348 | 3348 |
// Try run |
| 3349 | 3349 |
runCmd := exec.Command(dockerBinary, "run", "--disable-content-trust", repoName) |
| 3350 | 3350 |
s.trustedCmd(runCmd) |
| ... | ... |
@@ -3536,7 +3532,7 @@ func (s *DockerSuite) TestRunContainerWithCgroupParent(c *check.C) {
|
| 3536 | 3536 |
if err != nil {
|
| 3537 | 3537 |
c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err)
|
| 3538 | 3538 |
} |
| 3539 |
- cgroupPaths := parseCgroupPaths(string(out)) |
|
| 3539 |
+ cgroupPaths := integration.ParseCgroupPaths(string(out)) |
|
| 3540 | 3540 |
if len(cgroupPaths) == 0 {
|
| 3541 | 3541 |
c.Fatalf("unexpected output - %q", string(out))
|
| 3542 | 3542 |
} |
| ... | ... |
@@ -3565,7 +3561,7 @@ func (s *DockerSuite) TestRunContainerWithCgroupParentAbsPath(c *check.C) {
|
| 3565 | 3565 |
if err != nil {
|
| 3566 | 3566 |
c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err)
|
| 3567 | 3567 |
} |
| 3568 |
- cgroupPaths := parseCgroupPaths(string(out)) |
|
| 3568 |
+ cgroupPaths := integration.ParseCgroupPaths(string(out)) |
|
| 3569 | 3569 |
if len(cgroupPaths) == 0 {
|
| 3570 | 3570 |
c.Fatalf("unexpected output - %q", string(out))
|
| 3571 | 3571 |
} |
| ... | ... |
@@ -3604,7 +3600,7 @@ func (s *DockerSuite) TestRunInvalidCgroupParent(c *check.C) {
|
| 3604 | 3604 |
c.Fatalf("SECURITY: --cgroup-parent with ../../ relative paths cause files to be created in the host (this is bad) !!")
|
| 3605 | 3605 |
} |
| 3606 | 3606 |
|
| 3607 |
- cgroupPaths := parseCgroupPaths(string(out)) |
|
| 3607 |
+ cgroupPaths := integration.ParseCgroupPaths(string(out)) |
|
| 3608 | 3608 |
if len(cgroupPaths) == 0 {
|
| 3609 | 3609 |
c.Fatalf("unexpected output - %q", string(out))
|
| 3610 | 3610 |
} |
| ... | ... |
@@ -3643,7 +3639,7 @@ func (s *DockerSuite) TestRunAbsoluteInvalidCgroupParent(c *check.C) {
|
| 3643 | 3643 |
c.Fatalf("SECURITY: --cgroup-parent with /../../ garbage paths cause files to be created in the host (this is bad) !!")
|
| 3644 | 3644 |
} |
| 3645 | 3645 |
|
| 3646 |
- cgroupPaths := parseCgroupPaths(string(out)) |
|
| 3646 |
+ cgroupPaths := integration.ParseCgroupPaths(string(out)) |
|
| 3647 | 3647 |
if len(cgroupPaths) == 0 {
|
| 3648 | 3648 |
c.Fatalf("unexpected output - %q", string(out))
|
| 3649 | 3649 |
} |
| ... | ... |
@@ -4151,15 +4147,8 @@ func (s *DockerSuite) TestRunVolumesMountedAsShared(c *check.C) {
|
| 4151 | 4151 |
|
| 4152 | 4152 |
// Convert this directory into a shared mount point so that we do |
| 4153 | 4153 |
// not rely on propagation properties of parent mount. |
| 4154 |
- cmd := exec.Command("mount", "--bind", tmpDir, tmpDir)
|
|
| 4155 |
- if _, err = runCommand(cmd); err != nil {
|
|
| 4156 |
- c.Fatal(err) |
|
| 4157 |
- } |
|
| 4158 |
- |
|
| 4159 |
- cmd = exec.Command("mount", "--make-private", "--make-shared", tmpDir)
|
|
| 4160 |
- if _, err = runCommand(cmd); err != nil {
|
|
| 4161 |
- c.Fatal(err) |
|
| 4162 |
- } |
|
| 4154 |
+ icmd.RunCommand("mount", "--bind", tmpDir, tmpDir).Assert(c, icmd.Success)
|
|
| 4155 |
+ icmd.RunCommand("mount", "--make-private", "--make-shared", tmpDir).Assert(c, icmd.Success)
|
|
| 4163 | 4156 |
|
| 4164 | 4157 |
dockerCmd(c, "run", "--privileged", "-v", fmt.Sprintf("%s:/volume-dest:shared", tmpDir), "busybox", "mount", "--bind", "/volume-dest/mnt1", "/volume-dest/mnt1")
|
| 4165 | 4158 |
|
| ... | ... |
@@ -4201,25 +4190,15 @@ func (s *DockerSuite) TestRunVolumesMountedAsSlave(c *check.C) {
|
| 4201 | 4201 |
|
| 4202 | 4202 |
// Convert this directory into a shared mount point so that we do |
| 4203 | 4203 |
// not rely on propagation properties of parent mount. |
| 4204 |
- cmd := exec.Command("mount", "--bind", tmpDir, tmpDir)
|
|
| 4205 |
- if _, err = runCommand(cmd); err != nil {
|
|
| 4206 |
- c.Fatal(err) |
|
| 4207 |
- } |
|
| 4208 |
- |
|
| 4209 |
- cmd = exec.Command("mount", "--make-private", "--make-shared", tmpDir)
|
|
| 4210 |
- if _, err = runCommand(cmd); err != nil {
|
|
| 4211 |
- c.Fatal(err) |
|
| 4212 |
- } |
|
| 4204 |
+ icmd.RunCommand("mount", "--bind", tmpDir, tmpDir).Assert(c, icmd.Success)
|
|
| 4205 |
+ icmd.RunCommand("mount", "--make-private", "--make-shared", tmpDir).Assert(c, icmd.Success)
|
|
| 4213 | 4206 |
|
| 4214 | 4207 |
dockerCmd(c, "run", "-i", "-d", "--name", "parent", "-v", fmt.Sprintf("%s:/volume-dest:slave", tmpDir), "busybox", "top")
|
| 4215 | 4208 |
|
| 4216 | 4209 |
// Bind mount tmpDir2/ onto tmpDir/mnt1. If mount propagates inside |
| 4217 | 4210 |
// container then contents of tmpDir2/slave-testfile should become |
| 4218 | 4211 |
// visible at "/volume-dest/mnt1/slave-testfile" |
| 4219 |
- cmd = exec.Command("mount", "--bind", tmpDir2, path.Join(tmpDir, "mnt1"))
|
|
| 4220 |
- if _, err = runCommand(cmd); err != nil {
|
|
| 4221 |
- c.Fatal(err) |
|
| 4222 |
- } |
|
| 4212 |
+ icmd.RunCommand("mount", "--bind", tmpDir2, path.Join(tmpDir, "mnt1")).Assert(c, icmd.Success)
|
|
| 4223 | 4213 |
|
| 4224 | 4214 |
out, _ := dockerCmd(c, "exec", "parent", "cat", "/volume-dest/mnt1/slave-testfile") |
| 4225 | 4215 |
|
| ... | ... |
@@ -4628,11 +4607,13 @@ func (s *DockerSuite) TestSlowStdinClosing(c *check.C) {
|
| 4628 | 4628 |
name := "testslowstdinclosing" |
| 4629 | 4629 |
repeat := 3 // regression happened 50% of the time |
| 4630 | 4630 |
for i := 0; i < repeat; i++ {
|
| 4631 |
- cmd := exec.Command(dockerBinary, "run", "--rm", "--name", name, "-i", "busybox", "cat") |
|
| 4632 |
- cmd.Stdin = &delayedReader{}
|
|
| 4631 |
+ cmd := icmd.Cmd{
|
|
| 4632 |
+ Command: []string{dockerBinary, "run", "--rm", "--name", name, "-i", "busybox", "cat"},
|
|
| 4633 |
+ Stdin: &delayedReader{},
|
|
| 4634 |
+ } |
|
| 4633 | 4635 |
done := make(chan error, 1) |
| 4634 | 4636 |
go func() {
|
| 4635 |
- _, err := runCommand(cmd) |
|
| 4637 |
+ err := icmd.RunCmd(cmd).Error |
|
| 4636 | 4638 |
done <- err |
| 4637 | 4639 |
}() |
| 4638 | 4640 |
|
| ... | ... |
@@ -71,9 +71,7 @@ func (s *DockerSuite) TestRunWithVolumesIsRecursive(c *check.C) {
|
| 71 | 71 |
c.Assert(err, checker.IsNil) |
| 72 | 72 |
defer f.Close() |
| 73 | 73 |
|
| 74 |
- runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "--volume", fmt.Sprintf("%s:/tmp:ro", tmpDir), "busybox:latest", "ls", "/tmp/tmpfs")
|
|
| 75 |
- out, _, _, err := runCommandWithStdoutStderr(runCmd) |
|
| 76 |
- c.Assert(err, checker.IsNil) |
|
| 74 |
+ out, _ := dockerCmd(c, "run", "--name", "test-data", "--volume", fmt.Sprintf("%s:/tmp:ro", tmpDir), "busybox:latest", "ls", "/tmp/tmpfs")
|
|
| 77 | 75 |
c.Assert(out, checker.Contains, filepath.Base(f.Name()), check.Commentf("Recursive bind mount test failed. Expected file not found"))
|
| 78 | 76 |
} |
| 79 | 77 |
|
| ... | ... |
@@ -14,6 +14,7 @@ import ( |
| 14 | 14 |
"time" |
| 15 | 15 |
|
| 16 | 16 |
"github.com/docker/distribution/digest" |
| 17 |
+ "github.com/docker/docker/pkg/integration" |
|
| 17 | 18 |
"github.com/docker/docker/pkg/integration/checker" |
| 18 | 19 |
"github.com/go-check/check" |
| 19 | 20 |
) |
| ... | ... |
@@ -29,7 +30,7 @@ func (s *DockerSuite) TestSaveXzAndLoadRepoStdout(c *check.C) {
|
| 29 | 29 |
|
| 30 | 30 |
dockerCmd(c, "inspect", repoName) |
| 31 | 31 |
|
| 32 |
- repoTarball, _, err := runCommandPipelineWithOutput( |
|
| 32 |
+ repoTarball, _, err := integration.RunCommandPipelineWithOutput( |
|
| 33 | 33 |
exec.Command(dockerBinary, "save", repoName), |
| 34 | 34 |
exec.Command("xz", "-c"),
|
| 35 | 35 |
exec.Command("gzip", "-c"))
|
| ... | ... |
@@ -56,7 +57,7 @@ func (s *DockerSuite) TestSaveXzGzAndLoadRepoStdout(c *check.C) {
|
| 56 | 56 |
|
| 57 | 57 |
dockerCmd(c, "inspect", repoName) |
| 58 | 58 |
|
| 59 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 59 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 60 | 60 |
exec.Command(dockerBinary, "save", repoName), |
| 61 | 61 |
exec.Command("xz", "-c"),
|
| 62 | 62 |
exec.Command("gzip", "-c"))
|
| ... | ... |
@@ -81,7 +82,7 @@ func (s *DockerSuite) TestSaveSingleTag(c *check.C) {
|
| 81 | 81 |
out, _ := dockerCmd(c, "images", "-q", "--no-trunc", repoName) |
| 82 | 82 |
cleanedImageID := strings.TrimSpace(out) |
| 83 | 83 |
|
| 84 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 84 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 85 | 85 |
exec.Command(dockerBinary, "save", fmt.Sprintf("%v:latest", repoName)),
|
| 86 | 86 |
exec.Command("tar", "t"),
|
| 87 | 87 |
exec.Command("grep", "-E", fmt.Sprintf("(^repositories$|%v)", cleanedImageID)))
|
| ... | ... |
@@ -100,7 +101,7 @@ func (s *DockerSuite) TestSaveCheckTimes(c *check.C) {
|
| 100 | 100 |
c.Assert(err, checker.IsNil, check.Commentf("failed to marshal from %q: err %v", repoName, err))
|
| 101 | 101 |
c.Assert(len(data), checker.Not(checker.Equals), 0, check.Commentf("failed to marshal the data from %q", repoName))
|
| 102 | 102 |
tarTvTimeFormat := "2006-01-02 15:04" |
| 103 |
- out, _, err = runCommandPipelineWithOutput( |
|
| 103 |
+ out, _, err = integration.RunCommandPipelineWithOutput( |
|
| 104 | 104 |
exec.Command(dockerBinary, "save", repoName), |
| 105 | 105 |
exec.Command("tar", "tv"),
|
| 106 | 106 |
exec.Command("grep", "-E", fmt.Sprintf("%s %s", data[0].Created.Format(tarTvTimeFormat), digest.Digest(data[0].ID).Hex())))
|
| ... | ... |
@@ -158,7 +159,7 @@ func (s *DockerSuite) TestSaveAndLoadRepoFlags(c *check.C) {
|
| 158 | 158 |
|
| 159 | 159 |
before, _ := dockerCmd(c, "inspect", repoName) |
| 160 | 160 |
|
| 161 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 161 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 162 | 162 |
exec.Command(dockerBinary, "save", repoName), |
| 163 | 163 |
exec.Command(dockerBinary, "load")) |
| 164 | 164 |
c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err))
|
| ... | ... |
@@ -187,7 +188,7 @@ func (s *DockerSuite) TestSaveMultipleNames(c *check.C) {
|
| 187 | 187 |
// Make two images |
| 188 | 188 |
dockerCmd(c, "tag", "emptyfs:latest", fmt.Sprintf("%v-two:latest", repoName))
|
| 189 | 189 |
|
| 190 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 190 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 191 | 191 |
exec.Command(dockerBinary, "save", fmt.Sprintf("%v-one", repoName), fmt.Sprintf("%v-two:latest", repoName)),
|
| 192 | 192 |
exec.Command("tar", "xO", "repositories"),
|
| 193 | 193 |
exec.Command("grep", "-q", "-E", "(-one|-two)"),
|
| ... | ... |
@@ -219,7 +220,7 @@ func (s *DockerSuite) TestSaveRepoWithMultipleImages(c *check.C) {
|
| 219 | 219 |
deleteImages(repoName) |
| 220 | 220 |
|
| 221 | 221 |
// create the archive |
| 222 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 222 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 223 | 223 |
exec.Command(dockerBinary, "save", repoName, "busybox:latest"), |
| 224 | 224 |
exec.Command("tar", "t"))
|
| 225 | 225 |
c.Assert(err, checker.IsNil, check.Commentf("failed to save multiple images: %s, %v", out, err))
|
| ... | ... |
@@ -266,7 +267,7 @@ func (s *DockerSuite) TestSaveDirectoryPermissions(c *check.C) {
|
| 266 | 266 |
true) |
| 267 | 267 |
c.Assert(err, checker.IsNil, check.Commentf("%v", err))
|
| 268 | 268 |
|
| 269 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 269 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 270 | 270 |
exec.Command(dockerBinary, "save", name), |
| 271 | 271 |
exec.Command("tar", "-xf", "-", "-C", extractionDirectory),
|
| 272 | 272 |
) |
| ... | ... |
@@ -285,7 +286,7 @@ func (s *DockerSuite) TestSaveDirectoryPermissions(c *check.C) {
|
| 285 | 285 |
c.Assert(err, checker.IsNil, check.Commentf("failed to open %s: %s", layerPath, err))
|
| 286 | 286 |
defer f.Close() |
| 287 | 287 |
|
| 288 |
- entries, err := listTar(f) |
|
| 288 |
+ entries, err := integration.ListTar(f) |
|
| 289 | 289 |
for _, e := range entries {
|
| 290 | 290 |
if !strings.Contains(e, "dev/") {
|
| 291 | 291 |
entriesSansDev = append(entriesSansDev, e) |
| ... | ... |
@@ -363,7 +364,7 @@ func (s *DockerSuite) TestSaveLoadNoTag(c *check.C) {
|
| 363 | 363 |
id := inspectField(c, name, "Id") |
| 364 | 364 |
|
| 365 | 365 |
// Test to make sure that save w/o name just shows imageID during load |
| 366 |
- out, _, err := runCommandPipelineWithOutput( |
|
| 366 |
+ out, _, err := integration.RunCommandPipelineWithOutput( |
|
| 367 | 367 |
exec.Command(dockerBinary, "save", id), |
| 368 | 368 |
exec.Command(dockerBinary, "load")) |
| 369 | 369 |
c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err))
|
| ... | ... |
@@ -374,7 +375,7 @@ func (s *DockerSuite) TestSaveLoadNoTag(c *check.C) {
|
| 374 | 374 |
c.Assert(out, checker.Contains, id) |
| 375 | 375 |
|
| 376 | 376 |
// Test to make sure that save by name shows that name during load |
| 377 |
- out, _, err = runCommandPipelineWithOutput( |
|
| 377 |
+ out, _, err = integration.RunCommandPipelineWithOutput( |
|
| 378 | 378 |
exec.Command(dockerBinary, "save", name), |
| 379 | 379 |
exec.Command(dockerBinary, "load")) |
| 380 | 380 |
c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err))
|
| ... | ... |
@@ -12,6 +12,7 @@ import ( |
| 12 | 12 |
"time" |
| 13 | 13 |
|
| 14 | 14 |
"github.com/docker/docker/pkg/integration/checker" |
| 15 |
+ icmd "github.com/docker/docker/pkg/integration/cmd" |
|
| 15 | 16 |
"github.com/go-check/check" |
| 16 | 17 |
"github.com/kr/pty" |
| 17 | 18 |
) |
| ... | ... |
@@ -29,11 +30,10 @@ func (s *DockerSuite) TestSaveAndLoadRepoStdout(c *check.C) {
|
| 29 | 29 |
c.Assert(err, check.IsNil) |
| 30 | 30 |
defer os.Remove(tmpFile.Name()) |
| 31 | 31 |
|
| 32 |
- saveCmd := exec.Command(dockerBinary, "save", repoName) |
|
| 33 |
- saveCmd.Stdout = tmpFile |
|
| 34 |
- |
|
| 35 |
- _, err = runCommand(saveCmd) |
|
| 36 |
- c.Assert(err, check.IsNil) |
|
| 32 |
+ icmd.RunCmd(icmd.Cmd{
|
|
| 33 |
+ Command: []string{dockerBinary, "save", repoName},
|
|
| 34 |
+ Stdout: tmpFile, |
|
| 35 |
+ }).Assert(c, icmd.Success) |
|
| 37 | 36 |
|
| 38 | 37 |
tmpFile, err = os.Open(tmpFile.Name()) |
| 39 | 38 |
c.Assert(err, check.IsNil) |
| ... | ... |
@@ -2,11 +2,11 @@ package main |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 | 4 |
"fmt" |
| 5 |
- "os/exec" |
|
| 6 | 5 |
"strings" |
| 7 | 6 |
"time" |
| 8 | 7 |
|
| 9 | 8 |
"github.com/docker/docker/pkg/integration/checker" |
| 9 |
+ icmd "github.com/docker/docker/pkg/integration/cmd" |
|
| 10 | 10 |
"github.com/go-check/check" |
| 11 | 11 |
) |
| 12 | 12 |
|
| ... | ... |
@@ -182,8 +182,13 @@ func (s *DockerSuite) TestStartAttachWithRename(c *check.C) {
|
| 182 | 182 |
dockerCmd(c, "rename", "before", "after") |
| 183 | 183 |
dockerCmd(c, "stop", "--time=2", "after") |
| 184 | 184 |
}() |
| 185 |
- _, stderr, _, _ := runCommandWithStdoutStderr(exec.Command(dockerBinary, "start", "-a", "before")) |
|
| 186 |
- c.Assert(stderr, checker.Not(checker.Contains), "No such container") |
|
| 185 |
+ // FIXME(vdemeester) the intent is not clear and potentially racey |
|
| 186 |
+ result := icmd.RunCommand(dockerBinary, "start", "-a", "before") |
|
| 187 |
+ result.Assert(c, icmd.Expected{
|
|
| 188 |
+ ExitCode: 137, |
|
| 189 |
+ Error: "exit status 137", |
|
| 190 |
+ }) |
|
| 191 |
+ c.Assert(result.Stderr(), checker.Not(checker.Contains), "No such container") |
|
| 187 | 192 |
} |
| 188 | 193 |
|
| 189 | 194 |
func (s *DockerSuite) TestStartReturnCorrectExitCode(c *check.C) {
|
| ... | ... |
@@ -12,6 +12,7 @@ import ( |
| 12 | 12 |
"strconv" |
| 13 | 13 |
"strings" |
| 14 | 14 |
|
| 15 |
+ "github.com/docker/docker/pkg/integration" |
|
| 15 | 16 |
"github.com/docker/docker/pkg/integration/checker" |
| 16 | 17 |
"github.com/docker/docker/pkg/stringid" |
| 17 | 18 |
"github.com/docker/docker/pkg/system" |
| ... | ... |
@@ -61,12 +62,12 @@ func (s *DockerDaemonSuite) TestDaemonUserNamespaceRootSetting(c *check.C) {
|
| 61 | 61 |
c.Assert(err, checker.IsNil, check.Commentf("Could not inspect running container: out: %q", pid))
|
| 62 | 62 |
// check the uid and gid maps for the PID to ensure root is remapped |
| 63 | 63 |
// (cmd = cat /proc/<pid>/uid_map | grep -E '0\s+9999\s+1') |
| 64 |
- out, rc1, err := runCommandPipelineWithOutput( |
|
| 64 |
+ out, rc1, err := integration.RunCommandPipelineWithOutput( |
|
| 65 | 65 |
exec.Command("cat", "/proc/"+strings.TrimSpace(pid)+"/uid_map"),
|
| 66 | 66 |
exec.Command("grep", "-E", fmt.Sprintf("0[[:space:]]+%d[[:space:]]+", uid)))
|
| 67 | 67 |
c.Assert(rc1, checker.Equals, 0, check.Commentf("Didn't match uid_map: output: %s", out))
|
| 68 | 68 |
|
| 69 |
- out, rc2, err := runCommandPipelineWithOutput( |
|
| 69 |
+ out, rc2, err := integration.RunCommandPipelineWithOutput( |
|
| 70 | 70 |
exec.Command("cat", "/proc/"+strings.TrimSpace(pid)+"/gid_map"),
|
| 71 | 71 |
exec.Command("grep", "-E", fmt.Sprintf("0[[:space:]]+%d[[:space:]]+", gid)))
|
| 72 | 72 |
c.Assert(rc2, checker.Equals, 0, check.Commentf("Didn't match gid_map: output: %s", out))
|
| ... | ... |
@@ -16,8 +16,8 @@ import ( |
| 16 | 16 |
func (s *DockerSuite) TestVolumeCLICreate(c *check.C) {
|
| 17 | 17 |
dockerCmd(c, "volume", "create") |
| 18 | 18 |
|
| 19 |
- _, err := runCommand(exec.Command(dockerBinary, "volume", "create", "-d", "nosuchdriver")) |
|
| 20 |
- c.Assert(err, check.Not(check.IsNil)) |
|
| 19 |
+ _, _, err := dockerCmdWithError("volume", "create", "-d", "nosuchdriver")
|
|
| 20 |
+ c.Assert(err, check.NotNil) |
|
| 21 | 21 |
|
| 22 | 22 |
// test using hidden --name option |
| 23 | 23 |
out, _ := dockerCmd(c, "volume", "create", "--name=test") |
| ... | ... |
@@ -250,6 +250,7 @@ func (s *DockerSuite) TestVolumeCLIRm(c *check.C) {
|
| 250 | 250 |
) |
| 251 | 251 |
} |
| 252 | 252 |
|
| 253 |
+// FIXME(vdemeester) should be a unit test in cli/command/volume package |
|
| 253 | 254 |
func (s *DockerSuite) TestVolumeCLINoArgs(c *check.C) {
|
| 254 | 255 |
out, _ := dockerCmd(c, "volume") |
| 255 | 256 |
// no args should produce the cmd usage output |
| ... | ... |
@@ -257,15 +258,20 @@ func (s *DockerSuite) TestVolumeCLINoArgs(c *check.C) {
|
| 257 | 257 |
c.Assert(out, checker.Contains, usage) |
| 258 | 258 |
|
| 259 | 259 |
// invalid arg should error and show the command usage on stderr |
| 260 |
- _, stderr, _, err := runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "somearg")) |
|
| 261 |
- c.Assert(err, check.NotNil, check.Commentf(stderr)) |
|
| 262 |
- c.Assert(stderr, checker.Contains, usage) |
|
| 260 |
+ icmd.RunCommand(dockerBinary, "volume", "somearg").Assert(c, icmd.Expected{
|
|
| 261 |
+ ExitCode: 1, |
|
| 262 |
+ Error: "exit status 1", |
|
| 263 |
+ Err: usage, |
|
| 264 |
+ }) |
|
| 263 | 265 |
|
| 264 | 266 |
// invalid flag should error and show the flag error and cmd usage |
| 265 |
- _, stderr, _, err = runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "--no-such-flag")) |
|
| 266 |
- c.Assert(err, check.NotNil, check.Commentf(stderr)) |
|
| 267 |
- c.Assert(stderr, checker.Contains, usage) |
|
| 268 |
- c.Assert(stderr, checker.Contains, "unknown flag: --no-such-flag") |
|
| 267 |
+ result := icmd.RunCommand(dockerBinary, "volume", "--no-such-flag") |
|
| 268 |
+ result.Assert(c, icmd.Expected{
|
|
| 269 |
+ ExitCode: 125, |
|
| 270 |
+ Error: "exit status 125", |
|
| 271 |
+ Err: usage, |
|
| 272 |
+ }) |
|
| 273 |
+ c.Assert(result.Stderr(), checker.Contains, "unknown flag: --no-such-flag") |
|
| 269 | 274 |
} |
| 270 | 275 |
|
| 271 | 276 |
func (s *DockerSuite) TestVolumeCLIInspectTmplError(c *check.C) {
|
| ... | ... |
@@ -45,7 +45,7 @@ func (s *DockerSuite) TestDeprecatedContainerAPIStartVolumeBinds(c *check.C) {
|
| 45 | 45 |
c.Assert(err, checker.IsNil) |
| 46 | 46 |
c.Assert(status, checker.Equals, http.StatusCreated) |
| 47 | 47 |
|
| 48 |
- bindPath := randomTmpDirPath("test", daemonPlatform)
|
|
| 48 |
+ bindPath := integration.RandomTmpDirPath("test", daemonPlatform)
|
|
| 49 | 49 |
config = map[string]interface{}{
|
| 50 | 50 |
"Binds": []string{bindPath + ":" + path},
|
| 51 | 51 |
} |
| ... | ... |
@@ -72,8 +72,8 @@ func (s *DockerSuite) TestDeprecatedContainerAPIStartDupVolumeBinds(c *check.C) |
| 72 | 72 |
c.Assert(err, checker.IsNil) |
| 73 | 73 |
c.Assert(status, checker.Equals, http.StatusCreated) |
| 74 | 74 |
|
| 75 |
- bindPath1 := randomTmpDirPath("test1", daemonPlatform)
|
|
| 76 |
- bindPath2 := randomTmpDirPath("test2", daemonPlatform)
|
|
| 75 |
+ bindPath1 := integration.RandomTmpDirPath("test1", daemonPlatform)
|
|
| 76 |
+ bindPath2 := integration.RandomTmpDirPath("test2", daemonPlatform)
|
|
| 77 | 77 |
|
| 78 | 78 |
config = map[string]interface{}{
|
| 79 | 79 |
"Binds": []string{bindPath1 + ":/tmp", bindPath2 + ":/tmp"},
|
| ... | ... |
@@ -902,15 +902,17 @@ func buildImageWithOut(name, dockerfile string, useCache bool, buildFlags ...str |
| 902 | 902 |
|
| 903 | 903 |
func buildImageWithStdoutStderr(name, dockerfile string, useCache bool, buildFlags ...string) (string, string, string, error) {
|
| 904 | 904 |
buildCmd := buildImageCmd(name, dockerfile, useCache, buildFlags...) |
| 905 |
- stdout, stderr, exitCode, err := runCommandWithStdoutStderr(buildCmd) |
|
| 905 |
+ result := icmd.RunCmd(transformCmd(buildCmd)) |
|
| 906 |
+ err := result.Error |
|
| 907 |
+ exitCode := result.ExitCode |
|
| 906 | 908 |
if err != nil || exitCode != 0 {
|
| 907 |
- return "", stdout, stderr, fmt.Errorf("failed to build the image: %s", stdout)
|
|
| 909 |
+ return "", result.Stdout(), result.Stderr(), fmt.Errorf("failed to build the image: %s", result.Combined())
|
|
| 908 | 910 |
} |
| 909 | 911 |
id, err := getIDByName(name) |
| 910 | 912 |
if err != nil {
|
| 911 |
- return "", stdout, stderr, err |
|
| 913 |
+ return "", result.Stdout(), result.Stderr(), err |
|
| 912 | 914 |
} |
| 913 |
- return id, stdout, stderr, nil |
|
| 915 |
+ return id, result.Stdout(), result.Stderr(), nil |
|
| 914 | 916 |
} |
| 915 | 917 |
|
| 916 | 918 |
func buildImage(name, dockerfile string, useCache bool, buildFlags ...string) (string, error) {
|
| ... | ... |
@@ -953,18 +955,21 @@ func buildImageFromContextWithStdoutStderr(name string, ctx *FakeContext, useCac |
| 953 | 953 |
} |
| 954 | 954 |
args = append(args, buildFlags...) |
| 955 | 955 |
args = append(args, ".") |
| 956 |
- buildCmd := exec.Command(dockerBinary, args...) |
|
| 957 |
- buildCmd.Dir = ctx.Dir |
|
| 958 | 956 |
|
| 959 |
- stdout, stderr, exitCode, err := runCommandWithStdoutStderr(buildCmd) |
|
| 957 |
+ result := icmd.RunCmd(icmd.Cmd{
|
|
| 958 |
+ Command: append([]string{dockerBinary}, args...),
|
|
| 959 |
+ Dir: ctx.Dir, |
|
| 960 |
+ }) |
|
| 961 |
+ exitCode := result.ExitCode |
|
| 962 |
+ err := result.Error |
|
| 960 | 963 |
if err != nil || exitCode != 0 {
|
| 961 |
- return "", stdout, stderr, fmt.Errorf("failed to build the image: %s", stdout)
|
|
| 964 |
+ return "", result.Stdout(), result.Stderr(), fmt.Errorf("failed to build the image: %s", result.Combined())
|
|
| 962 | 965 |
} |
| 963 | 966 |
id, err := getIDByName(name) |
| 964 | 967 |
if err != nil {
|
| 965 |
- return "", stdout, stderr, err |
|
| 968 |
+ return "", result.Stdout(), result.Stderr(), err |
|
| 966 | 969 |
} |
| 967 |
- return id, stdout, stderr, nil |
|
| 970 |
+ return id, result.Stdout(), result.Stderr(), nil |
|
| 968 | 971 |
} |
| 969 | 972 |
|
| 970 | 973 |
func buildImageFromGitWithStdoutStderr(name string, ctx *fakeGit, useCache bool, buildFlags ...string) (string, string, string, error) {
|
| ... | ... |
@@ -974,17 +979,19 @@ func buildImageFromGitWithStdoutStderr(name string, ctx *fakeGit, useCache bool, |
| 974 | 974 |
} |
| 975 | 975 |
args = append(args, buildFlags...) |
| 976 | 976 |
args = append(args, ctx.RepoURL) |
| 977 |
- buildCmd := exec.Command(dockerBinary, args...) |
|
| 978 |
- |
|
| 979 |
- stdout, stderr, exitCode, err := runCommandWithStdoutStderr(buildCmd) |
|
| 977 |
+ result := icmd.RunCmd(icmd.Cmd{
|
|
| 978 |
+ Command: append([]string{dockerBinary}, args...),
|
|
| 979 |
+ }) |
|
| 980 |
+ exitCode := result.ExitCode |
|
| 981 |
+ err := result.Error |
|
| 980 | 982 |
if err != nil || exitCode != 0 {
|
| 981 |
- return "", stdout, stderr, fmt.Errorf("failed to build the image: %s", stdout)
|
|
| 983 |
+ return "", result.Stdout(), result.Stderr(), fmt.Errorf("failed to build the image: %s", result.Combined())
|
|
| 982 | 984 |
} |
| 983 | 985 |
id, err := getIDByName(name) |
| 984 | 986 |
if err != nil {
|
| 985 |
- return "", stdout, stderr, err |
|
| 987 |
+ return "", result.Stdout(), result.Stderr(), err |
|
| 986 | 988 |
} |
| 987 |
- return id, stdout, stderr, nil |
|
| 989 |
+ return id, result.Stdout(), result.Stderr(), nil |
|
| 988 | 990 |
} |
| 989 | 991 |
|
| 990 | 992 |
func buildImageFromPath(name, path string, useCache bool, buildFlags ...string) (string, error) {
|
| ... | ... |
@@ -1,13 +1,8 @@ |
| 1 | 1 |
package main |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
- "io" |
|
| 5 |
- "os" |
|
| 6 |
- "os/exec" |
|
| 7 |
- "time" |
|
| 8 |
- |
|
| 9 |
- "github.com/docker/docker/pkg/integration" |
|
| 10 | 4 |
"github.com/docker/docker/pkg/integration/cmd" |
| 5 |
+ "os/exec" |
|
| 11 | 6 |
) |
| 12 | 7 |
|
| 13 | 8 |
func getPrefixAndSlashFromDaemonPlatform() (prefix, slash string) {
|
| ... | ... |
@@ -23,18 +18,6 @@ func runCommandWithOutput(execCmd *exec.Cmd) (string, int, error) {
|
| 23 | 23 |
return result.Combined(), result.ExitCode, result.Error |
| 24 | 24 |
} |
| 25 | 25 |
|
| 26 |
-// TODO: update code to call cmd.RunCmd directly, and remove this function |
|
| 27 |
-func runCommandWithStdoutStderr(execCmd *exec.Cmd) (string, string, int, error) {
|
|
| 28 |
- result := cmd.RunCmd(transformCmd(execCmd)) |
|
| 29 |
- return result.Stdout(), result.Stderr(), result.ExitCode, result.Error |
|
| 30 |
-} |
|
| 31 |
- |
|
| 32 |
-// TODO: update code to call cmd.RunCmd directly, and remove this function |
|
| 33 |
-func runCommand(execCmd *exec.Cmd) (exitCode int, err error) {
|
|
| 34 |
- result := cmd.RunCmd(transformCmd(execCmd)) |
|
| 35 |
- return result.ExitCode, result.Error |
|
| 36 |
-} |
|
| 37 |
- |
|
| 38 | 26 |
// Temporary shim for migrating commands to the new function |
| 39 | 27 |
func transformCmd(execCmd *exec.Cmd) cmd.Cmd {
|
| 40 | 28 |
return cmd.Cmd{
|
| ... | ... |
@@ -45,35 +28,3 @@ func transformCmd(execCmd *exec.Cmd) cmd.Cmd {
|
| 45 | 45 |
Stdout: execCmd.Stdout, |
| 46 | 46 |
} |
| 47 | 47 |
} |
| 48 |
- |
|
| 49 |
-func runCommandPipelineWithOutput(cmds ...*exec.Cmd) (output string, exitCode int, err error) {
|
|
| 50 |
- return integration.RunCommandPipelineWithOutput(cmds...) |
|
| 51 |
-} |
|
| 52 |
- |
|
| 53 |
-func convertSliceOfStringsToMap(input []string) map[string]struct{} {
|
|
| 54 |
- return integration.ConvertSliceOfStringsToMap(input) |
|
| 55 |
-} |
|
| 56 |
- |
|
| 57 |
-func compareDirectoryEntries(e1 []os.FileInfo, e2 []os.FileInfo) error {
|
|
| 58 |
- return integration.CompareDirectoryEntries(e1, e2) |
|
| 59 |
-} |
|
| 60 |
- |
|
| 61 |
-func listTar(f io.Reader) ([]string, error) {
|
|
| 62 |
- return integration.ListTar(f) |
|
| 63 |
-} |
|
| 64 |
- |
|
| 65 |
-func randomTmpDirPath(s string, platform string) string {
|
|
| 66 |
- return integration.RandomTmpDirPath(s, platform) |
|
| 67 |
-} |
|
| 68 |
- |
|
| 69 |
-func consumeWithSpeed(reader io.Reader, chunkSize int, interval time.Duration, stop chan bool) (n int, err error) {
|
|
| 70 |
- return integration.ConsumeWithSpeed(reader, chunkSize, interval, stop) |
|
| 71 |
-} |
|
| 72 |
- |
|
| 73 |
-func parseCgroupPaths(procCgroupData string) map[string]string {
|
|
| 74 |
- return integration.ParseCgroupPaths(procCgroupData) |
|
| 75 |
-} |
|
| 76 |
- |
|
| 77 |
-func runAtDifferentDate(date time.Time, block func()) {
|
|
| 78 |
- integration.RunAtDifferentDate(date, block) |
|
| 79 |
-} |