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  }