further type adaptions
This commit is contained in:
parent
4d81dc8bf3
commit
3be9a48006
41
api/api.go
41
api/api.go
|
@ -20,7 +20,6 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/common/log"
|
||||
"github.com/prometheus/common/model"
|
||||
|
@ -393,7 +392,7 @@ func (api *API) addSilence(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
// Drop start time for new silences so we default to now.
|
||||
if sil.ID == "" && sil.StartsAt.Before(time.Now()) {
|
||||
psil.StartsAt = nil
|
||||
psil.StartsAt = time.Time{}
|
||||
}
|
||||
|
||||
sid, err := api.silences.Create(psil)
|
||||
|
@ -502,23 +501,11 @@ func matchesFilterLabels(s *types.Silence, matchers []*labels.Matcher) bool {
|
|||
}
|
||||
|
||||
func silenceToProto(s *types.Silence) (*silencepb.Silence, error) {
|
||||
startsAt, err := ptypes.TimestampProto(s.StartsAt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
endsAt, err := ptypes.TimestampProto(s.EndsAt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
updatedAt, err := ptypes.TimestampProto(s.UpdatedAt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sil := &silencepb.Silence{
|
||||
Id: s.ID,
|
||||
StartsAt: startsAt,
|
||||
EndsAt: endsAt,
|
||||
UpdatedAt: updatedAt,
|
||||
StartsAt: s.StartsAt,
|
||||
EndsAt: s.EndsAt,
|
||||
UpdatedAt: s.UpdatedAt,
|
||||
}
|
||||
for _, m := range s.Matchers {
|
||||
matcher := &silencepb.Matcher{
|
||||
|
@ -532,7 +519,7 @@ func silenceToProto(s *types.Silence) (*silencepb.Silence, error) {
|
|||
sil.Matchers = append(sil.Matchers, matcher)
|
||||
}
|
||||
sil.Comments = append(sil.Comments, &silencepb.Comment{
|
||||
Timestamp: updatedAt,
|
||||
Timestamp: s.UpdatedAt,
|
||||
Author: s.CreatedBy,
|
||||
Comment: s.Comment,
|
||||
})
|
||||
|
@ -540,23 +527,11 @@ func silenceToProto(s *types.Silence) (*silencepb.Silence, error) {
|
|||
}
|
||||
|
||||
func silenceFromProto(s *silencepb.Silence) (*types.Silence, error) {
|
||||
startsAt, err := ptypes.Timestamp(s.StartsAt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
endsAt, err := ptypes.Timestamp(s.EndsAt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
updatedAt, err := ptypes.Timestamp(s.UpdatedAt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sil := &types.Silence{
|
||||
ID: s.Id,
|
||||
StartsAt: startsAt,
|
||||
EndsAt: endsAt,
|
||||
UpdatedAt: updatedAt,
|
||||
StartsAt: s.StartsAt,
|
||||
EndsAt: s.EndsAt,
|
||||
UpdatedAt: s.UpdatedAt,
|
||||
}
|
||||
for _, m := range s.Matchers {
|
||||
matcher := &types.Matcher{
|
||||
|
|
|
@ -20,8 +20,6 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/golang/protobuf/ptypes/timestamp"
|
||||
pb "github.com/prometheus/alertmanager/nflog/nflogpb"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
@ -31,7 +29,7 @@ func TestNlogGC(t *testing.T) {
|
|||
// We only care about key names and expiration timestamps.
|
||||
newEntry := func(ts time.Time) *pb.MeshEntry {
|
||||
return &pb.MeshEntry{
|
||||
ExpiresAt: mustTimestampProto(ts),
|
||||
ExpiresAt: ts,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -69,27 +67,27 @@ func TestNlogSnapshot(t *testing.T) {
|
|||
Receiver: &pb.Receiver{GroupName: "abc", Integration: "test1", Idx: 1},
|
||||
GroupHash: []byte("126a8a51b9d1bbd07fddc65819a542c3"),
|
||||
Resolved: false,
|
||||
Timestamp: mustTimestampProto(now),
|
||||
Timestamp: now,
|
||||
},
|
||||
ExpiresAt: mustTimestampProto(now),
|
||||
ExpiresAt: now,
|
||||
}, {
|
||||
Entry: &pb.Entry{
|
||||
GroupKey: []byte("d8e8fca2dc0f8abce7cb4cb0031ba249"),
|
||||
Receiver: &pb.Receiver{GroupName: "def", Integration: "test2", Idx: 29},
|
||||
GroupHash: []byte("122c2331b9d1bbd07fddc65819a542c3"),
|
||||
Resolved: true,
|
||||
Timestamp: mustTimestampProto(now),
|
||||
Timestamp: now,
|
||||
},
|
||||
ExpiresAt: mustTimestampProto(now),
|
||||
ExpiresAt: now,
|
||||
}, {
|
||||
Entry: &pb.Entry{
|
||||
GroupKey: []byte("aaaaaca2dc0f896fd7cb4cb0031ba249"),
|
||||
Receiver: &pb.Receiver{GroupName: "ghi", Integration: "test3", Idx: 0},
|
||||
GroupHash: []byte("126a8a51b9d1bbd07fddc6e3e3e542c3"),
|
||||
Resolved: false,
|
||||
Timestamp: mustTimestampProto(now),
|
||||
Timestamp: now,
|
||||
},
|
||||
ExpiresAt: mustTimestampProto(now),
|
||||
ExpiresAt: now,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -160,7 +158,7 @@ func TestGossipDataMerge(t *testing.T) {
|
|||
// merging logic.
|
||||
newEntry := func(ts time.Time) *pb.MeshEntry {
|
||||
return &pb.MeshEntry{
|
||||
Entry: &pb.Entry{Timestamp: mustTimestampProto(ts)},
|
||||
Entry: &pb.Entry{Timestamp: ts},
|
||||
}
|
||||
}
|
||||
cases := []struct {
|
||||
|
@ -225,27 +223,27 @@ func TestGossipDataCoding(t *testing.T) {
|
|||
Receiver: &pb.Receiver{GroupName: "abc", Integration: "test1", Idx: 1},
|
||||
GroupHash: []byte("126a8a51b9d1bbd07fddc65819a542c3"),
|
||||
Resolved: false,
|
||||
Timestamp: mustTimestampProto(now),
|
||||
Timestamp: now,
|
||||
},
|
||||
ExpiresAt: mustTimestampProto(now),
|
||||
ExpiresAt: now,
|
||||
}, {
|
||||
Entry: &pb.Entry{
|
||||
GroupKey: []byte("d8e8fca2dc0f8abce7cb4cb0031ba249"),
|
||||
Receiver: &pb.Receiver{GroupName: "def", Integration: "test2", Idx: 29},
|
||||
GroupHash: []byte("122c2331b9d1bbd07fddc65819a542c3"),
|
||||
Resolved: true,
|
||||
Timestamp: mustTimestampProto(now),
|
||||
Timestamp: now,
|
||||
},
|
||||
ExpiresAt: mustTimestampProto(now),
|
||||
ExpiresAt: now,
|
||||
}, {
|
||||
Entry: &pb.Entry{
|
||||
GroupKey: []byte("aaaaaca2dc0f896fd7cb4cb0031ba249"),
|
||||
Receiver: &pb.Receiver{GroupName: "ghi", Integration: "test3", Idx: 0},
|
||||
GroupHash: []byte("126a8a51b9d1bbd07fddc6e3e3e542c3"),
|
||||
Resolved: false,
|
||||
Timestamp: mustTimestampProto(now),
|
||||
Timestamp: now,
|
||||
},
|
||||
ExpiresAt: mustTimestampProto(now),
|
||||
ExpiresAt: now,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -266,19 +264,3 @@ func TestGossipDataCoding(t *testing.T) {
|
|||
require.Equal(t, in, out, "decoded data doesn't match encoded data")
|
||||
}
|
||||
}
|
||||
|
||||
func mustTimestamp(ts *timestamp.Timestamp) time.Time {
|
||||
res, err := ptypes.Timestamp(ts)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func mustTimestampProto(ts time.Time) *timestamp.Timestamp {
|
||||
res, err := ptypes.TimestampProto(ts)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
|
|
@ -20,8 +20,6 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/golang/protobuf/ptypes/timestamp"
|
||||
"github.com/prometheus/common/model"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/net/context"
|
||||
|
@ -78,15 +76,6 @@ func (l *testNflog) GC() (int, error) {
|
|||
func (l *testNflog) Snapshot(w io.Writer) (int, error) {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func mustTimestampProto(ts time.Time) *timestamp.Timestamp {
|
||||
tspb, err := ptypes.TimestampProto(ts)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return tspb
|
||||
}
|
||||
|
||||
func TestDedupStageNeedsUpdate(t *testing.T) {
|
||||
now := utcNow()
|
||||
|
||||
|
@ -109,14 +98,14 @@ func TestDedupStageNeedsUpdate(t *testing.T) {
|
|||
}, {
|
||||
entry: &nflogpb.Entry{
|
||||
GroupHash: []byte{1, 2, 3},
|
||||
Timestamp: nil, // parsing will error
|
||||
Timestamp: time.Time{}, // parsing will error
|
||||
},
|
||||
hash: []byte{1, 2, 3},
|
||||
resErr: true,
|
||||
}, {
|
||||
entry: &nflogpb.Entry{
|
||||
GroupHash: []byte{1, 2, 3},
|
||||
Timestamp: mustTimestampProto(now.Add(-9 * time.Minute)),
|
||||
Timestamp: now.Add(-9 * time.Minute),
|
||||
},
|
||||
repeat: 10 * time.Minute,
|
||||
hash: []byte{1, 2, 3},
|
||||
|
@ -124,7 +113,7 @@ func TestDedupStageNeedsUpdate(t *testing.T) {
|
|||
}, {
|
||||
entry: &nflogpb.Entry{
|
||||
GroupHash: []byte{1, 2, 3},
|
||||
Timestamp: mustTimestampProto(now.Add(-11 * time.Minute)),
|
||||
Timestamp: now.Add(-11 * time.Minute),
|
||||
},
|
||||
repeat: 10 * time.Minute,
|
||||
hash: []byte{1, 2, 3},
|
||||
|
@ -413,7 +402,7 @@ func TestSilenceStage(t *testing.T) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
if _, err := silences.Create(&silencepb.Silence{
|
||||
EndsAt: mustTimestampProto(utcNow().Add(time.Hour)),
|
||||
EndsAt: utcNow().Add(time.Hour),
|
||||
Matchers: []*silencepb.Matcher{{Name: "mute", Pattern: "me"}},
|
||||
}); err != nil {
|
||||
t.Fatal(err)
|
||||
|
|
|
@ -23,7 +23,6 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/golang/protobuf/ptypes/timestamp"
|
||||
pb "github.com/prometheus/alertmanager/silence/silencepb"
|
||||
"github.com/prometheus/common/model"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
@ -80,7 +79,7 @@ func TestSilencesGC(t *testing.T) {
|
|||
s.now = func() time.Time { return now }
|
||||
|
||||
newSilence := func(exp time.Time) *pb.MeshSilence {
|
||||
return &pb.MeshSilence{ExpiresAt: mustTimeProto(exp)}
|
||||
return &pb.MeshSilence{ExpiresAt: exp}
|
||||
}
|
||||
s.st = gossipData{
|
||||
"1": newSilence(now),
|
||||
|
@ -113,11 +112,11 @@ func TestSilencesSnapshot(t *testing.T) {
|
|||
{Name: "label1", Pattern: "val1", Type: pb.Matcher_EQUAL},
|
||||
{Name: "label2", Pattern: "val.+", Type: pb.Matcher_REGEXP},
|
||||
},
|
||||
StartsAt: mustTimeProto(now),
|
||||
EndsAt: mustTimeProto(now),
|
||||
UpdatedAt: mustTimeProto(now),
|
||||
StartsAt: now,
|
||||
EndsAt: now,
|
||||
UpdatedAt: now,
|
||||
},
|
||||
ExpiresAt: mustTimeProto(now),
|
||||
ExpiresAt: now,
|
||||
},
|
||||
{
|
||||
Silence: &pb.Silence{
|
||||
|
@ -125,11 +124,11 @@ func TestSilencesSnapshot(t *testing.T) {
|
|||
Matchers: []*pb.Matcher{
|
||||
{Name: "label1", Pattern: "val1", Type: pb.Matcher_EQUAL},
|
||||
},
|
||||
StartsAt: mustTimeProto(now.Add(time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now),
|
||||
StartsAt: now.Add(time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now,
|
||||
},
|
||||
ExpiresAt: mustTimeProto(now.Add(24 * time.Hour)),
|
||||
ExpiresAt: now.Add(24 * time.Hour),
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -176,7 +175,7 @@ func TestSilencesSetSilence(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
|
||||
now := utcNow()
|
||||
nowpb := mustTimeProto(now)
|
||||
nowpb := now
|
||||
|
||||
sil := &pb.Silence{
|
||||
Id: "some_id",
|
||||
|
@ -186,7 +185,7 @@ func TestSilencesSetSilence(t *testing.T) {
|
|||
want := gossipData{
|
||||
"some_id": &pb.MeshSilence{
|
||||
Silence: sil,
|
||||
ExpiresAt: mustTimeProto(now.Add(time.Minute)),
|
||||
ExpiresAt: now.Add(time.Minute),
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -217,8 +216,8 @@ func TestSilenceCreate(t *testing.T) {
|
|||
// Insert silence with fixed start time.
|
||||
sil1 := &pb.Silence{
|
||||
Matchers: []*pb.Matcher{{Name: "a", Pattern: "b"}},
|
||||
StartsAt: mustTimeProto(now.Add(2 * time.Minute)),
|
||||
EndsAt: mustTimeProto(now.Add(5 * time.Minute)),
|
||||
StartsAt: now.Add(2 * time.Minute),
|
||||
EndsAt: now.Add(5 * time.Minute),
|
||||
}
|
||||
id1, err := s.Create(sil1)
|
||||
require.NoError(t, err)
|
||||
|
@ -229,11 +228,11 @@ func TestSilenceCreate(t *testing.T) {
|
|||
Silence: &pb.Silence{
|
||||
Id: id1,
|
||||
Matchers: []*pb.Matcher{{Name: "a", Pattern: "b"}},
|
||||
StartsAt: mustTimeProto(now.Add(2 * time.Minute)),
|
||||
EndsAt: mustTimeProto(now.Add(5 * time.Minute)),
|
||||
UpdatedAt: mustTimeProto(now),
|
||||
StartsAt: now.Add(2 * time.Minute),
|
||||
EndsAt: now.Add(5 * time.Minute),
|
||||
UpdatedAt: now,
|
||||
},
|
||||
ExpiresAt: mustTimeProto(now.Add(5*time.Minute + s.retention)),
|
||||
ExpiresAt: now.Add(5*time.Minute + s.retention),
|
||||
},
|
||||
}
|
||||
require.Equal(t, want, s.st, "unexpected state after silence creation")
|
||||
|
@ -241,7 +240,7 @@ func TestSilenceCreate(t *testing.T) {
|
|||
// Insert silence with unset start time. Must be set to now.
|
||||
sil2 := &pb.Silence{
|
||||
Matchers: []*pb.Matcher{{Name: "a", Pattern: "b"}},
|
||||
EndsAt: mustTimeProto(now.Add(1 * time.Minute)),
|
||||
EndsAt: now.Add(1 * time.Minute),
|
||||
}
|
||||
id2, err := s.Create(sil2)
|
||||
require.NoError(t, err)
|
||||
|
@ -252,21 +251,21 @@ func TestSilenceCreate(t *testing.T) {
|
|||
Silence: &pb.Silence{
|
||||
Id: id1,
|
||||
Matchers: []*pb.Matcher{{Name: "a", Pattern: "b"}},
|
||||
StartsAt: mustTimeProto(now.Add(2 * time.Minute)),
|
||||
EndsAt: mustTimeProto(now.Add(5 * time.Minute)),
|
||||
UpdatedAt: mustTimeProto(now),
|
||||
StartsAt: now.Add(2 * time.Minute),
|
||||
EndsAt: now.Add(5 * time.Minute),
|
||||
UpdatedAt: now,
|
||||
},
|
||||
ExpiresAt: mustTimeProto(now.Add(5*time.Minute + s.retention)),
|
||||
ExpiresAt: now.Add(5*time.Minute + s.retention),
|
||||
},
|
||||
id2: &pb.MeshSilence{
|
||||
Silence: &pb.Silence{
|
||||
Id: id2,
|
||||
Matchers: []*pb.Matcher{{Name: "a", Pattern: "b"}},
|
||||
StartsAt: mustTimeProto(now),
|
||||
EndsAt: mustTimeProto(now.Add(1 * time.Minute)),
|
||||
UpdatedAt: mustTimeProto(now),
|
||||
StartsAt: now,
|
||||
EndsAt: now.Add(1 * time.Minute),
|
||||
UpdatedAt: now,
|
||||
},
|
||||
ExpiresAt: mustTimeProto(now.Add(1*time.Minute + s.retention)),
|
||||
ExpiresAt: now.Add(1*time.Minute + s.retention),
|
||||
},
|
||||
}
|
||||
require.Equal(t, want, s.st, "unexpected state after silence creation")
|
||||
|
@ -288,7 +287,7 @@ func TestSilencesCreateFail(t *testing.T) {
|
|||
s: &pb.Silence{Id: "some_id"},
|
||||
err: "unexpected ID in new silence",
|
||||
}, {
|
||||
s: &pb.Silence{StartsAt: mustTimeProto(now.Add(-time.Minute))},
|
||||
s: &pb.Silence{StartsAt: now.Add(-time.Minute)},
|
||||
err: "new silence must not start in the past",
|
||||
}, {
|
||||
s: &pb.Silence{}, // Silence without matcher.
|
||||
|
@ -323,24 +322,24 @@ func TestQState(t *testing.T) {
|
|||
}{
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(time.Minute)),
|
||||
EndsAt: mustTimeProto(now.Add(time.Hour)),
|
||||
StartsAt: now.Add(time.Minute),
|
||||
EndsAt: now.Add(time.Hour),
|
||||
},
|
||||
states: []SilenceState{StateActive, StateExpired},
|
||||
keep: false,
|
||||
},
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(time.Minute)),
|
||||
EndsAt: mustTimeProto(now.Add(time.Hour)),
|
||||
StartsAt: now.Add(time.Minute),
|
||||
EndsAt: now.Add(time.Hour),
|
||||
},
|
||||
states: []SilenceState{StatePending},
|
||||
keep: true,
|
||||
},
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(time.Minute)),
|
||||
EndsAt: mustTimeProto(now.Add(time.Hour)),
|
||||
StartsAt: now.Add(time.Minute),
|
||||
EndsAt: now.Add(time.Hour),
|
||||
},
|
||||
states: []SilenceState{StateExpired, StatePending},
|
||||
keep: true,
|
||||
|
@ -351,7 +350,7 @@ func TestQState(t *testing.T) {
|
|||
QState(c.states...)(q)
|
||||
f := q.filters[0]
|
||||
|
||||
keep, err := f(c.sil, nil, mustTimeProto(now))
|
||||
keep, err := f(c.sil, nil, now)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, c.keep, keep, "unexpected filter result for case %d", i)
|
||||
}
|
||||
|
@ -409,7 +408,7 @@ func TestQMatches(t *testing.T) {
|
|||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
drop, err := f(c.sil, &Silences{mc: matcherCache{}}, nil)
|
||||
drop, err := f(c.sil, &Silences{mc: matcherCache{}}, time.Time{})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, c.drop, drop, "unexpected filter result")
|
||||
}
|
||||
|
@ -455,7 +454,7 @@ func TestSilencesQuery(t *testing.T) {
|
|||
// Retrieve all and filter
|
||||
q: &query{
|
||||
filters: []silenceFilter{
|
||||
func(sil *pb.Silence, _ *Silences, _ *timestamp.Timestamp) (bool, error) {
|
||||
func(sil *pb.Silence, _ *Silences, _ time.Time) (bool, error) {
|
||||
return sil.Id == "1" || sil.Id == "2", nil
|
||||
},
|
||||
},
|
||||
|
@ -470,7 +469,7 @@ func TestSilencesQuery(t *testing.T) {
|
|||
q: &query{
|
||||
ids: []string{"2", "5"},
|
||||
filters: []silenceFilter{
|
||||
func(sil *pb.Silence, _ *Silences, _ *timestamp.Timestamp) (bool, error) {
|
||||
func(sil *pb.Silence, _ *Silences, _ time.Time) (bool, error) {
|
||||
return sil.Id == "1" || sil.Id == "2", nil
|
||||
},
|
||||
},
|
||||
|
@ -483,7 +482,7 @@ func TestSilencesQuery(t *testing.T) {
|
|||
|
||||
for _, c := range cases {
|
||||
// Run default query of retrieving all silences.
|
||||
res, err := s.query(c.q, nil)
|
||||
res, err := s.query(c.q, time.Time{})
|
||||
require.NoError(t, err, "unexpected error on querying")
|
||||
|
||||
// Currently there are no sorting guarantees in the querying API.
|
||||
|
@ -504,99 +503,99 @@ func TestSilenceSetTimeRange(t *testing.T) {
|
|||
|
||||
cases := []struct {
|
||||
sil *pb.Silence
|
||||
start, end *timestamp.Timestamp
|
||||
start, end time.Time
|
||||
err string
|
||||
}{
|
||||
// Bad arguments.
|
||||
{
|
||||
sil: &pb.Silence{},
|
||||
start: mustTimeProto(now),
|
||||
end: mustTimeProto(now.Add(-time.Minute)),
|
||||
start: now,
|
||||
end: now.Add(-time.Minute),
|
||||
err: "end time must not be before start time",
|
||||
},
|
||||
// Expired silence.
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(-time.Second)),
|
||||
StartsAt: now.Add(-time.Hour),
|
||||
EndsAt: now.Add(-time.Second),
|
||||
},
|
||||
start: mustTimeProto(now),
|
||||
end: mustTimeProto(now),
|
||||
start: now,
|
||||
end: now,
|
||||
err: "expired silence must not be modified",
|
||||
},
|
||||
// Pending silences.
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
StartsAt: now.Add(time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now.Add(-time.Hour),
|
||||
},
|
||||
start: mustTimeProto(now.Add(-time.Minute)),
|
||||
end: mustTimeProto(now.Add(time.Hour)),
|
||||
start: now.Add(-time.Minute),
|
||||
end: now.Add(time.Hour),
|
||||
err: "start time cannot be set into the past",
|
||||
},
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
StartsAt: now.Add(time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now.Add(-time.Hour),
|
||||
},
|
||||
start: mustTimeProto(now.Add(time.Minute)),
|
||||
end: mustTimeProto(now.Add(time.Minute)),
|
||||
start: now.Add(time.Minute),
|
||||
end: now.Add(time.Minute),
|
||||
},
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
StartsAt: now.Add(time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now.Add(-time.Hour),
|
||||
},
|
||||
start: mustTimeProto(now), // set to exactly start now.
|
||||
end: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
start: now, // set to exactly start now.
|
||||
end: now.Add(2 * time.Hour),
|
||||
},
|
||||
// Active silences.
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
StartsAt: now.Add(-time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now.Add(-time.Hour),
|
||||
},
|
||||
start: mustTimeProto(now.Add(-time.Minute)),
|
||||
end: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
start: now.Add(-time.Minute),
|
||||
end: now.Add(2 * time.Hour),
|
||||
err: "start time of active silence cannot be modified",
|
||||
},
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
StartsAt: now.Add(-time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now.Add(-time.Hour),
|
||||
},
|
||||
start: mustTimeProto(now.Add(-time.Hour)),
|
||||
end: mustTimeProto(now.Add(-time.Second)),
|
||||
start: now.Add(-time.Hour),
|
||||
end: now.Add(-time.Second),
|
||||
err: "end time cannot be set into the past",
|
||||
},
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
StartsAt: now.Add(-time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now.Add(-time.Hour),
|
||||
},
|
||||
start: mustTimeProto(now.Add(-time.Hour)),
|
||||
end: mustTimeProto(now),
|
||||
start: now.Add(-time.Hour),
|
||||
end: now,
|
||||
},
|
||||
{
|
||||
sil: &pb.Silence{
|
||||
StartsAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now.Add(-time.Hour)),
|
||||
StartsAt: now.Add(-time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now.Add(-time.Hour),
|
||||
},
|
||||
start: mustTimeProto(now.Add(-time.Hour)),
|
||||
end: mustTimeProto(now.Add(3 * time.Hour)),
|
||||
start: now.Add(-time.Hour),
|
||||
end: now.Add(3 * time.Hour),
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
origSilence := cloneSilence(c.sil)
|
||||
|
||||
sil, err := silenceSetTimeRange(c.sil, mustTimeProto(now), c.start, c.end)
|
||||
sil, err := silenceSetTimeRange(c.sil, now, c.start, c.end)
|
||||
if err == nil {
|
||||
if c.err != "" {
|
||||
t.Errorf("expected error containing %q but got none", c.err)
|
||||
|
@ -606,7 +605,7 @@ func TestSilenceSetTimeRange(t *testing.T) {
|
|||
|
||||
require.Equal(t, sil.StartsAt, c.start)
|
||||
require.Equal(t, sil.EndsAt, c.end)
|
||||
require.Equal(t, sil.UpdatedAt, mustTimeProto(now))
|
||||
require.Equal(t, sil.UpdatedAt, now)
|
||||
continue
|
||||
}
|
||||
if err != nil && c.err == "" {
|
||||
|
@ -684,8 +683,8 @@ func TestValidateMatcher(t *testing.T) {
|
|||
func TestValidateSilence(t *testing.T) {
|
||||
var (
|
||||
now = utcNow()
|
||||
invalidTimestamp = ×tamp.Timestamp{Nanos: 1 << 30}
|
||||
validTimestamp = mustTimeProto(now)
|
||||
invalidTimestamp = time.Unix(0, 1<<30)
|
||||
validTimestamp = now
|
||||
)
|
||||
cases := []struct {
|
||||
s *pb.Silence
|
||||
|
@ -744,8 +743,8 @@ func TestValidateSilence(t *testing.T) {
|
|||
Matchers: []*pb.Matcher{
|
||||
&pb.Matcher{Name: "a", Pattern: "b"},
|
||||
},
|
||||
StartsAt: mustTimeProto(now),
|
||||
EndsAt: mustTimeProto(now.Add(-time.Second)),
|
||||
StartsAt: now,
|
||||
EndsAt: now.Add(-time.Second),
|
||||
UpdatedAt: validTimestamp,
|
||||
},
|
||||
err: "end time must not be before start time",
|
||||
|
@ -812,7 +811,7 @@ func TestGossipDataMerge(t *testing.T) {
|
|||
// merging logic.
|
||||
newSilence := func(ts time.Time) *pb.MeshSilence {
|
||||
return &pb.MeshSilence{
|
||||
Silence: &pb.Silence{UpdatedAt: mustTimeProto(ts)},
|
||||
Silence: &pb.Silence{UpdatedAt: ts},
|
||||
}
|
||||
}
|
||||
cases := []struct {
|
||||
|
@ -878,11 +877,11 @@ func TestGossipDataCoding(t *testing.T) {
|
|||
{Name: "label1", Pattern: "val1", Type: pb.Matcher_EQUAL},
|
||||
{Name: "label2", Pattern: "val.+", Type: pb.Matcher_REGEXP},
|
||||
},
|
||||
StartsAt: mustTimeProto(now),
|
||||
EndsAt: mustTimeProto(now),
|
||||
UpdatedAt: mustTimeProto(now),
|
||||
StartsAt: now,
|
||||
EndsAt: now,
|
||||
UpdatedAt: now,
|
||||
},
|
||||
ExpiresAt: mustTimeProto(now),
|
||||
ExpiresAt: now,
|
||||
},
|
||||
{
|
||||
Silence: &pb.Silence{
|
||||
|
@ -890,11 +889,11 @@ func TestGossipDataCoding(t *testing.T) {
|
|||
Matchers: []*pb.Matcher{
|
||||
{Name: "label1", Pattern: "val1", Type: pb.Matcher_EQUAL},
|
||||
},
|
||||
StartsAt: mustTimeProto(now.Add(time.Hour)),
|
||||
EndsAt: mustTimeProto(now.Add(2 * time.Hour)),
|
||||
UpdatedAt: mustTimeProto(now),
|
||||
StartsAt: now.Add(time.Hour),
|
||||
EndsAt: now.Add(2 * time.Hour),
|
||||
UpdatedAt: now,
|
||||
},
|
||||
ExpiresAt: mustTimeProto(now.Add(24 * time.Hour)),
|
||||
ExpiresAt: now.Add(24 * time.Hour),
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -952,11 +951,3 @@ func TestProtoBefore(t *testing.T) {
|
|||
require.Equal(t, c.before, res, "protoBefore returned unexpected result")
|
||||
}
|
||||
}
|
||||
|
||||
func mustTimeProto(ts time.Time) *timestamp.Timestamp {
|
||||
pt, err := ptypes.TimestampProto(ts)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return pt
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue