Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
| ... | ... |
@@ -1,18 +1,12 @@ |
| 1 | 1 |
package main |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
- "bufio" |
|
| 5 | 4 |
"fmt" |
| 6 |
- "io/ioutil" |
|
| 7 |
- "os" |
|
| 8 | 5 |
"os/exec" |
| 9 | 6 |
"strconv" |
| 10 | 7 |
"strings" |
| 11 | 8 |
"testing" |
| 12 | 9 |
"time" |
| 13 |
- "unicode" |
|
| 14 |
- |
|
| 15 |
- "github.com/kr/pty" |
|
| 16 | 10 |
) |
| 17 | 11 |
|
| 18 | 12 |
func TestEventsUntag(t *testing.T) {
|
| ... | ... |
@@ -185,49 +179,6 @@ func TestEventsImageUntagDelete(t *testing.T) {
|
| 185 | 185 |
logDone("events - image untag, delete is logged")
|
| 186 | 186 |
} |
| 187 | 187 |
|
| 188 |
-// #5979 |
|
| 189 |
-func TestEventsRedirectStdout(t *testing.T) {
|
|
| 190 |
- |
|
| 191 |
- since := time.Now().Unix() |
|
| 192 |
- |
|
| 193 |
- dockerCmd(t, "run", "busybox", "true") |
|
| 194 |
- |
|
| 195 |
- defer deleteAllContainers() |
|
| 196 |
- |
|
| 197 |
- file, err := ioutil.TempFile("", "")
|
|
| 198 |
- if err != nil {
|
|
| 199 |
- t.Fatalf("could not create temp file: %v", err)
|
|
| 200 |
- } |
|
| 201 |
- defer os.Remove(file.Name()) |
|
| 202 |
- |
|
| 203 |
- command := fmt.Sprintf("%s events --since=%d --until=%d > %s", dockerBinary, since, time.Now().Unix(), file.Name())
|
|
| 204 |
- _, tty, err := pty.Open() |
|
| 205 |
- if err != nil {
|
|
| 206 |
- t.Fatalf("Could not open pty: %v", err)
|
|
| 207 |
- } |
|
| 208 |
- cmd := exec.Command("sh", "-c", command)
|
|
| 209 |
- cmd.Stdin = tty |
|
| 210 |
- cmd.Stdout = tty |
|
| 211 |
- cmd.Stderr = tty |
|
| 212 |
- if err := cmd.Run(); err != nil {
|
|
| 213 |
- t.Fatalf("run err for command %q: %v", command, err)
|
|
| 214 |
- } |
|
| 215 |
- |
|
| 216 |
- scanner := bufio.NewScanner(file) |
|
| 217 |
- for scanner.Scan() {
|
|
| 218 |
- for _, c := range scanner.Text() {
|
|
| 219 |
- if unicode.IsControl(c) {
|
|
| 220 |
- t.Fatalf("found control character %v", []byte(string(c)))
|
|
| 221 |
- } |
|
| 222 |
- } |
|
| 223 |
- } |
|
| 224 |
- if err := scanner.Err(); err != nil {
|
|
| 225 |
- t.Fatalf("Scan err for command %q: %v", command, err)
|
|
| 226 |
- } |
|
| 227 |
- |
|
| 228 |
- logDone("events - redirect stdout")
|
|
| 229 |
-} |
|
| 230 |
- |
|
| 231 | 188 |
func TestEventsImagePull(t *testing.T) {
|
| 232 | 189 |
since := time.Now().Unix() |
| 233 | 190 |
pullCmd := exec.Command(dockerBinary, "pull", "hello-world") |
| 234 | 191 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,59 @@ |
| 0 |
+// +build !windows |
|
| 1 |
+ |
|
| 2 |
+package main |
|
| 3 |
+ |
|
| 4 |
+import ( |
|
| 5 |
+ "bufio" |
|
| 6 |
+ "fmt" |
|
| 7 |
+ "io/ioutil" |
|
| 8 |
+ "os" |
|
| 9 |
+ "os/exec" |
|
| 10 |
+ "testing" |
|
| 11 |
+ "time" |
|
| 12 |
+ "unicode" |
|
| 13 |
+ |
|
| 14 |
+ "github.com/kr/pty" |
|
| 15 |
+) |
|
| 16 |
+ |
|
| 17 |
+// #5979 |
|
| 18 |
+func TestEventsRedirectStdout(t *testing.T) {
|
|
| 19 |
+ |
|
| 20 |
+ since := time.Now().Unix() |
|
| 21 |
+ |
|
| 22 |
+ dockerCmd(t, "run", "busybox", "true") |
|
| 23 |
+ |
|
| 24 |
+ defer deleteAllContainers() |
|
| 25 |
+ |
|
| 26 |
+ file, err := ioutil.TempFile("", "")
|
|
| 27 |
+ if err != nil {
|
|
| 28 |
+ t.Fatalf("could not create temp file: %v", err)
|
|
| 29 |
+ } |
|
| 30 |
+ defer os.Remove(file.Name()) |
|
| 31 |
+ |
|
| 32 |
+ command := fmt.Sprintf("%s events --since=%d --until=%d > %s", dockerBinary, since, time.Now().Unix(), file.Name())
|
|
| 33 |
+ _, tty, err := pty.Open() |
|
| 34 |
+ if err != nil {
|
|
| 35 |
+ t.Fatalf("Could not open pty: %v", err)
|
|
| 36 |
+ } |
|
| 37 |
+ cmd := exec.Command("sh", "-c", command)
|
|
| 38 |
+ cmd.Stdin = tty |
|
| 39 |
+ cmd.Stdout = tty |
|
| 40 |
+ cmd.Stderr = tty |
|
| 41 |
+ if err := cmd.Run(); err != nil {
|
|
| 42 |
+ t.Fatalf("run err for command %q: %v", command, err)
|
|
| 43 |
+ } |
|
| 44 |
+ |
|
| 45 |
+ scanner := bufio.NewScanner(file) |
|
| 46 |
+ for scanner.Scan() {
|
|
| 47 |
+ for _, c := range scanner.Text() {
|
|
| 48 |
+ if unicode.IsControl(c) {
|
|
| 49 |
+ t.Fatalf("found control character %v", []byte(string(c)))
|
|
| 50 |
+ } |
|
| 51 |
+ } |
|
| 52 |
+ } |
|
| 53 |
+ if err := scanner.Err(); err != nil {
|
|
| 54 |
+ t.Fatalf("Scan err for command %q: %v", command, err)
|
|
| 55 |
+ } |
|
| 56 |
+ |
|
| 57 |
+ logDone("events - redirect stdout")
|
|
| 58 |
+} |
| ... | ... |
@@ -20,9 +20,7 @@ import ( |
| 20 | 20 |
"time" |
| 21 | 21 |
|
| 22 | 22 |
"github.com/docker/docker/nat" |
| 23 |
- "github.com/docker/docker/pkg/mount" |
|
| 24 | 23 |
"github.com/docker/docker/pkg/networkfs/resolvconf" |
| 25 |
- "github.com/kr/pty" |
|
| 26 | 24 |
) |
| 27 | 25 |
|
| 28 | 26 |
// "test123" should be printed by docker run |
| ... | ... |
@@ -1240,45 +1238,6 @@ func TestRunDisallowBindMountingRootToRoot(t *testing.T) {
|
| 1240 | 1240 |
logDone("run - bind mount /:/ as volume should fail")
|
| 1241 | 1241 |
} |
| 1242 | 1242 |
|
| 1243 |
-// Test recursive bind mount works by default |
|
| 1244 |
-func TestRunWithVolumesIsRecursive(t *testing.T) {
|
|
| 1245 |
- tmpDir, err := ioutil.TempDir("", "docker_recursive_mount_test")
|
|
| 1246 |
- if err != nil {
|
|
| 1247 |
- t.Fatal(err) |
|
| 1248 |
- } |
|
| 1249 |
- |
|
| 1250 |
- defer os.RemoveAll(tmpDir) |
|
| 1251 |
- |
|
| 1252 |
- // Create a temporary tmpfs mount. |
|
| 1253 |
- tmpfsDir := filepath.Join(tmpDir, "tmpfs") |
|
| 1254 |
- if err := os.MkdirAll(tmpfsDir, 0777); err != nil {
|
|
| 1255 |
- t.Fatalf("failed to mkdir at %s - %s", tmpfsDir, err)
|
|
| 1256 |
- } |
|
| 1257 |
- if err := mount.Mount("tmpfs", tmpfsDir, "tmpfs", ""); err != nil {
|
|
| 1258 |
- t.Fatalf("failed to create a tmpfs mount at %s - %s", tmpfsDir, err)
|
|
| 1259 |
- } |
|
| 1260 |
- defer mount.Unmount(tmpfsDir) |
|
| 1261 |
- |
|
| 1262 |
- f, err := ioutil.TempFile(tmpfsDir, "touch-me") |
|
| 1263 |
- if err != nil {
|
|
| 1264 |
- t.Fatal(err) |
|
| 1265 |
- } |
|
| 1266 |
- defer f.Close() |
|
| 1267 |
- |
|
| 1268 |
- runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "--volume", fmt.Sprintf("%s:/tmp:ro", tmpDir), "busybox:latest", "ls", "/tmp/tmpfs")
|
|
| 1269 |
- out, stderr, exitCode, err := runCommandWithStdoutStderr(runCmd) |
|
| 1270 |
- if err != nil && exitCode != 0 {
|
|
| 1271 |
- t.Fatal(out, stderr, err) |
|
| 1272 |
- } |
|
| 1273 |
- if !strings.Contains(out, filepath.Base(f.Name())) {
|
|
| 1274 |
- t.Fatal("Recursive bind mount test failed. Expected file not found")
|
|
| 1275 |
- } |
|
| 1276 |
- |
|
| 1277 |
- deleteAllContainers() |
|
| 1278 |
- |
|
| 1279 |
- logDone("run - volumes are bind mounted recursively")
|
|
| 1280 |
-} |
|
| 1281 |
- |
|
| 1282 | 1243 |
func TestRunDnsDefaultOptions(t *testing.T) {
|
| 1283 | 1244 |
// ci server has default resolv.conf |
| 1284 | 1245 |
// so rewrite it for the test |
| ... | ... |
@@ -2283,44 +2242,6 @@ func TestRunExecDir(t *testing.T) {
|
| 2283 | 2283 |
logDone("run - check execdriver dir behavior")
|
| 2284 | 2284 |
} |
| 2285 | 2285 |
|
| 2286 |
-// #6509 |
|
| 2287 |
-func TestRunRedirectStdout(t *testing.T) {
|
|
| 2288 |
- |
|
| 2289 |
- defer deleteAllContainers() |
|
| 2290 |
- |
|
| 2291 |
- checkRedirect := func(command string) {
|
|
| 2292 |
- _, tty, err := pty.Open() |
|
| 2293 |
- if err != nil {
|
|
| 2294 |
- t.Fatalf("Could not open pty: %v", err)
|
|
| 2295 |
- } |
|
| 2296 |
- cmd := exec.Command("sh", "-c", command)
|
|
| 2297 |
- cmd.Stdin = tty |
|
| 2298 |
- cmd.Stdout = tty |
|
| 2299 |
- cmd.Stderr = tty |
|
| 2300 |
- ch := make(chan struct{})
|
|
| 2301 |
- if err := cmd.Start(); err != nil {
|
|
| 2302 |
- t.Fatalf("start err: %v", err)
|
|
| 2303 |
- } |
|
| 2304 |
- go func() {
|
|
| 2305 |
- if err := cmd.Wait(); err != nil {
|
|
| 2306 |
- t.Fatalf("wait err=%v", err)
|
|
| 2307 |
- } |
|
| 2308 |
- close(ch) |
|
| 2309 |
- }() |
|
| 2310 |
- |
|
| 2311 |
- select {
|
|
| 2312 |
- case <-time.After(10 * time.Second): |
|
| 2313 |
- t.Fatal("command timeout")
|
|
| 2314 |
- case <-ch: |
|
| 2315 |
- } |
|
| 2316 |
- } |
|
| 2317 |
- |
|
| 2318 |
- checkRedirect(dockerBinary + " run -i busybox cat /etc/passwd | grep -q root") |
|
| 2319 |
- checkRedirect(dockerBinary + " run busybox cat /etc/passwd | grep -q root") |
|
| 2320 |
- |
|
| 2321 |
- logDone("run - redirect stdout")
|
|
| 2322 |
-} |
|
| 2323 |
- |
|
| 2324 | 2286 |
// Regression test for https://github.com/docker/docker/issues/8259 |
| 2325 | 2287 |
func TestRunReuseBindVolumeThatIsSymlink(t *testing.T) {
|
| 2326 | 2288 |
tmpDir, err := ioutil.TempDir(os.TempDir(), "testlink") |
| 2327 | 2289 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,93 @@ |
| 0 |
+// +build !windows |
|
| 1 |
+ |
|
| 2 |
+package main |
|
| 3 |
+ |
|
| 4 |
+import ( |
|
| 5 |
+ "fmt" |
|
| 6 |
+ "io/ioutil" |
|
| 7 |
+ "os" |
|
| 8 |
+ "os/exec" |
|
| 9 |
+ "path/filepath" |
|
| 10 |
+ "strings" |
|
| 11 |
+ "testing" |
|
| 12 |
+ "time" |
|
| 13 |
+ |
|
| 14 |
+ "github.com/docker/docker/pkg/mount" |
|
| 15 |
+ "github.com/kr/pty" |
|
| 16 |
+) |
|
| 17 |
+ |
|
| 18 |
+// #6509 |
|
| 19 |
+func TestRunRedirectStdout(t *testing.T) {
|
|
| 20 |
+ |
|
| 21 |
+ defer deleteAllContainers() |
|
| 22 |
+ |
|
| 23 |
+ checkRedirect := func(command string) {
|
|
| 24 |
+ _, tty, err := pty.Open() |
|
| 25 |
+ if err != nil {
|
|
| 26 |
+ t.Fatalf("Could not open pty: %v", err)
|
|
| 27 |
+ } |
|
| 28 |
+ cmd := exec.Command("sh", "-c", command)
|
|
| 29 |
+ cmd.Stdin = tty |
|
| 30 |
+ cmd.Stdout = tty |
|
| 31 |
+ cmd.Stderr = tty |
|
| 32 |
+ ch := make(chan struct{})
|
|
| 33 |
+ if err := cmd.Start(); err != nil {
|
|
| 34 |
+ t.Fatalf("start err: %v", err)
|
|
| 35 |
+ } |
|
| 36 |
+ go func() {
|
|
| 37 |
+ if err := cmd.Wait(); err != nil {
|
|
| 38 |
+ t.Fatalf("wait err=%v", err)
|
|
| 39 |
+ } |
|
| 40 |
+ close(ch) |
|
| 41 |
+ }() |
|
| 42 |
+ |
|
| 43 |
+ select {
|
|
| 44 |
+ case <-time.After(10 * time.Second): |
|
| 45 |
+ t.Fatal("command timeout")
|
|
| 46 |
+ case <-ch: |
|
| 47 |
+ } |
|
| 48 |
+ } |
|
| 49 |
+ |
|
| 50 |
+ checkRedirect(dockerBinary + " run -i busybox cat /etc/passwd | grep -q root") |
|
| 51 |
+ checkRedirect(dockerBinary + " run busybox cat /etc/passwd | grep -q root") |
|
| 52 |
+ |
|
| 53 |
+ logDone("run - redirect stdout")
|
|
| 54 |
+} |
|
| 55 |
+ |
|
| 56 |
+// Test recursive bind mount works by default |
|
| 57 |
+func TestRunWithVolumesIsRecursive(t *testing.T) {
|
|
| 58 |
+ tmpDir, err := ioutil.TempDir("", "docker_recursive_mount_test")
|
|
| 59 |
+ if err != nil {
|
|
| 60 |
+ t.Fatal(err) |
|
| 61 |
+ } |
|
| 62 |
+ |
|
| 63 |
+ defer os.RemoveAll(tmpDir) |
|
| 64 |
+ |
|
| 65 |
+ // Create a temporary tmpfs mount. |
|
| 66 |
+ tmpfsDir := filepath.Join(tmpDir, "tmpfs") |
|
| 67 |
+ if err := os.MkdirAll(tmpfsDir, 0777); err != nil {
|
|
| 68 |
+ t.Fatalf("failed to mkdir at %s - %s", tmpfsDir, err)
|
|
| 69 |
+ } |
|
| 70 |
+ if err := mount.Mount("tmpfs", tmpfsDir, "tmpfs", ""); err != nil {
|
|
| 71 |
+ t.Fatalf("failed to create a tmpfs mount at %s - %s", tmpfsDir, err)
|
|
| 72 |
+ } |
|
| 73 |
+ |
|
| 74 |
+ f, err := ioutil.TempFile(tmpfsDir, "touch-me") |
|
| 75 |
+ if err != nil {
|
|
| 76 |
+ t.Fatal(err) |
|
| 77 |
+ } |
|
| 78 |
+ defer f.Close() |
|
| 79 |
+ |
|
| 80 |
+ runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "--volume", fmt.Sprintf("%s:/tmp:ro", tmpDir), "busybox:latest", "ls", "/tmp/tmpfs")
|
|
| 81 |
+ out, stderr, exitCode, err := runCommandWithStdoutStderr(runCmd) |
|
| 82 |
+ if err != nil && exitCode != 0 {
|
|
| 83 |
+ t.Fatal(out, stderr, err) |
|
| 84 |
+ } |
|
| 85 |
+ if !strings.Contains(out, filepath.Base(f.Name())) {
|
|
| 86 |
+ t.Fatal("Recursive bind mount test failed. Expected file not found")
|
|
| 87 |
+ } |
|
| 88 |
+ |
|
| 89 |
+ deleteAllContainers() |
|
| 90 |
+ |
|
| 91 |
+ logDone("run - volumes are bind mounted recursively")
|
|
| 92 |
+} |
| ... | ... |
@@ -1,7 +1,6 @@ |
| 1 | 1 |
package main |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
- "bytes" |
|
| 5 | 4 |
"fmt" |
| 6 | 5 |
"io/ioutil" |
| 7 | 6 |
"os" |
| ... | ... |
@@ -11,99 +10,8 @@ import ( |
| 11 | 11 |
"sort" |
| 12 | 12 |
"strings" |
| 13 | 13 |
"testing" |
| 14 |
- |
|
| 15 |
- "github.com/docker/docker/vendor/src/github.com/kr/pty" |
|
| 16 | 14 |
) |
| 17 | 15 |
|
| 18 |
-// save a repo and try to load it using stdout |
|
| 19 |
-func TestSaveAndLoadRepoStdout(t *testing.T) {
|
|
| 20 |
- runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") |
|
| 21 |
- out, _, err := runCommandWithOutput(runCmd) |
|
| 22 |
- if err != nil {
|
|
| 23 |
- t.Fatalf("failed to create a container: %s, %v", out, err)
|
|
| 24 |
- } |
|
| 25 |
- |
|
| 26 |
- cleanedContainerID := stripTrailingCharacters(out) |
|
| 27 |
- |
|
| 28 |
- repoName := "foobar-save-load-test" |
|
| 29 |
- |
|
| 30 |
- inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID) |
|
| 31 |
- if out, _, err = runCommandWithOutput(inspectCmd); err != nil {
|
|
| 32 |
- t.Fatalf("output should've been a container id: %s, %v", out, err)
|
|
| 33 |
- } |
|
| 34 |
- |
|
| 35 |
- commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName) |
|
| 36 |
- if out, _, err = runCommandWithOutput(commitCmd); err != nil {
|
|
| 37 |
- t.Fatalf("failed to commit container: %s, %v", out, err)
|
|
| 38 |
- } |
|
| 39 |
- |
|
| 40 |
- inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 41 |
- before, _, err := runCommandWithOutput(inspectCmd) |
|
| 42 |
- if err != nil {
|
|
| 43 |
- t.Fatalf("the repo should exist before saving it: %s, %v", before, err)
|
|
| 44 |
- } |
|
| 45 |
- |
|
| 46 |
- saveCmdTemplate := `%v save %v > /tmp/foobar-save-load-test.tar` |
|
| 47 |
- saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName) |
|
| 48 |
- saveCmd := exec.Command("bash", "-c", saveCmdFinal)
|
|
| 49 |
- if out, _, err = runCommandWithOutput(saveCmd); err != nil {
|
|
| 50 |
- t.Fatalf("failed to save repo: %s, %v", out, err)
|
|
| 51 |
- } |
|
| 52 |
- |
|
| 53 |
- deleteImages(repoName) |
|
| 54 |
- |
|
| 55 |
- loadCmdFinal := `cat /tmp/foobar-save-load-test.tar | docker load` |
|
| 56 |
- loadCmd := exec.Command("bash", "-c", loadCmdFinal)
|
|
| 57 |
- if out, _, err = runCommandWithOutput(loadCmd); err != nil {
|
|
| 58 |
- t.Fatalf("failed to load repo: %s, %v", out, err)
|
|
| 59 |
- } |
|
| 60 |
- |
|
| 61 |
- inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 62 |
- after, _, err := runCommandWithOutput(inspectCmd) |
|
| 63 |
- if err != nil {
|
|
| 64 |
- t.Fatalf("the repo should exist after loading it: %s %v", after, err)
|
|
| 65 |
- } |
|
| 66 |
- |
|
| 67 |
- if before != after {
|
|
| 68 |
- t.Fatalf("inspect is not the same after a save / load")
|
|
| 69 |
- } |
|
| 70 |
- |
|
| 71 |
- deleteContainer(cleanedContainerID) |
|
| 72 |
- deleteImages(repoName) |
|
| 73 |
- |
|
| 74 |
- os.Remove("/tmp/foobar-save-load-test.tar")
|
|
| 75 |
- |
|
| 76 |
- logDone("save - save/load a repo using stdout")
|
|
| 77 |
- |
|
| 78 |
- pty, tty, err := pty.Open() |
|
| 79 |
- if err != nil {
|
|
| 80 |
- t.Fatalf("Could not open pty: %v", err)
|
|
| 81 |
- } |
|
| 82 |
- cmd := exec.Command(dockerBinary, "save", repoName) |
|
| 83 |
- cmd.Stdin = tty |
|
| 84 |
- cmd.Stdout = tty |
|
| 85 |
- cmd.Stderr = tty |
|
| 86 |
- if err := cmd.Start(); err != nil {
|
|
| 87 |
- t.Fatalf("start err: %v", err)
|
|
| 88 |
- } |
|
| 89 |
- if err := cmd.Wait(); err == nil {
|
|
| 90 |
- t.Fatal("did not break writing to a TTY")
|
|
| 91 |
- } |
|
| 92 |
- |
|
| 93 |
- buf := make([]byte, 1024) |
|
| 94 |
- |
|
| 95 |
- n, err := pty.Read(buf) |
|
| 96 |
- if err != nil {
|
|
| 97 |
- t.Fatal("could not read tty output")
|
|
| 98 |
- } |
|
| 99 |
- |
|
| 100 |
- if !bytes.Contains(buf[:n], []byte("Cowardly refusing")) {
|
|
| 101 |
- t.Fatal("help output is not being yielded", out)
|
|
| 102 |
- } |
|
| 103 |
- |
|
| 104 |
- logDone("save - do not save to a tty")
|
|
| 105 |
-} |
|
| 106 |
- |
|
| 107 | 16 |
// save a repo using gz compression and try to load it using stdout |
| 108 | 17 |
func TestSaveXzAndLoadRepoStdout(t *testing.T) {
|
| 109 | 18 |
tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
|
| 110 | 19 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,102 @@ |
| 0 |
+// +build !windows |
|
| 1 |
+ |
|
| 2 |
+package main |
|
| 3 |
+ |
|
| 4 |
+import ( |
|
| 5 |
+ "bytes" |
|
| 6 |
+ "fmt" |
|
| 7 |
+ "os" |
|
| 8 |
+ "os/exec" |
|
| 9 |
+ "testing" |
|
| 10 |
+ |
|
| 11 |
+ "github.com/docker/docker/vendor/src/github.com/kr/pty" |
|
| 12 |
+) |
|
| 13 |
+ |
|
| 14 |
+// save a repo and try to load it using stdout |
|
| 15 |
+func TestSaveAndLoadRepoStdout(t *testing.T) {
|
|
| 16 |
+ runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") |
|
| 17 |
+ out, _, err := runCommandWithOutput(runCmd) |
|
| 18 |
+ if err != nil {
|
|
| 19 |
+ t.Fatalf("failed to create a container: %s, %v", out, err)
|
|
| 20 |
+ } |
|
| 21 |
+ |
|
| 22 |
+ cleanedContainerID := stripTrailingCharacters(out) |
|
| 23 |
+ |
|
| 24 |
+ repoName := "foobar-save-load-test" |
|
| 25 |
+ |
|
| 26 |
+ inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID) |
|
| 27 |
+ if out, _, err = runCommandWithOutput(inspectCmd); err != nil {
|
|
| 28 |
+ t.Fatalf("output should've been a container id: %s, %v", out, err)
|
|
| 29 |
+ } |
|
| 30 |
+ |
|
| 31 |
+ commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName) |
|
| 32 |
+ if out, _, err = runCommandWithOutput(commitCmd); err != nil {
|
|
| 33 |
+ t.Fatalf("failed to commit container: %s, %v", out, err)
|
|
| 34 |
+ } |
|
| 35 |
+ |
|
| 36 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 37 |
+ before, _, err := runCommandWithOutput(inspectCmd) |
|
| 38 |
+ if err != nil {
|
|
| 39 |
+ t.Fatalf("the repo should exist before saving it: %s, %v", before, err)
|
|
| 40 |
+ } |
|
| 41 |
+ |
|
| 42 |
+ saveCmdTemplate := `%v save %v > /tmp/foobar-save-load-test.tar` |
|
| 43 |
+ saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName) |
|
| 44 |
+ saveCmd := exec.Command("bash", "-c", saveCmdFinal)
|
|
| 45 |
+ if out, _, err = runCommandWithOutput(saveCmd); err != nil {
|
|
| 46 |
+ t.Fatalf("failed to save repo: %s, %v", out, err)
|
|
| 47 |
+ } |
|
| 48 |
+ |
|
| 49 |
+ deleteImages(repoName) |
|
| 50 |
+ |
|
| 51 |
+ loadCmdFinal := `cat /tmp/foobar-save-load-test.tar | docker load` |
|
| 52 |
+ loadCmd := exec.Command("bash", "-c", loadCmdFinal)
|
|
| 53 |
+ if out, _, err = runCommandWithOutput(loadCmd); err != nil {
|
|
| 54 |
+ t.Fatalf("failed to load repo: %s, %v", out, err)
|
|
| 55 |
+ } |
|
| 56 |
+ |
|
| 57 |
+ inspectCmd = exec.Command(dockerBinary, "inspect", repoName) |
|
| 58 |
+ after, _, err := runCommandWithOutput(inspectCmd) |
|
| 59 |
+ if err != nil {
|
|
| 60 |
+ t.Fatalf("the repo should exist after loading it: %s %v", after, err)
|
|
| 61 |
+ } |
|
| 62 |
+ |
|
| 63 |
+ if before != after {
|
|
| 64 |
+ t.Fatalf("inspect is not the same after a save / load")
|
|
| 65 |
+ } |
|
| 66 |
+ |
|
| 67 |
+ deleteContainer(cleanedContainerID) |
|
| 68 |
+ deleteImages(repoName) |
|
| 69 |
+ |
|
| 70 |
+ os.Remove("/tmp/foobar-save-load-test.tar")
|
|
| 71 |
+ |
|
| 72 |
+ logDone("save - save/load a repo using stdout")
|
|
| 73 |
+ |
|
| 74 |
+ pty, tty, err := pty.Open() |
|
| 75 |
+ if err != nil {
|
|
| 76 |
+ t.Fatalf("Could not open pty: %v", err)
|
|
| 77 |
+ } |
|
| 78 |
+ cmd := exec.Command(dockerBinary, "save", repoName) |
|
| 79 |
+ cmd.Stdin = tty |
|
| 80 |
+ cmd.Stdout = tty |
|
| 81 |
+ cmd.Stderr = tty |
|
| 82 |
+ if err := cmd.Start(); err != nil {
|
|
| 83 |
+ t.Fatalf("start err: %v", err)
|
|
| 84 |
+ } |
|
| 85 |
+ if err := cmd.Wait(); err == nil {
|
|
| 86 |
+ t.Fatal("did not break writing to a TTY")
|
|
| 87 |
+ } |
|
| 88 |
+ |
|
| 89 |
+ buf := make([]byte, 1024) |
|
| 90 |
+ |
|
| 91 |
+ n, err := pty.Read(buf) |
|
| 92 |
+ if err != nil {
|
|
| 93 |
+ t.Fatal("could not read tty output")
|
|
| 94 |
+ } |
|
| 95 |
+ |
|
| 96 |
+ if !bytes.Contains(buf[:n], []byte("Cowardly refusing")) {
|
|
| 97 |
+ t.Fatal("help output is not being yielded", out)
|
|
| 98 |
+ } |
|
| 99 |
+ |
|
| 100 |
+ logDone("save - do not save to a tty")
|
|
| 101 |
+} |
| ... | ... |
@@ -4,6 +4,7 @@ import ( |
| 4 | 4 |
"fmt" |
| 5 | 5 |
"os" |
| 6 | 6 |
"os/exec" |
| 7 |
+ "runtime" |
|
| 7 | 8 |
) |
| 8 | 9 |
|
| 9 | 10 |
var ( |
| ... | ... |
@@ -25,16 +26,26 @@ var ( |
| 25 | 25 |
workingDirectory string |
| 26 | 26 |
) |
| 27 | 27 |
|
| 28 |
+func binarySearchCommand() *exec.Cmd {
|
|
| 29 |
+ if runtime.GOOS == "windows" {
|
|
| 30 |
+ // Windows where.exe is included since Windows Server 2003. It accepts |
|
| 31 |
+ // wildcards, which we use here to match the development builds binary |
|
| 32 |
+ // names (such as docker-$VERSION.exe). |
|
| 33 |
+ return exec.Command("where.exe", "docker*.exe")
|
|
| 34 |
+ } |
|
| 35 |
+ return exec.Command("which", "docker")
|
|
| 36 |
+} |
|
| 37 |
+ |
|
| 28 | 38 |
func init() {
|
| 29 | 39 |
if dockerBin := os.Getenv("DOCKER_BINARY"); dockerBin != "" {
|
| 30 | 40 |
dockerBinary = dockerBin |
| 31 | 41 |
} else {
|
| 32 |
- whichCmd := exec.Command("which", "docker")
|
|
| 42 |
+ whichCmd := binarySearchCommand() |
|
| 33 | 43 |
out, _, err := runCommandWithOutput(whichCmd) |
| 34 | 44 |
if err == nil {
|
| 35 | 45 |
dockerBinary = stripTrailingCharacters(out) |
| 36 | 46 |
} else {
|
| 37 |
- fmt.Printf("ERROR: couldn't resolve full path to the Docker binary")
|
|
| 47 |
+ fmt.Printf("ERROR: couldn't resolve full path to the Docker binary (%v)", err)
|
|
| 38 | 48 |
os.Exit(1) |
| 39 | 49 |
} |
| 40 | 50 |
} |
| ... | ... |
@@ -100,9 +100,7 @@ func logDone(message string) {
|
| 100 | 100 |
} |
| 101 | 101 |
|
| 102 | 102 |
func stripTrailingCharacters(target string) string {
|
| 103 |
- target = strings.Trim(target, "\n") |
|
| 104 |
- target = strings.Trim(target, " ") |
|
| 105 |
- return target |
|
| 103 |
+ return strings.TrimSpace(target) |
|
| 106 | 104 |
} |
| 107 | 105 |
|
| 108 | 106 |
func unmarshalJSON(data []byte, result interface{}) error {
|
| ... | ... |
@@ -15,10 +15,14 @@ exec 41>&1 42>&2 |
| 15 | 15 |
DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs}
|
| 16 | 16 |
DOCKER_EXECDRIVER=${DOCKER_EXECDRIVER:-native}
|
| 17 | 17 |
|
| 18 |
-( set -x; exec \ |
|
| 19 |
- docker --daemon --debug \ |
|
| 20 |
- --storage-driver "$DOCKER_GRAPHDRIVER" \ |
|
| 21 |
- --exec-driver "$DOCKER_EXECDRIVER" \ |
|
| 22 |
- --pidfile "$DEST/docker.pid" \ |
|
| 23 |
- &> "$DEST/docker.log" |
|
| 24 |
-) & |
|
| 18 |
+if [ -z "$DOCKER_TEST_HOST" ]; then |
|
| 19 |
+ ( set -x; exec \ |
|
| 20 |
+ docker --daemon --debug \ |
|
| 21 |
+ --storage-driver "$DOCKER_GRAPHDRIVER" \ |
|
| 22 |
+ --exec-driver "$DOCKER_EXECDRIVER" \ |
|
| 23 |
+ --pidfile "$DEST/docker.pid" \ |
|
| 24 |
+ &> "$DEST/docker.log" |
|
| 25 |
+ ) & |
|
| 26 |
+else |
|
| 27 |
+ export DOCKER_HOST="$DOCKER_TEST_HOST" |
|
| 28 |
+fi |