lxc_template_unit_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. // +build linux
  2. package lxc
  3. import (
  4. "bufio"
  5. "fmt"
  6. "io/ioutil"
  7. "math/rand"
  8. "os"
  9. "path"
  10. "strings"
  11. "testing"
  12. "time"
  13. "github.com/docker/docker/daemon/execdriver"
  14. "github.com/docker/libcontainer/devices"
  15. )
  16. func TestLXCConfig(t *testing.T) {
  17. root, err := ioutil.TempDir("", "TestLXCConfig")
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. defer os.RemoveAll(root)
  22. os.MkdirAll(path.Join(root, "containers", "1"), 0777)
  23. // Memory is allocated randomly for testing
  24. rand.Seed(time.Now().UTC().UnixNano())
  25. var (
  26. memMin = 33554432
  27. memMax = 536870912
  28. mem = memMin + rand.Intn(memMax-memMin)
  29. cpuMin = 100
  30. cpuMax = 10000
  31. cpu = cpuMin + rand.Intn(cpuMax-cpuMin)
  32. )
  33. driver, err := NewDriver(root, "", false)
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. command := &execdriver.Command{
  38. ID: "1",
  39. Resources: &execdriver.Resources{
  40. Memory: int64(mem),
  41. CpuShares: int64(cpu),
  42. },
  43. Network: &execdriver.Network{
  44. Mtu: 1500,
  45. Interface: nil,
  46. },
  47. AllowedDevices: make([]*devices.Device, 0),
  48. ProcessConfig: execdriver.ProcessConfig{},
  49. }
  50. p, err := driver.generateLXCConfig(command)
  51. if err != nil {
  52. t.Fatal(err)
  53. }
  54. grepFile(t, p,
  55. fmt.Sprintf("lxc.cgroup.memory.limit_in_bytes = %d", mem))
  56. grepFile(t, p,
  57. fmt.Sprintf("lxc.cgroup.memory.memsw.limit_in_bytes = %d", mem*2))
  58. }
  59. func TestCustomLxcConfig(t *testing.T) {
  60. root, err := ioutil.TempDir("", "TestCustomLxcConfig")
  61. if err != nil {
  62. t.Fatal(err)
  63. }
  64. defer os.RemoveAll(root)
  65. os.MkdirAll(path.Join(root, "containers", "1"), 0777)
  66. driver, err := NewDriver(root, "", false)
  67. if err != nil {
  68. t.Fatal(err)
  69. }
  70. processConfig := execdriver.ProcessConfig{
  71. Privileged: false,
  72. }
  73. command := &execdriver.Command{
  74. ID: "1",
  75. LxcConfig: []string{
  76. "lxc.utsname = docker",
  77. "lxc.cgroup.cpuset.cpus = 0,1",
  78. },
  79. Network: &execdriver.Network{
  80. Mtu: 1500,
  81. Interface: nil,
  82. },
  83. ProcessConfig: processConfig,
  84. }
  85. p, err := driver.generateLXCConfig(command)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. grepFile(t, p, "lxc.utsname = docker")
  90. grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
  91. }
  92. func grepFile(t *testing.T, path string, pattern string) {
  93. f, err := os.Open(path)
  94. if err != nil {
  95. t.Fatal(err)
  96. }
  97. defer f.Close()
  98. r := bufio.NewReader(f)
  99. var (
  100. line string
  101. )
  102. err = nil
  103. for err == nil {
  104. line, err = r.ReadString('\n')
  105. if strings.Contains(line, pattern) == true {
  106. return
  107. }
  108. }
  109. t.Fatalf("grepFile: pattern \"%s\" not found in \"%s\"", pattern, path)
  110. }
  111. func TestEscapeFstabSpaces(t *testing.T) {
  112. var testInputs = map[string]string{
  113. " ": "\\040",
  114. "": "",
  115. "/double space": "/double\\040\\040space",
  116. "/some long test string": "/some\\040long\\040test\\040string",
  117. "/var/lib/docker": "/var/lib/docker",
  118. " leading": "\\040leading",
  119. "trailing ": "trailing\\040",
  120. }
  121. for in, exp := range testInputs {
  122. if out := escapeFstabSpaces(in); exp != out {
  123. t.Logf("Expected %s got %s", exp, out)
  124. t.Fail()
  125. }
  126. }
  127. }
  128. func TestIsDirectory(t *testing.T) {
  129. tempDir, err := ioutil.TempDir("", "TestIsDir")
  130. if err != nil {
  131. t.Fatal(err)
  132. }
  133. defer os.RemoveAll(tempDir)
  134. tempFile, err := ioutil.TempFile(tempDir, "TestIsDirFile")
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. if isDirectory(tempDir) != "dir" {
  139. t.Logf("Could not identify %s as a directory", tempDir)
  140. t.Fail()
  141. }
  142. if isDirectory(tempFile.Name()) != "file" {
  143. t.Logf("Could not identify %s as a file", tempFile.Name())
  144. t.Fail()
  145. }
  146. }
  147. func TestCustomLxcConfigMounts(t *testing.T) {
  148. root, err := ioutil.TempDir("", "TestCustomLxcConfig")
  149. if err != nil {
  150. t.Fatal(err)
  151. }
  152. defer os.RemoveAll(root)
  153. tempDir, err := ioutil.TempDir("", "TestIsDir")
  154. if err != nil {
  155. t.Fatal(err)
  156. }
  157. defer os.RemoveAll(tempDir)
  158. tempFile, err := ioutil.TempFile(tempDir, "TestIsDirFile")
  159. if err != nil {
  160. t.Fatal(err)
  161. }
  162. os.MkdirAll(path.Join(root, "containers", "1"), 0777)
  163. driver, err := NewDriver(root, "", false)
  164. if err != nil {
  165. t.Fatal(err)
  166. }
  167. processConfig := execdriver.ProcessConfig{
  168. Privileged: false,
  169. }
  170. mounts := []execdriver.Mount{
  171. {
  172. Source: tempDir,
  173. Destination: tempDir,
  174. Writable: false,
  175. Private: true,
  176. },
  177. {
  178. Source: tempFile.Name(),
  179. Destination: tempFile.Name(),
  180. Writable: true,
  181. Private: true,
  182. },
  183. }
  184. command := &execdriver.Command{
  185. ID: "1",
  186. LxcConfig: []string{
  187. "lxc.utsname = docker",
  188. "lxc.cgroup.cpuset.cpus = 0,1",
  189. },
  190. Network: &execdriver.Network{
  191. Mtu: 1500,
  192. Interface: nil,
  193. },
  194. Mounts: mounts,
  195. ProcessConfig: processConfig,
  196. }
  197. p, err := driver.generateLXCConfig(command)
  198. if err != nil {
  199. t.Fatal(err)
  200. }
  201. grepFile(t, p, "lxc.utsname = docker")
  202. grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
  203. grepFile(t, p, fmt.Sprintf("lxc.mount.entry = %s %s none rbind,ro,create=%s 0 0", tempDir, "/"+tempDir, "dir"))
  204. grepFile(t, p, fmt.Sprintf("lxc.mount.entry = %s %s none rbind,rw,create=%s 0 0", tempFile.Name(), "/"+tempFile.Name(), "file"))
  205. }