123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- // +build linux
- package lxc
- import (
- "bufio"
- "fmt"
- "io/ioutil"
- "math/rand"
- "os"
- "path"
- "strings"
- "testing"
- "time"
- "github.com/docker/docker/daemon/execdriver"
- nativeTemplate "github.com/docker/docker/daemon/execdriver/native/template"
- "github.com/docker/libcontainer/devices"
- )
- func TestLXCConfig(t *testing.T) {
- root, err := ioutil.TempDir("", "TestLXCConfig")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(root)
- os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- // Memory is allocated randomly for testing
- rand.Seed(time.Now().UTC().UnixNano())
- var (
- memMin = 33554432
- memMax = 536870912
- mem = memMin + rand.Intn(memMax-memMin)
- cpuMin = 100
- cpuMax = 10000
- cpu = cpuMin + rand.Intn(cpuMax-cpuMin)
- )
- driver, err := NewDriver(root, "", false)
- if err != nil {
- t.Fatal(err)
- }
- command := &execdriver.Command{
- ID: "1",
- Resources: &execdriver.Resources{
- Memory: int64(mem),
- CpuShares: int64(cpu),
- },
- Network: &execdriver.Network{
- Mtu: 1500,
- Interface: nil,
- },
- AllowedDevices: make([]*devices.Device, 0),
- ProcessConfig: execdriver.ProcessConfig{},
- }
- p, err := driver.generateLXCConfig(command)
- if err != nil {
- t.Fatal(err)
- }
- grepFile(t, p,
- fmt.Sprintf("lxc.cgroup.memory.limit_in_bytes = %d", mem))
- grepFile(t, p,
- fmt.Sprintf("lxc.cgroup.memory.memsw.limit_in_bytes = %d", mem*2))
- }
- func TestCustomLxcConfig(t *testing.T) {
- root, err := ioutil.TempDir("", "TestCustomLxcConfig")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(root)
- os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- driver, err := NewDriver(root, "", false)
- if err != nil {
- t.Fatal(err)
- }
- processConfig := execdriver.ProcessConfig{
- Privileged: false,
- }
- command := &execdriver.Command{
- ID: "1",
- LxcConfig: []string{
- "lxc.utsname = docker",
- "lxc.cgroup.cpuset.cpus = 0,1",
- },
- Network: &execdriver.Network{
- Mtu: 1500,
- Interface: nil,
- },
- ProcessConfig: processConfig,
- }
- p, err := driver.generateLXCConfig(command)
- if err != nil {
- t.Fatal(err)
- }
- grepFile(t, p, "lxc.utsname = docker")
- grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
- }
- func grepFile(t *testing.T, path string, pattern string) {
- grepFileWithReverse(t, path, pattern, false)
- }
- func grepFileWithReverse(t *testing.T, path string, pattern string, inverseGrep bool) {
- f, err := os.Open(path)
- if err != nil {
- t.Fatal(err)
- }
- defer f.Close()
- r := bufio.NewReader(f)
- var (
- line string
- )
- err = nil
- for err == nil {
- line, err = r.ReadString('\n')
- if strings.Contains(line, pattern) == true {
- if inverseGrep {
- t.Fatalf("grepFile: pattern \"%s\" found in \"%s\"", pattern, path)
- }
- return
- }
- }
- if inverseGrep {
- return
- }
- t.Fatalf("grepFile: pattern \"%s\" not found in \"%s\"", pattern, path)
- }
- func TestEscapeFstabSpaces(t *testing.T) {
- var testInputs = map[string]string{
- " ": "\\040",
- "": "",
- "/double space": "/double\\040\\040space",
- "/some long test string": "/some\\040long\\040test\\040string",
- "/var/lib/docker": "/var/lib/docker",
- " leading": "\\040leading",
- "trailing ": "trailing\\040",
- }
- for in, exp := range testInputs {
- if out := escapeFstabSpaces(in); exp != out {
- t.Logf("Expected %s got %s", exp, out)
- t.Fail()
- }
- }
- }
- func TestIsDirectory(t *testing.T) {
- tempDir, err := ioutil.TempDir("", "TestIsDir")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(tempDir)
- tempFile, err := ioutil.TempFile(tempDir, "TestIsDirFile")
- if err != nil {
- t.Fatal(err)
- }
- if isDirectory(tempDir) != "dir" {
- t.Logf("Could not identify %s as a directory", tempDir)
- t.Fail()
- }
- if isDirectory(tempFile.Name()) != "file" {
- t.Logf("Could not identify %s as a file", tempFile.Name())
- t.Fail()
- }
- }
- func TestCustomLxcConfigMounts(t *testing.T) {
- root, err := ioutil.TempDir("", "TestCustomLxcConfig")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(root)
- tempDir, err := ioutil.TempDir("", "TestIsDir")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(tempDir)
- tempFile, err := ioutil.TempFile(tempDir, "TestIsDirFile")
- if err != nil {
- t.Fatal(err)
- }
- os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- driver, err := NewDriver(root, "", false)
- if err != nil {
- t.Fatal(err)
- }
- processConfig := execdriver.ProcessConfig{
- Privileged: false,
- }
- mounts := []execdriver.Mount{
- {
- Source: tempDir,
- Destination: tempDir,
- Writable: false,
- Private: true,
- },
- {
- Source: tempFile.Name(),
- Destination: tempFile.Name(),
- Writable: true,
- Private: true,
- },
- }
- command := &execdriver.Command{
- ID: "1",
- LxcConfig: []string{
- "lxc.utsname = docker",
- "lxc.cgroup.cpuset.cpus = 0,1",
- },
- Network: &execdriver.Network{
- Mtu: 1500,
- Interface: nil,
- },
- Mounts: mounts,
- ProcessConfig: processConfig,
- }
- p, err := driver.generateLXCConfig(command)
- if err != nil {
- t.Fatal(err)
- }
- grepFile(t, p, "lxc.utsname = docker")
- grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
- grepFile(t, p, fmt.Sprintf("lxc.mount.entry = %s %s none rbind,ro,create=%s 0 0", tempDir, "/"+tempDir, "dir"))
- grepFile(t, p, fmt.Sprintf("lxc.mount.entry = %s %s none rbind,rw,create=%s 0 0", tempFile.Name(), "/"+tempFile.Name(), "file"))
- }
- func TestCustomLxcConfigMisc(t *testing.T) {
- root, err := ioutil.TempDir("", "TestCustomLxcConfig")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(root)
- os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- driver, err := NewDriver(root, "", false)
- if err != nil {
- t.Fatal(err)
- }
- processConfig := execdriver.ProcessConfig{
- Privileged: false,
- }
- processConfig.Env = []string{"HOSTNAME=testhost"}
- command := &execdriver.Command{
- ID: "1",
- LxcConfig: []string{
- "lxc.cgroup.cpuset.cpus = 0,1",
- },
- Network: &execdriver.Network{
- Mtu: 1500,
- Interface: &execdriver.NetworkInterface{
- Gateway: "10.10.10.1",
- IPAddress: "10.10.10.10",
- IPPrefixLen: 24,
- Bridge: "docker0",
- },
- },
- ProcessConfig: processConfig,
- CapAdd: []string{"net_admin", "syslog"},
- CapDrop: []string{"kill", "mknod"},
- }
- p, err := driver.generateLXCConfig(command)
- if err != nil {
- t.Fatal(err)
- }
- // network
- grepFile(t, p, "lxc.network.type = veth")
- grepFile(t, p, "lxc.network.link = docker0")
- grepFile(t, p, "lxc.network.name = eth0")
- grepFile(t, p, "lxc.network.ipv4 = 10.10.10.10/24")
- grepFile(t, p, "lxc.network.ipv4.gateway = 10.10.10.1")
- grepFile(t, p, "lxc.network.flags = up")
- // hostname
- grepFile(t, p, "lxc.utsname = testhost")
- grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
- container := nativeTemplate.New()
- for _, cap := range container.Capabilities {
- cap = strings.ToLower(cap)
- if cap != "mknod" && cap != "kill" {
- grepFile(t, p, fmt.Sprintf("lxc.cap.keep = %s", cap))
- }
- }
- grepFileWithReverse(t, p, fmt.Sprintf("lxc.cap.keep = kill"), true)
- grepFileWithReverse(t, p, fmt.Sprintf("lxc.cap.keep = mknod"), true)
- }
- func TestCustomLxcConfigMiscOverride(t *testing.T) {
- root, err := ioutil.TempDir("", "TestCustomLxcConfig")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(root)
- os.MkdirAll(path.Join(root, "containers", "1"), 0777)
- driver, err := NewDriver(root, "", false)
- if err != nil {
- t.Fatal(err)
- }
- processConfig := execdriver.ProcessConfig{
- Privileged: false,
- }
- processConfig.Env = []string{"HOSTNAME=testhost"}
- command := &execdriver.Command{
- ID: "1",
- LxcConfig: []string{
- "lxc.cgroup.cpuset.cpus = 0,1",
- "lxc.network.ipv4 = 172.0.0.1",
- },
- Network: &execdriver.Network{
- Mtu: 1500,
- Interface: &execdriver.NetworkInterface{
- Gateway: "10.10.10.1",
- IPAddress: "10.10.10.10",
- IPPrefixLen: 24,
- Bridge: "docker0",
- },
- },
- ProcessConfig: processConfig,
- CapAdd: []string{"net_admin", "syslog"},
- CapDrop: []string{"kill", "mknod"},
- }
- p, err := driver.generateLXCConfig(command)
- if err != nil {
- t.Fatal(err)
- }
- // network
- grepFile(t, p, "lxc.network.type = veth")
- grepFile(t, p, "lxc.network.link = docker0")
- grepFile(t, p, "lxc.network.name = eth0")
- grepFile(t, p, "lxc.network.ipv4 = 172.0.0.1")
- grepFile(t, p, "lxc.network.ipv4.gateway = 10.10.10.1")
- grepFile(t, p, "lxc.network.flags = up")
- // hostname
- grepFile(t, p, "lxc.utsname = testhost")
- grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
- container := nativeTemplate.New()
- for _, cap := range container.Capabilities {
- cap = strings.ToLower(cap)
- if cap != "mknod" && cap != "kill" {
- grepFile(t, p, fmt.Sprintf("lxc.cap.keep = %s", cap))
- }
- }
- grepFileWithReverse(t, p, fmt.Sprintf("lxc.cap.keep = kill"), true)
- grepFileWithReverse(t, p, fmt.Sprintf("lxc.cap.keep = mknod"), true)
- }
|