From 7f1ea61c122ee9753cf10314101a0ac614135ffd Mon Sep 17 00:00:00 2001 From: npolshakova Date: Thu, 28 Mar 2024 10:11:04 -0400 Subject: [PATCH 01/33] only add declarative setup --- Makefile | 12 + go.mod | 103 +++--- go.sum | 262 ++++++++----- test/setup/README.md | 157 ++++++++ test/setup/cmd/root.go | 18 + test/setup/cmd/setup.go | 349 ++++++++++++++++++ test/setup/config/config.go | 114 ++++++ test/setup/defaults/defaults.go | 20 + .../example_configs/gloo-gateway-setup.yaml | 185 ++++++++++ test/setup/example_configs/istio-setup.yaml | 310 ++++++++++++++++ test/setup/helm/helm.go | 185 ++++++++++ test/setup/helpers/helpers.go | 72 ++++ test/setup/helpers/timer.go | 30 ++ test/setup/istio/istioctl.go | 186 ++++++++++ test/setup/kind/kind.go | 86 +++++ test/setup/kubernetes/applications.go | 76 ++++ test/setup/kubernetes/cluster.go | 88 +++++ test/setup/kubernetes/kubernetes.go | 264 +++++++++++++ test/setup/main.go | 16 + test/setup/types/chart.go | 13 + test/setup/types/cluster.go | 87 +++++ test/setup/types/config.go | 24 ++ test/setup/types/edge.go | 246 ++++++++++++ 23 files changed, 2768 insertions(+), 135 deletions(-) create mode 100644 test/setup/README.md create mode 100644 test/setup/cmd/root.go create mode 100644 test/setup/cmd/setup.go create mode 100644 test/setup/config/config.go create mode 100644 test/setup/defaults/defaults.go create mode 100644 test/setup/example_configs/gloo-gateway-setup.yaml create mode 100644 test/setup/example_configs/istio-setup.yaml create mode 100644 test/setup/helm/helm.go create mode 100644 test/setup/helpers/helpers.go create mode 100644 test/setup/helpers/timer.go create mode 100644 test/setup/istio/istioctl.go create mode 100644 test/setup/kind/kind.go create mode 100644 test/setup/kubernetes/applications.go create mode 100644 test/setup/kubernetes/cluster.go create mode 100644 test/setup/kubernetes/kubernetes.go create mode 100644 test/setup/main.go create mode 100644 test/setup/types/chart.go create mode 100644 test/setup/types/cluster.go create mode 100644 test/setup/types/config.go create mode 100644 test/setup/types/edge.go diff --git a/Makefile b/Makefile index ad034c8ab99..0b2d9190f19 100644 --- a/Makefile +++ b/Makefile @@ -917,6 +917,18 @@ build-test-chart: ## Build the Helm chart and place it in the _test directory helm package --destination $(TEST_ASSET_DIR) $(HELM_DIR) helm repo index $(TEST_ASSET_DIR) +# Sets up environment for running e2e tests +.PHONY: setup-declarative-env +ifneq ($(SKIP_BUILDING_IMAGES),true) +setup-declarative-env: docker # build docker images +endif +ifneq ($(SKIP_PACKAGE_HELM), true) +setup-declarative-env: package-chart +endif +setup-declarative-env: + @echo "Using config file $(CONFIG)" + @go run ./test/setup setup --config $(CONFIG) + #---------------------------------------------------------------------------------- # Security Scan #---------------------------------------------------------------------------------- diff --git a/go.mod b/go.mod index fc97b46d1fd..c1be8c1edcd 100644 --- a/go.mod +++ b/go.mod @@ -28,14 +28,14 @@ require ( github.com/google/go-github v17.0.0+incompatible github.com/google/go-github/v32 v32.0.0 github.com/gorilla/mux v1.8.0 - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 - github.com/hashicorp/consul/api v1.14.0 + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 + github.com/hashicorp/consul/api v1.20.0 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-uuid v1.0.2 github.com/hashicorp/vault/api v1.8.2 github.com/hashicorp/vault/api/auth/aws v0.3.0 github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c - github.com/imdario/mergo v0.3.16 + github.com/imdario/mergo v1.0.0 github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf github.com/jhump/protoreflect v1.15.3 github.com/kelseyhightower/envconfig v1.4.0 @@ -57,22 +57,23 @@ require ( // Pinned to the latest `gloo-repo-branch` tag of solo-apis (`sa-k8s-1.28-bump`) github.com/solo-io/solo-apis v0.0.0-20231206142556-d2e3ed6d4476 github.com/solo-io/solo-kit v0.34.2 - github.com/spf13/afero v1.9.2 + github.com/spf13/afero v1.9.5 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.8.1 + github.com/spf13/viper v1.16.0 go.opencensus.io v0.24.0 go.uber.org/goleak v1.2.1 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.26.0 - golang.org/x/crypto v0.17.0 - golang.org/x/sync v0.4.0 - golang.org/x/tools v0.14.0 - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + golang.org/x/crypto v0.21.0 + golang.org/x/sync v0.6.0 + golang.org/x/tools v0.19.0 + google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.32.0 gopkg.in/AlecAivazis/survey.v1 v1.8.7 helm.sh/helm/v3 v3.14.2 + istio.io/istio v0.0.0-20231207195727-552626bd81f6 // Istio 1.20.1 commit https://github.com/istio/istio/commit/552626bd81f625917bcba6e415cae5aa3d5c61af k8s.io/api v0.29.0 k8s.io/apiextensions-apiserver v0.29.0 k8s.io/apimachinery v0.29.0 @@ -84,6 +85,7 @@ require ( knative.dev/networking v0.0.0-20211210083629-bace06e98aee knative.dev/pkg v0.0.0-20211206113427-18589ac7627e sigs.k8s.io/controller-runtime v0.16.3 + sigs.k8s.io/kind v0.20.0 sigs.k8s.io/yaml v1.4.0 ) @@ -94,13 +96,15 @@ require ( github.com/google/uuid v1.3.1 github.com/quasilyte/go-ruleguard/dsl v0.3.22 golang.org/x/exp v0.0.0-20231006140011-7918f672742d - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d - sigs.k8s.io/gateway-api v1.0.1-0.20231102234148-3b5969669194 + google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a + google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c + gopkg.in/yaml.v2 v2.4.0 + k8s.io/cli-runtime v0.29.0 + sigs.k8s.io/gateway-api v1.0.1-0.20231102234152-004e14bfe016 ) require ( - contrib.go.opencensus.io/exporter/prometheus v0.4.0 // indirect + contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect cuelang.org/go v0.3.2 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/BurntSushi/toml v1.3.2 // indirect @@ -114,9 +118,10 @@ require ( github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect github.com/acomagu/bufpipe v1.0.3 // indirect - github.com/armon/go-metrics v0.3.11 // indirect + github.com/alessio/shellescape v1.4.1 // indirect + github.com/armon/go-metrics v0.4.0 // indirect github.com/armon/go-radix v1.0.0 // indirect - github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/bufbuild/protocompile v0.6.0 // indirect @@ -129,9 +134,9 @@ require ( github.com/containerd/containerd v1.7.11 // indirect github.com/containerd/continuity v0.4.3 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect - github.com/creack/pty v1.1.18 // indirect + github.com/creack/pty v1.1.20 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/daviddengcn/go-colortext v1.0.0 // indirect github.com/docker/cli v24.0.6+incompatible // indirect github.com/docker/distribution v2.8.2+incompatible // indirect @@ -148,10 +153,12 @@ require ( github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect github.com/fatih/camelcase v1.0.0 // indirect github.com/fatih/color v1.15.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fgrosse/zaptest v1.1.0 // indirect github.com/fvbommel/sortorder v1.1.0 // indirect github.com/gertd/go-pluralize v0.1.1 // indirect github.com/getkin/kin-openapi v0.80.0 // indirect + github.com/gliderlabs/ssh v0.3.3 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect @@ -173,12 +180,13 @@ require ( github.com/gobwas/glob v0.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.0.1 // indirect + github.com/google/btree v1.1.2 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/go-querystring v1.0.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect + github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 // indirect + github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/goph/emperror v0.17.1 // indirect github.com/gosuri/uitable v0.0.4 // indirect @@ -195,10 +203,10 @@ require ( github.com/hashicorp/go-secure-stdlib/parseutil v0.1.6 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.2 // indirect - github.com/hashicorp/go-version v1.2.0 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/serf v0.9.7 // indirect + github.com/hashicorp/serf v0.10.1 // indirect github.com/hashicorp/vault/sdk v0.6.0 // indirect github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect github.com/huandu/xstrings v1.4.0 // indirect @@ -206,7 +214,7 @@ require ( github.com/imroc/req v0.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jmespath/go-jmespath v0.3.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmoiron/sqlx v1.3.5 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -222,11 +230,11 @@ require ( github.com/lithammer/dedent v1.1.0 // indirect github.com/lyft/protoc-gen-star v0.6.1 // indirect github.com/lyft/protoc-gen-star/v2 v2.0.3 // indirect - github.com/magiconair/properties v1.8.5 // indirect + github.com/magiconair/properties v1.8.7 // 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.17 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mattn/go-zglob v0.0.3 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect @@ -250,17 +258,19 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.17.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect - github.com/prometheus/statsd_exporter v0.21.0 // indirect + github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/pseudomuto/protoc-gen-doc v1.5.1 // indirect github.com/pseudomuto/protokit v0.2.0 // indirect github.com/radovskyb/watcher v1.0.2 // indirect + github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rubenv/sql-migrate v1.5.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -268,43 +278,44 @@ require ( github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/solo-io/anyvendor v0.0.4 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/src-d/gcfg v1.4.0 // indirect github.com/stretchr/testify v1.8.4 // indirect - github.com/subosito/gotenv v1.2.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect github.com/xanzy/ssh-agent v0.3.0 // 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.2.0 // indirect - github.com/yuin/goldmark v1.4.13 // indirect + github.com/yuin/goldmark v1.6.0 // indirect go.mongodb.org/mongo-driver v1.1.2 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect - go.uber.org/atomic v1.10.0 // indirect + go.uber.org/atomic v1.11.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.8 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.62.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect gopkg.in/src-d/go-git.v4 v4.10.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.0 // indirect + istio.io/api v1.20.1-0.20231207143627-8237149662d6 // indirect k8s.io/apiserver v0.29.0 // indirect - k8s.io/cli-runtime v0.29.0 // indirect k8s.io/component-helpers v0.28.3 // indirect k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect k8s.io/klog/v2 v2.110.1 // indirect @@ -314,7 +325,7 @@ require ( sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect sigs.k8s.io/kustomize/kustomize/v5 v5.0.4-0.20230601165947-6ce0bf390ce3 // indirect - sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect + sigs.k8s.io/kustomize/kyaml v0.14.3 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) @@ -331,12 +342,18 @@ replace ( github.com/dgrijalva/jwt-go => github.com/form3tech-oss/jwt-go v0.0.0-20210511163231-5b2d2b5f6c34 github.com/docker/docker => github.com/moby/moby v24.0.7+incompatible - // Remove once we get to envoy 1.30 + // Remove once we get to a version with extproc changes in upstream envoy (currently targeted 1.30) github.com/envoyproxy/go-control-plane => github.com/solo-io/go-control-plane-fork-v2 v1.29.0-patch1 // Newer versions result in changes to the names of generated metrics // remove this when we fix https://github.com/solo-io/solo-kit/issues/516 github.com/iancoleman/strcase => github.com/iancoleman/strcase v0.1.3 + + // go: istio.io/istio requires github.com/imdario/mergo@v1.0.0: parsing go.mod: + // module declares its path as: dario.cat/mergo + // but was required as: github.com/imdario/mergo + github.com/imdario/mergo => github.com/imdario/mergo v0.3.5 + github.com/opencontainers/go-digest => github.com/opencontainers/go-digest v1.0.0-rc1 // skv2 uses a newer version than the imported solo-kit version which causes issues. Replaces the version with the solo-kit version github.com/pseudomuto/protoc-gen-doc => github.com/pseudomuto/protoc-gen-doc v1.0.0 diff --git a/go.sum b/go.sum index be59704f484..a7209adc18f 100644 --- a/go.sum +++ b/go.sum @@ -721,8 +721,9 @@ cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcP cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= -contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= +contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= +contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= contrib.go.opencensus.io/exporter/zipkin v0.1.2/go.mod h1:mP5xM3rrgOjpn79MM8fZbj3gsxcuytSqtH0dxSWW1RE= cuelang.org/go v0.3.2 h1:/Am5yFDwqnaEi+g942OPM1M4/qtfVSm49wtkQbeh5Z4= cuelang.org/go v0.3.2/go.mod h1:jvMO35Q4D2D3m2ujAmKESICaYkjMbu5+D+2zIGuWTpQ= @@ -733,6 +734,7 @@ git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3p github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -798,12 +800,16 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= +github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/alexedwards/scs v1.4.1/go.mod h1:JRIFiXthhMSivuGbxpzUa0/hT5rz2hpyw61Bmd+S1bg= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= @@ -813,9 +819,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.11 h1:/q4zqTAH+/mtFjimfc0SC7yuuxZshlS4TaCeBm+7sZ0= -github.com/armon/go-metrics v0.3.11/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -823,8 +828,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= 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-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/avast/retry-go v2.2.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/avast/retry-go v2.4.3+incompatible h1:c/FTk2POrEQyZfaHBMkMrXdu3/6IESJUHwu8r3k1JEU= github.com/avast/retry-go v2.4.3+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= @@ -842,7 +847,6 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= @@ -921,6 +925,7 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -929,18 +934,22 @@ github.com/cratonica/2goarray v0.0.0-20190331194516-514510793eaa/go.mod h1:6Arca github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.20 h1:VIPb/a2s17qNeQgDnkfZC35RScx+blkKF8GV68n80J4= +github.com/creack/pty v1.1.20/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/crewjam/httperr v0.0.0-20190612203328-a946449404da/go.mod h1:+rmNIXRvYMqLQeR4DHyTvs6y0MEMymTz4vyFpFkKTPs= github.com/crewjam/saml v0.3.2-0.20191206212704-861266e3a689/go.mod h1:fxbjgoFRea91JEzfcATb14uB+XPW1H88n0feRzehDeg= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/daviddengcn/go-colortext v1.0.0 h1:ANqDyC0ys6qCSvuEK7l3g5RaehL/Xck9EX8ATG8oKsE= github.com/daviddengcn/go-colortext v1.0.0/go.mod h1:zDqEI5NVUop5QPpVJUxE9UO10hRnmkD5G4Pmri9+m4c= github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/dgryski/go-gk v0.0.0-20140819190930-201884a44051/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77/go.mod h1:Va5MyIzkU0rAM92tn3hb3Anb7oz7KcnixF49+2wOMe4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -1005,8 +1014,9 @@ github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fgrosse/zaptest v1.1.0 h1:sK9hP0/xBoNX5qfFo3KWFluDXfc809APomI1QXuYELA= github.com/fgrosse/zaptest v1.1.0/go.mod h1:vMnRSul6kW7kIUXZgnZZcDwyTn8k49ODfAULL8nmL5w= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -1021,8 +1031,8 @@ github.com/foxcpp/go-mockdns v1.0.0/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtV github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 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.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= @@ -1039,8 +1049,9 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.3.3 h1:mBQ8NiOgDkINJrZtoizkC3nDNYgSaWtxyem6S2XHBtA= +github.com/gliderlabs/ssh v0.3.3/go.mod h1:ZSS+CUoKHDrqVakTfTWUlKSr9MtMFkC4UvtQKD7O914= 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-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= @@ -1091,6 +1102,7 @@ github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -1186,6 +1198,8 @@ github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXs github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -1261,8 +1275,10 @@ github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs= 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/cel-go v0.16.1 h1:3hZfSNiAU3KOiNtxuFXVp5WFy4hf/Ly3Sa4/7F8SXNo= github.com/google/cel-go v0.16.1/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= @@ -1291,8 +1307,9 @@ github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD github.com/google/go-github/v29 v29.0.3/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= github.com/google/go-github/v32 v32.0.0 h1:q74KVb22spUq0U5HqZ9VCYqQz8YRuOtL/39ZnfwO+NM= github.com/google/go-github/v32 v32.0.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 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= @@ -1318,12 +1335,15 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 h1:SJ+NtwL6QaZ21U+IrK7d0gGgpjGGvd2kz+FzTHVzdqI= +github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC9t8wNnpPdctvtSUOPUUg4SHeE6vR1Ir2hmg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1355,7 +1375,6 @@ github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+ github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/goph/emperror v0.17.1 h1:6lOybhIvG/BB6VGoWfdv30FVZeZFBBZ9VvgzGXLVkyY= github.com/goph/emperror v0.17.1/go.mod h1:+ZbQ+fUNO/6FNiUo0ujtMjhgad9Xa6fQL9KhH4LNHic= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= @@ -1370,12 +1389,15 @@ 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/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= 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.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= @@ -1383,11 +1405,11 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.14.0 h1:Y64GIJ8hYTu+tuGekwO4G4ardXoiCivX9wv1iP/kihk= -github.com/hashicorp/consul/api v1.14.0/go.mod h1:bcaw5CSZ7NE9qfOfKCI1xb7ZKjzu/MyvQkCLTfqLqxQ= +github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= +github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.10.0 h1:rGLEh2AWK4K0KCMvqWAz2EYxQqgciIfMagWZ0nVe5MI= -github.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= +github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= +github.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -1396,19 +1418,16 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-kms-wrapping/entropy/v2 v2.0.0/go.mod h1:xvb32K2keAc+R8DSFG2IwDcydK9DBQE+fGA5fsw6hSk= +github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= @@ -1443,8 +1462,9 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -1456,12 +1476,11 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.1 h1:MXgUXLqva1QvpVEDQW1IQLG0wivQAtmFlHRQ+1vWZfM= -github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.7 h1:hkdgbqizGQHuU5IPqYM1JdSMV8nKfpuOnZYXssk9muY= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/vault/api v1.8.0/go.mod h1:uJrw6D3y9Rv7hhmS17JQC50jbPDAZdjZoTtrCCxxs7E= github.com/hashicorp/vault/api v1.8.2 h1:C7OL9YtOtwQbTKI9ogB0A1wffRbCN+rH/LLCHO3d8HM= github.com/hashicorp/vault/api v1.8.2/go.mod h1:ML8aYzBIhY5m1MD1B2Q0JV89cC85YVH4t5kBaZiyVaE= @@ -1483,11 +1502,8 @@ github.com/iancoleman/strcase v0.1.3 h1:dJBk1m2/qjL1twPLf68JND55vvivMupZ4wIzE8CT github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.6/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/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imroc/req v0.3.0 h1:3EioagmlSG+z+KySToa+Ylo3pTFZs+jh3Brl7ngU12U= github.com/imroc/req v0.3.0/go.mod h1:F+NZ+2EFSo6EFXdeIbpfE9hcC233id70kf0byW97Caw= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf h1:WfD7VjIE6z8dIvMsI4/s+1qr5EL+zoIGev1BQj1eoJ8= @@ -1509,8 +1525,11 @@ github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= -github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -1528,7 +1547,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -1580,6 +1598,18 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= +github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx v1.2.26 h1:4iFo8FPRZGDYe1t19mQP0zTRqA7n8HnJ5lkIiDvJcB0= +github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -1599,8 +1629,8 @@ github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLO github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1627,11 +1657,14 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +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.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= @@ -1647,8 +1680,9 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.17/go.mod h1:WgzbA6oji13JREwiNsRDNfl7jYdPnmz+VEuLrA+/48M= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -1773,9 +1807,11 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= @@ -1798,8 +1834,9 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= @@ -1817,6 +1854,8 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= @@ -1841,6 +1880,7 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= @@ -1862,8 +1902,11 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= +github.com/prometheus/prometheus v0.48.0-rc.1 h1:/+uPuCIQ2pVOtBrD8QCf0RNpOjcmnxegdOYriN8+GUE= +github.com/prometheus/prometheus v0.48.0-rc.1/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= +github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= +github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/pseudomuto/protoc-gen-doc v1.0.0 h1:g4ld0LeJ2OO2FXhm1o7Arrv+W75sdEClxuvVUSN2RAE= github.com/pseudomuto/protoc-gen-doc v1.0.0/go.mod h1:fwtQAY9erXp3mC92O8OTECnDlJT2r0Ff4KSEKbGEmy0= @@ -1880,6 +1923,9 @@ github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqn github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/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.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1931,9 +1977,7 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= 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= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= @@ -1966,15 +2010,17 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= 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.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= @@ -1986,11 +2032,13 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= +github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -2010,10 +2058,13 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -2051,8 +2102,9 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.6.0 h1:boZcn2GTjpsynOsC0iJHnBWa4Bi0qzfJjthwauItG68= +github.com/yuin/goldmark v1.6.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U= github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.6 h1:qMJQYPNdtJ7UNYHjX38KXZtltKTqimMuoQjNnSVIuJg= @@ -2065,11 +2117,8 @@ github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxt github.com/zenazn/goji v0.9.1-0.20160507202103-64eb34159fe5/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.9/go.mod h1:0NBdNx9wbxtEQLwAQtrDHwx58m02vXpDcgSYI2seohQ= go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/etcd/pkg/v3 v3.5.9/go.mod h1:BZl0SAShQFk0IpLWR78T/+pyt8AruMHhTNNX73hkNVY= @@ -2095,17 +2144,29 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1: go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM= go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0= +go.opentelemetry.io/otel/exporters/prometheus v0.39.1-0.20230714155235-03b8c47770f2 h1:Aph2X1/DxO5WvT1uZ+4XijVu/zzv3HsEmgWOskU2gOA= +go.opentelemetry.io/otel/exporters/prometheus v0.39.1-0.20230714155235-03b8c47770f2/go.mod h1:38vyoWXIF54R5KmBjqAer6ib6+kY6EOhRo10wXRN6ek= go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4= go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= @@ -2116,8 +2177,9 @@ 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.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= @@ -2133,6 +2195,7 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= @@ -2161,12 +2224,14 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= @@ -2174,8 +2239,8 @@ golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0 golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2245,8 +2310,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2308,7 +2373,6 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211205041911-012df41ee64c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/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-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -2332,8 +2396,9 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= 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= @@ -2345,7 +2410,6 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 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-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -2367,8 +2431,8 @@ golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= 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= @@ -2387,8 +2451,8 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/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= @@ -2476,6 +2540,7 @@ golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2493,6 +2558,7 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2510,8 +2576,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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= @@ -2526,8 +2592,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2557,8 +2623,9 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2644,8 +2711,8 @@ golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2688,7 +2755,6 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -2886,8 +2952,8 @@ google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mR google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= @@ -2895,8 +2961,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go. google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a h1:myvhA4is3vrit1a6NZCWBIwN0kNEnX21DJOJX/NvIfI= +google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= @@ -2905,8 +2971,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c h1:jHkCUWkseRf+W+edG5hMzr/Uh1xkDREY4caybAq4dpY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -2983,6 +3049,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -2990,9 +3057,10 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -3037,6 +3105,12 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +istio.io/api v1.20.1-0.20231207143627-8237149662d6 h1:SbThL6mmEhAVI8yb3jeE160vrri6l6whkIKccuj5+YI= +istio.io/api v1.20.1-0.20231207143627-8237149662d6/go.mod h1:hm1PE/mGdIAsjCDkTIAplP53H7TjO5LUQCiVvF26SVg= +istio.io/client-go v1.20.1-0.20231207144227-c679b51dc0f9 h1:36YcYSNUoghH6U0krkk+kCw0HzgtIKkqvKFfkEoigeU= +istio.io/client-go v1.20.1-0.20231207144227-c679b51dc0f9/go.mod h1:5Je53KEbCFhBedeu1wIf02ekK2v7bAQEAfR9e0/u1LI= +istio.io/istio v0.0.0-20231207195727-552626bd81f6 h1:n1TO3aL4moeyOQZGMQZGdFM9ws6D7g062M4sw0MJkB0= +istio.io/istio v0.0.0-20231207195727-552626bd81f6/go.mod h1:sRiwXH4JywVnmoDDMAmW+NaNV7se8fH1w34wVt8AhSs= k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= @@ -3142,16 +3216,20 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0= sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= -sigs.k8s.io/gateway-api v1.0.1-0.20231102234148-3b5969669194 h1:ymvbxqLqM4Le/AiKXHJFvuoMgP0aeU4MhXXNDEou98k= -sigs.k8s.io/gateway-api v1.0.1-0.20231102234148-3b5969669194/go.mod h1:4cUgr0Lnp5FZ0Cdq8FdRwCvpiWws7LVhLHGIudLlf4c= +sigs.k8s.io/gateway-api v1.0.1-0.20231102234152-004e14bfe016 h1:ovFzI+PB1mdbfAyR+Olnhc+HSys1z9IXSYqNfSdUUf0= +sigs.k8s.io/gateway-api v1.0.1-0.20231102234152-004e14bfe016/go.mod h1:4cUgr0Lnp5FZ0Cdq8FdRwCvpiWws7LVhLHGIudLlf4c= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kind v0.20.0 h1:f0sc3v9mQbGnjBUaqSFST1dwIuiikKVGgoTwpoP33a8= +sigs.k8s.io/kind v0.20.0/go.mod h1:aBlbxg08cauDgZ612shr017/rZwqd7AS563FvpWKPVs= sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3/go.mod h1:9n16EZKMhXBNSiUC5kSdFQJkdH3zbxS/JoO619G1VAY= sigs.k8s.io/kustomize/kustomize/v5 v5.0.4-0.20230601165947-6ce0bf390ce3 h1:vq2TtoDcQomhy7OxXLUOzSbHMuMYq0Bjn93cDtJEdKw= sigs.k8s.io/kustomize/kustomize/v5 v5.0.4-0.20230601165947-6ce0bf390ce3/go.mod h1:/d88dHCvoy7d0AKFT0yytezSGZKjsZBVs9YTkBHSGFk= -sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM7vh3b7HvGNfXrJ/xL6BDMS0v1V/HHg5U= -sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= +sigs.k8s.io/kustomize/kyaml v0.14.3 h1:WpabVAKZe2YEp/irTSHwD6bfjwZnTtSDewd2BVJGMZs= +sigs.k8s.io/kustomize/kyaml v0.14.3/go.mod h1:npvh9epWysfQ689Rtt/U+dpOJDTBn8kUnF1O6VzvmZA= +sigs.k8s.io/mcs-api v0.1.0 h1:edDbg0oRGfXw8TmZjKYep06LcJLv/qcYLidejnUp0PM= +sigs.k8s.io/mcs-api v0.1.0/go.mod h1:gGiAryeFNB4GBsq2LBmVqSgKoobLxt+p7ii/WG5QYYw= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= diff --git a/test/setup/README.md b/test/setup/README.md new file mode 100644 index 00000000000..cbfb752fa63 --- /dev/null +++ b/test/setup/README.md @@ -0,0 +1,157 @@ +# Overview + +The declarative environment builder tool can setup Kubernetes test cluster(s) with IstioOperators, Helm Charts, and any Applications required +for testing. This is based on the declarative setup tool used in GME. + +## Configuration + +Configuration is typically provided via yaml file. Usage is usually coupled with `make` targets +since a lot of default environment variables are defined there. + +### Clusters + +Field is used to define one or more kubernetes clusters. The app supports creating local KinD clusters as well as using +existing clusters deployed via public cloud providers. + +When using local clusters you can provide a [KinD configuration](https://github.com/kubernetes-sigs/kind/blob/v0.20.0/pkg/apis/config/v1alpha4/types.go) via `kindConfig` field to specify how you want the cluster setup. + +When using existing clusters deployed in a public cloud, you can reference the cluster in the configuration via the name field. The name field should exist in the kubeconfig file as the context value (e.g: `kubectl config get-contexts -o name`) + +#### Management +One of the clusters should be marked as management via `management` field. + +#### Istio Components + +Istio components can be (optionally) defined via the `istioOperators` field. +IstioOperators field is used to define one or more [Istio operators](https://github.com/istio/istio/blob/ccd8deedd9c735a11ebfa085e2fbe22be0ccd03a/operator/pkg/apis/istio/v1alpha1/types.go#L28-L46), that will be installed via istioctl. + +```yaml +clusters: +- istioOperators: + - apiVersion: install.istio.io/v1alpha1 + kind: IstioOperator + metadata: + name: ingress-gateway + namespace: istio-system + ... +``` + +If the `istioOperators` config is not provided, the tool will skip the Istio installation. + +#### Helm Charts + +Field is used to define one or more helm charts. The charts can be locally built or remote charts can be provided from a registry. + +Local helm charts will use a file path via `local` to target the chart. + +```yaml +clusters: +- charts: + - name: gloo + namespace: gloo-system + local: install/helm/gloo + values: + gloo: + deployment: + image: + repository: gloo + ... +``` + +Remote helm charts will use a url via `remote` field to target the registry. + +```yaml +clusters: +- charts: + - name: metallb + namespace: kube-system + remote: https://metallb.github.io/metallb + version: 0.13.12 + ... +``` + +#### Test Applications + +Deploying test applications can be done via `apps` field. Each app is composed of +of ServiceAccount, Service, and Deployment every field is optional expect the +deployment. + +To help with file size the versions field exist to version a deployment. When using +versions the ServiceAccount, Service and Deployment will be versioned. + +```yaml +clusters: +- apps: + - serviceAccount: + apiVersion: v1 + kind: ServiceAccount + metadata: + name: httpbin + namespace: httpbin + service: + apiVersion: v1 + kind: Service + metadata: + name: httpbin + namespace: httpbin + labels: + app: httpbin + service: httpbin + spec: + ports: + - name: http + port: 8000 + targetPort: 8080 + - name: tcp + port: 9000 + selector: + app: httpbin + deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: httpbin + namespace: httpbin + labels: + app: httpbin + spec: + replicas: 1 + selector: + matchLabels: + app: httpbin + template: + metadata: + labels: + app: httpbin +``` + +#### Examples + +A make target is provided to run the setup. A config file needs to be provided via `CONFIG` variable. + +To test the simple gloo gateway setup: + +```bash +CONFIG=test/setup/example_configs/gloo-gateway-setup.yaml make setup-declarative-env +``` + +To test the Istio setup, make sure the required env values are set and then run: + +```bash +export ISTIOCTL_VERSION=1.18.2 +export ISTIO_HUB=docker.io/istio +export ISTIO_VERSION=1.18.2 +CONFIG=test/setup/example_configs/istio-setup.yaml make setup-declarative-env +``` + +The make target will build the images and package the helm chart by default. To skip these steps, you can use the +`SKIP_BUILDING_IMAGES=true` and `SKIP_PACKAGE_HELM=true` env values. + +```bash +export SKIP_BUILDING_IMAGES=true +export SKIP_PACKAGE_HELM=true +``` + +NOTE: The setup assumes you have `KUBERNETES_MASTER=$HOME/.kube` set in your environment. You can overwrite the version set +with `export VERSION=1.0.1-dev`. `1.0.1-dev` will be used by default, but make sure the helm chart in `_output` matches +the version. If the version does not match, remove the `_output` directory and rebuild the helm chart. diff --git a/test/setup/cmd/root.go b/test/setup/cmd/root.go new file mode 100644 index 00000000000..25d473583b3 --- /dev/null +++ b/test/setup/cmd/root.go @@ -0,0 +1,18 @@ +package cmd + +import ( + "context" + + "github.com/spf13/cobra" +) + +func NewCommand(ctx context.Context) *cobra.Command { + cmd := &cobra.Command{ + SilenceErrors: true, + } + + cmd.AddCommand( + setupCommand(ctx), + ) + return cmd +} diff --git a/test/setup/cmd/setup.go b/test/setup/cmd/setup.go new file mode 100644 index 00000000000..0fa47a10c38 --- /dev/null +++ b/test/setup/cmd/setup.go @@ -0,0 +1,349 @@ +package cmd + +import ( + "context" + "fmt" + "io" + "io/fs" + "os" + "os/exec" + "path/filepath" + "sync" + + errors "github.com/rotisserie/eris" + "github.com/solo-io/gloo/test/setup/defaults" + "github.com/solo-io/gloo/test/setup/types" + "github.com/solo-io/go-utils/contextutils" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + corev1 "k8s.io/api/core/v1" + + "github.com/solo-io/gloo/test/setup/config" + "github.com/solo-io/gloo/test/setup/helm" + "github.com/solo-io/gloo/test/setup/helpers" + "github.com/solo-io/gloo/test/setup/istio" + "github.com/solo-io/gloo/test/setup/kind" + "github.com/solo-io/gloo/test/setup/kubernetes" +) + +type options struct { + configPath string + printConfig bool + + stdin io.Reader +} + +func (o *options) AddToFlags(flags *pflag.FlagSet) { + flags.StringVarP(&o.configPath, "config", "c", "", "Path to the configuration file (Use '-' for stdin).") + flags.BoolVar(&o.printConfig, "print", false, "Print the configuration file.") +} + +func setupCommand(ctx context.Context) *cobra.Command { + var ( + opts = &options{} + cmd = &cobra.Command{ + Use: "setup", + Short: "Setup test environment", + SilenceUsage: true, + RunE: func(cmd *cobra.Command, args []string) error { + opts.stdin = cmd.InOrStdin() + + return setupFunc(ctx, opts) + }, + } + ) + opts.AddToFlags(cmd.PersistentFlags()) + + return cmd +} + +func setupFunc(ctx context.Context, opts *options) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + config, err := config.Load(ctx, opts.configPath, opts.stdin) + if err != nil { + return errors.Wrap(err, "failed to load configuration") + } + + if opts.printConfig { + return config.Print() + } + + var istioctlBinary string + if os.Getenv(defaults.IstioctlVersionEnv) != "" { + istioctlBinary, err = istio.DownloadIstio(ctx, os.Getenv(defaults.IstioctlVersionEnv)) + if err != nil { + return fmt.Errorf("failed to download istio: %w", err) + } + contextutils.LoggerFrom(ctx).Infof("Using Istio binary '%s'", istioctlBinary) + } + + clusters := kubernetes.NewClusterMapping() + + kubeconfigDir := filepath.Join(os.Getenv("HOME"), ".kube", "kind") + + if _, err := os.Stat(kubeconfigDir); errors.Is(err, fs.ErrNotExist) { + if err := os.MkdirAll(kubeconfigDir, 0700); err != nil { + return errors.Wrap(err, "failed to create directory for kubeconfig files") + } + } + + for err := range runParallel(ctx, initClusters(ctx, kubeconfigDir, clusters, config.Clusters...)...) { + if err != nil { + return errors.Wrap(err, "failed to init clusters") + } + } + + funcs, err := configureClusters(ctx, istioctlBinary, clusters, config) + if err != nil { + return errors.Wrap(err, "failed to create cluster processing functions") + } + + for err := range runParallel(ctx, funcs...) { + if err != nil { + return errors.Wrap(err, "failed to process clusters") + } + } + + helpers.ListTimers() + + return nil +} + +// RunParallel will run the provided functions in parallel and return a channel of errors. +func runParallel(ctx context.Context, funcs ...func() error) <-chan error { + var ( + errs = make(chan error) + sync = &sync.WaitGroup{} + ) + + for _, f := range funcs { + f := f + + sync.Add(1) + + go func(fn func() error) { + defer sync.Done() + + errs <- fn() + }(f) + } + + go func() { + defer close(errs) + + sync.Wait() + }() + + return errs +} + +// InitClusters will create objects that represent the clusters in the environment. Will create clusters if kind configuration is provided. +func initClusters( + ctx context.Context, + dir string, + clusters *kubernetes.ClusterMapping, + set ...*types.Cluster, +) (out []func() error) { + for _, cluster := range set { + cluster := cluster + + out = append(out, func() error { + var ( + err error + kubeConfig string + ) + + if cluster.KindConfig != nil { + if err := kind.Get(cluster.KindConfig); err != nil { + if err = kind.Create(cluster.KindConfig); err != nil { + return errors.Wrap(err, "failed to create kind cluster") + } + } + + for _, image := range cluster.GetImages() { + if err = kind.LoadImage(image, cluster.Name); err != nil { + return errors.Wrap(err, "failed to load image") + } + } + } + + // TODO(npolshak): Support loading images built from source to remote registries (e.g: AWS, GCP, etc ...) + kubeContext, kubeConfig, client, controller, err := kubernetes.NewClient(ctx, dir, cluster.Name) + if err != nil { + return errors.Wrapf(err, "using %s failed to create kubernetes client", os.Getenv("KUBECONFIG")) + } + + err = clusters.UpdateClusterMapping(ctx, cluster.Name, kubeContext, kubeConfig, client, controller) + if err != nil { + return errors.Wrap(err, "failed to update cluster mapping") + } + + return nil + }) + } + + return out +} + +// configureClusters will process the clusters in the configuration -- installing the gloo control plane along +// with any configured helm charts for that cluster. +func configureClusters( + ctx context.Context, + istioctlBinary string, + clusters *kubernetes.ClusterMapping, + config *types.Config, +) (out []func() error, err error) { + for _, cluster := range config.GetClusters() { + cluster := cluster + + out = append(out, + func() error { + info := clusters.GetClusterInfo(cluster.Name) + + // install istio and charts on cluster + if err := processCluster(ctx, istioctlBinary, cluster, info); err != nil { + return errors.Wrap(err, "failed to process cluster") + } + + // install helper test applications on the cluster + if err = processApps(ctx, cluster, info); err != nil { + return errors.Wrap(err, "failed to process apps") + } + + return nil + }) + } + + return out, nil +} + +// processCluster will process the cluster in the configuration async. +func processCluster( + ctx context.Context, + istioctlBinary string, + clusterInfo *types.Cluster, + cluster *kubernetes.Cluster, +) (err error) { + if cluster == nil || clusterInfo == nil { + return nil + } + + var ( + name = cluster.GetName() + controller = cluster.GetController() + client = cluster.GetKubernetes() + ) + + installer := helm.Opts{ + Cluster: name, + Client: client, + Controller: controller, + Logger: contextutils.LoggerFrom(ctx), + } + + if err = processCRDs(ctx, cluster); err != nil { + return errors.Wrap(err, "failed to process crds") + } + + // Prioritized charts + if err = processCharts(ctx, installer, cluster, clusterInfo.GetPrioritizedCharts()...); err != nil { + return errors.Wrap(err, "failed to process charts") + } + + if err := processComponents(ctx, istioctlBinary, clusterInfo, cluster); err != nil { + return err + } + + // Unprioritized charts + if err = processCharts(ctx, installer, cluster, clusterInfo.GetUnprioritizedCharts()...); err != nil { + return errors.Wrap(err, "failed to process charts") + } + + return err +} + +func processCRDs(ctx context.Context, cluster *kubernetes.Cluster) error { + // TODO(npolshak): make this conditional based on setup + // Install gateway apis + cmd := exec.Command("kubectl", "apply", "--context", cluster.GetKubeContext(), "--kubeconfig", cluster.GetKubeConfig(), "-f", "https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + if err := cmd.Run(); err != nil { + return fmt.Errorf("istioctl install failed: %w", err) + } + + return nil +} + +// processComponents will process the cluster istio and app portion of the configuration. +func processComponents( + ctx context.Context, + istioctlBinary string, + cluster *types.Cluster, + info *kubernetes.Cluster, +) error { + var err error + for _, ns := range cluster.Namespaces { + ns := ns + + if err = kubernetes.CreateOrUpdate[*corev1.Namespace](ctx, ns, info.GetController()); err != nil { + return errors.Wrap(err, "failed to create namespace") + } + } + + for _, operator := range cluster.IstioOperators { + operator := operator + + if err = istio.Install(ctx, istioctlBinary, cluster.Name, operator, info); err != nil { + return errors.Wrap(err, "failed to install istio") + } + } + + return err +} + +func processApps(ctx context.Context, cluster *types.Cluster, info *kubernetes.Cluster) error { + var err error + for _, app := range cluster.Apps { + app := app + + if err = kubernetes.DeployApplication(ctx, cluster.Name, app.Versions, app, info); err != nil { + contextutils.LoggerFrom(ctx).Errorf("failed to deploy test apps: %v", err) + + return errors.Wrap(err, "failed to deploy test apps") + } + } + defer func() { + for _, ns := range cluster.Namespaces { + ns := ns + + if err = kubernetes.RolloutStatus(ns.Name, info); err != nil { + return + } + } + }() + return err +} + +func processCharts( + ctx context.Context, + installer helm.Opts, + cluster *kubernetes.Cluster, + charts ...*types.Chart, +) error { + for _, chart := range charts { + contextutils.LoggerFrom(ctx).Infof("installing chart %s", chart.Name) + + if err := installer.InstallChart(ctx, chart, cluster); err != nil { + return errors.Wrap(err, "failed to install chart") + } + + if err := kubernetes.RolloutStatus(chart.Namespace, cluster); err != nil { + return errors.Wrap(err, "failed to wait for rollout") + } + } + return nil +} diff --git a/test/setup/config/config.go b/test/setup/config/config.go new file mode 100644 index 00000000000..38349d5fe13 --- /dev/null +++ b/test/setup/config/config.go @@ -0,0 +1,114 @@ +package config + +import ( + "context" + "fmt" + "io" + "os" + "strings" + + "sigs.k8s.io/yaml" + + "github.com/solo-io/go-utils/contextutils" + + "github.com/solo-io/gloo/test/setup/defaults" + "github.com/solo-io/gloo/test/setup/types" +) + +// Load a configuration from a string. +func Load(ctx context.Context, configPath string, reader io.Reader) (*types.Config, error) { + var ( + err error + config types.Config + logger = contextutils.LoggerFrom(ctx) + ) + + if os.Getenv("CLUSTER_NAME") == "" { + os.Setenv("CLUSTER_NAME", "kind") + } + + if os.Getenv("VERSION") == "" { + // if version is not set, default to the dev version + os.Setenv("VERSION", "1.0.1-dev") + } + + // Can set defaults here for the process if ran directly from the command line. + // + // These will likely be set in make targets, but can't set defaults in the config + // file itself. + if os.Getenv("ISTIO_VERSION") == "" { + latestVersion := strings.Split(defaults.DefaultIstioTag, "-") + if len(latestVersion) == 0 { + panic("invalid default istio tag setting") + } + + os.Setenv("ISTIO_VERSION", latestVersion[0]) + } + + if os.Getenv("ISTIO_HUB") == "" { + os.Setenv("ISTIO_HUB", defaults.DefaultIstioImageRegistry) + } + + if os.Getenv("IMAGE_REGISTRY") == "" { + os.Setenv("IMAGE_REGISTRY", defaults.DefaultGlooImageRegistry) + } + + //if os.Getenv("VERSION") == "" { + // os.Setenv("VERSION", helpers.Version()) + //} + + logger.Infof("Using Istio hub: %s version: %s", os.Getenv("ISTIO_HUB"), os.Getenv("ISTIO_VERSION")) + + contents, err := readConfig(ctx, configPath, reader) + if err != nil { + return nil, err + } + + stringWithEnvs := os.Expand(string(contents), func(s string) string { + // Escape case + if strings.HasPrefix(s, "$") { + return s + } + // Allow special syntax through e.g: ${env:MY_POD_IP} + if strings.Contains(s, ":") || strings.Contains(s, ":-") { + return fmt.Sprintf("${%s}", s) + } + return os.Getenv(s) + }) + + if err = yaml.Unmarshal([]byte(stringWithEnvs), &config); err != nil { + return nil, err + } + + if len(config.Clusters) == 0 { + return nil, fmt.Errorf("no clusters defined in config") + } + + for _, cluster := range config.Clusters { + for _, chart := range cluster.Charts { + // Nice to have these values in a struct for things like loading images + // from source. + if chart.Name == "gloo" { + valuesData, err := yaml.Marshal(chart.Values) + if err != nil { + return nil, err + } + + if err = yaml.Unmarshal(valuesData, &cluster.GlooEdge); err != nil { + return nil, err + } + } + } + } + return &config, nil +} + +func readConfig(ctx context.Context, configPath string, reader io.Reader) ([]byte, error) { + defer contextutils.LoggerFrom(ctx).Info("finished reading config") + + if configPath == "-" { + contextutils.LoggerFrom(ctx).Info("reading config from stdin", configPath) + return io.ReadAll(reader) + } + return os.ReadFile(configPath) +} diff --git a/test/setup/defaults/defaults.go b/test/setup/defaults/defaults.go new file mode 100644 index 00000000000..155f99fd3fe --- /dev/null +++ b/test/setup/defaults/defaults.go @@ -0,0 +1,20 @@ +package defaults + +const ( + DefaultIstioTag = "1.18.2" + DefaultIstioImageRegistry = "docker.io/istio" + IstioctlVersionEnv = "ISTIOCTL_VERSION" + + DefaultGlooImageRegistry = "quay.io/solo-io" + + DefaultGlooImageName = "gloo" + DefaultDiscoveryImageName = "discovery" + DefaultIgressImageName = "ingress" + DefaultSdsImageName = "sds" + DefaultIstioProxyImageName = "proxyv2" + DefaultCertGenJobImageName = "certgen" + DefaultCleanupJobImageName = "kubectl" + DefaultRolloutJobImageName = "kubectl" + DefaultAccessLoggerImageName = "access-logger" + DefaultGatewayImageName = "gloo-envoy-wrapper" +) diff --git a/test/setup/example_configs/gloo-gateway-setup.yaml b/test/setup/example_configs/gloo-gateway-setup.yaml new file mode 100644 index 00000000000..9bfba9ffe6d --- /dev/null +++ b/test/setup/example_configs/gloo-gateway-setup.yaml @@ -0,0 +1,185 @@ +########################################## +# Single Cluster With Gloo Gateway Enabled +########################################## +clusters: + - name: &name ${CLUSTER_NAME} + # https://github.com/kubernetes-sigs/kind/blob/v0.20.0/pkg/apis/config/v1alpha4/types.go + kindConfig: + kind: Cluster + apiVersion: kind.x-k8s.io/v1alpha4 + name: *name + nodes: + - role: control-plane + # Used to control k8s version of the cluster. + image: kindest/node:v1.27.3 + charts: + - name: gloo + namespace: gloo-system + local: install/helm/gloo + values: + discovery: + enabled: false + gloo: + deployment: + customEnv: + - name: GG_EXPERIMENTAL_K8S_GW_CONTROLLER + value: "true" + global: + image: + registry: quay.io/solo-io + pullPolicy: IfNotPresent + extended: false + tag: ${VERSION} + namespaces: + - metadata: + name: httpbin + - metadata: + name: curl + apps: + - serviceAccount: + apiVersion: v1 + kind: ServiceAccount + metadata: + name: httpbin-v1 + namespace: httpbin + service: + apiVersion: v1 + kind: Service + metadata: + name: httpbin-v1 + namespace: httpbin + labels: + app: httpbin-v1 + service: httpbin-v1 + spec: + ports: + - name: http + port: 8000 + targetPort: 8080 + - name: tcp + port: 9000 + selector: + app: httpbin + version: v1 + deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: httpbin-v1 + namespace: httpbin + labels: + app: httpbin + spec: + replicas: 1 + selector: + matchLabels: + app: httpbin + template: + metadata: + labels: + app: httpbin + version: v1 + spec: + serviceAccountName: httpbin-v1 + containers: + - image: hunca1j/httpbin:v2.11.0 + imagePullPolicy: IfNotPresent + name: httpbin + command: [ go-httpbin ] + args: + - "-port" + - "8080" + - "-max-duration" + - "600s" # override default 10s + env: + # Set SERVICE_VERSION environment variable to enable version prefixing + - name: SERVICE_VERSION + ports: + - containerPort: 8080 + - serviceAccount: + apiVersion: v1 + kind: ServiceAccount + metadata: + name: httpbin-v2 + namespace: httpbin + service: + apiVersion: v1 + kind: Service + metadata: + name: httpbin-v2 + namespace: httpbin + labels: + app: httpbin-v2 + service: httpbin-v2 + spec: + ports: + - name: http + port: 8000 + targetPort: 8080 + - name: tcp + port: 9000 + selector: + app: httpbin + version: v2 + deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: httpbin-v2 + namespace: httpbin + labels: + app: httpbin + spec: + replicas: 1 + selector: + matchLabels: + app: httpbin + template: + metadata: + labels: + app: httpbin + version: v2 + spec: + serviceAccountName: httpbin-v2 + containers: + - image: hunca1j/httpbin:v2.11.0 + imagePullPolicy: IfNotPresent + name: httpbin + command: [ go-httpbin ] + args: + - "-port" + - "8080" + - "-max-duration" + - "600s" # override default 10s + env: + # Set SERVICE_VERSION environment variable to enable version prefixing + - name: SERVICE_VERSION + ports: + - containerPort: 8080 + - deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: curl + namespace: curl + labels: + app: curl + spec: + replicas: 1 + selector: + matchLabels: + app: curl + template: + metadata: + labels: + app: curl + version: v1 + spec: + containers: + - name: curl + image: curlimages/curl:7.83.1 + imagePullPolicy: IfNotPresent + command: + - "tail" + - "-f" + - "/dev/null" \ No newline at end of file diff --git a/test/setup/example_configs/istio-setup.yaml b/test/setup/example_configs/istio-setup.yaml new file mode 100644 index 00000000000..6e8bb6236c5 --- /dev/null +++ b/test/setup/example_configs/istio-setup.yaml @@ -0,0 +1,310 @@ +####################################### +# Single Cluster With Istio Integration +####################################### +clusters: + - name: &name ${CLUSTER_NAME} + # https://github.com/kubernetes-sigs/kind/blob/v0.20.0/pkg/apis/config/v1alpha4/types.go + kindConfig: + kind: Cluster + apiVersion: kind.x-k8s.io/v1alpha4 + name: *name + nodes: + - role: control-plane + # Used to control k8s version of the cluster. + image: kindest/node:v1.27.3 + istioOperators: + - apiVersion: install.istio.io/v1alpha1 + kind: IstioOperator + metadata: + name: ingress-gateway + namespace: istio-system + spec: + hub: ${ISTIO_HUB} + tag: ${ISTIO_VERSION} + profile: minimal + meshConfig: + outboundTrafficPolicy: + mode: ALLOW_ANY + # enable accesslogs + accessLogFile: /dev/stdout + trustDomain: cluster.local + defaultConfig: + proxyMetadata: + # Ability of istio-agent to retrieve bootstrap via XDS + BOOTSTRAP_XDS_AGENT: "true" + # Enable Istio agent to handle DNS requests for known hosts + ISTIO_META_DNS_CAPTURE: "true" + # Enable automatic address allocation + ISTIO_META_DNS_AUTO_ALLOCATE: "true" + components: + pilot: + k8s: + env: + - name: PILOT_ENABLE_K8S_SELECT_WORKLOAD_ENTRIES + value: "false" + charts: + - name: gloo + namespace: gloo-system + local: install/helm/gloo + values: + discovery: + enabled: false + gloo: + deployment: + customEnv: + - name: GG_EXPERIMENTAL_K8S_GW_CONTROLLER + value: "true" + global: + image: + registry: quay.io/solo-io + pullPolicy: IfNotPresent + extended: false + tag: ${VERSION} + istioSDS: + enabled: true + namespaces: + - metadata: + name: httpbin-inmesh + labels: + istio-injection: enabled + - metadata: + name: curl-inmesh + labels: + istio-injection: enabled + - metadata: + name: echo-inmesh + labels: + istio-injection: enabled + - metadata: + name: httpbin + - metadata: + name: curl + apps: + - serviceAccount: + apiVersion: v1 + kind: ServiceAccount + metadata: + name: httpbin + namespace: httpbin-inmesh + service: + apiVersion: v1 + kind: Service + metadata: + name: httpbin + namespace: httpbin-inmesh + labels: + app: httpbin + service: httpbin + spec: + ports: + - name: http + port: 8000 + targetPort: 8080 + - name: tcp + port: 9000 + selector: + app: httpbin + deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: httpbin + namespace: httpbin-inmesh + labels: + app: httpbin + spec: + replicas: 1 + selector: + matchLabels: + app: httpbin + template: + metadata: + labels: + app: httpbin + version: v1 + spec: + serviceAccountName: httpbin + containers: + - image: hunca1j/httpbin:v2.11.0 + imagePullPolicy: IfNotPresent + name: httpbin + command: [ go-httpbin ] + args: + - "-port" + - "8080" + - "-max-duration" + - "600s" # override default 10s + env: + # Set SERVICE_VERSION environment variable to enable version prefixing + - name: SERVICE_VERSION + ports: + - containerPort: 8080 + - serviceAccount: + apiVersion: v1 + kind: ServiceAccount + metadata: + name: httpbin + namespace: httpbin + service: + apiVersion: v1 + kind: Service + metadata: + name: httpbin + namespace: httpbin + labels: + app: httpbin + service: httpbin + spec: + ports: + - name: http + port: 8000 + targetPort: 8080 + - name: tcp + port: 9000 + selector: + app: httpbin + deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: httpbin + namespace: httpbin + labels: + app: httpbin + spec: + replicas: 1 + selector: + matchLabels: + app: httpbin + template: + metadata: + labels: + app: httpbin + version: v1 + spec: + serviceAccountName: httpbin + containers: + - image: hunca1j/httpbin:v2.11.0 + imagePullPolicy: IfNotPresent + name: httpbin + command: [ go-httpbin ] + args: + - "-port" + - "8080" + - "-max-duration" + - "600s" # override default 10s + env: + # Set SERVICE_VERSION environment variable to enable version prefixing + - name: SERVICE_VERSION + ports: + - containerPort: 8080 + - deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: curl + namespace: curl-inmesh + labels: + app: curl + spec: + replicas: 1 + selector: + matchLabels: + app: curl + template: + metadata: + labels: + app: curl + version: v1 + spec: + containers: + - name: curl + image: curlimages/curl:7.83.1 + imagePullPolicy: IfNotPresent + command: + - "tail" + - "-f" + - "/dev/null" + - deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: curl + namespace: curl + labels: + app: curl + spec: + replicas: 1 + selector: + matchLabels: + app: curl + template: + metadata: + labels: + app: curl + version: v1 + spec: + containers: + - name: curl + image: curlimages/curl:7.83.1 + imagePullPolicy: IfNotPresent + command: + - "tail" + - "-f" + - "/dev/null" + - serviceAccount: + apiVersion: v1 + kind: ServiceAccount + metadata: + name: echo-v1 + namespace: echo-inmesh + service: + apiVersion: v1 + kind: Service + metadata: + name: echo-v1 + namespace: echo-inmesh + labels: + app: echo-v1 + service: echo-v1 + spec: + ports: + - name: http + port: 5000 + - name: tcp + port: 9000 + selector: + app: echo-v1 + deployment: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: echo-v1 + namespace: echo-inmesh + labels: + app: echo-v1 + spec: + replicas: 1 + selector: + matchLabels: + app: echo-v1 + template: + metadata: + labels: + app: echo-v1 + spec: + containers: + - name: helloworld + env: + - name: SERVICE_VERSION + value: v1 + image: docker.io/ilrudie/istio-helloworld + imagePullPolicy: IfNotPresent #Always + ports: + - containerPort: 5000 + - name: echo + image: docker.io/istio/tcp-echo-server:1.2 + imagePullPolicy: IfNotPresent + args: [ "9000", "hello-v1" ] + ports: + - containerPort: 9000 \ No newline at end of file diff --git a/test/setup/helm/helm.go b/test/setup/helm/helm.go new file mode 100644 index 00000000000..aad6ed2705f --- /dev/null +++ b/test/setup/helm/helm.go @@ -0,0 +1,185 @@ +package helm + +import ( + "context" + "fmt" + "os" + + "github.com/solo-io/gloo/test/setup/helpers" + "github.com/solo-io/gloo/test/setup/kubernetes" + "github.com/solo-io/gloo/test/setup/types" + "go.uber.org/zap" + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/chart/loader" + "helm.sh/helm/v3/pkg/chartutil" + "helm.sh/helm/v3/pkg/cli" + "helm.sh/helm/v3/pkg/kube" + "helm.sh/helm/v3/pkg/registry" + "helm.sh/helm/v3/pkg/storage" + "helm.sh/helm/v3/pkg/storage/driver" + "k8s.io/cli-runtime/pkg/genericclioptions" + k8s "k8s.io/client-go/kubernetes" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +type Opts struct { + Cluster string + Client k8s.Interface + Controller client.Client + Logger *zap.SugaredLogger +} + +func (o Opts) InstallChart(ctx context.Context, chart *types.Chart, cluster *kubernetes.Cluster) error { + if chart == nil { + return nil + } + + name := chart.Name + + flags := &genericclioptions.ConfigFlags{ + KubeConfig: strPtr(cluster.GetKubeConfig()), + Context: strPtr(cluster.GetKubeContext()), + Namespace: strPtr(chart.Namespace), + } + + settings := cli.New() + kubeClient := kube.New(flags) + + client, err := kubeClient.Factory.KubernetesClientSet() + if err != nil { + return err + } + + registry, err := registry.NewClient() + if err != nil { + return err + } + + timerFn := helpers.TimerFunc((fmt.Sprintf("[%s] %s helm installation", cluster.GetName(), name))) + defer timerFn() + + storage := storage.Init(driver.NewSecrets(client.CoreV1().Secrets(chart.Namespace))) + + knownReleases := map[string]bool{} + + list, err := storage.ListReleases() + if err != nil { + return err + } + + for _, release := range list { + knownReleases[release.Name] = true + } + + cfg := &action.Configuration{ + RegistryClient: registry, + Releases: storage, + KubeClient: kubeClient, + Capabilities: chartutil.DefaultCapabilities, + } + + logFn := func(format string, args ...any) {} + if err = cfg.Init(flags, chart.Namespace, os.Getenv("HELM_DRIVER"), logFn); err != nil { + return err + } + + if _, ok := knownReleases[name]; !ok { + if err = installAction(ctx, name, chart, cfg, settings); err != nil { + return err + } + return nil + } + + if err = upgradeAction(ctx, name, chart, cfg, settings); err != nil { + return err + } + + return nil +} + +// Pulls a chart from a repository and returns the path to the chart. +func pullRepository(repoName, repoURL, version string, settings *cli.EnvSettings) (string, error) { + puller := action.NewPull() + + puller.RepoURL = repoURL + puller.Version = version + + path, err := puller.LocateChart(repoName, settings) + if err != nil { + return "", err + } + return path, nil +} + +func upgradeAction( + ctx context.Context, + name string, + c *types.Chart, + cfg *action.Configuration, + settings *cli.EnvSettings, +) error { + action := action.NewUpgrade(cfg) + + action.Namespace = c.Namespace + + var ( + err error + chartPath = c.Local + chart *chart.Chart + ) + + if chartPath == "" { + chartPath, err = pullRepository(name, c.Remote, c.Version, settings) + if err != nil { + return err + } + } + + chart, err = loader.Load(chartPath) + if err != nil { + return err + } + + _, err = action.RunWithContext(ctx, name, chart, c.Values) + return err +} + +func installAction( + ctx context.Context, + name string, + c *types.Chart, + cfg *action.Configuration, + settings *cli.EnvSettings, +) error { + action := action.NewInstall(cfg) + + action.CreateNamespace = true + action.Namespace = c.Namespace + action.ReleaseName = name + + var ( + err error + chartPath = c.Local + chart *chart.Chart + ) + + if chartPath == "" { + chartPath, err = pullRepository(name, c.Remote, c.Version, settings) + if err != nil { + return err + } + } + + chart, err = loader.Load(chartPath) + if err != nil { + return err + } + + _, err = action.RunWithContext(ctx, chart, c.Values) + return err +} + +func strPtr(str string) *string { + return &str +} diff --git a/test/setup/helpers/helpers.go b/test/setup/helpers/helpers.go new file mode 100644 index 00000000000..2d73b0accce --- /dev/null +++ b/test/setup/helpers/helpers.go @@ -0,0 +1,72 @@ +package helpers + +import ( + "os/exec" + "reflect" + "strings" +) + +func GlooDirectory() string { + data, err := exec.Command("git", "rev-parse", "--show-toplevel").Output() + if err != nil { + panic(err) + } + return strings.TrimSpace(string(data)) +} + +// Merge maps, merge priority is left to right (i.e. right maps will overwrite left maps) +func MergeValueMaps(maps ...map[string]interface{}) map[string]interface{} { + var out map[string]interface{} + for i, m := range maps { + if i == 0 { + out = m + continue + } + out = mergeTwoValueMaps(out, m) + } + + return out +} + +// Yanked this right out of helm libs, merge priority is left to right +func mergeTwoValueMaps(a, b map[string]interface{}) map[string]interface{} { + out := make(map[string]interface{}, len(a)) + for k, v := range a { + out[k] = v + } + for k, v := range b { + if v, ok := CastMap(v); ok { + if bv, ok := out[k]; ok { + if bv, ok := CastMap(bv); ok { + out[k] = mergeTwoValueMaps(bv, v) + continue + } + } + } + out[k] = v + } + return out +} + +// Made our own cast map because regular casting was yielding inconsistent results +func CastMap(value interface{}) (map[string]interface{}, bool) { + result := map[string]interface{}{} + rValues := reflect.ValueOf(value) + if rValues.Kind() == reflect.Map { + iter := rValues.MapRange() + for iter.Next() { + k := iter.Key().Interface() + v := iter.Value().Interface() + kS, isS := k.(string) + if isS { + result[kS] = v + } else { + return map[string]interface{}{}, false + + } + } + return result, true + } else { + return map[string]interface{}{}, false + } +} diff --git a/test/setup/helpers/timer.go b/test/setup/helpers/timer.go new file mode 100644 index 00000000000..7460bd471ae --- /dev/null +++ b/test/setup/helpers/timer.go @@ -0,0 +1,30 @@ +package helpers + +import ( + "fmt" + "strings" + "sync" + "time" +) + +// synchronous timer aggregator +var components []string +var lock sync.Mutex + +func ListTimers() { + fmt.Println("Timer Stats:") + + for _, component := range components { + fmt.Println(component) + } +} + +func TimerFunc(component string) (stop func()) { + start := time.Now() + + return func() { + lock.Lock() + defer lock.Unlock() + components = append(components, fmt.Sprintf(" Step: %s took time: %s", strings.ToUpper(component), time.Since(start).Truncate(time.Second).String())) + } +} diff --git a/test/setup/istio/istioctl.go b/test/setup/istio/istioctl.go new file mode 100644 index 00000000000..709249418c4 --- /dev/null +++ b/test/setup/istio/istioctl.go @@ -0,0 +1,186 @@ +package istio + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "net/http" + "os" + "os/exec" + "path/filepath" + "runtime" + + "github.com/rotisserie/eris" + "github.com/solo-io/gloo/test/setup/helpers" + "github.com/solo-io/gloo/test/setup/kubernetes" + "istio.io/istio/operator/pkg/apis/istio/v1alpha1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + k8s "k8s.io/client-go/kubernetes" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/solo-io/go-utils/contextutils" +) + +func Install( + ctx context.Context, + istioctlBinary, clusterName string, + operator *v1alpha1.IstioOperator, + info *kubernetes.Cluster, +) error { + if operator == nil { + return nil + } + + if istioctlBinary == "" { + contextutils.LoggerFrom(ctx).Infof("Istio binary not specified, skipping installation") + return nil + } + + var ( + client = info.GetKubernetes() + controller = info.GetController() + ) + + uniqueNS := map[string]bool{"istio-system": true} + + for _, gateway := range append(operator.Spec.GetComponents().GetIngressGateways(), operator.Spec.GetComponents().GetEgressGateways()...) { + if !gateway.GetEnabled().GetValue() { + continue + } + + if !uniqueNS[gateway.GetNamespace()] { + if err := createNamespace(ctx, client, controller, gateway); err != nil { + return err + } + uniqueNS[gateway.GetNamespace()] = true + } + } + + timerFn := helpers.TimerFunc(fmt.Sprintf("[%s] istio installation", clusterName)) + defer timerFn() + + buf := &bytes.Buffer{} + + if err := json.NewEncoder(buf).Encode(operator); err != nil { + return err + } + + cmd := exec.Command(istioctlBinary, "install", "-y", "--context", info.GetKubeContext(), "--kubeconfig", info.GetKubeConfig(), "-f", "-") + cmd.Stdin = buf + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + if err := cmd.Run(); err != nil { + return fmt.Errorf("istioctl install failed: %w", err) + } + + for ns := range uniqueNS { + if err := kubernetes.RolloutStatus(ns, info); err != nil { + return fmt.Errorf("istio rollout failed: %w", err) + } + } + + return ctx.Err() +} + +func createNamespace[Object interface{ GetNamespace() string }]( + ctx context.Context, + k8sclient k8s.Interface, + client client.Client, + objs ...Object, +) error { + for _, obj := range objs { + namespace := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: obj.GetNamespace(), + }, + } + + if err := kubernetes.CreateOrUpdate[*corev1.Namespace](ctx, namespace, client); err != nil { + return err + } + } + return nil +} + +// Download istioctl binary from istio.io/downloadIstio and returns the path to the binary +func DownloadIstio(ctx context.Context, version string) (string, error) { + if version == "" { + contextutils.LoggerFrom(ctx).Infof("ISTIOCTL_VERSION not specified, using istioctl from PATH") + binaryPath, err := exec.LookPath("istioctl") + if err != nil { + return "", errors.New("ISTIOCTL_VERSION environment variable must be specified or istioctl must be installed") + } + + contextutils.LoggerFrom(ctx).Infof("using istioctl path: %s", binaryPath) + + return binaryPath, nil + } + installLocation := filepath.Join(helpers.GlooDirectory(), ".bin") + binaryDir := filepath.Join(installLocation, fmt.Sprintf("istio-%s", version), "bin") + binaryLocation := filepath.Join(binaryDir, "istioctl") + + fileInfo, _ := os.Stat(binaryLocation) + if fileInfo != nil { + return binaryLocation, nil + } + if err := os.MkdirAll(binaryDir, 0755); err != nil { + return "", eris.Wrap(err, "create directory") + } + + if istioctlDownloadFrom := os.Getenv("ISTIOCTL_DOWNLOAD_FROM"); istioctlDownloadFrom != "" { + osName := "linux" + if runtime.GOOS == "darwin" { + osName = "osx" + } + + arch := runtime.GOARCH + archModifier := fmt.Sprintf("-%s", arch) + + if osName == "osx" && arch != "arm64" { + archModifier = "" + } + + url := fmt.Sprintf("%s/%s/istioctl-%s-%s%s.tar.gz", istioctlDownloadFrom, version, version, osName, archModifier) + + // Use curl and tar to download and extract the file + cmd := exec.Command("sh", "-c", fmt.Sprintf("curl -sSL %s | tar -xz -C %s", url, binaryDir)) + if err := cmd.Run(); err != nil { + return "", eris.Wrapf(err, "download and extract istioctl, cmd: %s", cmd.Args) + } + // Change permissions + if err := os.Chmod(binaryLocation, 0755); err != nil { + return "", eris.Wrap(err, "change permissions") + } + return binaryLocation, nil + } + + req, err := http.NewRequest(http.MethodGet, "https://istio.io/downloadIstio", nil) + if err != nil { + return "", err + } + + res, err := http.DefaultClient.Do(req) + if err != nil { + return "", err + } + defer res.Body.Close() + + cmd := exec.Command("sh", "-") + + cmd.Env = append(cmd.Env, fmt.Sprintf("ISTIO_VERSION=%s", version)) + cmd.Dir = installLocation + + cmd.Stdin = res.Body + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + if err = cmd.Run(); err != nil { + return "", err + } + + return binaryLocation, err +} diff --git a/test/setup/kind/kind.go b/test/setup/kind/kind.go new file mode 100644 index 00000000000..926b914e43f --- /dev/null +++ b/test/setup/kind/kind.go @@ -0,0 +1,86 @@ +package kind + +import ( + "bytes" + "errors" + "fmt" + "io" + "strings" + + "gopkg.in/yaml.v2" + "sigs.k8s.io/kind/pkg/apis/config/v1alpha4" + "sigs.k8s.io/kind/pkg/cmd" + create "sigs.k8s.io/kind/pkg/cmd/kind/create/cluster" + get "sigs.k8s.io/kind/pkg/cmd/kind/get/clusters" + load "sigs.k8s.io/kind/pkg/cmd/kind/load/docker-image" + + "github.com/solo-io/gloo/test/setup/helpers" +) + +var ( + ErrNotFound = errors.New("cluster not found") + ErrAlreadyExists = func(name string) string { + return fmt.Sprintf("failed to create cluster: node(s) already exist for a cluster with the name %q", name) + } +) + +func Get(cluster *v1alpha4.Cluster) error { + if cluster == nil { + return nil + } + + buf := &bytes.Buffer{} + cmd := get.NewCommand(cmd.NewLogger(), cmd.IOStreams{ + Out: buf, + }) + + cmd.SetArgs([]string{}) + + if err := cmd.Execute(); err != nil { + return err + } + + if !strings.Contains(buf.String(), cluster.Name) { + return ErrNotFound + } + return nil +} + +func Create(cluster *v1alpha4.Cluster) error { + if cluster == nil { + return nil + } + + timerFn := helpers.TimerFunc(fmt.Sprintf("[%s] kind create", cluster.Name)) + defer timerFn() + + buf := bytes.Buffer{} + if err := yaml.NewEncoder(&buf).Encode(cluster); err != nil { + return err + } + + cmd := create.NewCommand(cmd.NewLogger(), cmd.IOStreams{ + In: &buf, + Out: io.Discard, + ErrOut: io.Discard, + }) + cmd.SetArgs([]string{"--config=-"}) + + if err := cmd.Execute(); err != nil { + return err + } + return nil +} + +func LoadImage(imageRef string, cluster string) error { + if imageRef == "" { + return nil + } + + cmd := load.NewCommand(cmd.NewLogger(), cmd.StandardIOStreams()) + cmd.SetArgs([]string{imageRef, "--name", cluster}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + return cmd.Execute() +} diff --git a/test/setup/kubernetes/applications.go b/test/setup/kubernetes/applications.go new file mode 100644 index 00000000000..3860a715b86 --- /dev/null +++ b/test/setup/kubernetes/applications.go @@ -0,0 +1,76 @@ +package kubernetes + +import ( + "context" + "fmt" + + errors "github.com/rotisserie/eris" + "github.com/solo-io/gloo/test/setup/helpers" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + + "github.com/solo-io/gloo/test/setup/types" +) + +func DeployApplication(ctx context.Context, clusterName string, versions []string, app *types.App, cluster *Cluster) error { + deployInfo := app.Deployment + if deployInfo == nil { + return nil + } + + var ( + logger = cluster.GetLogger() + controller = cluster.GetController() + ) + + logger.Infof("creating deployment: %s", deployInfo.Name) + + stopTimer := helpers.TimerFunc(fmt.Sprintf("[%s] %s creation", clusterName, deployInfo.Name)) + defer stopTimer() + + for _, cm := range app.ConfigMaps { + if err := CreateOrUpdate[*corev1.ConfigMap](ctx, cm, controller); err != nil { + return errors.Wrap(err, "failed creating config map") + } + } + + if len(versions) == 0 { + // Single Version + if app.ServiceAccount != nil { + if err := CreateOrUpdate[*corev1.ServiceAccount](ctx, app.ServiceAccount, controller); err != nil { + return errors.Wrap(err, "failed creating service account") + } + } + if app.Deployment != nil { + if err := CreateOrUpdate[*appsv1.Deployment](ctx, deployInfo, controller); err != nil { + return errors.Wrap(err, "failed creating deployment") + } + } + if app.Service != nil { + if err := CreateOrUpdate[*corev1.Service](ctx, app.Service, controller); err != nil { + return errors.Wrap(err, "failed creating service") + } + } + return nil + } + + for _, version := range versions { + if app.ServiceAccount != nil { + if err := CreateOrUpdate[*corev1.ServiceAccount](ctx, versionServiceAccount(version, app.ServiceAccount), controller); err != nil { + return errors.Wrap(err, "failed creating service account") + } + } + if app.Service != nil { + if err := CreateOrUpdate[*corev1.Service](ctx, versionService(version, app.Service), controller); err != nil { + return errors.Wrap(err, "failed creating service") + } + } + if app.Deployment != nil { + if err := CreateOrUpdate[*appsv1.Deployment](ctx, versionDeployment(version, deployInfo), controller); err != nil { + return errors.Wrap(err, "failed creating deployment") + } + } + } + + return nil +} diff --git a/test/setup/kubernetes/cluster.go b/test/setup/kubernetes/cluster.go new file mode 100644 index 00000000000..e0ece72c278 --- /dev/null +++ b/test/setup/kubernetes/cluster.go @@ -0,0 +1,88 @@ +package kubernetes + +import ( + "context" + "os" + "sync" + + "go.uber.org/zap" + "k8s.io/client-go/kubernetes" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/solo-io/go-utils/contextutils" +) + +type ClusterMapping struct { + clusters sync.Map +} + +func NewClusterMapping() *ClusterMapping { + return &ClusterMapping{} +} + +func (c *ClusterMapping) UpdateClusterMapping( + ctx context.Context, + name, kubecontext, kubeconfig string, + client kubernetes.Interface, + controller client.Client, +) error { + logger := contextutils.LoggerFrom(ctx) + + logger.Info("updating cluster mapping", zap.String("cluster", name), zap.String("config", kubeconfig), zap.String("context", kubecontext)) + + if kubeconfig == "" { + kubeconfig = os.Getenv("KUBECONFIG") + } + + cluster := &Cluster{ + name: name, + client: client, + controller: controller, + kubeconfig: kubeconfig, + kubecontext: kubecontext, + logger: *logger.With(zap.String("cluster", name)), + } + + c.clusters.Store(name, cluster) + return nil +} + +func (c *ClusterMapping) GetClusterInfo(name string) *Cluster { + if v, ok := c.clusters.Load(name); ok { + return v.(*Cluster) + } + return nil +} + +type Cluster struct { + name string + kubeconfig string // Path to kubeconfig file + kubecontext string + client kubernetes.Interface + controller client.Client + logger zap.SugaredLogger +} + +func (c *Cluster) GetName() string { + return c.name +} + +func (c *Cluster) GetKubeConfig() string { + return c.kubeconfig +} + +func (c *Cluster) GetKubeContext() string { + return c.kubecontext +} + +func (c *Cluster) GetController() client.Client { + return c.controller +} + +func (c *Cluster) GetKubernetes() kubernetes.Interface { + return c.client +} + +func (c *Cluster) GetLogger() zap.SugaredLogger { + return c.logger +} diff --git a/test/setup/kubernetes/kubernetes.go b/test/setup/kubernetes/kubernetes.go new file mode 100644 index 00000000000..7b84784882e --- /dev/null +++ b/test/setup/kubernetes/kubernetes.go @@ -0,0 +1,264 @@ +package kubernetes + +import ( + "context" + "fmt" + "io" + "os" + "path/filepath" + "strings" + + errors "github.com/rotisserie/eris" + "github.com/solo-io/go-utils/contextutils" + glooinstancev1 "github.com/solo-io/solo-apis/pkg/api/fed.solo.io/v1" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + k8errors "k8s.io/apimachinery/pkg/api/errors" + _ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/cli-runtime/pkg/genericiooptions" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/tools/clientcmd/api" + "k8s.io/kubectl/pkg/cmd/rollout" + "k8s.io/kubectl/pkg/cmd/util" + "sigs.k8s.io/controller-runtime/pkg/client" + ctrllog "sigs.k8s.io/controller-runtime/pkg/log" + ctrlzap "sigs.k8s.io/controller-runtime/pkg/log/zap" + "sigs.k8s.io/controller-runtime/pkg/manager" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + v1 "sigs.k8s.io/gateway-api/apis/v1" + "sigs.k8s.io/gateway-api/apis/v1alpha2" + "sigs.k8s.io/gateway-api/apis/v1beta1" +) + +func NewClient(ctx context.Context, dir, name string) (string, string, kubernetes.Interface, client.Client, error) { + baseCfg, err := clientcmd.NewDefaultClientConfigLoadingRules().Load() + if err != nil { + return "", "", nil, nil, errors.Wrap(err, "failed to load kube config") + } + + kubeContext, kubeConfig, config, err := splitKubeconfig(dir, name, baseCfg) + if err != nil { + return "", "", nil, nil, errors.Wrap(err, "failed to split kube config") + } + + scheme := runtime.NewScheme() + + // k8s resources + if err = corev1.AddToScheme(scheme); err != nil { + return "", "", nil, nil, err + } + if err = appsv1.AddToScheme(scheme); err != nil { + return "", "", nil, nil, err + } + // k8s gateway resources + if err = v1alpha2.AddToScheme(scheme); err != nil { + return "", "", nil, nil, err + } + if err = v1beta1.AddToScheme(scheme); err != nil { + return "", "", nil, nil, err + } + if err = v1.AddToScheme(scheme); err != nil { + return "", "", nil, nil, err + } + // gloo resources + if err = glooinstancev1.AddToScheme(scheme); err != nil { + return "", "", nil, nil, err + } + + ctrllog.SetLogger(ctrlzap.New(ctrlzap.WriteTo(io.Discard))) + + ctrl, err := manager.New(config, manager.Options{ + Metrics: metricsserver.Options{BindAddress: "0"}, + Scheme: scheme, + Logger: ctrlzap.New(ctrlzap.WriteTo(io.Discard)), + }) + if err != nil { + return "", "", nil, nil, errors.Wrap(err, "failed to create controller manager") + } + + go func() { + if err := ctrl.Start(ctx); err != nil { + contextutils.LoggerFrom(ctx).Error(err) + } + }() + + return kubeContext, kubeConfig, kubernetes.NewForConfigOrDie(config), ctrl.GetClient(), nil +} + +func splitKubeconfig(dir, name string, base *api.Config) (string, string, *rest.Config, error) { + var context, cluster string + for k := range base.Clusters { + if !strings.Contains(k, name) { + continue + } + cluster = k + } + + for k := range base.Contexts { + if !strings.Contains(k, name) { + continue + } + context = k + } + + if context == "" { + return "", "", nil, errors.New(fmt.Sprintf("failed to find context for %s", name)) + } + + authInfo := base.Contexts[context].AuthInfo + + config := api.Config{ + CurrentContext: context, + Clusters: map[string]*api.Cluster{cluster: base.Clusters[cluster]}, + Contexts: map[string]*api.Context{context: base.Contexts[context]}, + AuthInfos: map[string]*api.AuthInfo{authInfo: base.AuthInfos[authInfo]}, + } + + if len(config.Clusters) == 0 || len(config.Contexts) == 0 || len(config.AuthInfos) == 0 { + return "", "", nil, errors.New(fmt.Sprintf("failed to find cluster, context, or authInfo for %s", name)) + } + + path := filepath.Join(dir, name) + + if err := clientcmd.WriteToFile(config, path); err != nil { + return "", "", nil, errors.Wrap(err, "failed to encode client config") + } + + rest, err := clientcmd.NewNonInteractiveClientConfig(config, config.CurrentContext, &clientcmd.ConfigOverrides{}, nil).ClientConfig() + if err != nil { + return "", "", nil, errors.Wrap(err, "failed to get client config") + } + + return context, path, rest, nil + +} + +func RolloutStatus(namespace string, cluster *Cluster) error { + kubeConfig := cluster.GetKubeConfig() + + flags := &genericclioptions.ConfigFlags{ + KubeConfig: &kubeConfig, + Namespace: &namespace, + } + cmd := rollout.NewCmdRolloutStatus(util.NewFactory(flags), genericiooptions.IOStreams{ + Out: os.Stdout, + ErrOut: os.Stdout, + }) + + cmd.SetArgs([]string{"deployment,daemonset,statefulset"}) + + return cmd.Execute() +} + +type TypedObject[T client.Object] interface { + DeepCopy() T +} + +func CreateOrUpdate[T client.Object](ctx context.Context, object client.Object, cluster client.Client) error { + if object == nil { + return nil + } + + if err := cluster.Create(ctx, object); err == nil && !k8errors.IsAlreadyExists(err) { + return nil + } + + typedObj, ok := object.(TypedObject[T]) + if !ok { + // We can't update it + return nil + } + + key := types.NamespacedName{ + Name: object.GetName(), + Namespace: object.GetNamespace(), + } + + existing := typedObj.DeepCopy() + + if err := cluster.Get(ctx, key, existing); err != nil { + return err + } + + // We'll run into resource version errors if we don't apply existing version to our new object + object.SetResourceVersion(existing.GetResourceVersion()) + + if err := cluster.Update(ctx, object); err != nil && !k8errors.IsAlreadyExists(err) { + return err + } + + return nil +} + +func versionServiceAccount(version string, serviceAccount *corev1.ServiceAccount) *corev1.ServiceAccount { + if serviceAccount == nil { + return nil + } + copySA := *serviceAccount + + copySA.Name = versionName(copySA.Name, version) + + return ©SA +} + +func versionService(version string, service *corev1.Service) *corev1.Service { + if service == nil { + return nil + } + copyService := *service + + copyService.Name = versionName(copyService.Name, version) + + copyService.Spec.Selector = versionedLabels(version, copyService.Spec.Selector) + + return ©Service +} + +func versionDeployment(version string, deployment *appsv1.Deployment) *appsv1.Deployment { + if deployment == nil { + return nil + } + + copyDeployment := *deployment + + name := versionName(copyDeployment.Name, version) + + copyDeployment.Name = name + copyDeployment.Labels = versionedLabels(version, copyDeployment.Labels) + copyDeployment.Spec.Template.Labels = versionedLabels(version, copyDeployment.Spec.Template.Labels) + copyDeployment.Spec.Selector.MatchLabels = versionedLabels(version, copyDeployment.Spec.Selector.MatchLabels) + copyDeployment.Spec.Template.Spec.ServiceAccountName = name + + if _, ok := copyDeployment.Spec.Template.ObjectMeta.Labels["security.policy.gloo.solo.io/service_account"]; ok { + copyDeployment.Spec.Template.ObjectMeta.Labels["security.policy.gloo.solo.io/service_account"] = name + } + + // Update the SERVICE_VERSION environment variable. + for i, container := range copyDeployment.Spec.Template.Spec.Containers { + for j, env := range container.Env { + if env.Name == "SERVICE_VERSION" { + copyDeployment.Spec.Template.Spec.Containers[i].Env[j].Value = version + } + } + } + return ©Deployment +} + +func versionName(name, version string) string { + return fmt.Sprintf("%s-%s", name, version) +} + +func versionedLabels(version string, labels map[string]string) map[string]string { + if labels == nil { + labels = make(map[string]string) + } + + labels["version"] = version + + return labels +} diff --git a/test/setup/main.go b/test/setup/main.go new file mode 100644 index 00000000000..fe99addda47 --- /dev/null +++ b/test/setup/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "context" + + "github.com/solo-io/gloo/test/setup/cmd" + "github.com/solo-io/go-utils/contextutils" +) + +func main() { + ctx := context.Background() + + if err := cmd.NewCommand(ctx).Execute(); err != nil { + contextutils.LoggerFrom(ctx).Fatal(err) + } +} diff --git a/test/setup/types/chart.go b/test/setup/types/chart.go new file mode 100644 index 00000000000..7f8612e9320 --- /dev/null +++ b/test/setup/types/chart.go @@ -0,0 +1,13 @@ +package types + +type ( + Chart struct { + Name string `yaml:"name"` + Namespace string `yaml:"namespace"` + Version string `yaml:"version"` + Values map[string]any `yaml:"values"` + Local string `yaml:"local"` // Local path to the chart + Remote string `yaml:"remote"` // Remote repository or path to the chart + Prioritize bool `yaml:"prioritize"` // Prioritized charts will be installed before any other component. + } +) diff --git a/test/setup/types/cluster.go b/test/setup/types/cluster.go new file mode 100644 index 00000000000..8361a51d6da --- /dev/null +++ b/test/setup/types/cluster.go @@ -0,0 +1,87 @@ +package types + +import ( + "github.com/solo-io/gloo/test/setup/helpers" + istiov1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1" + corev1 "k8s.io/api/core/v1" + kindv1alpha4 "sigs.k8s.io/kind/pkg/apis/config/v1alpha4" +) + +type Cluster struct { + // Name of the cluster. + Name string `yaml:"name,omitempty" json:"name,omitempty"` + + // IstioOperator configuration + IstioOperators []*istiov1alpha1.IstioOperator `yaml:"istioOperators,omitempty" json:"istioOperators,omitempty"` + + // (Optional) KinD configuration if supplied will be used to create the cluster. + KindConfig *kindv1alpha4.Cluster `yaml:"kindConfig,omitempty" json:"kindConfig,omitempty"` + + // Will be populated from values data in chart section of cluster. + GlooEdge *GlooEdge `yaml:"glooEdge,omitempty" json:"glooEdge,omitempty"` + + // Namespaces to create on the cluster. + Namespaces []*corev1.Namespace `yaml:"namespaces,omitempty" json:"namespaces,omitempty"` + + // List of helm charts to install + Charts []*Chart `yaml:"charts,omitempty" json:"charts,omitempty"` + + // Test apps to install on the cluster. + Apps []*App `yaml:"apps,omitempty" json:"apps,omitempty"` +} + +func (c *Cluster) GetImages() []string { + if c.GlooEdge == nil { + return nil + } + return c.GlooEdge.Images() +} + +func (c *Cluster) UpdateChart(name string, values ...map[string]any) { + for i, chart := range c.Charts { + if chart.Name != name { + continue + } + + base := &c.Charts[i].Values + + for _, value := range values { + *base = helpers.MergeValueMaps(*base, value) + } + + (*c.Charts[i]).Values = *base + } +} + +func (c *Cluster) GetChart(name string) *Chart { + for _, chart := range c.Charts { + if chart.Name != name { + continue + } + return chart + } + return nil +} + +// GetPrioritizedCharts returns the charts in the order they should be installed. +func (c *Cluster) GetPrioritizedCharts() []*Chart { + var prioritized []*Chart + for _, chart := range c.Charts { + if chart.Prioritize { + prioritized = append(prioritized, chart) + } + } + + return prioritized +} + +func (c *Cluster) GetUnprioritizedCharts() []*Chart { + var unprioritized []*Chart + for _, chart := range c.Charts { + if !chart.Prioritize { + unprioritized = append(unprioritized, chart) + } + } + + return unprioritized +} diff --git a/test/setup/types/config.go b/test/setup/types/config.go new file mode 100644 index 00000000000..7a75e07ebe1 --- /dev/null +++ b/test/setup/types/config.go @@ -0,0 +1,24 @@ +package types + +import ( + "encoding/json" + "os" +) + +// Config is the top-level configuration for the application. +type Config struct { + // Clusters is a list of clusters to create. + Clusters []*Cluster `yaml:"clusters,omitempty" json:"clusters,omitempty"` +} + +func (c *Config) GetClusters() []*Cluster { + return c.Clusters +} + +func (c *Config) Print() error { + enc := json.NewEncoder(os.Stdout) + + enc.SetIndent("", " ") + + return enc.Encode(c) +} diff --git a/test/setup/types/edge.go b/test/setup/types/edge.go new file mode 100644 index 00000000000..d4c884c02a3 --- /dev/null +++ b/test/setup/types/edge.go @@ -0,0 +1,246 @@ +package types + +import ( + "fmt" + "os" + "strings" + + "github.com/solo-io/gloo/test/setup/defaults" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" +) + +type ( + // This follows the values schema for the Gloo Edge Helm chart + GlooEdge struct { + Gateway2 *Gateway2 `json:"gateway2,omitempty" desc:"Gloo Gateway settings, subject to change."` + Settings *Settings `json:"settings,omitempty"` + Gloo *Gloo `json:"gloo,omitempty"` + Discovery *Discovery `json:"discovery,omitempty"` + Gateway *Gateway `json:"gateway,omitempty"` + Global *Global `json:"global,omitempty"` + // TODO(npolshak): Add accessLogger, ingress, ingressProxy, GatewayProxies + } + + Gateway2 struct { + ControlPlane *ControlPlane `json:"controlPlane,omitempty"` + } + + ControlPlane struct { + Enabled bool `json:"enabled,omitempty"` + } + + Settings struct { + WatchNamespaces []string `json:"watchNamespaces,omitempty" desc:"whitelist of namespaces for Gloo Edge to watch for services and CRDs. Empty list means all namespaces"` + WriteNamespace string `json:"writeNamespace,omitempty" desc:"namespace where intermediary CRDs will be written to, e.g. Upstreams written by Gloo Edge Discovery."` + Create bool `json:"create,omitempty" desc:"create a Settings CRD which provides bootstrap configuration to Gloo Edge controllers"` + SingleNamespace bool `json:"singleNamespace,omitempty" desc:"Enable to use install namespace as WatchNamespace and WriteNamespace"` + Linkerd bool `json:"linkerd,omitempty" desc:"Enable automatic Linkerd integration in Gloo Edge"` + DisableProxyGarbageCollection bool `json:"disableProxyGarbageCollection,omitempty" desc:"Set this option to determine the state of an Envoy listener when the corresponding Proxy resource has no routes. If false (default), Gloo Edge will propagate the state of the Proxy to Envoy, resetting the listener to a clean slate with no routes. If true, Gloo Edge will keep serving the routes from the last applied valid configuration."` + RegexMaxProgramSize uint32 `json:"regexMaxProgramSize,omitempty" desc:"Set this field to specify the RE2 default max program size which is a rough estimate of how complex the compiled regex is to evaluate. If not specified, this defaults to 1024."` + DisableKubernetesDestinations bool `json:"disableKubernetesDestinations,omitempty" desc:"Enable or disable Gloo Edge to scan Kubernetes services in the cluster and create in-memory Upstream resources to represent them. These resources enable Gloo Edge to route requests to a Kubernetes service. Note that if you have a large number of services in your cluster and you do not restrict the namespaces that Gloo Edge watches, the API snapshot increases which can have a negative impact on the Gloo Edge translation time. In addition, load balancing is done in kube-proxy which can have further performance impacts. Using Gloo Upstreams as a routing destination bypasses kube-proxy as the request is routed to the pod directly. Alternatively, you can use [Kubernetes](https://docs.solo.io/gloo-edge/latest/reference/api/github.com/solo-io/gloo/projects/gloo/api/v1/options/kubernetes/kubernetes.proto.sk/) Upstream resources as a routing destination to forward requests to the pod directly. For more information, see the [docs](https://docs.solo.io/gloo-edge/latest/guides/traffic_management/destination_types/kubernetes_services/)."` + EnableRestEds bool `json:"enableRestEds,omitempty" desc:"Whether or not to use rest xds for all EDS by default. Defaults to false."` + DevMode bool `json:"devMode,omitempty" desc:"Whether or not to enable dev mode. Defaults to false. Setting to true at install time will expose the gloo dev admin endpoint on port 10010. Not recommended for production."` + } + + Gloo struct { + LogLevel string `json:"logLevel,omitempty" desc:"Level at which the pod should log. Options include \"info\", \"debug\", \"warn\", \"error\", \"panic\" and \"fatal\". Default level is info"` + } + + Discovery struct { + Enabled bool `json:"enabled,omitempty" desc:"enable Discovery features"` + Image *Image `json:"image,omitempty"` + } + + Gateway struct { + Enabled bool `json:"enabled,omitempty" desc:"enable Gloo Edge API Gateway features"` + Image *Image `json:"image,omitempty"` + CertGenJob *CertGenJob `json:"certGenJob,omitempty" desc:"generate self-signed certs with this job to be used with the gateway validation webhook. this job will only run if validation is enabled for the gateway"` + RolloutJob *RolloutJob `json:"rolloutJob,omitempty" desc:"This job waits for the 'gloo' deployment to successfully roll out (if the validation webhook is enabled), and then applies the Gloo Edge custom resources."` + CleanupJob *CleanupJob `json:"cleanupJob,omitempty" desc:"This job cleans up resources that are not deleted by Helm when Gloo Edge is uninstalled."` + } + + CertGenJob struct { + Enabled bool `json:"enabled,omitempty" desc:"enable the job that generates the certificates for the validating webhook at install time (default true)"` + Image *Image `json:"image,omitempty"` + } + + RolloutJob struct { + Enabled bool `json:"enabled,omitempty" desc:"Enable the job that applies default Gloo Edge custom resources at install and upgrade time (default true)."` + Image *Image `json:"image,omitempty"` + } + + CleanupJob struct { + Enabled bool `json:"enabled,omitempty" desc:"Enable the job that removes Gloo Edge custom resources when Gloo Edge is uninstalled (default true)."` + Image *Image `json:"image,omitempty"` + } + + Global struct { + Image *Image `json:"image,omitempty"` + IstioSDS *IstioSDS `json:"istioSDS,omitempty" desc:"Config used for installing Gloo Edge with Istio SDS cert rotation features to facilitate Istio mTLS"` + GlooMtls *Mtls `json:"glooMtls,omitempty" desc:"Config used to enable internal mtls authentication"` + } + + IstioSDS struct { + Enabled bool `json:"enabled,omitempty" desc:"Enables SDS cert-rotator sidecar for istio mTLS cert rotation"` + } + + Mtls struct { + Enabled bool `json:"enabled,omitempty" desc:"Enables internal mtls authentication"` + Sds *SdsContainer `json:"sds,omitempty"` + EnvoySidecar *EnvoySidecarContainer `json:"envoy,omitempty"` + IstioProxy *IstioProxyContainer `json:"istioProxy,omitempty" desc:"Istio-proxy container"` + } + + SdsContainer struct { + Image *Image `json:"image,omitempty"` + } + + EnvoySidecarContainer struct { + Image *Image `json:"image,omitempty"` + } + + IstioProxyContainer struct { + Image *Image `json:"image,omitempty" desc:"Istio-proxy image to use for mTLS"` + } + + Image struct { + Tag string `yaml:"tag,omitempty" json:"tag,omitempty"` + Repository string `yaml:"repository,omitempty" json:"repository,omitempty"` + Registry string `yaml:"registry,omitempty" json:"registry,omitempty"` + Load bool `yaml:"load,omitempty" json:"load,omitempty"` + } + + App struct { + ConfigMaps []*corev1.ConfigMap `yaml:"configMaps,omitempty" json:"configMaps,omitempty"` + Service *corev1.Service `yaml:"service,omitempty" json:"service,omitempty"` + ServiceAccount *corev1.ServiceAccount `yaml:"serviceAccount,omitempty" json:"serviceAccount,omitempty"` + Deployment *appsv1.Deployment `yaml:"deployment,omitempty" json:"deployment,omitempty"` + Versions []string `yaml:"versions,omitempty" json:"versions,omitempty"` + } + + RepositoryImage struct { + Tag string `yaml:"tag,omitempty" json:"tag,omitempty"` + Repository string `yaml:"repository,omitempty" json:"repository,omitempty"` + Load bool `yaml:"load,omitempty" json:"load,omitempty"` + } +) + +func (p GlooEdge) Images() (imageRefs []string) { + + defaultImage := &Image{} + if p.Global != nil { + if p.Global.Image != nil { + // load override + defaultImage = p.Global.Image + } + + glooMtlsEnabled := p.Global.GlooMtls != nil && p.Global.GlooMtls.Enabled + istioSDSEnabled := p.Global.IstioSDS != nil && p.Global.IstioSDS.Enabled + + // Check if either GlooMtls or IstioSDS is enabled. + // Note: Image overrides are only defined on GlooMtls. + if glooMtlsEnabled || istioSDSEnabled { + // Add Sds image IstioProxy override if GlooMtls is enabled + if p.Global.GlooMtls != nil && p.Global.GlooMtls.IstioProxy != nil { + imageRefs = append(imageRefs, p.Global.GlooMtls.Sds.Image.Ref(defaults.DefaultSdsImageName)) + } else { + // Add default global image if GlooMtls image overrides are not set + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultSdsImageName)) + } + + // Add EnvoySidecar image override if GlooMtls is enabled + if p.Global.GlooMtls != nil && p.Global.GlooMtls.EnvoySidecar != nil { + imageRefs = append(imageRefs, p.Global.GlooMtls.EnvoySidecar.Image.Ref(defaults.DefaultGatewayImageName)) + } else { + // Add default global image if GlooMtls image overrides are not set + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultGatewayImageName)) + } + + // Add IstioProxy image override if IstioSDS is enabled + if istioSDSEnabled { + if p.Global.GlooMtls != nil && p.Global.GlooMtls.IstioProxy != nil { + imageRefs = append(imageRefs, p.Global.GlooMtls.IstioProxy.Image.Ref(defaults.DefaultIstioProxyImageName)) + } else { + // Add default image + imageRefs = append(imageRefs, fmt.Sprintf("%s/%s:%s", defaults.DefaultIstioImageRegistry, defaults.DefaultIstioProxyImageName, defaults.DefaultIstioTag)) + } + } + } else if istioSDSEnabled { + // Add default global image if IstioSDS is enabled, but GlooMtls image overrides are not set + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultSdsImageName)) + imageRefs = append(imageRefs, fmt.Sprintf("%s/%s:%s", defaults.DefaultIstioImageRegistry, defaults.DefaultIstioProxyImageName, defaults.DefaultIstioTag)) + } + + } + + // gloo image is configured via Global.Image + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultGlooImageName)) + + if p.Gateway != nil && p.Gateway.Enabled { + // use overrides + imageRefs = append(imageRefs, p.Gateway.Image.Ref(defaults.DefaultGatewayImageName)) + if p.Gateway.CertGenJob != nil && p.Gateway.CertGenJob.Enabled { + imageRefs = append(imageRefs, p.Gateway.CertGenJob.Image.Ref(defaults.DefaultCertGenJobImageName)) + } else { + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultCertGenJobImageName)) + } + if p.Gateway.RolloutJob != nil && p.Gateway.RolloutJob.Enabled { + imageRefs = append(imageRefs, p.Gateway.RolloutJob.Image.Ref(defaults.DefaultRolloutJobImageName)) + } else { + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultRolloutJobImageName)) + } + if p.Gateway.CleanupJob != nil && p.Gateway.CleanupJob.Enabled { + imageRefs = append(imageRefs, p.Gateway.CleanupJob.Image.Ref(defaults.DefaultCleanupJobImageName)) + } else { + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultCleanupJobImageName)) + } + } else { + // use default global image + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultGatewayImageName)) + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultCertGenJobImageName)) + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultRolloutJobImageName)) + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultCleanupJobImageName)) + } + + if p.Gateway2 != nil && p.Gateway2.ControlPlane != nil && p.Gateway2.ControlPlane.Enabled { + // Note: Gateway2 uses same image as Gateway + imageRefs = append(imageRefs, p.Gateway.Image.Ref(defaults.DefaultGatewayImageName)) + } else { + // use default global image + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultGatewayImageName)) + } + + if p.Discovery != nil && p.Discovery.Enabled { + imageRefs = append(imageRefs, p.Discovery.Image.Ref(defaults.DefaultDiscoveryImageName)) + } else { + // use default global image + imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultDiscoveryImageName)) + } + + return imageRefs +} + +func (i Image) Ref(component string) string { + return fmt.Sprintf( + "%s/%s:%s", + withDefault(i.Registry, os.Getenv("IMAGE_REGISTRY")), + withDefault(i.Repository, component), + withDefault(i.Tag, os.Getenv("VERSION")), + ) +} + +func (i RepositoryImage) Ref(component string) string { + return fmt.Sprintf( + "%s:%s", + withDefault(i.Repository, strings.Join([]string{os.Getenv("REGISTRY"), component}, "/")), + withDefault(i.Tag, os.Getenv("VERSION")), + ) +} + +func withDefault(value, defaultValue string) string { + if value == "" { + return defaultValue + } + return value +} From 4aec0e241eb50dac6f4e3b6bc1b056666e656b4b Mon Sep 17 00:00:00 2001 From: npolshakova Date: Thu, 28 Mar 2024 10:51:37 -0400 Subject: [PATCH 02/33] dedup helm values from declarative setup --- docs/content/static/content/osa_included.md | 2 +- docs/content/static/content/osa_provided.md | 24 ++- install/helm/gloo/generate/values.go | 4 +- test/setup/README.md | 46 ++++- test/setup/types/edge.go | 216 +++++--------------- 5 files changed, 115 insertions(+), 177 deletions(-) diff --git a/docs/content/static/content/osa_included.md b/docs/content/static/content/osa_included.md index 1eb6deb2ead..a5bf2335034 100644 --- a/docs/content/static/content/osa_included.md +++ b/docs/content/static/content/osa_included.md @@ -1,6 +1,6 @@ Name|Version|License ---|---|--- -[consul/api](https://github.com/hashicorp/consul)|v1.14.0|Mozilla Public License 2.0 +[consul/api](https://github.com/hashicorp/consul)|v1.20.0|Mozilla Public License 2.0 [hashicorp/go-multierror](https://github.com/hashicorp/go-multierror)|v1.1.1|Mozilla Public License 2.0 [hashicorp/go-uuid](https://github.com/hashicorp/go-uuid)|v1.0.2|Mozilla Public License 2.0 [vault/api](https://github.com/hashicorp/vault)|v1.8.2|Mozilla Public License 2.0 diff --git a/docs/content/static/content/osa_provided.md b/docs/content/static/content/osa_provided.md index 25cfa4ccf46..7ce41299542 100644 --- a/docs/content/static/content/osa_provided.md +++ b/docs/content/static/content/osa_provided.md @@ -25,9 +25,9 @@ Name|Version|License [go-github/v32](https://github.com/google/go-github)|v32.0.0|BSD 3-clause "New" or "Revised" License [google/uuid](https://github.com/google/uuid)|v1.3.1|BSD 3-clause "New" or "Revised" License [gorilla/mux](https://github.com/gorilla/mux)|v1.8.0|BSD 3-clause "New" or "Revised" License -[grpc-ecosystem/go-grpc-middleware](https://github.com/grpc-ecosystem/go-grpc-middleware)|v1.3.0|Apache License 2.0 +[grpc-ecosystem/go-grpc-middleware](https://github.com/grpc-ecosystem/go-grpc-middleware)|v1.4.0|Apache License 2.0 [hinshun/vt10x](https://github.com/hinshun/vt10x)|v0.0.0-20180809195222-d55458df857c|MIT License -[imdario/mergo](https://github.com/imdario/mergo)|v0.3.16|BSD 3-clause "New" or "Revised" License +[imdario/mergo](https://github.com/imdario/mergo)|v0.3.5|BSD 3-clause "New" or "Revised" License [inconshreveable/go-update](https://github.com/inconshreveable/go-update)|v0.0.0-20160112193335-8152e7eb6ccf|UNKNOWN [jhump/protoreflect](https://github.com/jhump/protoreflect)|v1.15.3|Apache License 2.0 [kelseyhightower/envconfig](https://github.com/kelseyhightower/envconfig)|v1.4.0|MIT License @@ -40,27 +40,30 @@ Name|Version|License [rotisserie/eris](https://github.com/rotisserie/eris)|v0.5.4|MIT License [saiskee/gettercheck](https://github.com/saiskee/gettercheck)|v0.0.0-20210820204958-38443d06ebe0|MIT License [sergi/go-diff](https://github.com/sergi/go-diff)|v1.1.0|MIT License -[spf13/afero](https://github.com/spf13/afero)|v1.9.2|Apache License 2.0 +[spf13/afero](https://github.com/spf13/afero)|v1.9.5|Apache License 2.0 [spf13/cobra](https://github.com/spf13/cobra)|v1.8.0|Apache License 2.0 [spf13/pflag](https://github.com/spf13/pflag)|v1.0.5|BSD 3-clause "New" or "Revised" License -[spf13/viper](https://github.com/spf13/viper)|v1.8.1|MIT License +[spf13/viper](https://github.com/spf13/viper)|v1.16.0|MIT License [go.opencensus.io](https://go.opencensus.io)|v0.24.0|Apache License 2.0 [go.uber.org/goleak](https://go.uber.org/goleak)|v1.2.1|MIT License [go.uber.org/multierr](https://go.uber.org/multierr)|v1.11.0|MIT License [go.uber.org/zap](https://go.uber.org/zap)|v1.26.0|MIT License -[x/crypto](https://golang.org/x/crypto)|v0.17.0|BSD 3-clause "New" or "Revised" License +[x/crypto](https://golang.org/x/crypto)|v0.21.0|BSD 3-clause "New" or "Revised" License [x/exp](https://golang.org/x/exp)|v0.0.0-20231006140011-7918f672742d|BSD 3-clause "New" or "Revised" License -[x/sync](https://golang.org/x/sync)|v0.4.0|BSD 3-clause "New" or "Revised" License -[x/tools](https://golang.org/x/tools)|v0.14.0|BSD 3-clause "New" or "Revised" License -[googleapis/api](https://google.golang.org/genproto/googleapis/api)|v0.0.0-20230822172742-b8732ec3820d|Apache License 2.0 -[googleapis/rpc](https://google.golang.org/genproto/googleapis/rpc)|v0.0.0-20230822172742-b8732ec3820d|Apache License 2.0 +[x/sync](https://golang.org/x/sync)|v0.6.0|BSD 3-clause "New" or "Revised" License +[x/tools](https://golang.org/x/tools)|v0.19.0|BSD 3-clause "New" or "Revised" License +[googleapis/api](https://google.golang.org/genproto/googleapis/api)|v0.0.0-20231012201019-e917dd12ba7a|Apache License 2.0 +[googleapis/rpc](https://google.golang.org/genproto/googleapis/rpc)|v0.0.0-20231009173412-8bfb1ae86b6c|Apache License 2.0 [google.golang.org/grpc](https://google.golang.org/grpc)|v1.59.0|Apache License 2.0 [google.golang.org/protobuf](https://google.golang.org/protobuf)|v1.32.0|BSD 3-clause "New" or "Revised" License [AlecAivazis/survey.v1](https://gopkg.in/AlecAivazis/survey.v1)|v1.8.7|MIT License +[gopkg.in/yaml.v2](https://gopkg.in/yaml.v2)|v2.4.0|Apache License 2.0 [helm/v3](https://helm.sh/helm/v3)|v3.14.2|Apache License 2.0 +[istio.io/istio](https://istio.io/istio)|v0.0.0-20231207195727-552626bd81f6|Apache License 2.0 [k8s.io/api](https://k8s.io/api)|v0.28.3|Apache License 2.0 [k8s.io/apiextensions-apiserver](https://k8s.io/apiextensions-apiserver)|v0.28.3|Apache License 2.0 [k8s.io/apimachinery](https://k8s.io/apimachinery)|v0.28.3|Apache License 2.0 +[k8s.io/cli-runtime](https://k8s.io/cli-runtime)|v0.28.3|Apache License 2.0 [k8s.io/client-go](https://k8s.io/client-go)|v0.28.3|Apache License 2.0 [k8s.io/code-generator](https://k8s.io/code-generator)|v0.28.3|Apache License 2.0 [k8s.io/component-base](https://k8s.io/component-base)|v0.28.3|Apache License 2.0 @@ -69,7 +72,8 @@ Name|Version|License [knative.dev/networking](https://knative.dev/networking)|v0.0.0-20211210083629-bace06e98aee|Apache License 2.0 [knative.dev/pkg](https://knative.dev/pkg)|v0.0.0-20211206113427-18589ac7627e|Apache License 2.0 [sigs.k8s.io/controller-runtime](https://sigs.k8s.io/controller-runtime)|v0.16.3|Apache License 2.0 -[sigs.k8s.io/gateway-api](https://sigs.k8s.io/gateway-api)|v1.0.1-0.20231102234148-3b5969669194|Apache License 2.0 +[sigs.k8s.io/gateway-api](https://sigs.k8s.io/gateway-api)|v1.0.1-0.20231102234152-004e14bfe016|Apache License 2.0 +[sigs.k8s.io/kind](https://sigs.k8s.io/kind)|v0.20.0|Apache License 2.0 [sigs.k8s.io/yaml](https://sigs.k8s.io/yaml)|v1.4.0|MIT License [cmd/goimports](https://golang.org/x/tools/cmd/goimports)|latest|MIT License [gogo/protobuf](https://github.com/gogo/protobuf)|latest|MIT License diff --git a/install/helm/gloo/generate/values.go b/install/helm/gloo/generate/values.go index 78f8b15b0d8..a96ed9677c5 100644 --- a/install/helm/gloo/generate/values.go +++ b/install/helm/gloo/generate/values.go @@ -29,8 +29,8 @@ type Global struct { Extensions interface{} `json:"extensions,omitempty"` GlooRbac *Rbac `json:"glooRbac,omitempty"` GlooStats Stats `json:"glooStats,omitempty" desc:"Config used as the default values for Prometheus stats published from Gloo Edge pods. Can be overridden by individual deployments"` - GlooMtls Mtls `json:"glooMtls,omitempty" desc:"Config used to enable internal mtls authentication"` - IstioSDS IstioSDS `json:"istioSDS,omitempty" desc:"Config used for installing Gloo Edge with Istio SDS cert rotation features to facilitate Istio mTLS"` + GlooMtls *Mtls `json:"glooMtls,omitempty" desc:"Config used to enable internal mtls authentication"` + IstioSDS *IstioSDS `json:"istioSDS,omitempty" desc:"Config used for installing Gloo Edge with Istio SDS cert rotation features to facilitate Istio mTLS"` IstioIntegration IstioIntegration `json:"istioIntegration,omitempty" desc:"Configs user to manage Gloo pod visibility for Istio's' automatic discovery and sidecar injection."` ExtraSpecs *bool `json:"extraSpecs,omitempty" desc:"Add additional specs to include in the settings manifest, as defined by a helm partial. Defaults to false in open source, and true in enterprise."` ExtauthCustomYaml *bool `json:"extauthCustomYaml,omitempty" desc:"Inject whatever yaml exists in .Values.global.extensions.extAuth into settings.spec.extauth, instead of structured yaml (which is enterprise only). Defaults to true in open source, and false in enterprise"` diff --git a/test/setup/README.md b/test/setup/README.md index cbfb752fa63..ac010086ddc 100644 --- a/test/setup/README.md +++ b/test/setup/README.md @@ -1,13 +1,45 @@ # Overview The declarative environment builder tool can setup Kubernetes test cluster(s) with IstioOperators, Helm Charts, and any Applications required -for testing. This is based on the declarative setup tool used in GME. +for testing. This is based on the declarative setup tool used in GME. ## Configuration Configuration is typically provided via yaml file. Usage is usually coupled with `make` targets since a lot of default environment variables are defined there. + +The configuration file is broken into a list of clusters, each with a distinct set of capabilities: + +```yaml +clusters: + - name: management-cluster + management: true + kindConfig: + ... + istioOperators: + ... + charts: + ... + namespaces: + ... + apps: + ... + images: + ... +``` + +* kindConfig: The configuration for the KinD cluster +* istioOperators: Installation mechanism for Istio uses istio operators. This is a list of istio operator configs to install into the cluster. Uses the istioctl set by the `ISTIO_VERSION` environment variable, or the installed istioctl binary if not set for installation. +* charts: helm charts to install into the cluster. + * name: name of the chart. + * namespace: namespace to install the chart into + * path: if true, the chart is installed from the local filesystem. Otherwise, it is installed from the configured helm repo. + * values: values to pass to the chart. +* namespaces: namespaces to create in the cluster. +* apps: applications to install into the cluster. +* images: images to load into the cluster. + ### Clusters Field is used to define one or more kubernetes clusters. The app supports creating local KinD clusters as well as using @@ -135,6 +167,12 @@ To test the simple gloo gateway setup: CONFIG=test/setup/example_configs/gloo-gateway-setup.yaml make setup-declarative-env ``` +This can also be run directly with: +```bash +go run ./test/setup setup -c test/setup/example_configs/gloo-gateway-setup.yaml +``` +Make sure the images and helm chart are present before running the go command directly. + To test the Istio setup, make sure the required env values are set and then run: ```bash @@ -144,6 +182,12 @@ export ISTIO_VERSION=1.18.2 CONFIG=test/setup/example_configs/istio-setup.yaml make setup-declarative-env ``` +This can also be run directly with: +```bash +go run ./test/setup setup -c test/setup/example_configs/istio-setup.yaml +``` +Make sure the env values, images and helm chart are present before running the go command directly. + The make target will build the images and package the helm chart by default. To skip these steps, you can use the `SKIP_BUILDING_IMAGES=true` and `SKIP_PACKAGE_HELM=true` env values. diff --git a/test/setup/types/edge.go b/test/setup/types/edge.go index d4c884c02a3..aa5f668e2df 100644 --- a/test/setup/types/edge.go +++ b/test/setup/types/edge.go @@ -3,8 +3,8 @@ package types import ( "fmt" "os" - "strings" + "github.com/solo-io/gloo/install/helm/gloo/generate" "github.com/solo-io/gloo/test/setup/defaults" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -12,104 +12,9 @@ import ( type ( // This follows the values schema for the Gloo Edge Helm chart - GlooEdge struct { - Gateway2 *Gateway2 `json:"gateway2,omitempty" desc:"Gloo Gateway settings, subject to change."` - Settings *Settings `json:"settings,omitempty"` - Gloo *Gloo `json:"gloo,omitempty"` - Discovery *Discovery `json:"discovery,omitempty"` - Gateway *Gateway `json:"gateway,omitempty"` - Global *Global `json:"global,omitempty"` - // TODO(npolshak): Add accessLogger, ingress, ingressProxy, GatewayProxies - } - - Gateway2 struct { - ControlPlane *ControlPlane `json:"controlPlane,omitempty"` - } - - ControlPlane struct { - Enabled bool `json:"enabled,omitempty"` - } - - Settings struct { - WatchNamespaces []string `json:"watchNamespaces,omitempty" desc:"whitelist of namespaces for Gloo Edge to watch for services and CRDs. Empty list means all namespaces"` - WriteNamespace string `json:"writeNamespace,omitempty" desc:"namespace where intermediary CRDs will be written to, e.g. Upstreams written by Gloo Edge Discovery."` - Create bool `json:"create,omitempty" desc:"create a Settings CRD which provides bootstrap configuration to Gloo Edge controllers"` - SingleNamespace bool `json:"singleNamespace,omitempty" desc:"Enable to use install namespace as WatchNamespace and WriteNamespace"` - Linkerd bool `json:"linkerd,omitempty" desc:"Enable automatic Linkerd integration in Gloo Edge"` - DisableProxyGarbageCollection bool `json:"disableProxyGarbageCollection,omitempty" desc:"Set this option to determine the state of an Envoy listener when the corresponding Proxy resource has no routes. If false (default), Gloo Edge will propagate the state of the Proxy to Envoy, resetting the listener to a clean slate with no routes. If true, Gloo Edge will keep serving the routes from the last applied valid configuration."` - RegexMaxProgramSize uint32 `json:"regexMaxProgramSize,omitempty" desc:"Set this field to specify the RE2 default max program size which is a rough estimate of how complex the compiled regex is to evaluate. If not specified, this defaults to 1024."` - DisableKubernetesDestinations bool `json:"disableKubernetesDestinations,omitempty" desc:"Enable or disable Gloo Edge to scan Kubernetes services in the cluster and create in-memory Upstream resources to represent them. These resources enable Gloo Edge to route requests to a Kubernetes service. Note that if you have a large number of services in your cluster and you do not restrict the namespaces that Gloo Edge watches, the API snapshot increases which can have a negative impact on the Gloo Edge translation time. In addition, load balancing is done in kube-proxy which can have further performance impacts. Using Gloo Upstreams as a routing destination bypasses kube-proxy as the request is routed to the pod directly. Alternatively, you can use [Kubernetes](https://docs.solo.io/gloo-edge/latest/reference/api/github.com/solo-io/gloo/projects/gloo/api/v1/options/kubernetes/kubernetes.proto.sk/) Upstream resources as a routing destination to forward requests to the pod directly. For more information, see the [docs](https://docs.solo.io/gloo-edge/latest/guides/traffic_management/destination_types/kubernetes_services/)."` - EnableRestEds bool `json:"enableRestEds,omitempty" desc:"Whether or not to use rest xds for all EDS by default. Defaults to false."` - DevMode bool `json:"devMode,omitempty" desc:"Whether or not to enable dev mode. Defaults to false. Setting to true at install time will expose the gloo dev admin endpoint on port 10010. Not recommended for production."` - } - - Gloo struct { - LogLevel string `json:"logLevel,omitempty" desc:"Level at which the pod should log. Options include \"info\", \"debug\", \"warn\", \"error\", \"panic\" and \"fatal\". Default level is info"` - } - - Discovery struct { - Enabled bool `json:"enabled,omitempty" desc:"enable Discovery features"` - Image *Image `json:"image,omitempty"` - } - - Gateway struct { - Enabled bool `json:"enabled,omitempty" desc:"enable Gloo Edge API Gateway features"` - Image *Image `json:"image,omitempty"` - CertGenJob *CertGenJob `json:"certGenJob,omitempty" desc:"generate self-signed certs with this job to be used with the gateway validation webhook. this job will only run if validation is enabled for the gateway"` - RolloutJob *RolloutJob `json:"rolloutJob,omitempty" desc:"This job waits for the 'gloo' deployment to successfully roll out (if the validation webhook is enabled), and then applies the Gloo Edge custom resources."` - CleanupJob *CleanupJob `json:"cleanupJob,omitempty" desc:"This job cleans up resources that are not deleted by Helm when Gloo Edge is uninstalled."` - } - - CertGenJob struct { - Enabled bool `json:"enabled,omitempty" desc:"enable the job that generates the certificates for the validating webhook at install time (default true)"` - Image *Image `json:"image,omitempty"` - } - - RolloutJob struct { - Enabled bool `json:"enabled,omitempty" desc:"Enable the job that applies default Gloo Edge custom resources at install and upgrade time (default true)."` - Image *Image `json:"image,omitempty"` - } - - CleanupJob struct { - Enabled bool `json:"enabled,omitempty" desc:"Enable the job that removes Gloo Edge custom resources when Gloo Edge is uninstalled (default true)."` - Image *Image `json:"image,omitempty"` - } - - Global struct { - Image *Image `json:"image,omitempty"` - IstioSDS *IstioSDS `json:"istioSDS,omitempty" desc:"Config used for installing Gloo Edge with Istio SDS cert rotation features to facilitate Istio mTLS"` - GlooMtls *Mtls `json:"glooMtls,omitempty" desc:"Config used to enable internal mtls authentication"` - } + GlooEdge generate.HelmConfig - IstioSDS struct { - Enabled bool `json:"enabled,omitempty" desc:"Enables SDS cert-rotator sidecar for istio mTLS cert rotation"` - } - - Mtls struct { - Enabled bool `json:"enabled,omitempty" desc:"Enables internal mtls authentication"` - Sds *SdsContainer `json:"sds,omitempty"` - EnvoySidecar *EnvoySidecarContainer `json:"envoy,omitempty"` - IstioProxy *IstioProxyContainer `json:"istioProxy,omitempty" desc:"Istio-proxy container"` - } - - SdsContainer struct { - Image *Image `json:"image,omitempty"` - } - - EnvoySidecarContainer struct { - Image *Image `json:"image,omitempty"` - } - - IstioProxyContainer struct { - Image *Image `json:"image,omitempty" desc:"Istio-proxy image to use for mTLS"` - } - - Image struct { - Tag string `yaml:"tag,omitempty" json:"tag,omitempty"` - Repository string `yaml:"repository,omitempty" json:"repository,omitempty"` - Registry string `yaml:"registry,omitempty" json:"registry,omitempty"` - Load bool `yaml:"load,omitempty" json:"load,omitempty"` - } + Image generate.Image App struct { ConfigMaps []*corev1.ConfigMap `yaml:"configMaps,omitempty" json:"configMaps,omitempty"` @@ -118,49 +23,43 @@ type ( Deployment *appsv1.Deployment `yaml:"deployment,omitempty" json:"deployment,omitempty"` Versions []string `yaml:"versions,omitempty" json:"versions,omitempty"` } - - RepositoryImage struct { - Tag string `yaml:"tag,omitempty" json:"tag,omitempty"` - Repository string `yaml:"repository,omitempty" json:"repository,omitempty"` - Load bool `yaml:"load,omitempty" json:"load,omitempty"` - } ) func (p GlooEdge) Images() (imageRefs []string) { - defaultImage := &Image{} + defaultImage := &generate.Image{} if p.Global != nil { if p.Global.Image != nil { // load override defaultImage = p.Global.Image } - glooMtlsEnabled := p.Global.GlooMtls != nil && p.Global.GlooMtls.Enabled - istioSDSEnabled := p.Global.IstioSDS != nil && p.Global.IstioSDS.Enabled + glooMtlsEnabled := p.Global.GlooMtls != nil && *p.Global.GlooMtls.Enabled + istioSDSEnabled := p.Global.IstioSDS != nil && *p.Global.IstioSDS.Enabled // Check if either GlooMtls or IstioSDS is enabled. // Note: Image overrides are only defined on GlooMtls. if glooMtlsEnabled || istioSDSEnabled { // Add Sds image IstioProxy override if GlooMtls is enabled - if p.Global.GlooMtls != nil && p.Global.GlooMtls.IstioProxy != nil { - imageRefs = append(imageRefs, p.Global.GlooMtls.Sds.Image.Ref(defaults.DefaultSdsImageName)) + if p.Global.GlooMtls != nil && p.Global.GlooMtls.IstioProxy.Image != nil { + imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.Sds.Image, defaults.DefaultSdsImageName)) } else { // Add default global image if GlooMtls image overrides are not set - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultSdsImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultSdsImageName)) } // Add EnvoySidecar image override if GlooMtls is enabled - if p.Global.GlooMtls != nil && p.Global.GlooMtls.EnvoySidecar != nil { - imageRefs = append(imageRefs, p.Global.GlooMtls.EnvoySidecar.Image.Ref(defaults.DefaultGatewayImageName)) + if p.Global.GlooMtls != nil && p.Global.GlooMtls.EnvoySidecar.Image != nil { + imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.EnvoySidecar.Image, defaults.DefaultGatewayImageName)) } else { // Add default global image if GlooMtls image overrides are not set - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultGatewayImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultGatewayImageName)) } // Add IstioProxy image override if IstioSDS is enabled if istioSDSEnabled { - if p.Global.GlooMtls != nil && p.Global.GlooMtls.IstioProxy != nil { - imageRefs = append(imageRefs, p.Global.GlooMtls.IstioProxy.Image.Ref(defaults.DefaultIstioProxyImageName)) + if p.Global.GlooMtls != nil && p.Global.GlooMtls.IstioProxy.Image != nil { + imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.IstioProxy.Image, defaults.DefaultIstioProxyImageName)) } else { // Add default image imageRefs = append(imageRefs, fmt.Sprintf("%s/%s:%s", defaults.DefaultIstioImageRegistry, defaults.DefaultIstioProxyImageName, defaults.DefaultIstioTag)) @@ -168,79 +67,70 @@ func (p GlooEdge) Images() (imageRefs []string) { } } else if istioSDSEnabled { // Add default global image if IstioSDS is enabled, but GlooMtls image overrides are not set - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultSdsImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultSdsImageName)) imageRefs = append(imageRefs, fmt.Sprintf("%s/%s:%s", defaults.DefaultIstioImageRegistry, defaults.DefaultIstioProxyImageName, defaults.DefaultIstioTag)) } } // gloo image is configured via Global.Image - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultGlooImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultGlooImageName)) - if p.Gateway != nil && p.Gateway.Enabled { + if p.Gateway != nil && *p.Gateway.Enabled { // use overrides - imageRefs = append(imageRefs, p.Gateway.Image.Ref(defaults.DefaultGatewayImageName)) - if p.Gateway.CertGenJob != nil && p.Gateway.CertGenJob.Enabled { - imageRefs = append(imageRefs, p.Gateway.CertGenJob.Image.Ref(defaults.DefaultCertGenJobImageName)) - } else { - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultCertGenJobImageName)) + if *p.Gateway.CertGenJob.Enabled { + if p.Gateway.CertGenJob.Image != nil { + imageRefs = append(imageRefs, getImageRef(p.Gateway.CertGenJob.Image, defaults.DefaultCertGenJobImageName)) + } else { + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultCertGenJobImageName)) + } } - if p.Gateway.RolloutJob != nil && p.Gateway.RolloutJob.Enabled { - imageRefs = append(imageRefs, p.Gateway.RolloutJob.Image.Ref(defaults.DefaultRolloutJobImageName)) - } else { - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultRolloutJobImageName)) + if *p.Gateway.RolloutJob.Enabled { + if p.Gateway.RolloutJob.Image != nil { + imageRefs = append(imageRefs, getImageRef(p.Gateway.RolloutJob.Image, defaults.DefaultRolloutJobImageName)) + } else { + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultRolloutJobImageName)) + } } - if p.Gateway.CleanupJob != nil && p.Gateway.CleanupJob.Enabled { - imageRefs = append(imageRefs, p.Gateway.CleanupJob.Image.Ref(defaults.DefaultCleanupJobImageName)) - } else { - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultCleanupJobImageName)) + if *p.Gateway.CleanupJob.Enabled { + if p.Gateway.CleanupJob.Image != nil { + imageRefs = append(imageRefs, getImageRef(p.Gateway.CleanupJob.Image, defaults.DefaultCleanupJobImageName)) + } else { + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultCleanupJobImageName)) + } } } else { // use default global image - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultGatewayImageName)) - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultCertGenJobImageName)) - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultRolloutJobImageName)) - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultCleanupJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultGatewayImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultCertGenJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultRolloutJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultCleanupJobImageName)) } - if p.Gateway2 != nil && p.Gateway2.ControlPlane != nil && p.Gateway2.ControlPlane.Enabled { - // Note: Gateway2 uses same image as Gateway - imageRefs = append(imageRefs, p.Gateway.Image.Ref(defaults.DefaultGatewayImageName)) - } else { - // use default global image - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultGatewayImageName)) - } - - if p.Discovery != nil && p.Discovery.Enabled { - imageRefs = append(imageRefs, p.Discovery.Image.Ref(defaults.DefaultDiscoveryImageName)) - } else { - // use default global image - imageRefs = append(imageRefs, defaultImage.Ref(defaults.DefaultDiscoveryImageName)) + if *p.Discovery.Enabled { + if p.Discovery.Deployment.Image != nil { + imageRefs = append(imageRefs, getImageRef(p.Discovery.Deployment.Image, defaults.DefaultDiscoveryImageName)) + } else { + // use default global image + imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultDiscoveryImageName)) + } } return imageRefs } -func (i Image) Ref(component string) string { +func getImageRef(image *generate.Image, component string) string { return fmt.Sprintf( "%s/%s:%s", - withDefault(i.Registry, os.Getenv("IMAGE_REGISTRY")), - withDefault(i.Repository, component), - withDefault(i.Tag, os.Getenv("VERSION")), - ) -} - -func (i RepositoryImage) Ref(component string) string { - return fmt.Sprintf( - "%s:%s", - withDefault(i.Repository, strings.Join([]string{os.Getenv("REGISTRY"), component}, "/")), - withDefault(i.Tag, os.Getenv("VERSION")), + withDefault(image.Registry, os.Getenv("IMAGE_REGISTRY")), + withDefault(image.Repository, component), + withDefault(image.Tag, os.Getenv("VERSION")), ) } -func withDefault(value, defaultValue string) string { - if value == "" { +func withDefault(value *string, defaultValue string) string { + if value == nil { return defaultValue } - return value + return *value } From 6770aff9c213e77a5e50d29fbcaf1e48cc7f81d0 Mon Sep 17 00:00:00 2001 From: npolshakova Date: Thu, 28 Mar 2024 10:58:55 -0400 Subject: [PATCH 03/33] changelog --- changelog/v1.17.0-beta14/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta14/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta14/add-declarative-setup.yaml b/changelog/v1.17.0-beta14/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta14/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 1ffaf1c73dbe3fbf7ac590e56b71490569511299 Mon Sep 17 00:00:00 2001 From: npolshakova Date: Thu, 28 Mar 2024 12:43:20 -0400 Subject: [PATCH 04/33] revert mergo version --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c1be8c1edcd..4ce28b597e5 100644 --- a/go.mod +++ b/go.mod @@ -352,7 +352,7 @@ replace ( // go: istio.io/istio requires github.com/imdario/mergo@v1.0.0: parsing go.mod: // module declares its path as: dario.cat/mergo // but was required as: github.com/imdario/mergo - github.com/imdario/mergo => github.com/imdario/mergo v0.3.5 + github.com/imdario/mergo => github.com/imdario/mergo v0.3.16 github.com/opencontainers/go-digest => github.com/opencontainers/go-digest v1.0.0-rc1 // skv2 uses a newer version than the imported solo-kit version which causes issues. Replaces the version with the solo-kit version diff --git a/go.sum b/go.sum index a7209adc18f..1a53cbcf325 100644 --- a/go.sum +++ b/go.sum @@ -1502,8 +1502,8 @@ github.com/iancoleman/strcase v0.1.3 h1:dJBk1m2/qjL1twPLf68JND55vvivMupZ4wIzE8CT github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/imroc/req v0.3.0 h1:3EioagmlSG+z+KySToa+Ylo3pTFZs+jh3Brl7ngU12U= github.com/imroc/req v0.3.0/go.mod h1:F+NZ+2EFSo6EFXdeIbpfE9hcC233id70kf0byW97Caw= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf h1:WfD7VjIE6z8dIvMsI4/s+1qr5EL+zoIGev1BQj1eoJ8= From 754b868f42ab07dadd4f47cc67b6615e4dce591b Mon Sep 17 00:00:00 2001 From: npolshakova Date: Thu, 28 Mar 2024 12:44:36 -0400 Subject: [PATCH 05/33] move changelog --- .../{v1.17.0-beta14 => v1.17.0-beta15}/add-declarative-setup.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog/{v1.17.0-beta14 => v1.17.0-beta15}/add-declarative-setup.yaml (100%) diff --git a/changelog/v1.17.0-beta14/add-declarative-setup.yaml b/changelog/v1.17.0-beta15/add-declarative-setup.yaml similarity index 100% rename from changelog/v1.17.0-beta14/add-declarative-setup.yaml rename to changelog/v1.17.0-beta15/add-declarative-setup.yaml From c1ead87d7323a9ab9d6b762612c8b5e2e5844158 Mon Sep 17 00:00:00 2001 From: npolshakova Date: Thu, 28 Mar 2024 14:50:34 -0400 Subject: [PATCH 06/33] regen --- docs/content/static/content/osa_provided.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/static/content/osa_provided.md b/docs/content/static/content/osa_provided.md index 7ce41299542..4690075c844 100644 --- a/docs/content/static/content/osa_provided.md +++ b/docs/content/static/content/osa_provided.md @@ -27,7 +27,7 @@ Name|Version|License [gorilla/mux](https://github.com/gorilla/mux)|v1.8.0|BSD 3-clause "New" or "Revised" License [grpc-ecosystem/go-grpc-middleware](https://github.com/grpc-ecosystem/go-grpc-middleware)|v1.4.0|Apache License 2.0 [hinshun/vt10x](https://github.com/hinshun/vt10x)|v0.0.0-20180809195222-d55458df857c|MIT License -[imdario/mergo](https://github.com/imdario/mergo)|v0.3.5|BSD 3-clause "New" or "Revised" License +[imdario/mergo](https://github.com/imdario/mergo)|v0.3.16|BSD 3-clause "New" or "Revised" License [inconshreveable/go-update](https://github.com/inconshreveable/go-update)|v0.0.0-20160112193335-8152e7eb6ccf|UNKNOWN [jhump/protoreflect](https://github.com/jhump/protoreflect)|v1.15.3|Apache License 2.0 [kelseyhightower/envconfig](https://github.com/kelseyhightower/envconfig)|v1.4.0|MIT License From 0793f9dcf1506a720ef52c7984f1412532acb2ea Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Fri, 29 Mar 2024 22:09:22 +0000 Subject: [PATCH 07/33] Adding changelog file to new location --- changelog/v1.17.0-beta16/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta16/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta16/add-declarative-setup.yaml b/changelog/v1.17.0-beta16/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta16/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From a557d94c3ae7138d9e85c3cf82560d27c11ce3b5 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Fri, 29 Mar 2024 22:09:22 +0000 Subject: [PATCH 08/33] Deleting changelog file from old location --- changelog/v1.17.0-beta15/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta15/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta15/add-declarative-setup.yaml b/changelog/v1.17.0-beta15/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta15/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From ef497946b5cf2360107300b5cd5cc2dd7dbf6e2d Mon Sep 17 00:00:00 2001 From: npolshakova Date: Tue, 2 Apr 2024 16:29:03 -0400 Subject: [PATCH 09/33] pr feedback --- pkg/utils/kubeutils/names.go | 17 +++++++++ pkg/utils/maputils/merge_maps.go | 60 ++++++++++++++++++++++++++++++++ test/setup/cmd/setup.go | 17 +++++---- test/setup/config/config.go | 32 +++++++---------- test/setup/defaults/defaults.go | 20 ----------- test/setup/helpers/helpers.go | 58 ------------------------------ test/setup/types/cluster.go | 5 +-- test/setup/types/edge.go | 44 +++++++++++------------ test/testutils/env.go | 18 ++++++++++ 9 files changed, 141 insertions(+), 130 deletions(-) create mode 100644 pkg/utils/maputils/merge_maps.go delete mode 100644 test/setup/defaults/defaults.go diff --git a/pkg/utils/kubeutils/names.go b/pkg/utils/kubeutils/names.go index 0f059f6e06c..b1e987f5623 100644 --- a/pkg/utils/kubeutils/names.go +++ b/pkg/utils/kubeutils/names.go @@ -6,4 +6,21 @@ const ( // The name of the port in the gloo control plane Kubernetes Service that serves xDS config. GlooXdsPortName = "grpc-xds" + + // Image defaults + DefaultGlooImageRegistry = "quay.io/solo-io" + DefaultGlooImageName = "gloo" + DefaultDiscoveryImageName = "discovery" + DefaultIgressImageName = "ingress" + DefaultSdsImageName = "sds" + DefaultCertGenJobImageName = "certgen" + DefaultCleanupJobImageName = "kubectl" + DefaultRolloutJobImageName = "kubectl" + DefaultAccessLoggerImageName = "access-logger" + DefaultGatewayImageName = "gloo-envoy-wrapper" + + // Istio defaults + DefaultIstioTag = "1.18.2" + DefaultIstioImageRegistry = "docker.io/istio" + DefaultIstioProxyImageName = "proxyv2" ) diff --git a/pkg/utils/maputils/merge_maps.go b/pkg/utils/maputils/merge_maps.go new file mode 100644 index 00000000000..21a968675e8 --- /dev/null +++ b/pkg/utils/maputils/merge_maps.go @@ -0,0 +1,60 @@ +package maputils + +import "reflect" + +// Merge maps, merge priority is left to right (i.e. right maps will overwrite left maps) +func MergeValueMaps(maps ...map[string]interface{}) map[string]interface{} { + var out map[string]interface{} + for i, m := range maps { + if i == 0 { + out = m + continue + } + out = mergeTwoValueMaps(out, m) + } + + return out +} + +// Yanked this right out of helm libs, merge priority is left to right +func mergeTwoValueMaps(a, b map[string]interface{}) map[string]interface{} { + out := make(map[string]interface{}, len(a)) + for k, v := range a { + out[k] = v + } + for k, v := range b { + if v, ok := CastMap(v); ok { + if bv, ok := out[k]; ok { + if bv, ok := CastMap(bv); ok { + out[k] = mergeTwoValueMaps(bv, v) + continue + } + } + } + out[k] = v + } + return out +} + +// Made our own cast map because regular casting was yielding inconsistent results +func CastMap(value interface{}) (map[string]interface{}, bool) { + result := map[string]interface{}{} + rValues := reflect.ValueOf(value) + if rValues.Kind() == reflect.Map { + iter := rValues.MapRange() + for iter.Next() { + k := iter.Key().Interface() + v := iter.Value().Interface() + kS, isS := k.(string) + if isS { + result[kS] = v + } else { + return map[string]interface{}{}, false + + } + } + return result, true + } else { + return map[string]interface{}{}, false + } +} diff --git a/test/setup/cmd/setup.go b/test/setup/cmd/setup.go index 0fa47a10c38..c6c281e4f9d 100644 --- a/test/setup/cmd/setup.go +++ b/test/setup/cmd/setup.go @@ -11,19 +11,18 @@ import ( "sync" errors "github.com/rotisserie/eris" - "github.com/solo-io/gloo/test/setup/defaults" - "github.com/solo-io/gloo/test/setup/types" - "github.com/solo-io/go-utils/contextutils" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - corev1 "k8s.io/api/core/v1" - "github.com/solo-io/gloo/test/setup/config" "github.com/solo-io/gloo/test/setup/helm" "github.com/solo-io/gloo/test/setup/helpers" "github.com/solo-io/gloo/test/setup/istio" "github.com/solo-io/gloo/test/setup/kind" "github.com/solo-io/gloo/test/setup/kubernetes" + "github.com/solo-io/gloo/test/setup/types" + "github.com/solo-io/gloo/test/testutils" + "github.com/solo-io/go-utils/contextutils" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + corev1 "k8s.io/api/core/v1" ) type options struct { @@ -71,8 +70,8 @@ func setupFunc(ctx context.Context, opts *options) error { } var istioctlBinary string - if os.Getenv(defaults.IstioctlVersionEnv) != "" { - istioctlBinary, err = istio.DownloadIstio(ctx, os.Getenv(defaults.IstioctlVersionEnv)) + if os.Getenv(testutils.IstioctlVersionEnv) != "" { + istioctlBinary, err = istio.DownloadIstio(ctx, os.Getenv(testutils.IstioctlVersionEnv)) if err != nil { return fmt.Errorf("failed to download istio: %w", err) } diff --git a/test/setup/config/config.go b/test/setup/config/config.go index 38349d5fe13..ee08e45bc67 100644 --- a/test/setup/config/config.go +++ b/test/setup/config/config.go @@ -7,11 +7,12 @@ import ( "os" "strings" + "github.com/solo-io/gloo/pkg/utils/kubeutils" + "github.com/solo-io/gloo/test/testutils" "sigs.k8s.io/yaml" "github.com/solo-io/go-utils/contextutils" - "github.com/solo-io/gloo/test/setup/defaults" "github.com/solo-io/gloo/test/setup/types" ) @@ -20,45 +21,38 @@ func Load(ctx context.Context, configPath string, reader io.Reader) (*types.Conf var ( err error config types.Config - logger = contextutils.LoggerFrom(ctx) ) - if os.Getenv("CLUSTER_NAME") == "" { - os.Setenv("CLUSTER_NAME", "kind") + if os.Getenv(testutils.ClusterName) == "" { + os.Setenv(testutils.ClusterName, "kind") } - if os.Getenv("VERSION") == "" { + if os.Getenv(testutils.Version) == "" { // if version is not set, default to the dev version - os.Setenv("VERSION", "1.0.1-dev") + os.Setenv(testutils.Version, "1.0.1-dev") } // Can set defaults here for the process if ran directly from the command line. // // These will likely be set in make targets, but can't set defaults in the config // file itself. - if os.Getenv("ISTIO_VERSION") == "" { - latestVersion := strings.Split(defaults.DefaultIstioTag, "-") + if os.Getenv(testutils.IstioVersion) == "" { + latestVersion := strings.Split(kubeutils.DefaultIstioTag, "-") if len(latestVersion) == 0 { panic("invalid default istio tag setting") } - os.Setenv("ISTIO_VERSION", latestVersion[0]) + os.Setenv(testutils.IstioVersion, latestVersion[0]) } - if os.Getenv("ISTIO_HUB") == "" { - os.Setenv("ISTIO_HUB", defaults.DefaultIstioImageRegistry) + if os.Getenv(testutils.IstioHub) == "" { + os.Setenv(testutils.IstioHub, kubeutils.DefaultIstioImageRegistry) } - if os.Getenv("IMAGE_REGISTRY") == "" { - os.Setenv("IMAGE_REGISTRY", defaults.DefaultGlooImageRegistry) + if os.Getenv(testutils.ImageRegistry) == "" { + os.Setenv(testutils.ImageRegistry, kubeutils.DefaultGlooImageRegistry) } - //if os.Getenv("VERSION") == "" { - // os.Setenv("VERSION", helpers.Version()) - //} - - logger.Infof("Using Istio hub: %s version: %s", os.Getenv("ISTIO_HUB"), os.Getenv("ISTIO_VERSION")) - contents, err := readConfig(ctx, configPath, reader) if err != nil { return nil, err diff --git a/test/setup/defaults/defaults.go b/test/setup/defaults/defaults.go deleted file mode 100644 index 155f99fd3fe..00000000000 --- a/test/setup/defaults/defaults.go +++ /dev/null @@ -1,20 +0,0 @@ -package defaults - -const ( - DefaultIstioTag = "1.18.2" - DefaultIstioImageRegistry = "docker.io/istio" - IstioctlVersionEnv = "ISTIOCTL_VERSION" - - DefaultGlooImageRegistry = "quay.io/solo-io" - - DefaultGlooImageName = "gloo" - DefaultDiscoveryImageName = "discovery" - DefaultIgressImageName = "ingress" - DefaultSdsImageName = "sds" - DefaultIstioProxyImageName = "proxyv2" - DefaultCertGenJobImageName = "certgen" - DefaultCleanupJobImageName = "kubectl" - DefaultRolloutJobImageName = "kubectl" - DefaultAccessLoggerImageName = "access-logger" - DefaultGatewayImageName = "gloo-envoy-wrapper" -) diff --git a/test/setup/helpers/helpers.go b/test/setup/helpers/helpers.go index 2d73b0accce..4a667cf14b4 100644 --- a/test/setup/helpers/helpers.go +++ b/test/setup/helpers/helpers.go @@ -2,7 +2,6 @@ package helpers import ( "os/exec" - "reflect" "strings" ) @@ -13,60 +12,3 @@ func GlooDirectory() string { } return strings.TrimSpace(string(data)) } - -// Merge maps, merge priority is left to right (i.e. right maps will overwrite left maps) -func MergeValueMaps(maps ...map[string]interface{}) map[string]interface{} { - var out map[string]interface{} - for i, m := range maps { - if i == 0 { - out = m - continue - } - out = mergeTwoValueMaps(out, m) - } - - return out -} - -// Yanked this right out of helm libs, merge priority is left to right -func mergeTwoValueMaps(a, b map[string]interface{}) map[string]interface{} { - out := make(map[string]interface{}, len(a)) - for k, v := range a { - out[k] = v - } - for k, v := range b { - if v, ok := CastMap(v); ok { - if bv, ok := out[k]; ok { - if bv, ok := CastMap(bv); ok { - out[k] = mergeTwoValueMaps(bv, v) - continue - } - } - } - out[k] = v - } - return out -} - -// Made our own cast map because regular casting was yielding inconsistent results -func CastMap(value interface{}) (map[string]interface{}, bool) { - result := map[string]interface{}{} - rValues := reflect.ValueOf(value) - if rValues.Kind() == reflect.Map { - iter := rValues.MapRange() - for iter.Next() { - k := iter.Key().Interface() - v := iter.Value().Interface() - kS, isS := k.(string) - if isS { - result[kS] = v - } else { - return map[string]interface{}{}, false - - } - } - return result, true - } else { - return map[string]interface{}{}, false - } -} diff --git a/test/setup/types/cluster.go b/test/setup/types/cluster.go index 8361a51d6da..7e98c0bc5e9 100644 --- a/test/setup/types/cluster.go +++ b/test/setup/types/cluster.go @@ -1,10 +1,11 @@ package types import ( - "github.com/solo-io/gloo/test/setup/helpers" istiov1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1" corev1 "k8s.io/api/core/v1" kindv1alpha4 "sigs.k8s.io/kind/pkg/apis/config/v1alpha4" + + "github.com/solo-io/gloo/pkg/utils/maputils" ) type Cluster struct { @@ -46,7 +47,7 @@ func (c *Cluster) UpdateChart(name string, values ...map[string]any) { base := &c.Charts[i].Values for _, value := range values { - *base = helpers.MergeValueMaps(*base, value) + *base = maputils.MergeValueMaps(*base, value) } (*c.Charts[i]).Values = *base diff --git a/test/setup/types/edge.go b/test/setup/types/edge.go index aa5f668e2df..b78531e4d08 100644 --- a/test/setup/types/edge.go +++ b/test/setup/types/edge.go @@ -5,7 +5,7 @@ import ( "os" "github.com/solo-io/gloo/install/helm/gloo/generate" - "github.com/solo-io/gloo/test/setup/defaults" + "github.com/solo-io/gloo/pkg/utils/kubeutils" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" ) @@ -42,77 +42,77 @@ func (p GlooEdge) Images() (imageRefs []string) { if glooMtlsEnabled || istioSDSEnabled { // Add Sds image IstioProxy override if GlooMtls is enabled if p.Global.GlooMtls != nil && p.Global.GlooMtls.IstioProxy.Image != nil { - imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.Sds.Image, defaults.DefaultSdsImageName)) + imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.Sds.Image, kubeutils.DefaultSdsImageName)) } else { // Add default global image if GlooMtls image overrides are not set - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultSdsImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultSdsImageName)) } // Add EnvoySidecar image override if GlooMtls is enabled if p.Global.GlooMtls != nil && p.Global.GlooMtls.EnvoySidecar.Image != nil { - imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.EnvoySidecar.Image, defaults.DefaultGatewayImageName)) + imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.EnvoySidecar.Image, kubeutils.DefaultGatewayImageName)) } else { // Add default global image if GlooMtls image overrides are not set - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultGatewayImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultGatewayImageName)) } // Add IstioProxy image override if IstioSDS is enabled if istioSDSEnabled { if p.Global.GlooMtls != nil && p.Global.GlooMtls.IstioProxy.Image != nil { - imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.IstioProxy.Image, defaults.DefaultIstioProxyImageName)) + imageRefs = append(imageRefs, getImageRef(p.Global.GlooMtls.IstioProxy.Image, kubeutils.DefaultIstioProxyImageName)) } else { // Add default image - imageRefs = append(imageRefs, fmt.Sprintf("%s/%s:%s", defaults.DefaultIstioImageRegistry, defaults.DefaultIstioProxyImageName, defaults.DefaultIstioTag)) + imageRefs = append(imageRefs, fmt.Sprintf("%s/%s:%s", kubeutils.DefaultIstioImageRegistry, kubeutils.DefaultIstioProxyImageName, kubeutils.DefaultIstioTag)) } } } else if istioSDSEnabled { // Add default global image if IstioSDS is enabled, but GlooMtls image overrides are not set - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultSdsImageName)) - imageRefs = append(imageRefs, fmt.Sprintf("%s/%s:%s", defaults.DefaultIstioImageRegistry, defaults.DefaultIstioProxyImageName, defaults.DefaultIstioTag)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultSdsImageName)) + imageRefs = append(imageRefs, fmt.Sprintf("%s/%s:%s", kubeutils.DefaultIstioImageRegistry, kubeutils.DefaultIstioProxyImageName, kubeutils.DefaultIstioTag)) } } // gloo image is configured via Global.Image - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultGlooImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultGlooImageName)) if p.Gateway != nil && *p.Gateway.Enabled { // use overrides if *p.Gateway.CertGenJob.Enabled { if p.Gateway.CertGenJob.Image != nil { - imageRefs = append(imageRefs, getImageRef(p.Gateway.CertGenJob.Image, defaults.DefaultCertGenJobImageName)) + imageRefs = append(imageRefs, getImageRef(p.Gateway.CertGenJob.Image, kubeutils.DefaultCertGenJobImageName)) } else { - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultCertGenJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultCertGenJobImageName)) } } if *p.Gateway.RolloutJob.Enabled { if p.Gateway.RolloutJob.Image != nil { - imageRefs = append(imageRefs, getImageRef(p.Gateway.RolloutJob.Image, defaults.DefaultRolloutJobImageName)) + imageRefs = append(imageRefs, getImageRef(p.Gateway.RolloutJob.Image, kubeutils.DefaultRolloutJobImageName)) } else { - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultRolloutJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultRolloutJobImageName)) } } if *p.Gateway.CleanupJob.Enabled { if p.Gateway.CleanupJob.Image != nil { - imageRefs = append(imageRefs, getImageRef(p.Gateway.CleanupJob.Image, defaults.DefaultCleanupJobImageName)) + imageRefs = append(imageRefs, getImageRef(p.Gateway.CleanupJob.Image, kubeutils.DefaultCleanupJobImageName)) } else { - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultCleanupJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultCleanupJobImageName)) } } } else { // use default global image - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultGatewayImageName)) - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultCertGenJobImageName)) - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultRolloutJobImageName)) - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultCleanupJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultGatewayImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultCertGenJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultRolloutJobImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultCleanupJobImageName)) } if *p.Discovery.Enabled { if p.Discovery.Deployment.Image != nil { - imageRefs = append(imageRefs, getImageRef(p.Discovery.Deployment.Image, defaults.DefaultDiscoveryImageName)) + imageRefs = append(imageRefs, getImageRef(p.Discovery.Deployment.Image, kubeutils.DefaultDiscoveryImageName)) } else { // use default global image - imageRefs = append(imageRefs, getImageRef(defaultImage, defaults.DefaultDiscoveryImageName)) + imageRefs = append(imageRefs, getImageRef(defaultImage, kubeutils.DefaultDiscoveryImageName)) } } diff --git a/test/testutils/env.go b/test/testutils/env.go index eb41762aaa7..26e809fff32 100644 --- a/test/testutils/env.go +++ b/test/testutils/env.go @@ -68,6 +68,24 @@ const ( // This is an optional value, so if it is not set, the test suite will use the locally built version of Gloo Edge ReleasedVersion = "RELEASED_VERSION" + // Version is the Gloo Edge version set in makefile or overwritten in env to use for tests (ie '1.0.1-dev') + Version = "VERSION" + + // Cluster name to use in tests + ClusterName = "CLUSTER_NAME" + + // Image registry to use in tests + ImageRegistry = "IMAGE_REGISTRY" + + // Istio version to use in tests + IstioVersion = "ISTIO_VERSION" + + // Istio hub to use in tests + IstioHub = "ISTIO_HUB" + + // Istioctl version to use in tests + IstioctlVersionEnv = "ISTIOCTL_VERSION" + // Istio auto mtls IstioAutoMtls = "ISTIO_AUTO_MTLS" From b2b123c456f97c03cd0f0a84a40df62bc989b71b Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Wed, 3 Apr 2024 18:39:32 +0000 Subject: [PATCH 10/33] Adding changelog file to new location --- changelog/v1.17.0-beta17/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta17/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta17/add-declarative-setup.yaml b/changelog/v1.17.0-beta17/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta17/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From f8959bced932f1f20d6d82a2a109611974e5ccc9 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Wed, 3 Apr 2024 18:39:33 +0000 Subject: [PATCH 11/33] Deleting changelog file from old location --- changelog/v1.17.0-beta16/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta16/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta16/add-declarative-setup.yaml b/changelog/v1.17.0-beta16/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta16/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From a860944973f60bb6856d542b6d78959a59d43729 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Tue, 9 Apr 2024 01:13:13 +0000 Subject: [PATCH 12/33] Adding changelog file to new location --- changelog/v1.17.0-beta18/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta18/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta18/add-declarative-setup.yaml b/changelog/v1.17.0-beta18/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta18/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 9ba2cfb06c444fc672068d34c47f48c1b62a52f7 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Tue, 9 Apr 2024 01:13:13 +0000 Subject: [PATCH 13/33] Deleting changelog file from old location --- changelog/v1.17.0-beta17/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta17/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta17/add-declarative-setup.yaml b/changelog/v1.17.0-beta17/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta17/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From af0885e6458ec7c89978bdb8cac9b87f395a66ed Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Wed, 10 Apr 2024 13:11:28 +0000 Subject: [PATCH 14/33] Adding changelog file to new location --- changelog/v1.17.0-beta19/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta19/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta19/add-declarative-setup.yaml b/changelog/v1.17.0-beta19/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta19/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 41acb20a105aff87f095aaa59df7498f27bee620 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Wed, 10 Apr 2024 13:11:28 +0000 Subject: [PATCH 15/33] Deleting changelog file from old location --- changelog/v1.17.0-beta18/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta18/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta18/add-declarative-setup.yaml b/changelog/v1.17.0-beta18/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta18/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 7343ecc98592c54223cea46a5cd841acc1f62a72 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Thu, 11 Apr 2024 22:35:33 +0000 Subject: [PATCH 16/33] Adding changelog file to new location --- changelog/v1.17.0-beta20/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta20/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta20/add-declarative-setup.yaml b/changelog/v1.17.0-beta20/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta20/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 61270a78c55b7ee3d88ccd5f236d162a128f1f2a Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Thu, 11 Apr 2024 22:35:33 +0000 Subject: [PATCH 17/33] Deleting changelog file from old location --- changelog/v1.17.0-beta19/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta19/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta19/add-declarative-setup.yaml b/changelog/v1.17.0-beta19/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta19/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 286f7a344cb4c2686cace8d35738d65ab4e73143 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Fri, 12 Apr 2024 17:13:33 +0000 Subject: [PATCH 18/33] Adding changelog file to new location --- changelog/v1.17.0-beta21/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta21/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta21/add-declarative-setup.yaml b/changelog/v1.17.0-beta21/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta21/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 0737b0d396e1f3e9cc56e0e5fe6a98f6815b11ee Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Fri, 12 Apr 2024 17:13:33 +0000 Subject: [PATCH 19/33] Deleting changelog file from old location --- changelog/v1.17.0-beta20/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta20/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta20/add-declarative-setup.yaml b/changelog/v1.17.0-beta20/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta20/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From ee0db27f779400f7f994efb14775f5b83dabbfd7 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Sun, 14 Apr 2024 21:11:31 +0000 Subject: [PATCH 20/33] Adding changelog file to new location --- changelog/v1.17.0-beta22/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta22/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta22/add-declarative-setup.yaml b/changelog/v1.17.0-beta22/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta22/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From c9c540bb9bdd6ed9fc1cae8b20e5fbead08d8355 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Sun, 14 Apr 2024 21:11:32 +0000 Subject: [PATCH 21/33] Deleting changelog file from old location --- changelog/v1.17.0-beta21/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta21/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta21/add-declarative-setup.yaml b/changelog/v1.17.0-beta21/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta21/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 8b43782f5c716c0424e195e8fe4e38665336a876 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Wed, 17 Apr 2024 00:29:56 +0000 Subject: [PATCH 22/33] Adding changelog file to new location --- changelog/v1.17.0-beta23/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta23/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta23/add-declarative-setup.yaml b/changelog/v1.17.0-beta23/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta23/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From a38e60ec6773bfd73a23d366eab40076f9fbc568 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Wed, 17 Apr 2024 00:29:57 +0000 Subject: [PATCH 23/33] Deleting changelog file from old location --- changelog/v1.17.0-beta22/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta22/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta22/add-declarative-setup.yaml b/changelog/v1.17.0-beta22/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta22/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 8b5fee264d9a3965e2ec5a0f50d773b65fea838e Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Thu, 25 Apr 2024 15:59:42 +0000 Subject: [PATCH 24/33] Adding changelog file to new location --- changelog/v1.17.0-beta24/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta24/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta24/add-declarative-setup.yaml b/changelog/v1.17.0-beta24/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta24/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From bd8645c531ab968d9517fddc2b6c167198368128 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Thu, 25 Apr 2024 15:59:42 +0000 Subject: [PATCH 25/33] Deleting changelog file from old location --- changelog/v1.17.0-beta23/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta23/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta23/add-declarative-setup.yaml b/changelog/v1.17.0-beta23/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta23/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 11cc186b65f9c6dd0615c964aa913c0d6b1a1ce1 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Tue, 30 Apr 2024 19:46:42 +0000 Subject: [PATCH 26/33] Adding changelog file to new location --- changelog/v1.17.0-beta25/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta25/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta25/add-declarative-setup.yaml b/changelog/v1.17.0-beta25/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta25/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From ef3e849692336f796454175b119963c3ae954414 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Tue, 30 Apr 2024 19:46:42 +0000 Subject: [PATCH 27/33] Deleting changelog file from old location --- changelog/v1.17.0-beta24/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta24/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta24/add-declarative-setup.yaml b/changelog/v1.17.0-beta24/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta24/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 85388284e4f056385fec02a990d33180b76bb932 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Fri, 3 May 2024 16:20:45 +0000 Subject: [PATCH 28/33] Adding changelog file to new location --- changelog/v1.17.0-beta26/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta26/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta26/add-declarative-setup.yaml b/changelog/v1.17.0-beta26/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta26/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From 2d8eac744aa6914ae04dff88fd4250c728151f0b Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Fri, 3 May 2024 16:20:45 +0000 Subject: [PATCH 29/33] Deleting changelog file from old location --- changelog/v1.17.0-beta25/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta25/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta25/add-declarative-setup.yaml b/changelog/v1.17.0-beta25/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta25/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From db8e39381687b3489c39666592c6c1bfffc97b39 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Thu, 9 May 2024 21:08:13 +0000 Subject: [PATCH 30/33] Adding changelog file to new location --- changelog/v1.17.0-beta27/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta27/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta27/add-declarative-setup.yaml b/changelog/v1.17.0-beta27/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta27/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From a466f3e615370ca34e43a921a52c6fd17fd7fdc4 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Thu, 9 May 2024 21:08:14 +0000 Subject: [PATCH 31/33] Deleting changelog file from old location --- changelog/v1.17.0-beta26/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta26/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta26/add-declarative-setup.yaml b/changelog/v1.17.0-beta26/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta26/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From f561fda55d29c7a391a9e97d3d43f7cc15f641fb Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Mon, 13 May 2024 20:07:49 +0000 Subject: [PATCH 32/33] Adding changelog file to new location --- changelog/v1.17.0-beta28/add-declarative-setup.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v1.17.0-beta28/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta28/add-declarative-setup.yaml b/changelog/v1.17.0-beta28/add-declarative-setup.yaml new file mode 100644 index 00000000000..6dc2af4060f --- /dev/null +++ b/changelog/v1.17.0-beta28/add-declarative-setup.yaml @@ -0,0 +1,4 @@ +changelog: + - type: NON_USER_FACING + description: >- + - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file From cdc2c954583639dee4aa4d872848887fa8ff331e Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Mon, 13 May 2024 20:07:50 +0000 Subject: [PATCH 33/33] Deleting changelog file from old location --- changelog/v1.17.0-beta27/add-declarative-setup.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 changelog/v1.17.0-beta27/add-declarative-setup.yaml diff --git a/changelog/v1.17.0-beta27/add-declarative-setup.yaml b/changelog/v1.17.0-beta27/add-declarative-setup.yaml deleted file mode 100644 index 6dc2af4060f..00000000000 --- a/changelog/v1.17.0-beta27/add-declarative-setup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -changelog: - - type: NON_USER_FACING - description: >- - - Added declarative setup for setting up kind cluster, installing gloo and example applications to simplify e2e testing. \ No newline at end of file