From b7591fd67d6561fc805e1e76bf8c89b4538e1aba Mon Sep 17 00:00:00 2001 From: Sebastian Spaink <3441183+sspaink@users.noreply.github.com> Date: Tue, 4 Oct 2022 10:26:02 -0500 Subject: [PATCH] chore: Resolve linter issues in config.go and config_test.go (#11929) --- config/config.go | 89 ++++++++----------------------- config/config_test.go | 120 +++++++++++++++++++++++++++++++----------- 2 files changed, 112 insertions(+), 97 deletions(-) diff --git a/config/config.go b/config/config.go index a2bba393a..34f987ab2 100644 --- a/config/config.go +++ b/config/config.go @@ -3,7 +3,6 @@ package config import ( "bytes" "crypto/tls" - _ "embed" "errors" "fmt" "io" @@ -30,7 +29,6 @@ import ( "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/outputs" "github.com/influxdata/telegraf/plugins/parsers" - "github.com/influxdata/telegraf/plugins/parsers/temporary/json_v2" "github.com/influxdata/telegraf/plugins/processors" "github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/toml" @@ -599,21 +597,33 @@ func fetchConfig(u *url.URL) ([]byte, error) { retries := 3 for i := 0; i <= retries; i++ { - resp, err := http.DefaultClient.Do(req) + body, err, retry := func() ([]byte, error, bool) { + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, fmt.Errorf("retry %d of %d failed connecting to HTTP config server %s", i, retries, err), false + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + if i < retries { + log.Printf("Error getting HTTP config. Retry %d of %d in %s. Status=%d", i, retries, httpLoadConfigRetryInterval, resp.StatusCode) + return nil, nil, true + } + return nil, fmt.Errorf("retry %d of %d failed to retrieve remote config: %s", i, retries, resp.Status), false + } + body, err := io.ReadAll(resp.Body) + return body, err, false + }() + if err != nil { - return nil, fmt.Errorf("Retry %d of %d failed connecting to HTTP config server %s", i, retries, err) + return nil, err } - if resp.StatusCode != http.StatusOK { - if i < retries { - log.Printf("Error getting HTTP config. Retry %d of %d in %s. Status=%d", i, retries, httpLoadConfigRetryInterval, resp.StatusCode) - time.Sleep(httpLoadConfigRetryInterval) - continue - } - return nil, fmt.Errorf("Retry %d of %d failed to retrieve remote config: %s", i, retries, resp.Status) + if retry { + time.Sleep(httpLoadConfigRetryInterval) + continue } - defer resp.Body.Close() - return io.ReadAll(resp.Body) + + return body, err } return nil, nil @@ -1109,44 +1119,6 @@ func (c *Config) buildInput(name string, tbl *ast.Table) (*models.InputConfig, e return cp, nil } -func getFieldSubtable(c *Config, metricConfig *ast.Table) []json_v2.DataSet { - var fields []json_v2.DataSet - - if fieldConfigs, ok := metricConfig.Fields["field"]; ok { - if fieldConfigs, ok := fieldConfigs.([]*ast.Table); ok { - for _, fieldconfig := range fieldConfigs { - var f json_v2.DataSet - c.getFieldString(fieldconfig, "path", &f.Path) - c.getFieldString(fieldconfig, "rename", &f.Rename) - c.getFieldString(fieldconfig, "type", &f.Type) - c.getFieldBool(fieldconfig, "optional", &f.Optional) - fields = append(fields, f) - } - } - } - - return fields -} - -func getTagSubtable(c *Config, metricConfig *ast.Table) []json_v2.DataSet { - var tags []json_v2.DataSet - - if fieldConfigs, ok := metricConfig.Fields["tag"]; ok { - if fieldConfigs, ok := fieldConfigs.([]*ast.Table); ok { - for _, fieldconfig := range fieldConfigs { - var t json_v2.DataSet - c.getFieldString(fieldconfig, "path", &t.Path) - c.getFieldString(fieldconfig, "rename", &t.Rename) - t.Type = "string" - tags = append(tags, t) - c.getFieldBool(fieldconfig, "optional", &t.Optional) - } - } - } - - return tags -} - // buildSerializer grabs the necessary entries from the ast.Table for creating // a serializers.Serializer object, and creates it, which can then be added onto // an Output object. @@ -1408,21 +1380,6 @@ func (c *Config) getFieldTagFilter(tbl *ast.Table, fieldName string, target *[]m } } -func (c *Config) getFieldStringMap(tbl *ast.Table, fieldName string, target *map[string]string) { - *target = map[string]string{} - if node, ok := tbl.Fields[fieldName]; ok { - if subtbl, ok := node.(*ast.Table); ok { - for name, val := range subtbl.Fields { - if kv, ok := val.(*ast.KeyValue); ok { - if str, ok := kv.Value.(*ast.String); ok { - (*target)[name] = str.Value - } - } - } - } - } -} - func keys(m map[string]bool) []string { result := []string{} for k := range m { diff --git a/config/config_test.go b/config/config_test.go index 35decf216..165af0de6 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -100,7 +100,7 @@ func TestConfig_LoadSingleInputWithEnvVars(t *testing.T) { func TestConfig_LoadSingleInput(t *testing.T) { c := NewConfig() - c.LoadConfig("./testdata/single_plugin.toml") + require.NoError(t, c.LoadConfig("./testdata/single_plugin.toml")) input := inputs.Inputs["memcached"]().(*MockupInputPlugin) input.Servers = []string{"localhost"} @@ -359,7 +359,7 @@ func TestConfig_URLRetries3Fails(t *testing.T) { })) defer ts.Close() - expected := fmt.Sprintf("Error loading config file %s: Retry 3 of 3 failed to retrieve remote config: 404 Not Found", ts.URL) + expected := fmt.Sprintf("Error loading config file %s: retry 3 of 3 failed to retrieve remote config: 404 Not Found", ts.URL) c := NewConfig() err := c.LoadConfig(ts.URL) @@ -783,10 +783,18 @@ type MockupInputPluginParserOld struct { ParserFunc parsers.ParserFunc } -func (m *MockupInputPluginParserOld) SampleConfig() string { return "Mockup old parser test plugin" } -func (m *MockupInputPluginParserOld) Gather(acc telegraf.Accumulator) error { return nil } -func (m *MockupInputPluginParserOld) SetParser(parser parsers.Parser) { m.Parser = parser } -func (m *MockupInputPluginParserOld) SetParserFunc(f parsers.ParserFunc) { m.ParserFunc = f } +func (m *MockupInputPluginParserOld) SampleConfig() string { + return "Mockup old parser test plugin" +} +func (m *MockupInputPluginParserOld) Gather(acc telegraf.Accumulator) error { + return nil +} +func (m *MockupInputPluginParserOld) SetParser(parser parsers.Parser) { + m.Parser = parser +} +func (m *MockupInputPluginParserOld) SetParserFunc(f parsers.ParserFunc) { + m.ParserFunc = f +} /*** Mockup INPUT plugin for (new) parser testing to avoid cyclic dependencies ***/ type MockupInputPluginParserNew struct { @@ -794,10 +802,18 @@ type MockupInputPluginParserNew struct { ParserFunc telegraf.ParserFunc } -func (m *MockupInputPluginParserNew) SampleConfig() string { return "Mockup old parser test plugin" } -func (m *MockupInputPluginParserNew) Gather(acc telegraf.Accumulator) error { return nil } -func (m *MockupInputPluginParserNew) SetParser(parser telegraf.Parser) { m.Parser = parser } -func (m *MockupInputPluginParserNew) SetParserFunc(f telegraf.ParserFunc) { m.ParserFunc = f } +func (m *MockupInputPluginParserNew) SampleConfig() string { + return "Mockup old parser test plugin" +} +func (m *MockupInputPluginParserNew) Gather(acc telegraf.Accumulator) error { + return nil +} +func (m *MockupInputPluginParserNew) SetParser(parser telegraf.Parser) { + m.Parser = parser +} +func (m *MockupInputPluginParserNew) SetParserFunc(f telegraf.ParserFunc) { + m.ParserFunc = f +} /*** Mockup INPUT plugin for testing to avoid cyclic dependencies ***/ type MockupInputPlugin struct { @@ -817,9 +833,15 @@ type MockupInputPlugin struct { parser telegraf.Parser } -func (m *MockupInputPlugin) SampleConfig() string { return "Mockup test input plugin" } -func (m *MockupInputPlugin) Gather(acc telegraf.Accumulator) error { return nil } -func (m *MockupInputPlugin) SetParser(parser telegraf.Parser) { m.parser = parser } +func (m *MockupInputPlugin) SampleConfig() string { + return "Mockup test input plugin" +} +func (m *MockupInputPlugin) Gather(acc telegraf.Accumulator) error { + return nil +} +func (m *MockupInputPlugin) SetParser(parser telegraf.Parser) { + m.parser = parser +} /*** Mockup PROCESSOR plugin for testing to avoid cyclic dependencies ***/ type MockupProcessorPluginParser struct { @@ -827,17 +849,27 @@ type MockupProcessorPluginParser struct { ParserFunc telegraf.ParserFunc } -func (m *MockupProcessorPluginParser) Start(acc telegraf.Accumulator) error { return nil } -func (m *MockupProcessorPluginParser) Stop() error { return nil } +func (m *MockupProcessorPluginParser) Start(acc telegraf.Accumulator) error { + return nil +} +func (m *MockupProcessorPluginParser) Stop() error { + return nil +} func (m *MockupProcessorPluginParser) SampleConfig() string { return "Mockup test processor plugin with parser" } -func (m *MockupProcessorPluginParser) Apply(in ...telegraf.Metric) []telegraf.Metric { return nil } +func (m *MockupProcessorPluginParser) Apply(in ...telegraf.Metric) []telegraf.Metric { + return nil +} func (m *MockupProcessorPluginParser) Add(metric telegraf.Metric, acc telegraf.Accumulator) error { return nil } -func (m *MockupProcessorPluginParser) SetParser(parser telegraf.Parser) { m.Parser = parser } -func (m *MockupProcessorPluginParser) SetParserFunc(f telegraf.ParserFunc) { m.ParserFunc = f } +func (m *MockupProcessorPluginParser) SetParser(parser telegraf.Parser) { + m.Parser = parser +} +func (m *MockupProcessorPluginParser) SetParserFunc(f telegraf.ParserFunc) { + m.ParserFunc = f +} /*** Mockup OUTPUT plugin for testing to avoid cyclic dependencies ***/ type MockupOuputPlugin struct { @@ -849,25 +881,51 @@ type MockupOuputPlugin struct { tls.ClientConfig } -func (m *MockupOuputPlugin) Connect() error { return nil } -func (m *MockupOuputPlugin) Close() error { return nil } -func (m *MockupOuputPlugin) SampleConfig() string { return "Mockup test output plugin" } -func (m *MockupOuputPlugin) Write(metrics []telegraf.Metric) error { return nil } +func (m *MockupOuputPlugin) Connect() error { + return nil +} +func (m *MockupOuputPlugin) Close() error { + return nil +} +func (m *MockupOuputPlugin) SampleConfig() string { + return "Mockup test output plugin" +} +func (m *MockupOuputPlugin) Write(metrics []telegraf.Metric) error { + return nil +} // Register the mockup plugin on loading func init() { // Register the mockup input plugin for the required names - inputs.Add("parser_test_new", func() telegraf.Input { return &MockupInputPluginParserNew{} }) - inputs.Add("parser_test_old", func() telegraf.Input { return &MockupInputPluginParserOld{} }) - inputs.Add("exec", func() telegraf.Input { return &MockupInputPlugin{Timeout: Duration(time.Second * 5)} }) - inputs.Add("http_listener_v2", func() telegraf.Input { return &MockupInputPlugin{} }) - inputs.Add("memcached", func() telegraf.Input { return &MockupInputPlugin{} }) - inputs.Add("procstat", func() telegraf.Input { return &MockupInputPlugin{} }) + inputs.Add("parser_test_new", func() telegraf.Input { + return &MockupInputPluginParserNew{} + }) + inputs.Add("parser_test_old", func() telegraf.Input { + return &MockupInputPluginParserOld{} + }) + inputs.Add("exec", func() telegraf.Input { + return &MockupInputPlugin{Timeout: Duration(time.Second * 5)} + }) + inputs.Add("http_listener_v2", func() telegraf.Input { + return &MockupInputPlugin{} + }) + inputs.Add("memcached", func() telegraf.Input { + return &MockupInputPlugin{} + }) + inputs.Add("procstat", func() telegraf.Input { + return &MockupInputPlugin{} + }) // Register the mockup output plugin for the required names - processors.Add("parser_test", func() telegraf.Processor { return &MockupProcessorPluginParser{} }) + processors.Add("parser_test", func() telegraf.Processor { + return &MockupProcessorPluginParser{} + }) // Register the mockup output plugin for the required names - outputs.Add("azure_monitor", func() telegraf.Output { return &MockupOuputPlugin{NamespacePrefix: "Telegraf/"} }) - outputs.Add("http", func() telegraf.Output { return &MockupOuputPlugin{} }) + outputs.Add("azure_monitor", func() telegraf.Output { + return &MockupOuputPlugin{NamespacePrefix: "Telegraf/"} + }) + outputs.Add("http", func() telegraf.Output { + return &MockupOuputPlugin{} + }) }