diff --git a/CHANGELOG.md b/CHANGELOG.md index aad60986a..2d2a33f64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - [#2512](https://github.com/influxdata/kapacitor/pull/2512): Pull in auth code from Kapacitor Enterprise. - [#2493](https://github.com/influxdata/kapacitor/pull/2493): Route kafka alerts to partitions by ID, and allow for configuring the hashing strategy. - [#2544](https://github.com/influxdata/kapacitor/pull/2544): flux tasks skeleton in Kapacitor +- [#2555](https://github.com/influxdata/kapacitor/pull/2555): run flux tasks with built-in flux engine ## v1.5.9 [2021-04-01] diff --git a/cmd/kapacitord/run/command.go b/cmd/kapacitord/run/command.go index 3b7f21126..663628d21 100644 --- a/cmd/kapacitord/run/command.go +++ b/cmd/kapacitord/run/command.go @@ -11,6 +11,7 @@ import ( "strconv" "github.com/BurntSushi/toml" + "github.com/influxdata/flux/fluxinit" "github.com/influxdata/kapacitor/server" "github.com/influxdata/kapacitor/services/diagnostic" ) @@ -122,6 +123,9 @@ func (cmd *Command) Run(args ...string) error { } cmd.pidfile = options.PIDFile + // run flux initialization + fluxinit.FluxInit() + // Create server from config and start it. buildInfo := server.BuildInfo{Version: cmd.Version, Commit: cmd.Commit, Branch: cmd.Branch, Platform: cmd.Platform} s, err := server.New(config, buildInfo, cmd.diagService) diff --git a/go.mod b/go.mod index 4529630d6..b7090b439 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/influxdata/cron v0.0.0-20201006132531-4bb0a200dcbe - github.com/influxdata/flux v0.114.1 + github.com/influxdata/flux v0.116.1-0.20210519190248-4347b978c91a github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69 github.com/influxdata/influxdb v1.8.4 github.com/influxdata/influxdb/v2 v2.0.1-alpha.10.0.20210507184756-dc72dc3f0c07 @@ -61,7 +61,7 @@ require ( github.com/shurcooL/go v0.0.0-20170331015642-20b4b0a35211 // indirect github.com/shurcooL/markdownfmt v0.0.0-20170214213350-10aae0a270ab github.com/stretchr/testify v1.7.0 - github.com/uber/jaeger-client-go v2.25.0+incompatible + github.com/uber/jaeger-client-go v2.28.0+incompatible go.etcd.io/bbolt v1.3.5 go.uber.org/zap v1.14.1 golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad diff --git a/go.sum b/go.sum index c46ec9f32..742624905 100644 --- a/go.sum +++ b/go.sum @@ -94,6 +94,7 @@ github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/HdrHistogram/hdrhistogram-go v1.0.1 h1:GX8GAYDuhlFQnI2fRDHQhTlkHMz8bEn0jTI6LJU0mpw= github.com/HdrHistogram/hdrhistogram-go v1.0.1/go.mod h1:BWJ+nMSHY3L41Zj7CA3uXnloDp7xxV0YvstAE7nKTaM= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -120,6 +121,7 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -220,10 +222,13 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deepmap/oapi-codegen v1.6.0 h1:w/d1ntwh91XI0b/8ja7+u5SvA4IFfM0UNNLmiDR1gg0= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/denisenkom/go-mssqldb v0.10.0 h1:QykgLZBorFE95+gO3u9esLd0BmbvpWp0/waNNZfHBM8= github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= @@ -285,6 +290,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15 h1:nLPjjvpUAODOR6vY/7o0hBIk8iTr19Fvmf8aFx/kC7A= @@ -302,6 +308,7 @@ github.com/geoffgarside/ber v0.0.0-20170306085127-854377f11dfb h1:iPZjQyOswR6paO github.com/geoffgarside/ber v0.0.0-20170306085127-854377f11dfb/go.mod h1:x6zPZPDIQQKmaIDbeEzUGnxSmj7raqK6G8m6jkTlgbU= github.com/getkin/kin-openapi v0.2.0 h1:PbHHtYZpjKwZtGlIyELgA2DploRrsaXztoNNx9HjwNY= github.com/getkin/kin-openapi v0.2.0/go.mod h1:V1z9xl9oF5Wt7v32ne4FmiF1alpS4dM6mNzoywPOXlk= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -313,6 +320,7 @@ github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493 h1:OTanQnFt0bi5 github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi v4.1.0+incompatible h1:ETj3cggsVIY2Xao5ExCu6YhEh5MD6JTfcBzS37R260w= github.com/go-chi/chi v4.1.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -455,6 +463,7 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/gddo v0.0.0-20181116215533-9bd4a3295021 h1:HYV500jCgk+IC68L5sWrLFIWMpaUFfXXpJSAb7XOoBk= github.com/golang/gddo v0.0.0-20181116215533-9bd4a3295021/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec h1:lJwO/92dFXWeXOZdoGXgptLmNLwynMSHUmU6besqtiw= @@ -495,6 +504,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -563,6 +573,7 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -661,10 +672,20 @@ github.com/influxdata/cron v0.0.0-20201006132531-4bb0a200dcbe h1:7j4SdN/BvQwN6Wo github.com/influxdata/cron v0.0.0-20201006132531-4bb0a200dcbe/go.mod h1:XabtPPW2qsCg0tl+kjaPU+cFS+CjQXEXbT1VJvHT4og= github.com/influxdata/flux v0.114.1 h1:w6T08xPGDcO/aj6oyzWWMGO34sC4R8KAq1LZ+zdXDtI= github.com/influxdata/flux v0.114.1/go.mod h1:dfG4vbsLSehtyx2h75GQM64jiPx5IObAfSaVGYHjDrg= +github.com/influxdata/flux v0.115.1-0.20210517155239-5f7fef88f1f1 h1:QXOoymO/L+DtNfNRcbJoPAN9LPueoSnkxWK+PQWcD9M= +github.com/influxdata/flux v0.115.1-0.20210517155239-5f7fef88f1f1/go.mod h1:iiXVybz9mvIGJ5hvE3ymR3RdpJ9skukg1VQYxKQFdBo= +github.com/influxdata/flux v0.116.1-0.20210518210800-dea2590c5351 h1:sixyw+9cDeKLdW7UfBMpaonYRU3meg7I2w7trqRU5E4= +github.com/influxdata/flux v0.116.1-0.20210518210800-dea2590c5351/go.mod h1:N2AZHVBiOO+ZggrLyBqtmBZlawHW96cA7iPHsAPQAQE= +github.com/influxdata/flux v0.116.1-0.20210519190248-4347b978c91a h1:7K4oTN/+jZmaW3KUk4SNODIe+AuqHUevbTWzutJF/ck= +github.com/influxdata/flux v0.116.1-0.20210519190248-4347b978c91a/go.mod h1:d0Asx5xusUbp2d32ikmXMAiBabs5EFzz4yp1ykgE60U= github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69 h1:WQsmW0fXO4ZE/lFGIE84G6rIV5SJN3P3sjIXAP1a8eU= github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69/go.mod h1:pwymjR6SrP3gD3pRj9RJwdl1j5s3doEEV8gS4X9qSzA= github.com/influxdata/influxdb v1.1.4 h1:VLf6ewC579GzI+JQCCZdU2Ijeb/bnf6L8u+ptZhKXVM= github.com/influxdata/influxdb v1.1.4/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/influxdb-client-go/v2 v2.3.0 h1:4YzLWRsPUoHuQYWDwPoybaJjN01e0/k0AIQO85ymCKI= +github.com/influxdata/influxdb-client-go/v2 v2.3.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040 h1:MBLCfcSsUyFPDJp6T7EoHp/Ph3Jkrm4EuUKLD2rUWHg= +github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb/v2 v2.0.1-alpha.10.0.20210507184756-dc72dc3f0c07 h1:ERHPVZofgMpPCS+vfWLOZk7UETeV/iVzsDhkEqkE8tY= github.com/influxdata/influxdb/v2 v2.0.1-alpha.10.0.20210507184756-dc72dc3f0c07/go.mod h1:JUtdw2axzK6sXrmCQ81TcK4yh7O94A3FFrwzm6xLwOI= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -672,6 +693,8 @@ github.com/influxdata/influxql v0.0.0-20180925231337-1cbfca8e56b6 h1:CFx+pP90q/q github.com/influxdata/influxql v0.0.0-20180925231337-1cbfca8e56b6/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e h1:/o3vQtpWJhvnIbXley4/jwzzqNeigJK9z+LZcJZ9zfM= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/pkg-config v0.2.6/go.mod h1:EMS7Ll0S4qkzDk53XS3Z72/egBsPInt+BeRxb0WeSwk= github.com/influxdata/pkg-config v0.2.7 h1:LPTCWmcPkyMryHHnf+STK/zVUjQ6OCvvOukSDlJLY9I= github.com/influxdata/pkg-config v0.2.7/go.mod h1:EMS7Ll0S4qkzDk53XS3Z72/egBsPInt+BeRxb0WeSwk= @@ -710,6 +733,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef h1:2jNeR4YUziVtswNP9sEFAI913cVrzH85T+8Q6LpYbT0= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/k-sone/snmpgo v3.2.0+incompatible h1:2NogYilKYSia0f+seO9P7aRa6MKG6RcnNc1L74L8WOw= @@ -744,6 +768,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= 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= @@ -765,16 +791,22 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/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= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= @@ -1097,13 +1129,20 @@ github.com/uber/athenadriver v1.1.4/go.mod h1:tQjho4NzXw55LGfSZEcETuYydpY1vtmixU github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.28.0+incompatible h1:G4QSBfvPKvg5ZM2j9MrJFdfI5iSljY/WnJqOGFao6HI= +github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ= github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/willf/bitset v1.1.9 h1:GBtFynGY9ZWZmEC9sWuu41/7VBXPFCOAbCbqTflOg9c= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -1191,12 +1230,15 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -1207,6 +1249,7 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1340,6 +1383,7 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1373,6 +1417,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1408,6 +1453,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1417,6 +1463,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1486,10 +1533,14 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca h1:PupagGYwj8+I4ubCxcmcBRk3VlUWtTg5huQpZR9flmE= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6 h1:4WsZyVtkthqrHTbDCJfiTs8IWNYE4uvsSDgaV6xpp+o= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1691,6 +1742,7 @@ labix.org/v2/mgo v0.0.0-20140701140051-000000000287/go.mod h1:Lg7AYkt1uXJoR9oeSZ launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/server/server_test.go b/server/server_test.go index bacd7b66e..b9103ad2b 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -9,6 +9,7 @@ import ( "io" "io/ioutil" "math/rand" + "net" "net/http" "net/http/httptest" "net/mail" @@ -28,6 +29,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/dgrijalva/jwt-go" "github.com/google/go-cmp/cmp" + "github.com/influxdata/flux/fluxinit" iclient "github.com/influxdata/influxdb/client/v2" "github.com/influxdata/influxdb/influxql" imodels "github.com/influxdata/influxdb/models" @@ -80,6 +82,8 @@ import ( "github.com/influxdata/kapacitor/services/zenoss/zenosstest" "github.com/k-sone/snmpgo" "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "golang.org/x/crypto/bcrypt" ) @@ -88,6 +92,7 @@ var udfDir string func init() { dir, _ := os.Getwd() udfDir = filepath.Clean(filepath.Join(dir, "../udf")) + fluxinit.FluxInit() } func mustHash(hash []byte, err error) string { @@ -13335,6 +13340,104 @@ func TestLogSessions_HeaderGzip(t *testing.T) { t.Fatalf("expected: %v, got: %v\n", exp, got) return } +} + +func TestFluxTasks_Basic(t *testing.T) { + conf := NewConfig() + conf.FluxTask.Enabled = true + conf.FluxTask.TaskRunInfluxDB = "none" + s := OpenServer(conf) + cli := Client(s) + defer s.Close() + + // Check we can query empty tasks + u := cli.BaseURL() + basePath := "kapacitor/v1/api/v2/tasks" + query := func(method string, path string, body string) string { + u.Path = path + t.Log("Querying: ", method, u.String()) + req, err := http.NewRequest(method, u.String(), bytes.NewBufferString(body)) + require.NoError(t, err) + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + buf := bytes.Buffer{} + _, err = io.Copy(&buf, resp.Body) + require.NoError(t, err) + return strings.Trim(buf.String(), "\n") + } + + assert.Equal(t, `{"links":{"self":"/kapacitor/v1/api/v2/tasks?limit=100"},"tasks":[]}`, query("GET", basePath, "")) + + // Start a simple server. It listens on port and closes requestDone when finished. + // This lets us create a task that uses the flux-native http.Post and assert that + // flux is configured properly + listener, err := net.Listen("tcp", "localhost:0") + require.NoError(t, err) + port := listener.Addr().(*net.TCPAddr).Port + server := &http.Server{} + requestStarted := make(chan struct{}) + requestStopped := make(chan struct{}) + go func() { + server.Handler = http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + <-requestStarted + <-requestStopped + }) + server.Serve(listener) + }() + defer server.Close() + + // create a task, assert on the important parts of it + fluxScript := fmt.Sprintf(`import "http" +option task = {concurrency: 1, name:"poster", every:1s} +http.post(url: "http://localhost:%d") +`, port) + task := fmt.Sprintf(`{"status": "active", "description": "simple post", "flux": %q}`, fluxScript) + createResp := make(map[string]interface{}) + require.NoError(t, json.Unmarshal([]byte(query("POST", basePath, task)), &createResp)) + id := createResp["id"].(string) + assert.Equal(t, 16, len(id)) + assert.Contains(t, createResp, "orgID") + assert.Equal(t, "", createResp["orgID"]) + assert.Equal(t, "poster", createResp["name"]) + logPath := fmt.Sprintf("/kapacitor/v1/api/v2/tasks/%s/logs", id) + runPath := fmt.Sprintf("/kapacitor/v1/api/v2/tasks/%s/runs", id) + selfPath := fmt.Sprintf("/kapacitor/v1/api/v2/tasks/%s", id) + assert.Equal(t, map[string]interface{}{ + "logs": logPath, + "runs": runPath, + "self": selfPath, + }, createResp["links"]) + + t.Log("waiting for request") + requestStarted <- struct{}{} + + // Request is now started (it hit our test server with a post) but can't finish - time to assert that we have runs and logs + logResp := make(map[string]interface{}) + require.NoError(t, json.Unmarshal([]byte(query("GET", logPath, task)), &logResp)) + expectMessage := "Started task from script:" + assert.Equal(t, expectMessage, logResp["events"].([]interface{})[0].(map[string]interface{})["message"].(string)[:len(expectMessage)]) + + runResp := make(map[string]interface{}) + require.NoError(t, json.Unmarshal([]byte(query("GET", runPath, task)), &runResp)) + assert.Equal(t, map[string]interface{}{ + "task": selfPath, + "self": runPath, + }, runResp["links"]) + + // stop blocking the server + close(requestStarted) + close(requestStopped) + + // Assert that we can really update a task + query("PATCH", selfPath, `{"every": "10m"}`) + getResp := make(map[string]interface{}) + require.NoError(t, json.Unmarshal([]byte(query("GET", selfPath, task)), &getResp)) + assert.Equal(t, getResp["every"], "10m") + + // Assert that when we delete a task it goes away + query("DELETE", selfPath, "") + assert.Equal(t, `{"links":{"self":"/kapacitor/v1/api/v2/tasks?limit=100"},"tasks":[]}`, query("GET", basePath, "")) } diff --git a/services/fluxtask/service.go b/services/fluxtask/service.go index a6b1951cd..fb93d2f76 100644 --- a/services/fluxtask/service.go +++ b/services/fluxtask/service.go @@ -2,10 +2,8 @@ package fluxtask import ( "context" - "fmt" "time" - "github.com/influxdata/flux" "github.com/influxdata/influxdb/v2/kit/platform" "github.com/influxdata/kapacitor/services/httpd" "github.com/influxdata/kapacitor/services/influxdb" @@ -16,6 +14,7 @@ import ( "github.com/influxdata/kapacitor/task/backend/executor" "github.com/influxdata/kapacitor/task/backend/middleware" "github.com/influxdata/kapacitor/task/backend/scheduler" + "github.com/influxdata/kapacitor/task/fluxlocal" "github.com/influxdata/kapacitor/task/http" "github.com/influxdata/kapacitor/task/kv" "github.com/influxdata/kapacitor/task/taskmodel" @@ -50,24 +49,35 @@ func (s *Service) Open() error { OrgID: s.config.TaskRunOrgID, Measurement: s.config.TaskRunMeasurement, } - cli, err := s.InfluxDBService.NewNamedClient(s.config.TaskRunInfluxDB) - if err != nil { - return err - } - combinedTaskService := backend.NewAnalyticalStorage( - s.logger.With(zap.String("service", "fluxtask-analytical-store")), - s.kvService, - s.kvService, - cli, - dataDestination, + + var ( + taskService taskmodel.TaskService = s.kvService + taskControlService backend.TaskControlService = s.kvService ) + + if s.config.TaskRunInfluxDB != "none" { + cli, err := s.InfluxDBService.NewNamedClient(s.config.TaskRunInfluxDB) + if err != nil { + return err + } + combinedTaskService := backend.NewAnalyticalStorage( + s.logger.With(zap.String("service", "fluxtask-analytical-store")), + taskService, + taskControlService, + cli, + dataDestination, + ) + taskService = combinedTaskService + taskControlService = combinedTaskService + } // TODO: register metrics returned here? executor, _ := executor.NewExecutor( s.logger.With(zap.String("service", "fluxtask-executor")), - &DummyQueryService{logger: s.logger.With(zap.String("service", "fluxtask-dummy-query-executor"))}, - combinedTaskService, - combinedTaskService, + fluxlocal.NewFluxQueryer(s.config.Secrets, s.logger.With(zap.String("service", "flux-local-querier"))), + taskService, + taskControlService, ) + var err error schLogger := s.logger.With(zap.String("service", "fluxtask-scheduler")) //TODO: register metrics returned here? s.scheduler, _, err = scheduler.NewScheduler( @@ -89,11 +99,11 @@ func (s *Service) Open() error { coordLogger, s.scheduler, executor) - fluxTaskService := middleware.New(combinedTaskService, taskCoord) + taskService = middleware.New(taskService, taskCoord) if err := backend.TaskNotifyCoordinatorOfExisting( context.Background(), - fluxTaskService, - combinedTaskService, + taskService, + taskControlService, taskCoord, func(ctx context.Context, taskID platform.ID, runID platform.ID) error { _, err := executor.ResumeCurrentRun(ctx, taskID, runID) @@ -102,7 +112,7 @@ func (s *Service) Open() error { coordLogger); err != nil { s.logger.Error("Failed to resume existing flux tasks", zap.Error(err)) } - if err := http.AddTaskServiceRoutes(s.HTTPDService.Handler, s.logger, fluxTaskService); err != nil { + if err := http.AddTaskServiceRoutes(s.HTTPDService.Handler, s.logger, taskService); err != nil { s.logger.Fatal("Could not add task service routes", zap.Error(err)) } } @@ -125,40 +135,3 @@ func (s *Service) Close() error { } return nil } - -// TODO: remove -type NoResultIterator struct{} - -func (n NoResultIterator) More() bool { - return false -} - -func (n NoResultIterator) Next() flux.Result { - panic("should not be called since More is always false") -} - -func (n NoResultIterator) Release() { -} - -func (n NoResultIterator) Err() error { - return nil -} - -func (n NoResultIterator) Statistics() flux.Statistics { - return flux.Statistics{} -} - -var _ flux.ResultIterator = &NoResultIterator{} - -type DummyQueryService struct { - logger *zap.Logger -} - -func (d *DummyQueryService) Query(ctx context.Context, compiler flux.Compiler) (flux.ResultIterator, error) { - d.logger.Info(fmt.Sprintf("DummyQueryService called with compiler of type %T", compiler)) - time.Sleep(30 * time.Second) - d.logger.Info("DummyQueryService is done sleeping") - return new(NoResultIterator), nil -} - -var _ taskmodel.QueryService = &DummyQueryService{} diff --git a/task/config.go b/task/config.go index 67975347a..0eab67a45 100644 --- a/task/config.go +++ b/task/config.go @@ -9,6 +9,7 @@ type Config struct { // TaskRunInfluxDB is the name of the influxdb instance finished // task runs and logs are written to. // Leaving it blank will write to Kapacitor's default influxdb instance. + // Setting it to 'none' will disable task logging. TaskRunInfluxDB string `toml:"task-run-influxdb"` // TaskRunBucket is the bucket (or influxdb 1.x database) to use for saving @@ -31,6 +32,10 @@ type Config struct { // and logs. // The defaults is "runs" TaskRunMeasurement string `toml:"task-run-measurement"` + + // Secrets is the kapacitor provider for secrets as described at + // https://docs.influxdata.com/influxdb/v2.0/security/secrets/ + Secrets map[string]string `toml:"secrets"` } func NewConfig() Config { @@ -43,6 +48,9 @@ func (c Config) Validate() error { if !c.Enabled { return nil } + if c.TaskRunInfluxDB == "none" { + return nil + } if len(c.TaskRunOrgID) > 0 && len(c.TaskRunOrg) > 0 { return fmt.Errorf("only one of task-run-org and task-run-orgid should be set") } diff --git a/task/fluxlocal/query.go b/task/fluxlocal/query.go new file mode 100644 index 000000000..f7aeee5c7 --- /dev/null +++ b/task/fluxlocal/query.go @@ -0,0 +1,58 @@ +package fluxlocal + +import ( + "context" + "fmt" + + "github.com/influxdata/flux" + "github.com/influxdata/flux/dependencies/filesystem" + "github.com/influxdata/flux/dependencies/secret" + "github.com/influxdata/flux/memory" + "github.com/influxdata/flux/runtime" + "github.com/influxdata/influxdb/v2/kit/errors" + "go.uber.org/zap" +) + +var _ secret.Service = &fluxQueryer{} + +type fluxQueryer struct { + secrets map[string]string + logger *zap.Logger +} + +func (f *fluxQueryer) LoadSecret(ctx context.Context, k string) (string, error) { + if val, ok := f.secrets[k]; ok { + return val, nil + } + return "", fmt.Errorf("secret named %s not found", k) +} + +func NewFluxQueryer(secrets map[string]string, logger *zap.Logger) *fluxQueryer { + return &fluxQueryer{ + secrets: secrets, + logger: logger, + } +} + +func (f *fluxQueryer) injectDependencies(ctx context.Context) context.Context { + deps := flux.NewDefaultDependencies() + deps.Deps.FilesystemService = filesystem.SystemFS + deps.Deps.SecretService = f + + // inject the dependencies to the context. + // one useful example is socket.from, kafka.to, and sql.from/sql.to where we need + // to access the url validator in deps to validate the user-specified url. + return deps.Inject(ctx) +} + +func (f *fluxQueryer) Query(ctx context.Context, compiler flux.Compiler) (flux.ResultIterator, error) { + f.logger.Info("executed flux query") + ctx = f.injectDependencies(context.Background()) + program, err := compiler.Compile(ctx, runtime.Default) + alloc := &memory.Allocator{} + query, err := program.Start(ctx, alloc) + if err != nil { + return nil, errors.Wrap(err, "error while executing flux program") + } + return flux.NewResultIteratorFromQuery(query), nil +} diff --git a/task/http/task_service.go b/task/http/task_service.go index 00a067f28..70189c1d4 100644 --- a/task/http/task_service.go +++ b/task/http/task_service.go @@ -37,13 +37,14 @@ type TaskHandler struct { const ( prefixKapacitor = "/kapacitor/v1" - prefixTasks = "/fluxtasks" - tasksIDPath = "/fluxtasks/:id" - tasksIDLogsPath = "/fluxtasks/:id/logs" - tasksIDRunsPath = "/fluxtasks/:id/runs" - tasksIDRunsIDPath = "/fluxtasks/:id/runs/:rid" - tasksIDRunsIDLogsPath = "/fluxtasks/:id/runs/:rid/logs" - tasksIDRunsIDRetryPath = "/fluxtasks/:id/runs/:rid/retry" + prefixTasks = "/api/v2/tasks" + prefixKapacitorTasks = prefixKapacitor + prefixTasks + tasksIDPath = prefixTasks + "/:id" + tasksIDLogsPath = prefixTasks + "/:id/logs" + tasksIDRunsPath = prefixTasks + "/:id/runs" + tasksIDRunsIDPath = prefixTasks + "/:id/runs/:rid" + tasksIDRunsIDLogsPath = prefixTasks + "/:id/runs/:rid/logs" + tasksIDRunsIDRetryPath = prefixTasks + "/:id/runs/:rid/retry" ) func (h *TaskHandler) Handle(w http.ResponseWriter, r *http.Request, user auth.User) { @@ -157,7 +158,8 @@ func RemoveTaskServiceRoutes(handler *httpd.Handler) error { // where time values are represented as strings type Task struct { ID platform.ID `json:"id"` - OwnerUsername string `json:"ownerUsername"` + OwnerUsername string `json:"ownerID"` + UnusedOrgId string `json:"orgID"` Name string `json:"name"` Description string `json:"description,omitempty"` Status string `json:"status"` @@ -319,9 +321,9 @@ func customParseDuration(d time.Duration) string { func newTaskResponse(t taskmodel.Task) taskResponse { response := taskResponse{ Links: map[string]string{ - "self": fmt.Sprintf("/kapacitor/v1/fluxtasks/%s", t.ID), - "runs": fmt.Sprintf("/kapacitor/v1/fluxtasks/%s/runs", t.ID), - "logs": fmt.Sprintf("/kapacitor/v1/fluxtasks/%s/logs", t.ID), + "self": fmt.Sprintf(prefixKapacitorTasks+"/%s", t.ID), + "runs": fmt.Sprintf(prefixKapacitorTasks+"/%s/runs", t.ID), + "logs": fmt.Sprintf(prefixKapacitorTasks+"/%s/logs", t.ID), }, Task: NewFrontEndTask(t), } @@ -368,7 +370,7 @@ type tasksResponse struct { func newTasksResponse(ctx context.Context, ts []*taskmodel.Task, f taskmodel.TaskFilter) tasksResponse { rs := tasksResponse{ - Links: newTasksPagingLinks(prefixTasks, ts, f), + Links: newTasksPagingLinks(prefixKapacitorTasks, ts, f), Tasks: make([]taskResponse, len(ts)), } for i := range ts { @@ -417,10 +419,10 @@ func newRunResponse(r taskmodel.Run) runResponse { return runResponse{ Links: map[string]string{ - "self": fmt.Sprintf("/api/v2/tasks/%s/runs/%s", r.TaskID, r.ID), - "task": fmt.Sprintf("/api/v2/tasks/%s", r.TaskID), - "logs": fmt.Sprintf("/api/v2/tasks/%s/runs/%s/logs", r.TaskID, r.ID), - "retry": fmt.Sprintf("/api/v2/tasks/%s/runs/%s/retry", r.TaskID, r.ID), + "self": fmt.Sprintf(prefixKapacitorTasks+"/%s/runs/%s", r.TaskID, r.ID), + "task": fmt.Sprintf(prefixKapacitorTasks+"/%s", r.TaskID), + "logs": fmt.Sprintf(prefixKapacitorTasks+"/%s/runs/%s/logs", r.TaskID, r.ID), + "retry": fmt.Sprintf(prefixKapacitorTasks+"/%s/runs/%s/retry", r.TaskID, r.ID), }, httpRun: run, } @@ -461,8 +463,8 @@ type runsResponse struct { func newRunsResponse(rs []*taskmodel.Run, taskID platform.ID) runsResponse { r := runsResponse{ Links: map[string]string{ - "self": fmt.Sprintf("/api/v2/tasks/%s/runs", taskID), - "task": fmt.Sprintf("/api/v2/tasks/%s", taskID), + "self": fmt.Sprintf(prefixKapacitorTasks+"/%s/runs", taskID), + "task": fmt.Sprintf(prefixKapacitorTasks+"/%s", taskID), }, Runs: make([]*runResponse, len(rs)), }