diff options
| -rw-r--r-- | .bazelrc | 3 | ||||
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | WORKSPACE | 4 | ||||
| -rw-r--r-- | bazel/go.bzl | 7 | ||||
| -rw-r--r-- | common/BUILD.bazel | 6 | ||||
| -rw-r--r-- | deps.bzl (renamed from bazel/deps.bzl) | 176 | ||||
| -rw-r--r-- | docs/internals/management.md | 5 | ||||
| -rw-r--r-- | go.mod | 5 | ||||
| -rw-r--r-- | go.sum | 57 | ||||
| -rw-r--r-- | manager/BUILD.bazel | 19 | ||||
| -rw-r--r-- | manager/lib/BUILD.bazel | 16 | ||||
| -rw-r--r-- | manager/lib/config.go | 10 | ||||
| -rw-r--r-- | manager/lib/main.go | 27 | ||||
| -rw-r--r-- | manager/lib/scheduler/BUILD.bazel | 12 | ||||
| -rw-r--r-- | manager/lib/scheduler/main.go | 100 | ||||
| -rw-r--r-- | manager/lib/services/BUILD.bazel | 9 | ||||
| -rw-r--r-- | manager/lib/services/status-server.go | 26 | ||||
| -rw-r--r-- | manager/main.go | 26 | ||||
| -rw-r--r-- | novactl/BUILD.bazel | 6 | ||||
| -rw-r--r-- | novactl/cmd/BUILD.bazel | 11 | 
20 files changed, 485 insertions, 42 deletions
@@ -1,3 +1,4 @@  startup --windows_enable_symlinks
  build --enable_runfiles
 -build --features=compiler_param_file
\ No newline at end of file +build --features=compiler_param_file
 +test --define docker_repo=_ --define docker_tag=_
\ No newline at end of file @@ -1,2 +1,2 @@  gazelle: -	bazel run //:gazelle -- update-repos -from_file=go.mod -to_macro=//bazel:deps.bzl%go_dependencies
\ No newline at end of file +	bazel run //:gazelle -- update-repos -build_file_name BUILD.bazel -from_file=go.mod -to_macro=deps.bzl%go_dependencies
\ No newline at end of file @@ -59,6 +59,10 @@ http_archive(  )  load("//bazel:utils.bzl", "get_toolchain_utils_protocolbuffers", "get_toolchain_utils_rules_pkg") +load("//:deps.bzl", "go_dependencies") + +# gazelle:repository_macro deps.bzl%go_dependencies +go_dependencies()  get_toolchain_utils_protocolbuffers() diff --git a/bazel/go.bzl b/bazel/go.bzl index b5616be..8469ca6 100644 --- a/bazel/go.bzl +++ b/bazel/go.bzl @@ -1,7 +1,7 @@  """  Utilities used by the workspace to load the golang toolchain  """ -load("//bazel:deps.bzl", "go_dependencies") +  load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")  load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") @@ -12,9 +12,6 @@ def load_golang_toolchains():      go_register_toolchains(version = "1.16.5")      go_rules_dependencies() - -    # Used to generate the go dependencies & build files -    go_dependencies()      gazelle_dependencies()      go_repository( @@ -23,4 +20,4 @@ def load_golang_toolchains():          importpath = "google.golang.org/grpc",          sum = "h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E=",          version = "v1.41.0", -    )
\ No newline at end of file +    ) diff --git a/common/BUILD.bazel b/common/BUILD.bazel index a8d06e1..868f591 100644 --- a/common/BUILD.bazel +++ b/common/BUILD.bazel @@ -20,8 +20,8 @@ go_library(      importpath = "github.com/discordnova/nova/common",      visibility = ["//visibility:public"],      deps = [ -        "@com_github_prometheus_client_golang//prometheus/promhttp:go_default_library", -        "@com_github_rs_zerolog//:go_default_library", -        "@com_github_rs_zerolog//log:go_default_library", +        "@com_github_prometheus_client_golang//prometheus/promhttp", +        "@com_github_rs_zerolog//:zerolog", +        "@com_github_rs_zerolog//log",      ],  ) diff --git a/bazel/deps.bzl b/deps.bzl index 53b85bd..3ade3f5 100644 --- a/bazel/deps.bzl +++ b/deps.bzl @@ -38,6 +38,12 @@ def go_dependencies():          version = "v0.0.0-20161002113705-648efa622239",      )      go_repository( +        name = "com_github_antihax_optional", +        importpath = "github.com/antihax/optional", +        sum = "h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=", +        version = "v1.0.0", +    ) +    go_repository(          name = "com_github_apache_thrift",          importpath = "github.com/apache/thrift",          sum = "h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=", @@ -109,6 +115,7 @@ def go_dependencies():          sum = "h1:Zfs6bX62wbP3QlbPGKUhqDw7SmNkOzY5bHZIYXYpR5g=",          version = "v0.9.0",      ) +      go_repository(          name = "com_github_burntsushi_toml",          importpath = "github.com/BurntSushi/toml", @@ -134,6 +141,13 @@ def go_dependencies():          version = "v0.2.1",      )      go_repository( +        name = "com_github_cespare_xxhash", +        importpath = "github.com/cespare/xxhash", +        sum = "h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=", +        version = "v1.1.0", +    ) + +    go_repository(          name = "com_github_cespare_xxhash_v2",          importpath = "github.com/cespare/xxhash/v2",          sum = "h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=", @@ -152,6 +166,19 @@ def go_dependencies():          version = "v0.3.4",      )      go_repository( +        name = "com_github_cncf_udpa_go", +        importpath = "github.com/cncf/udpa/go", +        sum = "h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M=", +        version = "v0.0.0-20201120205902-5459f2c99403", +    ) +    go_repository( +        name = "com_github_cncf_xds_go", +        importpath = "github.com/cncf/xds/go", +        sum = "h1:CevA8fI91PAnP8vpnXuB8ZYAZ5wqY86nAbxfgK8tWO4=", +        version = "v0.0.0-20210805033703-aa0b78936158", +    ) + +    go_repository(          name = "com_github_cockroachdb_datadriven",          importpath = "github.com/cockroachdb/datadriven",          sum = "h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y=", @@ -212,6 +239,13 @@ def go_dependencies():          version = "v3.2.0+incompatible",      )      go_repository( +        name = "com_github_dgryski_go_rendezvous", +        importpath = "github.com/dgryski/go-rendezvous", +        sum = "h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=", +        version = "v0.0.0-20200823014737-9f7001d12a5f", +    ) + +    go_repository(          name = "com_github_dustin_go_humanize",          importpath = "github.com/dustin/go-humanize",          sum = "h1:qk/FSDDxo05wdJH28W+p5yivv7LuLYLRXPPD8KQCtZs=", @@ -250,8 +284,8 @@ def go_dependencies():      go_repository(          name = "com_github_envoyproxy_go_control_plane",          importpath = "github.com/envoyproxy/go-control-plane", -        sum = "h1:4cmBvAEBNJaGARUEs3/suWRyfyBfhf7I60WBZq+bv2w=", -        version = "v0.9.1-0.20191026205805-5f8ba28d4473", +        sum = "h1:fP+fF0up6oPY49OrjPrhIJ8yQfdIM85NXMLkMg1EXVs=", +        version = "v0.9.10-0.20210907150352-cf90f659a021",      )      go_repository(          name = "com_github_envoyproxy_protoc_gen_validate", @@ -286,8 +320,8 @@ def go_dependencies():      go_repository(          name = "com_github_fsnotify_fsnotify",          importpath = "github.com/fsnotify/fsnotify", -        sum = "h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=", -        version = "v1.4.7", +        sum = "h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=", +        version = "v1.4.9",      )      go_repository(          name = "com_github_ghodss_yaml", @@ -332,12 +366,43 @@ def go_dependencies():          version = "v0.10.0",      )      go_repository( +        name = "com_github_go_kit_log", +        importpath = "github.com/go-kit/log", +        sum = "h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ=", +        version = "v0.1.0", +    ) +    go_repository(          name = "com_github_go_logfmt_logfmt",          importpath = "github.com/go-logfmt/logfmt",          sum = "h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=",          version = "v0.5.0",      )      go_repository( +        name = "com_github_go_redis_redis", +        importpath = "github.com/go-redis/redis", +        sum = "h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=", +        version = "v6.15.9+incompatible", +    ) +    go_repository( +        name = "com_github_go_redis_redis_v7", +        importpath = "github.com/go-redis/redis/v7", +        sum = "h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=", +        version = "v7.4.0", +    ) +    go_repository( +        name = "com_github_go_redis_redis_v8", +        importpath = "github.com/go-redis/redis/v8", +        sum = "h1:O7R8kajfkEg2BgSn+blItMi0j3T83ps5hwv86HtlSN4=", +        version = "v8.1.1", +    ) +    go_repository( +        name = "com_github_go_redsync_redsync_v4", +        importpath = "github.com/go-redsync/redsync/v4", +        sum = "h1:Z0AaOpoLvzfZwLK+3uCDHcTxOXck2juzumu1EPJwCUI=", +        version = "v4.4.1", +    ) + +    go_repository(          name = "com_github_go_sql_driver_mysql",          importpath = "github.com/go-sql-driver/mysql",          sum = "h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=", @@ -398,6 +463,13 @@ def go_dependencies():          version = "v0.0.0-20180518054509-2e65f85255db",      )      go_repository( +        name = "com_github_gomodule_redigo", +        importpath = "github.com/gomodule/redigo", +        sum = "h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k=", +        version = "v1.8.2", +    ) + +    go_repository(          name = "com_github_google_btree",          importpath = "github.com/google/btree",          sum = "h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=", @@ -424,8 +496,8 @@ def go_dependencies():      go_repository(          name = "com_github_google_uuid",          importpath = "github.com/google/uuid", -        sum = "h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=", -        version = "v1.0.0", +        sum = "h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=", +        version = "v1.1.2",      )      go_repository(          name = "com_github_gopherjs_gopherjs", @@ -466,8 +538,8 @@ def go_dependencies():      go_repository(          name = "com_github_grpc_ecosystem_grpc_gateway",          importpath = "github.com/grpc-ecosystem/grpc-gateway", -        sum = "h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI=", -        version = "v1.9.5", +        sum = "h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=", +        version = "v1.16.0",      )      go_repository(          name = "com_github_hashicorp_consul_api", @@ -508,8 +580,8 @@ def go_dependencies():      go_repository(          name = "com_github_hashicorp_go_multierror",          importpath = "github.com/hashicorp/go-multierror", -        sum = "h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=", -        version = "v1.0.0", +        sum = "h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=", +        version = "v1.1.0",      )      go_repository(          name = "com_github_hashicorp_go_net", @@ -860,6 +932,13 @@ def go_dependencies():          version = "v0.0.0-20200227124842-a10e7caefd8e",      )      go_repository( +        name = "com_github_nxadm_tail", +        importpath = "github.com/nxadm/tail", +        sum = "h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=", +        version = "v1.4.4", +    ) + +    go_repository(          name = "com_github_oklog_oklog",          importpath = "github.com/oklog/oklog",          sum = "h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk=", @@ -878,16 +957,23 @@ def go_dependencies():          version = "v0.0.0-20170122224234-a0225b3f23b5",      )      go_repository( +        name = "com_github_oneofone_xxhash", +        importpath = "github.com/OneOfOne/xxhash", +        sum = "h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=", +        version = "v1.2.2", +    ) + +    go_repository(          name = "com_github_onsi_ginkgo",          importpath = "github.com/onsi/ginkgo", -        sum = "h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=", -        version = "v1.7.0", +        sum = "h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=", +        version = "v1.14.1",      )      go_repository(          name = "com_github_onsi_gomega",          importpath = "github.com/onsi/gomega", -        sum = "h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=", -        version = "v1.4.3", +        sum = "h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=", +        version = "v1.10.2",      )      go_repository(          name = "com_github_op_go_logging", @@ -1018,8 +1104,8 @@ def go_dependencies():      go_repository(          name = "com_github_rogpeppe_fastuuid",          importpath = "github.com/rogpeppe/fastuuid", -        sum = "h1:gu+uRPtBe88sKxUCEXRoeCvVG90TJmwhiqRpvdhQFng=", -        version = "v0.0.0-20150106093220-6724a57986af", +        sum = "h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s=", +        version = "v1.2.0",      )      go_repository(          name = "com_github_rogpeppe_go_internal", @@ -1118,6 +1204,13 @@ def go_dependencies():          version = "v0.4.1",      )      go_repository( +        name = "com_github_spaolacci_murmur3", +        importpath = "github.com/spaolacci/murmur3", +        sum = "h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=", +        version = "v0.0.0-20180118202830-f09979ecbc72", +    ) + +    go_repository(          name = "com_github_spf13_cobra",          importpath = "github.com/spf13/cobra",          sum = "h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=", @@ -1154,6 +1247,13 @@ def go_dependencies():          version = "v1.7.0",      )      go_repository( +        name = "com_github_stvp_tempredis", +        importpath = "github.com/stvp/tempredis", +        sum = "h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM=", +        version = "v0.0.0-20181119212430-b82af8480203", +    ) + +    go_repository(          name = "com_github_tmc_grpc_websocket_proxy",          importpath = "github.com/tmc/grpc-websocket-proxy",          sum = "h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE=", @@ -1286,6 +1386,24 @@ def go_dependencies():          version = "v0.0.0-20191023171146-3cf2f69b5738",      )      go_repository( +        name = "io_etcd_go_etcd_api_v3", +        importpath = "go.etcd.io/etcd/api/v3", +        sum = "h1:GsV3S+OfZEOCNXdtNkBSR7kgLobAa/SO6tCxRa0GAYw=", +        version = "v3.5.0", +    ) +    go_repository( +        name = "io_etcd_go_etcd_client_pkg_v3", +        importpath = "go.etcd.io/etcd/client/pkg/v3", +        sum = "h1:2aQv6F436YnN7I4VbI8PPYrBhu+SmrTaADcf8Mi/6PU=", +        version = "v3.5.0", +    ) +    go_repository( +        name = "io_etcd_go_etcd_client_v3", +        importpath = "go.etcd.io/etcd/client/v3", +        sum = "h1:62Eh0XOro+rDwkrypAGDfgmNh5Joq+z+W9HZdlXMzek=", +        version = "v3.5.0", +    ) +    go_repository(          name = "io_k8s_sigs_yaml",          importpath = "sigs.k8s.io/yaml",          sum = "h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=", @@ -1298,6 +1416,19 @@ def go_dependencies():          version = "v0.22.2",      )      go_repository( +        name = "io_opentelemetry_go_otel", +        importpath = "go.opentelemetry.io/otel", +        sum = "h1:IN2tzQa9Gc4ZVKnTaMbPVcHjvzOdg5n9QfnmlqiET7E=", +        version = "v0.11.0", +    ) +    go_repository( +        name = "io_opentelemetry_go_proto_otlp", +        importpath = "go.opentelemetry.io/proto/otlp", +        sum = "h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8=", +        version = "v0.7.0", +    ) + +    go_repository(          name = "org_golang_google_api",          importpath = "google.golang.org/api",          sum = "h1:oJra/lMfmtm13/rgY/8i3MzjFWYXvQIAKjQ3HqofMk8=", @@ -1312,15 +1443,16 @@ def go_dependencies():      go_repository(          name = "org_golang_google_genproto",          importpath = "google.golang.org/genproto", -        sum = "h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=", -        version = "v0.0.0-20190819201941-24fa4b261c55", +        sum = "h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=", +        version = "v0.0.0-20200526211855-cb27e3aa2013",      )      go_repository(          name = "org_golang_google_grpc",          importpath = "google.golang.org/grpc", -        sum = "h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg=", -        version = "v1.26.0", +        sum = "h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E=", +        version = "v1.41.0",      ) +      go_repository(          name = "org_golang_google_protobuf",          importpath = "google.golang.org/protobuf", @@ -1360,8 +1492,8 @@ def go_dependencies():      go_repository(          name = "org_golang_x_oauth2",          importpath = "golang.org/x/oauth2", -        sum = "h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=", -        version = "v0.0.0-20190226205417-e64efc72b421", +        sum = "h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=", +        version = "v0.0.0-20200107190931-bf48bf16ab8d",      )      go_repository(          name = "org_golang_x_sync", diff --git a/docs/internals/management.md b/docs/internals/management.md new file mode 100644 index 0000000..7bff71b --- /dev/null +++ b/docs/internals/management.md @@ -0,0 +1,5 @@ +# Nova Internals - Management + +In order to run in multiple environments, Nova uses a scheduling system to balance shards between "cluster" instances. +Each cluster instance is in fact a gateway instance. All the management is handled in the "manager" component.  +The discord shards are dynamically scaled and restarted if needed.
\ No newline at end of file @@ -4,11 +4,14 @@ go 1.16  require (  	github.com/TwinProduction/go-color v1.0.0 +	github.com/buraksezer/consistent v0.9.0 // indirect +	github.com/cespare/xxhash v1.1.0 // indirect  	github.com/go-git/go-git/v5 v5.4.2 +	github.com/go-redsync/redsync/v4 v4.4.1 // indirect  	github.com/golang/protobuf v1.5.2 // indirect  	github.com/prometheus/client_golang v1.9.0  	github.com/rs/zerolog v1.23.0  	github.com/spf13/cobra v0.0.3  	golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect -	google.golang.org/grpc v1.26.0 // indirect +	google.golang.org/grpc v1.41.0  ) @@ -8,6 +8,8 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go  github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=  github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=  github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=  github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ=  github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=  github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s= @@ -31,6 +33,7 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2c  github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=  github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=  github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=  github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=  github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=  github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= @@ -57,12 +60,16 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=  github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=  github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=  github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/buraksezer/consistent v0.9.0 h1:Zfs6bX62wbP3QlbPGKUhqDw7SmNkOzY5bHZIYXYpR5g= +github.com/buraksezer/consistent v0.9.0/go.mod h1:6BrVajWq7wbKZlTOUPs/XVfR8c0maujuPowduSpZqmw=  github.com/casbin/casbin/v2 v2.1.2 h1:bTwon/ECRx9dwBy2ewRVr5OiqjeXSGiTUY74sDPQi/g=  github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=  github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=  github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=  github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=  github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=  github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=  github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=  github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec h1:EdRZT3IeKQmfCSrgo8SZ8V3MEnskuJP0wCYNpe+aiXo= @@ -70,7 +77,9 @@ github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4  github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=  github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=  github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M=  github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158 h1:CevA8fI91PAnP8vpnXuB8ZYAZ5wqY86nAbxfgK8tWO4=  github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=  github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y=  github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -94,6 +103,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c  github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=  github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=  github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=  github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4 h1:qk/FSDDxo05wdJH28W+p5yivv7LuLYLRXPPD8KQCtZs=  github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=  github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= @@ -112,6 +123,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473 h1:4  github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=  github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=  github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021 h1:fP+fF0up6oPY49OrjPrhIJ8yQfdIM85NXMLkMg1EXVs=  github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=  github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=  github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -125,6 +137,8 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCg  github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=  github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=  github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=  github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=  github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=  github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= @@ -146,6 +160,14 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9  github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=  github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=  github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= +github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.1.1 h1:O7R8kajfkEg2BgSn+blItMi0j3T83ps5hwv86HtlSN4= +github.com/go-redis/redis/v8 v8.1.1/go.mod h1:ysgGY09J/QeDYbu3HikWEIPCwaeOkuNoTgKayTEaEOw= +github.com/go-redsync/redsync/v4 v4.4.1 h1:Z0AaOpoLvzfZwLK+3uCDHcTxOXck2juzumu1EPJwCUI= +github.com/go-redsync/redsync/v4 v4.4.1/go.mod h1:QBOJAs1k8O6Eyrre4a++pxQgHe5eQ+HF56KuTVv+8Bs=  github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=  github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=  github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= @@ -182,6 +204,8 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw  github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=  github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=  github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= +github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=  github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=  github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=  github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -190,6 +214,7 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw  github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=  github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=  github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=  github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=  github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=  github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= @@ -198,6 +223,7 @@ github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA  github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=  github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=  github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=  github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=  github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=  github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -214,6 +240,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy  github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=  github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI=  github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=  github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=  github.com/hashicorp/consul/api v1.3.0 h1:HXNYlRkkM/t+Y/Yhxtwcy02dlYwIaoxzvxPnS+cqy78=  github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -229,6 +256,8 @@ github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqk  github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=  github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=  github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=  github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI=  github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=  github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= @@ -358,6 +387,8 @@ github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=  github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=  github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=  github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=  github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk=  github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=  github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= @@ -367,8 +398,17 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v  github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=  github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=  github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= +github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=  github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=  github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs= +github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=  github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=  github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=  github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= @@ -436,6 +476,7 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhD  github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=  github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af h1:gu+uRPtBe88sKxUCEXRoeCvVG90TJmwhiqRpvdhQFng=  github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s=  github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=  github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk=  github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -468,6 +509,8 @@ github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=  github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=  github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ=  github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=  github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=  github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=  github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= @@ -484,8 +527,11 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf  github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=  github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=  github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=  github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=  github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8=  github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE=  github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=  github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -505,6 +551,9 @@ go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=  go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=  go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=  go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/otel v0.11.0 h1:IN2tzQa9Gc4ZVKnTaMbPVcHjvzOdg5n9QfnmlqiET7E= +go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0= +go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8=  go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=  go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=  go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= @@ -556,6 +605,8 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR  golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=  golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=  golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=  golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=  golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=  golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -565,6 +616,7 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o  golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=  golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=  golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=  golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=  golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=  golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -589,11 +641,16 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w  golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=  golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/manager/BUILD.bazel b/manager/BUILD.bazel new file mode 100644 index 0000000..e82b5ed --- /dev/null +++ b/manager/BUILD.bazel @@ -0,0 +1,19 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") + +go_library( +    name = "manager_lib", +    srcs = ["main.go"], +    importpath = "github.com/discordnova/nova/manager", +    visibility = ["//visibility:private"], +    deps = [ +        "//manager/lib", +        "//manager/lib/scheduler", +        "@com_github_buraksezer_consistent//:consistent", +    ], +) + +go_binary( +    name = "manager", +    embed = [":manager_lib"], +    visibility = ["//visibility:public"], +) diff --git a/manager/lib/BUILD.bazel b/manager/lib/BUILD.bazel new file mode 100644 index 0000000..9e3be05 --- /dev/null +++ b/manager/lib/BUILD.bazel @@ -0,0 +1,16 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( +    name = "lib", +    srcs = [ +        "config.go", +        "main.go", +    ], +    importpath = "github.com/discordnova/nova/manager/lib", +    visibility = ["//visibility:public"], +    deps = [ +        "//common/management", +        "//manager/lib/services", +        "@org_golang_google_grpc//:go_default_library", +    ], +) diff --git a/manager/lib/config.go b/manager/lib/config.go new file mode 100644 index 0000000..07d0de9 --- /dev/null +++ b/manager/lib/config.go @@ -0,0 +1,10 @@ +package lib + + +type GrpcConfig struct { +	Server string +} + +type Config struct { +	Grpc GrpcConfig +} diff --git a/manager/lib/main.go b/manager/lib/main.go new file mode 100644 index 0000000..554b3fb --- /dev/null +++ b/manager/lib/main.go @@ -0,0 +1,27 @@ +package lib + +import ( +	"github.com/discordnova/nova/common/management" +	"github.com/discordnova/nova/manager/lib/services" +	"google.golang.org/grpc" +	"log" +	"net" +) + +func StartGrpcServices(config *Config) { +	lis, err := net.Listen("tcp", config.Grpc.Server) + +	if err != nil { +		log.Fatalf("failed to start the grpc services: %v", err) +	} +	var opts []grpc.ServerOption + +	grpcServer := grpc.NewServer(opts...) + +	management.RegisterManagementServiceServer(grpcServer, services.CreateStatusServerService()) + +	err = grpcServer.Serve(lis) +	if err != nil { +		log.Fatalf("failed to start the grpc server: %v", err) +	} +} diff --git a/manager/lib/scheduler/BUILD.bazel b/manager/lib/scheduler/BUILD.bazel new file mode 100644 index 0000000..1c202b1 --- /dev/null +++ b/manager/lib/scheduler/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( +    name = "scheduler", +    srcs = ["main.go"], +    importpath = "github.com/discordnova/nova/manager/lib/scheduler", +    visibility = ["//visibility:public"], +    deps = [ +        "@com_github_buraksezer_consistent//:consistent", +        "@com_github_cespare_xxhash//:xxhash", +    ], +) diff --git a/manager/lib/scheduler/main.go b/manager/lib/scheduler/main.go new file mode 100644 index 0000000..ef9c3b6 --- /dev/null +++ b/manager/lib/scheduler/main.go @@ -0,0 +1,100 @@ +package scheduler + +import ( +	"github.com/buraksezer/consistent" +	"github.com/cespare/xxhash" +	"log" +) + +// consistent package doesn't provide a default hashing function. +// You should provide a proper one to distribute keys/members uniformly. +type hasher struct{} + +func (h hasher) Sum64(data []byte) uint64 { +	// you should use a proper hash function for uniformity. +	return xxhash.Sum64(data) +} + +type State struct { +	Members []consistent.Member +	CurrentSize int +	MaxConcurrency int +} + +type Scheduler struct { +	state State +	hashRing *consistent.Consistent +} + +func CreateScheduler(state State) *Scheduler { +	config := consistent.Config{ +		Hasher:            hasher{}, +		PartitionCount:    271, +		ReplicationFactor: 20, +		Load:              1.25, +	} + +	return &Scheduler{ +		state: state, +		hashRing: consistent.New(state.Members, config), +	} +} + +// Scale changes the size of Discord shards +func (s *Scheduler) Scale(newScale int) { +	log.Printf("scaling from %d shards to %d shards", s.state.CurrentSize, newScale) +	// todo: take the scale mutex + +	// we should handle all the sessions restart +	// and the re-scheduling of the shards including rate-limiting +	// first, we remove all the shards instances from the clusters +	for i := 0; i < s.state.CurrentSize; i++ { +		// todo: call the rpc for stopping the shard on the given cluster +		cluster := s.hashRing.LocateKey([]byte{byte(i)}) +		log.Printf("sending stop shard to shard %d on cluster %s", i, cluster) +	} +	s.state.CurrentSize = newScale + + +	// after we stopped the shard, we re-start it with the new number of shards +	// since all the shard must be restarted after a scale operation +	// but before that, we need to allocate all the shards +	for i := 0; i < s.state.CurrentSize; i++ { +		cluster := s.hashRing.LocateKey([]byte{byte(i)}) +		// todo: call the rpc for allocate the shard on the given cluster +		log.Printf("sending allocate shard to shard %d on %s with [%d, %d] as sharding key", i, cluster, i, newScale) +	} + +	// we start the first shard, this represents the "pilot" shard which gives us the +	// required information, such as the max_concurrency. +	// todo: call the rpc to start the first shard + +	// according to the max_concurrency system, we must +	// start the shards sequentially. +	for i := 0; i < s.state.MaxConcurrency; i++ { +		log.Printf("starting bucket %d", i) +		for j := 0; j < newScale; j++ { +			// if the shard corresponds to the current starting bucket +			if j % s.state.MaxConcurrency == i { +				cluster := s.hashRing.LocateKey([]byte{byte(j)}) +				// todo: call the start rpc on the given cluster +				log.Printf("%d: sending the start command to the shard %d on the %s cluster", i, j, cluster) +			} +		} +	} + +	// todo: release the scale mutex +} + +// RemoveNode removes a cluster from the consistent hash ring and relocate the shards +func (s *Scheduler) RemoveNode() { + +} + +// AddNode adds a node to the consistent hash ring and relocate the shards +func (s *Scheduler) AddNode() {} + +// GetShardLocation returns the supposed name of the cluster containing a Shard +func (s *Scheduler) GetShardLocation() string { +	return "" +} diff --git a/manager/lib/services/BUILD.bazel b/manager/lib/services/BUILD.bazel new file mode 100644 index 0000000..5bb70d6 --- /dev/null +++ b/manager/lib/services/BUILD.bazel @@ -0,0 +1,9 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( +    name = "services", +    srcs = ["status-server.go"], +    importpath = "github.com/discordnova/nova/manager/lib/services", +    visibility = ["//visibility:public"], +    deps = ["//common/management"], +) diff --git a/manager/lib/services/status-server.go b/manager/lib/services/status-server.go new file mode 100644 index 0000000..2634edc --- /dev/null +++ b/manager/lib/services/status-server.go @@ -0,0 +1,26 @@ +package services + +import ( +	"context" +	"fmt" +	"github.com/discordnova/nova/common/management" +) + +type statusServer struct { +	management.UnimplementedManagementServiceServer +} + +func CreateStatusServerService() management.ManagementServiceServer { +	return &statusServer{} +} + +func (s *statusServer) GetGlobalClusterStatus(context context.Context, _ *management.Empty) (*management.GlobalClusterStatusResponse, error) { +	return nil, fmt.Errorf("not implemented") +} +func (s *statusServer) GetClusterStatus(context context.Context, request *management.ClusterStatusRequest) (*management.ClusterStatusResponse, error) { +	return nil, fmt.Errorf("not implemented") +} + +func (s *statusServer) GetShardStatus(context context.Context, request *management.ShardStatusRequest) (*management.ShardStatusResponse, error) { +	return nil, fmt.Errorf("not implemented") +} diff --git a/manager/main.go b/manager/main.go new file mode 100644 index 0000000..296a25b --- /dev/null +++ b/manager/main.go @@ -0,0 +1,26 @@ +package main + +import ( +	"github.com/buraksezer/consistent" +	"github.com/discordnova/nova/manager/lib" +	"github.com/discordnova/nova/manager/lib/scheduler" +	"log" +) + +type myMember string + +func (m myMember) String() string { +	return string(m) +} + +func main () { +	scheduler.CreateScheduler(scheduler.State{ +		Members:        []consistent.Member{myMember("cluster1"), myMember("cluster2"), myMember("cluster3"), myMember("cluster4")}, +		CurrentSize:    2, +		MaxConcurrency: 5, +	}).Scale(10) +	log.Printf("starting grpc") +	lib.StartGrpcServices(&lib.Config{ +		Grpc: lib.GrpcConfig{Server: "0.0.0.0:8053"}, +	}) +}
\ No newline at end of file diff --git a/novactl/BUILD.bazel b/novactl/BUILD.bazel index 9519b4f..2731bce 100644 --- a/novactl/BUILD.bazel +++ b/novactl/BUILD.bazel @@ -10,9 +10,9 @@ go_library(      visibility = ["//visibility:private"],      deps = [          "//novactl/cmd", -        "@com_github_rs_zerolog//:go_default_library", -        "@com_github_rs_zerolog//log:go_default_library", -        "@com_github_spf13_cobra//:go_default_library", +        "@com_github_rs_zerolog//:zerolog", +        "@com_github_rs_zerolog//log", +        "@com_github_spf13_cobra//:cobra",      ],  ) diff --git a/novactl/cmd/BUILD.bazel b/novactl/cmd/BUILD.bazel index 2c54129..9c83733 100644 --- a/novactl/cmd/BUILD.bazel +++ b/novactl/cmd/BUILD.bazel @@ -13,11 +13,10 @@ go_library(          "//common",          "//common/management",          "//novactl/lib", -        "@com_github_go_git_go_git_v5//:go_default_library", -        "@com_github_go_git_go_git_v5//config:go_default_library", -        "@com_github_olekukonko_tablewriter//:go_default_library", -        "@com_github_rs_zerolog//log:go_default_library", -        "@com_github_spf13_cobra//:go_default_library", -        "@com_github_twinproduction_go_color//:go_default_library", +        "@com_github_go_git_go_git_v5//:go-git", +        "@com_github_go_git_go_git_v5//config", +        "@com_github_olekukonko_tablewriter//:tablewriter", +        "@com_github_rs_zerolog//log", +        "@com_github_spf13_cobra//:cobra",      ],  )  | 
