diff --git a/pkg/services/alerting/alerting.go b/pkg/services/alerting/alerting.go index 2253da6715c..23bd5733298 100644 --- a/pkg/services/alerting/alerting.go +++ b/pkg/services/alerting/alerting.go @@ -56,25 +56,25 @@ func (s *Scheduler) Dispatch(reader RuleReader) { ticker := time.NewTicker(time.Second * 5) s.heartBeat() - s.updateJobs(reader) + s.updateJobs(reader.Fetch) for { select { case <-secondTicker.C: s.queueJobs() case <-reschedule.C: - s.updateJobs(reader) + s.updateJobs(reader.Fetch) case <-ticker.C: s.heartBeat() } } } -func (s *Scheduler) updateJobs(reader RuleReader) { +func (s *Scheduler) updateJobs(f func() []m.AlertRule) { log.Debug("Scheduler: UpdateJobs()") jobs := make([]*AlertJob, 0) - rules := reader.Fetch() + rules := f() for i := s.serverPosition - 1; i < len(rules); i += s.clusterSize { rule := rules[i] diff --git a/pkg/services/alerting/alerting_test.go b/pkg/services/alerting/alerting_test.go index d806a5d69ca..c2f41a3692a 100644 --- a/pkg/services/alerting/alerting_test.go +++ b/pkg/services/alerting/alerting_test.go @@ -1 +1,63 @@ package alerting + +import ( + m "github.com/grafana/grafana/pkg/models" + . "github.com/smartystreets/goconvey/convey" + "testing" +) + +func TestAlertingScheduler(t *testing.T) { + Convey("Testing alert job selection", t, func() { + mockFn := func() []m.AlertRule { + return []m.AlertRule{ + {Id: 1, Title: "test 1"}, + {Id: 2, Title: "test 2"}, + {Id: 3, Title: "test 3"}, + {Id: 4, Title: "test 4"}, + {Id: 5, Title: "test 5"}, + {Id: 6, Title: "test 6"}, + } + } + + Convey("single server", func() { + scheduler := &Scheduler{ + jobs: make([]*AlertJob, 0), + runQueue: make(chan *AlertJob, 1000), + serverId: "", + serverPosition: 1, + clusterSize: 1, + } + + scheduler.updateJobs(mockFn) + So(len(scheduler.jobs), ShouldEqual, 6) + }) + + Convey("two servers", func() { + scheduler := &Scheduler{ + jobs: make([]*AlertJob, 0), + runQueue: make(chan *AlertJob, 1000), + serverId: "", + serverPosition: 1, + clusterSize: 2, + } + + scheduler.updateJobs(mockFn) + So(len(scheduler.jobs), ShouldEqual, 3) + So(scheduler.jobs[0].id, ShouldEqual, 1) + }) + + Convey("six servers", func() { + scheduler := &Scheduler{ + jobs: make([]*AlertJob, 0), + runQueue: make(chan *AlertJob, 1000), + serverId: "", + serverPosition: 6, + clusterSize: 6, + } + + scheduler.updateJobs(mockFn) + So(len(scheduler.jobs), ShouldEqual, 1) + So(scheduler.jobs[0].id, ShouldEqual, 6) + }) + }) +}