// ParseFile loads a TOML configuration from a provided path and returns the // AST produced from the TOML parser. This function was originally provided by naoina/toml func ParseFile(fpath string) (*ast.Table, error) { contents, err := ioutil.ReadFile(fpath) if err != nil { return nil, err } return toml.Parse(contents) }
// LoadConfig loads the given config file and returns a *Config pointer func LoadConfig(path string) (*Config, error) { data, err := ioutil.ReadFile(path) if err != nil { return nil, err } tbl, err := toml.Parse(data) if err != nil { return nil, err } c := &Config{ Tags: make(map[string]string), plugins: make(map[string]plugins.Plugin), pluginConfigurations: make(map[string]*ConfiguredPlugin), outputs: make(map[string]outputs.Output), pluginFieldsSet: make(map[string][]string), pluginConfigurationFieldsSet: make(map[string][]string), outputFieldsSet: make(map[string][]string), } for name, val := range tbl.Fields { subtbl, ok := val.(*ast.Table) if !ok { return nil, errors.New("invalid configuration") } switch name { case "agent": err := c.parseAgent(subtbl) if err != nil { return nil, err } case "tags": if err = toml.UnmarshalTable(subtbl, c.Tags); err != nil { return nil, err } case "outputs": for outputName, outputVal := range subtbl.Fields { outputSubtbl, ok := outputVal.(*ast.Table) if !ok { return nil, err } err = c.parseOutput(outputName, outputSubtbl) if err != nil { return nil, err } } default: err = c.parsePlugin(name, subtbl) if err != nil { return nil, err } } } return c, nil }
func TestConfig_parsePlugin(t *testing.T) { data, err := ioutil.ReadFile("./testdata/single_plugin.toml") if err != nil { t.Error(err) } tbl, err := toml.Parse(data) if err != nil { t.Error(err) } c := &Config{ plugins: make(map[string]plugins.Plugin), pluginConfigurations: make(map[string]*ConfiguredPlugin), pluginFieldsSet: make(map[string][]string), pluginConfigurationFieldsSet: make(map[string][]string), } subtbl := tbl.Fields["kafka"].(*ast.Table) err = c.parsePlugin("kafka", subtbl) kafka := plugins.Plugins["kafka"]().(*kafka_consumer.Kafka) kafka.ConsumerGroupName = "telegraf_metrics_consumers" kafka.Topic = "topic_with_metrics" kafka.ZookeeperPeers = []string{"test.example.com:2181"} kafka.BatchSize = 1000 kConfig := &ConfiguredPlugin{ Name: "kafka", Drop: []string{"other", "stuff"}, Pass: []string{"some", "strings"}, TagDrop: []TagFilter{ TagFilter{ Name: "badtag", Filter: []string{"othertag"}, }, }, TagPass: []TagFilter{ TagFilter{ Name: "goodtag", Filter: []string{"mytag"}, }, }, Interval: 5 * time.Second, } assert.Equal(t, kafka, c.plugins["kafka"], "Testdata did not produce a correct kafka struct.") assert.Equal(t, kConfig, c.pluginConfigurations["kafka"], "Testdata did not produce correct kafka metadata.") }
func TestConfig_parsePlugin(t *testing.T) { data, err := ioutil.ReadFile("./testdata/single_plugin.toml") if err != nil { t.Error(err) } tbl, err := toml.Parse(data) if err != nil { t.Error(err) } c := &Config{ plugins: make(map[string]plugins.Plugin), pluginConfigurations: make(map[string]*ConfiguredPlugin), pluginFieldsSet: make(map[string][]string), pluginConfigurationFieldsSet: make(map[string][]string), } subtbl := tbl.Fields["memcached"].(*ast.Table) err = c.parsePlugin("memcached", subtbl) memcached := plugins.Plugins["memcached"]().(*memcached.Memcached) memcached.Servers = []string{"localhost"} mConfig := &ConfiguredPlugin{ Name: "memcached", Drop: []string{"other", "stuff"}, Pass: []string{"some", "strings"}, TagDrop: []TagFilter{ TagFilter{ Name: "badtag", Filter: []string{"othertag"}, }, }, TagPass: []TagFilter{ TagFilter{ Name: "goodtag", Filter: []string{"mytag"}, }, }, Interval: 5 * time.Second, } assert.Equal(t, memcached, c.plugins["memcached"], "Testdata did not produce a correct memcached struct.") assert.Equal(t, mConfig, c.pluginConfigurations["memcached"], "Testdata did not produce correct memcached metadata.") }
// LoadConfig loads the given config file and returns a *Config pointer func LoadConfig(path string) (*Config, error) { data, err := ioutil.ReadFile(path) if err != nil { return nil, err } tbl, err := toml.Parse(data) if err != nil { return nil, err } c := &Config{ Tags: make(map[string]string), plugins: make(map[string]*ast.Table), outputs: make(map[string]*ast.Table), } for name, val := range tbl.Fields { subtbl, ok := val.(*ast.Table) if !ok { return nil, errInvalidConfig } switch name { case "agent": c.agent = subtbl case "tags": if err := toml.UnmarshalTable(subtbl, c.Tags); err != nil { return nil, errInvalidConfig } case "outputs": for outputName, outputVal := range subtbl.Fields { outputSubtbl, ok := outputVal.(*ast.Table) if !ok { return nil, errInvalidConfig } c.outputs[outputName] = outputSubtbl } default: c.plugins[name] = subtbl } } return c, nil }
func LoadConfig(path string) (*Config, error) { data, err := ioutil.ReadFile(path) if err != nil { return nil, err } tbl, err := toml.Parse(data) if err != nil { return nil, err } c := &Config{ plugins: make(map[string]*ast.Table), } for name, val := range tbl.Fields { subtbl, ok := val.(*ast.Table) if !ok { return nil, ErrInvalidConfig } switch name { case "influxdb": err := toml.UnmarshalTable(subtbl, c) if err != nil { return nil, err } case "agent": c.agent = subtbl default: c.plugins[name] = subtbl } } return c, nil }
// LoadConfig loads the given config file and returns a *Config pointer func LoadConfig(path string) (*Config, error) { data, err := ioutil.ReadFile(path) if err != nil { return nil, err } tbl, err := toml.Parse(data) if err != nil { return nil, err } c := &Config{ Tags: make(map[string]string), plugins: make(map[string]plugins.Plugin), pluginConfigurations: make(map[string]*ConfiguredPlugin), outputs: make(map[string]outputs.Output), pluginFieldsSet: make(map[string][]string), pluginConfigurationFieldsSet: make(map[string][]string), outputFieldsSet: make(map[string][]string), } for name, val := range tbl.Fields { subTable, ok := val.(*ast.Table) if !ok { return nil, errors.New("invalid configuration") } switch name { case "agent": err := c.parseAgent(subTable) if err != nil { log.Printf("Could not parse [agent] config\n") return nil, err } case "tags": if err = toml.UnmarshalTable(subTable, c.Tags); err != nil { log.Printf("Could not parse [tags] config\n") return nil, err } case "outputs": for outputName, outputVal := range subTable.Fields { switch outputSubTable := outputVal.(type) { case *ast.Table: err = c.parseOutput(outputName, outputSubTable, 0) if err != nil { log.Printf("Could not parse config for output: %s\n", outputName) return nil, err } case []*ast.Table: for id, t := range outputSubTable { err = c.parseOutput(outputName, t, id) if err != nil { log.Printf("Could not parse config for output: %s\n", outputName) return nil, err } } default: return nil, fmt.Errorf("Unsupported config format: %s", outputName) } } default: err = c.parsePlugin(name, subTable) if err != nil { return nil, err } } } return c, nil }
// LoadConfig loads the given config file and applies it to c func (c *Config) LoadConfig(path string) error { data, err := ioutil.ReadFile(path) if err != nil { return err } tbl, err := toml.Parse(data) if err != nil { return err } for name, val := range tbl.Fields { subTable, ok := val.(*ast.Table) if !ok { return errors.New("invalid configuration") } switch name { case "agent": if err = toml.UnmarshalTable(subTable, c.Agent); err != nil { log.Printf("Could not parse [agent] config\n") return err } case "tags": if err = toml.UnmarshalTable(subTable, c.Tags); err != nil { log.Printf("Could not parse [tags] config\n") return err } case "outputs": for outputName, outputVal := range subTable.Fields { switch outputSubTable := outputVal.(type) { case *ast.Table: if err = c.addOutput(outputName, outputSubTable); err != nil { return err } case []*ast.Table: for _, t := range outputSubTable { if err = c.addOutput(outputName, t); err != nil { return err } } default: return fmt.Errorf("Unsupported config format: %s", outputName) } } case "plugins": for pluginName, pluginVal := range subTable.Fields { switch pluginSubTable := pluginVal.(type) { case *ast.Table: if err = c.addPlugin(pluginName, pluginSubTable); err != nil { return err } case []*ast.Table: for _, t := range pluginSubTable { if err = c.addPlugin(pluginName, t); err != nil { return err } } default: return fmt.Errorf("Unsupported config format: %s", pluginName) } } // Assume it's a plugin for legacy config file support if no other // identifiers are present default: if err = c.addPlugin(name, subTable); err != nil { return err } } } return nil }