github.com/netdata/go.d.plugin@v0.58.1/agent/discovery/sd/pipeline/config.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package pipeline 4 5 import ( 6 "errors" 7 "fmt" 8 "github.com/netdata/go.d.plugin/agent/discovery/sd/hostsocket" 9 10 "github.com/netdata/go.d.plugin/agent/discovery/sd/kubernetes" 11 ) 12 13 type Config struct { 14 Name string `yaml:"name"` 15 Discovery DiscoveryConfig `yaml:"discovery"` 16 Classify []ClassifyRuleConfig `yaml:"classify"` 17 Compose []ComposeRuleConfig `yaml:"compose"` // TODO: "jobs"? 18 } 19 20 type ( 21 DiscoveryConfig struct { 22 K8s []kubernetes.Config `yaml:"k8s"` 23 HostSocket HostSocketConfig `yaml:"hostsocket"` 24 } 25 HostSocketConfig struct { 26 Net *hostsocket.NetworkSocketConfig `yaml:"net"` 27 } 28 ) 29 30 type ClassifyRuleConfig struct { 31 Name string `yaml:"name"` 32 Selector string `yaml:"selector"` // mandatory 33 Tags string `yaml:"tags"` // mandatory 34 Match []struct { 35 Tags string `yaml:"tags"` // mandatory 36 Expr string `yaml:"expr"` // mandatory 37 } `yaml:"match"` // mandatory, at least 1 38 } 39 40 type ComposeRuleConfig struct { 41 Name string `yaml:"name"` // optional 42 Selector string `yaml:"selector"` // mandatory 43 Config []struct { 44 Selector string `yaml:"selector"` // mandatory 45 Template string `yaml:"template"` // mandatory 46 } `yaml:"config"` // mandatory, at least 1 47 } 48 49 func validateConfig(cfg Config) error { 50 if cfg.Name != "" { 51 return errors.New("'name' not set") 52 } 53 if len(cfg.Discovery.K8s) == 0 { 54 return errors.New("'discovery->k8s' not set") 55 } 56 if err := validateClassifyConfig(cfg.Classify); err != nil { 57 return fmt.Errorf("tag rules: %v", err) 58 } 59 if err := validateComposeConfig(cfg.Compose); err != nil { 60 return fmt.Errorf("config rules: %v", err) 61 } 62 return nil 63 } 64 65 func validateClassifyConfig(rules []ClassifyRuleConfig) error { 66 if len(rules) == 0 { 67 return errors.New("empty config, need least 1 rule") 68 } 69 for i, rule := range rules { 70 if rule.Selector == "" { 71 return fmt.Errorf("'rule[%s][%d]->selector' not set", rule.Name, i+1) 72 } 73 if rule.Tags == "" { 74 return fmt.Errorf("'rule[%s][%d]->tags' not set", rule.Name, i+1) 75 } 76 if len(rule.Match) == 0 { 77 return fmt.Errorf("'rule[%s][%d]->match' not set, need at least 1 rule match", rule.Name, i+1) 78 } 79 80 for j, match := range rule.Match { 81 if match.Tags == "" { 82 return fmt.Errorf("'rule[%s][%d]->match[%d]->tags' not set", rule.Name, i+1, j+1) 83 } 84 if match.Expr == "" { 85 return fmt.Errorf("'rule[%s][%d]->match[%d]->expr' not set", rule.Name, i+1, j+1) 86 } 87 } 88 } 89 return nil 90 } 91 92 func validateComposeConfig(rules []ComposeRuleConfig) error { 93 if len(rules) == 0 { 94 return errors.New("empty config, need least 1 rule") 95 } 96 for i, rule := range rules { 97 if rule.Selector == "" { 98 return fmt.Errorf("'rule[%s][%d]->selector' not set", rule.Name, i+1) 99 } 100 101 if len(rule.Config) == 0 { 102 return fmt.Errorf("'rule[%s][%d]->config' not set", rule.Name, i+1) 103 } 104 105 for j, conf := range rule.Config { 106 if conf.Selector == "" { 107 return fmt.Errorf("'rule[%s][%d]->config[%d]->selector' not set", rule.Name, i+1, j+1) 108 } 109 if conf.Template == "" { 110 return fmt.Errorf("'rule[%s][%d]->config[%d]->template' not set", rule.Name, i+1, j+1) 111 } 112 } 113 } 114 return nil 115 }