From fe628c62829728fe37bb0ef8ddfc0cd42506f966 Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki Date: Thu, 11 Mar 2021 21:28:00 +0200 Subject: [PATCH] AlertingNG: base API implementation (#31824) * AlertingNG: base API implementation * Pass the interface instead of the base impl * Ruler mock draft (WIP) * Update alerting-api dependency * Improve mock implementation --- go.mod | 14 +- go.sum | 53 ++++ pkg/services/ngalert/api/api.go | 10 + .../ngalert/api/api_alertmanager_base.go | 117 +++++++ .../ngalert/api/api_permissions_base.go | 47 +++ .../ngalert/api/api_prometheus_base.go | 44 +++ pkg/services/ngalert/api/api_ruler_base.go | 93 ++++++ pkg/services/ngalert/api/api_ruler_mock.go | 295 ++++++++++++++++++ pkg/services/ngalert/api/api_testing_base.go | 44 +++ .../ngalert/api/swagger-codegen/Makefile | 26 ++ .../api/swagger-codegen/move-and-rename.py | 7 + .../templates/controller-api.mustache | 38 +++ .../templates/partial_header.mustache | 6 + .../api/test-data/post-rulegroup-data.json | 30 ++ pkg/services/ngalert/api/util.go | 15 + pkg/services/ngalert/api/util_test.go | 27 ++ 16 files changed, 857 insertions(+), 9 deletions(-) create mode 100644 pkg/services/ngalert/api/api_alertmanager_base.go create mode 100644 pkg/services/ngalert/api/api_permissions_base.go create mode 100644 pkg/services/ngalert/api/api_prometheus_base.go create mode 100644 pkg/services/ngalert/api/api_ruler_base.go create mode 100644 pkg/services/ngalert/api/api_ruler_mock.go create mode 100644 pkg/services/ngalert/api/api_testing_base.go create mode 100644 pkg/services/ngalert/api/swagger-codegen/Makefile create mode 100644 pkg/services/ngalert/api/swagger-codegen/move-and-rename.py create mode 100644 pkg/services/ngalert/api/swagger-codegen/templates/controller-api.mustache create mode 100644 pkg/services/ngalert/api/swagger-codegen/templates/partial_header.mustache create mode 100644 pkg/services/ngalert/api/test-data/post-rulegroup-data.json create mode 100644 pkg/services/ngalert/api/util.go create mode 100644 pkg/services/ngalert/api/util_test.go diff --git a/go.mod b/go.mod index 7725d79a5a1..a75001deaf3 100644 --- a/go.mod +++ b/go.mod @@ -23,16 +23,13 @@ require ( github.com/crewjam/saml v0.4.6-0.20201227203850-bca570abb2ce github.com/davecgh/go-spew v1.1.1 github.com/denisenkom/go-mssqldb v0.0.0-20200910202707-1e08a3fab204 - github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect github.com/facebookgo/inject v0.0.0-20180706035515-f23751cae28b - github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect - github.com/facebookgo/structtag v0.0.0-20150214074306-217e25fb9691 // indirect - github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect github.com/fatih/color v1.10.0 github.com/gchaincl/sqlhooks v1.3.0 github.com/getsentry/sentry-go v0.10.0 github.com/go-macaron/binding v0.0.0-20190806013118-0b4f37bab25b github.com/go-macaron/gzip v0.0.0-20160222043647-cad1c6580a07 + github.com/go-openapi/strfmt v0.20.0 github.com/go-sourcemap/sourcemap v2.1.3+incompatible github.com/go-sql-driver/mysql v1.5.0 github.com/go-stack/stack v1.8.0 @@ -42,6 +39,7 @@ require ( github.com/google/go-cmp v0.5.5 github.com/google/uuid v1.2.0 github.com/gosimple/slug v1.9.0 + github.com/grafana/alerting-api v0.0.0-20210311171115-b0eb4577f38c github.com/grafana/grafana-aws-sdk v0.1.0 github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 github.com/grafana/grafana-plugin-sdk-go v0.88.0 @@ -54,7 +52,6 @@ require ( github.com/influxdata/influxdb-client-go/v2 v2.2.2 github.com/jaegertracing/jaeger v1.22.0 github.com/jmespath/go-jmespath v0.4.0 - github.com/jonboulle/clockwork v0.2.2 // indirect github.com/json-iterator/go v1.1.10 github.com/jung-kurt/gofpdf v1.16.2 github.com/lib/pq v1.10.0 @@ -65,9 +62,10 @@ require ( github.com/opentracing/opentracing-go v1.2.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/errors v0.9.1 + github.com/prometheus/alertmanager v0.21.1-0.20210211203738-a7ca7b1d2951 github.com/prometheus/client_golang v1.9.0 github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.18.0 + github.com/prometheus/common v0.18.1-0.20210305175002-2a23014b3b39 github.com/robfig/cron v0.0.0-20180505203441-b41be1df6967 github.com/robfig/cron/v3 v3.0.1 github.com/russellhaering/goxmldsig v1.1.0 @@ -91,8 +89,6 @@ require ( gonum.org/v1/gonum v0.8.2 google.golang.org/api v0.40.0 google.golang.org/grpc v1.36.0 - gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect - gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect gopkg.in/ini.v1 v1.62.0 gopkg.in/ldap.v3 v3.0.2 gopkg.in/macaron.v1 v1.4.0 @@ -102,4 +98,4 @@ require ( gopkg.in/yaml.v2 v2.4.0 xorm.io/core v0.7.3 xorm.io/xorm v0.8.2 -) +) \ No newline at end of file diff --git a/go.sum b/go.sum index e46871ed8f1..402c8dd9e9d 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,10 @@ github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdII github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -177,8 +179,10 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-lambda-go v1.17.0/go.mod h1:FEwgPLE6+8wcGBTe5cJN3JWurd1Ztm9zN4jsXsjzKKw= @@ -195,6 +199,7 @@ github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/ github.com/aws/aws-sdk-go v1.35.5/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.35.30/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.37.8/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.37.25/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.37.26 h1:D9Qvyjlr6xFR0CspZ0imdASc5Y1WE/Sgyte4l+cUp44= github.com/aws/aws-sdk-go v1.37.26/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= @@ -470,18 +475,22 @@ github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpR github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= +github.com/go-openapi/analysis v0.20.0 h1:UN09o0kNhleunxW7LR+KnltD0YrJ8FF03pSqvAN3Vro= github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.4 h1:fSGwO1tSYHFu70NKaWJt5Qh0qoBRtCm/mXS1yhf+0W0= github.com/go-openapi/errors v0.19.4/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.9 h1:9SnKdGhiPZHF3ttwFMiCBEb8jQ4IDdrK+5+a0oTygA4= github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= @@ -489,6 +498,7 @@ github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwds github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= @@ -496,6 +506,7 @@ github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -504,18 +515,22 @@ github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls= github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= +github.com/go-openapi/loads v0.20.2 h1:z5p5Xf5wujMxS1y8aP+vxwW5qYT2zdJBbXKmQUG3lcc= github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.18.0/go.mod h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.3/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15 h1:2GIefxs9Rx1vCDNghRtypRq+ig8KSLrjHbAYI/gCLCM= github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= +github.com/go-openapi/runtime v0.19.24 h1:TqagMVlRAOTwllE/7hNKx6rQ10O6T8ZzeJdMjSTKaD4= github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= @@ -530,6 +545,7 @@ github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFu github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= github.com/go-openapi/spec v0.20.2/go.mod h1:RW6Xcbs6LOyWLU/mXGdzn2Qc+3aj+ASfI7rvSZh1Vls= +github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= @@ -538,8 +554,10 @@ github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+Z github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= +github.com/go-openapi/strfmt v0.20.0 h1:l2omNtmNbMc39IGptl9BuXBEKcZfS8zjrTsPKTiJiDM= github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= @@ -552,16 +570,19 @@ github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfT github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= +github.com/go-openapi/validate v0.19.8 h1:YFzsdWIDfVuLvIOF+ZmKjVg1MbPJ1QgY9PihMwei1ys= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= +github.com/go-openapi/validate v0.20.2 h1:AhqDegYV3J3iQkMPJSXkvzymHKMTw0BST3RK3hTT4ts= github.com/go-openapi/validate v0.20.2/go.mod h1:e7OJoKNgd0twXZwIn0A43tHbvIcr/rZIVCbJBpTUoY0= github.com/go-redis/redis/v8 v8.0.0-beta.10.0.20200905143926-df7fe4e2ce72/go.mod h1:CJP1ZIHwhosNYwIdaHPZK9vHsM3+roNBaZ7U9Of1DXc= github.com/go-redis/redis/v8 v8.2.3/go.mod h1:ysgGY09J/QeDYbu3HikWEIPCwaeOkuNoTgKayTEaEOw= @@ -750,6 +771,7 @@ github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORR github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de h1:F7WD09S8QB4LrkEpka0dFPLSotH11HRpCsLIbIcJ7sU= github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -766,6 +788,13 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosimple/slug v1.9.0 h1:r5vDcYrFz9BmfIAMC829un9hq7hKM4cHUrsv36LbEqs= github.com/gosimple/slug v1.9.0/go.mod h1:AMZ+sOVe65uByN3kgEyf9WEBKBCSS+dJjMX9x4vDJbg= +github.com/grafana/alerting-api v0.0.0-20210310155814-c1ce61993143 h1:jPv8R9q52ItGl+FrQdZGzzBUKx+5vH14pJ81MXUmCM8= +github.com/grafana/alerting-api v0.0.0-20210310155814-c1ce61993143/go.mod h1:JH+OnDbaY14NcLgB+9mhFYyfLILhNtJjGTEoSVp2mzM= +github.com/grafana/alerting-api v0.0.0-20210311143043-45ae733ad75e h1:JkD9vPupGCuxBg6rwZekreqwXWDsZyQ/M6EHQCup24k= +github.com/grafana/alerting-api v0.0.0-20210311143043-45ae733ad75e/go.mod h1:5IppnPguSHcCbVLGCVzVjBvuQZNbYgVJ4KyXXjhCyWY= +github.com/grafana/alerting-api v0.0.0-20210311171115-b0eb4577f38c h1:xmmEjOGr87S1ZMinUTCA+ikMSLvJRrCYADZ9/ewMtWM= +github.com/grafana/alerting-api v0.0.0-20210311171115-b0eb4577f38c/go.mod h1:5IppnPguSHcCbVLGCVzVjBvuQZNbYgVJ4KyXXjhCyWY= +github.com/grafana/grafana v1.9.2-0.20210308201921-4ce0a49eac03/go.mod h1:AHRRvd4utJGY25J5nW8aL7wZzn/LcJ0z2za9oOp14j4= github.com/grafana/grafana-aws-sdk v0.1.0 h1:25TSkS57lvVen3nTCNMu5SdI8ju5Z0f7cvCsukhlqJc= github.com/grafana/grafana-aws-sdk v0.1.0/go.mod h1:+pPo5U+pX0zWimR7YBc7ASeSQfbRkcTyQYqMiAj7G5U= github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 h1:SPdxCL9BChFTlyi0Khv64vdCW4TMna8+sxL7+Chx+Ag= @@ -816,6 +845,7 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.14.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.15.0 h1:qMuK0wxsoW4D0ddCCYwPSTm4KQv1X1ke3WmPWZ0Mvsk= github.com/hashicorp/go-hclog v0.15.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= @@ -911,6 +941,7 @@ github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0Gqw github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jaegertracing/jaeger v1.21.0/go.mod h1:PCTGGFohQBPQMR4j333V5lt6If7tj8aWJ+pQNgvZ+wU= github.com/jaegertracing/jaeger v1.22.0 h1:kFBhBn9XSB8V68DjD3t6qb/IUAJLLtyJ/27caGQOu7E= github.com/jaegertracing/jaeger v1.22.0/go.mod h1:WnwW68MjJEViSLRQhe0nkIsBDaF3CzfFd8wJcpJv24k= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= @@ -939,6 +970,7 @@ github.com/jonboulle/clockwork v0.2.1/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUB github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/joncrlsn/dque v2.2.1-0.20200515025108-956d14155fa2+incompatible/go.mod h1:hDZb8oMj3Kp8MxtbNLg9vrtAUDHjgI1yZvqivT4O8Iw= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -1051,6 +1083,7 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= @@ -1190,6 +1223,7 @@ github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXW github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olivere/elastic v6.2.27+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= github.com/olivere/elastic v6.2.35+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1236,6 +1270,7 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/orijtech/prometheus-go-metrics-exporter v0.0.6/go.mod h1:BiTx/ugZex8LheBk3j53tktWaRdFjV5FCfT2o0P7msE= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -1278,8 +1313,11 @@ github.com/pquerna/cachecontrol v0.0.0-20200819021114-67c6ae64274f/go.mod h1:hoL github.com/prometheus/alertmanager v0.18.0/go.mod h1:WcxHBl40VSPuOaqWae6l6HpnEOVRIycEJ7i9iYkadEE= github.com/prometheus/alertmanager v0.19.0/go.mod h1:Eyp94Yi/T+kdeb2qvq66E3RGuph5T/jm/RBVh4yz1xo= github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= +github.com/prometheus/alertmanager v0.21.0 h1:qK51JcUR9l/unhawGA9F9B64OCYfcGewhPNprem/Acc= github.com/prometheus/alertmanager v0.21.0/go.mod h1:h7tJ81NA0VLWvWEayi1QltevFkLF3KxmC/malTcT8Go= github.com/prometheus/alertmanager v0.21.1-0.20200911160112-1fdff6b3f939/go.mod h1:imXRHOP6QTsE0fFsIsAV/cXimS32m7gVZOiUj11m6Ig= +github.com/prometheus/alertmanager v0.21.1-0.20210211203738-a7ca7b1d2951 h1:cRvcZrzWZ55FK2AzBgPk6M6MeWuYEW5ldp/Sv/C/LL4= +github.com/prometheus/alertmanager v0.21.1-0.20210211203738-a7ca7b1d2951/go.mod h1:6Yc2n2ap5/oP99x1yN6Ho+yL0w8a0oClIR5xxW/JLGs= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= @@ -1320,8 +1358,12 @@ github.com/prometheus/common v0.11.1/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.12.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.17.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.1-0.20210305175002-2a23014b3b39 h1:2B8F94QxZhfNPFQ1jLMjnuOigpr/hVXL7rHFPurXmY8= +github.com/prometheus/common v0.18.1-0.20210305175002-2a23014b3b39/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/exporter-toolkit v0.5.0/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg= github.com/prometheus/exporter-toolkit v0.5.1/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289 h1:dTUS1vaLWq+Y6XKOTnrFpoVsQKLCbCp1OLj24TDi7oM= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= @@ -1350,10 +1392,12 @@ github.com/prometheus/prometheus v1.8.2-0.20200805082714-e0cf219f0de2/go.mod h1: github.com/prometheus/prometheus v1.8.2-0.20200819132913-cb830b0a9c78/go.mod h1:zfAqy/MwhMFajB9E2n12/9gG2fvofIE9uKDtlZCDxqs= github.com/prometheus/prometheus v1.8.2-0.20200923143134-7e2db3d092f3/go.mod h1:9VNWoDFHOMovlubld5uKKxfCDcPBj2GMOCjcUFXkYaM= github.com/prometheus/prometheus v1.8.2-0.20201014093524-73e2ce1bd643/go.mod h1:XYjkJiog7fyQu3puQNivZPI2pNq1C/775EIoHfDvuvY= +github.com/prometheus/prometheus v1.8.2-0.20201105135750-00f16d1ac3a4/go.mod h1:XYjkJiog7fyQu3puQNivZPI2pNq1C/775EIoHfDvuvY= github.com/prometheus/prometheus v1.8.2-0.20210217141258-a6be548dbc17 h1:VN3p3NbbZyIucZfW7mHLxsoyDxwoVnYTXwN7IFIA9u4= github.com/prometheus/prometheus v1.8.2-0.20210217141258-a6be548dbc17/go.mod h1:dv3B1syqmkrkmo665MPCU6L8PbTXIiUeg/OEQULLNxA= github.com/prometheus/statsd_exporter v0.15.0/go.mod h1:Dv8HnkoLQkeEjkIE4/2ndAA7WL1zHKK7WMqFQqu72rw= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-ruleguard/dsl/fluent v0.0.0-20201222093424-5d7e62a465d3/go.mod h1:P7JlQWFT7jDcFZMtUPQbtGzzzxva3rBn6oIF+LPwFcM= github.com/rafaeljusto/redigomock v0.0.0-20190202135759-257e089e14a1/go.mod h1:JaY6n2sDr+z2WTsXkOmNRUfDy6FN0L6Nk7x06ndm4tY= github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be h1:ta7tUOvsPHVHGom5hKW5VXNc2xZIkfCKP8iaqOyYtUQ= github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q= @@ -1405,6 +1449,7 @@ github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcV github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= 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/shirou/gopsutil v3.20.12-0.20201210134652-afe0c04c5d5a+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v3.21.2+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= @@ -1484,6 +1529,7 @@ github.com/thanos-io/thanos v0.13.1-0.20200807203500-9b578afb4763/go.mod h1:KyW0 github.com/thanos-io/thanos v0.13.1-0.20201019130456-f41940581d9a h1:4rNkFHeY+EIR7UdiYn5fZE7Q35Y3Dmae8q1Qbb90tcY= github.com/thanos-io/thanos v0.13.1-0.20201019130456-f41940581d9a/go.mod h1:A3qUEEbsVkplJnxyDLwuIuvTDaJPByTH+hMdTl9ujAA= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/timberio/go-datemath v0.1.1-0.20200323150745-74ddef604fff h1:QCdUBuN+iKWAB9HqPTkBwyKPPUHDobJ2AuELSNZwd4o= github.com/timberio/go-datemath v0.1.1-0.20200323150745-74ddef604fff/go.mod h1:m7kjsbCuO4QKP3KLfnxiUZWiOiFXmxj30HeexjL3lc0= @@ -1585,10 +1631,12 @@ go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.2 h1:IYppNjEV/C+/3VPbhHVxQ4t04eVW0cLp0/pNdW++6Ug= go.mongodb.org/mongo-driver v1.3.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.4.6 h1:rh7GdYmDrb8AQSkF8yteAus8qYOgOASWDOv1BWqBXkU= go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1598,8 +1646,10 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/collector v0.21.0/go.mod h1:74t/Wj1bGM+L/O/zss6DchCa6ptX1jwrdpVfRuXyd6A= go.opentelemetry.io/collector v0.22.0 h1:YsREZN8+DPbddJNgq5tzWs34dRPkFwYtnZUZoZa2Kks= go.opentelemetry.io/collector v0.22.0/go.mod h1:sBkAGYUQSh1f+owCK0aPV2uLcUB6rPHEOWjdvuE2SdQ= go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0= @@ -1611,6 +1661,7 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= +go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA= go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= @@ -1979,6 +2030,7 @@ golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200513201620-d5fe73897c97/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2230,6 +2282,7 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY= honnef.co/go/tools v0.1.1/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.0.0-20190813020757-36bff7324fb7/go.mod h1:3Iy+myeAORNCLgjd/Xu9ebwN7Vh59Bw0vh9jhoX+V58= diff --git a/pkg/services/ngalert/api/api.go b/pkg/services/ngalert/api/api.go index 838c91e3c91..d1672db485f 100644 --- a/pkg/services/ngalert/api/api.go +++ b/pkg/services/ngalert/api/api.go @@ -4,6 +4,8 @@ import ( "fmt" "time" + "github.com/grafana/grafana/pkg/infra/log" + ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/schedule" @@ -38,6 +40,14 @@ type API struct { // RegisterAPIEndpoints registers API handlers func (api *API) RegisterAPIEndpoints() { + logger := log.New("ngalert.api") + api.RegisterAlertmanagerApiEndpoints(AlertmanagerApiBase{log: logger}) + api.RegisterPermissionsApiEndpoints(PermissionsApiBase{log: logger}) + api.RegisterPrometheusApiEndpoints(PrometheusApiBase{log: logger}) + api.RegisterRulerApiEndpoints(RulerApiMock{log: logger}) + api.RegisterTestingApiEndpoints(TestingApiBase{log: logger}) + + // Legacy routes; they will be removed in v8 api.RouteRegister.Group("/api/alert-definitions", func(alertDefinitions routing.RouteRegister) { alertDefinitions.Get("", middleware.ReqSignedIn, routing.Wrap(api.listAlertDefinitions)) alertDefinitions.Get("/eval/:alertDefinitionUID", middleware.ReqSignedIn, api.validateOrgAlertDefinition, routing.Wrap(api.alertDefinitionEvalEndpoint)) diff --git a/pkg/services/ngalert/api/api_alertmanager_base.go b/pkg/services/ngalert/api/api_alertmanager_base.go new file mode 100644 index 00000000000..319b1b670fc --- /dev/null +++ b/pkg/services/ngalert/api/api_alertmanager_base.go @@ -0,0 +1,117 @@ +/*Package api contains base API implementation of unified alerting + * + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + * + * Need to remove unused imports. + */ +package api + +import ( + "net/http" + + "github.com/go-macaron/binding" + apimodels "github.com/grafana/alerting-api/pkg/api" + "github.com/grafana/grafana/pkg/api/response" + "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/models" +) + +type AlertmanagerApiService interface { + RouteCreateSilence(*models.ReqContext, apimodels.SilenceBody) response.Response + RouteDeleteAlertingConfig(*models.ReqContext) response.Response + RouteDeleteSilence(*models.ReqContext) response.Response + RouteGetAlertingConfig(*models.ReqContext) response.Response + RouteGetAmAlertGroups(*models.ReqContext) response.Response + RouteGetAmAlerts(*models.ReqContext) response.Response + RouteGetSilence(*models.ReqContext) response.Response + RouteGetSilences(*models.ReqContext) response.Response + RoutePostAlertingConfig(*models.ReqContext, apimodels.UserConfig) response.Response + RoutePostAmAlerts(*models.ReqContext, apimodels.PostableAlerts) response.Response +} + +type AlertmanagerApiBase struct { + log log.Logger +} + +func (api *API) RegisterAlertmanagerApiEndpoints(srv AlertmanagerApiService) { + api.RouteRegister.Group("", func(group routing.RouteRegister) { + group.Post(toMacaronPath("/alertmanager/{DatasourceId}/api/v2/silences"), binding.Bind(apimodels.SilenceBody{}), routing.Wrap(srv.RouteCreateSilence)) + group.Delete(toMacaronPath("/alertmanager/{DatasourceId}/config/api/v1/alerts"), routing.Wrap(srv.RouteDeleteAlertingConfig)) + group.Delete(toMacaronPath("/alertmanager/{DatasourceId}/api/v2/silence/{SilenceId}"), routing.Wrap(srv.RouteDeleteSilence)) + group.Get(toMacaronPath("/alertmanager/{DatasourceId}/config/api/v1/alerts"), routing.Wrap(srv.RouteGetAlertingConfig)) + group.Get(toMacaronPath("/alertmanager/{DatasourceId}/api/v2/alerts/groups"), routing.Wrap(srv.RouteGetAmAlertGroups)) + group.Get(toMacaronPath("/alertmanager/{DatasourceId}/api/v2/alerts"), routing.Wrap(srv.RouteGetAmAlerts)) + group.Get(toMacaronPath("/alertmanager/{DatasourceId}/api/v2/silence/{SilenceId}"), routing.Wrap(srv.RouteGetSilence)) + group.Get(toMacaronPath("/alertmanager/{DatasourceId}/api/v2/silences"), routing.Wrap(srv.RouteGetSilences)) + group.Post(toMacaronPath("/alertmanager/{DatasourceId}/config/api/v1/alerts"), binding.Bind(apimodels.UserConfig{}), routing.Wrap(srv.RoutePostAlertingConfig)) + group.Post(toMacaronPath("/alertmanager/{DatasourceId}/api/v2/alerts"), binding.Bind(apimodels.PostableAlerts{}), routing.Wrap(srv.RoutePostAmAlerts)) + }) +} + +func (base AlertmanagerApiBase) RouteCreateSilence(c *models.ReqContext, body apimodels.SilenceBody) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteCreateSilence: ", "DatasourceId", datasourceId) + base.log.Info("RouteCreateSilence: ", "body", body) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RouteDeleteAlertingConfig(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteDeleteAlertingConfig: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RouteDeleteSilence(c *models.ReqContext) response.Response { + silenceId := c.Params(":SilenceId") + base.log.Info("RouteDeleteSilence: ", "SilenceId", silenceId) + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteDeleteSilence: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RouteGetAlertingConfig(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetAlertingConfig: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RouteGetAmAlertGroups(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetAmAlertGroups: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RouteGetAmAlerts(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetAmAlerts: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RouteGetSilence(c *models.ReqContext) response.Response { + silenceId := c.Params(":SilenceId") + base.log.Info("RouteGetSilence: ", "SilenceId", silenceId) + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetSilence: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RouteGetSilences(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetSilences: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RoutePostAlertingConfig(c *models.ReqContext, body apimodels.UserConfig) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RoutePostAlertingConfig: ", "DatasourceId", datasourceId) + base.log.Info("RoutePostAlertingConfig: ", "body", body) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base AlertmanagerApiBase) RoutePostAmAlerts(c *models.ReqContext, body apimodels.PostableAlerts) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RoutePostAmAlerts: ", "DatasourceId", datasourceId) + base.log.Info("RoutePostAmAlerts: ", "body", body) + return response.Error(http.StatusNotImplemented, "", nil) +} diff --git a/pkg/services/ngalert/api/api_permissions_base.go b/pkg/services/ngalert/api/api_permissions_base.go new file mode 100644 index 00000000000..2225c328f30 --- /dev/null +++ b/pkg/services/ngalert/api/api_permissions_base.go @@ -0,0 +1,47 @@ +/*Package api contains base API implementation of unified alerting + * + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + * + * Need to remove unused imports. + */ +package api + +import ( + "net/http" + + "github.com/go-macaron/binding" + apimodels "github.com/grafana/alerting-api/pkg/api" + "github.com/grafana/grafana/pkg/api/response" + "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/models" +) + +type PermissionsApiService interface { + RouteGetNamespacePermissions(*models.ReqContext) response.Response + RouteSetNamespacePermissions(*models.ReqContext, apimodels.Permissions) response.Response +} + +type PermissionsApiBase struct { + log log.Logger +} + +func (api *API) RegisterPermissionsApiEndpoints(srv PermissionsApiService) { + api.RouteRegister.Group("", func(group routing.RouteRegister) { + group.Get(toMacaronPath("/api/v1/namespace/{Namespace}/permissions"), routing.Wrap(srv.RouteGetNamespacePermissions)) + group.Post(toMacaronPath("/api/v1/namespace/{Namespace}/permissions"), binding.Bind(apimodels.Permissions{}), routing.Wrap(srv.RouteSetNamespacePermissions)) + }) +} + +func (base PermissionsApiBase) RouteGetNamespacePermissions(c *models.ReqContext) response.Response { + namespace := c.Params(":Namespace") + base.log.Info("RouteGetNamespacePermissions: ", "Namespace", namespace) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base PermissionsApiBase) RouteSetNamespacePermissions(c *models.ReqContext, body apimodels.Permissions) response.Response { + namespace := c.Params(":Namespace") + base.log.Info("RouteSetNamespacePermissions: ", "Namespace", namespace) + base.log.Info("RouteSetNamespacePermissions: ", "body", body) + return response.Error(http.StatusNotImplemented, "", nil) +} diff --git a/pkg/services/ngalert/api/api_prometheus_base.go b/pkg/services/ngalert/api/api_prometheus_base.go new file mode 100644 index 00000000000..a91a2b6eba8 --- /dev/null +++ b/pkg/services/ngalert/api/api_prometheus_base.go @@ -0,0 +1,44 @@ +/*Package api contains base API implementation of unified alerting + * + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + * + * Need to remove unused imports. + */ +package api + +import ( + "net/http" + + "github.com/grafana/grafana/pkg/api/response" + "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/models" +) + +type PrometheusApiService interface { + RouteGetAlertStatuses(*models.ReqContext) response.Response + RouteGetRuleStatuses(*models.ReqContext) response.Response +} + +type PrometheusApiBase struct { + log log.Logger +} + +func (api *API) RegisterPrometheusApiEndpoints(srv PrometheusApiService) { + api.RouteRegister.Group("", func(group routing.RouteRegister) { + group.Get(toMacaronPath("/prometheus/{DatasourceId}/api/v1/alerts"), routing.Wrap(srv.RouteGetAlertStatuses)) + group.Get(toMacaronPath("/prometheus/{DatasourceId}/api/v1/rules"), routing.Wrap(srv.RouteGetRuleStatuses)) + }) +} + +func (base PrometheusApiBase) RouteGetAlertStatuses(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetAlertStatuses: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base PrometheusApiBase) RouteGetRuleStatuses(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetRuleStatuses: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} diff --git a/pkg/services/ngalert/api/api_ruler_base.go b/pkg/services/ngalert/api/api_ruler_base.go new file mode 100644 index 00000000000..d4f2f532141 --- /dev/null +++ b/pkg/services/ngalert/api/api_ruler_base.go @@ -0,0 +1,93 @@ +/*Package api contains base API implementation of unified alerting + * + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + * + * Need to remove unused imports. + */ +package api + +import ( + "net/http" + + "github.com/go-macaron/binding" + apimodels "github.com/grafana/alerting-api/pkg/api" + "github.com/grafana/grafana/pkg/api/response" + "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/models" +) + +type RulerApiService interface { + RouteDeleteNamespaceRulesConfig(*models.ReqContext) response.Response + RouteDeleteRuleGroupConfig(*models.ReqContext) response.Response + RouteGetNamespaceRulesConfig(*models.ReqContext) response.Response + RouteGetRulegGroupConfig(*models.ReqContext) response.Response + RouteGetRulesConfig(*models.ReqContext) response.Response + RoutePostNameRulesConfig(*models.ReqContext, apimodels.RuleGroupConfig) response.Response +} + +type RulerApiBase struct { + log log.Logger +} + +func (api *API) RegisterRulerApiEndpoints(srv RulerApiService) { + api.RouteRegister.Group("", func(group routing.RouteRegister) { + group.Delete(toMacaronPath("/ruler/{DatasourceId}/api/v1/rules/{Namespace}"), routing.Wrap(srv.RouteDeleteNamespaceRulesConfig)) + group.Delete(toMacaronPath("/ruler/{DatasourceId}/api/v1/rules/{Namespace}/{Groupname}"), routing.Wrap(srv.RouteDeleteRuleGroupConfig)) + group.Get(toMacaronPath("/ruler/{DatasourceId}/api/v1/rules/{Namespace}"), routing.Wrap(srv.RouteGetNamespaceRulesConfig)) + group.Get(toMacaronPath("/ruler/{DatasourceId}/api/v1/rules/{Namespace}/{Groupname}"), routing.Wrap(srv.RouteGetRulegGroupConfig)) + group.Get(toMacaronPath("/ruler/{DatasourceId}/api/v1/rules"), routing.Wrap(srv.RouteGetRulesConfig)) + group.Post(toMacaronPath("/ruler/{DatasourceId}/api/v1/rules/{Namespace}"), binding.Bind(apimodels.RuleGroupConfig{}), routing.Wrap(srv.RoutePostNameRulesConfig)) + }) +} + +func (base RulerApiBase) RouteDeleteNamespaceRulesConfig(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteDeleteNamespaceRulesConfig: ", "DatasourceId", datasourceId) + namespace := c.Params(":Namespace") + base.log.Info("RouteDeleteNamespaceRulesConfig: ", "Namespace", namespace) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base RulerApiBase) RouteDeleteRuleGroupConfig(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteDeleteRuleGroupConfig: ", "DatasourceId", datasourceId) + namespace := c.Params(":Namespace") + base.log.Info("RouteDeleteRuleGroupConfig: ", "Namespace", namespace) + groupname := c.Params(":Groupname") + base.log.Info("RouteDeleteRuleGroupConfig: ", "Groupname", groupname) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base RulerApiBase) RouteGetNamespaceRulesConfig(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetNamespaceRulesConfig: ", "DatasourceId", datasourceId) + namespace := c.Params(":Namespace") + base.log.Info("RouteGetNamespaceRulesConfig: ", "Namespace", namespace) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base RulerApiBase) RouteGetRulegGroupConfig(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetRulegGroupConfig: ", "DatasourceId", datasourceId) + namespace := c.Params(":Namespace") + base.log.Info("RouteGetRulegGroupConfig: ", "Namespace", namespace) + groupname := c.Params(":Groupname") + base.log.Info("RouteGetRulegGroupConfig: ", "Groupname", groupname) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base RulerApiBase) RouteGetRulesConfig(c *models.ReqContext) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RouteGetRulesConfig: ", "DatasourceId", datasourceId) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base RulerApiBase) RoutePostNameRulesConfig(c *models.ReqContext, body apimodels.RuleGroupConfig) response.Response { + datasourceId := c.Params(":DatasourceId") + base.log.Info("RoutePostNameRulesConfig: ", "DatasourceId", datasourceId) + namespace := c.Params(":Namespace") + base.log.Info("RoutePostNameRulesConfig: ", "Namespace", namespace) + base.log.Info("RoutePostNameRulesConfig: ", "body", body) + return response.Error(http.StatusNotImplemented, "", nil) +} diff --git a/pkg/services/ngalert/api/api_ruler_mock.go b/pkg/services/ngalert/api/api_ruler_mock.go new file mode 100644 index 00000000000..7e890ff486c --- /dev/null +++ b/pkg/services/ngalert/api/api_ruler_mock.go @@ -0,0 +1,295 @@ +/*Package api contains mock API implementation of unified alerting + * + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + * + * Need to remove unused imports. + */ +package api + +import ( + "encoding/json" + "net/http" + "time" + + apimodels "github.com/grafana/alerting-api/pkg/api" + "github.com/grafana/grafana/pkg/api/response" + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/models" + ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" + "github.com/grafana/grafana/pkg/util" +) + +var prometheusAlert = []ngmodels.AlertQuery{ + { + Model: json.RawMessage(`{ + "datasource": "gdev-prometheus", + "datasourceUid": "000000002", + "expr": "http_request_duration_microseconds_count", + "hide": false, + "interval": "", + "intervalMs": 1000, + "legendFormat": "", + "maxDataPoints": 100, + "refId": "query" + }`), + RefID: "query", + RelativeTimeRange: ngmodels.RelativeTimeRange{ + From: ngmodels.Duration(time.Duration(5) * time.Hour), + To: ngmodels.Duration(time.Duration(3) * time.Hour), + }, + }, + { + Model: json.RawMessage(`{ + "datasource": "__expr__", + "datasourceUid": "-100", + "expression": "query", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 100, + "reducer": "mean", + "refId": "reduced", + "type": "reduce" + }`), + RefID: "reduced", + RelativeTimeRange: ngmodels.RelativeTimeRange{ + From: ngmodels.Duration(time.Duration(5) * time.Hour), + To: ngmodels.Duration(time.Duration(3) * time.Hour), + }, + }, + { + Model: json.RawMessage(`{ + "datasource": "__expr__", + "datasourceUid": "-100", + "expression": "$reduced > 10", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 100, + "refId": "condition", + "type": "math" + }`), + RefID: "condition", + RelativeTimeRange: ngmodels.RelativeTimeRange{ + From: ngmodels.Duration(time.Duration(5) * time.Hour), + To: ngmodels.Duration(time.Duration(3) * time.Hour), + }, + }, +} + +var testAlert = []ngmodels.AlertQuery{ + { + Model: json.RawMessage(`{ + "alias": "just-testing", + "datasource": "000000004", + "datasourceUid": "000000004", + "intervalMs": 1000, + "maxDataPoints": 100, + "orgId": 0, + "refId": "A", + "scenarioId": "csv_metric_values", + "stringInput": "1,20,90,30,5,0" + }`), + RefID: "A", + RelativeTimeRange: ngmodels.RelativeTimeRange{ + From: ngmodels.Duration(time.Duration(5) * time.Hour), + To: ngmodels.Duration(time.Duration(3) * time.Hour), + }, + }, + { + Model: json.RawMessage(`{ + "datasource": "__expr__", + "datasourceUid": "__expr__", + "expression": "$A", + "intervalMs": 2000, + "maxDataPoints": 200, + "orgId": 0, + "reducer": "mean", + "refId": "B", + "type": "reduce" + }`), + RefID: "B", + RelativeTimeRange: ngmodels.RelativeTimeRange{ + From: ngmodels.Duration(time.Duration(5) * time.Hour), + To: ngmodels.Duration(time.Duration(3) * time.Hour), + }, + }, +} + +type RulerApiMock struct { + log log.Logger +} + +func (mock RulerApiMock) RouteDeleteNamespaceRulesConfig(c *models.ReqContext) response.Response { + datasourceID := c.Params(":DatasourceId") + mock.log.Info("RouteDeleteNamespaceRulesConfig: ", "DatasourceId", datasourceID) + namespace := c.Params(":Namespace") + mock.log.Info("RouteDeleteNamespaceRulesConfig: ", "Namespace", namespace) + return response.JSON(http.StatusAccepted, util.DynMap{"message": "namespace rules deleted"}) +} + +func (mock RulerApiMock) RouteDeleteRuleGroupConfig(c *models.ReqContext) response.Response { + datasourceID := c.Params(":DatasourceId") + mock.log.Info("RouteDeleteRuleGroupConfig: ", "DatasourceId", datasourceID) + namespace := c.Params(":Namespace") + mock.log.Info("RouteDeleteRuleGroupConfig: ", "Namespace", namespace) + groupname := c.Params(":Groupname") + mock.log.Info("RouteDeleteRuleGroupConfig: ", "Groupname", groupname) + return response.JSON(http.StatusAccepted, util.DynMap{"message": "rule group deleted"}) +} + +func (mock RulerApiMock) RouteGetNamespaceRulesConfig(c *models.ReqContext) response.Response { + datasourceID := c.Params(":DatasourceId") + mock.log.Info("RouteGetNamespaceRulesConfig: ", "DatasourceId", datasourceID) + namespace := c.Params(":Namespace") + mock.log.Info("RouteGetNamespaceRulesConfig: ", "Namespace", namespace) + result := apimodels.NamespaceConfigResponse{ + namespace: []apimodels.RuleGroupConfig{ + { + Name: "group1", + Interval: 60, + Rules: []apimodels.ExtendedRuleNode{ + { + GrafanaManagedAlert: &apimodels.ExtendedUpsertAlertDefinitionCommand{ + NoDataState: apimodels.NoData, + ExecutionErrorState: apimodels.AlertingErrState, + UpdateAlertDefinitionCommand: ngmodels.UpdateAlertDefinitionCommand{ + UID: "UID", + OrgID: 1, + Title: "rule 1-1", + Condition: "condition", + Data: prometheusAlert, + }, + }, + }, + { + GrafanaManagedAlert: &apimodels.ExtendedUpsertAlertDefinitionCommand{ + NoDataState: apimodels.NoData, + ExecutionErrorState: apimodels.AlertingErrState, + UpdateAlertDefinitionCommand: ngmodels.UpdateAlertDefinitionCommand{ + UID: "UID", + OrgID: 1, + Title: "rule 1-2", + Condition: "B", + Data: testAlert, + }, + }, + }, + }, + }, + }, + } + return response.JSON(http.StatusAccepted, result) +} + +func (mock RulerApiMock) RouteGetRulegGroupConfig(c *models.ReqContext) response.Response { + datasourceID := c.Params(":DatasourceId") + mock.log.Info("RouteGetRulegGroupConfig: ", "DatasourceId", datasourceID) + namespace := c.Params(":Namespace") + mock.log.Info("RouteGetRulegGroupConfig: ", "Namespace", namespace) + groupname := c.Params(":Groupname") + mock.log.Info("RouteGetRulegGroupConfig: ", "Groupname", groupname) + result := apimodels.RuleGroupConfigResponse{ + RuleGroupConfig: apimodels.RuleGroupConfig{ + Name: groupname, + Interval: 60, + Rules: []apimodels.ExtendedRuleNode{ + { + GrafanaManagedAlert: &apimodels.ExtendedUpsertAlertDefinitionCommand{ + NoDataState: apimodels.NoData, + ExecutionErrorState: apimodels.AlertingErrState, + UpdateAlertDefinitionCommand: ngmodels.UpdateAlertDefinitionCommand{ + UID: "UID", + OrgID: 1, + Title: "something completely different", + Condition: "A", + Data: testAlert, + }, + }, + }, + }, + }, + } + return response.JSON(http.StatusAccepted, result) +} + +func (mock RulerApiMock) RouteGetRulesConfig(c *models.ReqContext) response.Response { + datasourceID := c.Params(":DatasourceId") + mock.log.Info("RouteGetRulesConfig: ", "DatasourceId", datasourceID) + result := apimodels.NamespaceConfigResponse{ + "namespace1": []apimodels.RuleGroupConfig{ + { + Name: "group1", + Interval: 60, + Rules: []apimodels.ExtendedRuleNode{ + { + GrafanaManagedAlert: &apimodels.ExtendedUpsertAlertDefinitionCommand{ + NoDataState: apimodels.NoData, + ExecutionErrorState: apimodels.AlertingErrState, + UpdateAlertDefinitionCommand: ngmodels.UpdateAlertDefinitionCommand{ + UID: "UID", + OrgID: 1, + Title: "rule 1-1", + Condition: "A", + Data: testAlert, + }, + }, + }, + { + GrafanaManagedAlert: &apimodels.ExtendedUpsertAlertDefinitionCommand{ + NoDataState: apimodels.NoData, + ExecutionErrorState: apimodels.AlertingErrState, + UpdateAlertDefinitionCommand: ngmodels.UpdateAlertDefinitionCommand{ + UID: "UID", + OrgID: 1, + Title: "rule 1-2", + Condition: "A", + Data: testAlert, + }, + }, + }, + }, + }, + { + Name: "group2", + Interval: 60, + Rules: []apimodels.ExtendedRuleNode{ + { + GrafanaManagedAlert: &apimodels.ExtendedUpsertAlertDefinitionCommand{ + NoDataState: apimodels.NoData, + ExecutionErrorState: apimodels.AlertingErrState, + UpdateAlertDefinitionCommand: ngmodels.UpdateAlertDefinitionCommand{ + UID: "UID", + OrgID: 1, + Title: "rule 2-1", + Condition: "A", + Data: prometheusAlert, + }, + }, + }, + { + GrafanaManagedAlert: &apimodels.ExtendedUpsertAlertDefinitionCommand{ + NoDataState: apimodels.NoData, + ExecutionErrorState: apimodels.AlertingErrState, + UpdateAlertDefinitionCommand: ngmodels.UpdateAlertDefinitionCommand{ + UID: "UID", + OrgID: 1, + Title: "rule 2-2", + Condition: "A", + Data: testAlert, + }, + }, + }, + }, + }, + }, + } + return response.JSON(http.StatusAccepted, result) +} + +func (mock RulerApiMock) RoutePostNameRulesConfig(c *models.ReqContext, body apimodels.RuleGroupConfig) response.Response { + datasourceID := c.Params(":DatasourceId") + mock.log.Info("RoutePostNameRulesConfig: ", "DatasourceId", datasourceID) + namespace := c.Params(":Namespace") + mock.log.Info("RoutePostNameRulesConfig: ", "Namespace", namespace) + mock.log.Info("RoutePostNameRulesConfig: ", "body", body) + return response.JSON(http.StatusAccepted, util.DynMap{"message": "namespace rules created"}) +} diff --git a/pkg/services/ngalert/api/api_testing_base.go b/pkg/services/ngalert/api/api_testing_base.go new file mode 100644 index 00000000000..716a7d119d0 --- /dev/null +++ b/pkg/services/ngalert/api/api_testing_base.go @@ -0,0 +1,44 @@ +/*Package api contains base API implementation of unified alerting + * + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + * + * Need to remove unused imports. + */ +package api + +import ( + "net/http" + + "github.com/go-macaron/binding" + apimodels "github.com/grafana/alerting-api/pkg/api" + "github.com/grafana/grafana/pkg/api/response" + "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/models" +) + +type TestingApiService interface { + RouteTestReceiverConfig(*models.ReqContext, apimodels.ExtendedReceiver) response.Response + RouteTestRuleConfig(*models.ReqContext, apimodels.TestRulePayload) response.Response +} + +type TestingApiBase struct { + log log.Logger +} + +func (api *API) RegisterTestingApiEndpoints(srv TestingApiService) { + api.RouteRegister.Group("", func(group routing.RouteRegister) { + group.Get(toMacaronPath("/api/v1/receiver/test"), binding.Bind(apimodels.ExtendedReceiver{}), routing.Wrap(srv.RouteTestReceiverConfig)) + group.Get(toMacaronPath("/api/v1/rule/test"), binding.Bind(apimodels.TestRulePayload{}), routing.Wrap(srv.RouteTestRuleConfig)) + }) +} + +func (base TestingApiBase) RouteTestReceiverConfig(c *models.ReqContext, body apimodels.ExtendedReceiver) response.Response { + base.log.Info("RouteTestReceiverConfig: ", "body", body) + return response.Error(http.StatusNotImplemented, "", nil) +} + +func (base TestingApiBase) RouteTestRuleConfig(c *models.ReqContext, body apimodels.TestRulePayload) response.Response { + base.log.Info("RouteTestRuleConfig: ", "body", body) + return response.Error(http.StatusNotImplemented, "", nil) +} diff --git a/pkg/services/ngalert/api/swagger-codegen/Makefile b/pkg/services/ngalert/api/swagger-codegen/Makefile new file mode 100644 index 00000000000..887e9799eb1 --- /dev/null +++ b/pkg/services/ngalert/api/swagger-codegen/Makefile @@ -0,0 +1,26 @@ +.DEFAULT_GOAL := all + +swagger-codegen-api: + swagger-codegen generate -v \ + -i https://grafana.github.io/alerting-api/post.json \ + -l go-server \ + -Dapis \ + -o ../ \ + --additional-properties packageName=api \ + -t ./templates \ + # --import-mappings eval.RelativeTimeRange="github.com/grafana/grafana/pkg/services/ngalert/eval" \ + # --type-mappings RelativeTimeRange=eval.RelativeTimeRange + +copy-files: + python move-and-rename.py + +fix: + sed -i -e 's/apimodels\.\[\]PostableAlert/apimodels.PostableAlerts/' ../go/*.go + sed -i -e 's/apimodels\.\[\]UpdateDashboardAclCommand/apimodels.Permissions/' ../go/*.go + goimports -w -v ../go/*.go + rm ../go/*.go-e + +clean: + rm -rf ../go + +all: swagger-codegen-api fix copy-files clean \ No newline at end of file diff --git a/pkg/services/ngalert/api/swagger-codegen/move-and-rename.py b/pkg/services/ngalert/api/swagger-codegen/move-and-rename.py new file mode 100644 index 00000000000..02daca12d16 --- /dev/null +++ b/pkg/services/ngalert/api/swagger-codegen/move-and-rename.py @@ -0,0 +1,7 @@ +import os +path = '../go' +files = os.listdir(path) +dest_dir = "../" + +for index, file in enumerate(files): + os.rename(os.path.join(path, file), os.path.join(dest_dir, ''.join([file.split('.')[0], '_base.go']))) \ No newline at end of file diff --git a/pkg/services/ngalert/api/swagger-codegen/templates/controller-api.mustache b/pkg/services/ngalert/api/swagger-codegen/templates/controller-api.mustache new file mode 100644 index 00000000000..fdc02b23122 --- /dev/null +++ b/pkg/services/ngalert/api/swagger-codegen/templates/controller-api.mustache @@ -0,0 +1,38 @@ +{{>partial_header}} +package {{packageName}} + +{{#operations}} +import ( + "net/http" + + "github.com/go-macaron/binding" + "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/api/response" + "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/infra/log" + apimodels "github.com/grafana/alerting-api/pkg/api" +) + +type {{classname}}Service interface { {{#operation}} + {{nickname}}(*models.ReqContext{{#bodyParams}}, apimodels.{{dataType}}{{/bodyParams}}) response.Response{{/operation}} +} + +type {{classname}}Base struct { + log log.Logger +} + +func (api *API) Register{{classname}}Endpoints(srv {{classname}}Service) { + api.RouteRegister.Group("", func(group routing.RouteRegister){ {{#operations}}{{#operation}} + group.{{httpMethod}}(toMacaronPath("{{{path}}}"){{#bodyParams}}, binding.Bind(apimodels.{{dataType}}{}){{/bodyParams}}, routing.Wrap(srv.{{nickname}})){{/operation}}{{/operations}} + }) +}{{#operation}} + + +func (base {{classname}}Base) {{nickname}}(c *models.ReqContext{{#bodyParams}}, {{paramName}} apimodels.{{dataType}}{{/bodyParams}}) response.Response { {{#pathParams}} + {{paramName}} := c.Params(":{{baseName}}") + base.log.Info("{{nickname}}: ", "{{baseName}}", {{paramName}}){{/pathParams}}{{#bodyParams}} + base.log.Info("{{nickname}}: ", "{{baseName}}", {{paramName}}){{/bodyParams}} + return response.Error(http.StatusNotImplemented, "", nil) +}{{/operation}}{{/operations}} + + diff --git a/pkg/services/ngalert/api/swagger-codegen/templates/partial_header.mustache b/pkg/services/ngalert/api/swagger-codegen/templates/partial_header.mustache new file mode 100644 index 00000000000..5f017f7ccf1 --- /dev/null +++ b/pkg/services/ngalert/api/swagger-codegen/templates/partial_header.mustache @@ -0,0 +1,6 @@ +/*Package api contains base API implementation of unified alerting + * + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + * + * Need to remove unused imports. + */ diff --git a/pkg/services/ngalert/api/test-data/post-rulegroup-data.json b/pkg/services/ngalert/api/test-data/post-rulegroup-data.json new file mode 100644 index 00000000000..a1aadd6cf4d --- /dev/null +++ b/pkg/services/ngalert/api/test-data/post-rulegroup-data.json @@ -0,0 +1,30 @@ +{ + "name": "group42", + "interval": "10s", + "rules": [ + { + "expr": "", + "grafana_alert": { + "title": "something completely different", + "condition": "A", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 18000, + "to": 10800 + }, + "model": { + "datasource": "__expr__", + "type": "math", + "expression": "2 + 2 > 1" + } + } + ], + "no_data_state": "NoData", + "exec_err_state": "Alerting" + } + } + ] +} \ No newline at end of file diff --git a/pkg/services/ngalert/api/util.go b/pkg/services/ngalert/api/util.go new file mode 100644 index 00000000000..f5418cc9232 --- /dev/null +++ b/pkg/services/ngalert/api/util.go @@ -0,0 +1,15 @@ +package api + +import ( + "fmt" + "regexp" +) + +var searchRegex = regexp.MustCompile(`\{(\w+)\}`) + +func toMacaronPath(path string) string { + return string(searchRegex.ReplaceAllFunc([]byte(path), func(s []byte) []byte { + m := string(s[1 : len(s)-1]) + return []byte(fmt.Sprintf(":%s", m)) + })) +} diff --git a/pkg/services/ngalert/api/util_test.go b/pkg/services/ngalert/api/util_test.go new file mode 100644 index 00000000000..c5b27fd8cd2 --- /dev/null +++ b/pkg/services/ngalert/api/util_test.go @@ -0,0 +1,27 @@ +package api + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestToMacaronPath(t *testing.T) { + testCases := []struct { + inputPath string + expectedOutputPath string + }{ + { + inputPath: "", + expectedOutputPath: "", + }, + { + inputPath: "/ruler/{DatasourceId}/api/v1/rules/{Namespace}/{Groupname}", + expectedOutputPath: "/ruler/:DatasourceId/api/v1/rules/:Namespace/:Groupname", + }, + } + for _, tc := range testCases { + outputPath := toMacaronPath(tc.inputPath) + assert.Equal(t, tc.expectedOutputPath, outputPath) + } +}