agent: use mapstructure's Metadata.Unused to detect extraneous config

This commit is contained in:
Ryan Uber 2015-01-05 14:41:19 -08:00
parent b8740b62da
commit 42ace3a6b5

View File

@ -335,13 +335,6 @@ type Config struct {
// WatchPlans contains the compiled watches // WatchPlans contains the compiled watches
WatchPlans []*watch.WatchPlan `mapstructure:"-" json:"-"` WatchPlans []*watch.WatchPlan `mapstructure:"-" json:"-"`
// Allow the following fields to be present in configuration files without
// mapstructure erroring on them.
_ interface{} `mapstructure:"services"`
_ interface{} `mapstructure:"checks"`
_ interface{} `mapstructure:"service"`
_ interface{} `mapstructure:"check"`
} }
type dirEnts []os.FileInfo type dirEnts []os.FileInfo
@ -470,9 +463,8 @@ func DecodeConfig(r io.Reader) (*Config, error) {
// Decode // Decode
var md mapstructure.Metadata var md mapstructure.Metadata
msdec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ msdec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
Metadata: &md, Metadata: &md,
Result: &result, Result: &result,
ErrorUnused: true,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@ -482,6 +474,20 @@ func DecodeConfig(r io.Reader) (*Config, error) {
return nil, err return nil, err
} }
// Check unused fields and verify that no bad configuration options were
// passed to Consul. There are a few additional fields which don't directly
// use mapstructure decoding, so we need to account for those as well.
allowedKeys := []string{"service", "services", "check", "checks"}
var unused []string
for _, field := range md.Unused {
if !strContains(allowedKeys, field) {
unused = append(unused, field)
}
}
if len(unused) > 0 {
return nil, fmt.Errorf("Config has invalid keys: %s", strings.Join(unused, ","))
}
// Handle time conversions // Handle time conversions
if raw := result.DNSConfig.NodeTTLRaw; raw != "" { if raw := result.DNSConfig.NodeTTLRaw; raw != "" {
dur, err := time.ParseDuration(raw) dur, err := time.ParseDuration(raw)