Extract Route validation from serialization methods so it can be re-used (#47649)
* Extract validation and reject invalid policies * Validation in dedicated file * Tests for validation * Extract root route validation * Update call and drop TODO * empty commit to kick actions * Normalization should be idempotent * Cleaner representation of validation errors, chain errors properly * Make internal validate unexported * Fix missed rename * Genericize error message * Improve method names * Rebase, fix * Update asserts
This commit is contained in:
@@ -10,7 +10,6 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/go-openapi/strfmt"
|
||||
"github.com/pkg/errors"
|
||||
amv2 "github.com/prometheus/alertmanager/api/v2/models"
|
||||
"github.com/prometheus/alertmanager/config"
|
||||
"github.com/prometheus/alertmanager/pkg/labels"
|
||||
@@ -724,35 +723,7 @@ func (r *Route) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, l := range r.GroupByStr {
|
||||
if l == "..." {
|
||||
r.GroupByAll = true
|
||||
} else {
|
||||
r.GroupBy = append(r.GroupBy, model.LabelName(l))
|
||||
}
|
||||
}
|
||||
|
||||
if len(r.GroupBy) > 0 && r.GroupByAll {
|
||||
return fmt.Errorf("cannot have wildcard group_by (`...`) and other other labels at the same time")
|
||||
}
|
||||
|
||||
groupBy := map[model.LabelName]struct{}{}
|
||||
|
||||
for _, ln := range r.GroupBy {
|
||||
if _, ok := groupBy[ln]; ok {
|
||||
return fmt.Errorf("duplicated label %q in group_by", ln)
|
||||
}
|
||||
groupBy[ln] = struct{}{}
|
||||
}
|
||||
|
||||
if r.GroupInterval != nil && time.Duration(*r.GroupInterval) == time.Duration(0) {
|
||||
return fmt.Errorf("group_interval cannot be zero")
|
||||
}
|
||||
if r.RepeatInterval != nil && time.Duration(*r.RepeatInterval) == time.Duration(0) {
|
||||
return fmt.Errorf("repeat_interval cannot be zero")
|
||||
}
|
||||
|
||||
return nil
|
||||
return r.validateChild()
|
||||
}
|
||||
|
||||
// Return an alertmanager route from a Grafana route. The ObjectMatchers are converted to Matchers.
|
||||
@@ -837,25 +808,9 @@ func (c *Config) UnmarshalJSON(b []byte) error {
|
||||
return fmt.Errorf("no routes provided")
|
||||
}
|
||||
|
||||
// Route is a recursive structure that includes validation in the yaml unmarshaler.
|
||||
// Therefore, we'll redirect json -> yaml to utilize these.
|
||||
b, err := yaml.Marshal(c.Route)
|
||||
err := c.Route.Validate()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "marshaling route to yaml for validation")
|
||||
}
|
||||
err = yaml.Unmarshal(b, c.Route)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "unmarshaling route for validations")
|
||||
}
|
||||
|
||||
if len(c.Route.Receiver) == 0 {
|
||||
return fmt.Errorf("root route must specify a default receiver")
|
||||
}
|
||||
if len(c.Route.Match) > 0 || len(c.Route.MatchRE) > 0 {
|
||||
return fmt.Errorf("root route must not have any matchers")
|
||||
}
|
||||
if len(c.Route.MuteTimeIntervals) > 0 {
|
||||
return fmt.Errorf("root route must not have any mute time intervals")
|
||||
return err
|
||||
}
|
||||
|
||||
for _, r := range c.InhibitRules {
|
||||
|
||||
Reference in New Issue
Block a user