Add the route ID to uuid (#3372)
* Add the route ID to uuid Signed-off-by: Yijie Qin <qinyijie@amazon.com> --------- Signed-off-by: Yijie Qin <qinyijie@amazon.com>
This commit is contained in:
parent
c6be0bcabf
commit
57fdd136ab
|
@ -180,6 +180,29 @@ func (r *Route) Key() string {
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ID returns a unique identifier for the route.
|
||||||
|
func (r *Route) ID() string {
|
||||||
|
b := strings.Builder{}
|
||||||
|
|
||||||
|
position := -1
|
||||||
|
if r.parent != nil {
|
||||||
|
// Find the position in the same level leaf.
|
||||||
|
for i, cr := range r.parent.Routes {
|
||||||
|
if cr == r {
|
||||||
|
position = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b.WriteString(r.Key())
|
||||||
|
|
||||||
|
if position > -1 {
|
||||||
|
b.WriteRune('/')
|
||||||
|
b.WriteString(fmt.Sprint(position))
|
||||||
|
}
|
||||||
|
return b.String()
|
||||||
|
}
|
||||||
|
|
||||||
// Walk traverses the route tree in depth-first order.
|
// Walk traverses the route tree in depth-first order.
|
||||||
func (r *Route) Walk(visit func(*Route)) {
|
func (r *Route) Walk(visit func(*Route)) {
|
||||||
visit(r)
|
visit(r)
|
||||||
|
|
|
@ -853,3 +853,71 @@ routes:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRouteID(t *testing.T) {
|
||||||
|
in := `
|
||||||
|
receiver: 'notify-def'
|
||||||
|
|
||||||
|
routes:
|
||||||
|
- matchers: ['{owner="team-A"}', '{level!="critical"}']
|
||||||
|
receiver: 'notify-D'
|
||||||
|
group_by: [...]
|
||||||
|
continue: true
|
||||||
|
- matchers: ['{owner="team-A"}', '{level!="critical"}']
|
||||||
|
receiver: 'notify-A'
|
||||||
|
routes:
|
||||||
|
- matchers: ['{env="testing"}', '{baz!~".*quux"}']
|
||||||
|
receiver: 'notify-testing'
|
||||||
|
group_by: [...]
|
||||||
|
- match:
|
||||||
|
env: "production"
|
||||||
|
receiver: 'notify-productionA'
|
||||||
|
group_wait: 1m
|
||||||
|
continue: true
|
||||||
|
- matchers: [ env=~"produ.*", job=~".*"]
|
||||||
|
receiver: 'notify-productionB'
|
||||||
|
group_wait: 30s
|
||||||
|
group_interval: 5m
|
||||||
|
repeat_interval: 1h
|
||||||
|
group_by: ['job']
|
||||||
|
- match_re:
|
||||||
|
owner: 'team-(B|C)'
|
||||||
|
group_by: ['foo', 'bar']
|
||||||
|
group_wait: 2m
|
||||||
|
receiver: 'notify-BC'
|
||||||
|
- matchers: [group_by="role"]
|
||||||
|
group_by: ['role']
|
||||||
|
routes:
|
||||||
|
- matchers: ['{env="testing"}']
|
||||||
|
receiver: 'notify-testing'
|
||||||
|
routes:
|
||||||
|
- matchers: [wait="long"]
|
||||||
|
group_wait: 2m
|
||||||
|
`
|
||||||
|
|
||||||
|
var ctree config.Route
|
||||||
|
if err := yaml.UnmarshalStrict([]byte(in), &ctree); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
tree := NewRoute(&ctree, nil)
|
||||||
|
|
||||||
|
expected := []string{
|
||||||
|
"{}",
|
||||||
|
"{}/{level!=\"critical\",owner=\"team-A\"}/0",
|
||||||
|
"{}/{level!=\"critical\",owner=\"team-A\"}/1",
|
||||||
|
"{}/{level!=\"critical\",owner=\"team-A\"}/{baz!~\".*quux\",env=\"testing\"}/0",
|
||||||
|
"{}/{level!=\"critical\",owner=\"team-A\"}/{env=\"production\"}/1",
|
||||||
|
"{}/{level!=\"critical\",owner=\"team-A\"}/{env=~\"produ.*\",job=~\".*\"}/2",
|
||||||
|
"{}/{owner=~\"^(?:team-(B|C))$\"}/2",
|
||||||
|
"{}/{group_by=\"role\"}/3",
|
||||||
|
"{}/{group_by=\"role\"}/{env=\"testing\"}/0",
|
||||||
|
"{}/{group_by=\"role\"}/{env=\"testing\"}/{wait=\"long\"}/0",
|
||||||
|
}
|
||||||
|
|
||||||
|
var got []string
|
||||||
|
tree.Walk(func(r *Route) {
|
||||||
|
got = append(got, r.ID())
|
||||||
|
})
|
||||||
|
|
||||||
|
require.ElementsMatch(t, got, expected)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue