diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index 763e84dc4..000000000 --- a/Gopkg.lock +++ /dev/null @@ -1,1159 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - digest = "1:9a7a1f8cd0991a7c3549700b57c4ea1c213dadf7eb94d69e59ad3600490f81bc" - name = "cloud.google.com/go" - packages = [ - "compute/metadata", - "internal", - ] - pruneopts = "NUT" - revision = "2e6a95edb1071d750f6d7db777bf66cd2997af6c" - version = "v0.7.0" - -[[projects]] - digest = "1:253580c3e9e495538385a96f276a0e06f3ba90c73421df1258de8a8375ff4b09" - name = "github.com/Azure/azure-sdk-for-go" - packages = [ - "arm/compute", - "arm/network", - ] - pruneopts = "NUT" - revision = "bd73d950fa4440dae889bd9917bff7cef539f86e" - -[[projects]] - digest = "1:401dd46323a9f30c7cc9adef35f4961714caf74f61f8e8666f956bc158de9bba" - name = "github.com/Azure/go-autorest" - packages = [ - "autorest", - "autorest/azure", - "autorest/date", - "autorest/to", - "autorest/validation", - ] - pruneopts = "NUT" - revision = "a2fdd780c9a50455cecd249b00bdc3eb73a78e31" - -[[projects]] - digest = "1:be3ccd9f881604e4dd6d15cccfa126aa309232f0ba075ae5f92d3ef729a62758" - name = "github.com/BurntSushi/toml" - packages = ["."] - pruneopts = "NUT" - revision = "a368813c5e648fee92e5f6c30e3944ff9d5e8895" - -[[projects]] - digest = "1:d8ebbd207f3d3266d4423ce4860c9f3794956306ded6c7ba312ecc69cdfbf04c" - name = "github.com/PuerkitoBio/purell" - packages = ["."] - pruneopts = "NUT" - revision = "0bcb03f4b4d0a9428594752bd2a3b9aa0a9d4bd4" - version = "v1.1.0" - -[[projects]] - branch = "master" - digest = "1:8098cd40cd09879efbf12e33bcd51ead4a66006ac802cd563a66c4f3373b9727" - name = "github.com/PuerkitoBio/urlesc" - packages = ["."] - pruneopts = "NUT" - revision = "bbf7a2afc14f93e1e0a5c06df524fbd75e5031e5" - -[[projects]] - digest = "1:44c7344434890241dde2d0d70d2e47355a1e012549e28ccf06f925aa6f8271ff" - name = "github.com/Sirupsen/logrus" - packages = ["."] - pruneopts = "NUT" - revision = "ba1b36c82c5e05c4f912a88eab0dcd91a171688f" - version = "v0.11.5" - -[[projects]] - digest = "1:e3c230a3e97de27d6b74712ae4745be2c5400f0a6c4b9e348f5800be26f30a76" - name = "github.com/aws/aws-sdk-go" - packages = [ - "aws", - "aws/awserr", - "aws/awsutil", - "aws/client", - "aws/client/metadata", - "aws/corehandlers", - "aws/credentials", - "aws/credentials/ec2rolecreds", - "aws/credentials/endpointcreds", - "aws/credentials/stscreds", - "aws/defaults", - "aws/ec2metadata", - "aws/endpoints", - "aws/request", - "aws/session", - "aws/signer/v4", - "private/protocol", - "private/protocol/ec2query", - "private/protocol/query", - "private/protocol/query/queryutil", - "private/protocol/rest", - "private/protocol/xml/xmlutil", - "service/autoscaling", - "service/ec2", - "service/sts", - ] - pruneopts = "NUT" - revision = "f6ea558f30e0a983d529b32c741e4caed17c7df0" - version = "v1.8.16" - -[[projects]] - branch = "master" - digest = "1:bfe817c134f8681840c8d6c02606982ea29a19fd48086e89aaa8dff7c5d837dc" - name = "github.com/benbjohnson/tmpl" - packages = ["."] - pruneopts = "NUT" - revision = "8e77bc5fc07968736bb74f4b40b4c577028a61b6" - -[[projects]] - branch = "master" - digest = "1:cb0535f5823b47df7dcb9768ebb6c000b79ad115472910c70efe93c9ed9b2315" - name = "github.com/beorn7/perks" - packages = ["quantile"] - pruneopts = "NUT" - revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9" - -[[projects]] - digest = "1:aba270497eb2d49f5cba6f4162d524b9a1195a24cbce8be20bf56a0051f47deb" - name = "github.com/blang/semver" - packages = ["."] - pruneopts = "NUT" - revision = "b38d23b8782a487059e8fc8773e9a5b228a77cb6" - version = "v3.5.0" - -[[projects]] - digest = "1:4c7a379d06f493d3cf4301a08667d9b83011a92b1d9defc7ec58a10ade19e796" - name = "github.com/boltdb/bolt" - packages = ["."] - pruneopts = "NUT" - revision = "583e8937c61f1af6513608ccc75c97b6abdf4ff9" - version = "v1.3.0" - -[[projects]] - digest = "1:60488563e453e4bbf9f5387fe94c9dd3d28372dc993c5f89104b8396c3593b21" - name = "github.com/cenkalti/backoff" - packages = ["."] - pruneopts = "NUT" - revision = "32cd0c5b3aef12c76ed64aaf678f6c79736be7dc" - version = "v1.0.0" - -[[projects]] - branch = "master" - digest = "1:4c313de62fe9184560948eaa94714403a73d3026777a0da276550b7379cf6c80" - name = "github.com/coreos/go-oidc" - packages = [ - "http", - "jose", - "key", - "oauth2", - "oidc", - ] - pruneopts = "NUT" - revision = "be73733bb8cc830d0205609b95d125215f8e9c70" - -[[projects]] - digest = "1:e2c6ad2e212c0c9a8b13e5d1d52a6cd3a42411b636fcea10d286f7b6fc13fea0" - name = "github.com/coreos/pkg" - packages = [ - "health", - "httputil", - "timeutil", - ] - pruneopts = "NUT" - revision = "3ac0863d7acf3bc44daf49afef8919af12f704ef" - version = "v3" - -[[projects]] - branch = "master" - digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" - name = "github.com/davecgh/go-spew" - packages = ["spew"] - pruneopts = "NUT" - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - -[[projects]] - digest = "1:bfebf84ecf0c67e060f1e92cfcf3d4cbf4428a26a8b3cc258a64d7330f4de31b" - name = "github.com/dgrijalva/jwt-go" - packages = ["."] - pruneopts = "NUT" - revision = "d2709f9f1f31ebcda9651b03077758c1f3a0018c" - version = "v3.0.0" - -[[projects]] - digest = "1:516dc8a4003a0ad8aaf2b07d41bafb3c9772557ee8c819b36c28536cc30d0ac2" - name = "github.com/docker/distribution" - packages = [ - "digest", - "reference", - ] - pruneopts = "NUT" - revision = "a25b9ef0c9fe242ac04bb20d3a028442b7d266b6" - version = "v2.6.1" - -[[projects]] - digest = "1:740dc3cccfcdb302c323d17da5f4f2dfa65f7b8c666e0a9ac8bc64f560fb2974" - name = "github.com/docker/docker" - packages = [ - "api/types", - "api/types/blkiodev", - "api/types/container", - "api/types/filters", - "api/types/mount", - "api/types/network", - "api/types/registry", - "api/types/strslice", - "api/types/swarm", - "api/types/versions", - ] - pruneopts = "NUT" - revision = "092cba3727bb9b4a2f0e922cd6c0f93ea270e363" - version = "v1.13.1" - -[[projects]] - digest = "1:be0211ba62c6b44e36a747047b55d45ad23288920799edda7e8b59da852cbc2c" - name = "github.com/docker/go-connections" - packages = ["nat"] - pruneopts = "NUT" - revision = "990a1a1a70b0da4c4cb70e117971a4f0babfbf1a" - version = "v0.2.1" - -[[projects]] - digest = "1:cb9111a5f582f106b83203d29e92e28a02d1eba0e6ea20f61d67ae54b6a8dbfe" - name = "github.com/docker/go-units" - packages = ["."] - pruneopts = "NUT" - revision = "f2d77a61e3c169b43402a0a1e84f06daf29b8190" - version = "v0.3.1" - -[[projects]] - branch = "master" - digest = "1:3f451047834b63dcc35c5dc54d707440606cfd5b53c730a5f03bebd04d8e6af5" - name = "github.com/dustin/go-humanize" - packages = ["."] - pruneopts = "NUT" - revision = "259d2a102b871d17f30e3cd9881a642961a1e486" - -[[projects]] - digest = "1:492d2263bad08c906b12d9b7bb31213698d801dd01d033081139bd60d9009ca4" - name = "github.com/eclipse/paho.mqtt.golang" - packages = [ - ".", - "packets", - ] - pruneopts = "NUT" - revision = "45f9b18f4864c81d49c3ed01e5faec9eeb05de31" - version = "v1.0.0" - -[[projects]] - digest = "1:11652d24c6b9574c5f4a94370c0e23cbb46aec620f13f0c4f4bdc4635c2989e8" - name = "github.com/emicklei/go-restful" - packages = [ - ".", - "log", - "swagger", - ] - pruneopts = "NUT" - revision = "777bb3f19bcafe2575ffb2a3e46af92509ae9594" - version = "v1.2" - -[[projects]] - branch = "master" - digest = "1:df767c6ddf21aad6abd0da659e246cad6843e78ced90fb019a1625a12e571465" - name = "github.com/evanphx/json-patch" - packages = ["."] - pruneopts = "NUT" - revision = "30afec6a1650c11c861dc1fb58e100cd5219e490" - -[[projects]] - branch = "master" - digest = "1:a546bd0e6ce4ebdcf79507110d9498f697e154e5624e5e84dd2ca2efc776ae32" - name = "github.com/geoffgarside/ber" - packages = ["."] - pruneopts = "NUT" - revision = "854377f11dfb81f04121879829bc53487e377739" - -[[projects]] - branch = "master" - digest = "1:81466b4218bf6adddac2572a30ac733a9255919bc2f470b4827a317bd4ee1756" - name = "github.com/ghodss/yaml" - packages = ["."] - pruneopts = "NUT" - revision = "04f313413ffd65ce25f2541bfd2b2ceec5c0908c" - -[[projects]] - digest = "1:27b47997dc05f1af7b96d113754bd86ab1e7983d544cfd3bc7f48ec3e31ea3f5" - name = "github.com/go-ini/ini" - packages = ["."] - pruneopts = "NUT" - revision = "e7fea39b01aea8d5671f6858f0532f56e8bff3a5" - version = "v1.27.0" - -[[projects]] - branch = "master" - digest = "1:260f7ebefc63024c8dfe2c9f1a2935a89fa4213637a1f522f592f80c001cc441" - name = "github.com/go-openapi/jsonpointer" - packages = ["."] - pruneopts = "NUT" - revision = "779f45308c19820f1a69e9a4cd965f496e0da10f" - -[[projects]] - branch = "master" - digest = "1:98abd61947ff5c7c6fcfec5473d02a4821ed3a2dd99a4fbfdb7925b0dd745546" - name = "github.com/go-openapi/jsonreference" - packages = ["."] - pruneopts = "NUT" - revision = "36d33bfe519efae5632669801b180bf1a245da3b" - -[[projects]] - branch = "master" - digest = "1:ec09a363ecf22580db64d27f9d2c2604cea79e69bace2e50d66af15a492f82c1" - name = "github.com/go-openapi/spec" - packages = ["."] - pruneopts = "NUT" - revision = "e51c28f07047ad90caff03f6450908720d337e0c" - -[[projects]] - branch = "master" - digest = "1:dd9842008e1f630db0d091aa3774103b16bc972cf989492b71f734a03ebd6b5c" - name = "github.com/go-openapi/swag" - packages = ["."] - pruneopts = "NUT" - revision = "24ebf76d720bab64f62824d76bced3184a65490d" - -[[projects]] - digest = "1:a6afc27b2a73a5506832f3c5a1c19a30772cb69e7bd1ced4639eb36a55db224f" - name = "github.com/gogo/protobuf" - packages = [ - "proto", - "sortkeys", - ] - pruneopts = "NUT" - revision = "100ba4e885062801d56799d78530b73b178a78f3" - version = "v0.4" - -[[projects]] - branch = "master" - digest = "1:e2b86e41f3d669fc36b50d31d32d22c8ac656c75aa5ea89717ce7177e134ff2a" - name = "github.com/golang/glog" - packages = ["."] - pruneopts = "NUT" - revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998" - -[[projects]] - branch = "master" - digest = "1:065785c3265dc118dda15e31fb57e6ceface395a94b09cce8cd2c8fa8ce7b974" - name = "github.com/golang/protobuf" - packages = [ - "proto", - "protoc-gen-go", - "protoc-gen-go/descriptor", - "protoc-gen-go/generator", - "protoc-gen-go/grpc", - "protoc-gen-go/plugin", - ] - pruneopts = "NUT" - revision = "2bba0603135d7d7f5cb73b2125beeda19c09f4ef" - -[[projects]] - branch = "master" - digest = "1:9413ddbde906f91f062fda0dfa9a7cff43458cd1b2282c0fa25c61d89300b116" - name = "github.com/golang/snappy" - packages = ["."] - pruneopts = "NUT" - revision = "553a641470496b2327abcac10b36396bd98e45c9" - -[[projects]] - digest = "1:c32382738658c8f0e5c8e488967cc4cf1c795481ec8c62505b8976d2a8ad0c42" - name = "github.com/google/go-cmp" - packages = [ - "cmp", - "cmp/cmpopts", - "cmp/internal/diff", - "cmp/internal/function", - "cmp/internal/value", - ] - pruneopts = "NUT" - revision = "8099a9787ce5dc5984ed879a3bda47dc730a8e97" - version = "v0.1.0" - -[[projects]] - branch = "master" - digest = "1:f9425215dccf1c63f659ec781ca46bc81804341821d0cd8d2459c5b58f8bd067" - name = "github.com/google/gofuzz" - packages = ["."] - pruneopts = "NUT" - revision = "44d81051d367757e1c7c6a5a86423ece9afcf63c" - -[[projects]] - branch = "master" - digest = "1:1ab18cf8c2084968d6dca0dd46fbda9efba08664ecd7957b63c7ca57bb2455df" - name = "github.com/google/uuid" - packages = ["."] - pruneopts = "NUT" - revision = "6a5e28554805e78ea6141142aba763936c4761c0" - -[[projects]] - branch = "master" - digest = "1:b394d36f2403ca6e55d6de105ad73522c58919d19e31b0505f05c5afaa302ca7" - name = "github.com/googleapis/gax-go" - packages = ["."] - pruneopts = "NUT" - revision = "9af46dd5a1713e8b5cd71106287eba3cefdde50b" - -[[projects]] - branch = "master" - digest = "1:b60e505ed8574c018837ba28d824a9c2172f8a2837c79dda6c32e70e2e596d1c" - name = "github.com/gorhill/cronexpr" - packages = ["."] - pruneopts = "NUT" - revision = "88b0669f7d75f171bd612b874e52b95c190218df" - -[[projects]] - digest = "1:064c7f0ccdb4036791092fb93ec214a6f09119711801b9e587b6d1e76acc55de" - name = "github.com/hashicorp/consul" - packages = ["api"] - pruneopts = "NUT" - revision = "e9ca44d0a1757ac9aecc6785904a701936c10e4a" - version = "v0.8.1" - -[[projects]] - branch = "master" - digest = "1:7b699584752575e81e3f4e8b00cfb3e5d6fa5419d5d212ef925e02c798847464" - name = "github.com/hashicorp/go-cleanhttp" - packages = ["."] - pruneopts = "NUT" - revision = "3573b8b52aa7b37b9358d966a898feb387f62437" - -[[projects]] - branch = "master" - digest = "1:cdb5ce76cd7af19e3d2d5ba9b6458a2ee804f0d376711215dd3df5f51100d423" - name = "github.com/hashicorp/go-rootcerts" - packages = ["."] - pruneopts = "NUT" - revision = "6bb64b370b90e7ef1fa532be9e591a81c3493e00" - -[[projects]] - digest = "1:0dd7b7b01769f9df356dc99f9e4144bdbabf6c79041ea7c0892379c5737f3c44" - name = "github.com/hashicorp/serf" - packages = ["coordinate"] - pruneopts = "NUT" - revision = "d6574a5bb1226678d7010325fb6c985db20ee458" - version = "v0.8.1" - -[[projects]] - digest = "1:4b32a332c32e1626280df4aceecc6b9eeaa8aa11e5083926ed41b89409ec40b6" - name = "github.com/influxdata/influxdb" - packages = [ - ".", - "client", - "client/v2", - "influxql", - "influxql/internal", - "influxql/neldermead", - "models", - "monitor/diagnostics", - "pkg/escape", - "pkg/limiter", - "services/collectd", - "services/graphite", - "services/meta", - "services/meta/internal", - "services/opentsdb", - "services/udp", - "toml", - "tsdb", - "tsdb/internal", - "uuid", - ] - pruneopts = "NUT" - revision = "e4628bb69266dbd624dc27d674b52705ce0dcbf2" - version = "v1.1.4" - -[[projects]] - branch = "master" - digest = "1:a6411d501f20aa4325c2cef806205a4b4802aec94b296f495db662c6ef46c787" - name = "github.com/influxdata/usage-client" - packages = ["v1"] - pruneopts = "NUT" - revision = "6d3895376368aa52a3a81d2a16e90f0f52371967" - -[[projects]] - branch = "master" - digest = "1:61187cdf67a554f26a184342401d2d7f40cb7064a77de4b52b099a4bc8368290" - name = "github.com/influxdata/wlog" - packages = ["."] - pruneopts = "NUT" - revision = "7c63b0a71ef8300adc255344d275e10e5c3a71ec" - -[[projects]] - digest = "1:7c818eb119c69fc685573449e8f799596ba81827074b006ff0cb71052424f254" - name = "github.com/jmespath/go-jmespath" - packages = ["."] - pruneopts = "NUT" - revision = "3433f3ea46d9f8019119e7dd41274e112a2359a9" - version = "0.2.2" - -[[projects]] - digest = "1:6b1eae4bb93e5ccd23cb09d1e005ecb391316d27701b7a5264f8555a6e2f3d87" - name = "github.com/jonboulle/clockwork" - packages = ["."] - pruneopts = "NUT" - revision = "2eee05ed794112d45db504eb05aa693efd2b8b09" - version = "v0.1.0" - -[[projects]] - branch = "master" - digest = "1:57719b5d47a6adf438ed209107c10d0da22e993916b326df3a41fcb6c9bad533" - name = "github.com/juju/ratelimit" - packages = ["."] - pruneopts = "NUT" - revision = "acf38b000a03e4ab89e40f20f1e548f4e6ac7f72" - -[[projects]] - digest = "1:3a32e9d6c50f433ce5a8a65106c882ec0734a39863bdde6efa1f33c4d3e66acf" - name = "github.com/k-sone/snmpgo" - packages = ["."] - pruneopts = "NUT" - revision = "de09377ff34857b08afdc16ea8c7c2929eb1fc6e" - version = "v3.2.0" - -[[projects]] - digest = "1:805127e5bf73d46bf81aeb8eab8a28697880045761fa28d483308247c2898290" - name = "github.com/kimor79/gollectd" - packages = ["."] - pruneopts = "NUT" - revision = "b5dddb1667dcc1e6355b9305e2c1608a2db6983c" - version = "v1.0.0" - -[[projects]] - digest = "1:9ab29968625f38dd39ab1dbd50797549313de7881782a32be6f2ca664c99dd08" - name = "github.com/mailru/easyjson" - packages = [ - ".", - "bootstrap", - "buffer", - "easyjson", - "gen", - "jlexer", - "jwriter", - "parser", - ] - pruneopts = "NUT" - revision = "3fdea8d05856a0c8df22ed4bc71b3219245e4485" - -[[projects]] - digest = "1:cb591533458f6eb6e2c1065ff3eac6b50263d7847deb23fc9f79b25bc608970e" - name = "github.com/mattn/go-runewidth" - packages = ["."] - pruneopts = "NUT" - revision = "9e777a8366cce605130a531d2cd6363d07ad7317" - version = "v0.0.2" - -[[projects]] - digest = "1:5985ef4caf91ece5d54817c11ea25f182697534f8ae6521eadcd628c142ac4b6" - name = "github.com/matttproud/golang_protobuf_extensions" - packages = ["pbutil"] - pruneopts = "NUT" - revision = "3247c84500bff8d9fb6d579d800f20b3e091582c" - version = "v1.0.0" - -[[projects]] - branch = "master" - digest = "1:bdff96d801b156a076211f2218e9a3d6ce942e087a8a5fb345b7a088bd65473f" - name = "github.com/miekg/dns" - packages = ["."] - pruneopts = "NUT" - revision = "6ebcb714d36901126ee2807031543b38c56de963" - -[[projects]] - branch = "master" - digest = "1:c16945365aa2772ae7347e8d944ff38abd385bf217a75852f4b490e1af06b1aa" - name = "github.com/mitchellh/copystructure" - packages = ["."] - pruneopts = "NUT" - revision = "f81071c9d77b7931f78c90b416a074ecdc50e959" - -[[projects]] - branch = "master" - digest = "1:b62c4f18ad6eb454ac5253e7791ded3d7867330015ca4b37b6336e57f514585e" - name = "github.com/mitchellh/go-homedir" - packages = ["."] - pruneopts = "NUT" - revision = "b8bc1bf767474819792c23f32d8286a45736f1c6" - -[[projects]] - branch = "master" - digest = "1:77ae0dd3bf0743d1baf1918b01858d423cf578826d70c8b59092ab52e4b9dfb9" - name = "github.com/mitchellh/mapstructure" - packages = ["."] - pruneopts = "NUT" - revision = "5a0325d7fafaac12dda6e7fb8bd222ec1b69875e" - -[[projects]] - branch = "master" - digest = "1:08893d896360bc28ab00692d16a1df1bea0bc8f52da93a8bea7b4d46e141c5c6" - name = "github.com/mitchellh/reflectwalk" - packages = ["."] - pruneopts = "NUT" - revision = "417edcfd99a4d472c262e58f22b4bfe97580f03e" - -[[projects]] - digest = "1:c7754aaef62e30fefcc59727dcd71aea29e3c3868df0bd316bfe62e05131fafb" - name = "github.com/pborman/uuid" - packages = ["."] - pruneopts = "NUT" - revision = "a97ce2ca70fa5a848076093f05e639a89ca34d06" - version = "v1.0" - -[[projects]] - digest = "1:5cf3f025cbee5951a4ee961de067c8a89fc95a5adabead774f82822efabab121" - name = "github.com/pkg/errors" - packages = ["."] - pruneopts = "NUT" - revision = "645ef00459ed84a119197bfb8d8205042c6df63d" - version = "v0.8.0" - -[[projects]] - digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - pruneopts = "NUT" - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" - -[[projects]] - digest = "1:3e5fd795ebf6a9e13e67d644da76130af7a6003286531f9573f8074c228b66a3" - name = "github.com/prometheus/client_golang" - packages = ["prometheus"] - pruneopts = "NUT" - revision = "c5b7fccd204277076155f10851dad72b76a49317" - version = "v0.8.0" - -[[projects]] - branch = "master" - digest = "1:32d10bdfa8f09ecf13598324dba86ab891f11db3c538b6a34d1c3b5b99d7c36b" - name = "github.com/prometheus/client_model" - packages = ["go"] - pruneopts = "NUT" - revision = "6f3806018612930941127f2a7c6c453ba2c527d2" - -[[projects]] - branch = "master" - digest = "1:4f7ffe5f45a74be4c6b116a0ff2e435edce68d639becebc1ecaaa22487e177bb" - name = "github.com/prometheus/common" - packages = [ - "expfmt", - "internal/bitbucket.org/ww/goautoneg", - "log", - "model", - "version", - ] - pruneopts = "NUT" - revision = "9e0844febd9e2856f839c9cb974fbd676d1755a8" - -[[projects]] - branch = "master" - digest = "1:2a011811c4dae8274c3ced565b10f30ab9f43cb799e5a425607464c0c585c1c3" - name = "github.com/prometheus/procfs" - packages = [ - ".", - "xfs", - ] - pruneopts = "NUT" - revision = "6ac8c5d890d415025dd5aae7595bcb2a6e7e2fad" - -[[projects]] - branch = "logger-targetmanager-wait" - digest = "1:2aa5c16ddde403c807c8e4ddba9b3e31faac62ec86e2df6afafe032419f7d055" - name = "github.com/prometheus/prometheus" - packages = [ - "config", - "discovery", - "discovery/azure", - "discovery/consul", - "discovery/dns", - "discovery/ec2", - "discovery/file", - "discovery/gce", - "discovery/kubernetes", - "discovery/marathon", - "discovery/triton", - "discovery/zookeeper", - "relabel", - "retrieval", - "storage", - "storage/local", - "storage/local/chunk", - "storage/local/codable", - "storage/local/index", - "storage/metric", - "util/flock", - "util/httputil", - "util/strutil", - "util/testutil", - "util/treecache", - ] - pruneopts = "NUT" - revision = "58298e738211f46cdab48c404e5514a544774579" - source = "github.com/goller/prometheus" - -[[projects]] - digest = "1:118f00f400c10c1dd21a267fd04697c758dbe9a38cf5fa3fab3bb3625af9efe7" - name = "github.com/russross/blackfriday" - packages = ["."] - pruneopts = "NUT" - revision = "0b647d0506a698cca42caca173e55559b12a69f2" - version = "v1.4" - -[[projects]] - branch = "master" - digest = "1:142520cf3c9bb85449dd0000f820b8c604531587ee654793c54909be7dabadac" - name = "github.com/samuel/go-zookeeper" - packages = ["zk"] - pruneopts = "NUT" - revision = "1d7be4effb13d2d908342d349d71a284a7542693" - -[[projects]] - digest = "1:b1184e4b8e474f452b201392428a78f93471ec90a7ef72fd00bf2b11a2511b30" - name = "github.com/segmentio/kafka-go" - packages = [ - ".", - "sasl", - ] - pruneopts = "NUT" - revision = "9a956db8bd00245835f16007fbfe8ec58b31b8b9" - version = "v0.3.5" - -[[projects]] - branch = "master" - digest = "1:e700de914d366e75d5711582669407619dd26746cb80b0f6bd2cb0e8f0ec18c1" - name = "github.com/serenize/snaker" - packages = ["."] - pruneopts = "NUT" - revision = "543781d2b79bd95c51ffe70e70a55c946ca211ff" - -[[projects]] - branch = "master" - digest = "1:da6203ec5679b8d7af6fe2dbcd694694b9af883a6bae7f702ec5a11815301e94" - name = "github.com/shurcooL/go" - packages = ["indentwriter"] - pruneopts = "NUT" - revision = "20b4b0a352116a106a505a8c528b6513e7e0d5c2" - -[[projects]] - branch = "master" - digest = "1:81fc235daf173fbcabfda91e1d5d1d918a057f33e30b57dc72fa6091047ac718" - name = "github.com/shurcooL/markdownfmt" - packages = ["markdown"] - pruneopts = "NUT" - revision = "10aae0a270abfb5d929ae6ca59c4b0ac0fa8f237" - -[[projects]] - branch = "master" - digest = "1:400359f0b394fb168f4aee9621d42cc005810c6e462009d5fc76055d5e96dcf3" - name = "github.com/shurcooL/sanitized_anchor_name" - packages = ["."] - pruneopts = "NUT" - revision = "1dba4b3954bc059efc3991ec364f9f9a35f597d2" - -[[projects]] - branch = "master" - digest = "1:75d8ef7fd5eb922263b8c8f30aae17ddd6876ed3bc52c17d8406553d123f8770" - name = "github.com/spf13/pflag" - packages = ["."] - pruneopts = "NUT" - revision = "2300d0f8576fe575f71aaa5b9bbe4e1b0dc2eb51" - -[[projects]] - digest = "1:b5c8b4a0ad5f65a85eb2a9f89e30c638ef8b99f8a3f078467cea778869757666" - name = "github.com/stretchr/testify" - packages = ["assert"] - pruneopts = "NUT" - revision = "69483b4bd14f5845b5a1e55bca19e954e827f1d0" - version = "v1.1.4" - -[[projects]] - branch = "master" - digest = "1:9137e62a44c92cd9fe7d563b8480a6fbb2cd97815ef194a37696d9635a6a4056" - name = "github.com/syndtr/goleveldb" - packages = [ - "leveldb", - "leveldb/cache", - "leveldb/comparer", - "leveldb/errors", - "leveldb/filter", - "leveldb/iterator", - "leveldb/journal", - "leveldb/memdb", - "leveldb/opt", - "leveldb/storage", - "leveldb/table", - "leveldb/util", - ] - pruneopts = "NUT" - revision = "8c81ea47d4c41a385645e133e15510fc6a2a74b4" - -[[projects]] - branch = "master" - digest = "1:af13b22439d69b477caf532439fdcbb3e2a18bde35d3135003f8be46bb8d8967" - name = "github.com/ugorji/go" - packages = ["codec"] - pruneopts = "NUT" - revision = "708a42d246822952f38190a8d8c4e6b16a0e600c" - -[[projects]] - branch = "master" - digest = "1:95100f4ac20072567aa10607f61c66ff28965659f77f6ba807bd875a685710d9" - name = "golang.org/x/crypto" - packages = [ - "bcrypt", - "blowfish", - ] - pruneopts = "NUT" - revision = "0242f07995e684be54f2a2776327141acf1cef91" - -[[projects]] - branch = "master" - digest = "1:9c7239e01cf1289afb7460a80b820bcaa5638add06e5cf55e676950b414c817d" - name = "golang.org/x/net" - packages = [ - "context", - "context/ctxhttp", - "http2", - "http2/hpack", - "idna", - "internal/timeseries", - "lex/httplex", - "trace", - "websocket", - ] - pruneopts = "NUT" - revision = "d212a1ef2de2f5d441c327b8f26cf3ea3ea9f265" - -[[projects]] - branch = "master" - digest = "1:da311e132160fec8dfc9e659915b8f942e5563c27bbf3c45d2c9e67a1434ef65" - name = "golang.org/x/oauth2" - packages = [ - ".", - "google", - "internal", - "jws", - "jwt", - ] - pruneopts = "NUT" - revision = "a6bd8cefa1811bd24b86f8902872e4e8225f74c4" - -[[projects]] - branch = "master" - digest = "1:49763f4a63eaef31cde11bc013e9d250e294fb5fc8b02b9c93807fc430106cf9" - name = "golang.org/x/sys" - packages = [ - "unix", - "windows", - "windows/registry", - "windows/svc/eventlog", - ] - pruneopts = "NUT" - revision = "f3918c30c5c2cb527c0b071a27c35120a6c0719a" - -[[projects]] - branch = "master" - digest = "1:35e546e3d2af2735e23a5698e0d5c87f7b0ca5683b3fbc25a10bcf397e032d19" - name = "golang.org/x/text" - packages = [ - "internal/gen", - "internal/triegen", - "internal/ucd", - "secure/bidirule", - "transform", - "unicode/bidi", - "unicode/cldr", - "unicode/norm", - "unicode/rangetable", - "width", - ] - pruneopts = "NUT" - revision = "a9a820217f98f7c8a207ec1e45a874e1fe12c478" - -[[projects]] - branch = "master" - digest = "1:9f32afa47f2da74cef7fd3ace0c5b8bf7476f432e4a1c7163ecdd22cf17154b8" - name = "google.golang.org/api" - packages = [ - "compute/v1", - "gensupport", - "googleapi", - "googleapi/internal/uritemplates", - ] - pruneopts = "NUT" - revision = "fbbaff1827317122a8a0e1b24de25df8417ce87b" - -[[projects]] - digest = "1:7206d98ec77c90c72ec2c405181a1dcf86965803b6dbc4f98ceab7a5047c37a9" - name = "google.golang.org/appengine" - packages = [ - ".", - "internal", - "internal/app_identity", - "internal/base", - "internal/datastore", - "internal/log", - "internal/modules", - "internal/remote_api", - "internal/urlfetch", - "urlfetch", - ] - pruneopts = "NUT" - revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a" - version = "v1.0.0" - -[[projects]] - digest = "1:73ac483b9160d55bbdaa4ca261234e391bd14ac69cfb172bead53e421197a0f0" - name = "google.golang.org/grpc" - packages = [ - ".", - "codes", - "credentials", - "grpclog", - "internal", - "keepalive", - "metadata", - "naming", - "peer", - "stats", - "tap", - "transport", - ] - pruneopts = "NUT" - revision = "8050b9cbc271307e5a716a9d782803d09b0d6f2d" - version = "v1.2.1" - -[[projects]] - branch = "v3" - digest = "1:1244a9b3856f70d5ffb74bbfd780fc9d47f93f2049fa265c6fb602878f507bf8" - name = "gopkg.in/alexcesaro/quotedprintable.v3" - packages = ["."] - pruneopts = "NUT" - revision = "2caba252f4dc53eaf6b553000885530023f54623" - -[[projects]] - digest = "1:c970218a20933dd0a2eb2006de922217fa9276f57d25009b2a934eb1c50031cc" - name = "gopkg.in/fsnotify.v1" - packages = ["."] - pruneopts = "NUT" - revision = "629574ca2a5df945712d3079857300b5e4da0236" - source = "git@github.com:fsnotify/fsnotify" - -[[projects]] - digest = "1:d852dd703c644c976246382fe1539e8585cc20d642d3e68d3dff8de952237497" - name = "gopkg.in/gomail.v2" - packages = ["."] - pruneopts = "NUT" - revision = "41f3572897373c5538c50a2402db15db079fa4fd" - version = "2.0.0" - -[[projects]] - digest = "1:ef72505cf098abdd34efeea032103377bec06abb61d8a06f002d5d296a4b1185" - name = "gopkg.in/inf.v0" - packages = ["."] - pruneopts = "NUT" - revision = "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" - version = "v0.9.0" - -[[projects]] - branch = "v2" - digest = "1:ad6f94355d292690137613735965bd3688844880fdab90eccf66321910344942" - name = "gopkg.in/yaml.v2" - packages = ["."] - pruneopts = "NUT" - revision = "a5b47d31c556af34a302ce5d659e6fea44d90de0" - -[[projects]] - digest = "1:250d6f7f059d3ebceea5e6deed3561878b0c9807d5c17d58f7ca1890e4193f88" - name = "k8s.io/client-go" - packages = [ - "1.5/discovery", - "1.5/kubernetes", - "1.5/kubernetes/typed/apps/v1alpha1", - "1.5/kubernetes/typed/authentication/v1beta1", - "1.5/kubernetes/typed/authorization/v1beta1", - "1.5/kubernetes/typed/autoscaling/v1", - "1.5/kubernetes/typed/batch/v1", - "1.5/kubernetes/typed/certificates/v1alpha1", - "1.5/kubernetes/typed/core/v1", - "1.5/kubernetes/typed/extensions/v1beta1", - "1.5/kubernetes/typed/policy/v1alpha1", - "1.5/kubernetes/typed/rbac/v1alpha1", - "1.5/kubernetes/typed/storage/v1beta1", - "1.5/pkg/api", - "1.5/pkg/api/errors", - "1.5/pkg/api/install", - "1.5/pkg/api/meta", - "1.5/pkg/api/meta/metatypes", - "1.5/pkg/api/resource", - "1.5/pkg/api/unversioned", - "1.5/pkg/api/v1", - "1.5/pkg/api/validation/path", - "1.5/pkg/apimachinery", - "1.5/pkg/apimachinery/announced", - "1.5/pkg/apimachinery/registered", - "1.5/pkg/apis/apps", - "1.5/pkg/apis/apps/install", - "1.5/pkg/apis/apps/v1alpha1", - "1.5/pkg/apis/authentication", - "1.5/pkg/apis/authentication/install", - "1.5/pkg/apis/authentication/v1beta1", - "1.5/pkg/apis/authorization", - "1.5/pkg/apis/authorization/install", - "1.5/pkg/apis/authorization/v1beta1", - "1.5/pkg/apis/autoscaling", - "1.5/pkg/apis/autoscaling/install", - "1.5/pkg/apis/autoscaling/v1", - "1.5/pkg/apis/batch", - "1.5/pkg/apis/batch/install", - "1.5/pkg/apis/batch/v1", - "1.5/pkg/apis/batch/v2alpha1", - "1.5/pkg/apis/certificates", - "1.5/pkg/apis/certificates/install", - "1.5/pkg/apis/certificates/v1alpha1", - "1.5/pkg/apis/extensions", - "1.5/pkg/apis/extensions/install", - "1.5/pkg/apis/extensions/v1beta1", - "1.5/pkg/apis/policy", - "1.5/pkg/apis/policy/install", - "1.5/pkg/apis/policy/v1alpha1", - "1.5/pkg/apis/rbac", - "1.5/pkg/apis/rbac/install", - "1.5/pkg/apis/rbac/v1alpha1", - "1.5/pkg/apis/storage", - "1.5/pkg/apis/storage/install", - "1.5/pkg/apis/storage/v1beta1", - "1.5/pkg/auth/user", - "1.5/pkg/conversion", - "1.5/pkg/conversion/queryparams", - "1.5/pkg/fields", - "1.5/pkg/genericapiserver/openapi/common", - "1.5/pkg/labels", - "1.5/pkg/runtime", - "1.5/pkg/runtime/serializer", - "1.5/pkg/runtime/serializer/json", - "1.5/pkg/runtime/serializer/protobuf", - "1.5/pkg/runtime/serializer/recognizer", - "1.5/pkg/runtime/serializer/streaming", - "1.5/pkg/runtime/serializer/versioning", - "1.5/pkg/selection", - "1.5/pkg/third_party/forked/golang/reflect", - "1.5/pkg/types", - "1.5/pkg/util", - "1.5/pkg/util/cert", - "1.5/pkg/util/clock", - "1.5/pkg/util/errors", - "1.5/pkg/util/flowcontrol", - "1.5/pkg/util/framer", - "1.5/pkg/util/integer", - "1.5/pkg/util/intstr", - "1.5/pkg/util/json", - "1.5/pkg/util/labels", - "1.5/pkg/util/net", - "1.5/pkg/util/parsers", - "1.5/pkg/util/rand", - "1.5/pkg/util/runtime", - "1.5/pkg/util/sets", - "1.5/pkg/util/uuid", - "1.5/pkg/util/validation", - "1.5/pkg/util/validation/field", - "1.5/pkg/util/wait", - "1.5/pkg/util/yaml", - "1.5/pkg/version", - "1.5/pkg/watch", - "1.5/pkg/watch/versioned", - "1.5/plugin/pkg/client/auth", - "1.5/plugin/pkg/client/auth/gcp", - "1.5/plugin/pkg/client/auth/oidc", - "1.5/rest", - "1.5/tools/cache", - "1.5/tools/clientcmd/api", - "1.5/tools/metrics", - "1.5/transport", - ] - pruneopts = "NUT" - revision = "1195e3a8ee1a529d53eed7c624527a68555ddf1f" - version = "v1.5.1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "github.com/BurntSushi/toml", - "github.com/aws/aws-sdk-go/aws", - "github.com/aws/aws-sdk-go/aws/awserr", - "github.com/aws/aws-sdk-go/aws/credentials", - "github.com/aws/aws-sdk-go/aws/session", - "github.com/aws/aws-sdk-go/service/autoscaling", - "github.com/benbjohnson/tmpl", - "github.com/boltdb/bolt", - "github.com/cenkalti/backoff", - "github.com/davecgh/go-spew/spew", - "github.com/dgrijalva/jwt-go", - "github.com/docker/docker/api/types", - "github.com/docker/docker/api/types/swarm", - "github.com/dustin/go-humanize", - "github.com/eclipse/paho.mqtt.golang", - "github.com/evanphx/json-patch", - "github.com/ghodss/yaml", - "github.com/golang/protobuf/proto", - "github.com/golang/protobuf/protoc-gen-go", - "github.com/google/go-cmp/cmp", - "github.com/google/go-cmp/cmp/cmpopts", - "github.com/google/uuid", - "github.com/gorhill/cronexpr", - "github.com/influxdata/influxdb", - "github.com/influxdata/influxdb/client", - "github.com/influxdata/influxdb/client/v2", - "github.com/influxdata/influxql", - "github.com/influxdata/influxdb/models", - "github.com/influxdata/influxdb/services/collectd", - "github.com/influxdata/influxdb/services/graphite", - "github.com/influxdata/influxdb/services/meta", - "github.com/influxdata/influxdb/services/opentsdb", - "github.com/influxdata/influxdb/services/udp", - "github.com/influxdata/influxdb/toml", - "github.com/influxdata/influxdb/uuid", - "github.com/influxdata/usage-client/v1", - "github.com/influxdata/wlog", - "github.com/k-sone/snmpgo", - "github.com/mailru/easyjson", - "github.com/mailru/easyjson/easyjson", - "github.com/mailru/easyjson/jlexer", - "github.com/mailru/easyjson/jwriter", - "github.com/mitchellh/copystructure", - "github.com/mitchellh/mapstructure", - "github.com/mitchellh/reflectwalk", - "github.com/pkg/errors", - "github.com/prometheus/common/log", - "github.com/prometheus/common/model", - "github.com/prometheus/prometheus/config", - "github.com/prometheus/prometheus/discovery", - "github.com/prometheus/prometheus/discovery/azure", - "github.com/prometheus/prometheus/discovery/consul", - "github.com/prometheus/prometheus/discovery/dns", - "github.com/prometheus/prometheus/discovery/ec2", - "github.com/prometheus/prometheus/discovery/file", - "github.com/prometheus/prometheus/discovery/gce", - "github.com/prometheus/prometheus/discovery/marathon", - "github.com/prometheus/prometheus/discovery/triton", - "github.com/prometheus/prometheus/discovery/zookeeper", - "github.com/prometheus/prometheus/retrieval", - "github.com/prometheus/prometheus/storage", - "github.com/segmentio/kafka-go", - "github.com/serenize/snaker", - "github.com/shurcooL/markdownfmt/markdown", - "github.com/stretchr/testify/assert", - "gopkg.in/gomail.v2", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index da62fa112..000000000 --- a/Gopkg.toml +++ /dev/null @@ -1,79 +0,0 @@ -required = [ - "github.com/benbjohnson/tmpl", - "github.com/golang/protobuf/protoc-gen-go", - "github.com/mailru/easyjson/easyjson", -] - -[prune] - unused-packages = true - go-tests = true - non-go = true - -[[constraint]] - branch = "master" - name = "github.com/davecgh/go-spew" - -[[constraint]] - branch = "master" - name = "github.com/mailru/easyjson" - -[[constraint]] - branch = "master" - name = "github.com/evanphx/json-patch" - -[[constraint]] - branch = "master" - name = "github.com/ghodss/yaml" - -[[constraint]] - branch = "master" - name = "github.com/google/uuid" - -[[constraint]] - name = "github.com/influxdata/influxdb" - version = "~1.1.0" - -[[constraint]] - branch = "master" - name = "github.com/mitchellh/mapstructure" - -[[constraint]] - branch = "logger-targetmanager-wait" - name = "github.com/prometheus/prometheus" - source = "github.com/goller/prometheus" - -[[constraint]] - branch = "master" - name = "github.com/shurcooL/markdownfmt" - -[[constraint]] - name = "github.com/eclipse/paho.mqtt.golang" - version = "~1.0.0" - -[[constraint]] - name = "github.com/gorhill/cronexpr" - branch = "master" - -# Pin BurntSushi/toml to the same version used in influxdb -# This also avoids using a version with the WTFPL license -[[constraint]] - name= "github.com/BurntSushi/toml" - revision = "a368813c5e648fee92e5f6c30e3944ff9d5e8895" - -# Force the Azure projects to be a specific older version that Prometheus needs -[[override]] - name = "github.com/Azure/azure-sdk-for-go" - revision = "bd73d950fa4440dae889bd9917bff7cef539f86e" - -[[override]] - name = "github.com/Azure/go-autorest" - revision = "a2fdd780c9a50455cecd249b00bdc3eb73a78e31" - -[[override]] - name= "gopkg.in/fsnotify.v1" - revision = "629574ca2a5df945712d3079857300b5e4da0236" - source = "git@github.com:fsnotify/fsnotify" - -[[override]] - name= "github.com/mailru/easyjson" - revision = "3fdea8d05856a0c8df22ed4bc71b3219245e4485" diff --git a/alert.go b/alert.go index b481ac37f..3be604346 100644 --- a/alert.go +++ b/alert.go @@ -817,6 +817,7 @@ func (n *AlertNode) newAlertState(tags models.Tags) *alertState { } func (n *AlertNode) restoreEvent(id string) (alert.Level, time.Time) { + //panic("NOT IMPLEMENTED") var topicState, anonTopicState alert.EventState var anonFound, topicFound bool // Check for previous state on anonTopic diff --git a/alert/topics.go b/alert/topics.go index b34b0618e..2782c11c0 100644 --- a/alert/topics.go +++ b/alert/topics.go @@ -48,6 +48,7 @@ func (s *Topics) Close() error { return nil } +// Topic returns the topic with the given id, and if it exists or not func (s *Topics) Topic(id string) (*Topic, bool) { s.mu.RLock() t, ok := s.topics[id] @@ -55,7 +56,18 @@ func (s *Topics) Topic(id string) (*Topic, bool) { return t, ok } -func (s *Topics) RestoreTopic(id string, eventStates map[string]EventState) { +func (s *Topics) RestoreTopicNoCopy(topic string, eventStates map[string]*EventState) { + s.mu.Lock() + defer s.mu.Unlock() + t, ok := s.topics[topic] + if !ok { + t = s.newTopic(topic) + s.topics[topic] = t + } + t.restoreEventStatesNoCopy(eventStates) +} + +func (s *Topics) RestoreTopic(id string, eventStates map[string]*EventState) { s.mu.Lock() defer s.mu.Unlock() t, ok := s.topics[id] @@ -66,13 +78,21 @@ func (s *Topics) RestoreTopic(id string, eventStates map[string]EventState) { t.restoreEventStates(eventStates) } -func (s *Topics) UpdateEvent(id string, event EventState) { +func (s *Topics) RestoreTopics() { s.mu.Lock() defer s.mu.Unlock() - t, ok := s.topics[id] + for _, t := range s.topics { + t.restoreEventStates(t.events) + } +} + +func (s *Topics) UpdateEvent(topicID string, event EventState) { + + s.mu.Lock() + defer s.mu.Unlock() + t, ok := s.topics[topicID] if !ok { - t = s.newTopic(id) - s.topics[id] = t + s.topics[topicID] = s.newTopic(topicID) } t.updateEvent(event) } @@ -104,7 +124,6 @@ func (s *Topics) Collect(event Event) error { } s.mu.Unlock() } - return topic.collect(event) } @@ -266,14 +285,26 @@ func (t *Topic) removeHandler(h Handler) { } } -func (t *Topic) restoreEventStates(eventStates map[string]EventState) { +func (t *Topic) restoreEventStatesNoCopy(eventStates map[string]*EventState) { + t.mu.Lock() + defer t.mu.Unlock() + t.events = make(map[string]*EventState, len(eventStates)) + t.sorted = make([]*EventState, 0, len(eventStates)) + for id, state := range eventStates { + t.events[id] = state + t.sorted = append(t.sorted, state) + } + sort.Sort(sortedStates(t.sorted)) +} + +func (t *Topic) restoreEventStates(eventStates map[string]*EventState) { t.mu.Lock() defer t.mu.Unlock() t.events = make(map[string]*EventState, len(eventStates)) t.sorted = make([]*EventState, 0, len(eventStates)) for id, state := range eventStates { e := new(EventState) - *e = state + *e = *state t.events[id] = e t.sorted = append(t.sorted, e) } @@ -315,16 +346,19 @@ func (t *Topic) close() { } func (t *Topic) collect(event Event) error { + prev, ok := t.updateEvent(event.State) if ok { event.previousState = prev } t.collected.Add(1) + return t.handleEvent(event) } func (t *Topic) handleEvent(event Event) error { + t.mu.RLock() defer t.mu.RUnlock() @@ -374,6 +408,7 @@ func (t *Topic) updateEvent(state EventState) (EventState, bool) { type sortedStates []*EventState +// TODO(docmerlin): replaced sortedStates with a heap or something similar func (e sortedStates) Len() int { return len(e) } func (e sortedStates) Swap(i int, j int) { e[i], e[j] = e[j], e[i] } func (e sortedStates) Less(i int, j int) bool { diff --git a/alert/types.go b/alert/types.go index 3f84c2f45..f9a198c9d 100644 --- a/alert/types.go +++ b/alert/types.go @@ -17,6 +17,21 @@ type Event struct { previousState EventState } +func (e Event) MarshalBinary() (data []byte, err error) { + //TODO implement me + panic("implement me") +} + +func (e Event) UnmarshalBinary(data []byte) error { + //TODO implement me + panic("implement me") +} + +func (e Event) ObjectID() string { + //TODO implement me + panic("implement me") +} + func (e Event) AlertData() Data { return Data{ ID: e.State.ID, diff --git a/build.sh b/build.sh index bb5e01227..ca310b3b3 100755 --- a/build.sh +++ b/build.sh @@ -13,9 +13,10 @@ BUILD_NUM=${BUILD_NUM-$RANDOM} HOME_DIR=/root imagename=kapacitor-builder-img-$BUILD_NUM +PROTO_VERSION=3.18.3 # Build new docker image -docker build -f Dockerfile_build_ubuntu64 -t $imagename $DIR +docker build -f Dockerfile_build_ubuntu64 --build-arg PROTO_VERSION=$PROTO_VERSION -t $imagename $DIR echo "Running build.py" # Run docker diff --git a/go.mod b/go.mod index ebd80e60e..fc165ba32 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/urfave/cli/v2 v2.3.0 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c github.com/zeebo/mwc v0.0.4 - go.etcd.io/bbolt v1.3.5 + go.etcd.io/bbolt v1.3.6 go.uber.org/zap v1.16.0 golang.org/x/crypto v0.0.0-20220214200702-86341886e292 golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f @@ -262,3 +262,5 @@ replace k8s.io/client-go => k8s.io/client-go v0.20.5 replace k8s.io/api => k8s.io/api v0.20.5 replace github.com/dgrijalva/jwt-go => github.com/Waterdrips/jwt-go v3.2.1-0.20200915121943-f6506928b72e+incompatible + +replace go.etcd.io/bbolt => github.com/0x0177b11f/bbolt v1.3.7-0.20220308103559-afc583528bb7 diff --git a/go.sum b/go.sum index 353c2ae9e..7a71bb3fa 100644 --- a/go.sum +++ b/go.sum @@ -50,6 +50,8 @@ collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +github.com/0x0177b11f/bbolt v1.3.7-0.20220308103559-afc583528bb7 h1:VbZYwrPh0R9OxStYGcn7WeB6vfcXCMpwEvPAAXGYJtw= +github.com/0x0177b11f/bbolt v1.3.7-0.20220308103559-afc583528bb7/go.mod h1:sh/Yp01MYDakY7RVfzKZn+T1WOMTTFJrWjl7+M73RXA= github.com/AlecAivazis/survey/v2 v2.2.9 h1:LWvJtUswz/W9/zVVXELrmlvdwWcKE60ZAw0FWV9vssk= github.com/AlecAivazis/survey/v2 v2.2.9/go.mod h1:9DYvHgXtiXm6nCn+jXnOXLKbH+Yo9u8fAS/SduGdoPk= github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= @@ -1338,10 +1340,6 @@ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/mwc v0.0.4 h1:9dNXNLtUB4lUXoXgyhy3YrKoV0OD7oRiu907YMS0nl0= github.com/zeebo/mwc v0.0.4/go.mod h1:qNHfgp/ZCpQNcJHwKcO5EP3VgaBrW6DPohsK4QfyxxE= github.com/zeebo/xxh3 v0.13.0/go.mod h1:AQY73TOrhF3jNsdiM9zZOb8MThrYbZONHj7ryDBaLpg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -1641,6 +1639,7 @@ golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200828194041-157a740278f4/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-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/server/migrate_task_store.go b/server/migrate_task_store.go new file mode 100644 index 000000000..97955bd4d --- /dev/null +++ b/server/migrate_task_store.go @@ -0,0 +1,195 @@ +package server + +import ( + "encoding/json" + + "github.com/influxdata/kapacitor/services/storage" + "github.com/mailru/easyjson/jwriter" + + "github.com/mailru/easyjson/jlexer" + "github.com/pkg/errors" + + "go.etcd.io/bbolt" +) + +const ( + topicStatesNameSpaceV2 = "topic_states_store" + alertNameSpace = "alert_store" + versionStoreNameSpace = "version" + topicStoreVersionKey = "topic_store_version" +) + +func (s *Server) MigrateTopicStore() error { + version, err := s.AlertService.StorageService.Versions().Get(topicStoreVersionKey) + if err != nil { + return err + } + if version == "2" { + return nil + } + return s.AlertService.StorageService.Store(topicStatesNameSpaceV2).Update(func(tx storage.Tx) error { + v1Bucket := []byte(alertNameSpace) + b := tx.Bucket(nil).Bucket(v1Bucket) // the read bucket + if b == nil { + return errors.New("come up with error") + } + + // read the data from the v1 bucket and write the data to the v2 bucket + lex := &jlexer.Lexer{} + cursor := b.Cursor() + for k, v := cursor.First(); k != nil; k, v = cursor.Next() { + topicOutBucket := tx.Bucket(k) + lex.Data = v + processJSON(lex, func(eventID, eventVal []byte) error { + return topicOutBucket.Put(string(eventID), eventVal) + }) + if err := lex.Error(); err != nil { + return err + } + } + return nil + }) +} + +func MigrateTopicStoreV2V1(db *bbolt.DB) (err error) { + v2Bucket := []byte(topicStatesNameSpaceV2) + v1Bucket := []byte(alertNameSpace) + + return db.Update(func(tx *bbolt.Tx) error { + b := tx.Bucket(v2Bucket) + if b == nil { + return errors.New("come up with error") + } + + bOut, err := tx.CreateBucketIfNotExists(v1Bucket) + if bOut != nil { + return err + } + inCursor := b.Cursor() + for topic, v := inCursor.First(); topic != nil; topic, v = inCursor.Next() { + if v != nil { + return errors.New("not a bucket") + } + w := &jwriter.Writer{} + w.RawByte('{') + w.String("version") + w.RawByte(':') + w.Int64Str(1) + w.RawByte(',') + w.String("value") + w.RawByte(':') + w.RawByte('{') + w.String("topic") + w.RawByte(':') + w.String(string(topic)) + w.RawByte(',') + w.String("event-states") + w.RawByte(':') + w.RawByte('{') + + eventBucket := b.Bucket(topic) + if eventBucket == nil { + w.RawByte('}') + continue + } + eventCursor := eventBucket.Cursor() + if eventCursor == nil { + w.RawByte('}') + continue + } + i := 0 + for eventK, v := eventCursor.First(); eventK != nil; eventK, v = eventCursor.Next() { + if v == nil { + continue + } + if i != 0 { + w.RawByte(',') + } + w.String(string(eventK)) + w.RawByte(':') + w.Raw(v, nil) + i++ + } + w.RawByte('}') + w.RawByte('}') + w.RawByte('}') + + } + + return nil + }) +} + +//easyjson:json +type TopicStateV1 struct { + Version string `json:"version"` + Value struct { + Topic string `json:"topic"` + EventStates map[string]json.RawMessage `json:"event-states"` + } `json:"value"` +} + +func (t *TopicStateV1) ObjectID() string { + return t.Value.Topic +} + +func processJSON(in *jlexer.Lexer, out func(k []byte, v []byte) error) { + isTopLevel := in.IsStart() + if in.IsNull() { + if isTopLevel { + in.Consumed() + } + in.Skip() + return + } + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "value": + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "event-states": + if in.IsNull() { + in.Skip() + } else { + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if err := out([]byte(key), in.Raw()); err != nil { + in.AddError(err) + } + } + in.WantComma() + } + in.Delim('}') + + default: + in.SkipRecursive() + } + } + default: + in.SkipRecursive() + } + in.WantComma() + } + in.Delim('}') + if isTopLevel { + in.Consumed() + } +} diff --git a/server/migrate_task_store_test.go b/server/migrate_task_store_test.go new file mode 100644 index 000000000..bde1712ba --- /dev/null +++ b/server/migrate_task_store_test.go @@ -0,0 +1,66 @@ +package server_test + +import ( + "testing" + + "github.com/influxdata/kapacitor/server" + "github.com/influxdata/kapacitor/services/storage/storagetest" + + "go.etcd.io/bbolt" + bolt "go.etcd.io/bbolt" +) + +func mustDB(db *storagetest.BoltDB, err error) *bolt.DB { + if err != nil { + panic(err) + } + return db.DB +} +func Test_migrate_topicstore_v1_v2(t *testing.T) { + tests := []struct { + name string + db *bbolt.DB + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Create default config + c := NewConfig(t) + s := OpenServer(c) + cli := Client(s) + _ = cli + defer s.Close() + if err := server.MigrateTopicStoreV1V2(tt.db); (err != nil) != tt.wantErr { + t.Errorf("migrate_topicstore_v1_v2() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_migrate_topicstore_v2_v1(t *testing.T) { + tests := []struct { + name string + db *bolt.DB + wantErr bool + }{{ + name: "test1", + db: mustDB(storagetest.NewBolt()), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Create default config + c := NewConfig(t) + s := OpenServer(c) + cli := Client(s) + _ = cli + defer s.Close() + + if err := server.MigrateTopicStoreV2V1(tt.db); (err != nil) != tt.wantErr { + t.Errorf("migrate_topicstore_v2_v1() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/server/server.go b/server/server.go index d7923dc14..9a3df6ea6 100644 --- a/server/server.go +++ b/server/server.go @@ -1135,7 +1135,6 @@ func (s *Server) startServices() error { return fmt.Errorf("open service %T: %s", service, err) } s.Diag.Debug("opened service", keyvalue.KV("service", fmt.Sprintf("%T", service))) - // Apply config overrides after the config override service has been opened and before any dynamic services. if service == s.ConfigOverrideService && !s.config.SkipConfigOverrides && s.config.ConfigOverride.Enabled { // Apply initial config updates diff --git a/server/server_test.go b/server/server_test.go index 6b24981b8..53e4fd226 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -268,6 +268,7 @@ func TestServer_Pprof_Index(t *testing.T) { }) } } + func TestServer_Authenticate_Fail(t *testing.T) { conf := NewConfig(t) conf.HTTP.AuthEnabled = true @@ -480,6 +481,7 @@ func TestServer_CreateUser(t *testing.T) { t.Fatalf("unexpected permissions got %s exp %s", user.Permissions, permissions) } } + func TestServer_CreateTask(t *testing.T) { s, cli := OpenDefaultServer(t) defer s.Close() @@ -2857,7 +2859,6 @@ test value=1 0000000011 func TestServer_UpdateTaskID(t *testing.T) { s, cli := OpenDefaultServer(t) defer s.Close() - id := "testTaskID" ttype := client.StreamTask dbrps := []client.DBRP{ @@ -9990,70 +9991,70 @@ func TestServer_AlertHandlers_CRUD(t *testing.T) { }, } for _, tc := range testCases { - // Create default config - c := NewConfig(t) - s := OpenServer(c) - cli := Client(s) - defer s.Close() - - h, err := cli.CreateTopicHandler(cli.TopicHandlersLink(tc.topic), tc.create) - if err != nil { - t.Fatal(err) - } - - if !reflect.DeepEqual(h, tc.expCreate) { - t.Errorf("unexpected handler created:\ngot\n%#v\nexp\n%#v\n", h, tc.expCreate) - } - - h, err = cli.PatchTopicHandler(h.Link, tc.patch) - if err != nil { - t.Fatal(err) - } + t.Run(tc.topic, func(t *testing.T) { + // Create default config + c := NewConfig(t) + s := OpenServer(c) + cli := Client(s) + defer s.Close() + h, err := cli.CreateTopicHandler(cli.TopicHandlersLink(tc.topic), tc.create) + if err != nil { + t.Fatal(err) + } - if !reflect.DeepEqual(h, tc.expPatch) { - t.Errorf("unexpected handler patched:\ngot\n%#v\nexp\n%#v\n", h, tc.expPatch) - } + if !reflect.DeepEqual(h, tc.expCreate) { + t.Errorf("unexpected handler created:\ngot\n%#v\nexp\n%#v\n", h, tc.expCreate) + } - h, err = cli.ReplaceTopicHandler(h.Link, tc.put) - if err != nil { - t.Fatal(err) - } + h, err = cli.PatchTopicHandler(h.Link, tc.patch) + if err != nil { + t.Fatal(err) + } - if !reflect.DeepEqual(h, tc.expPut) { - t.Errorf("unexpected handler put:\ngot\n%#v\nexp\n%#v\n", h, tc.expPut) - } + if !reflect.DeepEqual(h, tc.expPatch) { + t.Errorf("unexpected handler patched:\ngot\n%#v\nexp\n%#v\n", h, tc.expPatch) + } - // Restart server - s.Restart() + h, err = cli.ReplaceTopicHandler(h.Link, tc.put) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, tc.expPut) { + t.Errorf("unexpected handler put:\ngot\n%#v\nexp\n%#v\n", h, tc.expPut) + } - rh, err := cli.TopicHandler(h.Link) - if err != nil { - t.Fatalf("could not find handler after restart: %v", err) - } - if got, exp := rh, h; !reflect.DeepEqual(got, exp) { - t.Errorf("unexpected handler after restart:\ngot\n%#v\nexp\n%#v\n", got, exp) - } + // Restart server + s.Restart() - err = cli.DeleteTopicHandler(h.Link) - if err != nil { - t.Fatal(err) - } + rh, err := cli.TopicHandler(h.Link) + if err != nil { + t.Fatalf("could not find handler after restart: %v", err) + } + if got, exp := rh, h; !reflect.DeepEqual(got, exp) { + t.Errorf("unexpected handler after restart:\ngot\n%#v\nexp\n%#v\n", got, exp) + } - _, err = cli.TopicHandler(h.Link) - if err == nil { - t.Errorf("expected handler to be deleted") - } + err = cli.DeleteTopicHandler(h.Link) + if err != nil { + t.Fatal(err) + } - handlers, err := cli.ListTopicHandlers(cli.TopicHandlersLink(tc.topic), nil) - if err != nil { - t.Fatal(err) - } - for _, h := range handlers.Handlers { - if h.ID == tc.expPut.ID { + _, err = cli.TopicHandler(h.Link) + if err == nil { t.Errorf("expected handler to be deleted") - break } - } + + handlers, err := cli.ListTopicHandlers(cli.TopicHandlersLink(tc.topic), nil) + if err != nil { + t.Fatal(err) + } + for _, h := range handlers.Handlers { + if h.ID == tc.expPut.ID { + t.Errorf("expected handler to be deleted") + break + } + } + }) } } @@ -12001,7 +12002,10 @@ stream v := url.Values{} v.Add("precision", "s") s.MustWrite("mydb", "myrp", point, v) + time.Sleep(15 * time.Second) + q, _ := s.AlertService.EventStates("tcp", -1) + _ = q s.Restart() // Check TCP handler got event @@ -12029,9 +12033,8 @@ stream exp := []alert.Data{alertData} got := ts.Data() if !reflect.DeepEqual(exp, got) { - t.Errorf("unexpected tcp request:\nexp\n%+v\ngot\n%+v\n", exp, got) + t.Fatalf("unexpected tcp request:\nexp\n%+v\ngot\n%+v\n", exp, got) } - // Check event on topic l := cli.TopicEventsLink(tcpTopic) expTopicEvents := client.TopicEvents{ @@ -12055,7 +12058,7 @@ stream t.Fatal(err) } if !reflect.DeepEqual(te, expTopicEvents) { - t.Errorf("unexpected topic events for publish topic:\ngot\n%+v\nexp\n%+v\n", te, expTopicEvents) + t.Fatalf("unexpected topic events for publish topic:\ngot\n%+v\nexp\n%+v\n", te, expTopicEvents) } } diff --git a/services/alert/api.go b/services/alert/api.go index b08f2469d..b1986d6db 100644 --- a/services/alert/api.go +++ b/services/alert/api.go @@ -298,6 +298,7 @@ func (s *apiServer) handleListEvents(topic string, w http.ResponseWriter, r *htt httpd.HttpError(w, fmt.Sprintf("failed to get topic events: %s", err.Error()), true, http.StatusInternalServerError) return } + res := client.TopicEvents{ Link: s.topicEventsLink(topic, client.Self), Topic: topic, diff --git a/services/alert/dao.go b/services/alert/dao.go index ef3995435..bc6278389 100644 --- a/services/alert/dao.go +++ b/services/alert/dao.go @@ -9,9 +9,10 @@ import ( "regexp" "time" + "github.com/mailru/easyjson/jlexer" + "github.com/influxdata/kapacitor/alert" "github.com/influxdata/kapacitor/services/storage" - "github.com/mailru/easyjson/jlexer" "github.com/pkg/errors" ) @@ -24,7 +25,7 @@ var ( type HandlerSpecDAO interface { // Retrieve a handler Get(topic, id string) (HandlerSpec, error) - GetTx(tx storage.ReadOnlyTx, topic, id string) (HandlerSpec, error) + GetTx(tx storage.ReadOperator, topic, id string) (HandlerSpec, error) // Create a handler. // ErrHandlerSpecExists is returned if a handler already exists with the same ID. @@ -46,7 +47,7 @@ type HandlerSpecDAO interface { // Offset and limit are pagination bounds. Offset is inclusive starting at index 0. // More results may exist while the number of returned items is equal to limit. List(topic, pattern string, offset, limit int) ([]HandlerSpec, error) - ListTx(tx storage.ReadOnlyTx, topic, pattern string, offset, limit int) ([]HandlerSpec, error) + ListTx(tx storage.ReadOperator, topic, pattern string, offset, limit int) ([]HandlerSpec, error) Rebuild() error } @@ -152,7 +153,8 @@ func (kv *handlerSpecKV) error(err error) error { func (kv *handlerSpecKV) Get(topic, id string) (HandlerSpec, error) { return kv.getHelper(kv.store.Get(fullID(topic, id))) } -func (kv *handlerSpecKV) GetTx(tx storage.ReadOnlyTx, topic, id string) (HandlerSpec, error) { + +func (kv *handlerSpecKV) GetTx(tx storage.ReadOperator, topic, id string) (HandlerSpec, error) { return kv.getHelper(kv.store.GetTx(tx, fullID(topic, id))) } @@ -194,7 +196,7 @@ func (kv *handlerSpecKV) List(topic, pattern string, offset, limit int) ([]Handl } return kv.listHelper(kv.store.List(storage.DefaultIDIndex, fullID(topic, pattern), offset, limit)) } -func (kv *handlerSpecKV) ListTx(tx storage.ReadOnlyTx, topic, pattern string, offset, limit int) ([]HandlerSpec, error) { +func (kv *handlerSpecKV) ListTx(tx storage.ReadOperator, topic, pattern string, offset, limit int) ([]HandlerSpec, error) { if pattern == "" { pattern = "*" } @@ -223,26 +225,26 @@ var ( ErrNoTopicStateExists = errors.New("no topic state exists") ) -// Data access object for TopicState data. -type TopicStateDAO interface { - // Retrieve a handler - Get(id string) (TopicState, error) - - // Put a topic state, replaces any existing state. - Put(h TopicState) error - - // Delete a handler. - // It is not an error to delete an non-existent handler. - Delete(id string) error - - // List handlers matching a pattern. - // The pattern is shell/glob matching see https://golang.org/pkg/path/#Match - // Offset and limit are pagination bounds. Offset is inclusive starting at index 0. - // More results may exist while the number of returned items is equal to limit. - List(pattern string, offset, limit int) ([]TopicState, error) - - Rebuild() error -} +//// Data access object for TopicState data. +//type TopicStateDAO interface { +// // Retrieve a handler +// Get(id string) (TopicState, error) +// +// // Put an alert.Event, replaces any existing alert.Event. +// Put(h alert.Event) error +// +// // Delete a handler. +// // It is not an error to delete an non-existent handler. +// Delete(id string) error +// +// // List handlers matching a pattern. +// // The pattern is shell/glob matching see https://golang.org/pkg/path/#Match +// // Offset and limit are pagination bounds. Offset is inclusive starting at index 0. +// // More results may exist while the number of returned items is equal to limit. +// List(pattern string, offset, limit int) ([]TopicState, error) +// +// Rebuild() error +//} const topicStateVersion = 1 @@ -254,13 +256,42 @@ type TopicState struct { //easyjson:json type EventState struct { - Message string `json:"message"` - Details string `json:"details"` - Time time.Time `json:"time"` - Duration time.Duration `json:"duration"` + Message string `json:"message,omitempty"` + Details string `json:"details,omitempty"` + Time time.Time `json:"time,omitempty"` + Duration time.Duration `json:"duration,omitempty"` Level alert.Level `json:"level"` } +func (e *EventState) Reset() { + e.Message = "" + e.Details = "" + e.Time = time.Time{} + e.Duration = 0 + e.Level = 0 +} + +func (e *EventState) AlertEventState(id string) *alert.EventState { + return &alert.EventState{ + ID: id, + Message: e.Message, + Details: e.Details, + Time: e.Time, + Duration: e.Duration, + Level: e.Level, + } +} + +//type DurableEventState struct { +// *EventState +// Topic string +// ID string +//} +// +//func (t DurableEventState) ObjectID() string { +// return t.Topic +//} + func (t TopicState) ObjectID() string { return t.Topic } @@ -276,71 +307,75 @@ func (t *TopicState) UnmarshalBinary(data []byte) error { }) } -// Key/Value store based implementation of the TopicStateDAO -type topicStateKV struct { - store *storage.IndexedStore -} - -func newTopicStateKV(store storage.Interface) (*topicStateKV, error) { - c := storage.DefaultIndexedStoreConfig("topics", func() storage.BinaryObject { - return new(TopicState) - }) - istore, err := storage.NewIndexedStore(store, c) - if err != nil { - return nil, err - } - return &topicStateKV{ - store: istore, - }, nil -} - -func (kv *topicStateKV) error(err error) error { - if err == storage.ErrNoObjectExists { - return ErrNoTopicStateExists - } - return err -} - -func (kv *topicStateKV) Get(id string) (TopicState, error) { - o, err := kv.store.Get(id) - if err != nil { - return TopicState{}, kv.error(err) - } - t, ok := o.(*TopicState) - if !ok { - return TopicState{}, storage.ImpossibleTypeErr(t, o) - } - return *t, nil -} - -func (kv *topicStateKV) Put(t TopicState) error { - return kv.store.Put(&t) -} - -func (kv *topicStateKV) Replace(t TopicState) error { - return kv.store.Replace(&t) -} - -func (kv *topicStateKV) Delete(id string) error { - return kv.store.Delete(id) -} - -func (kv *topicStateKV) List(pattern string, offset, limit int) ([]TopicState, error) { - objects, err := kv.store.List(storage.DefaultIDIndex, pattern, offset, limit) - if err != nil { - return nil, err - } - specs := make([]TopicState, len(objects)) - for i, o := range objects { - t, ok := o.(*TopicState) - if !ok { - return nil, storage.ImpossibleTypeErr(t, o) - } - specs[i] = *t - } - return specs, nil -} - -func (kv *topicStateKV) Rebuild() error { - return kv.store.Rebuild() -} +// +// // Key/Value store based implementation of the TopicStateDAO +// +// type topicStateKV struct { +// store *storage.IndexedStore +// } +//func newTopicStateKV(store storage.Interface) (storage.Interface, error) { +// //c := storage.DefaultIndexedStoreConfig("topics", func() storage.BinaryObject { +// // return new(TopicState) +// //}) +// //istore, err := storage.NewIndexedStore(store, c) +// //if err != nil { +// // return nil, err +// //} +// return store, nil +//} + +// return &topicStateKV{ +// store: istore, +// }, nil +//} +// +//func (kv *topicStateKV) error(err error) error { +// if err == storage.ErrNoObjectExists { +// return ErrNoTopicStateExists +// } +// return err +//} +// +//func (kv *topicStateKV) Get(id string) (TopicState, error) { +// o, err := kv.store.Get(id) +// if err != nil { +// return TopicState{}, kv.error(err) +// } +// t, ok := o.(*TopicState) +// if !ok { +// return TopicState{}, storage.ImpossibleTypeErr(t, o) +// } +// return *t, nil +//} +// +//func (kv *topicStateKV) Put(event alert.Event) error { +// return kv.store.Put(&event) +//} +// +//func (kv *topicStateKV) Replace(topic, id string, state EventState) error { +// return kv.store.Replace(&t) +//} +// +//func (kv *topicStateKV) Delete(id string) error { +// return kv.store.Delete(id) +//} +// +//func (kv *topicStateKV) List(pattern string, offset, limit int) ([]TopicState, error) { +// objects, err := kv.store.List(storage.DefaultIDIndex, pattern, offset, limit) +// if err != nil { +// return nil, err +// } +// specs := make([]TopicState, len(objects)) +// for i, o := range objects { +// t, ok := o.(*TopicState) +// if !ok { +// return nil, storage.ImpossibleTypeErr(t, o) +// } +// specs[i] = *t +// } +// return specs, nil +//} +// +//func (kv *topicStateKV) Rebuild() error { +// return kv.store.Rebuild() +//} diff --git a/services/alert/dao_easyjson.go b/services/alert/dao_easyjson.go index 9b13b26f3..d9379f52d 100644 --- a/services/alert/dao_easyjson.go +++ b/services/alert/dao_easyjson.go @@ -1,221 +1,23 @@ -// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT. +// TEMPORARY AUTOGENERATED FILE: easyjson stub code to make the package +// compilable during generation. package alert import ( - json "encoding/json" - easyjson "github.com/mailru/easyjson" - jlexer "github.com/mailru/easyjson/jlexer" - jwriter "github.com/mailru/easyjson/jwriter" - time "time" + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" ) -// suppress unused package warning -var ( - _ *json.RawMessage - _ *jlexer.Lexer - _ *jwriter.Writer - _ easyjson.Marshaler -) - -func easyjson7be57abeDecodeGithubComInfluxdataKapacitorServicesAlert(in *jlexer.Lexer, out *TopicState) { - isTopLevel := in.IsStart() - if in.IsNull() { - if isTopLevel { - in.Consumed() - } - in.Skip() - return - } - in.Delim('{') - for !in.IsDelim('}') { - key := in.UnsafeFieldName(false) - in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } - switch key { - case "topic": - out.Topic = string(in.String()) - case "event-states": - if in.IsNull() { - in.Skip() - } else { - in.Delim('{') - out.EventStates = make(map[string]EventState) - for !in.IsDelim('}') { - key := string(in.String()) - in.WantColon() - var v1 EventState - (v1).UnmarshalEasyJSON(in) - (out.EventStates)[key] = v1 - in.WantComma() - } - in.Delim('}') - } - default: - in.SkipRecursive() - } - in.WantComma() - } - in.Delim('}') - if isTopLevel { - in.Consumed() - } -} -func easyjson7be57abeEncodeGithubComInfluxdataKapacitorServicesAlert(out *jwriter.Writer, in TopicState) { - out.RawByte('{') - first := true - _ = first - { - const prefix string = ",\"topic\":" - out.RawString(prefix[1:]) - out.String(string(in.Topic)) - } - { - const prefix string = ",\"event-states\":" - out.RawString(prefix) - if in.EventStates == nil && (out.Flags&jwriter.NilMapAsEmpty) == 0 { - out.RawString(`null`) - } else { - out.RawByte('{') - v2First := true - for v2Name, v2Value := range in.EventStates { - if v2First { - v2First = false - } else { - out.RawByte(',') - } - out.String(string(v2Name)) - out.RawByte(':') - (v2Value).MarshalEasyJSON(out) - } - out.RawByte('}') - } - } - out.RawByte('}') -} - -// MarshalJSON supports json.Marshaler interface -func (v TopicState) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - easyjson7be57abeEncodeGithubComInfluxdataKapacitorServicesAlert(&w, v) - return w.Buffer.BuildBytes(), w.Error -} - -// MarshalEasyJSON supports easyjson.Marshaler interface -func (v TopicState) MarshalEasyJSON(w *jwriter.Writer) { - easyjson7be57abeEncodeGithubComInfluxdataKapacitorServicesAlert(w, v) -} - -// UnmarshalJSON supports json.Unmarshaler interface -func (v *TopicState) UnmarshalJSON(data []byte) error { - r := jlexer.Lexer{Data: data} - easyjson7be57abeDecodeGithubComInfluxdataKapacitorServicesAlert(&r, v) - return r.Error() -} - -// UnmarshalEasyJSON supports easyjson.Unmarshaler interface -func (v *TopicState) UnmarshalEasyJSON(l *jlexer.Lexer) { - easyjson7be57abeDecodeGithubComInfluxdataKapacitorServicesAlert(l, v) -} -func easyjson7be57abeDecodeGithubComInfluxdataKapacitorServicesAlert1(in *jlexer.Lexer, out *EventState) { - isTopLevel := in.IsStart() - if in.IsNull() { - if isTopLevel { - in.Consumed() - } - in.Skip() - return - } - in.Delim('{') - for !in.IsDelim('}') { - key := in.UnsafeFieldName(false) - in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } - switch key { - case "message": - out.Message = string(in.String()) - case "details": - out.Details = string(in.String()) - case "time": - if data := in.Raw(); in.Ok() { - in.AddError((out.Time).UnmarshalJSON(data)) - } - case "duration": - out.Duration = time.Duration(in.Int64()) - case "level": - if data := in.UnsafeBytes(); in.Ok() { - in.AddError((out.Level).UnmarshalText(data)) - } - default: - in.SkipRecursive() - } - in.WantComma() - } - in.Delim('}') - if isTopLevel { - in.Consumed() - } -} -func easyjson7be57abeEncodeGithubComInfluxdataKapacitorServicesAlert1(out *jwriter.Writer, in EventState) { - out.RawByte('{') - first := true - _ = first - { - const prefix string = ",\"message\":" - out.RawString(prefix[1:]) - out.String(string(in.Message)) - } - { - const prefix string = ",\"details\":" - out.RawString(prefix) - out.String(string(in.Details)) - } - { - const prefix string = ",\"time\":" - out.RawString(prefix) - out.Raw((in.Time).MarshalJSON()) - } - { - const prefix string = ",\"duration\":" - out.RawString(prefix) - out.Int64(int64(in.Duration)) - } - { - const prefix string = ",\"level\":" - out.RawString(prefix) - out.RawText((in.Level).MarshalText()) - } - out.RawByte('}') -} - -// MarshalJSON supports json.Marshaler interface -func (v EventState) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - easyjson7be57abeEncodeGithubComInfluxdataKapacitorServicesAlert1(&w, v) - return w.Buffer.BuildBytes(), w.Error -} +func (EventState) MarshalJSON() ([]byte, error) { return nil, nil } +func (*EventState) UnmarshalJSON([]byte) error { return nil } +func (EventState) MarshalEasyJSON(w *jwriter.Writer) {} +func (*EventState) UnmarshalEasyJSON(l *jlexer.Lexer) {} -// MarshalEasyJSON supports easyjson.Marshaler interface -func (v EventState) MarshalEasyJSON(w *jwriter.Writer) { - easyjson7be57abeEncodeGithubComInfluxdataKapacitorServicesAlert1(w, v) -} +type EasyJSON_exporter_EventState *EventState -// UnmarshalJSON supports json.Unmarshaler interface -func (v *EventState) UnmarshalJSON(data []byte) error { - r := jlexer.Lexer{Data: data} - easyjson7be57abeDecodeGithubComInfluxdataKapacitorServicesAlert1(&r, v) - return r.Error() -} +func (TopicState) MarshalJSON() ([]byte, error) { return nil, nil } +func (*TopicState) UnmarshalJSON([]byte) error { return nil } +func (TopicState) MarshalEasyJSON(w *jwriter.Writer) {} +func (*TopicState) UnmarshalEasyJSON(l *jlexer.Lexer) {} -// UnmarshalEasyJSON supports easyjson.Unmarshaler interface -func (v *EventState) UnmarshalEasyJSON(l *jlexer.Lexer) { - easyjson7be57abeDecodeGithubComInfluxdataKapacitorServicesAlert1(l, v) -} +type EasyJSON_exporter_TopicState *TopicState diff --git a/services/alert/easyjson-bootstrap2172438621.go b/services/alert/easyjson-bootstrap2172438621.go new file mode 100644 index 000000000..9dfdf8e36 --- /dev/null +++ b/services/alert/easyjson-bootstrap2172438621.go @@ -0,0 +1,26 @@ +// +build ignore + +// TEMPORARY AUTOGENERATED FILE: easyjson bootstapping code to launch +// the actual generator. + +package main + +import ( + "fmt" + "os" + + "github.com/mailru/easyjson/gen" + + pkg "github.com/influxdata/kapacitor/services/alert" +) + +func main() { + g := gen.NewGenerator("dao_easyjson.go") + g.SetPkg("alert", "github.com/influxdata/kapacitor/services/alert") + g.Add(pkg.EasyJSON_exporter_EventState(nil)) + g.Add(pkg.EasyJSON_exporter_TopicState(nil)) + if err := g.Run(os.Stdout); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/services/alert/service.go b/services/alert/service.go index 23305d8c5..3aca59f15 100644 --- a/services/alert/service.go +++ b/services/alert/service.go @@ -1,6 +1,7 @@ package alert import ( + "bytes" "encoding" "encoding/json" "fmt" @@ -36,6 +37,7 @@ import ( "github.com/influxdata/kapacitor/services/telegram" "github.com/influxdata/kapacitor/services/victorops" "github.com/influxdata/kapacitor/services/zenoss" + "github.com/mailru/easyjson/jlexer" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" ) @@ -56,7 +58,7 @@ type Service struct { mu sync.RWMutex disabled map[string]struct{} specsDAO HandlerSpecDAO - topicsDAO TopicStateDAO + topicsStore storage.Interface PersistTopics bool APIServer *apiServer @@ -180,12 +182,13 @@ const ( topicStatesAPIName = "topic-states" // The storage namespace for all task data. alertNamespace = "alert_store" + // The storage namespace for topic states + topicStatesNameSpace = "topic_states_store" ) func (s *Service) Open() error { s.mu.Lock() defer s.mu.Unlock() - // Create DAO store := s.StorageService.Store(alertNamespace) specsDAO, err := newHandlerSpecKV(store) @@ -194,12 +197,8 @@ func (s *Service) Open() error { } s.specsDAO = specsDAO s.StorageService.Register(handlerSpecsAPIName, s.specsDAO) - topicsDAO, err := newTopicStateKV(store) - if err != nil { - return err - } - s.topicsDAO = topicsDAO - s.StorageService.Register(topicStatesAPIName, s.topicsDAO) + s.topicsStore = s.StorageService.Store(topicStatesNameSpace) + // NOTE: since the topics store doesn't use the indexing store, we don't need to register the api // Migrate v1.2 handlers if err := s.migrateHandlerSpecs(store); err != nil { @@ -354,6 +353,13 @@ func (s *Service) migrateHandlerSpecs(store storage.Interface) error { return s.StorageService.Versions().Set(handlerSpecsStoreVersion, handlerSpecsStoreVersion1) } +func (s *Service) MigrateTopicStoreState() error { + s.mu.Lock() + + defer s.mu.Unlock() + return nil +} + func (s *Service) loadSavedHandlerSpecs() error { offset := 0 limit := 100 @@ -377,15 +383,16 @@ func (s *Service) loadSavedHandlerSpecs() error { return nil } -func (s *Service) convertEventStatesToAlert(states map[string]EventState) map[string]alert.EventState { - newStates := make(map[string]alert.EventState, len(states)) - for id, state := range states { - newStates[id] = s.convertEventStateToAlert(id, state) - } - return newStates -} -func (s *Service) convertEventStateToAlert(id string, state EventState) alert.EventState { - return alert.EventState{ +//func (s *Service) convertEventStatesToAlert(states map[string]EventState) map[string]alert.EventState { +// newStates := make(map[string]alert.EventState, len(states)) +// for id, state := range states { +// newStates[id] = s.convertEventStateToAlert(id, state) +// } +// return newStates +//} + +func convertEventStateToAlert(id string, state *EventState) *alert.EventState { + return &alert.EventState{ ID: id, Message: state.Message, Details: state.Details, @@ -395,16 +402,8 @@ func (s *Service) convertEventStateToAlert(id string, state EventState) alert.Ev } } -func (s *Service) convertEventStatesFromAlert(states map[string]alert.EventState) map[string]EventState { - newStates := make(map[string]EventState, len(states)) - for id, state := range states { - newStates[id] = s.convertEventStateFromAlert(state) - } - return newStates -} - -func (s *Service) convertEventStateFromAlert(state alert.EventState) EventState { - return EventState{ +func convertEventStateFromAlert(state alert.EventState) *EventState { + return &EventState{ Message: state.Message, Details: state.Details, Time: state.Time, @@ -414,24 +413,40 @@ func (s *Service) convertEventStateFromAlert(state alert.EventState) EventState } func (s *Service) loadSavedTopicStates() error { - offset := 0 - limit := 100 - for { - topicStates, err := s.topicsDAO.List("", offset, limit) + return s.topicsStore.View(func(tx storage.ReadOnlyTx) error { + kv, err := tx.List("") if err != nil { return err } - for _, ts := range topicStates { - s.topics.RestoreTopic(ts.Topic, s.convertEventStatesToAlert(ts.EventStates)) - } + buf := bytes.Buffer{} + for _, b := range kv { - offset += limit - if len(topicStates) != limit { - break + if b == nil { + continue + } + _, _ = buf.WriteString(b.Key) // writestring error is always nil + q, err := tx.Bucket(buf.Bytes()).List("") + buf.Reset() + if err != nil { + return err + } + eventstates := make(map[string]*alert.EventState, len(q)) + lex := jlexer.Lexer{} + es := &EventState{} //create a buffer to hold the unmarshalled eventstate + for _, b := range q { + lex.Data = b.Value + es.UnmarshalEasyJSON(&lex) + if err := lex.Error(); err != nil { + return err + } + eventstates[b.Key] = convertEventStateToAlert(b.Key, es) + es.Reset() + } + s.topics.RestoreTopicNoCopy(b.Key, eventstates) } - } - return nil + return nil + }) } func validatePattern(pattern string) error { @@ -462,25 +477,29 @@ func (s *Service) Collect(event alert.Event) error { if err != nil { return err } - return s.persistTopicState(event.Topic) + return s.persistEventState(event) } -func (s *Service) persistTopicState(topic string) error { +func (s *Service) persistEventState(event alert.Event) error { if !s.PersistTopics { return nil } - t, ok := s.topics.Topic(topic) - if !ok { + if _, ok := s.topics.Topic(event.Topic); !ok { // Topic was deleted since event was collected, nothing to do. return nil } - ts := TopicState{ - Topic: topic, - EventStates: s.convertEventStatesFromAlert(t.EventStates(alert.OK)), - } - return s.topicsDAO.Put(ts) + return s.topicsStore.Update(func(tx storage.Tx) error { + + //panic("unfinished") + tx = tx.Bucket([]byte(event.Topic)) + data, err := convertEventStateFromAlert(event.State).MarshalJSON() + if err != nil { + return err + } + return tx.Put(event.State.ID, data) + }) } func (s *Service) restoreClosedTopic(topic string) error { @@ -501,13 +520,29 @@ func (s *Service) restoreClosedTopic(topic string) error { // restoreTopic restores a topic's state from the storage and registers any handlers. // Caller must have lock to call. func (s *Service) restoreTopic(topic string) error { - // Restore events state from storage - ts, err := s.topicsDAO.Get(topic) - if err != nil && err != ErrNoTopicStateExists { + err := s.topicsStore.View(func(tx storage.ReadOnlyTx) error { + q, err := tx.Bucket([]byte(topic)).List("") + if err != nil { + return err + } + eventStates := make(map[string]*alert.EventState, len(q)) + lex := jlexer.Lexer{} + es := &EventState{} //create a buffer to hold the unmarshalled eventstate + for _, b := range q { + lex.Data = b.Value + es.UnmarshalEasyJSON(&lex) + if err := lex.Error(); err != nil { + return err + } + eventStates[b.Key] = es.AlertEventState(b.Key) + es.Reset() + } + s.topics.RestoreTopicNoCopy(topic, eventStates) + return nil + }) + if err != nil { return err - } else if err != ErrNoTopicStateExists { - s.topics.RestoreTopic(topic, s.convertEventStatesToAlert(ts.EventStates)) - } // else nothing to restore + } // Re-Register all handlers for _, h := range s.handlers[topic] { @@ -531,7 +566,7 @@ func (s *Service) CloseTopic(topic string) error { s.closedTopics[topic] = true // Save the final topic state - return s.persistTopicState(topic) + return nil } func (s *Service) DeleteTopic(topic string) error { @@ -539,12 +574,17 @@ func (s *Service) DeleteTopic(topic string) error { defer s.mu.Unlock() delete(s.closedTopics, topic) s.topics.DeleteTopic(topic) - return s.topicsDAO.Delete(topic) + return s.topicsStore.Update(func(tx storage.Tx) error { + return tx.Delete(topic) + }) } func (s *Service) UpdateEvent(topic string, event alert.EventState) error { s.topics.UpdateEvent(topic, event) - return s.persistTopicState(topic) + return s.persistEventState(alert.Event{ + Topic: topic, + State: event, + }) } func (s *Service) RegisterAnonHandler(topic string, h alert.Handler) { @@ -680,6 +720,7 @@ func (s *Service) TopicStates(pattern string, minLevel alert.Level) (map[string] // EventState returns the current state of the event. func (s *Service) EventState(topic, event string) (alert.EventState, bool, error) { t, ok := s.topics.Topic(topic) + if !ok { return alert.EventState{}, false, nil } diff --git a/services/scraper/service.go b/services/scraper/service.go index 0b0597cee..048edaabe 100644 --- a/services/scraper/service.go +++ b/services/scraper/service.go @@ -68,6 +68,8 @@ func (a *appendable) Appender(ctx context.Context) storage.Appender { return a.svc } +var scrapemanagerLock = sync.Mutex{} // promethius calling scrape.NewManager is not concurrency safe. + // NewService creates a new scraper service func NewService(c []Config, d Diagnostic) *Service { s := &Service{ @@ -77,8 +79,9 @@ func NewService(c []Config, d Diagnostic) *Service { var ctxScrape context.Context ctxScrape, s.cancelScrape = context.WithCancel(context.Background()) s.discoveryManager = discovery.NewManager(ctxScrape, d, discovery.Name("discoveryScrapeManager")) + scrapemanagerLock.Lock() s.scrapeManager = scrape.NewManager(d, &appendable{&ServiceAppenderAdapter{s}}) - + scrapemanagerLock.Unlock() return s } diff --git a/services/storage/api.go b/services/storage/api.go index 8c39a1e42..c056f8436 100644 --- a/services/storage/api.go +++ b/services/storage/api.go @@ -24,7 +24,7 @@ const ( ) type APIServer struct { - Registrar StoreActionerRegistrar + Registrar *StoreActionerRegistrar DB *bolt.DB routes []httpd.Route diag Diagnostic diff --git a/services/storage/bolt.go b/services/storage/bolt.go index 92c16618d..09e965731 100644 --- a/services/storage/bolt.go +++ b/services/storage/bolt.go @@ -9,13 +9,35 @@ import ( // Bolt implementation of Store type Bolt struct { db *bolt.DB - bucket []byte + bucket [][]byte } -func NewBolt(db *bolt.DB, bucket string) *Bolt { +func NewBolt(db *bolt.DB, bucket ...[]byte) *Bolt { return &Bolt{ db: db, - bucket: []byte(bucket), + bucket: bucket, + } +} + +// Bucket tells the Bolt to do following actions in a bucket. A nil bucket will return a *Bolt that is targeted to the root bucket. +func (b *Bolt) Bucket(bucket []byte) *Bolt { + if bucket == nil { + return &Bolt{ + db: b.db, + bucket: nil, + } + } + return &Bolt{ + db: b.db, + bucket: append(b.bucket, bucket), + } +} + +// Bucket tells the Bolt to do following actions in a bucket. A nil bucket will return a *Bolt that is targeted to the root bucket. +func (b *Bolt) Store(buckets ...[]byte) Interface { + return &Bolt{ + db: b.db, + bucket: buckets, } } @@ -28,15 +50,17 @@ func (b *Bolt) Update(f func(tx Tx) error) error { } func (b *Bolt) put(tx *bolt.Tx, key string, value []byte) error { - bucket, err := tx.CreateBucketIfNotExists(b.bucket) + bucket, err := tx.CreateBucketIfNotExists(b.bucket[0]) if err != nil { return err } - err = bucket.Put([]byte(key), value) - if err != nil { - return err + for _, buckName := range b.bucket[1:] { + bucket, err = bucket.CreateBucketIfNotExists(buckName) + if err != nil { + return err + } } - return nil + return bucket.Put([]byte(key), value) } func (b *Bolt) Put(key string, value []byte) error { @@ -46,11 +70,10 @@ func (b *Bolt) Put(key string, value []byte) error { } func (b *Bolt) get(tx *bolt.Tx, key string) (*KeyValue, error) { - bucket := tx.Bucket(b.bucket) + bucket := b.bucketHelper(tx) if bucket == nil { return nil, ErrNoKeyExists } - val := bucket.Get([]byte(key)) if val == nil { return nil, ErrNoKeyExists @@ -71,12 +94,28 @@ func (b *Bolt) Get(key string) (kv *KeyValue, err error) { return } +// Delete removes a key from a bolt. If the key is a bucket, it removes that. func (b *Bolt) delete(tx *bolt.Tx, key string) error { - bucket := tx.Bucket(b.bucket) + bucket := b.bucketHelper(tx) if bucket == nil { return nil } - return bucket.Delete([]byte(key)) + cursor := bucket.Cursor() + if cursor == nil { + return nil + } + // handling for buckets + bkey := []byte(key) + k, v := cursor.Seek(bkey) + if key != string(k) { + return nil + } + if v == nil { + return bucket.DeleteBucket(bkey) + } + // handling for regular keys + return bucket.Delete(bkey) + } func (b *Bolt) Delete(key string) error { @@ -86,7 +125,7 @@ func (b *Bolt) Delete(key string) error { } func (b *Bolt) exists(tx *bolt.Tx, key string) (bool, error) { - bucket := tx.Bucket(b.bucket) + bucket := b.bucketHelper(tx) if bucket == nil { return false, nil } @@ -103,22 +142,53 @@ func (b *Bolt) Exists(key string) (exists bool, err error) { return } -func (b *Bolt) list(tx *bolt.Tx, prefixStr string) (kvs []*KeyValue, err error) { - bucket := tx.Bucket(b.bucket) +func (b *Bolt) bucketHelper(tx *bolt.Tx) *bolt.Bucket { + if len(b.bucket) == 0 { + return tx.Cursor().Bucket() //grab root bucket + } // get the right bucket + bucket := tx.Bucket(b.bucket[0]) if bucket == nil { - return + return nil + } + for _, buckName := range b.bucket[1:] { + bucket = bucket.Bucket(buckName) + if bucket == nil { + return nil + } } + return bucket +} - cursor := bucket.Cursor() - prefix := []byte(prefixStr) +// cursor returns a cursor at the appropriate bucket or nil if that bucket doesn't exist +func (b *Bolt) cursor(tx *bolt.Tx) *bolt.Cursor { + if len(b.bucket) == 0 { + return tx.Cursor() //grab root bucket + } // get the right bucket + bucket := tx.Bucket(b.bucket[0]) + if bucket == nil { + return nil + } + for _, buckName := range b.bucket[1:] { + bucket = bucket.Bucket(buckName) + if bucket == nil { + return nil + } + } + return bucket.Cursor() +} - for key, v := cursor.Seek(prefix); bytes.HasPrefix(key, prefix); key, v = cursor.Next() { - value := make([]byte, len(v)) - copy(value, v) +func (b *Bolt) list(tx *bolt.Tx, prefixStr string) (kvs []*KeyValue, err error) { + cursor := b.cursor(tx) + if cursor == nil { + return nil, nil // no objects returned + } + prefix := []byte(prefixStr) + for key, v := cursor.Seek(prefix); key != nil && bytes.HasPrefix(key, prefix); key, v = cursor.Next() { + // we want to be able to grab buckets AND keys here kvs = append(kvs, &KeyValue{ Key: string(key), - Value: value, + Value: append([]byte(nil), v...), }) } return @@ -137,7 +207,11 @@ func (b *Bolt) BeginTx() (Tx, error) { } func (b *Bolt) BeginReadOnlyTx() (ReadOnlyTx, error) { - return b.newTx(false) + tx, err := b.newTx(false) + if err != nil { + return nil, err + } + return &boltTXReadOnly{*tx}, nil } func (b *Bolt) newTx(write bool) (*boltTx, error) { @@ -151,12 +225,31 @@ func (b *Bolt) newTx(write bool) (*boltTx, error) { }, nil } +type boltTXReadOnly struct { + boltTx +} + +func (t *boltTXReadOnly) Bucket(name []byte) ReadOnlyTx { + return &boltTXReadOnly{ + boltTx{ + b: t.b.Bucket(name), + tx: t.tx, + }} +} + // BoltTx wraps an underlying bolt.Tx type to implement the Tx interface. type boltTx struct { b *Bolt tx *bolt.Tx } +func (t *boltTx) Bucket(name []byte) Tx { + return &boltTx{ + b: t.b.Bucket(name), + tx: t.tx, + } +} + func (t *boltTx) Get(key string) (*KeyValue, error) { return t.b.get(t.tx, key) } diff --git a/services/storage/indexed.go b/services/storage/indexed.go index f68052d6e..324d1bc21 100644 --- a/services/storage/indexed.go +++ b/services/storage/indexed.go @@ -130,6 +130,10 @@ func NewIndexedStore(store Interface, c IndexedStoreConfig) (*IndexedStore, erro }, nil } +func (s *IndexedStore) Store() Interface { + return s.store +} + // Create a key for the object data func (s *IndexedStore) dataKey(id string) string { return s.dataPrefix + id @@ -155,7 +159,7 @@ func (s *IndexedStore) Get(id string) (o BinaryObject, err error) { return } -func (s *IndexedStore) GetTx(tx ReadOnlyTx, id string) (BinaryObject, error) { +func (s *IndexedStore) GetTx(tx ReadOperator, id string) (BinaryObject, error) { key := s.dataKey(id) if exists, err := tx.Exists(key); err != nil { return nil, err @@ -306,7 +310,7 @@ func (s *IndexedStore) List(index, pattern string, offset, limit int) (objects [ }) return } -func (s *IndexedStore) ListTx(tx ReadOnlyTx, index, pattern string, offset, limit int) ([]BinaryObject, error) { +func (s *IndexedStore) ListTx(tx ReadOperator, index, pattern string, offset, limit int) ([]BinaryObject, error) { return s.list(tx, index, pattern, offset, limit, false) } @@ -323,7 +327,7 @@ func (s *IndexedStore) ReverseListTx(tx ReadOnlyTx, index, pattern string, offse return s.list(tx, index, pattern, offset, limit, true) } -func (s *IndexedStore) list(tx ReadOnlyTx, index, pattern string, offset, limit int, reverse bool) ([]BinaryObject, error) { +func (s *IndexedStore) list(tx ReadOperator, index, pattern string, offset, limit int, reverse bool) ([]BinaryObject, error) { // List all object ids sorted by index ids, err := tx.List(s.indexKey(index, "") + "/") if err != nil { diff --git a/services/storage/indexed_test.go b/services/storage/indexed_test.go index b5cc5ef2b..21eb166a8 100644 --- a/services/storage/indexed_test.go +++ b/services/storage/indexed_test.go @@ -6,6 +6,8 @@ import ( "testing" "time" + "github.com/influxdata/kapacitor/services/storage/storagetest" + "github.com/davecgh/go-spew/spew" "github.com/influxdata/kapacitor/services/storage" ) @@ -29,192 +31,190 @@ func (o *object) UnmarshalBinary(data []byte) error { } func TestIndexedStore_CRUD(t *testing.T) { - for name, sc := range stores { - t.Run(name, func(t *testing.T) { - db, err := sc() - if err != nil { - t.Fatal(err) - } - defer db.Close() - - s := db.Store("crud") - c := storage.DefaultIndexedStoreConfig("crud", func() storage.BinaryObject { - return new(object) - }) - c.Indexes = append(c.Indexes, storage.Index{ - Name: "date", - ValueFunc: func(o storage.BinaryObject) (string, error) { - obj, ok := o.(*object) - if !ok { - return "", storage.ImpossibleTypeErr(obj, o) - } - return obj.Date.UTC().Format(time.RFC3339), nil - }, - }) - is, err := storage.NewIndexedStore(s, c) - if err != nil { - t.Fatal(err) - } - - // Create new object - o1 := &object{ - ID: "1", - Value: "obj1", - Date: time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC), - } - if err := is.Create(o1); err != nil { - t.Fatal(err) - } - if err := is.Create(o1); err != storage.ErrObjectExists { - t.Fatal("expected ErrObjectExists creating object1 got", err) - } - // Check o1 - got1, err := is.Get("1") - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(got1, o1) { - t.Errorf("unexpected object 1 retrieved:\ngot\n%s\nexp\n%s\n", spew.Sdump(got1), spew.Sdump(o1)) - } - // Check ID list - expIDList := []storage.BinaryObject{o1} - gotIDList, err := is.List("id", "", 0, 100) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(gotIDList, expIDList) { - t.Errorf("unexpected object list by ID:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotIDList), spew.Sdump(expIDList)) - } - // Check Date list - expDateList := []storage.BinaryObject{o1} - gotDateList, err := is.List("date", "", 0, 100) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(gotDateList, expDateList) { - t.Errorf("unexpected object list by Date:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotDateList), spew.Sdump(expDateList)) - } - - // Create second object, using put - o2 := &object{ - ID: "2", - Value: "obj2", - Date: time.Date(2016, 1, 1, 0, 0, 0, 0, time.UTC), - } - if err := is.Put(o2); err != nil { - t.Fatal(err) - } - if err := is.Create(o2); err != storage.ErrObjectExists { - t.Fatal("expected ErrObjectExists creating object2 got", err) - } - // Check o2 - got2, err := is.Get("2") - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(got2, o2) { - t.Errorf("unexpected object 2 retrieved:\ngot\n%s\nexp\n%s\n", spew.Sdump(got2), spew.Sdump(o2)) - } - // Check ID list - expIDList = []storage.BinaryObject{o1, o2} - gotIDList, err = is.List("id", "", 0, 100) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(gotIDList, expIDList) { - t.Errorf("unexpected object list by ID:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotIDList), spew.Sdump(expIDList)) - } - // Check Date list - expDateList = []storage.BinaryObject{o2, o1} - gotDateList, err = is.List("date", "", 0, 100) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(gotDateList, expDateList) { - t.Errorf("unexpected object list by Date:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotDateList), spew.Sdump(expDateList)) - } - - // Modify objects - o1.Value = "modified obj1" - is.Replace(o1) - o2.Date = time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC) - is.Put(o2) - - // Check o1 - got1, err = is.Get("1") - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(got1, o1) { - t.Errorf("unexpected object 1 retrieved after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(got1), spew.Sdump(o1)) - } - - // Check o2 - got2, err = is.Get("2") - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(got2, o2) { - t.Errorf("unexpected object 2 retrieved after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(got2), spew.Sdump(o2)) - } - - // Check ID list - expIDList = []storage.BinaryObject{o1, o2} - gotIDList, err = is.List("id", "", 0, 100) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(gotIDList, expIDList) { - t.Errorf("unexpected object list by ID after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotIDList), spew.Sdump(expIDList)) - } - // Check Date list - expDateList = []storage.BinaryObject{o1, o2} - gotDateList, err = is.List("date", "", 0, 100) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(gotDateList, expDateList) { - t.Errorf("unexpected object list by Date after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotDateList), spew.Sdump(expDateList)) - } - - // Delete object 2 - if err := is.Delete("2"); err != nil { - t.Fatal(err) - } - - // Check o2 - if _, err := is.Get("2"); err != storage.ErrNoObjectExists { - t.Error("expected ErrNoObjectExists for delete object 2, got:", err) - } - - // Check ID list - expIDList = []storage.BinaryObject{o1} - gotIDList, err = is.List("id", "", 0, 100) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(gotIDList, expIDList) { - t.Errorf("unexpected object list by ID after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotIDList), spew.Sdump(expIDList)) - } - // Check Date list - expDateList = []storage.BinaryObject{o1} - gotDateList, err = is.List("date", "", 0, 100) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(gotDateList, expDateList) { - t.Errorf("unexpected object list by Date after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotDateList), spew.Sdump(expDateList)) - } - - // Try to replace non existent object - o3 := &object{ - ID: "3", - Value: "obj3", - Date: time.Date(2016, 1, 1, 0, 0, 0, 0, time.UTC), - } - if err := is.Replace(o3); err != storage.ErrNoObjectExists { - t.Error("expected error replacing non existent object, got:", err) - } + t.Run("bolt", func(t *testing.T) { + db, err := storagetest.NewBolt() + if err != nil { + t.Fatal(err) + } + defer db.Close() + + s := db.Store("crud") + c := storage.DefaultIndexedStoreConfig("crud", func() storage.BinaryObject { + return new(object) + }) + c.Indexes = append(c.Indexes, storage.Index{ + Name: "date", + ValueFunc: func(o storage.BinaryObject) (string, error) { + obj, ok := o.(*object) + if !ok { + return "", storage.ImpossibleTypeErr(obj, o) + } + return obj.Date.UTC().Format(time.RFC3339), nil + }, }) - } + is, err := storage.NewIndexedStore(s, c) + if err != nil { + t.Fatal(err) + } + + // Create new object + o1 := &object{ + ID: "1", + Value: "obj1", + Date: time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC), + } + if err := is.Create(o1); err != nil { + t.Fatal(err) + } + if err := is.Create(o1); err != storage.ErrObjectExists { + t.Fatal("expected ErrObjectExists creating object1 got", err) + } + // Check o1 + got1, err := is.Get("1") + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(got1, o1) { + t.Errorf("unexpected object 1 retrieved:\ngot\n%s\nexp\n%s\n", spew.Sdump(got1), spew.Sdump(o1)) + } + // Check ID list + expIDList := []storage.BinaryObject{o1} + gotIDList, err := is.List("id", "", 0, 100) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(gotIDList, expIDList) { + t.Errorf("unexpected object list by ID:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotIDList), spew.Sdump(expIDList)) + } + // Check Date list + expDateList := []storage.BinaryObject{o1} + gotDateList, err := is.List("date", "", 0, 100) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(gotDateList, expDateList) { + t.Errorf("unexpected object list by Date:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotDateList), spew.Sdump(expDateList)) + } + + // Create second object, using put + o2 := &object{ + ID: "2", + Value: "obj2", + Date: time.Date(2016, 1, 1, 0, 0, 0, 0, time.UTC), + } + if err := is.Put(o2); err != nil { + t.Fatal(err) + } + if err := is.Create(o2); err != storage.ErrObjectExists { + t.Fatal("expected ErrObjectExists creating object2 got", err) + } + // Check o2 + got2, err := is.Get("2") + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(got2, o2) { + t.Errorf("unexpected object 2 retrieved:\ngot\n%s\nexp\n%s\n", spew.Sdump(got2), spew.Sdump(o2)) + } + // Check ID list + expIDList = []storage.BinaryObject{o1, o2} + gotIDList, err = is.List("id", "", 0, 100) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(gotIDList, expIDList) { + t.Errorf("unexpected object list by ID:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotIDList), spew.Sdump(expIDList)) + } + // Check Date list + expDateList = []storage.BinaryObject{o2, o1} + gotDateList, err = is.List("date", "", 0, 100) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(gotDateList, expDateList) { + t.Errorf("unexpected object list by Date:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotDateList), spew.Sdump(expDateList)) + } + + // Modify objects + o1.Value = "modified obj1" + is.Replace(o1) + o2.Date = time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC) + is.Put(o2) + + // Check o1 + got1, err = is.Get("1") + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(got1, o1) { + t.Errorf("unexpected object 1 retrieved after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(got1), spew.Sdump(o1)) + } + + // Check o2 + got2, err = is.Get("2") + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(got2, o2) { + t.Errorf("unexpected object 2 retrieved after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(got2), spew.Sdump(o2)) + } + + // Check ID list + expIDList = []storage.BinaryObject{o1, o2} + gotIDList, err = is.List("id", "", 0, 100) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(gotIDList, expIDList) { + t.Errorf("unexpected object list by ID after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotIDList), spew.Sdump(expIDList)) + } + // Check Date list + expDateList = []storage.BinaryObject{o1, o2} + gotDateList, err = is.List("date", "", 0, 100) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(gotDateList, expDateList) { + t.Errorf("unexpected object list by Date after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotDateList), spew.Sdump(expDateList)) + } + + // Delete object 2 + if err := is.Delete("2"); err != nil { + t.Fatal(err) + } + + // Check o2 + if _, err := is.Get("2"); err != storage.ErrNoObjectExists { + t.Error("expected ErrNoObjectExists for delete object 2, got:", err) + } + + // Check ID list + expIDList = []storage.BinaryObject{o1} + gotIDList, err = is.List("id", "", 0, 100) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(gotIDList, expIDList) { + t.Errorf("unexpected object list by ID after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotIDList), spew.Sdump(expIDList)) + } + // Check Date list + expDateList = []storage.BinaryObject{o1} + gotDateList, err = is.List("date", "", 0, 100) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(gotDateList, expDateList) { + t.Errorf("unexpected object list by Date after modification:\ngot\n%s\nexp\n%s\n", spew.Sdump(gotDateList), spew.Sdump(expDateList)) + } + + // Try to replace non-existent object + o3 := &object{ + ID: "3", + Value: "obj3", + Date: time.Date(2016, 1, 1, 0, 0, 0, 0, time.UTC), + } + if err := is.Replace(o3); err != storage.ErrNoObjectExists { + t.Error("expected error replacing non existent object, got:", err) + } + }) } diff --git a/services/storage/mem.go b/services/storage/mem.go deleted file mode 100644 index f6b751280..000000000 --- a/services/storage/mem.go +++ /dev/null @@ -1,171 +0,0 @@ -package storage - -import ( - "fmt" - "sort" - "strings" - "sync" -) - -// MemStore is an in memory only implementation of the storage.Interface. -// This is intend to be used for testing use cases only. -type MemStore struct { - mu sync.Mutex - Name string - store map[string][]byte -} - -func NewMemStore(name string) *MemStore { - return &MemStore{ - Name: name, - store: make(map[string][]byte), - } -} - -func (s *MemStore) View(f func(tx ReadOnlyTx) error) error { - return DoView(s, f) -} - -func (s *MemStore) Update(f func(tx Tx) error) error { - return DoUpdate(s, f) -} - -func (s *MemStore) Put(key string, value []byte) error { - s.mu.Lock() - s.store[key] = value - s.mu.Unlock() - return nil -} - -func (s *MemStore) Get(key string) (*KeyValue, error) { - s.mu.Lock() - value, ok := s.store[key] - s.mu.Unlock() - if !ok { - return nil, ErrNoKeyExists - } - return &KeyValue{ - Key: key, - Value: value, - }, nil -} - -func (s *MemStore) Delete(key string) error { - s.mu.Lock() - delete(s.store, key) - s.mu.Unlock() - return nil -} - -func (s *MemStore) Exists(key string) (bool, error) { - s.mu.Lock() - _, ok := s.store[key] - s.mu.Unlock() - return ok, nil -} - -type keySortedKVs []*KeyValue - -func (s keySortedKVs) Len() int { return len(s) } -func (s keySortedKVs) Less(i int, j int) bool { return s[i].Key < s[j].Key } -func (s keySortedKVs) Swap(i int, j int) { s[i], s[j] = s[j], s[i] } - -func (s *MemStore) List(prefix string) ([]*KeyValue, error) { - s.mu.Lock() - kvs := make([]*KeyValue, 0, len(s.store)) - for k, v := range s.store { - if strings.HasPrefix(k, prefix) { - kvs = append(kvs, &KeyValue{Key: k, Value: v}) - } - } - s.mu.Unlock() - sort.Sort(keySortedKVs(kvs)) - return kvs, nil -} - -func (s *MemStore) BeginTx() (Tx, error) { - return s.newTx() -} - -func (s *MemStore) BeginReadOnlyTx() (ReadOnlyTx, error) { - return s.newTx() -} - -func (s *MemStore) newTx() (*memTx, error) { - // A Tx carries the lock, and must be committed or rolledback before another operation can continue. - s.mu.Lock() - store := make(map[string][]byte, len(s.store)) - for k, v := range s.store { - store[k] = v - } - return &memTx{ - m: s, - store: store, - }, nil -} - -type memTxState int - -const ( - unCommitted memTxState = iota - committed - rolledback -) - -type memTx struct { - state memTxState - m *MemStore - store map[string][]byte -} - -func (t *memTx) Get(key string) (*KeyValue, error) { - value, ok := t.store[key] - if !ok { - return nil, ErrNoKeyExists - } - return &KeyValue{Key: key, Value: value}, nil -} - -func (t *memTx) Exists(key string) (bool, error) { - _, ok := t.store[key] - return ok, nil -} - -func (t *memTx) List(prefix string) ([]*KeyValue, error) { - kvs := make([]*KeyValue, 0, len(t.store)) - for k, v := range t.store { - if strings.HasPrefix(k, prefix) { - kvs = append(kvs, &KeyValue{Key: k, Value: v}) - } - } - sort.Sort(keySortedKVs(kvs)) - return kvs, nil -} - -func (t *memTx) Put(key string, value []byte) error { - t.store[key] = value - return nil -} - -func (t *memTx) Delete(key string) error { - delete(t.store, key) - return nil -} - -func (t *memTx) Commit() error { - if t.state == unCommitted { - t.m.store = t.store - t.state = committed - t.m.mu.Unlock() - return nil - } - return fmt.Errorf("cannot commit transaction, transaction in state %v", t.state) -} - -func (t *memTx) Rollback() error { - if t.state == unCommitted { - t.state = rolledback - t.m.mu.Unlock() - } - return nil -} diff --git a/services/storage/registrar.go b/services/storage/registrar.go index c3c99e71e..2e207a775 100644 --- a/services/storage/registrar.go +++ b/services/storage/registrar.go @@ -8,24 +8,18 @@ type StoreActioner interface { Rebuild() error } -type StoreActionerRegistrar interface { - List() []string - Register(name string, store StoreActioner) - Get(name string) (StoreActioner, bool) -} - -func NewStorageResitrar() StoreActionerRegistrar { - return &storeActionerRegistrar{ +func NewStorageResitrar() *StoreActionerRegistrar { + return &StoreActionerRegistrar{ stores: make(map[string]StoreActioner), } } -type storeActionerRegistrar struct { +type StoreActionerRegistrar struct { mu sync.RWMutex stores map[string]StoreActioner } -func (sr *storeActionerRegistrar) List() []string { +func (sr *StoreActionerRegistrar) List() []string { sr.mu.RLock() defer sr.mu.RUnlock() list := make([]string, 0, len(sr.stores)) @@ -35,13 +29,13 @@ func (sr *storeActionerRegistrar) List() []string { return list } -func (sr *storeActionerRegistrar) Register(name string, store StoreActioner) { +func (sr *StoreActionerRegistrar) Register(name string, store StoreActioner) { sr.mu.Lock() defer sr.mu.Unlock() sr.stores[name] = store } -func (sr *storeActionerRegistrar) Get(name string) (store StoreActioner, ok bool) { +func (sr *StoreActionerRegistrar) Get(name string) (store StoreActioner, ok bool) { sr.mu.RLock() defer sr.mu.RUnlock() store, ok = sr.stores[name] diff --git a/services/storage/service.go b/services/storage/service.go index 4d652c1bd..2b9898e81 100644 --- a/services/storage/service.go +++ b/services/storage/service.go @@ -21,7 +21,7 @@ type Service struct { stores map[string]Interface mu sync.Mutex - registrar StoreActionerRegistrar + registrar *StoreActionerRegistrar apiServer *APIServer versions Versions @@ -102,7 +102,7 @@ func (s *Service) store(name string) Interface { if store, ok := s.stores[name]; ok { return store } else { - store = NewBolt(s.boltdb, name) + store = NewBolt(s.boltdb, []byte(name)) s.stores[name] = store return store } diff --git a/services/storage/storage.go b/services/storage/storage.go index aef5376d2..3ff940b91 100644 --- a/services/storage/storage.go +++ b/services/storage/storage.go @@ -1,6 +1,10 @@ package storage -import "errors" +import ( + "errors" + + "go.etcd.io/bbolt" +) // Common errors that can be returned var ( @@ -19,6 +23,7 @@ type ReadOperator interface { // WriteOperator provides an interface for performing write operations. type WriteOperator interface { + // Store a value. Put(key string, value []byte) error // Delete a key. @@ -30,6 +35,9 @@ type WriteOperator interface { type ReadOnlyTx interface { ReadOperator + // Bucket returns a ReadOnlyTx for that bucket. If the bucket doesn't exist Tx should be nil. + Bucket(name []byte) ReadOnlyTx + // Rollback signals that the transaction is complete. // If the transaction was not committed, then all changes are reverted. // Rollback must always be called for every transaction. @@ -38,12 +46,23 @@ type ReadOnlyTx interface { // Tx provides an interface for performing read and write storage operations in a single transaction. type Tx interface { - ReadOnlyTx + ReadOperator WriteOperator + // returns a cursor for that bucket + Cursor() *bbolt.Cursor + + // Bucket returns a Tx for that bucket. If the bucket doesn't exist Tx should be nil. + Bucket(name []byte) Tx + // Commit finalizes the transaction. // Once a transaction is committed, rolling back the transaction has no effect. Commit() error + + // Rollback signals that the transaction is complete. + // If the transaction was not committed, then all changes are reverted. + // Rollback must always be called for every transaction. + Rollback() error } type TxOperator interface { @@ -60,6 +79,7 @@ type TxOperator interface { } // Common interface for interacting with a simple Key/Value storage +// Yes, I realize this is a bad name. type Interface interface { // View creates a new read only transaction and always rolls it back. @@ -68,6 +88,8 @@ type Interface interface { // Update creates a new read-write transaction and always rolls it back. // If the function returns a nil error the transaction is committed, otherwise the error is returned. Update(func(Tx) error) error + + Store(Buckets ...[]byte) Interface } // View manages a read only transaction. diff --git a/services/storage/storage_test.go b/services/storage/storage_test.go index 336deee55..af5f0c6d5 100644 --- a/services/storage/storage_test.go +++ b/services/storage/storage_test.go @@ -3,313 +3,271 @@ package storage_test import ( "bytes" "fmt" - "os" - "path/filepath" "testing" "github.com/influxdata/kapacitor/services/storage" + "github.com/influxdata/kapacitor/services/storage/storagetest" "github.com/pkg/errors" - bolt "go.etcd.io/bbolt" ) // Error used to specifically trigger a rollback for tests. var rollbackErr = errors.New("rollback") -type createStoreCloser func() (storeCloser, error) - -// stores is a map of all storage implementations, -// each test will be run against the stores found in this map. -var stores = map[string]createStoreCloser{ - "bolt": newBolt, - "mem": newMemStore, -} - -type storeCloser interface { - Store(namespace string) storage.Interface - Close() -} - -type boltDB struct { - db *bolt.DB - dir string -} - -func (b boltDB) Close() { - _ = b.db.Close() - os.RemoveAll(b.dir) -} - -func newBolt() (storeCloser, error) { - tmpDir, err := os.MkdirTemp("", "storage-bolt") - if err != nil { - return nil, fmt.Errorf("failed to create temp directory: %v", err) - } - db, err := bolt.Open(filepath.Join(tmpDir, "bolt.db"), 0600, nil) - if err != nil { - return boltDB{}, err - } - return boltDB{ - db: db, - dir: tmpDir, - }, nil -} - -func (b boltDB) Store(bucket string) storage.Interface { - return storage.NewBolt(b.db, bucket) -} - -type memStore struct { - stores map[string]storage.Interface -} - -func newMemStore() (storeCloser, error) { - return memStore{ - stores: make(map[string]storage.Interface), - }, nil -} - -func (s memStore) Store(name string) storage.Interface { - m, ok := s.stores[name] - if ok { - return m - } - m = storage.NewMemStore(name) - s.stores[name] = m - return m -} - -func (s memStore) Close() { -} +//type storeCloser interface { +// Store(namespace string) storage.Interface +// Close() error +//} + +//type boltDB struct { +// db *bolt.db +// dir string +//} +// +//func (b boltDB) Close() error { +// _ = b.db.Close() // we don't need to worry about this error +// return os.RemoveAll(b.dir) +//} +// +//func newBolt() (storeCloser, error) { +// tmpDir, err := os.MkdirTemp("", "storage-bolt") +// if err != nil { +// return nil, fmt.Errorf("failed to create temp directory: %v", err) +// } +// db, err := bolt.Open(filepath.Join(tmpDir, "bolt.db"), 0600, nil) +// if err != nil { +// return boltDB{}, err +// } +// return boltDB{ +// db: db, +// dir: tmpDir, +// }, nil +//} +// +//func (b boltDB) Store(bucket string) storage.Interface { +// return storage.NewBolt(b.db, []byte(bucket)) +//} func TestStorage_CRUD(t *testing.T) { - for name, sc := range stores { - t.Run(name, func(t *testing.T) { - db, err := sc() - if err != nil { + t.Run("bolt", func(t *testing.T) { + db, err := storagetest.NewBolt() + if err != nil { + t.Fatal(err) + } + defer db.Close() + + s := db.Store("crud") + s.Update(func(tx storage.Tx) error { + key := "key0" + value := []byte("test value") + if exists, err := tx.Exists(key); err != nil { t.Fatal(err) + } else if exists { + t.Fatal("expected key to not exist") } - defer db.Close() - - s := db.Store("crud") - s.Update(func(tx storage.Tx) error { - key := "key0" - value := []byte("test value") - if exists, err := tx.Exists(key); err != nil { - t.Fatal(err) - } else if exists { - t.Fatal("expected key to not exist") - } - - if err := tx.Put(key, value); err != nil { - t.Fatal(err) - } - if exists, err := tx.Exists(key); err != nil { - t.Fatal(err) - } else if !exists { - t.Fatal("expected key to exist") - } - got, err := tx.Get(key) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(got.Value, value) { - t.Fatalf("unexpected value got %q exp %q", string(got.Value), string(value)) - } - - if err := tx.Delete(key); err != nil { - t.Fatal(err) - } - - if exists, err := tx.Exists(key); err != nil { - t.Fatal(err) - } else if exists { - t.Fatal("expected key to not exist after delete") - } - return nil - }) - }) - } -} - -func TestStorage_Update(t *testing.T) { - for name, sc := range stores { - t.Run(name, func(t *testing.T) { - db, err := sc() - if err != nil { + if err := tx.Put(key, value); err != nil { t.Fatal(err) } - defer db.Close() - - s := db.Store("commit") - value := []byte("test value") - err = s.Update(func(tx storage.Tx) error { - return tx.Put("key0", value) - }) - if err != nil { + if exists, err := tx.Exists(key); err != nil { t.Fatal(err) + } else if !exists { + t.Fatal("expected key to exist") } - var got *storage.KeyValue - err = s.View(func(tx storage.ReadOnlyTx) error { - got, err = tx.Get("key0") - return err - }) + got, err := tx.Get(key) if err != nil { t.Fatal(err) } if !bytes.Equal(got.Value, value) { - t.Errorf("unexpected value got %q exp %q", string(got.Value), string(value)) + t.Fatalf("unexpected value got %q exp %q", string(got.Value), string(value)) } - }) - } -} -func TestStorage_Update_Rollback(t *testing.T) { - for name, sc := range stores { - t.Run(name, func(t *testing.T) { - db, err := sc() - if err != nil { + if err := tx.Delete(key); err != nil { t.Fatal(err) } - defer db.Close() - - s := db.Store("rollback") - value := []byte("test value") - // Put value - err = s.Update(func(tx storage.Tx) error { - return tx.Put("key0", value) - }) - if err != nil { + if exists, err := tx.Exists(key); err != nil { t.Fatal(err) + } else if exists { + t.Fatal("expected key to not exist after delete") } + return nil + }) + }) +} - err = s.Update(func(tx storage.Tx) error { - if err := tx.Put("key0", []byte("overridden value is rolledback")); err != nil { - return err - } - return rollbackErr - }) +func TestStorage_Update(t *testing.T) { + t.Run("bolt", func(t *testing.T) { + db, err := storagetest.NewBolt() + if err != nil { + t.Fatal(err) + } + defer db.Close() + + s := db.Store("commit") + value := []byte("test value") + err = s.Update(func(tx storage.Tx) error { + return tx.Put("key0", value) + }) + if err != nil { + t.Fatal(err) + } + + var got *storage.KeyValue + err = s.View(func(tx storage.ReadOnlyTx) error { + got, err = tx.Get("key0") + return err + }) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(got.Value, value) { + t.Errorf("unexpected value got %q exp %q", string(got.Value), string(value)) + } + }) +} - if err == nil { - t.Fatal("expected error") - } else if err != rollbackErr { - t.Fatalf("unexpected error: got %v exp %v", err, rollbackErr) - } +func TestStorage_Update_Rollback(t *testing.T) { + t.Run("bolt", func(t *testing.T) { + db, err := storagetest.NewBolt() + if err != nil { + t.Fatal(err) + } + defer db.Close() + + s := db.Store("rollback") + value := []byte("test value") + + // Put value + err = s.Update(func(tx storage.Tx) error { + return tx.Put("key0", value) + }) + if err != nil { + t.Fatal(err) + } - var got *storage.KeyValue - s.View(func(tx storage.ReadOnlyTx) error { - got, err = tx.Get("key0") + err = s.Update(func(tx storage.Tx) error { + if err := tx.Put("key0", []byte("overridden value is rolledback")); err != nil { return err - }) - if err != nil { - t.Fatal(err) } + return rollbackErr + }) - if !bytes.Equal(got.Value, value) { - t.Errorf("unexpected value got %q exp %q", string(got.Value), string(value)) - } + if err == nil { + t.Fatal("expected error") + } else if err != rollbackErr { + t.Fatalf("unexpected error: got %v exp %v", err, rollbackErr) + } + + var got *storage.KeyValue + s.View(func(tx storage.ReadOnlyTx) error { + got, err = tx.Get("key0") + return err }) - } + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(got.Value, value) { + t.Errorf("unexpected value got %q exp %q", string(got.Value), string(value)) + } + }) } func TestStorage_Update_Concurrent(t *testing.T) { - for name, sc := range stores { - t.Run(name, func(t *testing.T) { - db, err := sc() - if err != nil { - t.Fatal(err) - } - defer db.Close() - - bucketFmt := func(w int) string { - return fmt.Sprintf("bucket%d", w) - } - valueFmt := func(w, i, k int) []byte { - return []byte(fmt.Sprintf("worker %d iteration %d key %d", w, i, k)) - } - keyFmt := func(w, i, k int) string { - return fmt.Sprintf("key%d", k) - } - - putLoop := func(s storage.Interface, w, i, k int) error { - // Begin new transaction - err := s.Update(func(tx storage.Tx) error { - // Put a set of values - for x := 0; x < k; x++ { - v := valueFmt(w, i, x) - k := keyFmt(w, i, x) - if err := tx.Put(k, v); err != nil { - return err - } - } - // Do not commit every third transaction - if i%3 == 0 { - return rollbackErr + t.Run("bolt", func(t *testing.T) { + db, err := storagetest.NewBolt() + if err != nil { + t.Fatal(err) + } + defer db.Close() + + bucketFmt := func(w int) string { + return fmt.Sprintf("bucket%d", w) + } + valueFmt := func(w, i, k int) []byte { + return []byte(fmt.Sprintf("worker %d iteration %d key %d", w, i, k)) + } + keyFmt := func(w, i, k int) string { + return fmt.Sprintf("key%d", k) + } + + putLoop := func(s storage.Interface, w, i, k int) error { + // Begin new transaction + err := s.Update(func(tx storage.Tx) error { + // Put a set of values + for x := 0; x < k; x++ { + v := valueFmt(w, i, x) + k := keyFmt(w, i, x) + if err := tx.Put(k, v); err != nil { + return err } - return nil - }) - // Mask explicit rollback errors - if err == rollbackErr { - err = nil } - return err - } - - testF := func(s storage.Interface, w, i, k int) error { - for x := 0; x < i; x++ { - if err := putLoop(s, w, x, k); err != nil { - return errors.Wrapf(err, "worker %d", w) - } + // Do not commit every third transaction + if i%3 == 0 { + return rollbackErr } return nil + }) + // Mask explicit rollback errors + if err == rollbackErr { + err = nil } + return err + } - // Concurrency counts - w := 10 // number of workers - i := 10 // number of iterations - k := 10 // number of keys to write - - errs := make(chan error, w) - for x := 0; x < w; x++ { - s := db.Store(bucketFmt(x)) - go func(s storage.Interface, w, i, k int) { - errs <- testF(s, w, i, k) - }(s, x, i, k) + testF := func(s storage.Interface, w, i, k int) error { + for x := 0; x < i; x++ { + if err := putLoop(s, w, x, k); err != nil { + return errors.Wrapf(err, "worker %d", w) + } } - for x := 0; x < w; x++ { - err := <-errs + return nil + } + + // Concurrency counts + w := 10 // number of workers + i := 10 // number of iterations + k := 10 // number of keys to write + + errs := make(chan error, w) + for x := 0; x < w; x++ { + s := db.Store(bucketFmt(x)) + go func(s storage.Interface, w, i, k int) { + errs <- testF(s, w, i, k) + }(s, x, i, k) + } + for x := 0; x < w; x++ { + err := <-errs + if err != nil { + t.Fatal(err) + } + } + + for x := 0; x < w; x++ { + s := db.Store(bucketFmt(x)) + for z := 0; z < k; z++ { + y := i - 1 + if y%3 == 0 { + // The last iteration was not committed, expect the previous + y-- + } + key := keyFmt(x, y, z) + value := valueFmt(x, y, z) + var kv *storage.KeyValue + err := s.View(func(tx storage.ReadOnlyTx) error { + kv, err = tx.Get(key) + return err + }) if err != nil { - t.Fatal(err) + t.Fatalf("%s err:%v", key, err) } - } - - for x := 0; x < w; x++ { - s := db.Store(bucketFmt(x)) - for z := 0; z < k; z++ { - y := i - 1 - if y%3 == 0 { - // The last iteration was not committed, expect the previous - y-- - } - key := keyFmt(x, y, z) - value := valueFmt(x, y, z) - var kv *storage.KeyValue - err := s.View(func(tx storage.ReadOnlyTx) error { - kv, err = tx.Get(key) - return err - }) - if err != nil { - t.Fatalf("%s err:%v", key, err) - } - if !bytes.Equal(kv.Value, value) { - t.Errorf("unexpected value for key %s: got %q exp %q", key, string(kv.Value), string(value)) - } + if !bytes.Equal(kv.Value, value) { + t.Errorf("unexpected value for key %s: got %q exp %q", key, string(kv.Value), string(value)) } } - }) - } + } + }) } diff --git a/services/storage/storagetest/storage.go b/services/storage/storagetest/storage.go index 3dfcf948d..4e87d936c 100644 --- a/services/storage/storagetest/storage.go +++ b/services/storage/storagetest/storage.go @@ -1,26 +1,73 @@ package storagetest -import "github.com/influxdata/kapacitor/services/storage" +import ( + "os" + "path" + + "github.com/influxdata/kapacitor/services/storage" + bolt "go.etcd.io/bbolt" +) type TestStore struct { + db *BoltDB versions storage.Versions - registrar storage.StoreActionerRegistrar + registrar *storage.StoreActionerRegistrar +} + +// BoltDB is a database that deletes itself when closed +type BoltDB struct { + *bolt.DB +} + +// NewBolt is an in-memory db that deletes itself when closed, do not use except for testing. +func NewBolt() (*BoltDB, error) { + db, err := bolt.Open(":memory:", 0600, &bolt.Options{ + Timeout: 0, + NoGrowSync: false, + MemOnly: true, + }) + if err != nil { + return nil, err + } + return &BoltDB{db}, nil +} + +func (b BoltDB) Store(bucket string) storage.Interface { + return storage.NewBolt(b.DB, []byte(bucket)) +} + +func (b BoltDB) Close() error { + err := b.DB.Close() + if err != nil { + return err + } + return os.RemoveAll(path.Dir(b.Path())) } func New() TestStore { + db, err := NewBolt() + if err != nil { + panic(err) + } return TestStore{ - versions: storage.NewVersions(storage.NewMemStore("versions")), + db: db, + versions: storage.NewVersions(db.Store("versions")), registrar: storage.NewStorageResitrar(), } } func (s TestStore) Store(name string) storage.Interface { - return storage.NewMemStore(name) + return s.db.Store(name) } func (s TestStore) Versions() storage.Versions { return s.versions } + func (s TestStore) Register(name string, store storage.StoreActioner) { s.registrar.Register(name, store) } + +func (s TestStore) Close() { + //s.db.Close() +} diff --git a/task/kv/task.go b/task/kv/task.go index 9df2439db..5da3825da 100644 --- a/task/kv/task.go +++ b/task/kv/task.go @@ -122,7 +122,7 @@ func kvToInfluxTask(k *kvTask) *taskmodel.Task { // FindTaskByID returns a single task func (s *Service) FindTaskByID(ctx context.Context, id platform.ID) (*taskmodel.Task, error) { var t *taskmodel.Task - err := s.kv.View(func(tx storage.ReadOnlyTx) error { + return t, s.kv.View(func(tx storage.ReadOnlyTx) error { task, err := s.findTaskByID(ctx, tx, id) if err != nil { return err @@ -130,11 +130,6 @@ func (s *Service) FindTaskByID(ctx context.Context, id platform.ID) (*taskmodel. t = task return nil }) - if err != nil { - return nil, err - } - - return t, nil } func IsNotFound(err error) bool { @@ -143,7 +138,7 @@ func IsNotFound(err error) bool { // findTaskByID is an internal method used to do any action with tasks internally // that do not require authorization. -func (s *Service) findTaskByID(ctx context.Context, tx storage.ReadOnlyTx, id platform.ID) (*taskmodel.Task, error) { +func (s *Service) findTaskByID(_ context.Context, tx storage.ReadOperator, id platform.ID) (*taskmodel.Task, error) { b := &wrappedReadTx{ tx: tx, prefix: taskPrefix, @@ -636,7 +631,7 @@ func (s *Service) FindRuns(ctx context.Context, filter taskmodel.RunFilter) ([]* return runs, len(runs), nil } -func (s *Service) findRuns(ctx context.Context, tx storage.ReadOnlyTx, filter taskmodel.RunFilter) ([]*taskmodel.Run, int, error) { +func (s *Service) findRuns(ctx context.Context, tx storage.ReadOperator, filter taskmodel.RunFilter) ([]*taskmodel.Run, int, error) { if filter.Limit == 0 { filter.Limit = taskmodel.TaskDefaultPageSize } @@ -710,7 +705,7 @@ func (s *Service) FindRunByID(ctx context.Context, taskID, runID platform.ID) (* return run, nil } -func (s *Service) findRunByID(ctx context.Context, tx storage.ReadOnlyTx, taskID, runID platform.ID) (*taskmodel.Run, error) { +func (s *Service) findRunByID(ctx context.Context, tx storage.ReadOperator, taskID, runID platform.ID) (*taskmodel.Run, error) { bucket := wrappedReadTx{ tx: tx, prefix: taskRunPrefix, @@ -963,7 +958,7 @@ func (s *Service) CurrentlyRunning(ctx context.Context, taskID platform.ID) ([]* return runs, nil } -func (s *Service) currentlyRunning(ctx context.Context, tx storage.ReadOnlyTx, taskID platform.ID) ([]*taskmodel.Run, error) { +func (s *Service) currentlyRunning(ctx context.Context, tx storage.ReadOperator, taskID platform.ID) ([]*taskmodel.Run, error) { bucket := wrappedReadTx{ tx: tx, prefix: taskRunPrefix, @@ -1006,7 +1001,7 @@ func (s *Service) ManualRuns(ctx context.Context, taskID platform.ID) ([]*taskmo return runs, nil } -func (s *Service) manualRuns(ctx context.Context, tx storage.ReadOnlyTx, taskID platform.ID) ([]*taskmodel.Run, error) { +func (s *Service) manualRuns(ctx context.Context, tx storage.ReadOperator, taskID platform.ID) ([]*taskmodel.Run, error) { b := wrappedReadTx{ tx: tx, prefix: taskRunPrefix, diff --git a/task/kv/wrapper.go b/task/kv/wrapper.go index 59aa2605c..8ddbcdcc4 100644 --- a/task/kv/wrapper.go +++ b/task/kv/wrapper.go @@ -30,7 +30,7 @@ func (t *wrappedTx) Delete(key string) error { // BoltTx wraps an underlying bolt.Tx type to implement the Tx interface. type wrappedReadTx struct { - tx storage.ReadOnlyTx + tx storage.ReadOperator prefix string } diff --git a/task/servicetest/servicetest.go b/task/servicetest/servicetest.go index 9fc16276e..679afd0b6 100644 --- a/task/servicetest/servicetest.go +++ b/task/servicetest/servicetest.go @@ -57,7 +57,7 @@ func TestTaskService(t *testing.T, fn BackendComponentFactory, testCategory ...s testTaskCRUD(t, sys) }) - t.Run("FindTasks paging", func(t *testing.T) { + t.Run("FindTasks_paging", func(t *testing.T) { testTaskFindTasksPaging(t, sys) }) diff --git a/test.sh b/test.sh index 568f8e066..4d2f5f225 100755 --- a/test.sh +++ b/test.sh @@ -36,6 +36,8 @@ NO_UNCOMMITTED=${NO_UNCOMMITTED-false} HOME_DIR=/root # GOPATH GOPATH=/go +# PROTO VERSION +PROTO_VERSION=3.18.3 no_uncomitted_arg="$no_uncommitted_arg" if [ ! $NO_UNCOMMITTED ] @@ -67,7 +69,7 @@ function run_test_docker { imagename="$imagename-$BUILD_NUM" echo "Building docker image $imagename" - docker build -f "$dockerfile" --build-arg -t "$imagename" . + docker build -f "$dockerfile" --build-arg PROTO_VERSION=$PROTO_VERSION -t "$imagename" . echo "Running test in docker $name with args $@" diff --git a/udf/agent/py/kapacitor/udf/udf_pb2.py b/udf/agent/py/kapacitor/udf/udf_pb2.py index ffb8273dc..cc0d47c5c 100644 --- a/udf/agent/py/kapacitor/udf/udf_pb2.py +++ b/udf/agent/py/kapacitor/udf/udf_pb2.py @@ -2,10 +2,9 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: udf.proto """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper +from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection +from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database # @@protoc_insertion_point(imports) @@ -14,1660 +13,86 @@ -DESCRIPTOR = _descriptor.FileDescriptor( - name='udf.proto', - package='agent', - syntax='proto3', - serialized_options=b'Z\007.;agent', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\tudf.proto\x12\x05\x61gent\"\r\n\x0bInfoRequest\"\xc7\x01\n\x0cInfoResponse\x12\x1e\n\x05wants\x18\x01 \x01(\x0e\x32\x0f.agent.EdgeType\x12!\n\x08provides\x18\x02 \x01(\x0e\x32\x0f.agent.EdgeType\x12\x31\n\x07options\x18\x03 \x03(\x0b\x32 .agent.InfoResponse.OptionsEntry\x1a\x41\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.agent.OptionInfo:\x02\x38\x01\"2\n\nOptionInfo\x12$\n\nvalueTypes\x18\x01 \x03(\x0e\x32\x10.agent.ValueType\"M\n\x0bInitRequest\x12\x1e\n\x07options\x18\x01 \x03(\x0b\x32\r.agent.Option\x12\x0e\n\x06taskID\x18\x02 \x01(\t\x12\x0e\n\x06nodeID\x18\x03 \x01(\t\":\n\x06Option\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\"\n\x06values\x18\x02 \x03(\x0b\x32\x12.agent.OptionValue\"\xa6\x01\n\x0bOptionValue\x12\x1e\n\x04type\x18\x01 \x01(\x0e\x32\x10.agent.ValueType\x12\x13\n\tboolValue\x18\x02 \x01(\x08H\x00\x12\x12\n\x08intValue\x18\x03 \x01(\x03H\x00\x12\x15\n\x0b\x64oubleValue\x18\x04 \x01(\x01H\x00\x12\x15\n\x0bstringValue\x18\x05 \x01(\tH\x00\x12\x17\n\rdurationValue\x18\x06 \x01(\x03H\x00\x42\x07\n\x05value\".\n\x0cInitResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x11\n\x0fSnapshotRequest\"$\n\x10SnapshotResponse\x12\x10\n\x08snapshot\x18\x01 \x01(\x0c\"\"\n\x0eRestoreRequest\x12\x10\n\x08snapshot\x18\x01 \x01(\x0c\"1\n\x0fRestoreResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\" \n\x10KeepaliveRequest\x12\x0c\n\x04time\x18\x01 \x01(\x03\"!\n\x11KeepaliveResponse\x12\x0c\n\x04time\x18\x01 \x01(\x03\"\x1e\n\rErrorResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"\x9f\x01\n\nBeginBatch\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05group\x18\x02 \x01(\t\x12)\n\x04tags\x18\x03 \x03(\x0b\x32\x1b.agent.BeginBatch.TagsEntry\x12\x0c\n\x04size\x18\x04 \x01(\x03\x12\x0e\n\x06\x62yName\x18\x05 \x01(\x08\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf1\x04\n\x05Point\x12\x0c\n\x04time\x18\x01 \x01(\x03\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x03 \x01(\t\x12\x17\n\x0fretentionPolicy\x18\x04 \x01(\t\x12\r\n\x05group\x18\x05 \x01(\t\x12\x12\n\ndimensions\x18\x06 \x03(\t\x12$\n\x04tags\x18\x07 \x03(\x0b\x32\x16.agent.Point.TagsEntry\x12\x34\n\x0c\x66ieldsDouble\x18\x08 \x03(\x0b\x32\x1e.agent.Point.FieldsDoubleEntry\x12.\n\tfieldsInt\x18\t \x03(\x0b\x32\x1b.agent.Point.FieldsIntEntry\x12\x34\n\x0c\x66ieldsString\x18\n \x03(\x0b\x32\x1e.agent.Point.FieldsStringEntry\x12\x30\n\nfieldsBool\x18\x0c \x03(\x0b\x32\x1c.agent.Point.FieldsBoolEntry\x12\x0e\n\x06\x62yName\x18\x0b \x01(\x08\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x33\n\x11\x46ieldsDoubleEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01:\x02\x38\x01\x1a\x30\n\x0e\x46ieldsIntEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x03:\x02\x38\x01\x1a\x33\n\x11\x46ieldsStringEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x31\n\x0f\x46ieldsBoolEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"\x9b\x01\n\x08\x45ndBatch\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05group\x18\x02 \x01(\t\x12\x0c\n\x04tmax\x18\x03 \x01(\x03\x12\'\n\x04tags\x18\x04 \x03(\x0b\x32\x19.agent.EndBatch.TagsEntry\x12\x0e\n\x06\x62yName\x18\x05 \x01(\x08\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc3\x02\n\x07Request\x12\"\n\x04info\x18\x01 \x01(\x0b\x32\x12.agent.InfoRequestH\x00\x12\"\n\x04init\x18\x02 \x01(\x0b\x32\x12.agent.InitRequestH\x00\x12,\n\tkeepalive\x18\x03 \x01(\x0b\x32\x17.agent.KeepaliveRequestH\x00\x12*\n\x08snapshot\x18\x04 \x01(\x0b\x32\x16.agent.SnapshotRequestH\x00\x12(\n\x07restore\x18\x05 \x01(\x0b\x32\x15.agent.RestoreRequestH\x00\x12\"\n\x05\x62\x65gin\x18\x10 \x01(\x0b\x32\x11.agent.BeginBatchH\x00\x12\x1d\n\x05point\x18\x11 \x01(\x0b\x32\x0c.agent.PointH\x00\x12\x1e\n\x03\x65nd\x18\x12 \x01(\x0b\x32\x0f.agent.EndBatchH\x00\x42\t\n\x07message\"\xf0\x02\n\x08Response\x12#\n\x04info\x18\x01 \x01(\x0b\x32\x13.agent.InfoResponseH\x00\x12#\n\x04init\x18\x02 \x01(\x0b\x32\x13.agent.InitResponseH\x00\x12-\n\tkeepalive\x18\x03 \x01(\x0b\x32\x18.agent.KeepaliveResponseH\x00\x12+\n\x08snapshot\x18\x04 \x01(\x0b\x32\x17.agent.SnapshotResponseH\x00\x12)\n\x07restore\x18\x05 \x01(\x0b\x32\x16.agent.RestoreResponseH\x00\x12%\n\x05\x65rror\x18\x06 \x01(\x0b\x32\x14.agent.ErrorResponseH\x00\x12\"\n\x05\x62\x65gin\x18\x10 \x01(\x0b\x32\x11.agent.BeginBatchH\x00\x12\x1d\n\x05point\x18\x11 \x01(\x0b\x32\x0c.agent.PointH\x00\x12\x1e\n\x03\x65nd\x18\x12 \x01(\x0b\x32\x0f.agent.EndBatchH\x00\x42\t\n\x07message*!\n\x08\x45\x64geType\x12\n\n\x06STREAM\x10\x00\x12\t\n\x05\x42\x41TCH\x10\x01*D\n\tValueType\x12\x08\n\x04\x42OOL\x10\x00\x12\x07\n\x03INT\x10\x01\x12\n\n\x06\x44OUBLE\x10\x02\x12\n\n\x06STRING\x10\x03\x12\x0c\n\x08\x44URATION\x10\x04\x42\tZ\x07.;agentb\x06proto3' -) - -_EDGETYPE = _descriptor.EnumDescriptor( - name='EdgeType', - full_name='agent.EdgeType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='STREAM', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='BATCH', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=2535, - serialized_end=2568, -) -_sym_db.RegisterEnumDescriptor(_EDGETYPE) - -EdgeType = enum_type_wrapper.EnumTypeWrapper(_EDGETYPE) -_VALUETYPE = _descriptor.EnumDescriptor( - name='ValueType', - full_name='agent.ValueType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='BOOL', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='INT', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='DOUBLE', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='STRING', index=3, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='DURATION', index=4, number=4, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=2570, - serialized_end=2638, -) -_sym_db.RegisterEnumDescriptor(_VALUETYPE) - -ValueType = enum_type_wrapper.EnumTypeWrapper(_VALUETYPE) -STREAM = 0 -BATCH = 1 -BOOL = 0 -INT = 1 -DOUBLE = 2 -STRING = 3 -DURATION = 4 - - - -_INFOREQUEST = _descriptor.Descriptor( - name='InfoRequest', - full_name='agent.InfoRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=20, - serialized_end=33, -) - - -_INFORESPONSE_OPTIONSENTRY = _descriptor.Descriptor( - name='OptionsEntry', - full_name='agent.InfoResponse.OptionsEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='agent.InfoResponse.OptionsEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='agent.InfoResponse.OptionsEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=170, - serialized_end=235, -) - -_INFORESPONSE = _descriptor.Descriptor( - name='InfoResponse', - full_name='agent.InfoResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='wants', full_name='agent.InfoResponse.wants', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='provides', full_name='agent.InfoResponse.provides', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='agent.InfoResponse.options', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_INFORESPONSE_OPTIONSENTRY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=36, - serialized_end=235, -) - - -_OPTIONINFO = _descriptor.Descriptor( - name='OptionInfo', - full_name='agent.OptionInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='valueTypes', full_name='agent.OptionInfo.valueTypes', index=0, - number=1, type=14, cpp_type=8, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=237, - serialized_end=287, -) - - -_INITREQUEST = _descriptor.Descriptor( - name='InitRequest', - full_name='agent.InitRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='options', full_name='agent.InitRequest.options', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='taskID', full_name='agent.InitRequest.taskID', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='nodeID', full_name='agent.InitRequest.nodeID', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=289, - serialized_end=366, -) - - -_OPTION = _descriptor.Descriptor( - name='Option', - full_name='agent.Option', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='agent.Option.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='values', full_name='agent.Option.values', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=368, - serialized_end=426, -) - - -_OPTIONVALUE = _descriptor.Descriptor( - name='OptionValue', - full_name='agent.OptionValue', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='type', full_name='agent.OptionValue.type', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='boolValue', full_name='agent.OptionValue.boolValue', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='intValue', full_name='agent.OptionValue.intValue', index=2, - number=3, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='doubleValue', full_name='agent.OptionValue.doubleValue', index=3, - number=4, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='stringValue', full_name='agent.OptionValue.stringValue', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='durationValue', full_name='agent.OptionValue.durationValue', index=5, - number=6, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='value', full_name='agent.OptionValue.value', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=429, - serialized_end=595, -) - - -_INITRESPONSE = _descriptor.Descriptor( - name='InitResponse', - full_name='agent.InitResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='success', full_name='agent.InitResponse.success', index=0, - number=1, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='error', full_name='agent.InitResponse.error', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=597, - serialized_end=643, -) - - -_SNAPSHOTREQUEST = _descriptor.Descriptor( - name='SnapshotRequest', - full_name='agent.SnapshotRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=645, - serialized_end=662, -) - - -_SNAPSHOTRESPONSE = _descriptor.Descriptor( - name='SnapshotResponse', - full_name='agent.SnapshotResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='snapshot', full_name='agent.SnapshotResponse.snapshot', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=664, - serialized_end=700, -) - - -_RESTOREREQUEST = _descriptor.Descriptor( - name='RestoreRequest', - full_name='agent.RestoreRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='snapshot', full_name='agent.RestoreRequest.snapshot', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=702, - serialized_end=736, -) - - -_RESTORERESPONSE = _descriptor.Descriptor( - name='RestoreResponse', - full_name='agent.RestoreResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='success', full_name='agent.RestoreResponse.success', index=0, - number=1, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='error', full_name='agent.RestoreResponse.error', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=738, - serialized_end=787, -) - - -_KEEPALIVEREQUEST = _descriptor.Descriptor( - name='KeepaliveRequest', - full_name='agent.KeepaliveRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='time', full_name='agent.KeepaliveRequest.time', index=0, - number=1, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=789, - serialized_end=821, -) - - -_KEEPALIVERESPONSE = _descriptor.Descriptor( - name='KeepaliveResponse', - full_name='agent.KeepaliveResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='time', full_name='agent.KeepaliveResponse.time', index=0, - number=1, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=823, - serialized_end=856, -) - - -_ERRORRESPONSE = _descriptor.Descriptor( - name='ErrorResponse', - full_name='agent.ErrorResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='error', full_name='agent.ErrorResponse.error', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=858, - serialized_end=888, -) - - -_BEGINBATCH_TAGSENTRY = _descriptor.Descriptor( - name='TagsEntry', - full_name='agent.BeginBatch.TagsEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='agent.BeginBatch.TagsEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='agent.BeginBatch.TagsEntry.value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1007, - serialized_end=1050, -) - -_BEGINBATCH = _descriptor.Descriptor( - name='BeginBatch', - full_name='agent.BeginBatch', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='agent.BeginBatch.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='group', full_name='agent.BeginBatch.group', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='tags', full_name='agent.BeginBatch.tags', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='size', full_name='agent.BeginBatch.size', index=3, - number=4, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='byName', full_name='agent.BeginBatch.byName', index=4, - number=5, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_BEGINBATCH_TAGSENTRY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=891, - serialized_end=1050, -) - - -_POINT_TAGSENTRY = _descriptor.Descriptor( - name='TagsEntry', - full_name='agent.Point.TagsEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='agent.Point.TagsEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='agent.Point.TagsEntry.value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1007, - serialized_end=1050, -) - -_POINT_FIELDSDOUBLEENTRY = _descriptor.Descriptor( - name='FieldsDoubleEntry', - full_name='agent.Point.FieldsDoubleEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='agent.Point.FieldsDoubleEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='agent.Point.FieldsDoubleEntry.value', index=1, - number=2, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1473, - serialized_end=1524, -) - -_POINT_FIELDSINTENTRY = _descriptor.Descriptor( - name='FieldsIntEntry', - full_name='agent.Point.FieldsIntEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='agent.Point.FieldsIntEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='agent.Point.FieldsIntEntry.value', index=1, - number=2, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1526, - serialized_end=1574, -) - -_POINT_FIELDSSTRINGENTRY = _descriptor.Descriptor( - name='FieldsStringEntry', - full_name='agent.Point.FieldsStringEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='agent.Point.FieldsStringEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='agent.Point.FieldsStringEntry.value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1576, - serialized_end=1627, -) - -_POINT_FIELDSBOOLENTRY = _descriptor.Descriptor( - name='FieldsBoolEntry', - full_name='agent.Point.FieldsBoolEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='agent.Point.FieldsBoolEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='agent.Point.FieldsBoolEntry.value', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1629, - serialized_end=1678, -) - -_POINT = _descriptor.Descriptor( - name='Point', - full_name='agent.Point', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='time', full_name='agent.Point.time', index=0, - number=1, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='name', full_name='agent.Point.name', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='database', full_name='agent.Point.database', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='retentionPolicy', full_name='agent.Point.retentionPolicy', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='group', full_name='agent.Point.group', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='dimensions', full_name='agent.Point.dimensions', index=5, - number=6, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='tags', full_name='agent.Point.tags', index=6, - number=7, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='fieldsDouble', full_name='agent.Point.fieldsDouble', index=7, - number=8, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='fieldsInt', full_name='agent.Point.fieldsInt', index=8, - number=9, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='fieldsString', full_name='agent.Point.fieldsString', index=9, - number=10, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='fieldsBool', full_name='agent.Point.fieldsBool', index=10, - number=12, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='byName', full_name='agent.Point.byName', index=11, - number=11, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_POINT_TAGSENTRY, _POINT_FIELDSDOUBLEENTRY, _POINT_FIELDSINTENTRY, _POINT_FIELDSSTRINGENTRY, _POINT_FIELDSBOOLENTRY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1053, - serialized_end=1678, -) - - -_ENDBATCH_TAGSENTRY = _descriptor.Descriptor( - name='TagsEntry', - full_name='agent.EndBatch.TagsEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='agent.EndBatch.TagsEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='agent.EndBatch.TagsEntry.value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=b'8\001', - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1007, - serialized_end=1050, -) - -_ENDBATCH = _descriptor.Descriptor( - name='EndBatch', - full_name='agent.EndBatch', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='agent.EndBatch.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='group', full_name='agent.EndBatch.group', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='tmax', full_name='agent.EndBatch.tmax', index=2, - number=3, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='tags', full_name='agent.EndBatch.tags', index=3, - number=4, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='byName', full_name='agent.EndBatch.byName', index=4, - number=5, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_ENDBATCH_TAGSENTRY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1681, - serialized_end=1836, -) - - -_REQUEST = _descriptor.Descriptor( - name='Request', - full_name='agent.Request', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='info', full_name='agent.Request.info', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='init', full_name='agent.Request.init', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='keepalive', full_name='agent.Request.keepalive', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='snapshot', full_name='agent.Request.snapshot', index=3, - number=4, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='restore', full_name='agent.Request.restore', index=4, - number=5, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='begin', full_name='agent.Request.begin', index=5, - number=16, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='point', full_name='agent.Request.point', index=6, - number=17, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end', full_name='agent.Request.end', index=7, - number=18, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='message', full_name='agent.Request.message', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=1839, - serialized_end=2162, -) - - -_RESPONSE = _descriptor.Descriptor( - name='Response', - full_name='agent.Response', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='info', full_name='agent.Response.info', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='init', full_name='agent.Response.init', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='keepalive', full_name='agent.Response.keepalive', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='snapshot', full_name='agent.Response.snapshot', index=3, - number=4, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='restore', full_name='agent.Response.restore', index=4, - number=5, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='error', full_name='agent.Response.error', index=5, - number=6, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='begin', full_name='agent.Response.begin', index=6, - number=16, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='point', full_name='agent.Response.point', index=7, - number=17, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end', full_name='agent.Response.end', index=8, - number=18, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='message', full_name='agent.Response.message', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=2165, - serialized_end=2533, -) - -_INFORESPONSE_OPTIONSENTRY.fields_by_name['value'].message_type = _OPTIONINFO -_INFORESPONSE_OPTIONSENTRY.containing_type = _INFORESPONSE -_INFORESPONSE.fields_by_name['wants'].enum_type = _EDGETYPE -_INFORESPONSE.fields_by_name['provides'].enum_type = _EDGETYPE -_INFORESPONSE.fields_by_name['options'].message_type = _INFORESPONSE_OPTIONSENTRY -_OPTIONINFO.fields_by_name['valueTypes'].enum_type = _VALUETYPE -_INITREQUEST.fields_by_name['options'].message_type = _OPTION -_OPTION.fields_by_name['values'].message_type = _OPTIONVALUE -_OPTIONVALUE.fields_by_name['type'].enum_type = _VALUETYPE -_OPTIONVALUE.oneofs_by_name['value'].fields.append( - _OPTIONVALUE.fields_by_name['boolValue']) -_OPTIONVALUE.fields_by_name['boolValue'].containing_oneof = _OPTIONVALUE.oneofs_by_name['value'] -_OPTIONVALUE.oneofs_by_name['value'].fields.append( - _OPTIONVALUE.fields_by_name['intValue']) -_OPTIONVALUE.fields_by_name['intValue'].containing_oneof = _OPTIONVALUE.oneofs_by_name['value'] -_OPTIONVALUE.oneofs_by_name['value'].fields.append( - _OPTIONVALUE.fields_by_name['doubleValue']) -_OPTIONVALUE.fields_by_name['doubleValue'].containing_oneof = _OPTIONVALUE.oneofs_by_name['value'] -_OPTIONVALUE.oneofs_by_name['value'].fields.append( - _OPTIONVALUE.fields_by_name['stringValue']) -_OPTIONVALUE.fields_by_name['stringValue'].containing_oneof = _OPTIONVALUE.oneofs_by_name['value'] -_OPTIONVALUE.oneofs_by_name['value'].fields.append( - _OPTIONVALUE.fields_by_name['durationValue']) -_OPTIONVALUE.fields_by_name['durationValue'].containing_oneof = _OPTIONVALUE.oneofs_by_name['value'] -_BEGINBATCH_TAGSENTRY.containing_type = _BEGINBATCH -_BEGINBATCH.fields_by_name['tags'].message_type = _BEGINBATCH_TAGSENTRY -_POINT_TAGSENTRY.containing_type = _POINT -_POINT_FIELDSDOUBLEENTRY.containing_type = _POINT -_POINT_FIELDSINTENTRY.containing_type = _POINT -_POINT_FIELDSSTRINGENTRY.containing_type = _POINT -_POINT_FIELDSBOOLENTRY.containing_type = _POINT -_POINT.fields_by_name['tags'].message_type = _POINT_TAGSENTRY -_POINT.fields_by_name['fieldsDouble'].message_type = _POINT_FIELDSDOUBLEENTRY -_POINT.fields_by_name['fieldsInt'].message_type = _POINT_FIELDSINTENTRY -_POINT.fields_by_name['fieldsString'].message_type = _POINT_FIELDSSTRINGENTRY -_POINT.fields_by_name['fieldsBool'].message_type = _POINT_FIELDSBOOLENTRY -_ENDBATCH_TAGSENTRY.containing_type = _ENDBATCH -_ENDBATCH.fields_by_name['tags'].message_type = _ENDBATCH_TAGSENTRY -_REQUEST.fields_by_name['info'].message_type = _INFOREQUEST -_REQUEST.fields_by_name['init'].message_type = _INITREQUEST -_REQUEST.fields_by_name['keepalive'].message_type = _KEEPALIVEREQUEST -_REQUEST.fields_by_name['snapshot'].message_type = _SNAPSHOTREQUEST -_REQUEST.fields_by_name['restore'].message_type = _RESTOREREQUEST -_REQUEST.fields_by_name['begin'].message_type = _BEGINBATCH -_REQUEST.fields_by_name['point'].message_type = _POINT -_REQUEST.fields_by_name['end'].message_type = _ENDBATCH -_REQUEST.oneofs_by_name['message'].fields.append( - _REQUEST.fields_by_name['info']) -_REQUEST.fields_by_name['info'].containing_oneof = _REQUEST.oneofs_by_name['message'] -_REQUEST.oneofs_by_name['message'].fields.append( - _REQUEST.fields_by_name['init']) -_REQUEST.fields_by_name['init'].containing_oneof = _REQUEST.oneofs_by_name['message'] -_REQUEST.oneofs_by_name['message'].fields.append( - _REQUEST.fields_by_name['keepalive']) -_REQUEST.fields_by_name['keepalive'].containing_oneof = _REQUEST.oneofs_by_name['message'] -_REQUEST.oneofs_by_name['message'].fields.append( - _REQUEST.fields_by_name['snapshot']) -_REQUEST.fields_by_name['snapshot'].containing_oneof = _REQUEST.oneofs_by_name['message'] -_REQUEST.oneofs_by_name['message'].fields.append( - _REQUEST.fields_by_name['restore']) -_REQUEST.fields_by_name['restore'].containing_oneof = _REQUEST.oneofs_by_name['message'] -_REQUEST.oneofs_by_name['message'].fields.append( - _REQUEST.fields_by_name['begin']) -_REQUEST.fields_by_name['begin'].containing_oneof = _REQUEST.oneofs_by_name['message'] -_REQUEST.oneofs_by_name['message'].fields.append( - _REQUEST.fields_by_name['point']) -_REQUEST.fields_by_name['point'].containing_oneof = _REQUEST.oneofs_by_name['message'] -_REQUEST.oneofs_by_name['message'].fields.append( - _REQUEST.fields_by_name['end']) -_REQUEST.fields_by_name['end'].containing_oneof = _REQUEST.oneofs_by_name['message'] -_RESPONSE.fields_by_name['info'].message_type = _INFORESPONSE -_RESPONSE.fields_by_name['init'].message_type = _INITRESPONSE -_RESPONSE.fields_by_name['keepalive'].message_type = _KEEPALIVERESPONSE -_RESPONSE.fields_by_name['snapshot'].message_type = _SNAPSHOTRESPONSE -_RESPONSE.fields_by_name['restore'].message_type = _RESTORERESPONSE -_RESPONSE.fields_by_name['error'].message_type = _ERRORRESPONSE -_RESPONSE.fields_by_name['begin'].message_type = _BEGINBATCH -_RESPONSE.fields_by_name['point'].message_type = _POINT -_RESPONSE.fields_by_name['end'].message_type = _ENDBATCH -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['info']) -_RESPONSE.fields_by_name['info'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['init']) -_RESPONSE.fields_by_name['init'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['keepalive']) -_RESPONSE.fields_by_name['keepalive'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['snapshot']) -_RESPONSE.fields_by_name['snapshot'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['restore']) -_RESPONSE.fields_by_name['restore'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['error']) -_RESPONSE.fields_by_name['error'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['begin']) -_RESPONSE.fields_by_name['begin'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['point']) -_RESPONSE.fields_by_name['point'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -_RESPONSE.oneofs_by_name['message'].fields.append( - _RESPONSE.fields_by_name['end']) -_RESPONSE.fields_by_name['end'].containing_oneof = _RESPONSE.oneofs_by_name['message'] -DESCRIPTOR.message_types_by_name['InfoRequest'] = _INFOREQUEST -DESCRIPTOR.message_types_by_name['InfoResponse'] = _INFORESPONSE -DESCRIPTOR.message_types_by_name['OptionInfo'] = _OPTIONINFO -DESCRIPTOR.message_types_by_name['InitRequest'] = _INITREQUEST -DESCRIPTOR.message_types_by_name['Option'] = _OPTION -DESCRIPTOR.message_types_by_name['OptionValue'] = _OPTIONVALUE -DESCRIPTOR.message_types_by_name['InitResponse'] = _INITRESPONSE -DESCRIPTOR.message_types_by_name['SnapshotRequest'] = _SNAPSHOTREQUEST -DESCRIPTOR.message_types_by_name['SnapshotResponse'] = _SNAPSHOTRESPONSE -DESCRIPTOR.message_types_by_name['RestoreRequest'] = _RESTOREREQUEST -DESCRIPTOR.message_types_by_name['RestoreResponse'] = _RESTORERESPONSE -DESCRIPTOR.message_types_by_name['KeepaliveRequest'] = _KEEPALIVEREQUEST -DESCRIPTOR.message_types_by_name['KeepaliveResponse'] = _KEEPALIVERESPONSE -DESCRIPTOR.message_types_by_name['ErrorResponse'] = _ERRORRESPONSE -DESCRIPTOR.message_types_by_name['BeginBatch'] = _BEGINBATCH -DESCRIPTOR.message_types_by_name['Point'] = _POINT -DESCRIPTOR.message_types_by_name['EndBatch'] = _ENDBATCH -DESCRIPTOR.message_types_by_name['Request'] = _REQUEST -DESCRIPTOR.message_types_by_name['Response'] = _RESPONSE -DESCRIPTOR.enum_types_by_name['EdgeType'] = _EDGETYPE -DESCRIPTOR.enum_types_by_name['ValueType'] = _VALUETYPE -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -InfoRequest = _reflection.GeneratedProtocolMessageType('InfoRequest', (_message.Message,), { - 'DESCRIPTOR' : _INFOREQUEST, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.InfoRequest) - }) -_sym_db.RegisterMessage(InfoRequest) - -InfoResponse = _reflection.GeneratedProtocolMessageType('InfoResponse', (_message.Message,), { - - 'OptionsEntry' : _reflection.GeneratedProtocolMessageType('OptionsEntry', (_message.Message,), { - 'DESCRIPTOR' : _INFORESPONSE_OPTIONSENTRY, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.InfoResponse.OptionsEntry) - }) - , - 'DESCRIPTOR' : _INFORESPONSE, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.InfoResponse) - }) -_sym_db.RegisterMessage(InfoResponse) -_sym_db.RegisterMessage(InfoResponse.OptionsEntry) - -OptionInfo = _reflection.GeneratedProtocolMessageType('OptionInfo', (_message.Message,), { - 'DESCRIPTOR' : _OPTIONINFO, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.OptionInfo) - }) -_sym_db.RegisterMessage(OptionInfo) - -InitRequest = _reflection.GeneratedProtocolMessageType('InitRequest', (_message.Message,), { - 'DESCRIPTOR' : _INITREQUEST, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.InitRequest) - }) -_sym_db.RegisterMessage(InitRequest) - -Option = _reflection.GeneratedProtocolMessageType('Option', (_message.Message,), { - 'DESCRIPTOR' : _OPTION, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Option) - }) -_sym_db.RegisterMessage(Option) - -OptionValue = _reflection.GeneratedProtocolMessageType('OptionValue', (_message.Message,), { - 'DESCRIPTOR' : _OPTIONVALUE, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.OptionValue) - }) -_sym_db.RegisterMessage(OptionValue) - -InitResponse = _reflection.GeneratedProtocolMessageType('InitResponse', (_message.Message,), { - 'DESCRIPTOR' : _INITRESPONSE, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.InitResponse) - }) -_sym_db.RegisterMessage(InitResponse) - -SnapshotRequest = _reflection.GeneratedProtocolMessageType('SnapshotRequest', (_message.Message,), { - 'DESCRIPTOR' : _SNAPSHOTREQUEST, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.SnapshotRequest) - }) -_sym_db.RegisterMessage(SnapshotRequest) - -SnapshotResponse = _reflection.GeneratedProtocolMessageType('SnapshotResponse', (_message.Message,), { - 'DESCRIPTOR' : _SNAPSHOTRESPONSE, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.SnapshotResponse) - }) -_sym_db.RegisterMessage(SnapshotResponse) - -RestoreRequest = _reflection.GeneratedProtocolMessageType('RestoreRequest', (_message.Message,), { - 'DESCRIPTOR' : _RESTOREREQUEST, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.RestoreRequest) - }) -_sym_db.RegisterMessage(RestoreRequest) - -RestoreResponse = _reflection.GeneratedProtocolMessageType('RestoreResponse', (_message.Message,), { - 'DESCRIPTOR' : _RESTORERESPONSE, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.RestoreResponse) - }) -_sym_db.RegisterMessage(RestoreResponse) - -KeepaliveRequest = _reflection.GeneratedProtocolMessageType('KeepaliveRequest', (_message.Message,), { - 'DESCRIPTOR' : _KEEPALIVEREQUEST, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.KeepaliveRequest) - }) -_sym_db.RegisterMessage(KeepaliveRequest) - -KeepaliveResponse = _reflection.GeneratedProtocolMessageType('KeepaliveResponse', (_message.Message,), { - 'DESCRIPTOR' : _KEEPALIVERESPONSE, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.KeepaliveResponse) - }) -_sym_db.RegisterMessage(KeepaliveResponse) - -ErrorResponse = _reflection.GeneratedProtocolMessageType('ErrorResponse', (_message.Message,), { - 'DESCRIPTOR' : _ERRORRESPONSE, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.ErrorResponse) - }) -_sym_db.RegisterMessage(ErrorResponse) - -BeginBatch = _reflection.GeneratedProtocolMessageType('BeginBatch', (_message.Message,), { - - 'TagsEntry' : _reflection.GeneratedProtocolMessageType('TagsEntry', (_message.Message,), { - 'DESCRIPTOR' : _BEGINBATCH_TAGSENTRY, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.BeginBatch.TagsEntry) - }) - , - 'DESCRIPTOR' : _BEGINBATCH, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.BeginBatch) - }) -_sym_db.RegisterMessage(BeginBatch) -_sym_db.RegisterMessage(BeginBatch.TagsEntry) - -Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), { - - 'TagsEntry' : _reflection.GeneratedProtocolMessageType('TagsEntry', (_message.Message,), { - 'DESCRIPTOR' : _POINT_TAGSENTRY, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Point.TagsEntry) - }) - , - - 'FieldsDoubleEntry' : _reflection.GeneratedProtocolMessageType('FieldsDoubleEntry', (_message.Message,), { - 'DESCRIPTOR' : _POINT_FIELDSDOUBLEENTRY, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Point.FieldsDoubleEntry) - }) - , - - 'FieldsIntEntry' : _reflection.GeneratedProtocolMessageType('FieldsIntEntry', (_message.Message,), { - 'DESCRIPTOR' : _POINT_FIELDSINTENTRY, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Point.FieldsIntEntry) - }) - , - - 'FieldsStringEntry' : _reflection.GeneratedProtocolMessageType('FieldsStringEntry', (_message.Message,), { - 'DESCRIPTOR' : _POINT_FIELDSSTRINGENTRY, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Point.FieldsStringEntry) - }) - , - - 'FieldsBoolEntry' : _reflection.GeneratedProtocolMessageType('FieldsBoolEntry', (_message.Message,), { - 'DESCRIPTOR' : _POINT_FIELDSBOOLENTRY, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Point.FieldsBoolEntry) - }) - , - 'DESCRIPTOR' : _POINT, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Point) - }) -_sym_db.RegisterMessage(Point) -_sym_db.RegisterMessage(Point.TagsEntry) -_sym_db.RegisterMessage(Point.FieldsDoubleEntry) -_sym_db.RegisterMessage(Point.FieldsIntEntry) -_sym_db.RegisterMessage(Point.FieldsStringEntry) -_sym_db.RegisterMessage(Point.FieldsBoolEntry) - -EndBatch = _reflection.GeneratedProtocolMessageType('EndBatch', (_message.Message,), { - - 'TagsEntry' : _reflection.GeneratedProtocolMessageType('TagsEntry', (_message.Message,), { - 'DESCRIPTOR' : _ENDBATCH_TAGSENTRY, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.EndBatch.TagsEntry) - }) - , - 'DESCRIPTOR' : _ENDBATCH, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.EndBatch) - }) -_sym_db.RegisterMessage(EndBatch) -_sym_db.RegisterMessage(EndBatch.TagsEntry) - -Request = _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), { - 'DESCRIPTOR' : _REQUEST, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Request) - }) -_sym_db.RegisterMessage(Request) - -Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), { - 'DESCRIPTOR' : _RESPONSE, - '__module__' : 'udf_pb2' - # @@protoc_insertion_point(class_scope:agent.Response) - }) -_sym_db.RegisterMessage(Response) - - -DESCRIPTOR._options = None -_INFORESPONSE_OPTIONSENTRY._options = None -_BEGINBATCH_TAGSENTRY._options = None -_POINT_TAGSENTRY._options = None -_POINT_FIELDSDOUBLEENTRY._options = None -_POINT_FIELDSINTENTRY._options = None -_POINT_FIELDSSTRINGENTRY._options = None -_POINT_FIELDSBOOLENTRY._options = None -_ENDBATCH_TAGSENTRY._options = None +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\tudf.proto\x12\x05\x61gent\"\r\n\x0bInfoRequest\"\xc7\x01\n\x0cInfoResponse\x12\x1e\n\x05wants\x18\x01 \x01(\x0e\x32\x0f.agent.EdgeType\x12!\n\x08provides\x18\x02 \x01(\x0e\x32\x0f.agent.EdgeType\x12\x31\n\x07options\x18\x03 \x03(\x0b\x32 .agent.InfoResponse.OptionsEntry\x1a\x41\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.agent.OptionInfo:\x02\x38\x01\"2\n\nOptionInfo\x12$\n\nvalueTypes\x18\x01 \x03(\x0e\x32\x10.agent.ValueType\"M\n\x0bInitRequest\x12\x1e\n\x07options\x18\x01 \x03(\x0b\x32\r.agent.Option\x12\x0e\n\x06taskID\x18\x02 \x01(\t\x12\x0e\n\x06nodeID\x18\x03 \x01(\t\":\n\x06Option\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\"\n\x06values\x18\x02 \x03(\x0b\x32\x12.agent.OptionValue\"\xa6\x01\n\x0bOptionValue\x12\x1e\n\x04type\x18\x01 \x01(\x0e\x32\x10.agent.ValueType\x12\x13\n\tboolValue\x18\x02 \x01(\x08H\x00\x12\x12\n\x08intValue\x18\x03 \x01(\x03H\x00\x12\x15\n\x0b\x64oubleValue\x18\x04 \x01(\x01H\x00\x12\x15\n\x0bstringValue\x18\x05 \x01(\tH\x00\x12\x17\n\rdurationValue\x18\x06 \x01(\x03H\x00\x42\x07\n\x05value\".\n\x0cInitResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x11\n\x0fSnapshotRequest\"$\n\x10SnapshotResponse\x12\x10\n\x08snapshot\x18\x01 \x01(\x0c\"\"\n\x0eRestoreRequest\x12\x10\n\x08snapshot\x18\x01 \x01(\x0c\"1\n\x0fRestoreResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\" \n\x10KeepaliveRequest\x12\x0c\n\x04time\x18\x01 \x01(\x03\"!\n\x11KeepaliveResponse\x12\x0c\n\x04time\x18\x01 \x01(\x03\"\x1e\n\rErrorResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"\x9f\x01\n\nBeginBatch\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05group\x18\x02 \x01(\t\x12)\n\x04tags\x18\x03 \x03(\x0b\x32\x1b.agent.BeginBatch.TagsEntry\x12\x0c\n\x04size\x18\x04 \x01(\x03\x12\x0e\n\x06\x62yName\x18\x05 \x01(\x08\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf1\x04\n\x05Point\x12\x0c\n\x04time\x18\x01 \x01(\x03\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x03 \x01(\t\x12\x17\n\x0fretentionPolicy\x18\x04 \x01(\t\x12\r\n\x05group\x18\x05 \x01(\t\x12\x12\n\ndimensions\x18\x06 \x03(\t\x12$\n\x04tags\x18\x07 \x03(\x0b\x32\x16.agent.Point.TagsEntry\x12\x34\n\x0c\x66ieldsDouble\x18\x08 \x03(\x0b\x32\x1e.agent.Point.FieldsDoubleEntry\x12.\n\tfieldsInt\x18\t \x03(\x0b\x32\x1b.agent.Point.FieldsIntEntry\x12\x34\n\x0c\x66ieldsString\x18\n \x03(\x0b\x32\x1e.agent.Point.FieldsStringEntry\x12\x30\n\nfieldsBool\x18\x0c \x03(\x0b\x32\x1c.agent.Point.FieldsBoolEntry\x12\x0e\n\x06\x62yName\x18\x0b \x01(\x08\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x33\n\x11\x46ieldsDoubleEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01:\x02\x38\x01\x1a\x30\n\x0e\x46ieldsIntEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x03:\x02\x38\x01\x1a\x33\n\x11\x46ieldsStringEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x31\n\x0f\x46ieldsBoolEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"\x9b\x01\n\x08\x45ndBatch\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05group\x18\x02 \x01(\t\x12\x0c\n\x04tmax\x18\x03 \x01(\x03\x12\'\n\x04tags\x18\x04 \x03(\x0b\x32\x19.agent.EndBatch.TagsEntry\x12\x0e\n\x06\x62yName\x18\x05 \x01(\x08\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc3\x02\n\x07Request\x12\"\n\x04info\x18\x01 \x01(\x0b\x32\x12.agent.InfoRequestH\x00\x12\"\n\x04init\x18\x02 \x01(\x0b\x32\x12.agent.InitRequestH\x00\x12,\n\tkeepalive\x18\x03 \x01(\x0b\x32\x17.agent.KeepaliveRequestH\x00\x12*\n\x08snapshot\x18\x04 \x01(\x0b\x32\x16.agent.SnapshotRequestH\x00\x12(\n\x07restore\x18\x05 \x01(\x0b\x32\x15.agent.RestoreRequestH\x00\x12\"\n\x05\x62\x65gin\x18\x10 \x01(\x0b\x32\x11.agent.BeginBatchH\x00\x12\x1d\n\x05point\x18\x11 \x01(\x0b\x32\x0c.agent.PointH\x00\x12\x1e\n\x03\x65nd\x18\x12 \x01(\x0b\x32\x0f.agent.EndBatchH\x00\x42\t\n\x07message\"\xf0\x02\n\x08Response\x12#\n\x04info\x18\x01 \x01(\x0b\x32\x13.agent.InfoResponseH\x00\x12#\n\x04init\x18\x02 \x01(\x0b\x32\x13.agent.InitResponseH\x00\x12-\n\tkeepalive\x18\x03 \x01(\x0b\x32\x18.agent.KeepaliveResponseH\x00\x12+\n\x08snapshot\x18\x04 \x01(\x0b\x32\x17.agent.SnapshotResponseH\x00\x12)\n\x07restore\x18\x05 \x01(\x0b\x32\x16.agent.RestoreResponseH\x00\x12%\n\x05\x65rror\x18\x06 \x01(\x0b\x32\x14.agent.ErrorResponseH\x00\x12\"\n\x05\x62\x65gin\x18\x10 \x01(\x0b\x32\x11.agent.BeginBatchH\x00\x12\x1d\n\x05point\x18\x11 \x01(\x0b\x32\x0c.agent.PointH\x00\x12\x1e\n\x03\x65nd\x18\x12 \x01(\x0b\x32\x0f.agent.EndBatchH\x00\x42\t\n\x07message*!\n\x08\x45\x64geType\x12\n\n\x06STREAM\x10\x00\x12\t\n\x05\x42\x41TCH\x10\x01*D\n\tValueType\x12\x08\n\x04\x42OOL\x10\x00\x12\x07\n\x03INT\x10\x01\x12\n\n\x06\x44OUBLE\x10\x02\x12\n\n\x06STRING\x10\x03\x12\x0c\n\x08\x44URATION\x10\x04\x42\tZ\x07.;agentb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'udf_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'Z\007.;agent' + _INFORESPONSE_OPTIONSENTRY._options = None + _INFORESPONSE_OPTIONSENTRY._serialized_options = b'8\001' + _BEGINBATCH_TAGSENTRY._options = None + _BEGINBATCH_TAGSENTRY._serialized_options = b'8\001' + _POINT_TAGSENTRY._options = None + _POINT_TAGSENTRY._serialized_options = b'8\001' + _POINT_FIELDSDOUBLEENTRY._options = None + _POINT_FIELDSDOUBLEENTRY._serialized_options = b'8\001' + _POINT_FIELDSINTENTRY._options = None + _POINT_FIELDSINTENTRY._serialized_options = b'8\001' + _POINT_FIELDSSTRINGENTRY._options = None + _POINT_FIELDSSTRINGENTRY._serialized_options = b'8\001' + _POINT_FIELDSBOOLENTRY._options = None + _POINT_FIELDSBOOLENTRY._serialized_options = b'8\001' + _ENDBATCH_TAGSENTRY._options = None + _ENDBATCH_TAGSENTRY._serialized_options = b'8\001' + _EDGETYPE._serialized_start=2535 + _EDGETYPE._serialized_end=2568 + _VALUETYPE._serialized_start=2570 + _VALUETYPE._serialized_end=2638 + _INFOREQUEST._serialized_start=20 + _INFOREQUEST._serialized_end=33 + _INFORESPONSE._serialized_start=36 + _INFORESPONSE._serialized_end=235 + _INFORESPONSE_OPTIONSENTRY._serialized_start=170 + _INFORESPONSE_OPTIONSENTRY._serialized_end=235 + _OPTIONINFO._serialized_start=237 + _OPTIONINFO._serialized_end=287 + _INITREQUEST._serialized_start=289 + _INITREQUEST._serialized_end=366 + _OPTION._serialized_start=368 + _OPTION._serialized_end=426 + _OPTIONVALUE._serialized_start=429 + _OPTIONVALUE._serialized_end=595 + _INITRESPONSE._serialized_start=597 + _INITRESPONSE._serialized_end=643 + _SNAPSHOTREQUEST._serialized_start=645 + _SNAPSHOTREQUEST._serialized_end=662 + _SNAPSHOTRESPONSE._serialized_start=664 + _SNAPSHOTRESPONSE._serialized_end=700 + _RESTOREREQUEST._serialized_start=702 + _RESTOREREQUEST._serialized_end=736 + _RESTORERESPONSE._serialized_start=738 + _RESTORERESPONSE._serialized_end=787 + _KEEPALIVEREQUEST._serialized_start=789 + _KEEPALIVEREQUEST._serialized_end=821 + _KEEPALIVERESPONSE._serialized_start=823 + _KEEPALIVERESPONSE._serialized_end=856 + _ERRORRESPONSE._serialized_start=858 + _ERRORRESPONSE._serialized_end=888 + _BEGINBATCH._serialized_start=891 + _BEGINBATCH._serialized_end=1050 + _BEGINBATCH_TAGSENTRY._serialized_start=1007 + _BEGINBATCH_TAGSENTRY._serialized_end=1050 + _POINT._serialized_start=1053 + _POINT._serialized_end=1678 + _POINT_TAGSENTRY._serialized_start=1007 + _POINT_TAGSENTRY._serialized_end=1050 + _POINT_FIELDSDOUBLEENTRY._serialized_start=1473 + _POINT_FIELDSDOUBLEENTRY._serialized_end=1524 + _POINT_FIELDSINTENTRY._serialized_start=1526 + _POINT_FIELDSINTENTRY._serialized_end=1574 + _POINT_FIELDSSTRINGENTRY._serialized_start=1576 + _POINT_FIELDSSTRINGENTRY._serialized_end=1627 + _POINT_FIELDSBOOLENTRY._serialized_start=1629 + _POINT_FIELDSBOOLENTRY._serialized_end=1678 + _ENDBATCH._serialized_start=1681 + _ENDBATCH._serialized_end=1836 + _ENDBATCH_TAGSENTRY._serialized_start=1007 + _ENDBATCH_TAGSENTRY._serialized_end=1050 + _REQUEST._serialized_start=1839 + _REQUEST._serialized_end=2162 + _RESPONSE._serialized_start=2165 + _RESPONSE._serialized_end=2533 # @@protoc_insertion_point(module_scope) diff --git a/udf/agent/py/setup.py b/udf/agent/py/setup.py index a95f49464..b2adeba71 100644 --- a/udf/agent/py/setup.py +++ b/udf/agent/py/setup.py @@ -14,7 +14,7 @@ 'kapacitor.udf', ], install_requires=[ - "protobuf==3.15.0", + "protobuf==3.18.3", ], maintainer_email="support@influxdb.com", license="MIT", diff --git a/udf/agent/udf.pb.go b/udf/agent/udf.pb.go index 645170806..6020d6295 100644 --- a/udf/agent/udf.pb.go +++ b/udf/agent/udf.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.17.3 +// protoc v3.21.7 // source: udf.proto package agent