That way the configuration file becomes flag, without extra keys.
Signed-off-by: David Calavera <david.calavera@gmail.com>
| ... | ... |
@@ -56,7 +56,6 @@ type CommonConfig struct {
|
| 56 | 56 |
GraphDriver string `json:"storage-driver,omitempty"` |
| 57 | 57 |
GraphOptions []string `json:"storage-opts,omitempty"` |
| 58 | 58 |
Labels []string `json:"labels,omitempty"` |
| 59 |
- LogConfig LogConfig `json:"log-config,omitempty"` |
|
| 60 | 59 |
Mtu int `json:"mtu,omitempty"` |
| 61 | 60 |
Pidfile string `json:"pidfile,omitempty"` |
| 62 | 61 |
Root string `json:"graph,omitempty"` |
| ... | ... |
@@ -76,12 +75,16 @@ type CommonConfig struct {
|
| 76 | 76 |
// reachable by other hosts. |
| 77 | 77 |
ClusterAdvertise string `json:"cluster-advertise,omitempty"` |
| 78 | 78 |
|
| 79 |
- Debug bool `json:"debug,omitempty"` |
|
| 80 |
- Hosts []string `json:"hosts,omitempty"` |
|
| 81 |
- LogLevel string `json:"log-level,omitempty"` |
|
| 82 |
- TLS bool `json:"tls,omitempty"` |
|
| 83 |
- TLSVerify bool `json:"tlsverify,omitempty"` |
|
| 84 |
- TLSOptions CommonTLSOptions `json:"tls-opts,omitempty"` |
|
| 79 |
+ Debug bool `json:"debug,omitempty"` |
|
| 80 |
+ Hosts []string `json:"hosts,omitempty"` |
|
| 81 |
+ LogLevel string `json:"log-level,omitempty"` |
|
| 82 |
+ TLS bool `json:"tls,omitempty"` |
|
| 83 |
+ TLSVerify bool `json:"tlsverify,omitempty"` |
|
| 84 |
+ |
|
| 85 |
+ // Embedded structs that allow config |
|
| 86 |
+ // deserialization without the full struct. |
|
| 87 |
+ CommonTLSOptions |
|
| 88 |
+ LogConfig |
|
| 85 | 89 |
|
| 86 | 90 |
reloadLock sync.Mutex |
| 87 | 91 |
valuesSet map[string]interface{}
|
| ... | ... |
@@ -227,7 +230,8 @@ func findConfigurationConflicts(config map[string]interface{}, flags *flag.FlagS
|
| 227 | 227 |
} |
| 228 | 228 |
} |
| 229 | 229 |
|
| 230 |
- // 2. Discard keys that might have a given name, like `labels`. |
|
| 230 |
+ // 2. Discard values that implement NamedOption. |
|
| 231 |
+ // Their configuration name differs from their flag name, like `labels` and `label`. |
|
| 231 | 232 |
unknownNamedConflicts := func(f *flag.Flag) {
|
| 232 | 233 |
if namedOption, ok := f.Value.(opts.NamedOption); ok {
|
| 233 | 234 |
if _, valid := unknownKeys[namedOption.Name()]; valid {
|
| ... | ... |
@@ -204,9 +204,9 @@ func (cli *DaemonCli) CmdDaemon(args ...string) error {
|
| 204 | 204 |
defaultHost := opts.DefaultHost |
| 205 | 205 |
if cli.Config.TLS {
|
| 206 | 206 |
tlsOptions := tlsconfig.Options{
|
| 207 |
- CAFile: cli.Config.TLSOptions.CAFile, |
|
| 208 |
- CertFile: cli.Config.TLSOptions.CertFile, |
|
| 209 |
- KeyFile: cli.Config.TLSOptions.KeyFile, |
|
| 207 |
+ CAFile: cli.Config.CommonTLSOptions.CAFile, |
|
| 208 |
+ CertFile: cli.Config.CommonTLSOptions.CertFile, |
|
| 209 |
+ KeyFile: cli.Config.CommonTLSOptions.KeyFile, |
|
| 210 | 210 |
} |
| 211 | 211 |
|
| 212 | 212 |
if cli.Config.TLSVerify {
|
| ... | ... |
@@ -338,12 +338,12 @@ func loadDaemonCliConfig(config *daemon.Config, daemonFlags *flag.FlagSet, commo |
| 338 | 338 |
config.LogLevel = commonConfig.LogLevel |
| 339 | 339 |
config.TLS = commonConfig.TLS |
| 340 | 340 |
config.TLSVerify = commonConfig.TLSVerify |
| 341 |
- config.TLSOptions = daemon.CommonTLSOptions{}
|
|
| 341 |
+ config.CommonTLSOptions = daemon.CommonTLSOptions{}
|
|
| 342 | 342 |
|
| 343 | 343 |
if commonConfig.TLSOptions != nil {
|
| 344 |
- config.TLSOptions.CAFile = commonConfig.TLSOptions.CAFile |
|
| 345 |
- config.TLSOptions.CertFile = commonConfig.TLSOptions.CertFile |
|
| 346 |
- config.TLSOptions.KeyFile = commonConfig.TLSOptions.KeyFile |
|
| 344 |
+ config.CommonTLSOptions.CAFile = commonConfig.TLSOptions.CAFile |
|
| 345 |
+ config.CommonTLSOptions.CertFile = commonConfig.TLSOptions.CertFile |
|
| 346 |
+ config.CommonTLSOptions.KeyFile = commonConfig.TLSOptions.KeyFile |
|
| 347 | 347 |
} |
| 348 | 348 |
|
| 349 | 349 |
if configFile != "" {
|
| ... | ... |
@@ -51,8 +51,8 @@ func TestLoadDaemonCliConfigWithTLS(t *testing.T) {
|
| 51 | 51 |
if loadedConfig == nil {
|
| 52 | 52 |
t.Fatalf("expected configuration %v, got nil", c)
|
| 53 | 53 |
} |
| 54 |
- if loadedConfig.TLSOptions.CAFile != "/tmp/ca.pem" {
|
|
| 55 |
- t.Fatalf("expected /tmp/ca.pem, got %s: %q", loadedConfig.TLSOptions.CAFile, loadedConfig)
|
|
| 54 |
+ if loadedConfig.CommonTLSOptions.CAFile != "/tmp/ca.pem" {
|
|
| 55 |
+ t.Fatalf("expected /tmp/ca.pem, got %s: %q", loadedConfig.CommonTLSOptions.CAFile, loadedConfig)
|
|
| 56 | 56 |
} |
| 57 | 57 |
} |
| 58 | 58 |
|
| ... | ... |
@@ -217,9 +217,12 @@ func TestLoadDaemonCliConfigWithLogLevel(t *testing.T) {
|
| 217 | 217 |
} |
| 218 | 218 |
} |
| 219 | 219 |
|
| 220 |
-func TestLoadDaemonCliConfigWithTLSOptions(t *testing.T) {
|
|
| 220 |
+func TestLoadDaemonConfigWithEmbeddedOptions(t *testing.T) {
|
|
| 221 | 221 |
c := &daemon.Config{}
|
| 222 | 222 |
common := &cli.CommonFlags{}
|
| 223 |
+ flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
|
|
| 224 |
+ flags.String([]string{"-tlscacert"}, "", "")
|
|
| 225 |
+ flags.String([]string{"-log-driver"}, "", "")
|
|
| 223 | 226 |
|
| 224 | 227 |
f, err := ioutil.TempFile("", "docker-config-")
|
| 225 | 228 |
if err != nil {
|
| ... | ... |
@@ -227,11 +230,9 @@ func TestLoadDaemonCliConfigWithTLSOptions(t *testing.T) {
|
| 227 | 227 |
} |
| 228 | 228 |
|
| 229 | 229 |
configFile := f.Name() |
| 230 |
- f.Write([]byte(`{"tls-opts": {"tlscacert": "/etc/certs/ca.pem"}}`))
|
|
| 230 |
+ f.Write([]byte(`{"tlscacert": "/etc/certs/ca.pem", "log-driver": "syslog"}`))
|
|
| 231 | 231 |
f.Close() |
| 232 | 232 |
|
| 233 |
- flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
|
|
| 234 |
- flags.String([]string{"-tlscacert"}, "", "")
|
|
| 235 | 233 |
loadedConfig, err := loadDaemonCliConfig(c, flags, common, configFile) |
| 236 | 234 |
if err != nil {
|
| 237 | 235 |
t.Fatal(err) |
| ... | ... |
@@ -239,7 +240,10 @@ func TestLoadDaemonCliConfigWithTLSOptions(t *testing.T) {
|
| 239 | 239 |
if loadedConfig == nil {
|
| 240 | 240 |
t.Fatalf("expected configuration %v, got nil", c)
|
| 241 | 241 |
} |
| 242 |
- if loadedConfig.TLSOptions.CAFile != "/etc/certs/ca.pem" {
|
|
| 243 |
- t.Fatalf("expected CA file path /etc/certs/ca.pem, got %v", loadedConfig.TLSOptions.CAFile)
|
|
| 242 |
+ if loadedConfig.CommonTLSOptions.CAFile != "/etc/certs/ca.pem" {
|
|
| 243 |
+ t.Fatalf("expected CA file path /etc/certs/ca.pem, got %v", loadedConfig.CommonTLSOptions.CAFile)
|
|
| 244 |
+ } |
|
| 245 |
+ if loadedConfig.LogConfig.Type != "syslog" {
|
|
| 246 |
+ t.Fatalf("expected LogConfig type syslog, got %v", loadedConfig.LogConfig.Type)
|
|
| 244 | 247 |
} |
| 245 | 248 |
} |
| ... | ... |
@@ -838,10 +838,8 @@ This is a full example of the allowed configuration options in the file: |
| 838 | 838 |
"storage-driver": "", |
| 839 | 839 |
"storage-opts": "", |
| 840 | 840 |
"labels": [], |
| 841 |
- "log-config": {
|
|
| 842 |
- "log-driver": "", |
|
| 843 |
- "log-opts": [] |
|
| 844 |
- }, |
|
| 841 |
+ "log-driver": "", |
|
| 842 |
+ "log-opts": [], |
|
| 845 | 843 |
"mtu": 0, |
| 846 | 844 |
"pidfile": "", |
| 847 | 845 |
"graph": "", |
| ... | ... |
@@ -853,11 +851,9 @@ This is a full example of the allowed configuration options in the file: |
| 853 | 853 |
"log-level": "", |
| 854 | 854 |
"tls": true, |
| 855 | 855 |
"tlsverify": true, |
| 856 |
- "tls-opts": {
|
|
| 857 |
- "tlscacert": "", |
|
| 858 |
- "tlscert": "", |
|
| 859 |
- "tlskey": "" |
|
| 860 |
- }, |
|
| 856 |
+ "tlscacert": "", |
|
| 857 |
+ "tlscert": "", |
|
| 858 |
+ "tlskey": "", |
|
| 861 | 859 |
"api-cors-headers": "", |
| 862 | 860 |
"selinux-enabled": false, |
| 863 | 861 |
"userns-remap": "", |