2019-07-19 09:42:01 +00:00
|
|
|
package check_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/google/go-cmp/cmp"
|
2019-08-07 22:34:07 +00:00
|
|
|
"github.com/google/go-cmp/cmp/cmpopts"
|
|
|
|
"github.com/influxdata/flux/parser"
|
2019-07-19 09:42:01 +00:00
|
|
|
"github.com/influxdata/influxdb/notification"
|
|
|
|
|
|
|
|
"github.com/influxdata/influxdb/mock"
|
|
|
|
|
|
|
|
"github.com/influxdata/influxdb"
|
|
|
|
"github.com/influxdata/influxdb/notification/check"
|
|
|
|
influxTesting "github.com/influxdata/influxdb/testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
id1 = "020f755c3c082000"
|
|
|
|
id2 = "020f755c3c082001"
|
|
|
|
id3 = "020f755c3c082002"
|
|
|
|
)
|
|
|
|
|
2019-08-15 17:53:44 +00:00
|
|
|
func numPtr(f float64) *float64 {
|
|
|
|
p := new(float64)
|
|
|
|
*p = f
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
2019-07-19 09:42:01 +00:00
|
|
|
var goodBase = check.Base{
|
|
|
|
ID: influxTesting.MustIDBase16(id1),
|
|
|
|
Name: "name1",
|
|
|
|
AuthorizationID: influxTesting.MustIDBase16(id2),
|
|
|
|
OrgID: influxTesting.MustIDBase16(id3),
|
|
|
|
Status: influxdb.Active,
|
|
|
|
StatusMessageTemplate: "temp1",
|
|
|
|
Tags: []notification.Tag{
|
|
|
|
{Key: "k1", Value: "v1"},
|
|
|
|
{Key: "k2", Value: "v2"},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestValidCheck(t *testing.T) {
|
|
|
|
cases := []struct {
|
|
|
|
name string
|
|
|
|
src influxdb.Check
|
|
|
|
err error
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "invalid check id",
|
|
|
|
src: &check.Deadman{},
|
|
|
|
err: &influxdb.Error{
|
|
|
|
Code: influxdb.EInvalid,
|
|
|
|
Msg: "Check ID is invalid",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "empty name",
|
|
|
|
src: &check.Threshold{
|
|
|
|
Base: check.Base{
|
|
|
|
ID: influxTesting.MustIDBase16(id1),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
err: &influxdb.Error{
|
|
|
|
Code: influxdb.EInvalid,
|
|
|
|
Msg: "Check Name can't be empty",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "invalid auth id",
|
|
|
|
src: &check.Threshold{
|
|
|
|
Base: check.Base{
|
|
|
|
ID: influxTesting.MustIDBase16(id1),
|
|
|
|
Name: "name1",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
err: &influxdb.Error{
|
|
|
|
Code: influxdb.EInvalid,
|
|
|
|
Msg: "Check AuthorizationID is invalid",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "invalid org id",
|
|
|
|
src: &check.Threshold{
|
|
|
|
Base: check.Base{
|
|
|
|
ID: influxTesting.MustIDBase16(id1),
|
|
|
|
Name: "name1",
|
|
|
|
AuthorizationID: influxTesting.MustIDBase16(id2),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
err: &influxdb.Error{
|
|
|
|
Code: influxdb.EInvalid,
|
|
|
|
Msg: "Check OrgID is invalid",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "invalid status",
|
|
|
|
src: &check.Deadman{
|
|
|
|
Base: check.Base{
|
|
|
|
ID: influxTesting.MustIDBase16(id1),
|
|
|
|
Name: "name1",
|
|
|
|
AuthorizationID: influxTesting.MustIDBase16(id2),
|
|
|
|
OrgID: influxTesting.MustIDBase16(id3),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
err: &influxdb.Error{
|
|
|
|
Code: influxdb.EInvalid,
|
|
|
|
Msg: "invalid status",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "invalid tag",
|
|
|
|
src: &check.Deadman{
|
|
|
|
Base: check.Base{
|
|
|
|
ID: influxTesting.MustIDBase16(id1),
|
|
|
|
Name: "name1",
|
|
|
|
AuthorizationID: influxTesting.MustIDBase16(id2),
|
|
|
|
OrgID: influxTesting.MustIDBase16(id3),
|
|
|
|
Status: influxdb.Active,
|
|
|
|
StatusMessageTemplate: "temp1",
|
|
|
|
Tags: []notification.Tag{{Key: "key1"}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
err: &influxdb.Error{
|
|
|
|
Code: influxdb.EInvalid,
|
|
|
|
Msg: "tag must contain a key and a value",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "bad thredshold",
|
|
|
|
src: &check.Threshold{
|
2019-08-15 17:53:44 +00:00
|
|
|
Base: goodBase,
|
|
|
|
Thresholds: []check.ThresholdConfig{{}},
|
2019-07-19 09:42:01 +00:00
|
|
|
},
|
|
|
|
err: &influxdb.Error{
|
|
|
|
Code: influxdb.EInvalid,
|
2019-08-15 17:53:44 +00:00
|
|
|
Msg: "threshold must have at least one lowerBound or upperBound value",
|
2019-07-19 09:42:01 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, c := range cases {
|
|
|
|
got := c.src.Valid()
|
|
|
|
influxTesting.ErrorsEqual(t, got, c.err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var timeGen1 = mock.TimeGenerator{FakeValue: time.Date(2006, time.July, 13, 4, 19, 10, 0, time.UTC)}
|
|
|
|
var timeGen2 = mock.TimeGenerator{FakeValue: time.Date(2006, time.July, 14, 5, 23, 53, 10, time.UTC)}
|
|
|
|
|
2019-08-07 22:34:07 +00:00
|
|
|
func mustDuration(d string) *check.Duration {
|
|
|
|
dur, err := parser.ParseDuration(d)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return (*check.Duration)(dur)
|
|
|
|
}
|
|
|
|
|
2019-07-19 09:42:01 +00:00
|
|
|
func TestJSON(t *testing.T) {
|
|
|
|
cases := []struct {
|
|
|
|
name string
|
|
|
|
src influxdb.Check
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "simple Deadman",
|
|
|
|
src: &check.Deadman{
|
|
|
|
Base: check.Base{
|
|
|
|
ID: influxTesting.MustIDBase16(id1),
|
|
|
|
AuthorizationID: influxTesting.MustIDBase16(id2),
|
|
|
|
Name: "name1",
|
|
|
|
OrgID: influxTesting.MustIDBase16(id3),
|
|
|
|
Status: influxdb.Active,
|
2019-08-07 22:34:07 +00:00
|
|
|
Every: mustDuration("1h"),
|
2019-07-19 09:42:01 +00:00
|
|
|
Tags: []notification.Tag{
|
|
|
|
{
|
|
|
|
Key: "k1",
|
|
|
|
Value: "v1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "k2",
|
|
|
|
Value: "v2",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
CRUDLog: influxdb.CRUDLog{
|
|
|
|
CreatedAt: timeGen1.Now(),
|
|
|
|
UpdatedAt: timeGen2.Now(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
TimeSince: 33,
|
|
|
|
ReportZero: true,
|
|
|
|
Level: notification.Warn,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "simple threshold",
|
|
|
|
src: &check.Threshold{
|
|
|
|
Base: check.Base{
|
|
|
|
ID: influxTesting.MustIDBase16(id1),
|
|
|
|
Name: "name1",
|
|
|
|
AuthorizationID: influxTesting.MustIDBase16(id2),
|
|
|
|
OrgID: influxTesting.MustIDBase16(id3),
|
|
|
|
Status: influxdb.Active,
|
2019-08-07 22:34:07 +00:00
|
|
|
Every: mustDuration("1h"),
|
2019-07-19 09:42:01 +00:00
|
|
|
Tags: []notification.Tag{
|
|
|
|
{
|
|
|
|
Key: "k1",
|
|
|
|
Value: "v1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "k2",
|
|
|
|
Value: "v2",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
CRUDLog: influxdb.CRUDLog{
|
|
|
|
CreatedAt: timeGen1.Now(),
|
|
|
|
UpdatedAt: timeGen2.Now(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Thresholds: []check.ThresholdConfig{
|
2019-08-15 17:53:44 +00:00
|
|
|
{AllValues: true, LowerBound: numPtr(-1.36)},
|
|
|
|
{LowerBound: numPtr(10000), UpperBound: numPtr(500)},
|
2019-07-19 09:42:01 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, c := range cases {
|
|
|
|
b, err := json.Marshal(c.src)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("%s marshal failed, err: %s", c.name, err.Error())
|
|
|
|
}
|
|
|
|
got, err := check.UnmarshalJSON(b)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("%s unmarshal failed, err: %s", c.name, err.Error())
|
|
|
|
}
|
2019-08-07 22:34:07 +00:00
|
|
|
if diff := cmp.Diff(got, c.src, cmpopts.IgnoreFields(check.Duration{}, "BaseNode")); diff != "" {
|
2019-07-19 09:42:01 +00:00
|
|
|
t.Errorf("failed %s, Check are different -got/+want\ndiff %s", c.name, diff)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|