diff --git a/go.mod b/go.mod index 8ea04646e6f..47b47462c3d 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/gorilla/websocket v1.4.1 github.com/gosimple/slug v1.4.2 github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 - github.com/grafana/grafana-plugin-sdk-go v0.30.0 + github.com/grafana/grafana-plugin-sdk-go v0.31.0 github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd github.com/hashicorp/go-plugin v1.0.1 github.com/hashicorp/go-version v1.1.0 @@ -65,6 +65,7 @@ require ( github.com/uber/jaeger-lib v2.2.0+incompatible // indirect github.com/unknwon/com v1.0.1 github.com/urfave/cli/v2 v2.1.1 + github.com/xorcare/pointer v1.1.0 github.com/yudai/gojsondiff v1.0.0 github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect github.com/yudai/pp v2.0.1+incompatible // indirect diff --git a/go.sum b/go.sum index 3b04a5e224b..3bfe8a530a7 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +<<<<<<< Updated upstream cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -91,19 +92,15 @@ github.com/go-xorm/builder v0.3.2/go.mod h1:v8mE3MFBgtL+RGFNfUnAMUqqfk/Y4W5KuwCF github.com/go-xorm/core v0.6.0/go.mod h1:d8FJ9Br8OGyQl12MCclmYBuBqqxsyeedpXciV5Myih8= github.com/go-xorm/core v0.6.2 h1:EJLcSxf336POJr670wKB55Mah9f93xzvGYzNRgnT8/Y= github.com/go-xorm/core v0.6.2/go.mod h1:bwPIfLdm/FzWgVUH8WPVlr+uJhscvNGFcaZKXsI3n2c= -github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM= github.com/go-xorm/xorm v0.7.1 h1:Kj7mfuqctPdX60zuxP6EoEut0f3E6K66H6hcoxiHUMc= github.com/go-xorm/xorm v0.7.1/go.mod h1:EHS1htMQFptzMaIHKyzqpHGw6C9Rtug75nsq6DA9unI= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= @@ -114,7 +111,6 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v1.11.0 h1:O7CEyB8Cb3/DmtxODGtLHcEvpr81Jm5qLg/hsHnxA2A= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -123,7 +119,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -133,8 +128,8 @@ github.com/gosimple/slug v1.4.2 h1:jDmprx3q/9Lfk4FkGZtvzDQ9Cj9eAmsjzeQGp24PeiQ= github.com/gosimple/slug v1.4.2/go.mod h1:ER78kgg1Mv0NQGlXiDe57DpCyfbNywXXZ9mIorhxAf0= github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 h1:SPdxCL9BChFTlyi0Khv64vdCW4TMna8+sxL7+Chx+Ag= github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4/go.mod h1:nc0XxBzjeGcrMltCDw269LoWF9S8ibhgxolCdA1R8To= -github.com/grafana/grafana-plugin-sdk-go v0.30.0 h1:G2mA0Vsh629aTG8FkpnUmPsWtLQocwCFMLMANjT1wgg= -github.com/grafana/grafana-plugin-sdk-go v0.30.0/go.mod h1:G6Ov9M+FDOZXNw8eKXINO6XzqdUvTs7huwyQp5jLTBQ= +github.com/grafana/grafana-plugin-sdk-go v0.31.0 h1:n4UscOh5T+KtOwk0iVbIOUD00Ig0qf3FgKKTlYf7TDg= +github.com/grafana/grafana-plugin-sdk-go v0.31.0/go.mod h1:G6Ov9M+FDOZXNw8eKXINO6XzqdUvTs7huwyQp5jLTBQ= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd h1:rNuUHR+CvK1IS89MMtcF0EpcVMZtjKfPRp4MEmt/aTs= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-plugin v1.0.1 h1:4OtAfUGbnKC6yS48p0CtMX2oFYtzFZVv6rok3cRWgnE= @@ -142,17 +137,13 @@ github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/log15 v0.0.0-20180818164646-67afb5ed74ec h1:CGkYB1Q7DSsH/ku+to+foV4agt2F2miquaLUgF6L178= github.com/inconshreveable/log15 v0.0.0-20180818164646-67afb5ed74ec/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= -github.com/jackc/pgx v3.2.0+incompatible h1:0Vihzu20St42/UDsvZGdNE6jak7oi/UOeMzwMPHkgFY= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -169,7 +160,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.10.1 h1:mbprTswkr0n86clAmJ4NGCFC4fdGySCAshWzrYb3xbE= github.com/jung-kurt/gofpdf v1.10.1/go.mod h1:s/VXv+TdctEOx2wCEguezYaR7f0OwUAd6H9VGfRkcSs= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/klauspost/compress v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -177,12 +167,9 @@ github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -197,7 +184,6 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -216,10 +202,8 @@ github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -237,7 +221,6 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0 h1:ElTg5tNp4DqfV7UQjDqv2+RJlNzsDtvNAWccbItceIE= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -259,11 +242,9 @@ github.com/russellhaering/goxmldsig v0.0.0-20180430223755-7acd5e4a6ef7/go.mod h1 github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -274,7 +255,6 @@ github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= @@ -282,11 +262,9 @@ github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:X github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -299,32 +277,27 @@ github.com/uber/jaeger-client-go v2.20.1+incompatible h1:HgqpYBng0n7tLJIlyT4kPCI github.com/uber/jaeger-client-go v2.20.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e h1:GSGeB9EAKY2spCABz6xOX5DbxZEXolK+nBSvmsQwRjM= github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/xorcare/pointer v1.1.0 h1:sFwXOhRF8QZ0tyVZrtxWGIoVZNEmRzBCaFWdONPQIUM= +github.com/xorcare/pointer v1.1.0/go.mod h1:6KLhkOh6YbuvZkT4YbxIbR/wzLBjyMxOiNzZhJTor2Y= github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/zenazn/goji v0.9.1-0.20160507202103-64eb34159fe5/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.uber.org/atomic v1.5.1 h1:rsqfU5vBkVknbhUGbAUwQKR2H4ItV8tjJ+6kJX4cxHM= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 h1:ACG4HJsFiNMf47Y4PeRoebLNy/2lXT9EtprMuTFWt1M= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -334,7 +307,6 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= @@ -350,7 +322,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -362,7 +333,6 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -375,16 +345,12 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69 h1:rOhMmluY6kLMhdnrivzec6lLgaVbMHMn2ISQXJeJ5EM= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f h1:68K/z8GLUxV76xGSqwTWw2gyk/jwn79LUL43rES2g8o= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -404,23 +370,19 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191213221258-04c2e8eff935 h1:kJQZhwFzSwJS2BxboKjdZzWczQOZx8VuH7Y8hhuGUtM= golang.org/x/tools v0.0.0-20191213221258-04c2e8eff935/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/grpc v1.14.0 h1:ArxJuB1NWfPY6r9Gp9gqwplT0Ge7nqv9msgu03lHLmo= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk= @@ -432,11 +394,8 @@ gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzyc gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e/go.mod h1:xsQCaysVCudhrYTfzYWe577fCe7Ceci+6qjO2Rdc0Z4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.46.0 h1:VeDZbLYGaupuvIrsYCEOe/L/2Pcs5n7hdO1ZTjporag= gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -452,12 +411,9 @@ gopkg.in/redis.v5 v5.2.9/go.mod h1:6gtv0/+A4iM08kdRfocWYB3bLX2tebpNtfKlFT6H4mY= gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/pkg/services/alerting/conditions/query.go b/pkg/services/alerting/conditions/query.go index cb9e015f615..e95142e4eef 100644 --- a/pkg/services/alerting/conditions/query.go +++ b/pkg/services/alerting/conditions/query.go @@ -13,6 +13,7 @@ import ( "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/alerting" "github.com/grafana/grafana/pkg/tsdb" + "github.com/grafana/grafana/pkg/util/errutil" ) func init() { @@ -168,12 +169,30 @@ func (c *QueryCondition) executeQuery(context *alerting.EvalContext, timeRange * return nil, fmt.Errorf("tsdb.HandleRequest() response error %v", v) } - result = append(result, v.Series...) + // If there are dataframes but no series on the result + useDataframes := v.Dataframes != nil && (v.Series == nil || len(v.Series) == 0) + + if useDataframes { // convert the dataframes to tsdb.TimeSeries + frames, err := tsdb.FramesFromBytes(v.Dataframes) + if err != nil { + return nil, errutil.Wrap("tsdb.HandleRequest() failed to unmarshal arrow dataframes from bytes", err) + } + + for _, frame := range frames { + ss, err := tsdb.FrameToSeriesSlice(frame) + if err != nil { + return nil, errutil.Wrapf(err, `tsdb.HandleRequest() failed to convert dataframe "%v" to tsdb.TimeSeriesSlice`, frame.Name) + } + result = append(result, ss...) + } + } else { + result = append(result, v.Series...) + } queryResultData := map[string]interface{}{} if context.IsTestRun { - queryResultData["series"] = v.Series + queryResultData["series"] = result } if context.IsDebug && v.Meta != nil { @@ -181,6 +200,9 @@ func (c *QueryCondition) executeQuery(context *alerting.EvalContext, timeRange * } if context.IsTestRun || context.IsDebug { + if useDataframes { + queryResultData["fromDataframe"] = true + } context.Logs = append(context.Logs, &alerting.ResultLogEntry{ Message: fmt.Sprintf("Condition[%d]: Query Result", c.Index), Data: simplejson.NewFromAny(queryResultData), diff --git a/pkg/services/alerting/conditions/query_test.go b/pkg/services/alerting/conditions/query_test.go index 3e4835ffa82..3e655d53286 100644 --- a/pkg/services/alerting/conditions/query_test.go +++ b/pkg/services/alerting/conditions/query_test.go @@ -3,7 +3,9 @@ package conditions import ( "context" "testing" + "time" + "github.com/grafana/grafana-plugin-sdk-go/data" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/components/null" "github.com/grafana/grafana/pkg/components/simplejson" @@ -51,6 +53,17 @@ func TestQueryCondition(t *testing.T) { So(cr.Firing, ShouldBeTrue) }) + Convey("should fire when avg is above 100 on dataframe", func() { + ctx.frame = data.NewFrame("", + data.NewField("time", nil, []time.Time{time.Now()}), + data.NewField("val", nil, []int64{120, 150}), + ) + cr, err := ctx.exec() + + So(err, ShouldBeNil) + So(cr.Firing, ShouldBeTrue) + }) + Convey("Should not fire when avg is below 100", func() { points := tsdb.NewTimeSeriesPointsFromArgs(90, 0) ctx.series = tsdb.TimeSeriesSlice{tsdb.NewTimeSeries("test1", points)} @@ -60,6 +73,17 @@ func TestQueryCondition(t *testing.T) { So(cr.Firing, ShouldBeFalse) }) + Convey("Should not fire when avg is below 100 on dataframe", func() { + ctx.frame = data.NewFrame("", + data.NewField("time", nil, []time.Time{time.Now()}), + data.NewField("val", nil, []int64{12, 47}), + ) + cr, err := ctx.exec() + + So(err, ShouldBeNil) + So(cr.Firing, ShouldBeFalse) + }) + Convey("Should fire if only first serie matches", func() { ctx.series = tsdb.TimeSeriesSlice{ tsdb.NewTimeSeries("test1", tsdb.NewTimeSeriesPointsFromArgs(120, 0)), @@ -144,6 +168,7 @@ type queryConditionTestContext struct { reducer string evaluator string series tsdb.TimeSeriesSlice + frame *data.Frame result *alerting.EvalContext condition *QueryCondition } @@ -168,10 +193,24 @@ func (ctx *queryConditionTestContext) exec() (*alerting.ConditionResult, error) ctx.condition = condition + qr := &tsdb.QueryResult{ + Series: ctx.series, + } + + if ctx.frame != nil { + bFrame, err := data.MarshalArrow(ctx.frame) + if err != nil { + return nil, err + } + qr = &tsdb.QueryResult{ + Dataframes: [][]byte{bFrame}, + } + } + condition.HandleRequest = func(context context.Context, dsInfo *models.DataSource, req *tsdb.TsdbQuery) (*tsdb.Response, error) { return &tsdb.Response{ Results: map[string]*tsdb.QueryResult{ - "A": {Series: ctx.series}, + "A": qr, }, }, nil } diff --git a/pkg/tsdb/frame_util.go b/pkg/tsdb/frame_util.go index f88ad39e583..deaa6cbfbb5 100644 --- a/pkg/tsdb/frame_util.go +++ b/pkg/tsdb/frame_util.go @@ -1,9 +1,12 @@ package tsdb import ( + "fmt" "time" "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/grafana/grafana/pkg/components/null" + "github.com/grafana/grafana/pkg/util/errutil" ) // SeriesToFrame converts a TimeSeries to a sdk Frame @@ -35,3 +38,72 @@ func convertTSDBTimePoint(point TimePoint) (t *time.Time, f *float64) { } return } + +// FrameToSeriesSlice converts a frame that is a valid time series as per data.TimeSeriesSchema() +// to a TimeSeriesSlice. +func FrameToSeriesSlice(frame *data.Frame) (TimeSeriesSlice, error) { + tsSchema := frame.TimeSeriesSchema() + if tsSchema.Type == data.TimeSeriesTypeNot { + return nil, fmt.Errorf("input frame is not recognized as a time series") + } + // If Long, make wide + if tsSchema.Type == data.TimeSeriesTypeLong { + var err error + frame, err = data.LongToWide(frame) + if err != nil { + return nil, errutil.Wrap("failed to convert long to wide series when converting from dataframe", err) + } + tsSchema = frame.TimeSeriesSchema() + } + + seriesCount := len(tsSchema.ValueIndices) + seriesSlice := make(TimeSeriesSlice, 0, seriesCount) + timeField := frame.Fields[tsSchema.TimeIndex] + timeNullFloatSlice := make([]null.Float, timeField.Len()) + + for i := 0; i < timeField.Len(); i++ { // built slice of time as epoch ms in null floats + tStamp, err := timeField.FloatAt(i) + if err != nil { + return nil, err + } + timeNullFloatSlice[i] = null.FloatFrom(tStamp) + } + + for _, fieldIdx := range tsSchema.ValueIndices { // create a TimeSeries for each value Field + field := frame.Fields[fieldIdx] + ts := &TimeSeries{ + Name: field.Name, + Tags: field.Labels.Copy(), + Points: make(TimeSeriesPoints, field.Len()), + } + + for rowIdx := 0; rowIdx < field.Len(); rowIdx++ { // for each value in the field, make a TimePoint + val, err := field.FloatAt(rowIdx) + if err != nil { + return nil, errutil.Wrapf(err, "failed to convert frame to tsdb.series, can not convert value %v to float", field.At(rowIdx)) + } + ts.Points[rowIdx] = TimePoint{ + null.FloatFrom(val), + timeNullFloatSlice[rowIdx], + } + } + + seriesSlice = append(seriesSlice, ts) + } + + return seriesSlice, nil + +} + +// FramesFromBytes returns a data.Frame slice from marshalled arrow dataframes. +func FramesFromBytes(bFrames [][]byte) ([]*data.Frame, error) { + frames := make([]*data.Frame, len(bFrames)) + for i, bFrame := range bFrames { + var err error + frames[i], err = data.UnmarshalArrow(bFrame) + if err != nil { + return nil, err + } + } + return frames, nil +} diff --git a/pkg/tsdb/frame_util_test.go b/pkg/tsdb/frame_util_test.go new file mode 100644 index 00000000000..d4a35192bf4 --- /dev/null +++ b/pkg/tsdb/frame_util_test.go @@ -0,0 +1,139 @@ +package tsdb + +import ( + "math" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/grafana/grafana/pkg/components/null" + "github.com/stretchr/testify/require" + "github.com/xorcare/pointer" +) + +func TestFrameToSeriesSlice(t *testing.T) { + tests := []struct { + name string + frame *data.Frame + seriesSlice TimeSeriesSlice + Err require.ErrorAssertionFunc + }{ + { + name: "a wide series", + frame: data.NewFrame("", + data.NewField("Time", nil, []time.Time{ + time.Date(2020, 1, 2, 3, 4, 0, 0, time.UTC), + time.Date(2020, 1, 2, 3, 4, 30, 0, time.UTC), + }), + data.NewField(`Values Int64s`, data.Labels{"Animal Factor": "cat"}, []*int64{ + nil, + pointer.Int64(3), + }), + data.NewField(`Values Floats`, data.Labels{"Animal Factor": "sloth"}, []float64{ + 2.0, + 4.0, + })), + + seriesSlice: TimeSeriesSlice{ + &TimeSeries{ + Name: "Values Int64s", + Tags: map[string]string{"Animal Factor": "cat"}, + Points: TimeSeriesPoints{ + TimePoint{null.FloatFrom(math.NaN()), null.FloatFrom(1577934240000)}, + TimePoint{null.FloatFrom(3), null.FloatFrom(1577934270000)}, + }, + }, + &TimeSeries{ + Name: "Values Floats", + Tags: map[string]string{"Animal Factor": "sloth"}, + Points: TimeSeriesPoints{ + TimePoint{null.FloatFrom(2), null.FloatFrom(1577934240000)}, + TimePoint{null.FloatFrom(4), null.FloatFrom(1577934270000)}, + }, + }, + }, + Err: require.NoError, + }, + { + name: "a long series", + frame: data.NewFrame("", + data.NewField("Time", nil, []time.Time{ + time.Date(2020, 1, 2, 3, 4, 0, 0, time.UTC), + time.Date(2020, 1, 2, 3, 4, 0, 0, time.UTC), + time.Date(2020, 1, 2, 3, 4, 30, 0, time.UTC), + time.Date(2020, 1, 2, 3, 4, 30, 0, time.UTC), + }), + data.NewField("Values Floats", nil, []float64{ + 1.0, + 2.0, + 3.0, + 4.0, + }), + data.NewField("Values Int64", nil, []int64{ + 1, + 2, + 3, + 4, + }), + data.NewField("Animal Factor", nil, []string{ + "cat", + "sloth", + "cat", + "sloth", + }), + data.NewField("Location", nil, []string{ + "Florida", + "Central & South America", + "Florida", + "Central & South America", + })), + + seriesSlice: TimeSeriesSlice{ + &TimeSeries{ + Name: "Values Floats", + Tags: map[string]string{"Animal Factor": "cat", "Location": "Florida"}, + Points: TimeSeriesPoints{ + TimePoint{null.FloatFrom(1), null.FloatFrom(1577934240000)}, + TimePoint{null.FloatFrom(3), null.FloatFrom(1577934270000)}, + }, + }, + &TimeSeries{ + Name: "Values Int64", + Tags: map[string]string{"Animal Factor": "cat", "Location": "Florida"}, + Points: TimeSeriesPoints{ + TimePoint{null.FloatFrom(1), null.FloatFrom(1577934240000)}, + TimePoint{null.FloatFrom(3), null.FloatFrom(1577934270000)}, + }, + }, + &TimeSeries{ + Name: "Values Floats", + Tags: map[string]string{"Animal Factor": "sloth", "Location": "Central & South America"}, + Points: TimeSeriesPoints{ + TimePoint{null.FloatFrom(2), null.FloatFrom(1577934240000)}, + TimePoint{null.FloatFrom(4), null.FloatFrom(1577934270000)}, + }, + }, + &TimeSeries{ + Name: "Values Int64", + Tags: map[string]string{"Animal Factor": "sloth", "Location": "Central & South America"}, + Points: TimeSeriesPoints{ + TimePoint{null.FloatFrom(2), null.FloatFrom(1577934240000)}, + TimePoint{null.FloatFrom(4), null.FloatFrom(1577934270000)}, + }, + }, + }, + Err: require.NoError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + seriesSlice, err := FrameToSeriesSlice(tt.frame) + tt.Err(t, err) + if diff := cmp.Diff(tt.seriesSlice, seriesSlice, cmpopts.EquateNaNs()); diff != "" { + t.Errorf("Result mismatch (-want +got):\n%s", diff) + } + }) + } +} diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/data/frame.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/data/frame.go index 8c2315954af..229ed9efba5 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/data/frame.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/data/frame.go @@ -7,6 +7,7 @@ import ( "fmt" "math" "sort" + "strconv" "strings" "time" @@ -344,6 +345,151 @@ func (f *Field) Nullable() bool { return f.Type().Nullable() } +// FloatAt returns a float64 at the specified index idx. +// It will panic if idx is out of range. +// If the Field type is numeric and the value at idx is nil, NaN is returned. Precision may be lost on large numbers. +// If the Field type is a bool then 0 is return if false or nil, and 1 if true. +// If the Field type is time.Time, then the millisecond epoch representation of the time +// is returned, or NaN is the value is nil. +// If the Field type is a string, then strconv.ParseFloat is called on it and will return +// an error if ParseFloat errors. If the value is nil, NaN is returned. +func (f *Field) FloatAt(idx int) (float64, error) { + switch f.Type() { + case FieldTypeInt8: + return float64(f.At(idx).(int8)), nil + case FieldTypeNullableInt8: + iv := f.At(idx).(*int8) + if iv == nil { + return math.NaN(), nil + } + return float64(*iv), nil + + case FieldTypeInt16: + return float64(f.At(idx).(int16)), nil + case FieldTypeNullableInt16: + iv := f.At(idx).(*int16) + if iv == nil { + return math.NaN(), nil + } + return float64(*iv), nil + + case FieldTypeInt32: + return float64(f.At(idx).(int32)), nil + case FieldTypeNullableInt32: + iv := f.At(idx).(*int32) + if iv == nil { + return math.NaN(), nil + } + return float64(*iv), nil + + case FieldTypeInt64: + return float64(f.At(idx).(int64)), nil + case FieldTypeNullableInt64: + iv := f.At(idx).(*int64) + if iv == nil { + return math.NaN(), nil + } + return float64(*iv), nil + + case FieldTypeUint8: + return float64(f.At(idx).(uint8)), nil + case FieldTypeNullableUint8: + uiv := f.At(idx).(*uint8) + if uiv == nil { + return math.NaN(), nil + } + return float64(*uiv), nil + + case FieldTypeUint16: + return float64(f.At(idx).(uint16)), nil + case FieldTypeNullableUint16: + uiv := f.At(idx).(*uint16) + if uiv == nil { + return math.NaN(), nil + } + return float64(*uiv), nil + + case FieldTypeUint32: + return float64(f.At(idx).(uint32)), nil + case FieldTypeNullableUint32: + uiv := f.At(idx).(*uint32) + if uiv == nil { + return math.NaN(), nil + } + return float64(*uiv), nil + + // TODO: third param for loss of precision? + // Maybe something in math/big can help with this (also see https://github.com/golang/go/issues/29463). + case FieldTypeUint64: + return float64(f.At(idx).(uint64)), nil + case FieldTypeNullableUint64: + uiv := f.At(idx).(*uint64) + if uiv == nil { + return math.NaN(), nil + } + return float64(*uiv), nil + + case FieldTypeFloat32: + return float64(f.At(idx).(float32)), nil + case FieldTypeNullableFloat32: + fv := f.At(idx).(*float32) + if fv == nil { + return math.NaN(), nil + } + return float64(*fv), nil + + case FieldTypeFloat64: + return f.At(idx).(float64), nil + case FieldTypeNullableFloat64: + fv := f.At(idx).(*float64) + if fv == nil { + return math.NaN(), nil + } + return *fv, nil + + case FieldTypeString: + s := f.At(idx).(string) + ft, err := strconv.ParseFloat(s, 64) + if err != nil { + return 0, err + } + return ft, nil + case FieldTypeNullableString: + s := f.At(idx).(*string) + if s == nil { + return math.NaN(), nil + } + ft, err := strconv.ParseFloat(*s, 64) + if err != nil { + return 0, err + } + return ft, nil + + case FieldTypeBool: + if f.At(idx).(bool) { + return 1, nil + } + return 0, nil + + case FieldTypeNullableBool: + b := f.At(idx).(*bool) + if b == nil || !*b { + return 0, nil + } + return 1, nil + + case FieldTypeTime: + return float64(f.At(idx).(time.Time).UnixNano() / int64(time.Millisecond)), nil + case FieldTypeNullableTime: + t := f.At(idx).(*time.Time) + if t == nil { + return math.NaN(), nil + } + return float64(f.At(idx).(*time.Time).UnixNano() / int64(time.Millisecond)), nil + } + return 0, fmt.Errorf("unsupported field type %T", f.Type()) +} + // SetConfig modifies the Field's Config property to // be set to conf and returns the Field. func (f *Field) SetConfig(conf *FieldConfig) *Field { @@ -507,6 +653,12 @@ func (f *Frame) RowLen() (int, error) { return l, nil } +// FloatAt returns a float64 representation of value of the specified fieldIdx and rowIdx as per Field.FloatAt(). +// It will panic if either the fieldIdx or rowIdx are out of range. +func (f *Frame) FloatAt(fieldIdx int, rowIdx int) (float64, error) { + return f.Fields[fieldIdx].FloatAt(rowIdx) +} + // FrameTestCompareOptions returns go-cmp testing options to allow testing of Frame equivelnce. // The intent is to only use this for testing. func FrameTestCompareOptions() []cmp.Option { @@ -538,7 +690,75 @@ func FrameTestCompareOptions() []cmp.Option { } return *x == *y }) + f64Ptrs := cmp.Comparer(func(x, y *float64) bool { + if x == nil && y == nil { + return true + } + if y == nil { + if math.IsNaN(float64(*x)) { + return true + } + if math.IsInf(float64(*x), 1) { + return true + } + if math.IsInf(float64(*x), -1) { + return true + } + } + if x == nil { + if math.IsNaN(float64(*y)) { + return true + } + if math.IsInf(float64(*y), 1) { + return true + } + if math.IsInf(float64(*y), -1) { + return true + } + } + return *x == *y + }) + f64s := cmp.Comparer(func(x, y float64) bool { + return (math.IsNaN(x) && math.IsNaN(y)) || + (math.IsInf(x, 1) && math.IsInf(y, 1)) || + (math.IsInf(x, -1) && math.IsInf(y, -1)) || + x == y + }) + f32Ptrs := cmp.Comparer(func(x, y *float32) bool { + if x == nil && y == nil { + return true + } + if y == nil { + if math.IsNaN(float64(*x)) { + return true + } + if math.IsInf(float64(*x), 1) { + return true + } + if math.IsInf(float64(*x), -1) { + return true + } + } + if x == nil { + if math.IsNaN(float64(*y)) { + return true + } + if math.IsInf(float64(*y), 1) { + return true + } + if math.IsInf(float64(*y), -1) { + return true + } + } + return *x == *y + }) + f32s := cmp.Comparer(func(x, y float32) bool { + return (math.IsNaN(float64(x)) && math.IsNaN(float64(y))) || + (math.IsInf(float64(x), 1) && math.IsInf(float64(y), 1)) || + (math.IsInf(float64(x), -1) && math.IsInf(float64(y), -1)) || + x == y + }) unexportedField := cmp.AllowUnexported(Field{}) - return []cmp.Option{confFloats, unexportedField, cmpopts.EquateEmpty()} + return []cmp.Option{f32s, f32Ptrs, f64s, f64Ptrs, confFloats, unexportedField, cmpopts.EquateEmpty()} } diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/data/vector.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/data/vector.go index ae935cd2072..0a1bc1862c9 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/data/vector.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/data/vector.go @@ -542,6 +542,27 @@ func (p FieldType) Nullable() bool { return false } +// Numeric returns if Field type is a nullable type +func (p FieldType) Numeric() bool { + switch p { + case FieldTypeInt8, FieldTypeInt16, FieldTypeInt32, FieldTypeInt64: + return true + case FieldTypeNullableInt8, FieldTypeNullableInt16, FieldTypeNullableInt32, FieldTypeNullableInt64: + return true + + case FieldTypeUint8, FieldTypeUint16, FieldTypeUint32, FieldTypeUint64: + return true + case FieldTypeNullableUint8, FieldTypeNullableUint16, FieldTypeNullableUint32, FieldTypeNullableUint64: + return true + + case FieldTypeFloat32, FieldTypeFloat64: + return true + case FieldTypeNullableFloat32, FieldTypeNullableFloat64: + return true + } + return false +} + // numericFieldTypes is an array of FieldTypes that are numeric. var numericFieldTypes = [...]FieldType{ FieldTypeInt8, FieldTypeInt16, FieldTypeInt32, FieldTypeInt64, diff --git a/vendor/github.com/xorcare/pointer/.gitignore b/vendor/github.com/xorcare/pointer/.gitignore new file mode 100644 index 00000000000..46620af3324 --- /dev/null +++ b/vendor/github.com/xorcare/pointer/.gitignore @@ -0,0 +1 @@ +/coverage.out diff --git a/vendor/github.com/xorcare/pointer/LICENSE b/vendor/github.com/xorcare/pointer/LICENSE new file mode 100644 index 00000000000..9fc9bcdf0f6 --- /dev/null +++ b/vendor/github.com/xorcare/pointer/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright © 2019, Vasiliy Vasilyuk +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/xorcare/pointer/Makefile b/vendor/github.com/xorcare/pointer/Makefile new file mode 100644 index 00000000000..a4086edf28f --- /dev/null +++ b/vendor/github.com/xorcare/pointer/Makefile @@ -0,0 +1,68 @@ +# Based on https://git.io/fjkGc + +# The full path to the main package is use in the +# imports tool to format imports correctly. +NAMESPACE = github.com/xorcare/pointer + +# The name of the file recommended in the standard +# documentation go test -cover and used codecov.io +# to check code coverage. +COVER_FILE ?= coverage.out + +# Main targets. +.DEFAULT_GOAL := help + +.PHONY: build +build: ## Build the project binary + @go build ./... + +.PHONY: ci +ci: check ## Target for integration with ci pipeline + +.PHONY: check +check: static test build ## Check project with static checks and unit tests + +.PHONY: help +help: ## Print this help + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \ + awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: imports +imports: tools ## Check and fix import section by import rules + @test -z $$(for d in $$(go list -f {{.Dir}} ./...); do goimports -e -l -local $(NAMESPACE) -w $$d/*.go; done) + +.PHONY: lint +lint: tools ## Check the project with lint + @golint -set_exit_status ./... + +.PHONY: static +static: imports vet lint ## Run static checks (lint, imports, vet, ...) all over the project + +.PHONY: test +test: ## Run unit tests + @go test ./... -count=1 -race + @go test ./... -count=1 -coverprofile=$(COVER_FILE) -covermode=atomic $d + @go tool cover -func=$(COVER_FILE) | grep ^total + +CDTOOLS ?= @cd internal/tools && +.PHONY: tools +tools: ## Install all needed tools, e.g. for static checks + $(CDTOOLS) \ + go install \ + golang.org/x/lint/golint \ + golang.org/x/tools/cmd/goimports + +.PHONY: toolsup +toolsup: ## Update all needed tools, e.g. for static checks + $(CDTOOLS) \ + go mod tidy && \ + go get \ + golang.org/x/lint/golint@latest \ + golang.org/x/tools/cmd/goimports@latest && \ + go mod download && \ + go mod verify + $(MAKE) tools + +.PHONY: vet +vet: ## Check the project with vet + @go vet ./... diff --git a/vendor/github.com/xorcare/pointer/README.md b/vendor/github.com/xorcare/pointer/README.md new file mode 100644 index 00000000000..43db8dc0518 --- /dev/null +++ b/vendor/github.com/xorcare/pointer/README.md @@ -0,0 +1,54 @@ +# pointer + +[![Build Status](https://travis-ci.org/xorcare/pointer.svg?branch=master)](https://travis-ci.org/xorcare/pointer) +[![codecov](https://codecov.io/gh/xorcare/pointer/badge.svg)](https://codecov.io/gh/xorcare/pointer) +[![Go Report Card](https://goreportcard.com/badge/github.com/xorcare/pointer)](https://goreportcard.com/report/github.com/xorcare/pointer) +[![GoDoc](https://godoc.org/github.com/xorcare/pointer?status.svg)](https://godoc.org/github.com/xorcare/pointer) + +Package pointer contains helper routines for simplifying the creation +of optional fields of basic type. + +## Installation + +```bash +go get github.com/xorcare/pointer +``` + +## Examples + +Examples of using the library are presented on [godoc.org][GDE] +and in the [source library code](https://git.io/Jeg75). + +## FAQ + +| Question | Source | +| -------- | ------ | +| How to set **bool** pointer in a struct literal or variable? | `var _ *bool = pointer.Bool(true)` | +| How to set **byte** pointer in a struct literal or variable? | `var _ *byte = pointer.Byte(1)` | +| How to set **complex64** pointer in a struct literal or variable? | `var _ *complex64 = pointer.Complex64(1.1)` | +| How to set **complex128** pointer in a struct literal or variable? | `var _ *complex128 = pointer.Complex128(1.1)` | +| How to set **float32** pointer in a struct literal or variable? | `var _ *float32 = pointer.Float32(1.1)` | +| How to set **float64** pointer in a struct literal or variable? | `var _ *float64 = pointer.Float64(1.1)` | +| How to set **int** pointer in a struct literal or variable? | `var _ *int = pointer.Int(1)` | +| How to set **int8** pointer in a struct literal or variable? | `var _ *int8 = pointer.Int8(8)` | +| How to set **int16** pointer in a struct literal or variable? | `var _ *int16 = pointer.Int16(16)` | +| How to set **int32** pointer in a struct literal or variable? | `var _ *int32 = pointer.Int32(32)` | +| How to set **int64** pointer in a struct literal or variable? | `var _ *int64 = pointer.Int64(64)` | +| How to set **rune** pointer in a struct literal or variable? | `var _ *rune = pointer.Rune(1)` | +| How to set **string** pointer in a struct literal or variable? | `var _ *string = pointer.String("ptr")` | +| How to set **uint** pointer in a struct literal or variable? | `var _ *uint = pointer.Uint(1)` | +| How to set **uint8** pointer in a struct literal or variable? | `var _ *uint8 = pointer.Uint8(8)` | +| How to set **uint16** pointer in a struct literal or variable? | `var _ *uint16 = pointer.Uint16(16)` | +| How to set **uint32** pointer in a struct literal or variable? | `var _ *uint32 = pointer.Uint32(32)` | +| How to set **uint64** pointer in a struct literal or variable? | `var _ *uint64 = pointer.Uint64(64)` | +| How to set **time.Time** pointer in a struct literal or variable? | `var _ *time.Time = pointer.Time(time.Now())` | +| How to set **time.Duration** pointer in a struct literal or variable? | `var _ *time.Duration = pointer.Duration(time.Hour)` | + +## License + +© Vasiliy Vasilyuk, 2019-2020 + +Released under the [BSD 3-Clause License][LICENSE]. + +[LICENSE]: https://git.io/Jeg7Q 'BSD 3-Clause "New" or "Revised" License' +[GDE]: https://godoc.org/github.com/xorcare/pointer#pkg-examples 'Examples of using package pointer' diff --git a/vendor/github.com/xorcare/pointer/go.mod b/vendor/github.com/xorcare/pointer/go.mod new file mode 100644 index 00000000000..80a506f0750 --- /dev/null +++ b/vendor/github.com/xorcare/pointer/go.mod @@ -0,0 +1,3 @@ +module github.com/xorcare/pointer + +go 1.13 diff --git a/vendor/github.com/xorcare/pointer/pointer.go b/vendor/github.com/xorcare/pointer/pointer.go new file mode 100644 index 00000000000..ac173397dd7 --- /dev/null +++ b/vendor/github.com/xorcare/pointer/pointer.go @@ -0,0 +1,126 @@ +// Copyright © 2019-2020 Vasiliy Vasilyuk. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package pointer contains helper routines for simplifying the creation +// of optional fields of basic type. +package pointer + +import ( + "reflect" + "time" +) + +// Any is a helper routine that allocates a new interface value +// to store v and returns a pointer to it. +// +// // Usage: var _ *Type = pointer.Any(Type(value) | value).(*Type) +// +// var _ *bool = pointer.Any(true).(*bool) +// var _ *byte = pointer.Any(byte(1)).(*byte) +// var _ *complex64 = pointer.Any(complex64(1.1)).(*complex64) +// var _ *complex128 = pointer.Any(complex128(1.1)).(*complex128) +// var _ *float32 = pointer.Any(float32(1.1)).(*float32) +// var _ *float64 = pointer.Any(float64(1.1)).(*float64) +// var _ *int = pointer.Any(int(1)).(*int) +// var _ *int8 = pointer.Any(int8(8)).(*int8) +// var _ *int16 = pointer.Any(int16(16)).(*int16) +// var _ *int32 = pointer.Any(int32(32)).(*int32) +// var _ *int64 = pointer.Any(int64(64)).(*int64) +// var _ *rune = pointer.Any(rune(1)).(*rune) +// var _ *string = pointer.Any("ptr").(*string) +// var _ *uint = pointer.Any(uint(1)).(*uint) +// var _ *uint8 = pointer.Any(uint8(8)).(*uint8) +// var _ *uint16 = pointer.Any(uint16(16)).(*uint16) +// var _ *uint32 = pointer.Any(uint32(32)).(*uint32) +// var _ *uint64 = pointer.Any(uint64(64)).(*uint64) +// var _ *uintptr = pointer.Any(uintptr(64)).(*uintptr) +func Any(v interface{}) interface{} { + r := reflect.New(reflect.TypeOf(v)) + reflect.ValueOf(r.Interface()).Elem().Set(reflect.ValueOf(v)) + return r.Interface() +} + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { return &v } + +// Byte is a helper routine that allocates a new byte value +// to store v and returns a pointer to it. +func Byte(v byte) *byte { return &v } + +// Complex64 is a helper routine that allocates a new complex64 value +// to store v and returns a pointer to it. +func Complex64(v complex64) *complex64 { return &v } + +// Complex128 is a helper routine that allocates a new complex128 value +// to store v and returns a pointer to it. +func Complex128(v complex128) *complex128 { return &v } + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { return &v } + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { return &v } + +// Int is a helper routine that allocates a new int value +// to store v and returns a pointer to it. +func Int(v int) *int { return &v } + +// Int8 is a helper routine that allocates a new int8 value +// to store v and returns a pointer to it. +func Int8(v int8) *int8 { return &v } + +// Int16 is a helper routine that allocates a new int16 value +// to store v and returns a pointer to it. +func Int16(v int16) *int16 { return &v } + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { return &v } + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { return &v } + +// Rune is a helper routine that allocates a new rune value +// to store v and returns a pointer to it. +func Rune(v rune) *rune { return &v } + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { return &v } + +// Uint is a helper routine that allocates a new uint value +// to store v and returns a pointer to it. +func Uint(v uint) *uint { return &v } + +// Uint8 is a helper routine that allocates a new uint8 value +// to store v and returns a pointer to it. +func Uint8(v uint8) *uint8 { return &v } + +// Uint16 is a helper routine that allocates a new uint16 value +// to store v and returns a pointer to it. +func Uint16(v uint16) *uint16 { return &v } + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { return &v } + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { return &v } + +// Uintptr is a helper routine that allocates a new uintptr value +// to store v and returns a pointer to it. +func Uintptr(v uintptr) *uintptr { return &v } + +// Time is a helper routine that allocates a new time.Time value +// to store v and returns a pointer to it. +func Time(v time.Time) *time.Time { return &v } + +// Duration is a helper routine that allocates a new time.Duration value +// to store v and returns a pointer to it. +func Duration(v time.Duration) *time.Duration { return &v } diff --git a/vendor/modules.txt b/vendor/modules.txt index 474d02ccca8..9cb02d7b744 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -148,7 +148,7 @@ github.com/gosimple/slug # github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 github.com/grafana/grafana-plugin-model/go/datasource github.com/grafana/grafana-plugin-model/go/renderer -# github.com/grafana/grafana-plugin-sdk-go v0.30.0 +# github.com/grafana/grafana-plugin-sdk-go v0.31.0 github.com/grafana/grafana-plugin-sdk-go/backend/plugin github.com/grafana/grafana-plugin-sdk-go/data github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2 @@ -285,6 +285,8 @@ github.com/uber/jaeger-lib/metrics github.com/unknwon/com # github.com/urfave/cli/v2 v2.1.1 github.com/urfave/cli/v2 +# github.com/xorcare/pointer v1.1.0 +github.com/xorcare/pointer # github.com/yudai/gojsondiff v1.0.0 github.com/yudai/gojsondiff github.com/yudai/gojsondiff/formatter