mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-02-19 15:30:17 +00:00
vmalert: do not return nil rules
for /api/v1/rules (#4344)
The fix addresses a case when vmalert is configured with a group
which has `name`, but doesn't have `rules` configured. In this
case it still returns a `nil` instead of `[]` slice.
Fixing this via current commit.
See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4221
Signed-off-by: hagen1778 <roman@victoriametrics.com>
(cherry picked from commit 66ed6fe62f
)
This commit is contained in:
parent
01393a112c
commit
0144cb68a6
2 changed files with 27 additions and 4 deletions
|
@ -172,6 +172,7 @@ func (g *Group) toAPI() APIGroup {
|
||||||
Params: urlValuesToStrings(g.Params),
|
Params: urlValuesToStrings(g.Params),
|
||||||
Labels: g.Labels,
|
Labels: g.Labels,
|
||||||
}
|
}
|
||||||
|
ag.Rules = make([]APIRule, 0)
|
||||||
for _, r := range g.Rules {
|
for _, r := range g.Rules {
|
||||||
ag.Rules = append(ag.Rules, r.ToAPI())
|
ag.Rules = append(ag.Rules, r.ToAPI())
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,8 +130,8 @@ func TestHandler(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEmptyResponse(t *testing.T) {
|
func TestEmptyResponse(t *testing.T) {
|
||||||
rh := &requestHandler{m: &manager{groups: make(map[uint64]*Group)}}
|
rhWithNoGroups := &requestHandler{m: &manager{groups: make(map[uint64]*Group)}}
|
||||||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { rh.handler(w, r) }))
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { rhWithNoGroups.handler(w, r) }))
|
||||||
defer ts.Close()
|
defer ts.Close()
|
||||||
|
|
||||||
getResp := func(url string, to interface{}, code int) {
|
getResp := func(url string, to interface{}, code int) {
|
||||||
|
@ -155,7 +155,7 @@ func TestEmptyResponse(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("/api/v1/alerts", func(t *testing.T) {
|
t.Run("no groups /api/v1/alerts", func(t *testing.T) {
|
||||||
lr := listAlertsResponse{}
|
lr := listAlertsResponse{}
|
||||||
getResp(ts.URL+"/api/v1/alerts", &lr, 200)
|
getResp(ts.URL+"/api/v1/alerts", &lr, 200)
|
||||||
if lr.Data.Alerts == nil {
|
if lr.Data.Alerts == nil {
|
||||||
|
@ -169,7 +169,7 @@ func TestEmptyResponse(t *testing.T) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("/api/v1/rules", func(t *testing.T) {
|
t.Run("no groups /api/v1/rules", func(t *testing.T) {
|
||||||
lr := listGroupsResponse{}
|
lr := listGroupsResponse{}
|
||||||
getResp(ts.URL+"/api/v1/rules", &lr, 200)
|
getResp(ts.URL+"/api/v1/rules", &lr, 200)
|
||||||
if lr.Data.Groups == nil {
|
if lr.Data.Groups == nil {
|
||||||
|
@ -182,4 +182,26 @@ func TestEmptyResponse(t *testing.T) {
|
||||||
t.Errorf("expected /api/v1/rules response to have non-nil data")
|
t.Errorf("expected /api/v1/rules response to have non-nil data")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
rhWithEmptyGroup := &requestHandler{m: &manager{groups: map[uint64]*Group{0: {Name: "test"}}}}
|
||||||
|
ts.Config.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { rhWithEmptyGroup.handler(w, r) })
|
||||||
|
|
||||||
|
t.Run("empty group /api/v1/rules", func(t *testing.T) {
|
||||||
|
lr := listGroupsResponse{}
|
||||||
|
getResp(ts.URL+"/api/v1/rules", &lr, 200)
|
||||||
|
if lr.Data.Groups == nil {
|
||||||
|
t.Fatalf("expected /api/v1/rules response to have non-nil data")
|
||||||
|
}
|
||||||
|
|
||||||
|
lr = listGroupsResponse{}
|
||||||
|
getResp(ts.URL+"/vmalert/api/v1/rules", &lr, 200)
|
||||||
|
if lr.Data.Groups == nil {
|
||||||
|
t.Fatalf("expected /api/v1/rules response to have non-nil data")
|
||||||
|
}
|
||||||
|
|
||||||
|
group := lr.Data.Groups[0]
|
||||||
|
if group.Rules == nil {
|
||||||
|
t.Fatalf("expected /api/v1/rules response to have non-nil rules for group")
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue