diff --git a/.gitignore b/.gitignore index efd437c8..259ec826 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ venv/ benchmark terraform*.zip -config vendor bin diff --git a/README_ydb.md b/README_ydb.md new file mode 100644 index 00000000..6d301762 --- /dev/null +++ b/README_ydb.md @@ -0,0 +1,20 @@ +# YDB-specific configuration for stroppy tests + +To support the authentication methods specific to YDB Managed Service, stroppy uses the additional environment variables when running in *client* mode only: +* `YDB_SERVICE_ACCOUNT_KEY_FILE_CREDENTIALS` - the path to the service account key file. When configured, the key file is used to authenticate the connection. +* `YDB_METADATA_CREDENTIALS` - when set to `1`, the service account key associated with the Cloud compute instance is used to authenticate the connection. +* `YDB_ACCESS_TOKEN_CREDENTIALS` - YDB access token. When configured, the access token is passed as is to authenticate the connection. +* `YDB_TLS_CERTIFICATES_FILE` - PEM-encoded file with custom TLS certificate(s) to be used for GRPCS connections. + +In addition, there are the following YDB-specific environment variables: +* `YDB_STROPPY_PARTITIONS_COUNT` - [`AUTO_PARTITIONING_MIN_PARTITIONS_COUNT`](https://ydb.tech/en/docs/concepts/datamodel/table#auto_partitioning_partition_size_mb) setting value for `account` and `transfer` tables. This setting only affects the `pop` operation mode. +* `YDB_STROPPY_PARTITIONS_SIZE` - [`AUTO_PARTITIONING_PARTITION_SIZE_MB`](https://ydb.tech/en/docs/concepts/datamodel/table#auto_partitioning_min_partitions_count) setting value for `account` and `transfer` tables. This setting only affects the `pop` operation mode. +* `YDB_STROPPY_HASH_TRANSFER_ID` - when set to `1`, the actual value of `transfer_id` field in the `transfer` table is replaced with its SHA-1 hash code (Base-64 encoded). This setting only affects the `pay` operation mode. + +Typical "client" operation modes command examples: + +```bash +export YDB_DB='grpc://stroppy:passw0rd@ycydb-d1:2136?database=/Root/testdb' +./stroppy pop --dbtype ydb --url "$YDB_DB" -n 1000000 -w 8000 --run-type client +./stroppy pay --dbtype ydb --url "$YDB_DB" -n 10000000 -w 8000 --run-type client +``` \ No newline at end of file diff --git a/cmd/stroppy/commands/deploy.go b/cmd/stroppy/commands/deploy.go index 91675f60..4713d195 100644 --- a/cmd/stroppy/commands/deploy.go +++ b/cmd/stroppy/commands/deploy.go @@ -164,7 +164,8 @@ func newDeployCommand(settings *config.Settings) *cobra.Command { deployCmd.PersistentFlags().BoolVarP( &settings.DatabaseSettings.Sharded, - "sharded", "", + "sharded", + "", false, "Use to populate accounts in sharded MongoDB cluster. "+ "Default false - populate accounts in MongoDB replicasets cluster", diff --git a/cmd/stroppy/commands/pay.go b/cmd/stroppy/commands/pay.go index 46bc49bf..0a714765 100644 --- a/cmd/stroppy/commands/pay.go +++ b/cmd/stroppy/commands/pay.go @@ -30,22 +30,15 @@ func newPayCommand(settings *config.Settings) *cobra.Command { }, Run: func(cmd *cobra.Command, args []string) { - statistics.StatsSetTotal(settings.DatabaseSettings.Count) + statistics.StatsSetTotal(int(settings.DatabaseSettings.Count)) if settings.EnableProfile { go func() { llog.Infoln(http.ListenAndServe("localhost:6060", nil)) }() } - if settings.TestSettings.UseCloudStroppy && settings.TestSettings.RunAsPod { - llog.Fatalf("use-cloud-stroppy and run-as-pod flags specified at the same time") - } - - if settings.Local && settings.TestSettings.RunAsPod { - llog.Fatalf("--local and --run-as-pod flags specified at the same time") - } - if settings.TestSettings.UseCloudStroppy { + if settings.TestSettings.IsController() { //nolint sh, err := deployment.LoadState(settings) if err != nil { llog.Fatalf("deployment load state failed: %v", err) @@ -96,7 +89,7 @@ func newPayCommand(settings *config.Settings) *cobra.Command { }, } - payCmd.PersistentFlags().IntVarP(&settings.DatabaseSettings.Count, + payCmd.PersistentFlags().Uint64VarP(&settings.DatabaseSettings.Count, "count", "n", settings.DatabaseSettings.Count, "Number of transfers to make") @@ -121,10 +114,12 @@ func newPayCommand(settings *config.Settings) *cobra.Command { settings.TestSettings.KubernetesMasterAddress, "kubernetes master address") - payCmd.PersistentFlags().BoolVarP(&settings.TestSettings.RunAsPod, - "run-as-pod", "", - false, - "run stroppy as in pod statement") + payCmd.PersistentFlags().StringVarP( + &settings.TestSettings.RunType, + "run-type", "", + "controller", + "set troppy run type [controller, client, or local]", + ) return payCmd } diff --git a/cmd/stroppy/commands/pop.go b/cmd/stroppy/commands/pop.go index 6c0aefc6..51795d59 100644 --- a/cmd/stroppy/commands/pop.go +++ b/cmd/stroppy/commands/pop.go @@ -30,7 +30,7 @@ func newPopCommand(settings *config.Settings) *cobra.Command { }, Run: func(cmd *cobra.Command, args []string) { - statistics.StatsSetTotal(settings.DatabaseSettings.Count) + statistics.StatsSetTotal(int(settings.DatabaseSettings.Count)) if settings.EnableProfile { go func() { @@ -38,15 +38,7 @@ func newPopCommand(settings *config.Settings) *cobra.Command { }() } - if settings.TestSettings.UseCloudStroppy && settings.TestSettings.RunAsPod { - llog.Fatalf("--use-cloud-stroppy and --run-as-pod flags specified at the same time") - } - - if settings.Local && settings.TestSettings.RunAsPod { - llog.Fatalf("--local and --run-as-pod flags specified at the same time") - } - - if settings.TestSettings.UseCloudStroppy { + if settings.TestSettings.IsController() { //nolint sh, err := deployment.LoadState(settings) if err != nil { llog.Fatalf("deployment load state failed: %v", err) @@ -62,7 +54,7 @@ func newPopCommand(settings *config.Settings) *cobra.Command { } if err = dbPayload.Connect(); err != nil { - llog.Fatalf("failed to connec to to cluster: %v", err) + llog.Fatalf("failed to connect to cluster: %v", err) } err = dbPayload.StartStatisticsCollect(settings.DatabaseSettings.StatInterval) @@ -86,16 +78,11 @@ func newPopCommand(settings *config.Settings) *cobra.Command { }, } - popCmd.PersistentFlags().IntVarP(&settings.DatabaseSettings.Count, + popCmd.PersistentFlags().Uint64VarP(&settings.DatabaseSettings.Count, "count", "n", settings.DatabaseSettings.Count, "Number of accounts to create") - popCmd.PersistentFlags().BoolVarP(&settings.TestSettings.RunAsPod, - "run-as-pod", "", - false, - "run stroppy as in pod statement") - popCmd.PersistentFlags().StringVarP(&settings.TestSettings.KubernetesMasterAddress, "kube-master-addr", "k", settings.TestSettings.KubernetesMasterAddress, @@ -106,5 +93,12 @@ func newPopCommand(settings *config.Settings) *cobra.Command { false, "Use to populate accounts in sharded MongoDB cluster. Default false - populate accounts in MongoDB replicasets cluster") + popCmd.PersistentFlags().StringVarP( + &settings.TestSettings.RunType, + "run-type", "", + "controller", + "set troppy run type [controller, client, or local]", + ) + return popCmd } diff --git a/cmd/stroppy/commands/root.go b/cmd/stroppy/commands/root.go index 6d1ba3ea..e311efe5 100644 --- a/cmd/stroppy/commands/root.go +++ b/cmd/stroppy/commands/root.go @@ -13,7 +13,7 @@ import ( func Execute() { settings := config.DefaultSettings() dbSettings := settings.DatabaseSettings - statistics.StatsSetTotal(dbSettings.Count) + statistics.StatsSetTotal(int(dbSettings.Count)) rootCmd := &cobra.Command{ Use: "stroppy [pop|pay|deploy|shell]", @@ -45,10 +45,6 @@ bandwidth along the way.`, settings.UseChaos, "install and run chaos-mesh on target cluster") - rootCmd.PersistentFlags().BoolVar(&settings.Local, "local", - settings.Local, - "operate with local cluster") - rootCmd.PersistentFlags().StringVarP(&settings.ChaosParameter, "chaos-parameter", "c", settings.ChaosParameter, "specify chaos parameter of an free form") @@ -96,8 +92,9 @@ than we saved during DB population process (that is achieved if brm > 1). The recommended range of brm is from 1.01 to 1.1. The default value of banRangeMultipluer is 1.1.`) - rootCmd.PersistentFlags().IntVarP(&settings.DatabaseSettings.Workers, - "workers", "w", + rootCmd.PersistentFlags().Uint64VarP(&settings.DatabaseSettings.Workers, + "workers", + "w", settings.DatabaseSettings.Workers, "Number of workers, 4 * NumCPU if not set.") @@ -105,15 +102,12 @@ The default value of banRangeMultipluer is 1.1.`) "stat-interval", "s", settings.DatabaseSettings.StatInterval, "interval by seconds for gettings db stats. Only fdb yet.") - rootCmd.PersistentFlags().IntVar(&settings.DatabaseSettings.ConnectPoolSize, + rootCmd.PersistentFlags().Uint64Var( + &settings.DatabaseSettings.ConnectPoolSize, "pool-size", settings.DatabaseSettings.ConnectPoolSize, - "count of connection in db pool. Equal workers count by default.") - - rootCmd.PersistentFlags().BoolVarP(&settings.TestSettings.UseCloudStroppy, - "enable-profilier", "", - false, - "specify to use pprof for diagnostic") + "count of connection in db pool. Equal workers count by default.", + ) rootCmd.AddCommand(newPopCommand(settings), newPayCommand(settings), diff --git a/go.mod b/go.mod index 7469a3e6..07f5fb13 100644 --- a/go.mod +++ b/go.mod @@ -15,11 +15,11 @@ require ( github.com/jackc/pgconn v1.9.0 github.com/jackc/pgerrcode v0.0.0-20201024163028-a0d42d470451 github.com/jackc/pgx/v4 v4.12.0 - github.com/mittwald/go-helm-client v0.11.3 + github.com/mittwald/go-helm-client v0.11.5 github.com/olekukonko/tablewriter v0.0.5 github.com/pkg/errors v0.9.1 github.com/sethvargo/go-password v0.2.0 - github.com/sirupsen/logrus v1.8.1 + github.com/sirupsen/logrus v1.9.0 github.com/spenczar/tdigest v2.1.0+incompatible github.com/spf13/cobra v1.5.0 github.com/stretchr/testify v1.8.0 @@ -27,62 +27,60 @@ require ( github.com/tidwall/gjson v1.8.1 github.com/ydb-platform/ydb-go-genproto v0.0.0-20220922065549-66df47a830ba github.com/ydb-platform/ydb-go-sdk-auth-environ v0.1.2 - github.com/ydb-platform/ydb-go-sdk/v3 v3.38.2 + github.com/ydb-platform/ydb-go-sdk/v3 v3.40.1 github.com/ydb-platform/ydb-kubernetes-operator v0.0.0-20220913070254-59c84ccfc365 github.com/zalando/postgres-operator v1.6.3 github.com/zclconf/go-cty v1.9.0 go.mongodb.org/mongo-driver v1.7.1 - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e + golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b gopkg.in/inf.v0 v0.9.1 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.10.0 + helm.sh/helm/v3 v3.10.2 k8s.io/api v0.25.2 k8s.io/apimachinery v0.25.2 k8s.io/client-go v0.25.2 - k8s.io/kubectl v0.25.0 + k8s.io/kubectl v0.25.2 sigs.k8s.io/yaml v1.3.0 ) require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/BurntSushi/toml v1.1.0 // indirect + github.com/BurntSushi/toml v1.2.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.1.1 // indirect github.com/Masterminds/sprig/v3 v3.2.2 // indirect github.com/Masterminds/squirrel v1.5.3 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/agext/levenshtein v1.2.1 // indirect github.com/apenella/go-common-utils/data v0.0.0-20210528133155-34ba915e28c8 // indirect github.com/apenella/go-common-utils/error v0.0.0-20210528133155-34ba915e28c8 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect - github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect + github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect - github.com/containerd/containerd v1.6.6 // indirect + github.com/containerd/containerd v1.6.8 // indirect github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.17+incompatible // indirect + github.com/docker/cli v20.10.18+incompatible // indirect github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.17+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect + github.com/docker/docker v20.10.18+incompatible // indirect + github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/emicklei/go-restful/v3 v3.8.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.13.0 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-errors/errors v1.1.1 // indirect + github.com/go-errors/errors v1.4.2 // indirect github.com/go-gorp/gorp/v3 v3.0.2 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -91,18 +89,18 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.3 // indirect - github.com/google/btree v1.0.1 // indirect + github.com/google/btree v1.1.2 // indirect github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.8 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gosuri/uitable v0.0.4 // indirect - github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect + github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/huandu/xstrings v1.3.2 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/imdario/mergo v0.3.13 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -114,23 +112,23 @@ require ( github.com/jonboulle/clockwork v0.2.2 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.13.6 // indirect + github.com/klauspost/compress v1.15.11 // indirect github.com/kr/text v0.2.0 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/lib/pq v1.10.6 // indirect + github.com/lib/pq v1.10.7 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect @@ -138,26 +136,26 @@ require ( github.com/motomux/pretty v0.0.0-20161209205251-b2aad2c9a95d // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect + github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.50.0 // indirect - github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_golang v1.13.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rubenv/sql-migrate v1.1.2 // indirect - github.com/russross/blackfriday v1.5.2 // indirect - github.com/shopspring/decimal v1.2.0 // indirect - github.com/spf13/cast v1.4.1 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect + github.com/rivo/uniseg v0.4.2 // indirect + github.com/rubenv/sql-migrate v1.2.0 // indirect + github.com/russross/blackfriday v1.6.0 // indirect + github.com/shopspring/decimal v1.3.1 // indirect + github.com/spf13/cast v1.5.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tidwall/match v1.0.3 // indirect github.com/tidwall/pretty v1.1.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.0.2 // indirect github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xlab/treeprint v1.1.0 // indirect @@ -165,29 +163,30 @@ require ( github.com/ydb-platform/ydb-go-yc v0.8.3 // indirect github.com/ydb-platform/ydb-go-yc-metadata v0.5.2 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect - golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect - golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + go.etcd.io/etcd/api/v3 v3.5.4 // indirect + go.starlark.net v0.0.0-20220928063852-5fccb4daaf6d // indirect + golang.org/x/net v0.0.0-20221004154528-8021a29435af // indirect + golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 // indirect + golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 + golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec // indirect + golang.org/x/term v0.0.0-20220919170432-7a66f970e087 // indirect golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect + golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect - google.golang.org/grpc v1.47.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/genproto v0.0.0-20220930163606-c98284e70a91 // indirect + google.golang.org/grpc v1.49.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/vmihailenco/msgpack.v2 v2.9.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiextensions-apiserver v0.25.0 // indirect - k8s.io/apiserver v0.25.0 // indirect - k8s.io/cli-runtime v0.25.0 // indirect - k8s.io/component-base v0.25.0 // indirect - k8s.io/klog/v2 v2.70.1 // indirect - k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect - k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect + k8s.io/apiextensions-apiserver v0.25.2 // indirect + k8s.io/apiserver v0.25.2 // indirect + k8s.io/cli-runtime v0.25.2 // indirect + k8s.io/component-base v0.25.2 // indirect + k8s.io/klog/v2 v2.80.1 // indirect + k8s.io/kube-openapi v0.0.0-20220928191237-829ce0c27909 // indirect + k8s.io/utils v0.0.0-20220922133306-665eaaec4324 // indirect oras.land/oras-go v1.2.0 // indirect sigs.k8s.io/controller-runtime v0.13.0 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect diff --git a/go.sum b/go.sum index bc5f5510..58427f3e 100644 --- a/go.sum +++ b/go.sum @@ -59,8 +59,8 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= +github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -69,24 +69,21 @@ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6 github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= -github.com/Microsoft/hcsshim v0.9.3 h1:k371PzBuRrz2b+ebGuI2nVgVhgsVX60jMfSw80NECxo= +github.com/Microsoft/hcsshim v0.9.4 h1:mnUj0ivWy6UzbB1uLFqKR6F+ZyiDc7j4iGgHTpO+5+I= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -131,8 +128,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.36.29/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= @@ -185,8 +182,8 @@ github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMe github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= -github.com/containerd/containerd v1.6.6 h1:xJNPhbrmz8xAMDNoVjHy9YHtWwEQNS+CDkcIRh7t8Y0= -github.com/containerd/containerd v1.6.6/go.mod h1:ZoP1geJldzCVY3Tonoz7b1IXk8rIX0Nltt5QE4OMNk0= +github.com/containerd/containerd v1.6.8 h1:h4dOFDwzHmqFEP754PgfgTeVXFnLiRc6kiqC7tplDJs= +github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -211,7 +208,6 @@ github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -219,23 +215,24 @@ github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27N github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/distribution/distribution/v3 v3.0.0-20220526142353-ffbd94cbe269 h1:hbCT8ZPPMqefiAWD2ZKjn7ypokIGViTvBBg/ExLSdCk= -github.com/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32PaqRpvoEkKBy5M= -github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.18+incompatible h1:f/GQLsVpo10VvToRay2IraVA1wHz9KktZyjev3SIVDU= +github.com/docker/cli v20.10.18+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= +github.com/docker/docker v20.10.18+incompatible h1:SN84VYXTBNGn92T/QwIRPlum9zfemfitN7pbsp26WSc= +github.com/docker/docker v20.10.18+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= +github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= @@ -249,8 +246,8 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7fo github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= -github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -269,8 +266,8 @@ github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCv github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= @@ -280,6 +277,7 @@ github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= @@ -289,8 +287,9 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.1.1 h1:ljK/pL5ltg3qoN+OtN6yCv9HWSfMwxSx90GJCZQxYNg= github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -300,9 +299,11 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -329,8 +330,8 @@ github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -353,8 +354,8 @@ github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= @@ -462,8 +463,8 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -478,8 +479,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -524,8 +525,9 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -568,10 +570,11 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -668,8 +671,8 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -678,8 +681,8 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= @@ -699,8 +702,8 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= @@ -715,8 +718,8 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= @@ -730,8 +733,8 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -739,22 +742,25 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= +github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= +github.com/mitchellh/cli v1.1.4/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -762,8 +768,8 @@ github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -772,16 +778,16 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mittwald/go-helm-client v0.11.3 h1:x1HcdPkWO8F+vSdUIrrz0MYO8vlSAwTOzTv2v+LfDC8= -github.com/mittwald/go-helm-client v0.11.3/go.mod h1:KPQlej7swowdlqncc4RGLStZuhgX5J+2KKxRY2mR4uo= +github.com/mittwald/go-helm-client v0.11.5 h1:/JN527oqrJzGMLgbGYPSjv1p/hYpPlAmKHaSrawLS/8= +github.com/mittwald/go-helm-client v0.11.5/go.mod h1:tjtO6LwGQA4VT3h3xPEbdhNYEhqd4OdRQkFZWvZVr1k= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= +github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -830,8 +836,8 @@ github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= +github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -875,8 +881,9 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= +github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -892,8 +899,9 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -903,26 +911,30 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/r3labs/diff v1.1.0/go.mod h1:7WjXasNzi0vJetRcB/RqNl5dlIsmXcTTLmF5IoH6Xig= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= +github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rubenv/sql-migrate v1.1.2 h1:9M6oj4e//owVVHYrFISmY9LBRw6gzkCNmD9MV36tZeQ= -github.com/rubenv/sql-migrate v1.1.2/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/rubenv/sql-migrate v1.2.0 h1:fOXMPLMd41sK7Tg75SXDec15k3zg5WNV6SjuDRiNfcU= +github.com/rubenv/sql-migrate v1.2.0/go.mod h1:Z5uVnq7vrIrPmHbVFfR4YLHRZquxeHpckCnRq0P/K9Y= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -935,8 +947,9 @@ github.com/sethvargo/go-password v0.2.0 h1:BTDl4CC/gjf/axHMaDQtw507ogrXLci6XRiLc github.com/sethvargo/go-password v0.2.0/go.mod h1:Ym4Mr9JXLBycr02MFuVQ/0JHidNetSgbzutTr3zsYXE= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -944,8 +957,9 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -958,8 +972,8 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= @@ -1021,8 +1035,9 @@ github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= @@ -1039,8 +1054,8 @@ github.com/ydb-platform/ydb-go-genproto v0.0.0-20220922065549-66df47a830ba/go.mo github.com/ydb-platform/ydb-go-sdk-auth-environ v0.1.2 h1:EYSI1kulnHb0H0zt3yOw4cRj4ABMSMGwNe43D+fX7e4= github.com/ydb-platform/ydb-go-sdk-auth-environ v0.1.2/go.mod h1:Xfjce+VMU9yJVr1lj60yK2fFPWjB4jr/4cp3K7cjzi4= github.com/ydb-platform/ydb-go-sdk/v3 v3.25.3/go.mod h1:PFizF/vJsdAgEwjK3DVSBD52kdmRkWfSIS2q2pA+e88= -github.com/ydb-platform/ydb-go-sdk/v3 v3.38.2 h1:SbrZWu21pteBjZBLDQwJz1LgcJCC6D3kcQurAmpFTF8= -github.com/ydb-platform/ydb-go-sdk/v3 v3.38.2/go.mod h1:SOpOg3nIQ7kT337LvWGNjfdpTQmFEeHXDqY/huSu+Xc= +github.com/ydb-platform/ydb-go-sdk/v3 v3.40.1 h1:6a/yMcXT+ZpybYsGvEpFSsOdQlbqtArycUqY7U1Yd1w= +github.com/ydb-platform/ydb-go-sdk/v3 v3.40.1/go.mod h1:hJqWSE2NZ2o2c9geHtRJee+xwiHgEfQX9koBZPLTfHY= github.com/ydb-platform/ydb-go-yc v0.8.3 h1:92UUUMsfvtMl6mho8eQ9lbkiPrF3a9CT+RrVRAKNRwo= github.com/ydb-platform/ydb-go-yc v0.8.3/go.mod h1:zUolAFGzJ5XG8uwiseTLr9Lapm7L7hdVdZgLSuv9FXE= github.com/ydb-platform/ydb-go-yc-metadata v0.5.2 h1:nMtixUijP0Z7iHJNT9fOL+dbmEzZxqU6Xk87ll7hqXg= @@ -1074,6 +1089,8 @@ 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.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -1092,8 +1109,8 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= +go.starlark.net v0.0.0-20220928063852-5fccb4daaf6d h1:aF+anaRVZu22kdETjLavnIn/cvD+arhmik6vMU3joW4= +go.starlark.net v0.0.0-20220928063852-5fccb4daaf6d/go.mod h1:kIVgS18CjmEC3PqMd5kaJSGEifyV/CeB9x506ZJ1Vbk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1141,8 +1158,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b h1:huxqepDufQpLLIRXiVkTvnxrzJlpwmIWAObmcCcUFr0= +golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1228,9 +1245,11 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220420153159-1850ba15e1be/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221004154528-8021a29435af h1:wv66FM3rLZGPdxpYL+ApnDe2HzHcTFta3z5nsc13wI4= +golang.org/x/net v0.0.0-20221004154528-8021a29435af/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1244,8 +1263,9 @@ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 h1:lxqLZaMad/dJHMFZH0NiNpiEZI/nhgWhe4wgzpE+MuA= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= 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= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1258,8 +1278,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 h1:cu5kTvlzcw1Q5S9f5ip1/cpiB4nXvw1XYzFPGgzLUOY= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1291,7 +1311,6 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1337,16 +1356,19 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec h1:BkDtF2Ih9xZ7le9ndzTA7KJow28VbQW3odyk/8drmuI= +golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220919170432-7a66f970e087 h1:tPwmk4vmvVCMdr98VgL4JH+qZxPL8fqlUOHnyOM8N3w= +golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1363,8 +1385,8 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1523,8 +1545,8 @@ google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxH google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220208230804-65c12eb4c068/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220930163606-c98284e70a91 h1:Ezh2cpcnP5Rq60sLensUsFnxh7P6513NLvNtCm9iyJ4= +google.golang.org/genproto v0.0.0-20220930163606-c98284e70a91/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1555,9 +1577,9 @@ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1571,8 +1593,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1610,14 +1633,15 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -helm.sh/helm/v3 v3.10.0 h1:y/MYONZ/bsld9kHwqgBX2uPggnUr5hahpjwt9/jrHlI= -helm.sh/helm/v3 v3.10.0/go.mod h1:paPw0hO5KVfrCMbi1M8+P8xdfBri3IiJiVKATZsFR94= +helm.sh/helm/v3 v3.10.2 h1:2PmN9NgmqTn5pswfL5Kh2LxOKjkmh0hxKLe6/J0yUY4= +helm.sh/helm/v3 v3.10.2/go.mod h1:CXOcs02AYvrlPMWARNYNRgf2rNP7gLJQsi/Ubd4EDrI= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1632,18 +1656,18 @@ k8s.io/api v0.25.2 h1:v6G8RyFcwf0HR5jQGIAYlvtRNrxMJQG1xJzaSeVnIS8= k8s.io/api v0.25.2/go.mod h1:qP1Rn4sCVFwx/xIhe+we2cwBLTXNcheRyYXwajonhy0= k8s.io/apiextensions-apiserver v0.18.3/go.mod h1:TMsNGs7DYpMXd+8MOCX8KzPOCx8fnZMoIGB24m03+JE= k8s.io/apiextensions-apiserver v0.20.6/go.mod h1:qO8YMqeMmZH+lV21LUNzV41vfpoE9QVAJRA+MNqj0mo= -k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= -k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= +k8s.io/apiextensions-apiserver v0.25.2 h1:8uOQX17RE7XL02ngtnh3TgifY7EhekpK+/piwzQNnBo= +k8s.io/apiextensions-apiserver v0.25.2/go.mod h1:iRwwRDlWPfaHhuBfQ0WMa5skdQfrE18QXJaJvIDLvE8= k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= k8s.io/apimachinery v0.25.2 h1:WbxfAjCx+AeN8Ilp9joWnyJ6xu9OMeS/fsfjK/5zaQs= k8s.io/apimachinery v0.25.2/go.mod h1:hqqA1X0bsgsxI6dXsJ4HnNTBOmJNxyPp8dw3u2fSHwA= k8s.io/apiserver v0.18.3/go.mod h1:tHQRmthRPLUtwqsOnJJMoI8SW3lnoReZeE861lH8vUw= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.25.0 h1:8kl2ifbNffD440MyvHtPaIz1mw4mGKVgWqM0nL+oyu4= -k8s.io/apiserver v0.25.0/go.mod h1:BKwsE+PTC+aZK+6OJQDPr0v6uS91/HWxX7evElAH6xo= -k8s.io/cli-runtime v0.25.0 h1:XBnTc2Fi+w818jcJGzhiJKQuXl8479sZ4FhtV5hVJ1Q= -k8s.io/cli-runtime v0.25.0/go.mod h1:bHOI5ZZInRHhbq12OdUiYZQN8ml8aKZLwQgt9QlLINw= +k8s.io/apiserver v0.25.2 h1:YePimobk187IMIdnmsMxsfIbC5p4eX3WSOrS9x6FEYw= +k8s.io/apiserver v0.25.2/go.mod h1:30r7xyQTREWCkG2uSjgjhQcKVvAAlqoD+YyrqR6Cn+I= +k8s.io/cli-runtime v0.25.2 h1:XOx+SKRjBpYMLY/J292BHTkmyDffl/qOx3YSuFZkTuc= +k8s.io/cli-runtime v0.25.2/go.mod h1:OQx3+/0st6x5YpkkJQlEWLC73V0wHsOFMC1/roxV8Oc= k8s.io/client-go v0.18.3/go.mod h1:4a/dpQEvzAhT1BbuWW09qvIaGw6Gbu1gZYiQZIi1DMw= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= k8s.io/client-go v0.25.2 h1:SUPp9p5CwM0yXGQrwYurw9LWz+YtMwhWd0GqOsSiefo= @@ -1652,8 +1676,8 @@ k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8 k8s.io/code-generator v0.20.6/go.mod h1:i6FmG+QxaLxvJsezvZp0q/gAEzzOz3U53KFibghWToU= k8s.io/component-base v0.18.3/go.mod h1:bp5GzGR0aGkYEfTj+eTY0AN/vXTgkJdQXjNTTVUaa3k= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= -k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= +k8s.io/component-base v0.25.2 h1:Nve/ZyHLUBHz1rqwkjXm/Re6IniNa5k7KgzxZpTfSQY= +k8s.io/component-base v0.25.2/go.mod h1:90W21YMr+Yjg7MX+DohmZLzjsBtaxQDDwaX4YxDkl60= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= @@ -1664,18 +1688,18 @@ k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= -k8s.io/kubectl v0.25.0 h1:/Wn1cFqo8ik3iee1EvpxYre3bkWsGLXzLQI6uCCAkQc= -k8s.io/kubectl v0.25.0/go.mod h1:n16ULWsOl2jmQpzt2o7Dud1t4o0+Y186ICb4O+GwKAU= +k8s.io/kube-openapi v0.0.0-20220928191237-829ce0c27909 h1:q/70bz7C1/LGuQu/JBX7Fpi55CwcCts/wbvlehe0RRo= +k8s.io/kube-openapi v0.0.0-20220928191237-829ce0c27909/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/kubectl v0.25.2 h1:2993lTeVimxKSWx/7z2PiJxUILygRa3tmC4QhFaeioA= +k8s.io/kubectl v0.25.2/go.mod h1:eoBGJtKUj7x38KXelz+dqVtbtbKwCqyKzJWmBHU0prg= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220922133306-665eaaec4324 h1:i+xdFemcSNuJvIfBlaYuXgRondKxK4z4prVPKzEaelI= +k8s.io/utils v0.0.0-20220922133306-665eaaec4324/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.0 h1:yoKosVIbsPoFMqAIFHTnrmOuafHal+J/r+I5bdbVWu4= oras.land/oras-go v1.2.0/go.mod h1:pFNs7oHp2dYsYMSS82HaX5l4mpnGO7hbpPN6EWH2ltc= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/internal/deployment/constants.go b/internal/deployment/constants.go index 05a5fc78..44d085ce 100644 --- a/internal/deployment/constants.go +++ b/internal/deployment/constants.go @@ -24,9 +24,20 @@ execute command for set environment variables KUBECONFIG before using: stroppyBinaryPath = "/usr/local/bin/stroppy" stroppyHomePath = "/home/stroppy" - //nolint - addToHosts = ` + //nolint + addToHosts = ` %s prometheus.cluster.picodata.io %s status.cluster.picodata.io ` ) + +const ( + pgDefaultURI = "postgres://stroppy:stroppy@acid-postgres-cluster/stroppy?sslmode=disable" + fdbDefultURI = "fdb.cluster" + mongoDefaultURI = "mongodb://stroppy:stroppy@sample-cluster-name-mongos" + + ".default.svc.cluster.local/admin?ssl=false" + + crDefaultURI = "postgres://stroppy:stroppy@/stroppy?sslmode=disable" + cartDefaultURI = "http://routers:8081" + ydbDefaultURI = "grpc://stroppy-ydb-database-grpc:2135/root/stroppy-ydb-database" +) diff --git a/internal/deployment/deploy.go b/internal/deployment/deploy.go index 767f5a6e..522431b1 100644 --- a/internal/deployment/deploy.go +++ b/internal/deployment/deploy.go @@ -122,13 +122,21 @@ func (sh *shell) prepareEngine() error { sh.state.InstanceAddresses = instanceAddresses sh.state.Subnet = sh.tf.Provider.GetSubnet() - sh.state.Settings.DatabaseSettings.Workers = int( - sh.state.NodesInfo.GetFirstMaster().Resources.CPU * 4, //nolint - ) + if sh.state.Settings.DatabaseSettings.Workers == 0 { + llog.Debugln("Number of workers defined for db test is: 0") + + //nolint + databaseTestWorkers := sh.state.NodesInfo.GetFirstMaster().Resources.CPU * uint64(4) + sh.state.Settings.DatabaseSettings.Workers = databaseTestWorkers + + llog.Debugf( + "Set the number of workers defined for db test to: %d\n", databaseTestWorkers, + ) + } // string var (like `remote` or `local`) which will be used to create ssh the client commandClientType := engineSsh.RemoteClient - if sh.state.Settings.Local { + if sh.state.Settings.TestSettings.IsLocal() { commandClientType = engineSsh.LocalClient } diff --git a/internal/deployment/shell.go b/internal/deployment/shell.go index 15e87809..ccb5c8b3 100644 --- a/internal/deployment/shell.go +++ b/internal/deployment/shell.go @@ -24,6 +24,8 @@ type Shell interface { } func LoadState(settings *config.Settings) (shell Shell, err error) { + llog.Traceln("Start loading shell state") + sh := createShell(settings) if err = sh.LoadState(); err != nil { return @@ -135,18 +137,17 @@ out: } func (sh *shell) RunRemotePayTest() (err error) { - settings := sh.state.Settings.DatabaseSettings - var beginTime, endTime int64 - if beginTime, endTime, err = sh.executeRemotePay(settings); err != nil { + + if beginTime, endTime, err = sh.executeRemotePay(); err != nil { return } monImagesArchName := fmt.Sprintf("%v_pay_%v_%v_zipfian_%v_%v.tar.gz", - settings.DBType, - settings.Count, - settings.BanRangeMultiplier, - settings.Zipfian, + sh.state.Settings.DatabaseSettings.DBType, + sh.state.Settings.DatabaseSettings.Count, + sh.state.Settings.DatabaseSettings.BanRangeMultiplier, + sh.state.Settings.DatabaseSettings.Zipfian, time.Now().Format(dateFormat)) // таймаут, чтобы не получать пустое место на графиках @@ -166,18 +167,17 @@ func (sh *shell) RunRemotePayTest() (err error) { } func (sh *shell) RunRemotePopTest() (err error) { - settings := sh.state.Settings.DatabaseSettings - var beginTime, endTime int64 - if beginTime, endTime, err = sh.executeRemotePop(settings); err != nil { + + if beginTime, endTime, err = sh.executeRemotePop(); err != nil { return } monImagesArchName := fmt.Sprintf("%v_pop_%v_%v_zipfian_%v_%v.tar.gz", - settings.DBType, - settings.Count, - settings.BanRangeMultiplier, - settings.Zipfian, + sh.state.Settings.DatabaseSettings.DBType, + sh.state.Settings.DatabaseSettings.Count, + sh.state.Settings.DatabaseSettings.BanRangeMultiplier, + sh.state.Settings.DatabaseSettings.Zipfian, time.Now().Format(dateFormat)) // таймаут, чтобы не получать пустое место на графиках diff --git a/internal/deployment/tools.go b/internal/deployment/tools.go index 5e89650c..244a8a99 100644 --- a/internal/deployment/tools.go +++ b/internal/deployment/tools.go @@ -6,11 +6,13 @@ package deployment import ( "fmt" - "io/ioutil" + "os" + "path" "path/filepath" "strings" "time" + "github.com/pkg/errors" llog "github.com/sirupsen/logrus" "gitlab.com/picodata/stroppy/pkg/engine/stroppy" @@ -19,37 +21,39 @@ import ( "github.com/ansel1/merry" "github.com/tidwall/gjson" "gitlab.com/picodata/stroppy/pkg/database/cluster" - "gitlab.com/picodata/stroppy/pkg/database/config" ) const dateFormat = "02-01-2006_15_04_05" //nolint:nonamedreturns // should be fixed in future -func (sh *shell) executeRemotePay( - settings *config.DatabaseSettings, -) (beginTime, endTime int64, err error) { - llog.Debugf("DBURL: %s", settings.DBURL) +func (sh *shell) executeRemotePay() (beginTime, endTime int64, err error) { + llog.Debugf("DBURL: %s", sh.state.Settings.DatabaseSettings.DBURL) payTestCommand := []string{ stroppyBinaryPath, "pay", "--dir", stroppyHomePath, - "--run-as-pod", - "--url", fmt.Sprintf("%v", settings.DBURL), + "--run-type", "client", + "--url", sh.state.Settings.DatabaseSettings.DBURL, "--check", - "--count", fmt.Sprintf("%v", settings.Count), - "-r", fmt.Sprintf("%v", settings.BanRangeMultiplier), - "-w", fmt.Sprintf("%v", settings.Workers), + "--count", fmt.Sprintf("%v", sh.state.Settings.DatabaseSettings.Count), + "-r", fmt.Sprintf("%v", sh.state.Settings.DatabaseSettings.BanRangeMultiplier), + "-w", fmt.Sprintf("%v", sh.state.Settings.DatabaseSettings.Workers), "--dbtype", sh.state.Settings.DatabaseSettings.DBType, "--log-level", sh.state.Settings.LogLevel, } llog.Tracef("Stroppy remote command '%s'", strings.Join(payTestCommand, " ")) - logFileName := fmt.Sprintf("%v_pay_%v_%v_zipfian_%v_%v.log", - settings.DBType, settings.Count, settings.BanRangeMultiplier, - settings.Zipfian, time.Now().Format(dateFormat)) + logFileName := fmt.Sprintf( + "%v_pay_%v_%v_zipfian_%v_%v.log", + sh.state.Settings.DatabaseSettings.DBType, + sh.state.Settings.DatabaseSettings.Count, + sh.state.Settings.DatabaseSettings.BanRangeMultiplier, + sh.state.Settings.DatabaseSettings.Zipfian, + time.Now().Format(dateFormat), + ) beginTime, endTime, err = sh.k.ExecuteRemoteCommand( stroppy.StroppyClientPodName, @@ -67,19 +71,16 @@ func (sh *shell) executeRemotePay( // executePay - выполнить тест переводов внутри удаленного пода stroppy func (sh *shell) executePay(shellState *state.State) error { - var ( - settings *config.DatabaseSettings - err error - ) + var err error - if settings, err = sh.readDatabaseConfig("pay"); err != nil { + if err = sh.readDatabaseConfig("pay"); err != nil { return merry.Prepend(err, "failed to read config") } var beginTime, endTime int64 - if sh.state.Settings.TestSettings.UseCloudStroppy { - if beginTime, endTime, err = sh.executeRemotePay(settings); err != nil { + if sh.state.Settings.TestSettings.IsController() { + if beginTime, endTime, err = sh.executeRemotePay(); err != nil { return merry.Prepend(err, "failed to executeRemotePay") } } else { @@ -91,9 +92,14 @@ func (sh *shell) executePay(shellState *state.State) error { } llog.Infof("pay test start time: '%d', end time: '%d'", beginTime, endTime) - monImagesArchName := fmt.Sprintf("%v_pay_%v_%v_zipfian_%v_%v.tar.gz", - settings.DBType, settings.Count, settings.BanRangeMultiplier, - settings.Zipfian, time.Now().Format(dateFormat)) + monImagesArchName := fmt.Sprintf( + "%v_pay_%v_%v_zipfian_%v_%v.tar.gz", + sh.state.Settings.DatabaseSettings.DBType, + sh.state.Settings.DatabaseSettings.Count, + sh.state.Settings.DatabaseSettings.BanRangeMultiplier, + sh.state.Settings.DatabaseSettings.Zipfian, + time.Now().Format(dateFormat), + ) // таймаут, чтобы не получать пустое место на графиках time.Sleep(20 * time.Second) @@ -113,24 +119,21 @@ func (sh *shell) executePay(shellState *state.State) error { // executePop - выполнить загрузку счетов в указанную БД внутри удаленного пода stroppy func (sh *shell) executePop(shellState *state.State) error { - var ( - settings *config.DatabaseSettings - err error - ) + var err error - if settings, err = sh.readDatabaseConfig("pop"); err != nil { + if err = sh.readDatabaseConfig("pop"); err != nil { return merry.Prepend(err, "failed to read config") } llog.Debugf( "Stroppy executed on remote host: %v", - sh.state.Settings.TestSettings.UseCloudStroppy, + sh.state.Settings.TestSettings.IsController(), ) var beginTime, endTime int64 - if sh.state.Settings.TestSettings.UseCloudStroppy { - if beginTime, endTime, err = sh.executeRemotePop(settings); err != nil { + if sh.state.Settings.TestSettings.IsController() { + if beginTime, endTime, err = sh.executeRemotePop(); err != nil { return merry.Prepend(err, "failed to executeRemotePop") } } else { @@ -143,9 +146,14 @@ func (sh *shell) executePop(shellState *state.State) error { llog.Infof("Pop test start time: '%d', end time: '%d'", beginTime, endTime) - monImagesArchName := fmt.Sprintf("%v_pop_%v_%v_zipfian_%v_%v.tar.gz", - settings.DBType, settings.Count, settings.BanRangeMultiplier, - settings.Zipfian, time.Now().Format(dateFormat)) + monImagesArchName := fmt.Sprintf( + "%v_pop_%v_%v_zipfian_%v_%v.tar.gz", + sh.state.Settings.DatabaseSettings.DBType, + sh.state.Settings.DatabaseSettings.Count, + sh.state.Settings.DatabaseSettings.BanRangeMultiplier, + sh.state.Settings.DatabaseSettings.Zipfian, + time.Now().Format(dateFormat), + ) // таймаут, чтобы не получать пустое место на графиках time.Sleep(20 * time.Second) @@ -164,34 +172,37 @@ func (sh *shell) executePop(shellState *state.State) error { } //nolint:nonamedreturns // should be fixed in future -func (sh *shell) executeRemotePop( - settings *config.DatabaseSettings, -) (beginTime, endTime int64, err error) { - llog.Debugf("DBURL: %s", settings.DBURL) +func (sh *shell) executeRemotePop() (beginTime, endTime int64, err error) { + llog.Debugf("DBURL: %s", sh.state.Settings.DatabaseSettings.DBURL) popTestCommand := []string{ stroppyBinaryPath, "pop", "--dir", stroppyHomePath, - "--run-as-pod", - "--url", settings.DBURL, - "--count", fmt.Sprintf("%v", settings.Count), - "-r", fmt.Sprintf("%v", settings.BanRangeMultiplier), - "-w", fmt.Sprintf("%v", settings.Workers), + "--run-type", "client", + "--url", sh.state.Settings.DatabaseSettings.DBURL, + "--count", fmt.Sprintf("%v", sh.state.Settings.DatabaseSettings.Count), + "-r", fmt.Sprintf("%v", sh.state.Settings.DatabaseSettings.BanRangeMultiplier), + "-w", fmt.Sprintf("%v", sh.state.Settings.DatabaseSettings.Workers), "--dbtype", sh.state.Settings.DatabaseSettings.DBType, "--log-level", sh.state.Settings.LogLevel, } llog.Tracef("Stroppy remote command '%s'", strings.Join(popTestCommand, " ")) - if settings.Sharded { + if sh.state.Settings.DatabaseSettings.Sharded { popTestCommand = append(popTestCommand, "sharded") } - logFileName := fmt.Sprintf("%v_pop_%v_%v_zipfian_%v_%v.log", - settings.DBType, settings.Count, settings.BanRangeMultiplier, - settings.Zipfian, time.Now().Format(dateFormat)) + logFileName := fmt.Sprintf( + "%v_pop_%v_%v_zipfian_%v_%v.log", + sh.state.Settings.DatabaseSettings.DBType, + sh.state.Settings.DatabaseSettings.Count, + sh.state.Settings.DatabaseSettings.BanRangeMultiplier, + sh.state.Settings.DatabaseSettings.Zipfian, + time.Now().Format(dateFormat), + ) if beginTime, endTime, err = sh.k.ExecuteRemoteCommand( stroppy.StroppyClientPodName, @@ -208,63 +219,76 @@ func (sh *shell) executeRemotePop( // readDatabaseConfig // прочитать конфигурационный файл test_config.json -func (sh *shell) readDatabaseConfig(cmdType string) (settings *config.DatabaseSettings, err error) { - var data []byte +func (sh *shell) readDatabaseConfig(cmdType string) error { + var ( + err error + data []byte + ) llog.Debugf( "Expected test config file path %s", filepath.Join(sh.workingDirectory, testConfDir, configFileName), ) - configFilePath := filepath.Join(sh.workingDirectory, testConfDir, configFileName) - if data, err = ioutil.ReadFile(configFilePath); err != nil { - err = merry.Prepend(err, "failed to read config file") - return + if data, err = os.ReadFile(path.Join( + sh.state.Settings.WorkingDirectory, + testConfDir, + configFileName, + )); err != nil { + return errors.Wrap(err, "failed to read config file") } - settings = config.DatabaseDefaults() - settings.BanRangeMultiplier = gjson.Parse(string(data)).Get("banRangeMultiplier").Float() - settings.DBType = sh.state.Settings.DatabaseSettings.DBType + sh.state.Settings.DatabaseSettings.BanRangeMultiplier = gjson.Parse(string(data)). + Get("banRangeMultiplier"). + Float() switch sh.state.Settings.DatabaseSettings.DBType { case cluster.Postgres: - settings.DBURL = "postgres://stroppy:stroppy@acid-postgres-cluster/stroppy?sslmode=disable" - + sh.state.Settings.DatabaseSettings.DBURL = pgDefaultURI case cluster.Foundation: - settings.DBURL = "fdb.cluster" - + sh.state.Settings.DatabaseSettings.DBURL = fdbDefultURI case cluster.MongoDB: - settings.DBURL = "mongodb://stroppy:stroppy@sample-cluster-name-mongos.default.svc.cluster.local/admin?ssl=false" - + sh.state.Settings.DatabaseSettings.DBURL = mongoDefaultURI case cluster.Cockroach: - settings.DBURL = "postgres://stroppy:stroppy@/stroppy?sslmode=disable" - + sh.state.Settings.DatabaseSettings.DBURL = crDefaultURI case cluster.Cartridge: - settings.DBURL = "http://routers:8081" - + sh.state.Settings.DatabaseSettings.DBURL = cartDefaultURI case cluster.YandexDB: - settings.DBURL = "grpc://stroppy-ydb-database-grpc:2135/root/stroppy-ydb-database" - + sh.state.Settings.DatabaseSettings.DBURL = ydbDefaultURI default: - err = merry.Errorf("unknown db type '%s'", sh.state.Settings.DatabaseSettings.DBType) - return + return errors.Errorf("unknown db type '%s'", sh.state.Settings.DatabaseSettings.DBType) } switch cmdType { case "pop": - settings.Count = int(gjson.Parse(string(data)).Get("cmd.0").Get("pop").Get("count").Int()) + sh.state.Settings.DatabaseSettings.Count = gjson.Parse(string(data)). + Get("cmd.0"). + Get("pop"). + Get("count"). + Uint() case "pay": - settings.Count = int( - gjson.Parse(string(data)).Get("cmd.1").Get("pay").Get("count").Int(), - ) - settings.Check = gjson.Parse(string(data)).Get("cmd.1").Get("pay").Get("Check").Bool() - settings.Zipfian = gjson.Parse(string(data)). + sh.state.Settings.DatabaseSettings.Count = gjson.Parse(string(data)). + Get("cmd.1"). + Get("pay"). + Get("count"). + Uint() + + sh.state.Settings.DatabaseSettings.Check = gjson.Parse(string(data)). + Get("cmd.1"). + Get("pay"). + Get("Check"). + Bool() + sh.state.Settings.DatabaseSettings.Zipfian = gjson.Parse(string(data)). Get("cmd.1"). Get("pay"). Get("zipfian"). Bool() - settings.Oracle = gjson.Parse(string(data)).Get("cmd.1").Get("pay").Get("oracle").Bool() + sh.state.Settings.DatabaseSettings.Oracle = gjson.Parse(string(data)). + Get("cmd.1"). + Get("pay"). + Get("oracle"). + Bool() } - return + return nil } diff --git a/internal/payload/builtin_tx_client.go b/internal/payload/builtin_tx_client.go index 6c16a552..4d218e0c 100644 --- a/internal/payload/builtin_tx_client.go +++ b/internal/payload/builtin_tx_client.go @@ -91,9 +91,13 @@ func (c *ClientBasicTx) MakeAtomicTransfer(t *model.Transfer, clientId uuid.UUID Code: 1009, }) || errors.Is(err, fdb.Error{ Code: 1007, - }) || errors.Is(err, cluster.ErrCockroachTxClosed) || errors.Is(err, cluster.ErrCockroachUnexpectedEOF) || errors.Is(err, mongo.CommandError{ - Code: 133, - }) || errors.Is(err, cluster.ErrTxRollback) || + }) || + errors.Is(err, cluster.ErrCockroachTxClosed) || + errors.Is(err, cluster.ErrCockroachUnexpectedEOF) || + errors.Is(err, mongo.CommandError{ //nolint + Code: 133, //nolint + }) || + errors.Is(err, cluster.ErrTxRollback) || mongo.IsNetworkError(err) || // временная мера до стабилизации mongo mongo.IsTimeout(err) || @@ -137,7 +141,7 @@ func (c *ClientBasicTx) MakeAtomicTransfer(t *model.Transfer, clientId uuid.UUID func payWorkerBuiltinTx( settings *config.DatabaseSettings, - nTransfers int, + nTransfers uint64, zipfian bool, dbCluster CustomTxTransfer, oracle *database.Oracle, @@ -155,7 +159,8 @@ func payWorkerBuiltinTx( } randSource.Init(clusterSettings.Count, clusterSettings.Seed, settings.BanRangeMultiplier) - for i := 0; i < nTransfers; { + + for i := uint64(0); i < nTransfers; { //nolint t := new(model.Transfer) t.InitRandomTransfer(&randSource, zipfian) cookie := statistics.StatsRequestStart() @@ -190,7 +195,7 @@ func payBuiltinTx( // is recovery needed for builtin? Maybe after x retries for Tx // TODO: implement recovery - for i := 0; i < settings.Workers; i++ { + for i := uint64(0); i < settings.Workers; i++ { wg.Add(1) nTransfers := transfersPerWorker diff --git a/internal/payload/custom_tx_client.go b/internal/payload/custom_tx_client.go index 8843a5a3..0b3cae69 100644 --- a/internal/payload/custom_tx_client.go +++ b/internal/payload/custom_tx_client.go @@ -36,18 +36,23 @@ type CustomTxTransfer interface { CheckableCluster ClusterPopulatable - InsertTransfer(transfer *model.Transfer) error - DeleteTransfer(transferId model.TransferId, clientId uuid.UUID) error - SetTransferClient(clientId uuid.UUID, transferId model.TransferId) error - FetchTransferClient(transferId model.TransferId) (*uuid.UUID, error) - ClearTransferClient(transferId model.TransferId, clientId uuid.UUID) error - SetTransferState(state string, transferId model.TransferId, clientId uuid.UUID) error - FetchTransfer(transferId model.TransferId) (*model.Transfer, error) + InsertTransfer(*model.Transfer) error + DeleteTransfer(model.TransferId, uuid.UUID) error + SetTransferClient(uuid.UUID, model.TransferId) error + FetchTransferClient(model.TransferId) (*uuid.UUID, error) + ClearTransferClient(model.TransferId, uuid.UUID) error + SetTransferState(string, model.TransferId, uuid.UUID) error + FetchTransfer(model.TransferId) (*model.Transfer, error) FetchDeadTransfers() ([]model.TransferId, error) - UpdateBalance(balance *inf.Dec, bic string, ban string, transferId model.TransferId) error + UpdateBalance(balance *inf.Dec, bic string, ban string, transferID model.TransferId) error - LockAccount(transferId model.TransferId, pendingAmount *inf.Dec, bic string, ban string) (*model.Account, error) + LockAccount( + transferID model.TransferId, + pendingAmount *inf.Dec, + bic string, + ban string, + ) (*model.Account, error) UnlockAccount(bic string, ban string, transferId model.TransferId) error StartStatisticsCollect(statInterval time.Duration) error } @@ -60,10 +65,14 @@ type ClientCustomTx struct { payStats *PayStats } -func (c *ClientCustomTx) Init(cluster CustomTxTransfer, oracle *database.Oracle, payStats *PayStats) { +func (c *ClientCustomTx) Init( + dbCluster CustomTxTransfer, + oracle *database.Oracle, + payStats *PayStats, +) { c.clientId = uuid.New() c.shortId = atomic.AddUint64(&nClients, 1) - c.cluster = cluster + c.cluster = dbCluster c.oracle = oracle c.payStats = payStats @@ -164,14 +173,22 @@ func (c *ClientCustomTx) LockAccounts(t *model.Transfer, wait bool) error { i := 0 for i < 2 { account := t.LockOrder[i] - receivedAccount, err := c.cluster.LockAccount(t.Id, account.PendingAmount, account.Bic, account.Ban) + receivedAccount, err := c.cluster.LockAccount( + t.Id, + account.PendingAmount, + account.Bic, + account.Ban, + ) if err != nil || t.Id.String() != receivedAccount.PendingTransfer.String() { if err != nil { // Remove the pending transfer from the previously // locked account, do not wait with locks. if i == 1 && previousAccount != nil { if unlockErr := c.UnlockAccount(t.Id, previousAccount); unlockErr != nil { - return merry.Prepend(merry.WithCause(unlockErr, err), "failed to unlock locked accounts") + return merry.Prepend( + merry.WithCause(unlockErr, err), + "failed to unlock locked accounts", + ) } } // Check for transient errors, such as query timeout, and retry. @@ -181,7 +198,10 @@ func (c *ClientCustomTx) LockAccounts(t *model.Transfer, wait bool) error { // No such account. We're not holding locks. CompleteTransfer() will delete // the transfer. if err == cluster.ErrNoRows { - return merry.Prepend(c.SetTransferState(t, "locked"), "failed to set transfer state") + return merry.Prepend( + c.SetTransferState(t, "locked"), + "failed to set transfer state", + ) } else if IsTransientError(err) { llog.Tracef("[%v] [%v] Retrying after error: %v", c.shortId, t.Id, err) } else { @@ -323,10 +343,10 @@ func (c *ClientCustomTx) DeleteTransfer(transferId model.TransferId) error { func payWorkerCustomTx( settings config.DatabaseSettings, - n_transfers int, zipfian bool, dbCluster CustomTxTransfer, + nTransfers uint64, zipfian bool, dbCluster CustomTxTransfer, oracle *database.Oracle, payStats *PayStats, - wg *sync.WaitGroup) { - + wg *sync.WaitGroup, +) { defer wg.Done() var client ClientCustomTx @@ -339,8 +359,7 @@ func payWorkerCustomTx( randSource.Init(clusterSettings.Count, clusterSettings.Seed, settings.BanRangeMultiplier) - for i := 0; i < n_transfers; { - + for i := uint64(0); i < nTransfers; { //nolint t := new(model.Transfer) t.InitRandomTransfer(&randSource, zipfian) @@ -365,28 +384,37 @@ func payWorkerCustomTx( func payCustomTx(settings *config.DatabaseSettings, cluster CustomTxTransfer, - oracle *database.Oracle) (*PayStats, error) { - + oracle *database.Oracle, +) (*PayStats, error) { var wg sync.WaitGroup var payStats PayStats transfersPerWorker := settings.Count / settings.Workers - remainder := settings.Count - transfersPerWorker*settings.Workers + remainder := int(settings.Count - transfersPerWorker*settings.Workers) RecoveryStart(cluster, oracle, &payStats) //nolint:golint,gosimple - clusterCustomTx, ok := cluster.(CustomTxTransfer) + clusterCustomTx, ok := cluster.(CustomTxTransfer) //nolint if !ok { llog.Fatalf("Custom transactions are not implemented for %s", cluster.GetClusterType()) } - for i := 0; i < settings.Workers; i++ { + for i := 0; i < int(settings.Workers); i++ { wg.Add(1) nTransfers := transfersPerWorker if i < remainder { nTransfers++ } - go payWorkerCustomTx(*settings, nTransfers, settings.Zipfian, clusterCustomTx, oracle, &payStats, &wg) + + go payWorkerCustomTx( + *settings, + nTransfers, + settings.Zipfian, + clusterCustomTx, + oracle, + &payStats, + &wg, + ) } wg.Wait() diff --git a/internal/payload/interface.go b/internal/payload/interface.go index 40b18305..756730c1 100644 --- a/internal/payload/interface.go +++ b/internal/payload/interface.go @@ -63,9 +63,10 @@ func CreatePayload( payFunc: nil, } - llog.Debugf("DatabaseSettings: DBType: %s, workers: %d, Zipfian: %v, Oracle: %v, Check: %v, "+ - "DBURL: %s, UseCustomTx: %v, BanRangeMultiplier: %v, StatInterval: %v, "+ - "ConnectPoolSize: %d, Sharded: %v", + llog.Debugf( + "DatabaseSettings: DBType: %s, workers: %d, Zipfian: %v, Oracle: %v, Check: %v, "+ + "DBURL: %s, UseCustomTx: %v, BanRangeMultiplier: %v, StatInterval: %v, "+ + "ConnectPoolSize: %d, Sharded: %v", settings.DatabaseSettings.DBType, settings.DatabaseSettings.Workers, settings.DatabaseSettings.Zipfian, @@ -141,7 +142,7 @@ func (p *BasePayload) Connect() error { } if p.Cluster, isOk = dbCluster.(CustomTxTransfer); !isOk { - llog.Errorf("Error then casting payload to CustomTxTransfer: %s", err) + llog.Errorf("Error then casting payload to CustomTxTransfer") return merry.Prepend( err, diff --git a/internal/payload/pop.go b/internal/payload/pop.go index a9e3493c..9c299061 100644 --- a/internal/payload/pop.go +++ b/internal/payload/pop.go @@ -31,7 +31,7 @@ type ClusterPopulatable interface { // // For now data model for PostgreSQL is copied from lighest, but should be adjusted to correspond // to planned workload in the future - BootstrapDB(count int, seed int) error + BootstrapDB(count uint64, seed int) error FetchSettings() (cluster.Settings, error) InsertAccount(acc model.Account) error @@ -45,8 +45,6 @@ type PopStats struct { func (p *BasePayload) Pop(shellState *state.State) error { //nolint //TODO: refactor stats := PopStats{} - llog.Tracef("%#v %#v", p.config.Count, p.config.Seed) // TODO: remove - err := p.Cluster.BootstrapDB(p.config.Count, int(p.config.Seed)) if err != nil { return merry.Prepend(err, "cluster bootstrap failed") @@ -57,14 +55,15 @@ func (p *BasePayload) Pop(shellState *state.State) error { //nolint //TODO: refa return merry.Prepend(err, "cluster settings fetch failed") } - worker := func(id, nAccounts int, wg *sync.WaitGroup) { + worker := func(id, nAccounts uint64, wg *sync.WaitGroup) { //nolint defer wg.Done() var rand fixed_random_source.FixedRandomSource rand.Init(clusterSettings.Count, clusterSettings.Seed, p.config.BanRangeMultiplier) llog.Tracef("Worker %d inserting %d accounts", id, nAccounts) - for i := 0; i < nAccounts; { + + for i := uint64(0); i < nAccounts; { //nolint cookie := statistics.StatsRequestStart() bic, ban := rand.NewBicAndBan() balance := rand.NewStartBalance() @@ -138,9 +137,12 @@ func (p *BasePayload) Pop(shellState *state.State) error { //nolint //TODO: refa llog.Tracef("Worker %d done %d accounts", id, nAccounts) } - llog.Infof("Creating %d accounts using %d workers on %d cores \n", - p.config.Count, p.config.Workers, - runtime.NumCPU()) + llog.Infof( + "Creating %d accounts using %d workers on %d cores \n", + p.config.Count, + p.config.Workers, + runtime.NumCPU(), + ) var wg sync.WaitGroup @@ -152,7 +154,7 @@ func (p *BasePayload) Pop(shellState *state.State) error { //nolint //TODO: refa return errors.Wrap(err, "failed to execute chaos command") } - for i := 0; i < p.config.Workers; i++ { + for i := uint64(0); i < p.config.Workers; i++ { //nolint nAccounts := accountsPerWorker if i < remainder { nAccounts++ diff --git a/pkg/database/cluster/cartridge.go b/pkg/database/cluster/cartridge.go index cd86f5e1..2fc05aa4 100644 --- a/pkg/database/cluster/cartridge.go +++ b/pkg/database/cluster/cartridge.go @@ -24,6 +24,7 @@ import ( ) // CartridgeCluster - объявление соединения к FDB и ссылки на модель данных. +// //nolint:golint,structcheck type CartridgeCluster struct { client *http.Client @@ -61,23 +62,37 @@ func (cluster *CartridgeCluster) DeleteTransfer(_ model.TransferId, _ uuid.UUID) return errors.New("implement me") } -func (cluster *CartridgeCluster) SetTransferClient(clientId uuid.UUID, transferId model.TransferId) error { +func (cluster *CartridgeCluster) SetTransferClient( + clientID uuid.UUID, + transferID model.TransferId, +) error { panic("implement me") } -func (cluster *CartridgeCluster) FetchTransferClient(transferId model.TransferId) (*uuid.UUID, error) { +func (cluster *CartridgeCluster) FetchTransferClient( + transferID model.TransferId, +) (*uuid.UUID, error) { panic("implement me") } -func (cluster *CartridgeCluster) ClearTransferClient(transferId model.TransferId, clientId uuid.UUID) error { +func (cluster *CartridgeCluster) ClearTransferClient( + transferID model.TransferId, + clientID uuid.UUID, +) error { panic("implement me") } -func (cluster *CartridgeCluster) SetTransferState(state string, transferId model.TransferId, clientId uuid.UUID) error { +func (cluster *CartridgeCluster) SetTransferState( + state string, + transferID model.TransferId, + clientID uuid.UUID, +) error { panic("implement me") } -func (cluster *CartridgeCluster) FetchTransfer(transferId model.TransferId) (*model.Transfer, error) { +func (cluster *CartridgeCluster) FetchTransfer( + transferID model.TransferId, +) (*model.Transfer, error) { panic("implement me") } @@ -85,21 +100,34 @@ func (cluster *CartridgeCluster) FetchDeadTransfers() ([]model.TransferId, error panic("implement me") } -func (cluster *CartridgeCluster) UpdateBalance(balance *inf.Dec, bic string, ban string, transferId model.TransferId) error { +func (cluster *CartridgeCluster) UpdateBalance( + balance *inf.Dec, + bic string, + ban string, + transferID model.TransferId, +) error { panic("implement me") } -func (cluster *CartridgeCluster) LockAccount(transferId model.TransferId, pendingAmount *inf.Dec, bic string, ban string) (*model.Account, error) { +func (cluster *CartridgeCluster) LockAccount( + transferID model.TransferId, + pendingAmount *inf.Dec, + bic string, + ban string, +) (*model.Account, error) { panic("implement me") } -func (cluster *CartridgeCluster) UnlockAccount(bic string, ban string, transferId model.TransferId) error { +func (cluster *CartridgeCluster) UnlockAccount( + bic string, + ban string, + transferID model.TransferId, +) error { panic("implement me") } // NewFoundationCluster - Создать подключение к cartridge и создать новые коллекции, если ещё не созданы. -func NewCartridgeCluster(dbURL string, poolSize uint64, sharded bool) (*CartridgeCluster, error) { - +func NewCartridgeCluster(dbURL string, poolSize uint64) (*CartridgeCluster, error) { llog.Debugln("connecting to cartridge...") transport := &http.Transport{ @@ -123,16 +151,17 @@ func (cluster *CartridgeCluster) addSharding() error { } // BootstrapDB - заполнить параметры настройки и инициализировать ключ для хранения итогового баланса. -func (cluster *CartridgeCluster) BootstrapDB(count int, seed int) error { +func (cluster *CartridgeCluster) BootstrapDB(count uint64, seed int) error { llog.Infof("Populating settings...") - body_template := []byte(`{"count":` + fmt.Sprintf("%v", count) + `,"seed": ` + fmt.Sprintf("%v", seed) + `}`) - request_template := fmt.Sprintf("%s/db/bootstrap", cluster.url) + bodyTemplate := []byte( + `{"count":` + fmt.Sprintf("%v", count) + `,"seed": ` + fmt.Sprintf("%v", seed) + `}`, + ) + reqTemplate := fmt.Sprintf("%s/db/bootstrap", cluster.url) request, err := http.NewRequest( - "POST", request_template, bytes.NewBuffer(body_template), + "POST", reqTemplate, bytes.NewBuffer(bodyTemplate), //nolint ) - if err != nil { return merry.Prepend(err, "failed to create request of bootstrap DB in cartridge app") } @@ -140,7 +169,6 @@ func (cluster *CartridgeCluster) BootstrapDB(count int, seed int) error { request.Header.Set("Content-Type", "application/json") resp, err := cluster.client.Do(request) - if err != nil { return merry.Prepend(err, "failed to make request of bootstrap DB in cartridge app") } @@ -161,20 +189,23 @@ func (cluster *CartridgeCluster) GetClusterType() DBClusterType { // FetchSettings - получить значения параметров настройки. func (cluster *CartridgeCluster) FetchSettings() (Settings, error) { - - request_template := fmt.Sprintf("%s/settings/fetch", cluster.url) + reqTemplate := fmt.Sprintf("%s/settings/fetch", cluster.url) request, err := http.NewRequest( - "GET", request_template, nil, + "GET", reqTemplate, nil, //nolint ) - if err != nil { - return Settings{}, merry.Prepend(err, "failed to create request to fetch settings in cartridge app") + return Settings{}, merry.Prepend( //nolint + err, + "failed to create request to fetch settings in cartridge app", + ) } resp, err := cluster.client.Do(request) - if err != nil { - return Settings{}, merry.Prepend(err, "failed to make request to fetch settings in cartridge app") + return Settings{}, merry.Prepend( //nolint + err, + "failed to make request to fetch settings in cartridge app", + ) } if resp.StatusCode != 200 { @@ -186,7 +217,10 @@ func (cluster *CartridgeCluster) FetchSettings() (Settings, error) { var settings map[string]map[string]int if err = json.NewDecoder(resp.Body).Decode(&settings); err != nil { - return Settings{}, merry.Prepend(err, "failed to decode settings from cartridge app response") + return Settings{}, merry.Prepend( //nolint + err, + "failed to decode settings from cartridge app response", + ) } return Settings{ @@ -197,25 +231,26 @@ func (cluster *CartridgeCluster) FetchSettings() (Settings, error) { // InsertAccount - сохранить новый счет. func (cluster *CartridgeCluster) InsertAccount(acc model.Account) (err error) { - - account := account{ + updAccount := account{ //nolint Bic: acc.Bic, Ban: acc.Ban, Balance: acc.Balance.UnscaledBig().Int64(), Found: false, } - account_json, err := json.Marshal(account) + accJSON, err := json.Marshal(updAccount) if err != nil { - return merry.Prepend(err, "failed to marshal account to json to insert account in cartridge app") + return merry.Prepend( + err, + "failed to marshal account to json to insert account in cartridge app", + ) } - request_template := fmt.Sprintf("%s/account/insert", cluster.url) + requestTemplate := fmt.Sprintf("%s/account/insert", cluster.url) request, err := http.NewRequest( - "POST", request_template, bytes.NewBuffer(account_json), + http.MethodPost, requestTemplate, bytes.NewBuffer(accJSON), ) - if err != nil { return merry.Prepend(err, "failed to create request to insert account in cartridge app") } @@ -223,7 +258,6 @@ func (cluster *CartridgeCluster) InsertAccount(acc model.Account) (err error) { request.Header.Set("Content-Type", "application/json") resp, err := cluster.client.Do(request) - if err != nil { return merry.Prepend(err, "failed to make request to insert account in cartridge app") } @@ -237,9 +271,16 @@ func (cluster *CartridgeCluster) InsertAccount(acc model.Account) (err error) { if err = json.NewDecoder(resp.Body).Decode(&response); err != nil { unknownResponse, err := ioutil.ReadAll(resp.Body) if err != nil { - llog.Errorf("failed to insert account in cartridge app because got unknown answer body: %v \n", err) + llog.Errorf( + "failed to insert account in cartridge app because got unknown answer body: %v \n", + err, + ) } - llog.Errorf("failed to decode json response from cartridge app, because got %v \n", string(unknownResponse)) + + llog.Errorf( + "failed to decode json response from cartridge app, because got %v \n", + string(unknownResponse), + ) } if response["error"] == "Account already exist" { @@ -250,7 +291,12 @@ func (cluster *CartridgeCluster) InsertAccount(acc model.Account) (err error) { } return ErrInternalServerError } - return merry.Errorf("failed to insert account in cartridge app: %v %v", resp.StatusCode, response) + + return merry.Errorf( + "failed to insert account in cartridge app: %v %v", + resp.StatusCode, + response, + ) } defer resp.Body.Close() @@ -260,19 +306,23 @@ func (cluster *CartridgeCluster) InsertAccount(acc model.Account) (err error) { // FetchTotal - получить значение итогового баланса из Settings. func (cluster *CartridgeCluster) FetchTotal() (*inf.Dec, error) { - request_template := fmt.Sprintf("%s/total_balance/fetch", cluster.url) + requestTemplate := fmt.Sprintf("%s/total_balance/fetch", cluster.url) request, err := http.NewRequest( - "GET", request_template, nil, + http.MethodGet, requestTemplate, http.NoBody, ) - if err != nil { - return nil, merry.Prepend(err, "failed to create request to fetch total balance in cartridge app") + return nil, merry.Prepend( + err, + "failed to create request to fetch total balance in cartridge app", + ) } resp, err := cluster.client.Do(request) - if err != nil { - return nil, merry.Prepend(err, "failed to make request to fetch total balance in cartridge app") + return nil, merry.Prepend( + err, + "failed to make request to fetch total balance in cartridge app", + ) } if resp.StatusCode != 200 { @@ -294,7 +344,10 @@ func (cluster *CartridgeCluster) FetchTotal() (*inf.Dec, error) { balance, err := strconv.ParseInt(balance_from_resp["info"], 0, 64) if err != nil { - return nil, merry.Prepend(err, "failed to convert balance string from cartridge app response") + return nil, merry.Prepend( + err, + "failed to convert balance string from cartridge app response", + ) } return inf.NewDec(balance, 0), nil @@ -302,23 +355,27 @@ func (cluster *CartridgeCluster) FetchTotal() (*inf.Dec, error) { // PersistTotal - сохранить значение итогового баланса в settings. func (cluster *CartridgeCluster) PersistTotal(total inf.Dec) error { - body_template := []byte(`{"total":` + fmt.Sprintf("%v", total.UnscaledBig().Int64()) + `}`) - request_template := fmt.Sprintf("%s/total_balance/persist", cluster.url) + bodyTemplate := []byte(`{"total":` + fmt.Sprintf("%v", total.UnscaledBig().Int64()) + `}`) + requestTemplate := fmt.Sprintf("%s/total_balance/persist", cluster.url) request, err := http.NewRequest( - "POST", request_template, bytes.NewBuffer(body_template), + http.MethodPost, requestTemplate, bytes.NewBuffer(bodyTemplate), ) - if err != nil { - return merry.Prepend(err, "failed to create request to persist total balance in cartridge app") + return merry.Prepend( + err, + "failed to create request to persist total balance in cartridge app", + ) } request.Header.Set("Content-Type", "application/json") resp, err := cluster.client.Do(request) - if err != nil { - return merry.Prepend(err, "failed to make request to persist total balance in cartridge app") + return merry.Prepend( + err, + "failed to make request to persist total balance in cartridge app", + ) } var response map[string]interface{} @@ -338,19 +395,23 @@ func (cluster *CartridgeCluster) PersistTotal(total inf.Dec) error { // CheckBalance - рассчитать итоговый баланc. func (cluster *CartridgeCluster) CheckBalance() (*inf.Dec, error) { - request_template := fmt.Sprintf("%s/balance/check", cluster.url) + requestTemplate := fmt.Sprintf("%s/balance/check", cluster.url) request, err := http.NewRequest( - "GET", request_template, nil, + http.MethodGet, requestTemplate, http.NoBody, ) - if err != nil { - return nil, merry.Prepend(err, "failed to create request to calculate balance in cartridge app") + return nil, merry.Prepend( + err, + "failed to create request to calculate balance in cartridge app", + ) } resp, err := cluster.client.Do(request) - if err != nil { - return nil, merry.Prepend(err, "failed to make request to calculate balance in cartridge app") + return nil, merry.Prepend( + err, + "failed to make request to calculate balance in cartridge app", + ) } if resp.StatusCode != 200 { @@ -369,14 +430,20 @@ func (cluster *CartridgeCluster) CheckBalance() (*inf.Dec, error) { balance, err := strconv.ParseInt(balance_from_resp["info"], 0, 64) if err != nil { - return nil, merry.Prepend(err, "failed to convert balance string from cartridge app response") + return nil, merry.Prepend( + err, + "failed to convert balance string from cartridge app response", + ) } return inf.NewDec(balance, 0), nil } // MakeAtomicTransfer - выполнить операцию перевода и изменить балансы source и dest cчетов. -func (cluster *CartridgeCluster) MakeAtomicTransfer(transfer *model.Transfer, clientId uuid.UUID) error { +func (cluster *CartridgeCluster) MakeAtomicTransfer( //nolint + transfer *model.Transfer, + clientID uuid.UUID, +) error { // преобразуем в новую структуру для удобства обработки приложением. На логику принципиально не влияет. sendingTransfer := &transferMessage{ TransferId: transfer.Id.String(), @@ -385,7 +452,7 @@ func (cluster *CartridgeCluster) MakeAtomicTransfer(transfer *model.Transfer, cl DestBic: transfer.Acs[1].Bic, DestBan: transfer.Acs[1].Ban, State: transfer.State, - ClientId: clientId.String(), + ClientId: clientID.String(), ClientTimestamp: "", Amount: 0, } @@ -393,23 +460,27 @@ func (cluster *CartridgeCluster) MakeAtomicTransfer(transfer *model.Transfer, cl transferJson, err := json.Marshal(sendingTransfer) if err != nil { //nolint:golint,errcheck - merry.Prepend(err, "failed to marshal transfer to json to make custom transfer in cartridge app") + merry.Prepend( + err, + "failed to marshal transfer to json to make custom transfer in cartridge app", + ) } - request_template := fmt.Sprintf("%s/transfer/custom/create", cluster.url) + requestTemplate := fmt.Sprintf("%s/transfer/custom/create", cluster.url) request, err := http.NewRequest( - "POST", request_template, bytes.NewBuffer(transferJson), + http.MethodPost, requestTemplate, bytes.NewBuffer(transferJson), ) - if err != nil { - return merry.Prepend(err, "failed to create request to make custom transfer in cartridge app") + return merry.Prepend( + err, + "failed to create request to make custom transfer in cartridge app", + ) } request.Header.Set("Content-Type", "application/json") resp, err := cluster.client.Do(request) - if err != nil { return merry.Prepend(err, "failed to make request to make custom transfer in cartridge app") } @@ -423,11 +494,24 @@ func (cluster *CartridgeCluster) MakeAtomicTransfer(transfer *model.Transfer, cl if err = json.NewDecoder(resp.Body).Decode(&response); err != nil { unknownResponse, err := ioutil.ReadAll(resp.Body) if err != nil { - llog.Errorf("failed to make custom transfer in cartridge app because got unknown answer body: %v \n", err) + llog.Errorf( + "failed to make custom transfer in cartridge app because got unknown answer body: %v \n", + err, + ) } - llog.Errorf("failed to decode json response from cartridge app, because got %v \n", string(unknownResponse)) + + llog.Errorf( + "failed to decode json response from cartridge app, because got %v \n", + string(unknownResponse), + ) } - llog.Debugln(sendingTransfer.TransferId, sendingTransfer.ClientId, resp.StatusCode, response) + + llog.Debugln( + sendingTransfer.TransferId, + sendingTransfer.ClientId, + resp.StatusCode, + response, + ) if response["error"] == "insufficient funds for transfer" { return ErrInsufficientFunds @@ -442,7 +526,10 @@ func (cluster *CartridgeCluster) MakeAtomicTransfer(transfer *model.Transfer, cl return ErrNoRows } - return merry.Errorf("failed to make custom transfer in cartridge app with response code: %v", resp.StatusCode) + return merry.Errorf( + "failed to make custom transfer in cartridge app with response code: %v", + resp.StatusCode, + ) } return nil diff --git a/pkg/database/cluster/cockroach.go b/pkg/database/cluster/cockroach.go index d3da73d0..96179a26 100644 --- a/pkg/database/cluster/cockroach.go +++ b/pkg/database/cluster/cockroach.go @@ -6,6 +6,7 @@ package cluster import ( "context" + "fmt" "strconv" "strings" "time" @@ -16,6 +17,7 @@ import ( "github.com/jackc/pgerrcode" "github.com/jackc/pgx/v4" "github.com/jackc/pgx/v4/pgxpool" + "github.com/pkg/errors" "gitlab.com/picodata/stroppy/internal/model" @@ -49,8 +51,11 @@ func (cockroach *CockroachDatabase) InsertTransfer(transfer *model.Transfer) err return nil } -func (cockroach *CockroachDatabase) DeleteTransfer(transferId model.TransferId, clientId uuid.UUID) error { - res, err := cockroach.pool.Exec(context.Background(), deleteTransfer, transferId, clientId) +func (cockroach *CockroachDatabase) DeleteTransfer( + transferID model.TransferId, + clientID uuid.UUID, +) error { + res, err := cockroach.pool.Exec(context.Background(), deleteTransfer, transferID, clientID) if err != nil { if err == pgx.ErrNoRows { return ErrNoRows @@ -64,8 +69,11 @@ func (cockroach *CockroachDatabase) DeleteTransfer(transferId model.TransferId, return nil } -func (cockroach *CockroachDatabase) SetTransferClient(clientId uuid.UUID, transferId model.TransferId) error { - res, err := cockroach.pool.Exec(context.Background(), setTransferClient, clientId, transferId) +func (cockroach *CockroachDatabase) SetTransferClient( + clientID uuid.UUID, + transferID model.TransferId, +) error { + res, err := cockroach.pool.Exec(context.Background(), setTransferClient, clientID, transferID) if err != nil { return merry.Wrap(err) } @@ -76,11 +84,13 @@ func (cockroach *CockroachDatabase) SetTransferClient(clientId uuid.UUID, transf return nil } -func (cockroach *CockroachDatabase) FetchTransferClient(transferId model.TransferId) (*uuid.UUID, error) { - row := cockroach.pool.QueryRow(context.Background(), fetchTransferClient, transferId) +func (cockroach *CockroachDatabase) FetchTransferClient( + transferID model.TransferId, +) (*uuid.UUID, error) { + row := cockroach.pool.QueryRow(context.Background(), fetchTransferClient, transferID) - var clientId uuid.UUID - err := row.Scan(&clientId) + var clientID uuid.UUID + err := row.Scan(&clientID) if err != nil { if err == pgx.ErrNoRows { return nil, ErrNoRows @@ -88,11 +98,14 @@ func (cockroach *CockroachDatabase) FetchTransferClient(transferId model.Transfe return nil, merry.Wrap(err) } - return &clientId, nil + return &clientID, nil } -func (cockroach *CockroachDatabase) ClearTransferClient(transferId model.TransferId, clientId uuid.UUID) error { - res, err := cockroach.pool.Exec(context.Background(), clearTransferClient, transferId, clientId) +func (cockroach *CockroachDatabase) ClearTransferClient( + transferID model.TransferId, + clientID uuid.UUID, +) error { + res, err := cockroach.pool.Exec(context.Background(), clearTransferClient, transferID, clientID) if err != nil { return merry.Wrap(err) } @@ -105,8 +118,18 @@ func (cockroach *CockroachDatabase) ClearTransferClient(transferId model.Transfe return nil } -func (cockroach *CockroachDatabase) SetTransferState(state string, transferId model.TransferId, clientId uuid.UUID) error { - res, err := cockroach.pool.Exec(context.Background(), setTransferState, state, transferId, clientId) +func (cockroach *CockroachDatabase) SetTransferState( + state string, + transferID model.TransferId, + clientID uuid.UUID, +) error { + res, err := cockroach.pool.Exec( + context.Background(), + setTransferState, + state, + transferID, + clientID, + ) if err != nil { return merry.Wrap(err) } @@ -117,10 +140,12 @@ func (cockroach *CockroachDatabase) SetTransferState(state string, transferId mo return nil } -func (cockroach *CockroachDatabase) FetchTransfer(transferId model.TransferId) (*model.Transfer, error) { +func (cockroach *CockroachDatabase) FetchTransfer( //nolint:dupl // TODO: remove duplication + transferID model.TransferId, +) (*model.Transfer, error) { t := new(model.Transfer) - t.InitEmptyTransfer(transferId) - row := cockroach.pool.QueryRow(context.Background(), fetchTransfer, transferId) + t.InitEmptyTransfer(transferID) + row := cockroach.pool.QueryRow(context.Background(), fetchTransfer, transferID) // Ignore possible error, we will retry var amount int64 if err := row.Scan(&t.Acs[0].Bic, &t.Acs[0].Ban, &t.Acs[1].Bic, @@ -157,25 +182,43 @@ func (cockroach *CockroachDatabase) FetchDeadTransfers() ([]model.TransferId, er return transferIds, nil } -func (cockroach *CockroachDatabase) UpdateBalance(balance *inf.Dec, bic string, ban string, transferId model.TransferId) error { +func (cockroach *CockroachDatabase) UpdateBalance( + balance *inf.Dec, + bic string, + ban string, + transferID model.TransferId, +) error { panic("implement me") } -func (cockroach *CockroachDatabase) LockAccount(transferId model.TransferId, pendingAmount *inf.Dec, bic string, ban string) (*model.Account, error) { +func (cockroach *CockroachDatabase) LockAccount( + transferID model.TransferId, + pendingAmount *inf.Dec, + bic string, + ban string, +) (*model.Account, error) { panic("implement me") } -func (cockroach *CockroachDatabase) UnlockAccount(bic string, ban string, transferId model.TransferId) error { +func (cockroach *CockroachDatabase) UnlockAccount( + bic string, + ban string, + transferID model.TransferId, +) error { panic("implement me") } -func NewCockroachCluster(dbURL string, connectionPoolSize int) (cluster *CockroachDatabase, err error) { +func NewCockroachCluster( + dbURL string, + connectionPoolSize uint64, +) (*CockroachDatabase, error) { + var err error + llog.Infof("Establishing connection to cockroach on %v", dbURL) var poolConfig *pgxpool.Config if poolConfig, err = pgxpool.ParseConfig(dbURL); err != nil { - err = merry.Prepend(err, "parse url parameter") - return + return nil, merry.Prepend(err, "parse url parameter") } if !strings.Contains(dbURL, "pool_max_conns") { @@ -188,25 +231,27 @@ func NewCockroachCluster(dbURL string, connectionPoolSize int) (cluster *Cockroa var pgPool *pgxpool.Pool if pgPool, err = pgxpool.ConnectConfig(ctxt, poolConfig); err != nil { - err = merry.Prepend(err, "connection") - return + return nil, merry.Prepend(err, "connection") } - cluster = &CockroachDatabase{ + return &CockroachDatabase{ pool: pgPool, ctxt: ctxt, - } - return + }, nil } -func (cockroach *CockroachDatabase) BootstrapDB(count int, seed int) (err error) { +func (cockroach *CockroachDatabase) BootstrapDB(count uint64, seed int) error { + var err error + llog.Infof("Bootstrapping cluster...") if _, err = cockroach.pool.Exec(cockroach.ctxt, bootstrapScript); err != nil { return merry.Prepend(err, "failed to execute bootstrap script") } llog.Infof("Loading settings...") - _, err = cockroach.pool.Exec(cockroach.ctxt, insertSetting, "count", strconv.Itoa(count)) + + _, err = cockroach.pool.Exec( + cockroach.ctxt, insertSetting, "count", fmt.Sprintf("%d", count)) if err != nil { return merry.Prepend(err, "failed to load count setting") } @@ -216,7 +261,7 @@ func (cockroach *CockroachDatabase) BootstrapDB(count int, seed int) (err error) return merry.Prepend(err, "failed to load seed setting") } - return + return nil } func (cockroach *CockroachDatabase) GetClusterType() DBClusterType { @@ -241,7 +286,7 @@ func (cockroach *CockroachDatabase) FetchSettings() (clusterSettings Settings, e var fetchSettings []string for rows.Next() { var clusterSetting string - if err := rows.Scan(&clusterSetting); err != nil { + if err = rows.Scan(&clusterSetting); err != nil { return clusterSettings, merry.Prepend(err, "failed to scan setting for FetchSettings") } fetchSettings = append(fetchSettings, clusterSetting) @@ -269,7 +314,13 @@ func (cockroach *CockroachDatabase) FetchSettings() (clusterSettings Settings, e } func (cockroach *CockroachDatabase) InsertAccount(acc model.Account) (err error) { - _, err = cockroach.pool.Exec(cockroach.ctxt, upsertAccount, acc.Bic, acc.Ban, acc.Balance.UnscaledBig().Int64()) + _, err = cockroach.pool.Exec( + cockroach.ctxt, + upsertAccount, + acc.Bic, + acc.Ban, + acc.Balance.UnscaledBig().Int64(), + ) if err != nil { if pgErr, ok := err.(*pgconn.PgError); ok { if pgErr.Code == pgerrcode.UniqueViolation { @@ -324,7 +375,10 @@ func (cockroach *CockroachDatabase) CheckBalance() (*inf.Dec, error) { const cockroachTxTimeout = 45 * time.Second -func (cockroach *CockroachDatabase) MakeAtomicTransfer(transfer *model.Transfer, clientId uuid.UUID) error { +func (cockroach *CockroachDatabase) MakeAtomicTransfer( //nolint + transfer *model.Transfer, + clientID uuid.UUID, +) error { ctx, cancel := context.WithTimeout(context.Background(), cockroachTxTimeout) defer cancel() @@ -339,11 +393,12 @@ func (cockroach *CockroachDatabase) MakeAtomicTransfer(transfer *model.Transfer, // Rollback is safe to call even if the tx is already closed, so if // the tx commits successfully, this is a no-op - defer func() { - if err := tx.Rollback(ctx); err != nil && err != pgx.ErrTxClosed { - llog.Errorf("failed to rollback transaction: '%v'", err) - panic(ErrConsistencyViolation) + defer func() error { + if err = tx.Rollback(ctx); err != nil && !errors.Is(err, pgx.ErrTxClosed) { + return errors.Wrap(err, "failed to rollback transaction: '%v'") } + + return nil }() sourceAccount := transfer.Acs[0] @@ -421,7 +476,10 @@ func (cockroach *CockroachDatabase) MakeAtomicTransfer(transfer *model.Transfer, } func (cockroach *CockroachDatabase) FetchAccounts() ([]model.Account, error) { - rows, err := cockroach.pool.Query(context.Background(), `SELECT bic, ban, balance FROM account;`) + rows, err := cockroach.pool.Query( + context.Background(), + `SELECT bic, ban, balance FROM account;`, + ) if err != nil { return nil, merry.Prepend(err, "failed to fetch accounts") } @@ -440,7 +498,10 @@ func (cockroach *CockroachDatabase) FetchAccounts() ([]model.Account, error) { return accs, nil } -func (cockroach *CockroachDatabase) FetchBalance(bic string, ban string) (*inf.Dec, *inf.Dec, error) { +func (cockroach *CockroachDatabase) FetchBalance( //nolint + bic string, + ban string, +) (*inf.Dec, *inf.Dec, error) { row := cockroach.pool.QueryRow(context.Background(), fetchBalance, bic, ban) var balance, pendingAmount inf.Dec err := row.Scan(&balance, &pendingAmount) diff --git a/pkg/database/cluster/fdb.go b/pkg/database/cluster/fdb.go index 8e85ac69..c66ba981 100644 --- a/pkg/database/cluster/fdb.go +++ b/pkg/database/cluster/fdb.go @@ -147,7 +147,7 @@ func NewFoundationCluster(dbURL string) (*FDBCluster, error) { } // BootstrapDB - заполнить параметры настройки и инициализировать ключ для хранения итогового баланса. -func (cluster *FDBCluster) BootstrapDB(count int, seed int) error { +func (cluster *FDBCluster) BootstrapDB(count uint64, seed int) error { llog.Infof("Populating settings...") _, err := cluster.pool.Transact(func(tx fdb.Transaction) (interface{}, error) { // очищаем cпейсы перед началом загрузки счетов, BootstrapDB вызывается на этом этапе @@ -158,7 +158,7 @@ func (cluster *FDBCluster) BootstrapDB(count int, seed int) error { countKey := cluster.model.settings.Pack(tuple.Tuple{"count"}) seedKey := cluster.model.settings.Pack(tuple.Tuple{"seed"}) checkSumTotalKey := cluster.model.checksum.Pack(tuple.Tuple{"total"}) - tx.Set(countKey, []byte(strconv.Itoa(count))) + tx.Set(countKey, []byte(fmt.Sprintf("%d", count))) tx.Set(seedKey, []byte(strconv.Itoa(seed))) // добавляем пустое значение для checksum, чтобы инициировать ключ tx.Set(checkSumTotalKey, []byte{}) diff --git a/pkg/database/cluster/mongo.go b/pkg/database/cluster/mongo.go index 029384bb..afb7da2f 100644 --- a/pkg/database/cluster/mongo.go +++ b/pkg/database/cluster/mongo.go @@ -184,7 +184,7 @@ func (cluster *MongoDBCluster) addSharding() error { } // BootstrapDB - заполнить параметры настройки и инициализировать ключ для хранения итогового баланса. -func (cluster *MongoDBCluster) BootstrapDB(count int, seed int) error { +func (cluster *MongoDBCluster) BootstrapDB(count uint64, seed int) error { llog.Infof("Populating settings...") var insertResult *mongo.InsertOneResult var indexName string diff --git a/pkg/database/cluster/postgres.go b/pkg/database/cluster/postgres.go index a685825b..61077136 100644 --- a/pkg/database/cluster/postgres.go +++ b/pkg/database/cluster/postgres.go @@ -7,6 +7,7 @@ package cluster import ( "context" "errors" + "fmt" "strconv" "strings" "time" @@ -28,7 +29,7 @@ type PostgresCluster struct { pool *pgxpool.Pool } -func NewPostgresCluster(dbURL string, connectionPoolCount int) (*PostgresCluster, error) { +func NewPostgresCluster(dbURL string, connectionPoolCount uint64) (*PostgresCluster, error) { llog.Infof("Establishing connection to pg on %v", dbURL) poolConfig, err := pgxpool.ParseConfig(dbURL) @@ -56,19 +57,24 @@ func (*PostgresCluster) GetClusterType() DBClusterType { return PostgresClusterType } -func (self *PostgresCluster) BootstrapDB(count int, seed int) error { +func (pgCluster *PostgresCluster) BootstrapDB(count uint64, seed int) error { llog.Infof("Creating the tables...") - _, err := self.pool.Exec(context.Background(), bootstrapScript) + + _, err := pgCluster.pool.Exec(context.Background(), bootstrapScript) if err != nil { return merry.Prepend(err, "failed to execute bootstrap script") } + llog.Infof("Populating settings...") - _, err = self.pool.Exec(context.Background(), insertSetting, "count", strconv.Itoa(count)) + + _, err = pgCluster.pool.Exec( + context.Background(), insertSetting, "count", fmt.Sprintf("%d", count), + ) if err != nil { return merry.Prepend(err, "failed to populate settings") } - _, err = self.pool.Exec(context.Background(), insertSetting, "seed", strconv.Itoa(seed)) + _, err = pgCluster.pool.Exec(context.Background(), insertSetting, "seed", strconv.Itoa(seed)) if err != nil { return merry.Prepend(err, "failed to save seed") } @@ -76,10 +82,11 @@ func (self *PostgresCluster) BootstrapDB(count int, seed int) error { return nil } -func (self *PostgresCluster) FetchSettings() (Settings, error) { +func (pgCluster *PostgresCluster) FetchSettings() (Settings, error) { ctx, cancel := context.WithTimeout(context.Background(), timeOutSettings*time.Second) defer cancel() - rows, err := self.pool.Query(ctx, fetchSettings) + + rows, err := pgCluster.pool.Query(ctx, fetchSettings) if err != nil { return Settings{ Count: 0, @@ -90,7 +97,7 @@ func (self *PostgresCluster) FetchSettings() (Settings, error) { var fetchSettings []string for rows.Next() { var clusterSetting string - if err := rows.Scan(&clusterSetting); err != nil { + if err = rows.Scan(&clusterSetting); err != nil { return clusterSettings, merry.Prepend(err, "failed to scan setting for FetchSettings") } fetchSettings = append(fetchSettings, clusterSetting) @@ -114,8 +121,14 @@ func (self *PostgresCluster) FetchSettings() (Settings, error) { return clusterSettings, nil } -func (self *PostgresCluster) InsertAccount(acc model.Account) error { - _, err := self.pool.Exec(context.Background(), upsertAccount, acc.Bic, acc.Ban, acc.Balance.UnscaledBig().Int64()) +func (pgCluster *PostgresCluster) InsertAccount(acc model.Account) error { + _, err := pgCluster.pool.Exec( + context.Background(), + upsertAccount, + acc.Bic, + acc.Ban, + acc.Balance.UnscaledBig().Int64(), + ) if err != nil { if pgErr, ok := err.(*pgconn.PgError); ok { if pgErr.Code == pgerrcode.UniqueViolation { @@ -129,8 +142,11 @@ func (self *PostgresCluster) InsertAccount(acc model.Account) error { return nil } -func (self *PostgresCluster) FetchAccounts() ([]model.Account, error) { - rows, err := self.pool.Query(context.Background(), `SELECT bic, ban, balance FROM account;`) +func (pgCluster *PostgresCluster) FetchAccounts() ([]model.Account, error) { //nolint:dupl //TODO + rows, err := pgCluster.pool.Query( + context.Background(), + `SELECT bic, ban, balance FROM account;`, + ) if err != nil { return nil, merry.Prepend(err, "failed to fetch accounts") } @@ -149,8 +165,8 @@ func (self *PostgresCluster) FetchAccounts() ([]model.Account, error) { return accs, nil } -func (self *PostgresCluster) FetchTotal() (*inf.Dec, error) { - row := self.pool.QueryRow(context.Background(), fetchTotal) +func (pgCluster *PostgresCluster) FetchTotal() (*inf.Dec, error) { + row := pgCluster.pool.QueryRow(context.Background(), fetchTotal) var amount inf.Dec err := row.Scan(&amount) @@ -164,8 +180,8 @@ func (self *PostgresCluster) FetchTotal() (*inf.Dec, error) { return &amount, nil } -func (self *PostgresCluster) PersistTotal(total inf.Dec) error { - res, err := self.pool.Exec(context.Background(), persistTotal, total.UnscaledBig().Int64()) +func (pgCluster *PostgresCluster) PersistTotal(total inf.Dec) error { + res, err := pgCluster.pool.Exec(context.Background(), persistTotal, total.UnscaledBig().Int64()) if err != nil { return merry.Wrap(err) } @@ -176,8 +192,8 @@ func (self *PostgresCluster) PersistTotal(total inf.Dec) error { return nil } -func (self *PostgresCluster) CheckBalance() (*inf.Dec, error) { - row := self.pool.QueryRow(context.Background(), checkBalance) +func (pgCluster *PostgresCluster) CheckBalance() (*inf.Dec, error) { + row := pgCluster.pool.QueryRow(context.Background(), checkBalance) var totalBalance int64 err := row.Scan(&totalBalance) if err != nil { @@ -190,8 +206,8 @@ func (self *PostgresCluster) CheckBalance() (*inf.Dec, error) { return inf.NewDec(totalBalance, 0), nil } -func (self *PostgresCluster) InsertTransfer(transfer *model.Transfer) error { - res, err := self.pool.Exec( +func (pgCluster *PostgresCluster) InsertTransfer(transfer *model.Transfer) error { //nolint + res, err := pgCluster.pool.Exec( context.Background(), insertTransfer, transfer.Id, @@ -211,8 +227,18 @@ func (self *PostgresCluster) InsertTransfer(transfer *model.Transfer) error { return nil } -func (self *PostgresCluster) SetTransferState(state string, transferId model.TransferId, clientId uuid.UUID) error { - res, err := self.pool.Exec(context.Background(), setTransferState, state, transferId, clientId) +func (pgCluster *PostgresCluster) SetTransferState( + state string, + transferID model.TransferId, + clientID uuid.UUID, +) error { + res, err := pgCluster.pool.Exec( + context.Background(), + setTransferState, + state, + transferID, + clientID, + ) if err != nil { return merry.Wrap(err) } @@ -223,8 +249,11 @@ func (self *PostgresCluster) SetTransferState(state string, transferId model.Tra return nil } -func (self *PostgresCluster) SetTransferClient(clientId uuid.UUID, transferId model.TransferId) error { - res, err := self.pool.Exec(context.Background(), setTransferClient, clientId, transferId) +func (pgCluster *PostgresCluster) SetTransferClient( + clientID uuid.UUID, + transferID model.TransferId, +) error { + res, err := pgCluster.pool.Exec(context.Background(), setTransferClient, clientID, transferID) if err != nil { return merry.Wrap(err) } @@ -235,8 +264,11 @@ func (self *PostgresCluster) SetTransferClient(clientId uuid.UUID, transferId mo return nil } -func (self *PostgresCluster) ClearTransferClient(transferId model.TransferId, clientId uuid.UUID) error { - res, err := self.pool.Exec(context.Background(), clearTransferClient, transferId, clientId) +func (pgCluster *PostgresCluster) ClearTransferClient( + transferID model.TransferId, + clientID uuid.UUID, +) error { + res, err := pgCluster.pool.Exec(context.Background(), clearTransferClient, transferID, clientID) if err != nil { return merry.Wrap(err) } @@ -249,8 +281,11 @@ func (self *PostgresCluster) ClearTransferClient(transferId model.TransferId, cl return nil } -func (self *PostgresCluster) DeleteTransfer(transferId model.TransferId, clientId uuid.UUID) error { - res, err := self.pool.Exec(context.Background(), deleteTransfer, transferId, clientId) +func (pgCluster *PostgresCluster) DeleteTransfer( + transferID model.TransferId, + clientID uuid.UUID, +) error { + res, err := pgCluster.pool.Exec(context.Background(), deleteTransfer, transferID, clientID) if err != nil { if err == pgx.ErrNoRows { return ErrNoRows @@ -264,10 +299,12 @@ func (self *PostgresCluster) DeleteTransfer(transferId model.TransferId, clientI return nil } -func (self *PostgresCluster) FetchTransfer(transferId model.TransferId) (*model.Transfer, error) { +func (pgCluster *PostgresCluster) FetchTransfer( //nolint:dupl //TODO + transferID model.TransferId, +) (*model.Transfer, error) { t := new(model.Transfer) - t.InitEmptyTransfer(transferId) - row := self.pool.QueryRow(context.Background(), fetchTransfer, transferId) + t.InitEmptyTransfer(transferID) + row := pgCluster.pool.QueryRow(context.Background(), fetchTransfer, transferID) // Ignore possible error, we will retry var amount int64 if err := row.Scan(&t.Acs[0].Bic, &t.Acs[0].Ban, &t.Acs[1].Bic, @@ -281,11 +318,13 @@ func (self *PostgresCluster) FetchTransfer(transferId model.TransferId) (*model. return t, nil } -func (self *PostgresCluster) FetchTransferClient(transferId model.TransferId) (*uuid.UUID, error) { - row := self.pool.QueryRow(context.Background(), fetchTransferClient, transferId) +func (pgCluster *PostgresCluster) FetchTransferClient( + transferID model.TransferId, +) (*uuid.UUID, error) { + row := pgCluster.pool.QueryRow(context.Background(), fetchTransferClient, transferID) - var clientId uuid.UUID - err := row.Scan(&clientId) + var clientID uuid.UUID + err := row.Scan(&clientID) if err != nil { if err == pgx.ErrNoRows { return nil, ErrNoRows @@ -293,23 +332,39 @@ func (self *PostgresCluster) FetchTransferClient(transferId model.TransferId) (* return nil, merry.Wrap(err) } - return &clientId, nil + return &clientID, nil } -func (self *PostgresCluster) LockAccount(transferId model.TransferId, pendingAmount *inf.Dec, bic string, ban string) (*model.Account, error) { +func (pgCluster *PostgresCluster) LockAccount( + transferID model.TransferId, + pendingAmount *inf.Dec, + bic string, + ban string, +) (*model.Account, error) { panic("implement me") } -func (self *PostgresCluster) UnlockAccount(bic string, ban string, transferId model.TransferId) error { +func (pgCluster *PostgresCluster) UnlockAccount( + bic string, + ban string, + transferID model.TransferId, +) error { panic("implement me") } -func (self *PostgresCluster) UpdateBalance(balance *inf.Dec, bic string, ban string, transferId model.TransferId) error { +func (pgCluster *PostgresCluster) UpdateBalance( + balance *inf.Dec, + bic string, + ban string, + transferID model.TransferId, +) error { panic("implement me") } -func (self *PostgresCluster) FetchBalance(bic string, ban string) (*inf.Dec, *inf.Dec, error) { - row := self.pool.QueryRow(context.Background(), fetchBalance, bic, ban) +func (pgCluster *PostgresCluster) FetchBalance( //nolint + bic, ban string, +) (*inf.Dec, *inf.Dec, error) { //nolint + row := pgCluster.pool.QueryRow(context.Background(), fetchBalance, bic, ban) var balance, pendingAmount inf.Dec err := row.Scan(&balance, &pendingAmount) if err != nil { @@ -318,8 +373,8 @@ func (self *PostgresCluster) FetchBalance(bic string, ban string) (*inf.Dec, *in return &balance, &pendingAmount, nil } -func (self *PostgresCluster) FetchDeadTransfers() ([]model.TransferId, error) { - rows, err := self.pool.Query(context.Background(), fetchDeadTransfers) +func (pgCluster *PostgresCluster) FetchDeadTransfers() ([]model.TransferId, error) { //nolint + rows, err := pgCluster.pool.Query(context.Background(), fetchDeadTransfers) if err != nil { if err == pgx.ErrNoRows { return []model.TransferId{}, nil @@ -327,7 +382,8 @@ func (self *PostgresCluster) FetchDeadTransfers() ([]model.TransferId, error) { return nil, merry.Wrap(err) } - var transferIds []model.TransferId + + var transferIDs []model.TransferId for rows.Next() { var tId model.TransferId err = rows.Scan(&tId) @@ -335,13 +391,19 @@ func (self *PostgresCluster) FetchDeadTransfers() ([]model.TransferId, error) { if err != nil { return nil, merry.Wrap(err) } - transferIds = append(transferIds, tId) + + transferIDs = append(transferIDs, tId) } - return transferIds, nil + return transferIDs, nil } -func WithdrawMoney(ctx context.Context, tx pgx.Tx, acc model.Account, transfer model.Transfer) error { +func WithdrawMoney( + ctx context.Context, + tx pgx.Tx, + acc model.Account, + transfer model.Transfer, //nolint +) error { // update balance row := tx.QueryRow( ctx, @@ -410,13 +472,16 @@ func TopUpMoney(ctx context.Context, tx pgx.Tx, acc model.Account, transfer mode // MakeAtomicTransfer inserts new transfer (should be used as history in the future) and // update corresponding balances in a single SQL transaction -func (self *PostgresCluster) MakeAtomicTransfer(transfer *model.Transfer, clientId uuid.UUID) error { +func (pgCluster *PostgresCluster) MakeAtomicTransfer( //nolint + transfer *model.Transfer, + clientID uuid.UUID, +) error { ctx, cancel := context.WithTimeout(context.Background(), txTimeout) defer cancel() // RepeateableRead is sufficient to provide consistent balance update even though // serialization anomalies are allowed that should not affect us (no dependable transaction, except obviously blocked rows) - tx, err := self.pool.BeginTx(ctx, pgx.TxOptions{ + tx, err := pgCluster.pool.BeginTx(ctx, pgx.TxOptions{ //nolint IsoLevel: pgx.RepeatableRead, }) if err != nil { @@ -426,7 +491,7 @@ func (self *PostgresCluster) MakeAtomicTransfer(transfer *model.Transfer, client // Rollback is safe to call even if the tx is already closed, so if // the tx commits successfully, this is a no-op defer func() { - if err := tx.Rollback(ctx); err != nil && err != pgx.ErrTxClosed { + if err = tx.Rollback(ctx); err != nil && !errors.Is(err, pgx.ErrTxClosed) { llog.Errorf("failed to rollback transaction: '%v'", err) panic(ErrConsistencyViolation) } @@ -512,7 +577,7 @@ func (self *PostgresCluster) MakeAtomicTransfer(transfer *model.Transfer, client return nil } -func (self *PostgresCluster) StartStatisticsCollect(_ time.Duration) error { +func (pgCluster *PostgresCluster) StartStatisticsCollect(_ time.Duration) error { llog.Debugln("statistic for postgres not supported, watch grafana metrics, please") return nil } diff --git a/pkg/database/cluster/postgres_test.go b/pkg/database/cluster/postgres_test.go index 27254871..58779280 100644 --- a/pkg/database/cluster/postgres_test.go +++ b/pkg/database/cluster/postgres_test.go @@ -3,58 +3,77 @@ package cluster import ( "context" "fmt" - "gopkg.in/inf.v0" "sort" "testing" "time" + "gopkg.in/inf.v0" + "gitlab.com/picodata/stroppy/internal/model" "github.com/google/uuid" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) var postgresCluster *PostgresCluster -func (self *PostgresCluster) CheckTableExist(tableName string) (exist bool, err error) { - var name string - sqlQuery := fmt.Sprintf("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='%s';", tableName) - if err = self.pool.QueryRow(context.TODO(), sqlQuery).Scan(&name); err != nil { - return false, err +func (pgCluster *PostgresCluster) CheckTableExist(tableName string) (bool, error) { + var ( + name string + err error + ) + + sqlQuery := fmt.Sprintf( + "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='%s';", + tableName, + ) + + if err = pgCluster.pool.QueryRow(context.TODO(), sqlQuery).Scan(&name); err != nil { + return false, errors.Wrap(err, "failed to qery row") } if tableName != name { return false, nil } + return true, nil } -func (self *PostgresCluster) TruncateTable(tableName string) error { +func (pgCluster *PostgresCluster) TruncateTable(tableName string) error { sqlString := fmt.Sprintf("TRUNCATE %s", tableName) - _, err := self.pool.Exec(context.TODO(), sqlString) + _, err := pgCluster.pool.Exec(context.TODO(), sqlString) if err != nil { return err } return nil } -func (self *PostgresCluster) GetAccount(Bic string, Ban string) (Account model.Account, err error) { - var Balance int64 +func (pgCluster *PostgresCluster) GetAccount(bic, ban string) (model.Account, error) { + var ( + balance int64 + account model.Account + err error + ) + dec := new(inf.Dec) - if err := self.pool.QueryRow( + if err = pgCluster.pool.QueryRow( context.TODO(), `SELECT bic, ban, balance FROM account WHERE bic = $1 and ban = $2;`, - Bic, - Ban, + bic, + ban, ).Scan( - &Account.Bic, - &Account.Ban, - &Balance); err != nil { - return model.Account{}, err + &account.Bic, + &account.Ban, + &balance); err != nil { + return model.Account{}, errors.Wrap(err, "failed to get account") } - dec.SetUnscaled(Balance) - Account.Balance = dec - return Account, nil + + dec.SetUnscaled(balance) + account.Balance = dec + + return account, nil } func NewTestPostgresCluster(t *testing.T) { @@ -113,17 +132,26 @@ func PostgresInsertAccount(t *testing.T) { accounts := GenerateAccounts() for _, expectedAccount := range accounts { - if err := postgresCluster.InsertAccount(expectedAccount); err != nil { - t.Errorf("TestCockroachInsertAccount() received internal error %v, but expected nil", err) + if err = postgresCluster.InsertAccount(expectedAccount); err != nil { + t.Errorf( + "TestCockroachInsertAccount() received internal error %v, but expected nil", + err, + ) } if receivedAccount, err = postgresCluster.GetAccount(expectedAccount.Bic, expectedAccount.Ban); err != nil { - t.Errorf("TestCockroachInsertAccount() received internal error %v, but expected nil", err) + t.Errorf( + "TestCockroachInsertAccount() received internal error %v, but expected nil", + err, + ) } if expectedAccount.Ban != receivedAccount.Ban || expectedAccount.Bic != receivedAccount.Bic || - expectedAccount.Balance.UnscaledBig().Int64() != receivedAccount.Balance.UnscaledBig().Int64() { + expectedAccount.Balance.UnscaledBig(). + Int64() != + receivedAccount.Balance.UnscaledBig(). + Int64() { t.Fail() } } @@ -141,17 +169,26 @@ func PostgresMakeAtomicTransfer(t *testing.T) { var Balance int64 dec := new(inf.Dec) for _, expectedAccount := range accounts { - if err := postgresCluster.InsertAccount(expectedAccount); err != nil { - t.Errorf("TestCockroachInsertAccount() received internal error %v, but expected nil", err) + if err = postgresCluster.InsertAccount(expectedAccount); err != nil { + t.Errorf( + "TestCockroachInsertAccount() received internal error %v, but expected nil", + err, + ) } if receivedAccount, err = postgresCluster.GetAccount(expectedAccount.Bic, expectedAccount.Ban); err != nil { - t.Errorf("TestCockroachInsertAccount() received internal error %v, but expected nil", err) + t.Errorf( + "TestCockroachInsertAccount() received internal error %v, but expected nil", + err, + ) } if expectedAccount.Ban != receivedAccount.Ban || expectedAccount.Bic != receivedAccount.Bic || - expectedAccount.Balance.UnscaledBig().Int64() != receivedAccount.Balance.UnscaledBig().Int64() { + expectedAccount.Balance.UnscaledBig(). + Int64() != + receivedAccount.Balance.UnscaledBig(). + Int64() { t.Fail() } } @@ -172,11 +209,13 @@ func PostgresMakeAtomicTransfer(t *testing.T) { State: "", } - if err := postgresCluster.MakeAtomicTransfer(&expectedTransfer, uuid.UUID(rand.NewClientID())); err != nil { + if err = postgresCluster.MakeAtomicTransfer( + &expectedTransfer, uuid.UUID(rand.NewClientID()), + ); err != nil { t.Errorf("TestMakeAtomicTransfer() received internal error %v, but expected nil", err) } - if err := postgresCluster.pool.QueryRow( + if err = postgresCluster.pool.QueryRow( context.TODO(), `SELECT src_bic, src_ban, dst_bic, dst_ban, amount FROM transfer WHERE transfer_id = $1;`, expectedTransfer.Id).Scan( &receivedTransfer.Acs[0].Bic, @@ -190,35 +229,65 @@ func PostgresMakeAtomicTransfer(t *testing.T) { receivedTransfer.Amount = dec if receivedTransfer.Acs[0].Bic != expectedTransfer.Acs[0].Bic { - t.Errorf("TestMakeAtomicTransfer() expected source Bic %v , but received %v", expectedTransfer.Acs[0].Bic, receivedTransfer.Acs[0].Bic) + t.Errorf( + "TestMakeAtomicTransfer() expected source Bic %v , but received %v", + expectedTransfer.Acs[0].Bic, + receivedTransfer.Acs[0].Bic, + ) } if receivedTransfer.Acs[0].Ban != expectedTransfer.Acs[0].Ban { - t.Errorf("TestMakeAtomicTransfer() expected source Bic %v , but received %v", expectedTransfer.Acs[0].Ban, receivedTransfer.Acs[0].Ban) + t.Errorf( + "TestMakeAtomicTransfer() expected source Bic %v , but received %v", + expectedTransfer.Acs[0].Ban, + receivedTransfer.Acs[0].Ban, + ) } if receivedTransfer.Acs[1].Bic != expectedTransfer.Acs[1].Bic { - t.Errorf("TestMakeAtomicTransfer() expected source Bic %v , but received %v", expectedTransfer.Acs[1].Bic, receivedTransfer.Acs[1].Bic) + t.Errorf( + "TestMakeAtomicTransfer() expected source Bic %v , but received %v", + expectedTransfer.Acs[1].Bic, + receivedTransfer.Acs[1].Bic, + ) } if receivedTransfer.Acs[1].Ban != expectedTransfer.Acs[1].Ban { - t.Errorf("TestMakeAtomicTransfer() expected source Bic %v , but received %v", expectedTransfer.Acs[1].Ban, receivedTransfer.Acs[1].Ban) + t.Errorf( + "TestMakeAtomicTransfer() expected source Bic %v , but received %v", + expectedTransfer.Acs[1].Ban, + receivedTransfer.Acs[1].Ban, + ) } if receivedAccount, err = postgresCluster.GetAccount(expectedTransfer.Acs[0].Bic, expectedTransfer.Acs[0].Ban); err != nil { t.Errorf("TestInsertAccount() received internal error %v, but expected nil", err) } - expectedSourceBalance0 := expectedTransfer.Acs[0].Balance.UnscaledBig().Int64() - expectedTransfer.Amount.UnscaledBig().Int64() + expectedSourceBalance0 := expectedTransfer.Acs[0].Balance.UnscaledBig(). + Int64() - + expectedTransfer.Amount.UnscaledBig(). + Int64() if receivedAccount.Balance.UnscaledBig().Int64() != expectedSourceBalance0 { - t.Errorf("TestMakeAtomicTransfer() mismatched source balance; excepted %v but received %v", expectedSourceBalance0, receivedAccount.Balance.UnscaledBig().Int64()) + t.Errorf( + "TestMakeAtomicTransfer() mismatched source balance; excepted %v but received %v", + expectedSourceBalance0, + receivedAccount.Balance.UnscaledBig().Int64(), + ) } if receivedAccount, err = postgresCluster.GetAccount(expectedTransfer.Acs[1].Bic, expectedTransfer.Acs[1].Ban); err != nil { t.Errorf("TestInsertAccount() received internal error %v, but expected nil", err) } - expectedSourceBalance1 := expectedTransfer.Acs[1].Balance.UnscaledBig().Int64() + expectedTransfer.Amount.UnscaledBig().Int64() + expectedSourceBalance1 := expectedTransfer.Acs[1].Balance.UnscaledBig(). + Int64() + + expectedTransfer.Amount.UnscaledBig(). + Int64() if receivedAccount.Balance.UnscaledBig().Int64() != expectedSourceBalance1 { - t.Errorf("TestMakeAtomicTransfer() mismatched source balance; excepted %v but received %v", expectedSourceBalance1, receivedAccount.Balance.UnscaledBig().Int64()) + t.Errorf( + "TestMakeAtomicTransfer() mismatched source balance; excepted %v but received %v", + expectedSourceBalance1, + receivedAccount.Balance.UnscaledBig().Int64(), + ) } } @@ -232,8 +301,11 @@ func PostgresFetchAccounts(t *testing.T) { accounts := GenerateAccounts() for _, expectedAccount := range accounts { - if err := postgresCluster.InsertAccount(expectedAccount); err != nil { - t.Errorf("TestCockroachInsertAccount() received internal error %v, but expected nil", err) + if err = postgresCluster.InsertAccount(expectedAccount); err != nil { + t.Errorf( + "TestCockroachInsertAccount() received internal error %v, but expected nil", + err, + ) } } receivedAccounts, err = postgresCluster.FetchAccounts() @@ -243,9 +315,20 @@ func PostgresFetchAccounts(t *testing.T) { sort.Sort(sortAccount(accounts)) sort.Sort(sortAccount(receivedAccounts)) for i, account := range receivedAccounts { - if accounts[i].Bic != account.Bic || accounts[i].Ban != account.Ban || accounts[i].Balance.Cmp(account.Balance) != 0 { - fmt.Printf("received: Bic %s, Ban %s, Balance %s\n", account.Bic, account.Ban, account.Balance.String()) - fmt.Printf("expected: Bic %s, Ban %s, Balance %s\n", accounts[i].Bic, accounts[i].Ban, accounts[i].Balance.String()) + if accounts[i].Bic != account.Bic || accounts[i].Ban != account.Ban || + accounts[i].Balance.Cmp(account.Balance) != 0 { + logrus.Warnf( + "received: Bic %s, Ban %s, Balance %s\n", + account.Bic, + account.Ban, + account.Balance.String(), + ) + logrus.Warnf( + "expected: Bic %s, Ban %s, Balance %s\n", + accounts[i].Bic, + accounts[i].Ban, + accounts[i].Balance.String(), + ) t.Fail() } } diff --git a/pkg/database/cluster/yandex_constans.go b/pkg/database/cluster/yandex_constans.go deleted file mode 100644 index 6eef594b..00000000 --- a/pkg/database/cluster/yandex_constans.go +++ /dev/null @@ -1,82 +0,0 @@ -package cluster - -const ( - yqlInsertAccount = ` -DECLARE $bic AS String; DECLARE $ban AS String; DECLARE $balance AS Int64; -INSERT INTO "&{stroppyDir}/account" (bic, ban, balance) VALUES ($bic, $ban, $balance); -` - - yqlUpsertTransfer = ` -DECLARE $transfer_id AS String; -DECLARE $src_bic AS String; -DECLARE $src_ban AS String; -DECLARE $dst_bic AS String; -DECLARE $dst_ban AS String; -DECLARE $amount AS Int64; -DECLARE $state AS String; -UPSERT INTO "&{stroppyDir}/transfer" ( - transfer_id, - src_bic, - src_ban, - dst_bic, - dst_ban, - amount, - state -) -VALUES ( - $transfer_id, - $src_bic, - $src_ban, - $dst_bic, - $dst_ban, - $amount, - $state -);` - - yqlSelectSrcDstAccount = ` -DECLARE $src_bic AS String; -DECLARE $src_ban AS String; -DECLARE $dst_bic AS String; -DECLARE $dst_ban AS String; -SELECT 1 AS srcdst, balance -FROM "&{stroppyDir}/account" -WHERE bic = $src_bic AND ban = $src_ban -UNION ALL -SELECT 2 AS srcdst, balance -FROM "&{stroppyDir}/account" -WHERE bic = $dst_bic AND ban = $dst_ban; -` - - yqlUpsertSrcDstAccount = ` -DECLARE $src_bic AS String; -DECLARE $src_ban AS String; -DECLARE $dst_bic AS String; -DECLARE $dst_ban AS String; -DECLARE $amount AS Int64; -$shared_select = ( - SELECT - bic, - ban, - balance - $amount AS balance - FROM "&{stroppyDir}/account" - WHERE bic = $src_bic AND ban = $src_ban - UNION ALL - SELECT - bic, - ban, - balance + $amount AS balance - FROM "&{stroppyDir}/account" - WHERE bic = $dst_bic AND ban = $dst_ban -); - -UPDATE "&{stroppyDir}/account" ON -SELECT * FROM $shared_select; -` - - yqlSelectBalanceAccount = ` -DECLARE $bic AS String; DECLARE $ban AS String; -SELECT balance, CAST(0 AS Int64) AS pending -FROM "&{stroppyDir}/account" -WHERE bic = $bic AND ban = $ban -` -) diff --git a/pkg/database/cluster/yandex.go b/pkg/database/cluster/ydb.go similarity index 64% rename from pkg/database/cluster/yandex.go rename to pkg/database/cluster/ydb.go index eb3ff383..fc539202 100644 --- a/pkg/database/cluster/yandex.go +++ b/pkg/database/cluster/ydb.go @@ -2,14 +2,18 @@ package cluster import ( "context" + "crypto/sha1" //nolint + _ "embed" + "encoding/base64" "fmt" "os" "path" "strconv" "strings" + "sync" + "text/template" "time" - "github.com/ansel1/merry/v2" "github.com/google/uuid" "github.com/pkg/errors" llog "github.com/sirupsen/logrus" @@ -21,8 +25,9 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3/table/result" "github.com/ydb-platform/ydb-go-sdk/v3/table/result/named" "github.com/ydb-platform/ydb-go-sdk/v3/table/types" - "gitlab.com/picodata/stroppy/internal/model" "gopkg.in/inf.v0" + + "gitlab.com/picodata/stroppy/internal/model" ) const ( @@ -31,23 +36,29 @@ const ( stroppyAgent string = "stroppy 1.0" // default operation timeout. defaultTimeout = time.Second * 10 - // partitioning settings for accounts and transfers tables. - partitionsMinCount = 100 - partitionsMaxMbytes = 256 - poolSizeOverhead = 10 + // extra connections in the pool. + poolSizeOverhead = 10 ) -var errIllegalNilOutput = errors.New( - "Illegal nil output value of balance column for srcdst account statement", +var ( + //go:embed ydb_insert_account.yql + yqlInsertAccount string + + //go:embed ydb_transfer.yql + yqlTransfer string + + //go:embed ydb_select_balance_account.yql + yqlSelectBalanceAccount string ) -type YandexDBCluster struct { +type YdbCluster struct { ydbConnection ydb.Connection yqlInsertAccount string - yqlUpsertTransfer string - yqlSelectSrcDstAcc string - yqlUpsertSrcDstAcc string yqlSelectBalanceAcc string + yqlTransferSingleOp string + transferIDHashing bool + partitionsMaxSize int + partitionsMinCount int } func envExists(key string) bool { @@ -64,11 +75,74 @@ func envConfigured() bool { envExists("YDB_ACCESS_TOKEN_CREDENTIALS")) } -func NewYandexDBCluster( +func envTransferIDHashing() bool { + if value, ok := os.LookupEnv("YDB_STROPPY_HASH_TRANSFER_ID"); ok { + if (value == "1") || (value == "Y") { + llog.Infoln("YDB transfer id hashing is ENABLED") + + return true + } + } + + return false +} + +func envPartitionsMinCount() int { + ret := 300 + + if value, ok := os.LookupEnv("YDB_STROPPY_PARTITIONS_COUNT"); ok { + partitionNum, err := strconv.Atoi(value) + if err != nil || partitionNum <= 0 || partitionNum > 10000 { + llog.Warningln( + "Illegal value [", + value, + "] passed in YDB_STROPPY_PARTITIONS_COUNT, ignored", + ) + } else { + ret = partitionNum + } + } + + llog.Infoln("Using YDB minimal partition count ", ret) + + return ret +} + +func envPartitionsMaxSize() int { + ret := 512 + + if value, ok := os.LookupEnv("YDB_STROPPY_PARTITIONS_SIZE"); ok { + partitionNum, err := strconv.Atoi(value) + if err != nil || partitionNum <= 0 || partitionNum > 10000 { + llog.Warningln( + "Illegal value [", + value, + "] passed in YDB_STROPPY_PARTITIONS_SIZE, ignored", + ) + } else { + ret = partitionNum + } + } + + llog.Infoln("Using YDB maximal partition size ", ret) + + return ret +} + +func envTLSCertificateFile() string { + if value, ok := os.LookupEnv("YDB_TLS_CERTIFICATES_FILE"); ok { + return value + } + + return "" +} + +func NewYdbCluster( ydbContext context.Context, dbURL string, - poolSize int, -) (*YandexDBCluster, error) { + poolSize uint64, +) (*YdbCluster, error) { + llog.Infof("YDB Go SDK version %s", ydb.Version) llog.Infof("Establishing connection to YDB on %s with poolSize %d", dbURL, poolSize) var ( @@ -76,134 +150,152 @@ func NewYandexDBCluster( err error ) + ydbOptions := []ydb.Option{ + ydb.WithUserAgent(stroppyAgent), + ydb.WithSessionPoolSizeLimit(int(poolSize + poolSizeOverhead)), + ydb.WithSessionPoolIdleThreshold(defaultTimeout), + ydb.WithDiscoveryInterval(defaultTimeout), + } if envConfigured() { - llog.Infoln("NOTE: YDB connection credentials are configured through the environment") - - database, err = ydb.Open(ydbContext, dbURL, - ydb.WithUserAgent(stroppyAgent), - ydb.WithSessionPoolSizeLimit(poolSize+poolSizeOverhead), - ydb.WithSessionPoolIdleThreshold(defaultTimeout), - ydb.WithDiscoveryInterval(defaultTimeout), - environ.WithEnvironCredentials(ydbContext), - ) - } else { - database, err = ydb.Open(ydbContext, dbURL, - ydb.WithUserAgent(stroppyAgent), - ydb.WithSessionPoolSizeLimit(poolSize+poolSizeOverhead), - ydb.WithSessionPoolIdleThreshold(defaultTimeout), - ydb.WithDiscoveryInterval(defaultTimeout), - ) + llog.Infoln("YDB connection credentials are configured through the environment") + + ydbOptions = append(ydbOptions, environ.WithEnvironCredentials(ydbContext)) + } + + if tlsCertFile := envTLSCertificateFile(); len(tlsCertFile) > 0 { + llog.Infoln("YDB custom TLS certificate file: ", tlsCertFile) + ydbOptions = append(ydbOptions, ydb.WithCertificatesFromFile(tlsCertFile)) } + database, err = ydb.Open(ydbContext, dbURL, ydbOptions...) if err != nil { - return nil, errors.Wrap(err, "Error creating YDB connection holder") + return nil, errors.Wrap(err, "Failed to create YDB connection") } - return &YandexDBCluster{ + return &YdbCluster{ ydbConnection: database, - yqlUpsertTransfer: expandYql(yqlUpsertTransfer), - yqlSelectSrcDstAcc: expandYql(yqlSelectSrcDstAccount), - yqlUpsertSrcDstAcc: expandYql(yqlUpsertSrcDstAccount), yqlInsertAccount: expandYql(yqlInsertAccount), yqlSelectBalanceAcc: expandYql(yqlSelectBalanceAccount), + yqlTransferSingleOp: expandYql(yqlTransfer), + transferIDHashing: envTransferIDHashing(), + partitionsMaxSize: envPartitionsMaxSize(), + partitionsMinCount: envPartitionsMinCount(), }, nil } -func (*YandexDBCluster) GetClusterType() DBClusterType { +func (*YdbCluster) GetClusterType() DBClusterType { return YandexDBClusterType } -func (ydbCluster *YandexDBCluster) FetchSettings() (Settings, error) { +var ( + globalYdbClusterSettings *Settings + globalYdbClusterSettingsMtx sync.Mutex +) + +func (ydbCluster *YdbCluster) FetchSettings() (Settings, error) { + globalYdbClusterSettingsMtx.Lock() + defer globalYdbClusterSettingsMtx.Unlock() + + if globalYdbClusterSettings != nil { + return *globalYdbClusterSettings, nil + } + var ( - err error - clusterSettins Settings + err error + clusterSettings Settings ) + defer func() { + if err == nil { + globalYdbClusterSettings = &clusterSettings + } + }() + ydbContext, ctxCloseFn := context.WithCancel(context.Background()) defer ctxCloseFn() - tableFullPath := path.Join(ydbCluster.ydbConnection.Name(), stroppyDir, "settings") + selectStmnt := fmt.Sprintf("SELECT key, value FROM `%s/settings`", stroppyDir) if err = ydbCluster.ydbConnection.Table().Do( ydbContext, func(ydbContext context.Context, ydbSession table.Session) error { - var queryResult result.StreamResult - if queryResult, err = ydbSession.StreamReadTable( - ydbContext, - tableFullPath, - ); err != nil { - return errors.Wrap(err, "failed to reading table in stream") + var rows result.Result + _, rows, err = ydbSession.Execute(ydbContext, table.DefaultTxControl(), selectStmnt, nil) + if err != nil { + return errors.Wrap(err, "failed to execute query") } - - llog.Traceln("Settings successfully fetched from ydb") - defer func() { - _ = queryResult.Close() + _ = rows.Close() }() var ( key string value string ) - - for queryResult.NextResultSet(ydbContext) { - for queryResult.NextRow() { - if err = queryResult.ScanNamed( + for rows.NextResultSet(ydbContext) { + for rows.NextRow() { + if err = rows.ScanNamed( named.OptionalWithDefault("key", &key), named.OptionalWithDefault("value", &value), ); err != nil { - return errors.Wrap(err, "failed ot scan parameters") + return errors.Wrap(err, "failed to get next row in scan") } + llog.Tracef("Settings{ key: %s, value: %s }", key, value) switch key { case "count": - if clusterSettins.Count, err = strconv.Atoi(value); err != nil { + if clusterSettings.Count, err = strconv.Atoi(value); err != nil { return errors.Wrap(err, "failed to convert count into integer") } case "seed": - if clusterSettins.Seed, err = strconv.Atoi(value); err != nil { + if clusterSettings.Seed, err = strconv.Atoi(value); err != nil { return errors.Wrap(err, "failed to convert seed into integer") } } - llog.Tracef( - "Settings{ key: %s, value: %s }", - key, - value, - ) } } - if err = queryResult.Err(); err != nil { - return errors.Wrap(err, "failed retrieve query result") - } - return nil }, + table.WithIdempotent(), ); err != nil { - return clusterSettins, errors.Wrap(err, "Error fetching data from settings table") + return clusterSettings, errors.Wrap(err, "Error fetching data from settings table") + } + + return clusterSettings, nil +} + +func transferID(useHash bool, transferId *model.TransferId) string { //nolint + if useHash { + hasher := sha1.New() //nolint + hasher.Write(transferId[:]) + + return base64.URLEncoding.EncodeToString(hasher.Sum(nil)) } - return clusterSettins, nil + return transferId.String() } -func (ydbCluster *YandexDBCluster) MakeAtomicTransfer( +func (ydbCluster *YdbCluster) MakeAtomicTransfer( transfer *model.Transfer, //nolint clientID uuid.UUID, ) error { var err error - ydbContext, ctxCloseFn := context.WithCancel(context.Background()) - defer ctxCloseFn() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() amount := transfer.Amount.UnscaledBig().Int64() - - if err = ydbCluster.ydbConnection.Table().DoTx( - ydbContext, - func(ctx context.Context, tx table.TransactionActor) error { - // Select from account table - var query result.Result - query, err = tx.Execute( - ctx, ydbCluster.yqlSelectSrcDstAcc, + transferID := transferID(ydbCluster.transferIDHashing, &transfer.Id) + + // Execute the single-statement transfer transaction + if err = ydbCluster.ydbConnection.Table().Do(ctx, + func(ctx context.Context, s table.Session) error { + _, _, err = s.Execute(ctx, + table.SerializableReadWriteTxControl(table.CommitTx()), + ydbCluster.yqlTransferSingleOp, table.NewQueryParameters( + table.ValueParam("transfer_id", + types.BytesValueFromString(transferID)), table.ValueParam("src_bic", types.BytesValueFromString(transfer.Acs[0].Bic)), table.ValueParam("src_ban", @@ -212,113 +304,49 @@ func (ydbCluster *YandexDBCluster) MakeAtomicTransfer( types.BytesValueFromString(transfer.Acs[1].Bic)), table.ValueParam("dst_ban", types.BytesValueFromString(transfer.Acs[1].Ban)), + table.ValueParam("amount", + types.Int64Value(amount)), + table.ValueParam("state", + types.BytesValueFromString("complete")), ), options.WithKeepInCache(true), ) if err != nil { - return errors.Wrap(err, "failed to execute transaction") - } - defer func() { - _ = query.Close() - }() - - for query.NextResultSet(ctx) { - // Expect to have 2 rows - source and destination accounts. - // In case of 0 or 1 rows something is missing. - if query.CurrentResultSet().RowCount() != 2 { //nolint:gomnd // not magic number + // TODO: find a better way to grab the specific errors + text := err.Error() + if strings.Contains(text, "MISSING_ACCOUNTS") { llog.Tracef( "missing transfer: src_bic: %s, src_ban: %s dst_bic: %s, dst_ban: %s", transfer.Acs[0].Bic, transfer.Acs[0].Ban, transfer.Acs[1].Bic, transfer.Acs[1].Ban, ) - return ErrNoRows } - for query.NextRow() { - var srcdst int32 - var balance *int64 - if err = query.Scan(&srcdst, &balance); err != nil { - return errors.Wrap(err, "failed to scan account balance") - } - if balance == nil { - return errIllegalNilOutput - } - switch srcdst { - case 1: // need to check the source account balance - if *balance < amount { - return ErrInsufficientFunds - } - case 2: //nolint:gomnd // nothing to do on the destination account - default: // something strange to be reported - return merry.Errorf( - "Illegal srcdst value %d for srcdst account statement", - srcdst, - ) - } - } - } - if err = query.Err(); err != nil { - return errors.Wrap(err, "failed to retrieve query status") - } + if strings.Contains(text, "INSUFFICIENT_FUNDS") { + llog.Tracef( + "insufficient funds: src_bic: %s, src_ban: %s dst_bic: %s, dst_ban: %s", + transfer.Acs[0].Bic, transfer.Acs[0].Ban, + transfer.Acs[1].Bic, transfer.Acs[1].Ban, + ) - // Upsert the new row to the transfer table - _, err = tx.Execute( - ctx, ydbCluster.yqlUpsertTransfer, - table.NewQueryParameters( - table.ValueParam("transfer_id", - types.BytesValueFromString(transfer.Id.String())), - table.ValueParam("src_bic", - types.BytesValueFromString(transfer.Acs[0].Bic)), - table.ValueParam("src_ban", - types.BytesValueFromString(transfer.Acs[0].Ban)), - table.ValueParam("dst_bic", - types.BytesValueFromString(transfer.Acs[1].Bic)), - table.ValueParam("dst_ban", - types.BytesValueFromString(transfer.Acs[1].Ban)), - table.ValueParam("amount", - types.Int64Value(amount)), - table.ValueParam("state", - types.BytesValueFromString("complete")), - ), - options.WithKeepInCache(true), - ) - if err != nil { - return errors.Wrap(err, "failed to execute transaction") - } + return ErrInsufficientFunds + } - // Update two balances in the account table. - _, err = tx.Execute( - ctx, ydbCluster.yqlUpsertSrcDstAcc, - table.NewQueryParameters( - table.ValueParam("src_bic", - types.BytesValueFromString(transfer.Acs[0].Bic)), - table.ValueParam("src_ban", - types.BytesValueFromString(transfer.Acs[0].Ban)), - table.ValueParam("dst_bic", - types.BytesValueFromString(transfer.Acs[1].Bic)), - table.ValueParam("dst_ban", - types.BytesValueFromString(transfer.Acs[1].Ban)), - table.ValueParam("amount", - types.Int64Value(transfer.Amount.UnscaledBig().Int64())), - ), - options.WithKeepInCache(true), - ) - if err != nil { - return errors.Wrap(err, "failed to execute transaction") + return errors.Wrap(err, "failed to execute the transfer") } return nil }, - // Mark the transaction idempotent to allow retries. + // Mark the operation idempotent to allow retries. table.WithIdempotent(), ); err != nil { - return errors.Wrap(err, "failed to execute 'Do' procedure") + return errors.Wrap(err, "failed to execute query") } return nil } -func (ydbCluster *YandexDBCluster) FetchAccounts() ([]model.Account, error) { +func (ydbCluster *YdbCluster) FetchAccounts() ([]model.Account, error) { var err error ydbContext, ctxCloseFn := context.WithCancel(context.Background()) @@ -337,7 +365,7 @@ func (ydbCluster *YandexDBCluster) FetchAccounts() ([]model.Account, error) { rows, err = sess.StreamExecuteScanQuery(ctx, selectStmnt, nil) if err != nil { - return errors.Wrap(err, "failed to execute scan query") + return errors.Wrap(err, "failed to execute scan query on account table") } defer func() { _ = rows.Close() @@ -365,7 +393,7 @@ func (ydbCluster *YandexDBCluster) FetchAccounts() ([]model.Account, error) { return accs, nil } -func (ydbCluster *YandexDBCluster) FetchBalance( +func (ydbCluster *YdbCluster) FetchBalance( //nolint bic string, ban string, ) (*inf.Dec, *inf.Dec, error) { @@ -418,7 +446,7 @@ func (ydbCluster *YandexDBCluster) FetchBalance( return nil, nil, errors.Errorf("No amount for bic %s and ban %s", bic, ban) } -func (ydbCluster *YandexDBCluster) FetchTotal() (*inf.Dec, error) { +func (ydbCluster *YdbCluster) FetchTotal() (*inf.Dec, error) { var ( err error queryResult result.Result @@ -467,7 +495,7 @@ func (ydbCluster *YandexDBCluster) FetchTotal() (*inf.Dec, error) { return inf.NewDec(amount, 0), nil } -func (ydbCluster *YandexDBCluster) CheckBalance() (*inf.Dec, error) { +func (ydbCluster *YdbCluster) CheckBalance() (*inf.Dec, error) { var ( err error queryResult result.Result @@ -514,7 +542,7 @@ func (ydbCluster *YandexDBCluster) CheckBalance() (*inf.Dec, error) { return inf.NewDec(totalBalance, 0), nil } -func (ydbCluster *YandexDBCluster) PersistTotal(total inf.Dec) error { +func (ydbCluster *YdbCluster) PersistTotal(total inf.Dec) error { var err error ydbContext, ctxCloseFn := context.WithCancel(context.Background()) @@ -549,7 +577,7 @@ func (ydbCluster *YandexDBCluster) PersistTotal(total inf.Dec) error { return nil } -func (ydbCluster *YandexDBCluster) BootstrapDB(count, seed int) error { +func (ydbCluster *YdbCluster) BootstrapDB(count uint64, seed int) error { var err error llog.Infof("Creating the folders and tables...") @@ -567,36 +595,20 @@ func (ydbCluster *YandexDBCluster) BootstrapDB(count, seed int) error { return err } - if err = createSettingsTable( - ydbContext, - ydbCluster.ydbConnection.Table(), - prefix, - ); err != nil { - return err + if err = ydbCluster.createSettingsTable(ydbContext, prefix); err != nil { + return errors.Wrap(err, "failed to bootstrap yandex database") } - if err = createAccountTable( - ydbContext, - ydbCluster.ydbConnection.Table(), - prefix, - ); err != nil { - return err + if err = ydbCluster.createAccountTable(ydbContext, prefix); err != nil { + return errors.Wrap(err, "failed to bootstrap yandex database") } - if err = createTransferTable( - ydbContext, - ydbCluster.ydbConnection.Table(), - prefix, - ); err != nil { - return err + if err = ydbCluster.createTransferTable(ydbContext, prefix); err != nil { + return errors.Wrap(err, "failed to bootstrap yandex database") } - if err = createChecksumTable( - ydbContext, - ydbCluster.ydbConnection.Table(), - prefix, - ); err != nil { - return err + if err = ydbCluster.createChecksumTable(ydbContext, prefix); err != nil { + return errors.Wrap(err, "failed to bootstrap yandex database") } if err = upsertSettings( @@ -611,15 +623,15 @@ func (ydbCluster *YandexDBCluster) BootstrapDB(count, seed int) error { return nil } -func createSettingsTable( //nolint:dupl // because it golang +func (ydbCluster *YdbCluster) createSettingsTable( //nolint:dupl // because it golang ydbContext context.Context, - ydbClient table.Client, prefix string, + prefix string, ) error { var err error tabname := path.Join(prefix, "settings") if err = recreateTable( - ydbContext, ydbClient, tabname, + ydbContext, ydbCluster.ydbConnection.Table(), tabname, func(ctx context.Context, session table.Session) error { if err = session.CreateTable( ctx, tabname, @@ -627,27 +639,35 @@ func createSettingsTable( //nolint:dupl // because it golang options.WithColumn("value", types.Optional(types.TypeString)), options.WithPrimaryKeyColumn("key"), ); err != nil { - return errors.Wrap(err, "failed to create table") + return errors.Wrap(err, "failed to create settings table") } - return nil }, ); err != nil { - return errors.Wrap(err, "failed to recreate settings table") + return errors.Wrap(err, "failed to (re)create settings table") } return nil } -func createAccountTable( +func (ydbCluster *YdbCluster) createAccountTable( ydbContext context.Context, - ydbClient table.Client, prefix string, + prefix string, ) error { var err error + partitionsMinCount := ydbCluster.partitionsMinCount + if partitionsMinCount < 10 { //nolint + partitionsMinCount = 10 + } else if partitionsMinCount > 10000 { //nolint + partitionsMinCount = 10000 + } + + partitionsMaxCount := partitionsMinCount + 10 + (ydbCluster.partitionsMinCount / 10) //nolint + tabname := path.Join(prefix, "account") if err = recreateTable( - ydbContext, ydbClient, tabname, + ydbContext, ydbCluster.ydbConnection.Table(), tabname, func(ctx context.Context, session table.Session) error { if err = session.CreateTable( ctx, tabname, @@ -658,31 +678,39 @@ func createAccountTable( options.WithPartitioningSettings( options.WithPartitioningByLoad(options.FeatureEnabled), options.WithPartitioningBySize(options.FeatureEnabled), - options.WithMinPartitionsCount(partitionsMinCount), - options.WithPartitionSizeMb(partitionsMaxMbytes), + options.WithMinPartitionsCount(uint64(partitionsMinCount)), + options.WithMaxPartitionsCount(uint64(partitionsMaxCount)), + options.WithPartitionSizeMb(uint64(ydbCluster.partitionsMaxSize)), ), ); err != nil { - return errors.Wrap(err, "failed to create table") + return errors.Wrapf(err, "failed to create account table") } - return nil }, ); err != nil { - return errors.Wrap(err, "failed to recreate account table") + return errors.Wrap(err, "failed to (re)create account table") } return nil } -func createTransferTable( +func (ydbCluster *YdbCluster) createTransferTable( ydbContext context.Context, - ydbClient table.Client, prefix string, + prefix string, ) error { var err error + partitionsMinCount := ydbCluster.partitionsMinCount + if partitionsMinCount < 10 { //nolint + partitionsMinCount = 10 + } else if partitionsMinCount > 10000 { //nolint + partitionsMinCount = 10000 + } + partitionsMaxCount := partitionsMinCount + 10 + (ydbCluster.partitionsMinCount / 10) //nolint + tabname := path.Join(prefix, "transfer") if err = recreateTable( - ydbContext, ydbClient, tabname, + ydbContext, ydbCluster.ydbConnection.Table(), tabname, func(ctx context.Context, session table.Session) error { if err = session.CreateTable( ctx, tabname, @@ -699,31 +727,31 @@ func createTransferTable( options.WithPartitioningSettings( options.WithPartitioningByLoad(options.FeatureEnabled), options.WithPartitioningBySize(options.FeatureEnabled), - options.WithMinPartitionsCount(partitionsMinCount), - options.WithPartitionSizeMb(partitionsMaxMbytes), + options.WithMinPartitionsCount(uint64(partitionsMinCount)), + options.WithMaxPartitionsCount(uint64(partitionsMaxCount)), + options.WithPartitionSizeMb(uint64(ydbCluster.partitionsMaxSize)), ), ); err != nil { - return errors.Wrap(err, "failed to create table") + return errors.Wrapf(err, "failed to create transfer table") } - return nil }, ); err != nil { - return errors.Wrap(err, "failed to recreate account table") + return errors.Wrap(err, "failed to (re)create transfer table") } return nil } -func createChecksumTable( //nolint:dupl // because it golang +func (ydbCluster *YdbCluster) createChecksumTable( //nolint:dupl // because it golang ydbContext context.Context, - ydbClient table.Client, prefix string, + prefix string, ) error { var err error tabname := path.Join(prefix, "checksum") if err = recreateTable( - ydbContext, ydbClient, tabname, + ydbContext, ydbCluster.ydbConnection.Table(), tabname, func(ctx context.Context, session table.Session) error { if err = session.CreateTable( ctx, tabname, @@ -731,13 +759,13 @@ func createChecksumTable( //nolint:dupl // because it golang options.WithColumn("amount", types.Optional(types.TypeInt64)), options.WithPrimaryKeyColumn("name"), ); err != nil { - return errors.Wrap(err, "failed to create table") + return errors.Wrapf(err, "failed to create checksum table") } return nil }, ); err != nil { - return errors.Wrap(err, "failed to recreate checksum table") + return errors.Wrap(err, "failed to (re)create checksum table") } return nil @@ -849,7 +877,7 @@ func upsertSettings( return nil } -func (ydbCluster *YandexDBCluster) InsertAccount(acc model.Account) error { +func (ydbCluster *YdbCluster) InsertAccount(acc model.Account) error { var err error ydbContext, ctxCloseFn := context.WithCancel(context.Background()) @@ -884,38 +912,38 @@ func (ydbCluster *YandexDBCluster) InsertAccount(acc model.Account) error { return nil } -func (ydbCluster *YandexDBCluster) InsertTransfer(transfer *model.Transfer) error { +func (ydbCluster *YdbCluster) InsertTransfer(transfer *model.Transfer) error { panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) DeleteTransfer( +func (ydbCluster *YdbCluster) DeleteTransfer( transferID model.TransferId, clientID uuid.UUID, ) error { panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) SetTransferClient( +func (ydbCluster *YdbCluster) SetTransferClient( clientID uuid.UUID, transferID model.TransferId, ) error { panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) FetchTransferClient( +func (ydbCluster *YdbCluster) FetchTransferClient( transferID model.TransferId, ) (*uuid.UUID, error) { panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) ClearTransferClient( +func (ydbCluster *YdbCluster) ClearTransferClient( transferID model.TransferId, clientID uuid.UUID, ) error { panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) SetTransferState( +func (ydbCluster *YdbCluster) SetTransferState( state string, transferID model.TransferId, clientID uuid.UUID, @@ -923,17 +951,17 @@ func (ydbCluster *YandexDBCluster) SetTransferState( panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) FetchTransfer( +func (ydbCluster *YdbCluster) FetchTransfer( transferID model.TransferId, ) (*model.Transfer, error) { panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) FetchDeadTransfers() ([]model.TransferId, error) { +func (ydbCluster *YdbCluster) FetchDeadTransfers() ([]model.TransferId, error) { panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) UpdateBalance( +func (ydbCluster *YdbCluster) UpdateBalance( balance *inf.Dec, bic string, ban string, @@ -942,7 +970,7 @@ func (ydbCluster *YandexDBCluster) UpdateBalance( panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) LockAccount( +func (ydbCluster *YdbCluster) LockAccount( transferID model.TransferId, pendingAmount *inf.Dec, bic string, @@ -951,7 +979,7 @@ func (ydbCluster *YandexDBCluster) LockAccount( panic("unimplemented!") } -func (ydbCluster *YandexDBCluster) UnlockAccount( +func (ydbCluster *YdbCluster) UnlockAccount( bic string, ban string, transferID model.TransferId, @@ -960,17 +988,26 @@ func (ydbCluster *YandexDBCluster) UnlockAccount( } // TODO: check possibility of collecting statistics for YDB. -func (ydbCluster *YandexDBCluster) StartStatisticsCollect(_ time.Duration) error { +func (ydbCluster *YdbCluster) StartStatisticsCollect(_ time.Duration) error { llog.Debugln("statistic for YDB not implemeted yet, watch grafana metrics, please") return nil } +// Template for generating YQL queries. +var ydbYqlTemplate = template.New("").Funcs(template.FuncMap{ + "stroppyDir": func() string { + return stroppyDir + }, +}) + // Substitute directory path into the YQL template, // replacing the double quote characters with backticks. func expandYql(query string) string { - retval := strings.ReplaceAll(query, "&{stroppyDir}", stroppyDir) - retval = strings.ReplaceAll(retval, `"`, "`") + var buffer strings.Builder + if err := template.Must(ydbYqlTemplate.Parse(query)).Execute(&buffer, nil); err != nil { + panic(err) + } - return retval + return buffer.String() } diff --git a/pkg/database/cluster/ydb_insert_account.yql b/pkg/database/cluster/ydb_insert_account.yql new file mode 100644 index 00000000..be344aa4 --- /dev/null +++ b/pkg/database/cluster/ydb_insert_account.yql @@ -0,0 +1,2 @@ +DECLARE $bic AS String; DECLARE $ban AS String; DECLARE $balance AS Int64; +INSERT INTO `{{ stroppyDir }}/account` (bic, ban, balance) VALUES ($bic, $ban, $balance); diff --git a/pkg/database/cluster/ydb_select_balance_account.yql b/pkg/database/cluster/ydb_select_balance_account.yql new file mode 100644 index 00000000..ece392c8 --- /dev/null +++ b/pkg/database/cluster/ydb_select_balance_account.yql @@ -0,0 +1,5 @@ +DECLARE $bic AS String; DECLARE $ban AS String; + +SELECT balance, CAST(0 AS Int64) AS pending +FROM `{{ stroppyDir }}/account` +WHERE bic = $bic AND ban = $ban diff --git a/pkg/database/cluster/ydb_test.go b/pkg/database/cluster/ydb_test.go new file mode 100644 index 00000000..5f6e6036 --- /dev/null +++ b/pkg/database/cluster/ydb_test.go @@ -0,0 +1,34 @@ +package cluster //nolint + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func Test_expandYql(t *testing.T) { + for _, test := range []struct { + in string + out string + }{ + { + in: yqlInsertAccount, + //nolint:lll // because it query + out: "DECLARE $bic AS String; DECLARE $ban AS String; DECLARE $balance AS Int64;\nINSERT INTO `stroppy/account` (bic, ban, balance) VALUES ($bic, $ban, $balance);\n", + }, + { + in: yqlTransfer, + //nolint:lll // because it query + out: "DECLARE $transfer_id AS String;\nDECLARE $src_bic AS String;\nDECLARE $src_ban AS String;\nDECLARE $dst_bic AS String;\nDECLARE $dst_ban AS String;\nDECLARE $amount AS Int64;\nDECLARE $state AS String;\n\n$shared_select = (\n SELECT\n bic,\n ban,\n Ensure(balance - $amount, balance >= $amount, 'INSUFFICIENT_FUNDS') AS balance\n FROM `stroppy/account`\n WHERE bic = $src_bic AND ban = $src_ban\n UNION ALL\n SELECT\n bic,\n ban,\n balance + $amount AS balance\n FROM `stroppy/account`\n WHERE bic = $dst_bic AND ban = $dst_ban\n);\n\nDISCARD SELECT Ensure(2, cnt=2, 'MISSING_ACCOUNTS')\nFROM (SELECT COUNT(*) AS cnt FROM $shared_select);\n\nUPSERT INTO `stroppy/account`\nSELECT * FROM $shared_select;\n\nUPSERT INTO `stroppy/transfer` (transfer_id, src_bic, src_ban, dst_bic, dst_ban, amount, state)\nVALUES ($transfer_id, $src_bic, $src_ban, $dst_bic, $dst_ban, $amount, $state);\n", + }, + { + in: yqlSelectBalanceAccount, + //nolint:lll // because it query + out: "DECLARE $bic AS String; DECLARE $ban AS String;\n\nSELECT balance, CAST(0 AS Int64) AS pending\nFROM `stroppy/account`\nWHERE bic = $bic AND ban = $ban\n", + }, + } { + t.Run("", func(t *testing.T) { + require.Equal(t, test.out, expandYql(test.in)) + }) + } +} diff --git a/pkg/database/cluster/ydb_transfer.yql b/pkg/database/cluster/ydb_transfer.yql new file mode 100644 index 00000000..36103e89 --- /dev/null +++ b/pkg/database/cluster/ydb_transfer.yql @@ -0,0 +1,32 @@ +DECLARE $transfer_id AS String; +DECLARE $src_bic AS String; +DECLARE $src_ban AS String; +DECLARE $dst_bic AS String; +DECLARE $dst_ban AS String; +DECLARE $amount AS Int64; +DECLARE $state AS String; + +$shared_select = ( + SELECT + bic, + ban, + Ensure(balance - $amount, balance >= $amount, 'INSUFFICIENT_FUNDS') AS balance + FROM `{{ stroppyDir }}/account` + WHERE bic = $src_bic AND ban = $src_ban + UNION ALL + SELECT + bic, + ban, + balance + $amount AS balance + FROM `{{ stroppyDir }}/account` + WHERE bic = $dst_bic AND ban = $dst_ban +); + +DISCARD SELECT Ensure(2, cnt=2, 'MISSING_ACCOUNTS') +FROM (SELECT COUNT(*) AS cnt FROM $shared_select); + +UPSERT INTO `{{ stroppyDir }}/account` +SELECT * FROM $shared_select; + +UPSERT INTO `{{ stroppyDir }}/transfer` (transfer_id, src_bic, src_ban, dst_bic, dst_ban, amount, state) +VALUES ($transfer_id, $src_bic, $src_ban, $dst_bic, $dst_ban, $amount, $state); diff --git a/pkg/database/config/defsettings.go b/pkg/database/config/defsettings.go index 46f85a4d..295e2bd0 100644 --- a/pkg/database/config/defsettings.go +++ b/pkg/database/config/defsettings.go @@ -43,8 +43,6 @@ func DefaultSettings() (s *Settings) { WorkingDirectory: workingDirectory, UseChaos: false, - Local: false, - DeploymentSettings: deployDefaults(), DatabaseSettings: DatabaseDefaults(), @@ -67,22 +65,28 @@ func DefaultSettings() (s *Settings) { type TestSettings struct { KubernetesMasterAddress string - UseCloudStroppy bool - RunAsPod bool + RunType string } func TestDefaults() *TestSettings { return &TestSettings{ KubernetesMasterAddress: "", - UseCloudStroppy: false, - RunAsPod: false, + RunType: "controler", } } +func (testSettings *TestSettings) IsController() bool { + return testSettings.RunType == "controller" +} + +func (testSettings *TestSettings) IsLocal() bool { + return testSettings.RunType == "local" +} + type DatabaseSettings struct { DBType string - Workers int - Count int + Workers uint64 + Count uint64 User string Password string Seed int64 @@ -98,7 +102,7 @@ type DatabaseSettings struct { UseCustomTx bool BanRangeMultiplier float64 StatInterval time.Duration - ConnectPoolSize int + ConnectPoolSize uint64 Sharded bool } @@ -120,6 +124,7 @@ func DatabaseDefaults() *DatabaseSettings { StatInterval: 10, ConnectPoolSize: 0, Sharded: false, + Workers: 0, } } diff --git a/pkg/engine/db/cartridge.go b/pkg/engine/db/cartridge.go index a7998304..416bc3a1 100644 --- a/pkg/engine/db/cartridge.go +++ b/pkg/engine/db/cartridge.go @@ -48,7 +48,6 @@ func (cartridge *cartridgeCluster) Connect() (cluster interface{}, err error) { cluster, err = clusterImplementation.NewCartridgeCluster( cartridge.DBUrl, connectionPool, - cartridge.commonCluster.sharded, ) if err != nil { return nil, merry.Prepend(err, "failed to init connect to cartridge cluster") diff --git a/pkg/engine/db/common.go b/pkg/engine/db/common.go index 017967be..bda64746 100644 --- a/pkg/engine/db/common.go +++ b/pkg/engine/db/common.go @@ -57,8 +57,8 @@ type commonCluster struct { DBUrl string - connectionPoolSize int - addPool int + connectionPoolSize uint64 + addPool uint64 sharded bool } diff --git a/pkg/engine/db/yandex.go b/pkg/engine/db/yandex.go index 1686f65e..41bec01b 100644 --- a/pkg/engine/db/yandex.go +++ b/pkg/engine/db/yandex.go @@ -5,7 +5,6 @@ import ( "fmt" "os" "path" - "strconv" "time" "gitlab.com/picodata/stroppy/pkg/database/cluster" @@ -13,9 +12,11 @@ import ( engineSsh "gitlab.com/picodata/stroppy/pkg/engine/ssh" "gitlab.com/picodata/stroppy/pkg/kubernetes" "gitlab.com/picodata/stroppy/pkg/state" + "golang.org/x/sync/errgroup" "github.com/ansel1/merry" helmclient "github.com/mittwald/go-helm-client" + "github.com/pkg/errors" llog "github.com/sirupsen/logrus" ydbApi "github.com/ydb-platform/ydb-kubernetes-operator/api/v1alpha1" goYaml "gopkg.in/yaml.v3" @@ -40,9 +41,10 @@ const ( castingError string = "Error then casting type into interface" roAll int = 0o644 stroppyNamespaceName string = "stroppy" - erasureSpecies string = "block-4-2" ) +const logLevelTrace = "trace" + type yandexCluster struct { commonCluster *commonCluster } @@ -165,13 +167,15 @@ func (yc *yandexCluster) deployYandexDBOperator(shellState *state.State) error { llog.Infof("Release '%s' with YDB operator successfully deployed", rel.Name) + time.Sleep(time.Second * 30) //nolint + return nil } // Connect to freshly deployed cluster. func (yc *yandexCluster) Connect() (interface{}, error) { var ( - connection *cluster.YandexDBCluster + connection *cluster.YdbCluster err error ) @@ -184,7 +188,7 @@ func (yc *yandexCluster) Connect() (interface{}, error) { ydbContext, ctxCloseFn := context.WithTimeout(context.Background(), time.Second) defer ctxCloseFn() - if connection, err = cluster.NewYandexDBCluster( + if connection, err = cluster.NewYdbCluster( ydbContext, yc.commonCluster.DBUrl, yc.commonCluster.connectionPoolSize, @@ -243,6 +247,8 @@ func deployStatusIngress(kube *kubernetes.Kubernetes, shellState *state.State) e // Deploy YDB storage // Parse manifest and deploy yandex db storage via kubectl. +// +//nolint:gomnd // Magic is legal func deployStorage(kube *kubernetes.Kubernetes, shellState *state.State) error { //nolint var ( err error @@ -307,6 +313,16 @@ func deployStorage(kube *kubernetes.Kubernetes, shellState *state.State) error { return merry.Prepend(err, "failed to parameterize storage configuration") } + if shellState.Settings.LogLevel == logLevelTrace { + var data []byte + + if data, err = k8sYaml.Marshal(ydbStorage); err != nil { + return errors.Wrap(err, "failed to serialize storage manifest") + } + + llog.Tracef("YDB storage manifest:\n%s\n", string(data)) + } + if restConfig, err = kube.Engine.GetKubeConfig(); err != nil { return merry.Prepend(err, "failed to get kube config") } @@ -334,12 +350,98 @@ func deployStorage(kube *kubernetes.Kubernetes, shellState *state.State) error { return merry.Prepend(err, "failed to apply storage manifers") } + var clientSet *k8sClient.Clientset + + if clientSet, err = kube.Engine.GetClientSet(); err != nil { + return errors.Wrap(err, "failed to get ClientSet") + } + + errGroup := new(errgroup.Group) + + kubeStatusContext, ctxStatusCloseFn := context.WithCancel(context.Background()) + defer ctxStatusCloseFn() + + for index := 0; index < shellState.NodesInfo.WorkersCnt; index++ { + storagePodName := fmt.Sprintf("stroppy-ydb-storage-%d", index) + + errGroup.Go(func() error { + var ( + ydbStorageReady bool + ydbStorage *v1.Pod + getErr error + ) + + retries := 5 + + for !ydbStorageReady && retries > 0 { + time.Sleep(time.Second * 30) + + kubeGetContext, kubeGetCtxCloseFn := context.WithTimeout( + kubeStatusContext, + time.Second, + ) + + ydbStorage, getErr = clientSet.CoreV1().Pods("stroppy").Get( + kubeGetContext, + storagePodName, + metav1.GetOptions{}, //nolint + ) + + kubeGetCtxCloseFn() + + if getErr != nil { + getErr = errors.Wrapf(getErr, "failed to get %s status", storagePodName) + llog.Warnln(getErr) + + retries-- + + continue + } + + if ydbStorage.Status.Phase != "Running" { + getErr = errors.Errorf( + "storage pod %s still in %s state", + storagePodName, + ydbStorage.Status.Phase, + ) + llog.Warnln(getErr) + + retries-- + + continue + } + + llog.Debugf("Storage state %#v", ydbStorage.Status.Phase) + + ydbStorageReady = true + } + + if retries == 0 { + if deleteErr := ydbRestClient.YDBV1Alpha1().Storages("stroppy").Delete( + kubeContext, + storagePodName, + &metav1.DeleteOptions{}, //nolint + ); deleteErr != nil { + getErr = errors.Wrapf(getErr, "failed to delete %s", storagePodName) + } + } + + return getErr + }) + } + + if err = errGroup.Wait(); err != nil { + return errors.Wrapf(err, "failed to deploy stroppy-ydb-storage") + } + llog.Infof("Storage %s deploy status: success", ydbStorage.Name) return nil } // Generate parameters for `storage` CRD. +// +//nolint:gomnd // magic is legal func parametrizeStorageConfig(storage string, shellState *state.State) (string, error) { //nolint var ( err error @@ -353,11 +455,37 @@ func parametrizeStorageConfig(storage string, shellState *state.State) (string, return "", merry.Prepend(err, "failed to deserialize ydb configuration") } + hostsFunc := func(start, end int, zone string) []map[string]interface{} { + hosts := []map[string]interface{}{} + + for index := start; index < end; index++ { + hosts = append( + hosts, + map[string]interface{}{ + "host": fmt.Sprintf("stroppy-ydb-storage-%d", index), + "host_config_id": 1, + "walle_location": map[string]interface{}{ + "body": index, + "data_center": zone, + "rack": fmt.Sprintf("%d", index), + }, + }, + ) + } + + return hosts + } + domainsConfig, statusOk := confMap["domains_config"].(map[string]interface{}) if !statusOk { return "", merry.Prepend(err, castingError) } + domain, statusOk := domainsConfig["domain"].([]interface{}) + if !statusOk { + return "", errors.Wrap(err, castingError) + } + stateStorage, statusOk := domainsConfig["state_storage"].([]interface{}) if !statusOk { return "", merry.Prepend(err, castingError) @@ -375,10 +503,10 @@ func parametrizeStorageConfig(storage string, shellState *state.State) (string, serviceSet["availability_domains"] = 1 - failDomainsFunc := func(count int) []map[string]interface{} { + failDomainsFunc := func(start, end int) []map[string]interface{} { failDomains := []map[string]interface{}{} - for index := 1; index < count+1; index++ { + for index := start; index < end+1; index++ { failDomains = append( failDomains, map[string]interface{}{ @@ -406,21 +534,26 @@ func parametrizeStorageConfig(storage string, shellState *state.State) (string, return "", merry.Prepend(err, castingError) } - channelProfileFunc := func(erasureSpecies string) map[string]interface{} { + actorSystemConfig, statusOk := confMap["actor_system_config"].(map[string]interface{}) + if !statusOk { + return "", errors.Wrap(err, castingError) + } + + channelProfileFunc := func(errasureSpecies string) map[string]interface{} { return map[string]interface{}{ "channel": []interface{}{ map[string]interface{}{ - "erasure_species": erasureSpecies, + "erasure_species": errasureSpecies, "pdisk_category": 1, "storage_pool_kind": "ssd", }, map[string]interface{}{ - "erasure_species": erasureSpecies, + "erasure_species": errasureSpecies, "pdisk_category": 1, "storage_pool_kind": "ssd", }, map[string]interface{}{ - "erasure_species": erasureSpecies, + "erasure_species": errasureSpecies, "pdisk_category": 1, "storage_pool_kind": "ssd", }, @@ -430,13 +563,15 @@ func parametrizeStorageConfig(storage string, shellState *state.State) (string, } switch shellState.NodesInfo.WorkersCnt { - case 8: //nolint + case 8: + confMap["static_erasure"] = ydbApi.ErasureBlock42 + stateStorage[0] = map[string]interface{}{ "ring": map[string]interface{}{ "node": []interface{}{ 1, 2, 3, 4, 5, 6, 7, 8, }, - "nto_select": 5, //nolint // nto_select is parameter for nto + "nto_select": 5, //nolint }, "ssid": 1, } @@ -445,46 +580,118 @@ func parametrizeStorageConfig(storage string, shellState *state.State) (string, map[string]interface{}{ "group_id": 0, "group_generation": 1, - "erasure_species": erasureSpecies, + "erasure_species": ydbApi.ErasureBlock42, "rings": []map[string]interface{}{ { - "fail_domains": failDomainsFunc(8), //nolint + "fail_domains": failDomainsFunc(1, 8), //nolint }, }, }, } profile[0] = channelProfileFunc(string(ydbApi.ErasureBlock42)) - case 9: //nolint + case 9: + confMap["static_erasure"] = ydbApi.ErasureMirror3DC + + domain[0] = map[string]interface{}{ + "name": "root", + "storage_pool_types": []interface{}{ + map[string]interface{}{ + "kind": "ssd", + "pool_config": map[string]interface{}{ + "box_id": 1, + "erasure_species": ydbApi.ErasureMirror3DC, + "kind": "ssd", + "pdisk_filter": []interface{}{ + map[string]interface{}{ + "property": []interface{}{ + map[string]interface{}{ + "type": "SSD", + }, + }, + }, + }, + "vdisk_kind": "Default", + }, + }, + }, + } + stateStorage[0] = map[string]interface{}{ "ring": map[string]interface{}{ "node": []interface{}{ 1, 2, 3, 4, 5, 6, 7, 8, 9, }, - "nto_select": 5, //nolint // nto_select is parameter for nto + "nto_select": 5, //nolint }, "ssid": 1, } + if shellState.NodesInfo.GetFirstMaster().Resources.CPU == 16 { + actorSystemConfig["executor"] = []interface{}{ + map[string]interface{}{ + "name": "System", + "threads": 2, + "type": "BASIC", + }, + map[string]interface{}{ + "name": "User", + "threads": 8, + "type": "BASIC", + }, + map[string]interface{}{ + "name": "Batch", + "threads": 1, + "type": "BASIC", + }, + map[string]interface{}{ + "name": "IO", + "threads": 1, + "time_per_mailbox_micro_secs": 100, + "type": "IO", + }, + map[string]interface{}{ + "name": "IC", + "spin_threshold": 1, + "threads": 4, + "time_per_mailbox_micro_secs": 100, + "type": "BASIC", + }, + } + } + serviceSet["groups"] = []interface{}{ map[string]interface{}{ "group_id": 0, "group_generation": 1, - "erasure_species": erasureSpecies, + "erasure_species": ydbApi.ErasureMirror3DC, "rings": []map[string]interface{}{ { - "fail_domains": failDomainsFunc(9), //nolint + "fail_domains": failDomainsFunc(1, 3), + }, + { + "fail_domains": failDomainsFunc(4, 6), + }, + { + "fail_domains": failDomainsFunc(7, 9), }, }, }, } + hosts := append(hostsFunc(0, 3, "zone-a"), hostsFunc(3, 6, "zone-b")...) + hosts = append(hosts, hostsFunc(6, 9, "zone-c")...) + + confMap["hosts"] = hosts + profile[0] = channelProfileFunc(string(ydbApi.ErasureMirror3DC)) default: + confMap["static_erasure"] = ydbApi.None + stateStorage[0] = map[string]interface{}{ "ring": map[string]interface{}{ "node": []interface{}{1}, - "nto_select": 1, //nolint // nto_select is parameter for nto + "nto_select": 1, //nolint }, "ssid": 1, } @@ -493,10 +700,10 @@ func parametrizeStorageConfig(storage string, shellState *state.State) (string, map[string]interface{}{ "group_id": 0, "group_generation": 1, - "erasure_species": erasureSpecies, + "erasure_species": ydbApi.None, "rings": []map[string]interface{}{ { - "fail_domains": failDomainsFunc(1), + "fail_domains": failDomainsFunc(1, 1), }, }, }, @@ -517,11 +724,10 @@ func parametrizeStorageConfig(storage string, shellState *state.State) (string, // Parse manifest and deploy yandex db database via RESTapi. func deployDatabase(kube *kubernetes.Kubernetes, shellState *state.State) error { var ( - err error - ydbDatabase ydbApi.Database - restConfig *rest.Config - ydbRestClient *kubeengine.YDBV1Alpha1Client - databaseCPULimits resource.Quantity + err error + ydbDatabase ydbApi.Database + restConfig *rest.Config + ydbRestClient *kubeengine.YDBV1Alpha1Client ) if err = kube.Engine.ToEngineObject( @@ -541,28 +747,23 @@ func deployDatabase(kube *kubernetes.Kubernetes, shellState *state.State) error ydbDatabase.Namespace = stroppyNamespaceName - switch len(shellState.NodesInfo.NodesParams) { - case 8, 9: //nolint - ydbDatabase.Spec.Nodes = 6 //nolint + switch shellState.NodesInfo.WorkersCnt { + case 8: //nolint + ydbDatabase.Spec.Nodes = 8 + case 9: //nolint + ydbDatabase.Spec.Nodes = 9 default: ydbDatabase.Spec.Nodes = 1 //nolint } - var cpu string - - switch { - case shellState.NodesInfo.GetFirstWorker().Resources.CPU == 1|2|3: - cpu = "100m" - default: - cpu = strconv.Itoa(int(shellState.NodesInfo.GetFirstWorker().Resources.CPU / 2)) //nolint - } + if shellState.Settings.LogLevel == logLevelTrace { + var data []byte - if err = k8sYaml.Unmarshal([]byte(cpu), databaseCPULimits); err != nil { - return merry.Prepend(err, "failed to deserialize storageQuantity") - } + if data, err = k8sYaml.Marshal(ydbDatabase); err != nil { + return errors.Wrap(err, "failed to serialize database manifest") + } - ydbDatabase.Spec.Resources.ContainerResources.Limits = v1.ResourceList{ - v1.ResourceCPU: databaseCPULimits, + llog.Tracef("YDB database manifest:\n%s\n", string(data)) } if restConfig, err = kube.Engine.GetKubeConfig(); err != nil { diff --git a/pkg/engine/kubeengine/constants.go b/pkg/engine/kubeengine/constants.go index 48f29ddf..9506646e 100644 --- a/pkg/engine/kubeengine/constants.go +++ b/pkg/engine/kubeengine/constants.go @@ -28,7 +28,7 @@ const ( ConnectionRetryCount = 3 // path to monitoring script. - GetPngScriptPath = "./get_png.sh" + GetPngScriptName = "get_png.sh" SSHUserName = "ubuntu" ) diff --git a/pkg/engine/kubeengine/deploy_crd.go b/pkg/engine/kubeengine/deploy_crd.go index 600890f7..0f09dcf7 100644 --- a/pkg/engine/kubeengine/deploy_crd.go +++ b/pkg/engine/kubeengine/deploy_crd.go @@ -94,16 +94,20 @@ var ( func (storageClient *StorageClient) Get( ctx context.Context, name string, - options *metav1.GetOptions, + getOptions *metav1.GetOptions, ) (*ydbApi.Storage, error) { var err error result := &ydbApi.Storage{} //nolint + if name == "" { + return nil, errStorageNameMustNotBeNull + } + if err = storageClient.client.Get(). Namespace(storageClient.ns). Resource(storagePluralName). Name(name). - VersionedParams(options, scheme.ParameterCodec). + VersionedParams(getOptions, scheme.ParameterCodec). Do(ctx). Into(result); err != nil { return nil, errors.Wrap(err, "failed to get storage") diff --git a/pkg/engine/kubeengine/deploy_objects.go b/pkg/engine/kubeengine/deploy_objects.go index 0b9b7d28..c5c8b388 100644 --- a/pkg/engine/kubeengine/deploy_objects.go +++ b/pkg/engine/kubeengine/deploy_objects.go @@ -297,9 +297,8 @@ func GetPromtailValues(shellState *state.State) ([]byte, error) { func GetPrometheusValues(shellState *state.State) ([]byte, error) { var ( - bytes []byte - err error - values map[string]interface{} + bytes []byte + err error ) if bytes, err = os.ReadFile(path.Join( @@ -311,14 +310,6 @@ func GetPrometheusValues(shellState *state.State) ([]byte, error) { return nil, merry.Prepend(err, "failed to open prometheus values template") } - if err = k8sYaml.Unmarshal(bytes, &values); err != nil { - return nil, merry.Prepend(err, "failed to deserialize values") - } - - if bytes, err = goYaml.Marshal(&values); err != nil { - return nil, merry.Prepend(err, "failed to serialize values") - } - return bytes, nil } diff --git a/pkg/engine/kubeengine/main.go b/pkg/engine/kubeengine/main.go index 234d14b9..884127d8 100644 --- a/pkg/engine/kubeengine/main.go +++ b/pkg/engine/kubeengine/main.go @@ -22,7 +22,8 @@ import ( func CreateSystemShell(settings *config.Settings) (sc ssh.Client, err error) { kubernetesMasterAddress := settings.TestSettings.KubernetesMasterAddress commandClientType := ssh.RemoteClient - if settings.TestSettings.UseCloudStroppy { + + if settings.TestSettings.IsController() { if kubernetesMasterAddress == "" { err = fmt.Errorf("kubernetes master address is empty") return @@ -51,7 +52,7 @@ func createKubernetesObject( pObj = &Engine{ clusterConfigFile: filepath.Join(shellState.Settings.WorkingDirectory, "config"), sc: sshClient, - UseLocalSession: shellState.Settings.Local, + UseLocalSession: shellState.Settings.TestSettings.IsLocal(), isSshKeyFileOnMaster: false, } return diff --git a/pkg/engine/kubeengine/nodeops.go b/pkg/engine/kubeengine/nodeops.go index 0f8e5726..cc2b6385 100644 --- a/pkg/engine/kubeengine/nodeops.go +++ b/pkg/engine/kubeengine/nodeops.go @@ -200,6 +200,8 @@ func (e *Engine) AddNodeLabels(shellState *state.State) error { //nolint newLabels[NodeNameDBMS] = trueVal } + newLabels["topology.kubernetes.io/zone"] = node.Name + for key, value := range newLabels { nodeLabels[key] = value } @@ -209,7 +211,7 @@ func (e *Engine) AddNodeLabels(shellState *state.State) error { //nolint nodesList.Items[index].ResourceVersion = "" nodesList.Items[index].UID = types.UID("") - llog.Tracef("Cluster node %s now has new lables: %v", node.Name, nodeLabels) + llog.Tracef("Cluster node %s now has new labels: %v", node.Name, nodeLabels) } if err = applyNodeLabels(clientSet, nodesList); err != nil { diff --git a/pkg/engine/kubeengine/toolfuncs.go b/pkg/engine/kubeengine/toolfuncs.go index 3c0b226d..8007bbc0 100644 --- a/pkg/engine/kubeengine/toolfuncs.go +++ b/pkg/engine/kubeengine/toolfuncs.go @@ -201,12 +201,22 @@ func (e Engine) CollectMonitoringData( "third_party", "monitoring", ) + getPngScriptPath := filepath.Join( + "./third_party", //nolint + "monitoring", + GetPngScriptName, + ) + + llog.Debugf("Getting monitoring images script path: %s", getPngScriptPath) + getImagesCmd := exec.Command( - GetPngScriptPath, + getPngScriptPath, fmt.Sprintf("%v", startTime), fmt.Sprintf("%v", finishTime), fmt.Sprintf("%v", monitoringPort), - monImagesArchName, workersIps) + monImagesArchName, + workersIps, + ) getImagesCmd.Dir = workingDirectory if result, err := getImagesCmd.CombinedOutput(); err != nil { diff --git a/pkg/kubernetes/deploy.go b/pkg/kubernetes/deploy.go index 663a77ee..39f631b3 100644 --- a/pkg/kubernetes/deploy.go +++ b/pkg/kubernetes/deploy.go @@ -831,13 +831,13 @@ func (k *Kubernetes) deployPrometheus(shellState *state.State) error { //nolint bytes []byte ) - if bytes, err = kubeengine.GetPrometheusValues(shellState); err != nil { + if bytes, err = kubeengine.GetPrometheusValues(shellState); err != nil || len(bytes) == 0 { return merry.Prepend(err, "failed to get prometheus values") } if err = k.Engine.DeployChart( &kubeengine.InstallOptions{ //nolint - ChartName: path.Join(prometheusHelmRepoName, "prometheus"), + ChartName: path.Join(prometheusHelmRepoName, "kube-prometheus-stack"), ChartNamespace: "default", ReleaseName: "prometheus", RepositoryURL: prometheusHelmRepoURL, @@ -928,6 +928,7 @@ func (k *Kubernetes) deployIngress(shellState *state.State) error { //nolint if err = k.Engine.DeployChart( &kubeengine.InstallOptions{ //nolint ChartName: path.Join(nginxHelmRepoName, "ingress-nginx"), + ChartVersion: "4.2.5", ChartNamespace: "default", ReleaseName: "ingress-nginx", RepositoryURL: nginxHelmRepoURL, diff --git a/pkg/kubernetes/toolfuncs.go b/pkg/kubernetes/toolfuncs.go index b644a1ae..db053948 100644 --- a/pkg/kubernetes/toolfuncs.go +++ b/pkg/kubernetes/toolfuncs.go @@ -191,6 +191,7 @@ func (k *Kubernetes) GenerateMonitoringInventory(shellState *state.State) ([]byt }, "grafana_address": shellState.NodesInfo.IPs.FirstMasterIP.Internal, "grafana_port": grafanaPort, + "grafana_manage_repo": false, "grafana_datasources": []interface{}{ map[string]interface{}{ "name": "Prometheus", diff --git a/test_config.json b/test_config.json deleted file mode 100644 index 0c1477d3..00000000 --- a/test_config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "log_level": "info", - "banRangeMultiplier": 1.1, - "database_type": [ - "ydb" - ], - "cmd": [ - { - "pop": { - "count": 5000 - } - }, - { - "pay": { - "count": 100000, - "zipfian": false, - "oracle": false, - "check": true - } - } - ] -} diff --git a/third_party/extra/manifests/databases/yandexdb/database.yml b/third_party/extra/manifests/databases/yandexdb/database.yml index 760eff4b..703196ec 100644 --- a/third_party/extra/manifests/databases/yandexdb/database.yml +++ b/third_party/extra/manifests/databases/yandexdb/database.yml @@ -4,18 +4,25 @@ metadata: name: stroppy-ydb-database spec: image: - name: cr.yandex/crptqonuodf51kdj7a7d/ydb:22.2.47 + name: cr.yandex/crptqonuodf51kdj7a7d/ydb:22.4.44 nodes: 1 domain: root resources: - containerResources: - limits: - cpu: 500m storageUnits: - count: 1 unitKind: ssd storageClusterRef: name: stroppy-ydb-storage + namespace: stroppy nodeSelector: dbms-worker: "true" - + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: dbms-worker + operator: In + values: + - "true" + topologyKey: "kubernetes.io/hostname" diff --git a/third_party/extra/manifests/databases/yandexdb/storage.yml b/third_party/extra/manifests/databases/yandexdb/storage.yml index b7b7e03e..d1cd4dce 100644 --- a/third_party/extra/manifests/databases/yandexdb/storage.yml +++ b/third_party/extra/manifests/databases/yandexdb/storage.yml @@ -12,7 +12,7 @@ spec: requests: storage: 80Gi image: - name: cr.yandex/crptqonuodf51kdj7a7d/ydb:22.2.47 + name: cr.yandex/crptqonuodf51kdj7a7d/ydb:22.4.44 nodes: 8 domain: root erasure: block-4-2 @@ -53,7 +53,7 @@ spec: type: BASIC - name: User spin_threshold: 0 - threads: 3 + threads: 4 type: BASIC - name: Batch spin_threshold: 0 diff --git a/third_party/extra/manifests/pv-provisioner/configmap.yml b/third_party/extra/manifests/pv-provisioner/configmap.yml index bbaf4288..ea6dd494 100644 --- a/third_party/extra/manifests/pv-provisioner/configmap.yml +++ b/third_party/extra/manifests/pv-provisioner/configmap.yml @@ -14,7 +14,7 @@ data: hostDir: /mnt/network-ssd-nonreplicated mountDir: /mnt/network-ssd-nonreplicated blockCleanerCommand: - - "/scripts/dd_zero.sh" + - "/scripts/shred.sh" - "2" volumeMode: Block fsType: ext4 diff --git a/third_party/extra/values/ingress-nginx-values-tpl.yml b/third_party/extra/values/ingress-nginx-values-tpl.yml index 59516590..813e7136 100644 --- a/third_party/extra/values/ingress-nginx-values-tpl.yml +++ b/third_party/extra/values/ingress-nginx-values-tpl.yml @@ -1,3 +1,4 @@ +--- controller: publishService: enabled: true diff --git a/third_party/monitoring/defaults/main.yml b/third_party/monitoring/defaults/main.yml deleted file mode 100644 index 77a8fab7..00000000 --- a/third_party/monitoring/defaults/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -promtail_force_reinstall: false -nodeexp_force_reinstall: false -grafana_force_reinstall: false -loki_force_reintall: false diff --git a/third_party/monitoring/files/dashboards.tgz b/third_party/monitoring/files/dashboards.tgz deleted file mode 100644 index 3472ff40..00000000 Binary files a/third_party/monitoring/files/dashboards.tgz and /dev/null differ diff --git a/third_party/monitoring/get_png.sh b/third_party/monitoring/get_png.sh new file mode 100755 index 00000000..36e1c6e0 --- /dev/null +++ b/third_party/monitoring/get_png.sh @@ -0,0 +1,82 @@ +#!/bin/bash +# Example usage: +# ./get_png.sh 1637859362000 1637895618000 stroppy qwerty123! localhost 3000 mongo_100mln_pay_6cpu_16GB_without_operator_with_arb.tar.gz "10.1.20.171;10.1.20.73;10.1.20.210;10.1.20.90;10.1.20.138" +# where +#$1 - start in unix time, +#$2 - end in unix time +#$4 +#$3 - port of grafana +#$4 - name of archive with dashboard images +#$5 - string with internal cluster machines ip addresses +# +# +# +rm -rf png + +start=$1 +end=$2 +user=$3 +password=$4 +address=$5 +port=$6 +arch_name=$7 +ip_string=$8 +base_url="http://$user:$password@$address:$port/render/d-solo" +tz="tz=Europe%2FMoscow" + +ip_array=($(echo $ip_string | tr ";" "\n")) + +for theme in "light" "dark" +do + for size in "width=3000&height=1800" "width=1000&height=500" + do + mkdir -p "png/$size/$theme/node-exporter" + mkdir -p "png/$size/$theme/k8s" + i=1 + for worker in "${ip_array[@]}" + do + + curl -s -o png/$size/$theme/node-exporter/cpu-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=77&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/cpu-details-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=3&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/ram-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=78&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/ram-details-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=24&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/network-traffic-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=74&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/netstat-in-out-octets-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=221&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/network-in-out-udp-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=55&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/network-in-out-tcp-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=299&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/disk-space-used-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=156&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/disk-iops-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=229&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/disk-io-usage-rw-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=42&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/disk-io-utilization-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=127&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/disk-average-wait-time-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=37&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/disk-rw-merged-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=133&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/disk-average-queue-size-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=35&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/system-load-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=7&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/cpu-context-switches-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=8&$size&$tz" + curl -s -o png/$size/$theme/node-exporter/ram-active-inactive-worker-$i.png "$base_url/rYdddlPWk/node-exporter-full?orgId=1&from=$start&to=$end&var-job=node-exporter&var-node=$worker:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=191&$size&$tz" + let i++ + done + curl -s -o png/$size/$theme/k8s/k8s-cpu-by-namespaces.png "$base_url/efa86fd1d0c121a26444b636a3f509a8/kubernetes-compute-resources-cluster?orgId=1&from=$start&to=$end&theme=$theme&panelId=7&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-memory-by-namespaces.png "$base_url/efa86fd1d0c121a26444b636a3f509a8/kubernetes-compute-resources-cluster?orgId=1&from=$start&to=$end&theme=$theme&panelId=9&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-cpu-by-pods-in-default-namespace.png "$base_url/85a562078cdf77779eaa1add43ccec1e/kubernetes-compute-resources-namespace-pods?orgId=1&from=$start&to=$end&theme=$theme&panelId=5&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-memory-by-pods-in-default-namespace.png "$base_url/85a562078cdf77779eaa1add43ccec1e/kubernetes-compute-resources-namespace-pods?orgId=1&from=$start&to=$end&theme=$theme&panelId=7&$size&$tz" + # warning: 'var-node=worker-1&var-node=worker-2&var-node=worker-3' block is variable + curl -s -o png/$size/$theme/k8s/k8s-cpu-by-all-pods.png "$base_url/200ac8fdbfbb74b39aff88118e4d1c2c/kubernetes-compute-resources-node-pods?orgId=1&var-datasource=default&var-cluster=&var-node=worker-1&var-node=worker-2&var-node=worker-3&from=$start&to=$end&theme=$theme&panelId=1&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-memory-by-all-pods.png "$base_url/200ac8fdbfbb74b39aff88118e4d1c2c/kubernetes-compute-resources-node-pods?orgId=1&var-datasource=default&var-cluster=&var-node=worker-1&var-node=worker-2&var-node=worker-3&from=$start&to=$end&theme=$theme&panelId=3&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-cpu-by-sts.png "$base_url/a164a7f0339f99e89cea5cb47e9be617/kubernetes-compute-resources-workload?orgId=1&from=$start&to=$end&theme=$theme&panelId=1&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-memory-by-sts.png "$base_url/a164a7f0339f99e89cea5cb47e9be617/kubernetes-compute-resources-workload?orgId=1&from=$start&to=$end&theme=$theme&panelId=3&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-net-receive-by-namespaces.png "$base_url/ff635a025bcfea7bc3dd4f508990a3e9/kubernetes-networking-cluster?orgId=1&var-resolution=30s&var-interval=4h&var-datasource=default&var-cluster=&from=$start&to=$end&theme=$theme&panelId=10&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-net-transmit-by-namespaces.png "$base_url/ff635a025bcfea7bc3dd4f508990a3e9/kubernetes-networking-cluster?orgId=1&var-resolution=30s&var-interval=4h&var-datasource=default&var-cluster=&from=$start&to=$end&theme=$theme&panelId=11&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-net-receive-by-all-pods.png "$base_url/8b7a8b326d7a6f1f04244066368c67af/kubernetes-networking-namespace-pods?orgId=1&var-datasource=default&var-cluster=&var-namespace=All&var-resolution=30s&var-interval=4h&from=$start&to=$end&theme=$theme&panelId=7&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-net-transmit-by-all-pods.png "$base_url/8b7a8b326d7a6f1f04244066368c67af/kubernetes-networking-namespace-pods?orgId=1&var-datasource=default&var-cluster=&var-namespace=All&var-resolution=30s&var-interval=4h&from=$start&to=$end&theme=$theme&panelId=8&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-net-receive-by-sts.png "$base_url/bbb2a765a623ae38130206c7d94a160f/kubernetes-networking-namespace-workload?orgId=1&var-datasource=default&var-cluster=&var-namespace=default&var-type=statefulset&var-resolution=30s&var-interval=4h&from=$start&to=$end&theme=$theme&panelId=10&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-net-transmit-by-sts.png "$base_url/bbb2a765a623ae38130206c7d94a160f/kubernetes-networking-namespace-workload?orgId=1&var-datasource=default&var-cluster=&var-namespace=default&var-type=statefulset&var-resolution=30s&var-interval=4h&from=$start&to=$end&theme=$theme&panelId=11&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-net-receive-by-pods-in-sts.png "$base_url/728bf77cc1166d2f3133bf25846876cc/kubernetes-networking-workload?orgId=1&var-datasource=default&var-cluster=&var-namespace=All&var-workload=acid-postgres-cluster&var-type=statefulset&var-resolution=30s&var-interval=4h&from=$start&to=$end&theme=$theme&panelId=9&$size&$tz" + curl -s -o png/$size/$theme/k8s/k8s-net-transmit-by-pods-in-sts.png "$base_url/728bf77cc1166d2f3133bf25846876cc/kubernetes-networking-workload?orgId=1&var-datasource=default&var-cluster=&var-namespace=All&var-workload=acid-postgres-cluster&var-type=statefulset&var-resolution=30s&var-interval=4h&from=$start&to=$end&theme=$theme&panelId=10&$size&$tz" + done +done + +mv 'png/width=1000&height=500' png/1000x500 +mv 'png/width=3000&height=1800' png/3000x1800 + +tar cfvz $arch_name png diff --git a/third_party/monitoring/grafana.yml b/third_party/monitoring/grafana.yml index 302ebf75..abc9d46b 100644 --- a/third_party/monitoring/grafana.yml +++ b/third_party/monitoring/grafana.yml @@ -2,7 +2,8 @@ - hosts: master become: true roles: - - cloudalchemy.grafana + - picomon-grafana + - ansible-grafana tasks: - name: Add prometheus datasource dns record to hosts lineinfile: diff --git a/third_party/monitoring/grafana_get_png.yml b/third_party/monitoring/grafana_get_png.yml new file mode 100644 index 00000000..3630eb72 --- /dev/null +++ b/third_party/monitoring/grafana_get_png.yml @@ -0,0 +1,9 @@ +- hosts: master + become: true + any_errors_fatal: false + tasks: + - name: Get node-exporter-full png + ansible.builtin.get_url: + url: "http://{{ grafana_address }}:{{ grafana_port }}/render/d-solo/rYdddlPWk/node-exporter-full?orgId=1&from={{ start_time }}&to={{ end_time }}&var-job=node-exporter&var-node={{ worker_id }}:9100&var-diskdevices=%5Ba-z%5D%2B%7Cnvme%5B0-9%5D%2Bn%5B0-9%5D%2B&theme=$theme&panelId=77&$size&$tz" + dest: "tmp/png/$size/$theme/node-exporter/cpu-worker-$i.png" + diff --git a/third_party/monitoring/nodeexp.yml b/third_party/monitoring/nodeexp.yml deleted file mode 100644 index 2ff580f4..00000000 --- a/third_party/monitoring/nodeexp.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: install node_exporter and promtail - hosts: all - become: true - tasks: - - name: Check already installed services - ansible.builtin.service_facts: - - import_tasks: tasks/node_exporter.yml - - import_tasks: tasks/promtail.yml diff --git a/third_party/monitoring/prometheus-values-tpl.yml b/third_party/monitoring/prometheus-values-tpl.yml deleted file mode 100644 index 0dfbbdf4..00000000 --- a/third_party/monitoring/prometheus-values-tpl.yml +++ /dev/null @@ -1,76 +0,0 @@ -rbac: - create: true - -podSecurityPolicy: - enabled: false - -alertmanager: - enabled: false - -configmapReload: - alertmanager: - enabled: false - -nodeExporter: - enabled: false - -server: - enabled: true - name: server - replicaCount: 1 - extraFlags: - - web.enable-lifecycle - configPath: /etc/config/prometheus.yml - ingress: - enabled: true - ingressClassName: nginx - hosts: - - prometheus.cluster.picodata.io - path: / - - affinity: {} - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - persistentVolume: - enabled: true - accessModes: - - ReadWriteOnce - mountPath: /data/monitoring - size: 2Gi - storageClass: "filesystem-monitoring" - statefulSet: - enabled: false - resources: {} - # limits: - # cpu: 500m - # memory: 512Mi - # requests: - # cpu: 500m - # memory: 512Mi - - securityContext: - runAsUser: 65534 - runAsNonRoot: true - runAsGroup: 65534 - fsGroup: 65534 - containerSecurityContext: {} - - service: - enabled: true - annotations: {} - labels: {} - clusterIP: "" - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 80 - sessionAffinity: None - type: ClusterIP - -pushgateway: - enabled: true diff --git a/third_party/monitoring/promtail.yml b/third_party/monitoring/promtail.yml deleted file mode 100644 index e22f73a3..00000000 --- a/third_party/monitoring/promtail.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: Deploy promtail for Tarantool Cartridge - hosts: all - become: true - - tasks: - - - name: Import promtail role - import_role: - name: picomon-promtail - diff --git a/third_party/monitoring/tasks/node_exporter.yml b/third_party/monitoring/tasks/node_exporter.yml deleted file mode 100644 index bdd285bd..00000000 --- a/third_party/monitoring/tasks/node_exporter.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -- name: Run node_exporter installation - when: ansible_facts.services["node_exporter.service"]["state"] | default('none') != 'running' or nodeexp_force_reinstall - import_role: - name: cloudalchemy.node_exporter diff --git a/third_party/monitoring/tasks/promtail.yml b/third_party/monitoring/tasks/promtail.yml deleted file mode 100644 index 0ea25ee5..00000000 --- a/third_party/monitoring/tasks/promtail.yml +++ /dev/null @@ -1,91 +0,0 @@ ---- -- name: Run promtail installation - when: ansible_facts.services["promtail.service"]["state"] | default('none') != 'running' or promtail_force_reinstall - block: - - name: Install additional soft - apt: - name: "{{ packages }}" - state: present - update_cache: yes - cache_valid_time: 3600 - vars: - packages: - - unzip - - zip - - - name: Restart rsyslog service - systemd: - name: rsyslog.service - state: restarted - daemon_reload: yes - enabled: yes - masked: no - - - name: Download Promtail and put in /usr/local/bin - ansible.builtin.unarchive: - src: https://github.com/grafana/loki/releases/download/v2.1.0/promtail-linux-amd64.zip - dest: /usr/local/bin/ - remote_src: yes - - - name: Touch promtail-local-config.yaml in /etc/ - ansible.builtin.file: - path: /etc/promtail-local-config.yaml - state: touch - owner: root - group: root - mode: '0640' - - - name: Add config in /etc/promtail-local-config.yaml - blockinfile: - path: /etc/promtail-local-config.yaml - block: |2 - server: - http_listen_port: 9080 - grpc_listen_port: 0 - - positions: - filename: /tmp/positions.yaml - - clients: - - url: http://192.168.99.98:3100/loki/api/v1/push - - scrape_configs: - - job_name: system - static_configs: - - targets: - - localhost - labels: - job: varlogs - __path__: /var/log/*log - - - name: Touch /etc/systemd/system/promtail.service - ansible.builtin.file: - path: /etc/systemd/system/promtail.service - state: touch - owner: root - group: root - mode: '0644' - - - name: Add content to Promtail systemd unit - blockinfile: - path: /etc/systemd/system/promtail.service - block: |2 - [Unit] - Description=Promtail service - After=network.target - - [Service] - Type=simple - User=root - ExecStart=/usr/local/bin/promtail-linux-amd64 -config.file /etc/promtail-local-config.yaml - - [Install] - WantedBy=multi-user.target - - - name: Restart Promtail service - systemd: - name: promtail.service - state: restarted - daemon_reload: yes - enabled: yes - masked: no diff --git a/third_party/terraform/vars.tf b/third_party/terraform/vars.tf index 358fb3dd..ee48a55a 100644 --- a/third_party/terraform/vars.tf +++ b/third_party/terraform/vars.tf @@ -40,13 +40,13 @@ variable "masters_count" { variable "masters_cpu" { type = number description = "Yandex Cloud cpu cores per master" - default = 10 + default = 16 } variable "masters_memory" { type = number description = "Yandex Cloud memory gigabytes per master" - default = 40 + default = 48 } variable "masters_boot_disk" { @@ -65,19 +65,19 @@ variable "masters_secondary_disk" { variable "workers_count" { type = number description = "Yandex Cloud count of workers" - default = 8 + default = 9 } variable "workers_cpu" { type = number description = "Yandex Cloud cpu in cores per worker" - default = 10 + default = 16 } variable "workers_memory" { type = number description = "Yandex Cloud memory in GB per worker" - default = 40 + default = 48 } variable "workers_boot_disk" { diff --git a/third_party/tests/test_config.json b/third_party/tests/test_config.json index 517ba65c..47806f05 100644 --- a/third_party/tests/test_config.json +++ b/third_party/tests/test_config.json @@ -10,12 +10,12 @@ "cmd": [ { "pop": { - "count": 50000 + "count": 1000000 } }, { "pay": { - "count": 100000, + "count": 10000000, "zipfian": false, "oracle": false, "check": true