daemon_test.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package main
  2. import (
  3. "testing"
  4. "github.com/docker/docker/daemon/config"
  5. "github.com/sirupsen/logrus"
  6. "github.com/spf13/pflag"
  7. "gotest.tools/v3/assert"
  8. is "gotest.tools/v3/assert/cmp"
  9. "gotest.tools/v3/fs"
  10. )
  11. func defaultOptions(t *testing.T, configFile string) *daemonOptions {
  12. cfg, err := config.New()
  13. assert.NilError(t, err)
  14. opts := newDaemonOptions(cfg)
  15. opts.flags = &pflag.FlagSet{}
  16. opts.installFlags(opts.flags)
  17. err = installConfigFlags(opts.daemonConfig, opts.flags)
  18. assert.NilError(t, err)
  19. defaultDaemonConfigFile, err := getDefaultDaemonConfigFile()
  20. assert.NilError(t, err)
  21. opts.flags.StringVar(&opts.configFile, "config-file", defaultDaemonConfigFile, "")
  22. opts.configFile = configFile
  23. err = opts.flags.Parse([]string{})
  24. assert.NilError(t, err)
  25. return opts
  26. }
  27. func TestLoadDaemonCliConfigWithoutOverriding(t *testing.T) {
  28. opts := defaultOptions(t, "")
  29. opts.Debug = true
  30. loadedConfig, err := loadDaemonCliConfig(opts)
  31. assert.NilError(t, err)
  32. assert.Assert(t, loadedConfig != nil)
  33. if !loadedConfig.Debug {
  34. t.Fatalf("expected debug to be copied from the common flags, got false")
  35. }
  36. }
  37. func TestLoadDaemonCliConfigWithTLS(t *testing.T) {
  38. opts := defaultOptions(t, "")
  39. opts.TLSOptions.CAFile = "/tmp/ca.pem"
  40. opts.TLS = true
  41. loadedConfig, err := loadDaemonCliConfig(opts)
  42. assert.NilError(t, err)
  43. assert.Assert(t, loadedConfig != nil)
  44. assert.Check(t, is.Equal("/tmp/ca.pem", loadedConfig.TLSOptions.CAFile))
  45. }
  46. func TestLoadDaemonCliConfigWithConflicts(t *testing.T) {
  47. tempFile := fs.NewFile(t, "config", fs.WithContent(`{"labels": ["l3=foo"]}`))
  48. defer tempFile.Remove()
  49. configFile := tempFile.Path()
  50. opts := defaultOptions(t, configFile)
  51. flags := opts.flags
  52. assert.Check(t, flags.Set("config-file", configFile))
  53. assert.Check(t, flags.Set("label", "l1=bar"))
  54. assert.Check(t, flags.Set("label", "l2=baz"))
  55. _, err := loadDaemonCliConfig(opts)
  56. assert.Check(t, is.ErrorContains(err, "as a flag and in the configuration file: labels"))
  57. }
  58. func TestLoadDaemonCliWithConflictingNodeGenericResources(t *testing.T) {
  59. tempFile := fs.NewFile(t, "config", fs.WithContent(`{"node-generic-resources": ["foo=bar", "bar=baz"]}`))
  60. defer tempFile.Remove()
  61. configFile := tempFile.Path()
  62. opts := defaultOptions(t, configFile)
  63. flags := opts.flags
  64. assert.Check(t, flags.Set("config-file", configFile))
  65. assert.Check(t, flags.Set("node-generic-resource", "r1=bar"))
  66. assert.Check(t, flags.Set("node-generic-resource", "r2=baz"))
  67. _, err := loadDaemonCliConfig(opts)
  68. assert.Check(t, is.ErrorContains(err, "as a flag and in the configuration file: node-generic-resources"))
  69. }
  70. func TestLoadDaemonCliWithConflictingLabels(t *testing.T) {
  71. opts := defaultOptions(t, "")
  72. flags := opts.flags
  73. assert.Check(t, flags.Set("label", "foo=bar"))
  74. assert.Check(t, flags.Set("label", "foo=baz"))
  75. _, err := loadDaemonCliConfig(opts)
  76. assert.Check(t, is.Error(err, "conflict labels for foo=baz and foo=bar"))
  77. }
  78. func TestLoadDaemonCliWithDuplicateLabels(t *testing.T) {
  79. opts := defaultOptions(t, "")
  80. flags := opts.flags
  81. assert.Check(t, flags.Set("label", "foo=the-same"))
  82. assert.Check(t, flags.Set("label", "foo=the-same"))
  83. _, err := loadDaemonCliConfig(opts)
  84. assert.Check(t, err)
  85. }
  86. func TestLoadDaemonCliConfigWithTLSVerify(t *testing.T) {
  87. tempFile := fs.NewFile(t, "config", fs.WithContent(`{"tlsverify": true}`))
  88. defer tempFile.Remove()
  89. opts := defaultOptions(t, tempFile.Path())
  90. opts.TLSOptions.CAFile = "/tmp/ca.pem"
  91. loadedConfig, err := loadDaemonCliConfig(opts)
  92. assert.NilError(t, err)
  93. assert.Assert(t, loadedConfig != nil)
  94. assert.Check(t, is.Equal(*loadedConfig.TLS, true))
  95. }
  96. func TestLoadDaemonCliConfigWithExplicitTLSVerifyFalse(t *testing.T) {
  97. tempFile := fs.NewFile(t, "config", fs.WithContent(`{"tlsverify": false}`))
  98. defer tempFile.Remove()
  99. opts := defaultOptions(t, tempFile.Path())
  100. opts.TLSOptions.CAFile = "/tmp/ca.pem"
  101. loadedConfig, err := loadDaemonCliConfig(opts)
  102. assert.NilError(t, err)
  103. assert.Assert(t, loadedConfig != nil)
  104. assert.Check(t, *loadedConfig.TLS)
  105. }
  106. func TestLoadDaemonCliConfigWithoutTLSVerify(t *testing.T) {
  107. tempFile := fs.NewFile(t, "config", fs.WithContent(`{}`))
  108. defer tempFile.Remove()
  109. opts := defaultOptions(t, tempFile.Path())
  110. opts.TLSOptions.CAFile = "/tmp/ca.pem"
  111. loadedConfig, err := loadDaemonCliConfig(opts)
  112. assert.NilError(t, err)
  113. assert.Assert(t, loadedConfig != nil)
  114. assert.Check(t, loadedConfig.TLS == nil)
  115. }
  116. func TestLoadDaemonCliConfigWithLogLevel(t *testing.T) {
  117. tempFile := fs.NewFile(t, "config", fs.WithContent(`{"log-level": "warn"}`))
  118. defer tempFile.Remove()
  119. opts := defaultOptions(t, tempFile.Path())
  120. loadedConfig, err := loadDaemonCliConfig(opts)
  121. assert.NilError(t, err)
  122. assert.Assert(t, loadedConfig != nil)
  123. assert.Check(t, is.Equal("warn", loadedConfig.LogLevel))
  124. }
  125. func TestLoadDaemonConfigWithEmbeddedOptions(t *testing.T) {
  126. content := `{"tlscacert": "/etc/certs/ca.pem", "log-driver": "syslog"}`
  127. tempFile := fs.NewFile(t, "config", fs.WithContent(content))
  128. defer tempFile.Remove()
  129. opts := defaultOptions(t, tempFile.Path())
  130. loadedConfig, err := loadDaemonCliConfig(opts)
  131. assert.NilError(t, err)
  132. assert.Assert(t, loadedConfig != nil)
  133. assert.Check(t, is.Equal("/etc/certs/ca.pem", loadedConfig.TLSOptions.CAFile))
  134. assert.Check(t, is.Equal("syslog", loadedConfig.LogConfig.Type))
  135. }
  136. func TestLoadDaemonConfigWithRegistryOptions(t *testing.T) {
  137. content := `{
  138. "allow-nondistributable-artifacts": ["allow-nondistributable-artifacts.example.com"],
  139. "registry-mirrors": ["https://mirrors.example.com"],
  140. "insecure-registries": ["https://insecure-registry.example.com"]
  141. }`
  142. tempFile := fs.NewFile(t, "config", fs.WithContent(content))
  143. defer tempFile.Remove()
  144. opts := defaultOptions(t, tempFile.Path())
  145. loadedConfig, err := loadDaemonCliConfig(opts)
  146. assert.NilError(t, err)
  147. assert.Assert(t, loadedConfig != nil)
  148. assert.Check(t, is.Len(loadedConfig.AllowNondistributableArtifacts, 1))
  149. assert.Check(t, is.Len(loadedConfig.Mirrors, 1))
  150. assert.Check(t, is.Len(loadedConfig.InsecureRegistries, 1))
  151. }
  152. func TestConfigureDaemonLogs(t *testing.T) {
  153. conf := &config.Config{}
  154. configureDaemonLogs(conf)
  155. assert.Check(t, is.Equal(logrus.InfoLevel, logrus.GetLevel()))
  156. conf.LogLevel = "warn"
  157. configureDaemonLogs(conf)
  158. assert.Check(t, is.Equal(logrus.WarnLevel, logrus.GetLevel()))
  159. // log level should not be changed when passing an invalid value
  160. conf.LogLevel = "foobar"
  161. configureDaemonLogs(conf)
  162. assert.Check(t, is.Equal(logrus.WarnLevel, logrus.GetLevel()))
  163. }