Skip to content

Commit dd490dd

Browse files
ultrotterGuido TrotterSuperQ
authored
Don't allow calling QIDs with an empty IDs list (#4707)
* Don't allow calling QIDs with an empty IDs list Calling QIDs with an empty list of IDs is meaningless, and the result may be unexpected (at the moment it would return all silences, but one might expect it to never return any). Make it an error. Signed-off-by: Guido Trotter <[email protected]> * Use errors.New instead of fmt.Errorf Co-authored-by: Ben Kochie <[email protected]> Signed-off-by: Guido Trotter <[email protected]> --------- Signed-off-by: Guido Trotter <[email protected]> Signed-off-by: Guido Trotter <[email protected]> Co-authored-by: Guido Trotter <[email protected]> Co-authored-by: Ben Kochie <[email protected]>
1 parent 047cc6f commit dd490dd

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

silence/silence.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,9 @@ type silenceFilter func(*pb.Silence, *Silences, time.Time) (bool, error)
735735
// QIDs configures a query to select the given silence IDs.
736736
func QIDs(ids ...string) QueryParam {
737737
return func(q *query) error {
738+
if len(ids) == 0 {
739+
return errors.New("QIDs filter must have at least one id")
740+
}
738741
q.ids = append(q.ids, ids...)
739742
return nil
740743
}

silence/silence_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,44 @@ func TestSilencesQuery(t *testing.T) {
11521152
}
11531153
}
11541154

1155+
func TestQIDs(t *testing.T) {
1156+
s, err := New(Options{Metrics: prometheus.NewRegistry()})
1157+
require.NoError(t, err)
1158+
1159+
s.st = state{
1160+
"1": &pb.MeshSilence{Silence: &pb.Silence{Id: "1"}},
1161+
"2": &pb.MeshSilence{Silence: &pb.Silence{Id: "2"}},
1162+
"3": &pb.MeshSilence{Silence: &pb.Silence{Id: "3"}},
1163+
"4": &pb.MeshSilence{Silence: &pb.Silence{Id: "4"}},
1164+
}
1165+
1166+
// Test QIDs with empty arguments returns an error
1167+
_, _, err = s.Query(QIDs())
1168+
require.Error(t, err, "expected error when QIDs is called with no arguments")
1169+
require.Contains(t, err.Error(), "QIDs filter must have at least one id")
1170+
1171+
// Test QIDs with empty arguments returns an error via QueryOne
1172+
_, err = s.QueryOne(QIDs())
1173+
require.Error(t, err, "expected error when QIDs is called with no arguments")
1174+
require.Contains(t, err.Error(), "QIDs filter must have at least one id")
1175+
1176+
// Test QIDs with single ID works
1177+
res, _, err := s.Query(QIDs("1"))
1178+
require.NoError(t, err)
1179+
require.Len(t, res, 1)
1180+
require.Equal(t, "1", res[0].Id)
1181+
1182+
// Test QIDs with multiple IDs works
1183+
res, _, err = s.Query(QIDs("1", "2"))
1184+
require.NoError(t, err)
1185+
require.Len(t, res, 2)
1186+
1187+
// Test QueryOne with single ID works
1188+
sil, err := s.QueryOne(QIDs("1"))
1189+
require.NoError(t, err)
1190+
require.Equal(t, "1", sil.Id)
1191+
}
1192+
11551193
type silencesByID []*pb.Silence
11561194

11571195
func (s silencesByID) Len() int { return len(s) }

0 commit comments

Comments
 (0)