github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/integration-cli/fixtures_linux_daemon_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "os/exec" 8 "path/filepath" 9 "runtime" 10 "strings" 11 "sync" 12 13 "github.com/docker/docker/integration-cli/checker" 14 "github.com/docker/docker/integration-cli/fixtures/load" 15 "github.com/go-check/check" 16 ) 17 18 type testingT interface { 19 logT 20 Fatalf(string, ...interface{}) 21 } 22 23 type logT interface { 24 Logf(string, ...interface{}) 25 } 26 27 func ensureFrozenImagesLinux(t testingT) { 28 images := []string{"busybox:latest", "hello-world:frozen", "debian:jessie"} 29 err := load.FrozenImagesLinux(dockerBinary, images...) 30 if err != nil { 31 t.Logf(dockerCmdWithError("images")) 32 t.Fatalf("%+v", err) 33 } 34 defer testEnv.ProtectImage(t, images...) 35 } 36 37 var ensureSyscallTestOnce sync.Once 38 39 func ensureSyscallTest(c *check.C) { 40 var doIt bool 41 ensureSyscallTestOnce.Do(func() { 42 doIt = true 43 }) 44 if !doIt { 45 return 46 } 47 defer testEnv.ProtectImage(c, "syscall-test:latest") 48 49 // if no match, must build in docker, which is significantly slower 50 // (slower mostly because of the vfs graphdriver) 51 if testEnv.DaemonPlatform() != runtime.GOOS { 52 ensureSyscallTestBuild(c) 53 return 54 } 55 56 tmp, err := ioutil.TempDir("", "syscall-test-build") 57 c.Assert(err, checker.IsNil, check.Commentf("couldn't create temp dir")) 58 defer os.RemoveAll(tmp) 59 60 gcc, err := exec.LookPath("gcc") 61 c.Assert(err, checker.IsNil, check.Commentf("could not find gcc")) 62 63 tests := []string{"userns", "ns", "acct", "setuid", "setgid", "socket", "raw"} 64 for _, test := range tests { 65 out, err := exec.Command(gcc, "-g", "-Wall", "-static", fmt.Sprintf("../contrib/syscall-test/%s.c", test), "-o", fmt.Sprintf("%s/%s-test", tmp, test)).CombinedOutput() 66 c.Assert(err, checker.IsNil, check.Commentf(string(out))) 67 } 68 69 if runtime.GOOS == "linux" && runtime.GOARCH == "amd64" { 70 out, err := exec.Command(gcc, "-s", "-m32", "-nostdlib", "../contrib/syscall-test/exit32.s", "-o", tmp+"/"+"exit32-test").CombinedOutput() 71 c.Assert(err, checker.IsNil, check.Commentf(string(out))) 72 } 73 74 dockerFile := filepath.Join(tmp, "Dockerfile") 75 content := []byte(` 76 FROM debian:jessie 77 COPY . /usr/bin/ 78 `) 79 err = ioutil.WriteFile(dockerFile, content, 600) 80 c.Assert(err, checker.IsNil) 81 82 var buildArgs []string 83 if arg := os.Getenv("DOCKER_BUILD_ARGS"); strings.TrimSpace(arg) != "" { 84 buildArgs = strings.Split(arg, " ") 85 } 86 buildArgs = append(buildArgs, []string{"-q", "-t", "syscall-test", tmp}...) 87 buildArgs = append([]string{"build"}, buildArgs...) 88 dockerCmd(c, buildArgs...) 89 } 90 91 func ensureSyscallTestBuild(c *check.C) { 92 err := load.FrozenImagesLinux(dockerBinary, "buildpack-deps:jessie") 93 c.Assert(err, checker.IsNil) 94 95 var buildArgs []string 96 if arg := os.Getenv("DOCKER_BUILD_ARGS"); strings.TrimSpace(arg) != "" { 97 buildArgs = strings.Split(arg, " ") 98 } 99 buildArgs = append(buildArgs, []string{"-q", "-t", "syscall-test", "../contrib/syscall-test"}...) 100 buildArgs = append([]string{"build"}, buildArgs...) 101 dockerCmd(c, buildArgs...) 102 } 103 104 func ensureNNPTest(c *check.C) { 105 defer testEnv.ProtectImage(c, "nnp-test:latest") 106 if testEnv.DaemonPlatform() != runtime.GOOS { 107 ensureNNPTestBuild(c) 108 return 109 } 110 111 tmp, err := ioutil.TempDir("", "docker-nnp-test") 112 c.Assert(err, checker.IsNil) 113 114 gcc, err := exec.LookPath("gcc") 115 c.Assert(err, checker.IsNil, check.Commentf("could not find gcc")) 116 117 out, err := exec.Command(gcc, "-g", "-Wall", "-static", "../contrib/nnp-test/nnp-test.c", "-o", filepath.Join(tmp, "nnp-test")).CombinedOutput() 118 c.Assert(err, checker.IsNil, check.Commentf(string(out))) 119 120 dockerfile := filepath.Join(tmp, "Dockerfile") 121 content := ` 122 FROM debian:jessie 123 COPY . /usr/bin 124 RUN chmod +s /usr/bin/nnp-test 125 ` 126 err = ioutil.WriteFile(dockerfile, []byte(content), 600) 127 c.Assert(err, checker.IsNil, check.Commentf("could not write Dockerfile for nnp-test image")) 128 129 var buildArgs []string 130 if arg := os.Getenv("DOCKER_BUILD_ARGS"); strings.TrimSpace(arg) != "" { 131 buildArgs = strings.Split(arg, " ") 132 } 133 buildArgs = append(buildArgs, []string{"-q", "-t", "nnp-test", tmp}...) 134 buildArgs = append([]string{"build"}, buildArgs...) 135 dockerCmd(c, buildArgs...) 136 } 137 138 func ensureNNPTestBuild(c *check.C) { 139 err := load.FrozenImagesLinux(dockerBinary, "buildpack-deps:jessie") 140 c.Assert(err, checker.IsNil) 141 142 var buildArgs []string 143 if arg := os.Getenv("DOCKER_BUILD_ARGS"); strings.TrimSpace(arg) != "" { 144 buildArgs = strings.Split(arg, " ") 145 } 146 buildArgs = append(buildArgs, []string{"-q", "-t", "npp-test", "../contrib/nnp-test"}...) 147 buildArgs = append([]string{"build"}, buildArgs...) 148 dockerCmd(c, buildArgs...) 149 }