config_test.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package daemon
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "strings"
  6. "testing"
  7. "github.com/docker/docker/opts"
  8. "github.com/docker/docker/pkg/mflag"
  9. )
  10. func TestDaemonConfigurationMerge(t *testing.T) {
  11. f, err := ioutil.TempFile("", "docker-config-")
  12. if err != nil {
  13. t.Fatal(err)
  14. }
  15. configFile := f.Name()
  16. f.Write([]byte(`{"debug": true}`))
  17. f.Close()
  18. c := &Config{
  19. CommonConfig: CommonConfig{
  20. AutoRestart: true,
  21. LogConfig: LogConfig{
  22. Type: "syslog",
  23. Config: map[string]string{"tag": "test"},
  24. },
  25. },
  26. }
  27. cc, err := MergeDaemonConfigurations(c, nil, configFile)
  28. if err != nil {
  29. t.Fatal(err)
  30. }
  31. if !cc.Debug {
  32. t.Fatalf("expected %v, got %v\n", true, cc.Debug)
  33. }
  34. if !cc.AutoRestart {
  35. t.Fatalf("expected %v, got %v\n", true, cc.AutoRestart)
  36. }
  37. if cc.LogConfig.Type != "syslog" {
  38. t.Fatalf("expected syslog config, got %q\n", cc.LogConfig)
  39. }
  40. }
  41. func TestDaemonConfigurationNotFound(t *testing.T) {
  42. _, err := MergeDaemonConfigurations(&Config{}, nil, "/tmp/foo-bar-baz-docker")
  43. if err == nil || !os.IsNotExist(err) {
  44. t.Fatalf("expected does not exist error, got %v", err)
  45. }
  46. }
  47. func TestDaemonBrokenConfiguration(t *testing.T) {
  48. f, err := ioutil.TempFile("", "docker-config-")
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. configFile := f.Name()
  53. f.Write([]byte(`{"Debug": tru`))
  54. f.Close()
  55. _, err = MergeDaemonConfigurations(&Config{}, nil, configFile)
  56. if err == nil {
  57. t.Fatalf("expected error, got %v", err)
  58. }
  59. }
  60. func TestParseClusterAdvertiseSettings(t *testing.T) {
  61. _, err := parseClusterAdvertiseSettings("something", "")
  62. if err != errDiscoveryDisabled {
  63. t.Fatalf("expected discovery disabled error, got %v\n", err)
  64. }
  65. _, err = parseClusterAdvertiseSettings("", "something")
  66. if err == nil {
  67. t.Fatalf("expected discovery store error, got %v\n", err)
  68. }
  69. _, err = parseClusterAdvertiseSettings("etcd", "127.0.0.1:8080")
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. }
  74. func TestFindConfigurationConflicts(t *testing.T) {
  75. config := map[string]interface{}{"authorization-plugins": "foobar"}
  76. flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
  77. flags.String([]string{"-authorization-plugins"}, "", "")
  78. if err := flags.Set("-authorization-plugins", "asdf"); err != nil {
  79. t.Fatal(err)
  80. }
  81. err := findConfigurationConflicts(config, flags)
  82. if err == nil {
  83. t.Fatal("expected error, got nil")
  84. }
  85. if !strings.Contains(err.Error(), "authorization-plugins: (from flag: asdf, from file: foobar)") {
  86. t.Fatalf("expected authorization-plugins conflict, got %v", err)
  87. }
  88. }
  89. func TestFindConfigurationConflictsWithNamedOptions(t *testing.T) {
  90. config := map[string]interface{}{"hosts": []string{"qwer"}}
  91. flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
  92. var hosts []string
  93. flags.Var(opts.NewNamedListOptsRef("hosts", &hosts, opts.ValidateHost), []string{"H", "-host"}, "Daemon socket(s) to connect to")
  94. if err := flags.Set("-host", "tcp://127.0.0.1:4444"); err != nil {
  95. t.Fatal(err)
  96. }
  97. if err := flags.Set("H", "unix:///var/run/docker.sock"); err != nil {
  98. t.Fatal(err)
  99. }
  100. err := findConfigurationConflicts(config, flags)
  101. if err == nil {
  102. t.Fatal("expected error, got nil")
  103. }
  104. if !strings.Contains(err.Error(), "hosts") {
  105. t.Fatalf("expected hosts conflict, got %v", err)
  106. }
  107. }
  108. func TestDaemonConfigurationMergeConflicts(t *testing.T) {
  109. f, err := ioutil.TempFile("", "docker-config-")
  110. if err != nil {
  111. t.Fatal(err)
  112. }
  113. configFile := f.Name()
  114. f.Write([]byte(`{"debug": true}`))
  115. f.Close()
  116. flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
  117. flags.Bool([]string{"debug"}, false, "")
  118. flags.Set("debug", "false")
  119. _, err = MergeDaemonConfigurations(&Config{}, flags, configFile)
  120. if err == nil {
  121. t.Fatal("expected error, got nil")
  122. }
  123. if !strings.Contains(err.Error(), "debug") {
  124. t.Fatalf("expected debug conflict, got %v", err)
  125. }
  126. }
  127. func TestDaemonConfigurationMergeConflictsWithInnerStructs(t *testing.T) {
  128. f, err := ioutil.TempFile("", "docker-config-")
  129. if err != nil {
  130. t.Fatal(err)
  131. }
  132. configFile := f.Name()
  133. f.Write([]byte(`{"tlscacert": "/etc/certificates/ca.pem"}`))
  134. f.Close()
  135. flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
  136. flags.String([]string{"tlscacert"}, "", "")
  137. flags.Set("tlscacert", "~/.docker/ca.pem")
  138. _, err = MergeDaemonConfigurations(&Config{}, flags, configFile)
  139. if err == nil {
  140. t.Fatal("expected error, got nil")
  141. }
  142. if !strings.Contains(err.Error(), "tlscacert") {
  143. t.Fatalf("expected tlscacert conflict, got %v", err)
  144. }
  145. }
  146. func TestFindConfigurationConflictsWithUnknownKeys(t *testing.T) {
  147. config := map[string]interface{}{"tls-verify": "true"}
  148. flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
  149. flags.Bool([]string{"-tlsverify"}, false, "")
  150. err := findConfigurationConflicts(config, flags)
  151. if err == nil {
  152. t.Fatal("expected error, got nil")
  153. }
  154. if !strings.Contains(err.Error(), "the following directives don't match any configuration option: tls-verify") {
  155. t.Fatalf("expected tls-verify conflict, got %v", err)
  156. }
  157. }
  158. func TestFindConfigurationConflictsWithMergedValues(t *testing.T) {
  159. var hosts []string
  160. config := map[string]interface{}{"hosts": "tcp://127.0.0.1:2345"}
  161. base := mflag.NewFlagSet("base", mflag.ContinueOnError)
  162. base.Var(opts.NewNamedListOptsRef("hosts", &hosts, nil), []string{"H", "-host"}, "")
  163. flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
  164. mflag.Merge(flags, base)
  165. err := findConfigurationConflicts(config, flags)
  166. if err != nil {
  167. t.Fatal(err)
  168. }
  169. flags.Set("-host", "unix:///var/run/docker.sock")
  170. err = findConfigurationConflicts(config, flags)
  171. if err == nil {
  172. t.Fatal("expected error, got nil")
  173. }
  174. if !strings.Contains(err.Error(), "hosts: (from flag: [unix:///var/run/docker.sock], from file: tcp://127.0.0.1:2345)") {
  175. t.Fatalf("expected hosts conflict, got %v", err)
  176. }
  177. }
  178. func TestValidateConfiguration(t *testing.T) {
  179. c1 := &Config{
  180. CommonConfig: CommonConfig{
  181. Labels: []string{"one"},
  182. },
  183. }
  184. err := ValidateConfiguration(c1)
  185. if err == nil {
  186. t.Fatal("expected error, got nil")
  187. }
  188. c2 := &Config{
  189. CommonConfig: CommonConfig{
  190. Labels: []string{"one=two"},
  191. },
  192. }
  193. err = ValidateConfiguration(c2)
  194. if err != nil {
  195. t.Fatalf("expected no error, got error %v", err)
  196. }
  197. c3 := &Config{
  198. CommonConfig: CommonConfig{
  199. DNS: []string{"1.1.1.1"},
  200. },
  201. }
  202. err = ValidateConfiguration(c3)
  203. if err != nil {
  204. t.Fatalf("expected no error, got error %v", err)
  205. }
  206. c4 := &Config{
  207. CommonConfig: CommonConfig{
  208. DNS: []string{"1.1.1.1o"},
  209. },
  210. }
  211. err = ValidateConfiguration(c4)
  212. if err == nil {
  213. t.Fatal("expected error, got nil")
  214. }
  215. c5 := &Config{
  216. CommonConfig: CommonConfig{
  217. DNSSearch: []string{"a.b.c"},
  218. },
  219. }
  220. err = ValidateConfiguration(c5)
  221. if err != nil {
  222. t.Fatalf("expected no error, got error %v", err)
  223. }
  224. c6 := &Config{
  225. CommonConfig: CommonConfig{
  226. DNSSearch: []string{"123456"},
  227. },
  228. }
  229. err = ValidateConfiguration(c6)
  230. if err == nil {
  231. t.Fatal("expected error, got nil")
  232. }
  233. }