daemon_test.go 5.7 KB

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