github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/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  	for _, img := range images {
    35  		protectedImages[img] = struct{}{}
    36  	}
    37  }
    38  
    39  var ensureSyscallTestOnce sync.Once
    40  
    41  func ensureSyscallTest(c *check.C) {
    42  	var doIt bool
    43  	ensureSyscallTestOnce.Do(func() {
    44  		doIt = true
    45  	})
    46  	if !doIt {
    47  		return
    48  	}
    49  	protectedImages["syscall-test:latest"] = struct{}{}
    50  
    51  	// if no match, must build in docker, which is significantly slower
    52  	// (slower mostly because of the vfs graphdriver)
    53  	if testEnv.DaemonPlatform() != runtime.GOOS {
    54  		ensureSyscallTestBuild(c)
    55  		return
    56  	}
    57  
    58  	tmp, err := ioutil.TempDir("", "syscall-test-build")
    59  	c.Assert(err, checker.IsNil, check.Commentf("couldn't create temp dir"))
    60  	defer os.RemoveAll(tmp)
    61  
    62  	gcc, err := exec.LookPath("gcc")
    63  	c.Assert(err, checker.IsNil, check.Commentf("could not find gcc"))
    64  
    65  	tests := []string{"userns", "ns", "acct", "setuid", "setgid", "socket", "raw"}
    66  	for _, test := range tests {
    67  		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()
    68  		c.Assert(err, checker.IsNil, check.Commentf(string(out)))
    69  	}
    70  
    71  	if runtime.GOOS == "linux" && runtime.GOARCH == "amd64" {
    72  		out, err := exec.Command(gcc, "-s", "-m32", "-nostdlib", "../contrib/syscall-test/exit32.s", "-o", tmp+"/"+"exit32-test").CombinedOutput()
    73  		c.Assert(err, checker.IsNil, check.Commentf(string(out)))
    74  	}
    75  
    76  	dockerFile := filepath.Join(tmp, "Dockerfile")
    77  	content := []byte(`
    78  	FROM debian:jessie
    79  	COPY . /usr/bin/
    80  	`)
    81  	err = ioutil.WriteFile(dockerFile, content, 600)
    82  	c.Assert(err, checker.IsNil)
    83  
    84  	var buildArgs []string
    85  	if arg := os.Getenv("DOCKER_BUILD_ARGS"); strings.TrimSpace(arg) != "" {
    86  		buildArgs = strings.Split(arg, " ")
    87  	}
    88  	buildArgs = append(buildArgs, []string{"-q", "-t", "syscall-test", tmp}...)
    89  	buildArgs = append([]string{"build"}, buildArgs...)
    90  	dockerCmd(c, buildArgs...)
    91  }
    92  
    93  func ensureSyscallTestBuild(c *check.C) {
    94  	err := load.FrozenImagesLinux(dockerBinary, "buildpack-deps:jessie")
    95  	c.Assert(err, checker.IsNil)
    96  
    97  	var buildArgs []string
    98  	if arg := os.Getenv("DOCKER_BUILD_ARGS"); strings.TrimSpace(arg) != "" {
    99  		buildArgs = strings.Split(arg, " ")
   100  	}
   101  	buildArgs = append(buildArgs, []string{"-q", "-t", "syscall-test", "../contrib/syscall-test"}...)
   102  	buildArgs = append([]string{"build"}, buildArgs...)
   103  	dockerCmd(c, buildArgs...)
   104  }
   105  
   106  func ensureNNPTest(c *check.C) {
   107  	protectedImages["nnp-test:latest"] = struct{}{}
   108  	if testEnv.DaemonPlatform() != runtime.GOOS {
   109  		ensureNNPTestBuild(c)
   110  		return
   111  	}
   112  
   113  	tmp, err := ioutil.TempDir("", "docker-nnp-test")
   114  	c.Assert(err, checker.IsNil)
   115  
   116  	gcc, err := exec.LookPath("gcc")
   117  	c.Assert(err, checker.IsNil, check.Commentf("could not find gcc"))
   118  
   119  	out, err := exec.Command(gcc, "-g", "-Wall", "-static", "../contrib/nnp-test/nnp-test.c", "-o", filepath.Join(tmp, "nnp-test")).CombinedOutput()
   120  	c.Assert(err, checker.IsNil, check.Commentf(string(out)))
   121  
   122  	dockerfile := filepath.Join(tmp, "Dockerfile")
   123  	content := `
   124  	FROM debian:jessie
   125  	COPY . /usr/bin
   126  	RUN chmod +s /usr/bin/nnp-test
   127  	`
   128  	err = ioutil.WriteFile(dockerfile, []byte(content), 600)
   129  	c.Assert(err, checker.IsNil, check.Commentf("could not write Dockerfile for nnp-test image"))
   130  
   131  	var buildArgs []string
   132  	if arg := os.Getenv("DOCKER_BUILD_ARGS"); strings.TrimSpace(arg) != "" {
   133  		buildArgs = strings.Split(arg, " ")
   134  	}
   135  	buildArgs = append(buildArgs, []string{"-q", "-t", "nnp-test", tmp}...)
   136  	buildArgs = append([]string{"build"}, buildArgs...)
   137  	dockerCmd(c, buildArgs...)
   138  }
   139  
   140  func ensureNNPTestBuild(c *check.C) {
   141  	err := load.FrozenImagesLinux(dockerBinary, "buildpack-deps:jessie")
   142  	c.Assert(err, checker.IsNil)
   143  
   144  	var buildArgs []string
   145  	if arg := os.Getenv("DOCKER_BUILD_ARGS"); strings.TrimSpace(arg) != "" {
   146  		buildArgs = strings.Split(arg, " ")
   147  	}
   148  	buildArgs = append(buildArgs, []string{"-q", "-t", "npp-test", "../contrib/nnp-test"}...)
   149  	buildArgs = append([]string{"build"}, buildArgs...)
   150  	dockerCmd(c, buildArgs...)
   151  }