fixtures_linux_daemon_test.go 4.5 KB

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