diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 24f302b..6c40c4e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -10,19 +10,16 @@ jobs: test: name: Test runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - go: ["1.22"] steps: + - name: Checkout code + uses: actions/checkout@v6 + - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: ${{ matrix.go }} + go-version-file: .go-version - - name: Checkout code - uses: actions/checkout@v4 - name: Test run: make test @@ -32,13 +29,14 @@ jobs: runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v6 + - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: '1.22' + go-version-file: .go-version - - name: Checkout code - uses: actions/checkout@v4 - name: Lint run: make lint @@ -50,16 +48,16 @@ jobs: runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v6 + - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: - go-version: '1.22' - - - name: Checkout code - uses: actions/checkout@v4 + go-version-file: .go-version - name: Cache licenses - uses: actions/cache@v4 + uses: actions/cache@v5 with: key: licensei-v2-${{ hashFiles('go.sum') }} path: | diff --git a/.gitignore b/.gitignore index 350dd40..4cba475 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ bin/ build/ .idea +.licensei.cache diff --git a/.go-version b/.go-version new file mode 100644 index 0000000..5ff8c4f --- /dev/null +++ b/.go-version @@ -0,0 +1 @@ +1.26.0 diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..410b34a --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,45 @@ +version: "2" +run: + timeout: 10m + allow-parallel-runners: true + +formatters: + enable: + - gci + - gofmt + - gofumpt + - goimports + settings: + gci: + sections: + - standard + - default + - prefix(github.com/cisco-open/operator-tools) + goimports: + local-prefixes: + - github.com/cisco-open/operator-tools + gofmt: + simplify: true + gofumpt: + extra-rules: false + +linters: + settings: + misspell: + locale: US + revive: + confidence: 0.9 + gocyclo: + min-complexity: 45 + enable: + - bodyclose + - errcheck + - ineffassign + - misspell + - nolintlint + - revive + - gocyclo + - unconvert + - unparam + - unused + - whitespace diff --git a/Makefile b/Makefile index cc43be7..946b228 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,28 @@ -LICENSEI_VERSION = 0.9.0 -GOLANGCI_VERSION = 1.59.0 +#### +## Dependency versions +#### + +CONTROLLER_TOOLS_VERSION := 0.21.0 + +GOLANGCI_LINT_VERSION := 2.12.2 + +LICENSEI_VERSION := 0.9.0 + +ENVTEST_K8S_VERSION := 1.35.0 + +BIN := ${PWD}/bin + +export PATH := $(BIN):$(PATH) + +GOVERSION := $(shell go env GOVERSION) + +GOLANGCI_LINT := $(BIN)/golangci-lint +CONTROLLER_GEN ?= $(BIN)/controller-gen +ENVTEST ?= $(BIN)/setup-envtest +LICENSEI := $(BIN)/licensei + +ENVTEST_BIN_DIR := $(BIN)/envtest +ENVTEST_BINARY_ASSETS := $(ENVTEST_BIN_DIR)/bin # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) @@ -8,22 +31,25 @@ else GOBIN=$(shell go env GOBIN) endif -BIN := ${PWD}/bin -export PATH := ${BIN}:${PATH} +# Setting SHELL to bash allows bash commands to be executed by recipes. +# Options are set to exit when a recipe line exits non-zero or a piped command fails. +SHELL = /usr/bin/env bash -o pipefail +.SHELLFLAGS = -ec -CONTROLLER_GEN_VERSION = v0.15.0 -CONTROLLER_GEN = $(PWD)/bin/controller-gen +##@ General -OS = $(shell uname | tr A-Z a-z) +.DEFAULT_GOAL = help +.PHONY: help +help: ## Display this help. + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) -ENVTEST_BIN_DIR := ${BIN}/envtest -ENVTEST_K8S_VERSION := 1.24.1 -ENVTEST_BINARY_ASSETS := ${ENVTEST_BIN_DIR}/bin +##@ Development -SETUP_ENVTEST := ${BIN}/setup-envtest +.PHONY: generate +generate: codegen docs fmt ## Generate code, documentation, etc. -# Generate code -generate: bin/controller-gen +.PHONY: codegen +codegen: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. $(CONTROLLER_GEN) object:headerFile=./hack/boilerplate.go.txt paths=./pkg/secret/... $(CONTROLLER_GEN) object:headerFile=./hack/boilerplate.go.txt paths=./pkg/volume/... $(CONTROLLER_GEN) object:headerFile=./hack/boilerplate.go.txt paths=./pkg/prometheus/... @@ -31,80 +57,102 @@ generate: bin/controller-gen $(CONTROLLER_GEN) object:headerFile=./hack/boilerplate.go.txt paths=./pkg/typeoverride/... $(CONTROLLER_GEN) object:headerFile=./hack/boilerplate.go.txt paths=./pkg/helm/... -bin/controller-gen: - @ if ! test -x bin/controller-gen; then \ - set -ex ;\ - GOBIN=$(PWD)/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@${CONTROLLER_GEN_VERSION} ;\ - fi - +.PHONY: docs +docs: ## Generate type documentation. + go run cmd/docs.go -bin/licensei: bin/licensei-${LICENSEI_VERSION} - @ln -sf licensei-${LICENSEI_VERSION} bin/licensei -bin/licensei-${LICENSEI_VERSION}: - @mkdir -p bin - curl -sfL https://git.io/licensei | bash -s v${LICENSEI_VERSION} - @mv bin/licensei $@ +.PHONY: fmt +fmt: ## Run go fmt against code. + go fmt ./... -.PHONY: license-cache -license-cache: bin/licensei ## Generate license cache - bin/licensei cache +.PHONY: vet +vet: ## Run go vet against code. + go vet ./... -.PHONY: license-check -license-check: bin/licensei ## Run license check - bin/licensei check - bin/licensei header +.PHONY: tidy +tidy: ## Tidy Go modules. + find . -iname "go.mod" -not -path "./.devcontainer/*" | xargs -L1 sh -c 'cd $$(dirname $$0); go mod tidy' .PHONY: test -test: ${ENVTEST_BINARY_ASSETS} - KUBEBUILDER_ASSETS=${ENVTEST_BINARY_ASSETS} go test ./... - -.PHONY: check -check: test lint check-diff ## Run tests and linters - -bin/golangci-lint: bin/golangci-lint-${GOLANGCI_VERSION} - @ln -sf golangci-lint-${GOLANGCI_VERSION} bin/golangci-lint -bin/golangci-lint-${GOLANGCI_VERSION}: - @mkdir -p bin - curl -sfL curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | bash -s -- -b ./bin/ v${GOLANGCI_VERSION} - @mv bin/golangci-lint $@ +test: fmt vet envtest ## Run verifications and tests. + KUBEBUILDER_ASSETS="$(ENVTEST_BINARY_ASSETS)" go test -v ./... -coverprofile cover.out .PHONY: lint lint: export CGO_ENABLED = 1 -lint: bin/golangci-lint ## Run linter - bin/golangci-lint run ${LINTER_FLAGS} +lint: ${GOLANGCI_LINT} ## Run golangci-lint. + ${GOLANGCI_LINT} run ${LINTER_FLAGS} -.PHONY: fix -fix: export CGO_ENABLED = 1 -fix: bin/golangci-lint ## Fix lint violations - bin/golangci-lint run --fix +.PHONY: lint-fix +lint-fix: export CGO_ENABLED = 1 +lint-fix: ${GOLANGCI_LINT} ## Run golangci-lint and perform fixes. + ${GOLANGCI_LINT} run --fix + +.PHONY: check +check: test lint check-diff ## Run tests and linters. -check-diff: generate-type-docs - go mod tidy - $(MAKE) generate docs +.PHONY: check-diff +check-diff: tidy generate ## Verify that generated files are up to date. git diff --exit-code -generate-type-docs: - go run cmd/docs.go +.PHONY: license-cache +license-cache: ${LICENSEI} ## Generate license cache. + ${LICENSEI} cache + +.PHONY: license-check +license-check: ${LICENSEI} .licensei.cache ## Run license check. + ${LICENSEI} check + ${LICENSEI} header -${ENVTEST_BINARY_ASSETS}: ${ENVTEST_BINARY_ASSETS}_${ENVTEST_K8S_VERSION} - ln -sf $(notdir $<) $@ +##@ Build Dependencies -${ENVTEST_BINARY_ASSETS}_${ENVTEST_K8S_VERSION}: | ${SETUP_ENVTEST} ${ENVTEST_BIN_DIR} - ln -sf $$(${SETUP_ENVTEST} --bin-dir ${ENVTEST_BIN_DIR} use ${ENVTEST_K8S_VERSION} -p path) $@ +${GOLANGCI_LINT}: ${GOLANGCI_LINT}_${GOLANGCI_LINT_VERSION}_${GOVERSION} | ${BIN} + ln -snf $(notdir $<) $@ -${SETUP_ENVTEST}: IMPORT_PATH := sigs.k8s.io/controller-runtime/tools/setup-envtest -${SETUP_ENVTEST}: VERSION := latest -${SETUP_ENVTEST}: | ${BIN} - GOBIN=${BIN} go install ${IMPORT_PATH}@${VERSION} +${GOLANGCI_LINT}_${GOLANGCI_LINT_VERSION}_${GOVERSION}: IMPORT_PATH := github.com/golangci/golangci-lint/v2/cmd/golangci-lint +${GOLANGCI_LINT}_${GOLANGCI_LINT_VERSION}_${GOVERSION}: VERSION := v${GOLANGCI_LINT_VERSION} +${GOLANGCI_LINT}_${GOLANGCI_LINT_VERSION}_${GOVERSION}: | ${BIN} + ${go_install_binary} -${ENVTEST_BIN_DIR}: | ${BIN} +.PHONY: controller-gen +controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. If wrong version is installed, it will be overwritten. +$(CONTROLLER_GEN): | $(BIN) + test -s $(BIN)/controller-gen && $(BIN)/controller-gen --version | grep -q v$(CONTROLLER_TOOLS_VERSION) || \ + GOBIN=$(BIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@v$(CONTROLLER_TOOLS_VERSION) + +.PHONY: envtest +envtest: $(ENVTEST_BINARY_ASSETS) ## Download envtest-setup and Kubernetes binary assets locally if necessary. +$(ENVTEST): | $(BIN) + test -s $(BIN)/setup-envtest || GOBIN=$(BIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest + +$(ENVTEST_BINARY_ASSETS): $(ENVTEST_BINARY_ASSETS)_$(ENVTEST_K8S_VERSION) + ln -snf $(notdir $<) $@ + +$(ENVTEST_BINARY_ASSETS)_$(ENVTEST_K8S_VERSION): | $(ENVTEST) $(ENVTEST_BIN_DIR) + ln -snf $$($(ENVTEST) --bin-dir $(ENVTEST_BIN_DIR) use $(ENVTEST_K8S_VERSION) -p path) $@ + +$(ENVTEST_BIN_DIR): | $(BIN) mkdir -p $@ +${LICENSEI}: ${LICENSEI}_${LICENSEI_VERSION}_${GOVERSION} | ${BIN} + ln -snf $(notdir $<) $@ + +${LICENSEI}_${LICENSEI_VERSION}_${GOVERSION}: IMPORT_PATH := github.com/goph/licensei/cmd/licensei +${LICENSEI}_${LICENSEI_VERSION}_${GOVERSION}: VERSION := v${LICENSEI_VERSION} +${LICENSEI}_${LICENSEI_VERSION}_${GOVERSION}: | ${BIN} + ${go_install_binary} + +.licensei.cache: ${LICENSEI} +ifndef GITHUB_TOKEN + @>&2 echo "WARNING: building licensei cache without Github token, rate limiting might occur." + @>&2 echo "(Hint: If too many licenses are missing, try specifying a Github token via the environment variable GITHUB_TOKEN.)" +endif + ${LICENSEI} cache + ${BIN}: mkdir -p $@ define go_install_binary find ${BIN} -name '$(notdir ${IMPORT_PATH})_*' -exec rm {} + GOBIN=${BIN} go install ${IMPORT_PATH}@${VERSION} -mv ${BIN}/$(notdir ${IMPORT_PATH}) ${BIN}/$(notdir ${IMPORT_PATH})_${VERSION} +mv ${BIN}/$(notdir ${IMPORT_PATH}) $@ endef diff --git a/docs/types/secret_types.md b/docs/types/secret_types.md index c969803..908592f 100644 --- a/docs/types/secret_types.md +++ b/docs/types/secret_types.md @@ -4,6 +4,7 @@ SecretLoader facilitates loading the secrets from an operator. Leverages core types from kubernetes/api/core/v1 + ## Configuration ## Secret diff --git a/docs/types/volume_types.md b/docs/types/volume_types.md index a2defbc..e445fb2 100644 --- a/docs/types/volume_types.md +++ b/docs/types/volume_types.md @@ -33,6 +33,12 @@ PersistentVolumeClaim defines the Spec and the Source at the same time. The PVC ## PersistentVolumeClaim +### annotations (map[string]string, optional) {#persistentvolumeclaim-annotations} + + +### labels (map[string]string, optional) {#persistentvolumeclaim-labels} + + ### spec (corev1.PersistentVolumeClaimSpec, optional) {#persistentvolumeclaim-spec} diff --git a/go.mod b/go.mod index 84d7a0d..a6c2ad9 100644 --- a/go.mod +++ b/go.mod @@ -1,168 +1,154 @@ module github.com/cisco-open/operator-tools -go 1.22.0 +go 1.26.0 require ( emperror.dev/errors v0.8.1 github.com/MakeNowJust/heredoc v1.0.0 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 - github.com/briandowns/spinner v1.23.1 + github.com/briandowns/spinner v1.23.2 github.com/cisco-open/k8s-objectmatcher v1.10.0 github.com/cppforlife/go-patch v0.2.0 - github.com/fatih/color v1.18.0 + github.com/fatih/color v1.19.0 github.com/ghodss/yaml v1.0.0 - github.com/go-logr/logr v1.4.2 + github.com/go-logr/logr v1.4.3 github.com/go-test/deep v1.1.1 github.com/iancoleman/orderedmap v0.3.0 + github.com/json-iterator/go v1.1.12 github.com/pborman/uuid v1.2.1 - github.com/spf13/cast v1.7.1 - github.com/stretchr/testify v1.10.0 + github.com/spf13/cast v1.10.0 + github.com/stretchr/testify v1.11.1 github.com/wayneashleyberry/terminal-dimensions v1.1.0 gopkg.in/yaml.v2 v2.4.0 - helm.sh/helm/v3 v3.16.4 - k8s.io/api v0.31.4 - k8s.io/apiextensions-apiserver v0.31.4 - k8s.io/apimachinery v0.31.4 - k8s.io/client-go v0.31.4 - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 - sigs.k8s.io/controller-runtime v0.19.3 - sigs.k8s.io/yaml v1.4.0 + helm.sh/helm/v3 v3.21.0 + k8s.io/api v0.36.1 + k8s.io/apiextensions-apiserver v0.36.1 + k8s.io/apimachinery v0.36.1 + k8s.io/client-go v0.36.1 + k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 + sigs.k8s.io/controller-runtime v0.24.1 + sigs.k8s.io/yaml v1.6.0 ) require ( - dario.cat/mergo v1.0.1 // indirect - github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect + dario.cat/mergo v1.0.2 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect + github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect + github.com/BurntSushi/toml v1.6.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/Masterminds/semver/v3 v3.5.0 // indirect github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Masterminds/squirrel v1.5.4 // 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/cespare/xxhash/v2 v2.3.0 // indirect - github.com/chai2010/gettext-go v1.0.2 // indirect - github.com/containerd/containerd v1.7.23 // indirect - github.com/containerd/errdefs v0.3.0 // indirect + github.com/chai2010/gettext-go v1.0.3 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect + github.com/containerd/containerd v1.7.31 // indirect + github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v0.2.1 // indirect - github.com/cyphar/filepath-securejoin v0.3.4 // indirect + github.com/cyphar/filepath-securejoin v0.6.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/distribution/reference v0.6.0 // indirect - github.com/docker/cli v25.0.1+incompatible // indirect - github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v25.0.6+incompatible // indirect - github.com/docker/docker-credential-helpers v0.7.0 // indirect - github.com/docker/go-connections v0.5.0 // indirect - github.com/docker/go-metrics v0.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v5.9.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.9.0 // indirect - github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-errors/errors v1.4.2 // indirect + github.com/docker/docker-credential-helpers v0.9.7 // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect + github.com/evanphx/json-patch v5.9.11+incompatible // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect + github.com/fsnotify/fsnotify v1.10.1 // indirect + github.com/fxamacker/cbor/v2 v2.9.2 // indirect + github.com/go-errors/errors v1.5.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/jsonpointer v0.23.1 // indirect + github.com/go-openapi/jsonreference v0.21.5 // indirect + github.com/go-openapi/swag v0.26.0 // indirect + github.com/go-openapi/swag/cmdutils v0.26.0 // indirect + github.com/go-openapi/swag/conv v0.26.0 // indirect + github.com/go-openapi/swag/fileutils v0.26.0 // indirect + github.com/go-openapi/swag/jsonname v0.26.0 // indirect + github.com/go-openapi/swag/jsonutils v0.26.0 // indirect + github.com/go-openapi/swag/loading v0.26.0 // indirect + github.com/go-openapi/swag/mangling v0.26.0 // indirect + github.com/go-openapi/swag/netutils v0.26.0 // indirect + github.com/go-openapi/swag/stringutils v0.26.0 // indirect + github.com/go-openapi/swag/typeutils v0.26.0 // indirect + github.com/go-openapi/swag/yamlutils v0.26.0 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/btree v1.0.1 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/gnostic-models v0.7.1 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect github.com/gosuri/uitable v0.0.4 // indirect - github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/huandu/xstrings v1.5.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmoiron/sqlx v1.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.18.6 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/lib/pq v1.10.9 // indirect + github.com/lib/pq v1.12.3 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // 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.20 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect + github.com/mattn/go-runewidth v0.0.23 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/locker v1.0.1 // indirect - github.com/moby/spdystream v0.4.0 // indirect - github.com/moby/term v0.5.0 // indirect + github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect - github.com/rubenv/sql-migrate v1.7.0 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.20.1 // indirect + github.com/rubenv/sql-migrate v1.8.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sergi/go-diff v1.2.0 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect + github.com/sergi/go-diff v1.4.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/sirupsen/logrus v1.9.4 // indirect + github.com/spf13/cobra v1.10.2 // indirect + github.com/spf13/pflag v1.0.10 // indirect github.com/x448/float16 v0.8.4 // 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 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect - go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/oauth2 v0.21.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/term v0.27.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect - google.golang.org/grpc v1.65.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/net v0.54.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.44.0 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect + golang.org/x/time v0.15.0 // indirect + golang.org/x/tools v0.45.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 // indirect + google.golang.org/grpc v1.81.1 // indirect + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiserver v0.31.4 // indirect - k8s.io/cli-runtime v0.31.3 // indirect - k8s.io/component-base v0.31.4 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/kubectl v0.31.3 // indirect - oras.land/oras-go v1.2.5 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/kustomize/api v0.17.2 // indirect - sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + k8s.io/apiserver v0.36.1 // indirect + k8s.io/cli-runtime v0.36.1 // indirect + k8s.io/component-base v0.36.1 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/kube-openapi v0.0.0-20260512234627-ef417d054102 // indirect + k8s.io/kubectl v0.36.1 // indirect + oras.land/oras-go/v2 v2.6.0 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/kustomize/api v0.21.1 // indirect + sigs.k8s.io/kustomize/kyaml v0.21.1 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect ) diff --git a/go.sum b/go.sum index 2b90114..cd1efeb 100644 --- a/go.sum +++ b/go.sum @@ -1,164 +1,154 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= -dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= emperror.dev/errors v0.8.1 h1:UavXZ5cSX/4u9iyvH6aDcuGkVjeexUGJ7Ij7G4VfQT0= emperror.dev/errors v0.8.1/go.mod h1:YcRvLPh626Ubn2xqtoprejnA5nFha+TJ+2vew48kWuE= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -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.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= +github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ= -github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= 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/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/briandowns/spinner v1.23.1 h1:t5fDPmScwUjozhDj4FA46p5acZWIPXYE30qW2Ptu650= -github.com/briandowns/spinner v1.23.1/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM= +github.com/briandowns/spinner v1.23.2 h1:Zc6ecUnI+YzLmJniCfDNaMbW0Wid1d5+qcTq4L2FW8w= +github.com/briandowns/spinner v1.23.2/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= -github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chai2010/gettext-go v1.0.3 h1:9liNh8t+u26xl5ddmWLmsOsdNLwkdRTg5AG+JnTiM80= +github.com/chai2010/gettext-go v1.0.3/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= github.com/cisco-open/k8s-objectmatcher v1.10.0 h1:1TdhMPqVaU+NqECqytAkRF1SFU0QIMqrqbNTnTl933A= github.com/cisco-open/k8s-objectmatcher v1.10.0/go.mod h1:O/TFG3vW12jbKNQejpc8SGgSfujlaWYIOCZHcXeK514= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/containerd v1.7.23 h1:H2CClyUkmpKAGlhQp95g2WXHfLYc7whAuvZGBNYOOwQ= -github.com/containerd/containerd v1.7.23/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw= -github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= -github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= -github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4= -github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/containerd/containerd v1.7.31 h1:jn3IMuTV4Bb1Uwb0MFPW2ASJAD3W1lh6QqqZHIZwDh4= +github.com/containerd/containerd v1.7.31/go.mod h1:jdwD6s/BhV4XVJGrvtziNPVA+83n66TwptVaPKprq4E= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/coreos/go-systemd/v22 v22.7.0 h1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA= +github.com/coreos/go-systemd/v22 v22.7.0/go.mod h1:xNUYtjHu2EDXbsxz1i41wouACIwT7Ybq9o0BQhMwD0w= github.com/cppforlife/go-patch v0.2.0 h1:Y14MnCQjDlbw7WXT4k+u6DPAA9XnygN4BfrSpI/19RU= github.com/cppforlife/go-patch v0.2.0/go.mod h1:67a7aIi94FHDZdoeGSJRRFDp66l9MhaAG1yGxpUoFD8= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8= -github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= +github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= +github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc= -github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN6UX90KJc4HjyM= +github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= -github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= -github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v25.0.6+incompatible h1:5cPwbwriIcsua2REJe8HqQV+6WlWc1byg2QSXzBxBGg= -github.com/docker/docker v25.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= -github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/docker-credential-helpers v0.9.7 h1:jaPIxEIDz5bQeghNAdzz0ETwMMnM4vzjZlxz3pWP4JA= +github.com/docker/docker-credential-helpers v0.9.7/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= -github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= -github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= -github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= +github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= -github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= +github.com/foxcpp/go-mockdns v1.2.0 h1:omK3OrHRD1IWJz1FuFBCFquhXslXoF17OvBS6JPzZF0= +github.com/foxcpp/go-mockdns v1.2.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/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.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= +github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= +github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78= +github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= +github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/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.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4= +github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY= +github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE= +github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw= +github.com/go-openapi/swag v0.26.0 h1:GVDXCmfvhfu1BxiHo8/FA+BbKmhecHnG3varjON5/RI= +github.com/go-openapi/swag v0.26.0/go.mod h1:82g3193sZJRbocs7bNCqGfIgq8pkuwVwCfhKIRlEQF0= +github.com/go-openapi/swag/cmdutils v0.26.0 h1:iowihOcvq7y4egO8cOq0dmfohz6wfeQ63U1EnuhO2TU= +github.com/go-openapi/swag/cmdutils v0.26.0/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= +github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I= +github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE= +github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU= +github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc= +github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w= +github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M= +github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA= +github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y= +github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko= +github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg= +github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ= +github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0= +github.com/go-openapi/swag/netutils v0.26.0 h1:CmZp+ZT7HrmFwrC3GdGsXBq2+42T1bjKBapcqVpIs3c= +github.com/go-openapi/swag/netutils v0.26.0/go.mod h1:5iK+Ok3ZohWWex1C50BFTPexi03UaPwjW4Oj8kgrpwo= +github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg= +github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE= +github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4= +github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE= +github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ= +github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU= +github.com/go-openapi/testify/enable/yaml/v2 v2.4.2 h1:5zRca5jw7lzVREKCZVNBpysDNBjj74rBh0N2BGQbSR0= +github.com/go-openapi/testify/enable/yaml/v2 v2.4.2/go.mod h1:XVevPw5hUXuV+5AkI1u1PeAm27EQVrhXTTCPAF85LmE= +github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4= +github.com/go-openapi/testify/v2 v2.4.2/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -167,119 +157,88 @@ github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= 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/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= -github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= +github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= -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/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= 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= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= +github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= +github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= -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/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= +github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= 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/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ= +github.com/lib/pq v1.12.3/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= +github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= +github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -288,30 +247,18 @@ github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQ github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= -github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= -github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= -github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -319,23 +266,22 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= -github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI= +github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= -github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= +github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= 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= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -343,272 +289,243 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= -github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= +github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= +github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= +github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= +github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= +github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rubenv/sql-migrate v1.8.1 h1:EPNwCvjAowHI3TnZ+4fQu3a915OpnQoPAjTXCGOy2U0= +github.com/rubenv/sql-migrate v1.8.1/go.mod h1:BTIKBORjzyxZDS6dzoiw6eAFYJ1iNlGAtjn4LGeVjS8= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -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/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= +github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/wayneashleyberry/terminal-dimensions v1.1.0 h1:EB7cIzBdsOzAgmhTUtTTQXBByuPheP/Zv1zL2BRPY6g= github.com/wayneashleyberry/terminal-dimensions v1.1.0/go.mod h1:2lc/0eWCObmhRczn2SdGSQtgBooLUzIotkkEGXqghyg= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 h1:UW0+QyeyBVhn+COBec3nGhfnFe5lwB0ic1JBVjzhk0w= +go.opentelemetry.io/contrib/bridges/prometheus v0.57.0/go.mod h1:ppciCHRLsyCio54qbzQv0E4Jyth/fLWDTJYfvWpcSVk= +go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQa2NQ/Aoi7zA+wy7vMOKD9H4= +go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 h1:Dn8rkudDzY6KV9dr/D/bTUuWgqDf9xe0rr4G2elrn0Y= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0/go.mod h1:gMk9F0xDgyN9M/3Ed5Y1wKcx/9mlU91NXY2SNq7RQuU= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 h1:HIBTQ3VO5aupLKjC90JgMqpezVXwFuq6Ryjn0/izoag= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0/go.mod h1:ji9vId85hMxqfvICA0Jt8JqEdrXaAkcpkI9HPXya0ro= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 h1:8UQVDcZxOJLtX6gxtDt3vY2WTgvZqMQRzjsqiIHQdkc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0/go.mod h1:2lmweYCiHYpEjQ/lSJBYhj9jP1zvCvQW4BqL9dnT7FQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 h1:w1K+pCJoPpQifuVpsKamUdn9U0zM3xUziVOqsGksUrY= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0/go.mod h1:HBy4BjzgVE8139ieRI75oXm3EcDN+6GhD88JT1Kjvxg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= +go.opentelemetry.io/otel/exporters/prometheus v0.65.0 h1:jOveH/b4lU9HT7y+Gfamf18BqlOuz2PWEvs8yM7Q6XE= +go.opentelemetry.io/otel/exporters/prometheus v0.65.0/go.mod h1:i1P8pcumauPtUI4YNopea1dhzEMuEqWP1xoUZDylLHo= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.19.0 h1:GJkybS+crDMdExT/BUNCEgfrmfboztcS6PhvSo88HKM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.19.0/go.mod h1:NuAyxRYIG2lKX3YQkB+83StTxM7s52PUUkRRiC0wnYI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.43.0 h1:mS47AX77OtFfKG4vtp+84kuGSFZHTyxtXIN269vChY0= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.43.0/go.mod h1:PJnsC41lAGncJlPUniSwM81gc80GkgWJWr3cu2nKEtU= +go.opentelemetry.io/otel/log v0.19.0 h1:KUZs/GOsw79TBBMfDWsXS+KZ4g2Ckzksd1ymzsIEbo4= +go.opentelemetry.io/otel/log v0.19.0/go.mod h1:5DQYeGmxVIr4n0/BcJvF4upsraHjg6vudJJpnkL6Ipk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/log v0.19.0 h1:scYVLqT22D2gqXItnWiocLUKGH9yvkkeql5dBDiXyko= +go.opentelemetry.io/otel/sdk/log v0.19.0/go.mod h1:vFBowwXGLlW9AvpuF7bMgnNI95LiW10szrOdvzBHlAg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -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= +golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= +golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= -golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= 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= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -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/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= +golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= -gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= +gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 h1:seT2EwLWM78plQ7wcDfuWBc/4FAEAXDDiaSol4ku4qo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -helm.sh/helm/v3 v3.16.4 h1:rBn/h9MACw+QlhxQTjpl8Ifx+VTWaYsw3rguGBYBzr0= -helm.sh/helm/v3 v3.16.4/go.mod h1:k8QPotUt57wWbi90w3LNmg3/MWcLPigVv+0/X4B8BzA= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.31.4 h1:I2QNzitPVsPeLQvexMEsj945QumYraqv9m74isPDKhM= -k8s.io/api v0.31.4/go.mod h1:d+7vgXLvmcdT1BCo79VEgJxHHryww3V5np2OYTr6jdw= -k8s.io/apiextensions-apiserver v0.31.4 h1:FxbqzSvy92Ca9DIs5jqot883G0Ln/PGXfm/07t39LS0= -k8s.io/apiextensions-apiserver v0.31.4/go.mod h1:hIW9YU8UsqZqIWGG99/gsdIU0Ar45Qd3A12QOe/rvpg= -k8s.io/apimachinery v0.31.4 h1:8xjE2C4CzhYVm9DGf60yohpNUh5AEBnPxCryPBECmlM= -k8s.io/apimachinery v0.31.4/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/apiserver v0.31.4 h1:JbtnTaXVYEAYIHJil6Wd74Wif9sd8jVcBw84kwEmp7o= -k8s.io/apiserver v0.31.4/go.mod h1:JJjoTjZ9PTMLdIFq7mmcJy2B9xLN3HeAUebW6xZyIP0= -k8s.io/cli-runtime v0.31.3 h1:fEQD9Xokir78y7pVK/fCJN090/iYNrLHpFbGU4ul9TI= -k8s.io/cli-runtime v0.31.3/go.mod h1:Q2jkyTpl+f6AtodQvgDI8io3jrfr+Z0LyQBPJJ2Btq8= -k8s.io/client-go v0.31.4 h1:t4QEXt4jgHIkKKlx06+W3+1JOwAFU/2OPiOo7H92eRQ= -k8s.io/client-go v0.31.4/go.mod h1:kvuMro4sFYIa8sulL5Gi5GFqUPvfH2O/dXuKstbaaeg= -k8s.io/component-base v0.31.4 h1:wCquJh4ul9O8nNBSB8N/o8+gbfu3BVQkVw9jAUY/Qtw= -k8s.io/component-base v0.31.4/go.mod h1:G4dgtf5BccwiDT9DdejK0qM6zTK0jwDGEKnCmb9+u/s= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/kubectl v0.31.3 h1:3r111pCjPsvnR98oLLxDMwAeM6OPGmPty6gSKaLTQes= -k8s.io/kubectl v0.31.3/go.mod h1:lhMECDCbJN8He12qcKqs2QfmVo9Pue30geovBVpH5fs= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= -oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= -sigs.k8s.io/controller-runtime v0.19.3 h1:XO2GvC9OPftRst6xWCpTgBZO04S2cbp0Qqkj8bX1sPw= -sigs.k8s.io/controller-runtime v0.19.3/go.mod h1:j4j87DqtsThvwTv5/Tc5NFRyyF/RF0ip4+62tbTSIUM= -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/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g= -sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0= -sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= -sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= -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= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +helm.sh/helm/v3 v3.21.0 h1:9TRbaXQH+BIKLLDYlu++JsyWodS5kBBOLF7C7HY5+cs= +helm.sh/helm/v3 v3.21.0/go.mod h1:5IvU6Ae6ruB/vasVHhnC1IU5RvqFM349vLYS1BiHqeY= +k8s.io/api v0.36.1 h1:XbL/EMj8K2aJpJtePmqUyQMsM0D4QI2pvl7YKJ20FTY= +k8s.io/api v0.36.1/go.mod h1:KOWo4ey3TINlXjeHVuwB3i+tXXnu+UcwFBHlI/9dvEo= +k8s.io/apiextensions-apiserver v0.36.1 h1:6JfYmPUsuUIHuN+3QxutXYWj492RqF5fBSx67GYK5Ks= +k8s.io/apiextensions-apiserver v0.36.1/go.mod h1:pLzZin90riwisdzKwv/GoTwENooytoIx5zWJb4Hkby8= +k8s.io/apimachinery v0.36.1 h1:G63Gjx2W+q0YD+72Vo8oY0nDnePVwnuzTmmy5ENrVSA= +k8s.io/apimachinery v0.36.1/go.mod h1:ibYOR00vW/I1kzvi5SF0dRuJ52BvKtfvRdOn35GPQ+8= +k8s.io/apiserver v0.36.1 h1:iMS5V+rPUertv5P9RaqJgmHHTuh4quWpoxchvMUY+JY= +k8s.io/apiserver v0.36.1/go.mod h1:Cby1PbLWztu0GDOxoO6iFOyyqIsziHNEW+w9zVQ22Kw= +k8s.io/cli-runtime v0.36.1 h1:yuC/BGnnj1YYPh6D1P+pZnzinCs6DvMq86yAeNqoqzM= +k8s.io/cli-runtime v0.36.1/go.mod h1:ZQWHGt8xAF7KnviB79vX0lYNyUUqKIpU+LQg7exuFAw= +k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0= +k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU= +k8s.io/component-base v0.36.1 h1:iG6GsELftXqTNG9HG6kiVjatSgAw1sf5pJ6R5a6N0kA= +k8s.io/component-base v0.36.1/go.mod h1:nf9XPlntRdqO6WMeEWAA5F93Y4ICZQdeT9GeqLDB3JI= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20260512234627-ef417d054102 h1:xs2ux1MvyrOdfKwS3vuFWrGuLgDOHk6id975Twx2Jss= +k8s.io/kube-openapi v0.0.0-20260512234627-ef417d054102/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY= +k8s.io/kubectl v0.36.1 h1:96HqS9twIdHM0MlJLTwbo14b9kUKPkOzZ4tlRDLv4qI= +k8s.io/kubectl v0.36.1/go.mod h1:/DGPAIewKsFWF9VFgGvkPhao2Ev4SNuE3BioZo8yPbk= +k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 h1:wU4tMEhLGgIbLvXQb1cfN+EcM0wf7zC6CPF+C79jroc= +k8s.io/utils v0.0.0-20260507154919-ff6756f316d2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= +oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= +sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= +sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/kustomize/api v0.21.1 h1:lzqbzvz2CSvsjIUZUBNFKtIMsEw7hVLJp0JeSIVmuJs= +sigs.k8s.io/kustomize/api v0.21.1/go.mod h1:f3wkKByTrgpgltLgySCntrYoq5d3q7aaxveSagwTlwI= +sigs.k8s.io/kustomize/kyaml v0.21.1 h1:IVlbmhC076nf6foyL6Taw4BkrLuEsXUXNpsE+ScX7fI= +sigs.k8s.io/kustomize/kyaml v0.21.1/go.mod h1:hmxADesM3yUN2vbA5z1/YTBnzLJ1dajdqpQonwBL1FQ= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= +sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/pkg/docgen/docgen.go b/pkg/docgen/docgen.go index be82bab..10df171 100644 --- a/pkg/docgen/docgen.go +++ b/pkg/docgen/docgen.go @@ -135,7 +135,7 @@ func (d *Doc) visitNode(n ast.Node) bool { if ok { typeName, ok := generic.Specs[0].(*ast.TypeSpec) if ok { - _, ok := typeName.Type.(*ast.InterfaceType) + ok := isInterfaceLike(typeName.Type) if ok && strings.HasPrefix(typeName.Name.Name, "_hugo") { d.Append("---") d.Append(fmt.Sprintf("title: %s", GetPrefixedValue(getTypeDocs(generic, true), `\+name:\"(.*)\"`))) @@ -178,9 +178,10 @@ func (d *Doc) visitNode(n ast.Node) bool { } required_string := "" - if required == "No" { + switch required { + case "No": required_string = ", optional" - } else if required == "Yes" { + case "Yes": required_string = ", required" } @@ -204,6 +205,19 @@ func (d *Doc) visitNode(n ast.Node) bool { return true } +// isInterfaceLike reports whether the given type expression is an empty +// interface — either the explicit `interface{}` form or the predeclared +// `any` alias (which appears as an *ast.Ident in the AST). +func isInterfaceLike(expr ast.Expr) bool { + if _, ok := expr.(*ast.InterfaceType); ok { + return true + } + if ident, ok := expr.(*ast.Ident); ok && ident.Name == "any" { + return true + } + return false +} + func (d *Doc) normaliseType(fieldType ast.Expr) string { fset := token.NewFileSet() var typeNameBuf bytes.Buffer @@ -233,7 +247,7 @@ func getTypeName(generic *ast.GenDecl, defaultName string) string { } func getTypeDocs(generic *ast.GenDecl, trimSpace bool) string { - comment := "" + var comment strings.Builder if generic.Doc != nil { for _, line := range generic.Doc.List { newLine := strings.TrimPrefix(line.Text, "//") @@ -247,11 +261,11 @@ func getTypeDocs(generic *ast.GenDecl, trimSpace bool) string { if !strings.HasPrefix(strings.TrimSpace(newLine), "+kubebuilder") && !strings.HasPrefix(strings.TrimSpace(newLine), "nolint") && !strings.HasPrefix(strings.TrimSpace(newLine), "+docName") { - comment += newLine + "\n" + comment.WriteString(newLine + "\n") } } } - return comment + return comment.String() } func getLink(def string) string { @@ -271,7 +285,7 @@ func formatRequired(r bool) string { } func (d *Doc) getValuesFromItem(item *ast.Field) (name, comment, def, required string, err error) { - commentWithDefault := "" + var commentWithDefault strings.Builder if item.Doc != nil { // Process comments of objects that become ### level headings isCodeBlock := false @@ -279,7 +293,7 @@ func (d *Doc) getValuesFromItem(item *ast.Field) (name, comment, def, required s newLine := strings.TrimPrefix(line.Text, "//") if strings.HasPrefix(newLine, " {{< highlight") { - commentWithDefault += "\n" + commentWithDefault.WriteString("\n") isCodeBlock = true } @@ -293,9 +307,9 @@ func (d *Doc) getValuesFromItem(item *ast.Field) (name, comment, def, required s if !strings.HasPrefix(newLine, "+kubebuilder") { // Keep newlines in code blocks, but join body text if isCodeBlock { - commentWithDefault += newLine + "\n" + commentWithDefault.WriteString(newLine + "\n") } else { - commentWithDefault += newLine + " " + commentWithDefault.WriteString(newLine + " ") } // Detect the end of code blocks if isCodeBlock && strings.HasPrefix(newLine, " {{< /highlight") { @@ -315,15 +329,15 @@ func (d *Doc) getValuesFromItem(item *ast.Field) (name, comment, def, required s nameResult := GetPrefixedValue(tag, `json:\"([^,\"]*).*\"`) required = formatRequired(!strings.Contains(GetPrefixedValue(tag, `json:\"(.*)\"`), "omitempty")) if tagResult != "" { - return nameResult, getLink(commentWithDefault), tagResult, required, nil + return nameResult, getLink(commentWithDefault.String()), tagResult, required, nil } - result := GetPrefixedValue(commentWithDefault, `\(default:(.*)\)`) + result := GetPrefixedValue(commentWithDefault.String(), `\(default:(.*)\)`) if result != "" { ignore := fmt.Sprintf("(default:%s)", result) - comment = strings.TrimSpace(strings.Replace(commentWithDefault, ignore, "", 1)) + comment = strings.TrimSpace(strings.Replace(commentWithDefault.String(), ignore, "", 1)) result = strings.TrimSpace(result) return nameResult, comment, getLink(result), required, nil } - return nameResult, getLink(commentWithDefault), "", required, nil + return nameResult, getLink(commentWithDefault.String()), "", required, nil } diff --git a/pkg/docgen/docgen_test.go b/pkg/docgen/docgen_test.go index b2bb01a..bb02023 100644 --- a/pkg/docgen/docgen_test.go +++ b/pkg/docgen/docgen_test.go @@ -38,7 +38,7 @@ func TestGenParse(t *testing.T) { _, filename, _, _ := runtime.Caller(0) currentDir := filepath.Dir(filename) - var testData = []struct { + testData := []struct { docItem docgen.DocItem expected string }{ diff --git a/pkg/helm/render.go b/pkg/helm/render.go index 46b9ea6..3ea481a 100644 --- a/pkg/helm/render.go +++ b/pkg/helm/render.go @@ -24,11 +24,10 @@ import ( "emperror.dev/errors" "github.com/ghodss/yaml" "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/releaseutil" - "helm.sh/helm/v3/pkg/chart/loader" "helm.sh/helm/v3/pkg/chartutil" "helm.sh/helm/v3/pkg/engine" + "helm.sh/helm/v3/pkg/releaseutil" "k8s.io/apimachinery/pkg/runtime" "github.com/cisco-open/operator-tools/pkg/resources" @@ -51,7 +50,7 @@ func GetDefaultValues(fs http.FileSystem) ([]byte, error) { if err != nil { return nil, err } - defer file.Close() + defer func() { _ = file.Close() }() buf := new(bytes.Buffer) _, err = buf.ReadFrom(file) @@ -62,7 +61,7 @@ func GetDefaultValues(fs http.FileSystem) ([]byte, error) { return buf.Bytes(), nil } -func Render(fs http.FileSystem, values map[string]interface{}, releaseOptions ReleaseOptions, chartName string) ([]runtime.Object, error) { +func Render(fs http.FileSystem, values map[string]any, releaseOptions ReleaseOptions, chartName string) ([]runtime.Object, error) { files, err := GetFiles(fs) if err != nil { return nil, err @@ -143,7 +142,7 @@ func parseAndAppendObjects(parser func([]byte) (runtime.Object, error), objects // convert yaml to json json, err := yaml.YAMLToJSON([]byte(yamlDoc)) if err != nil { - return nil, errors.WrapIfWithDetails(err, "unable to convert yaml to json", map[string]interface{}{"templatePath": path}) + return nil, errors.WrapIfWithDetails(err, "unable to convert yaml to json", map[string]any{"templatePath": path}) } if string(json) == "null" { @@ -237,7 +236,7 @@ func readIntoBytes(fs http.FileSystem, filename string) ([]byte, error) { if err != nil { return nil, errors.WrapIf(err, "could not open file") } - defer file.Close() + defer func() { _ = file.Close() }() buf := new(bytes.Buffer) _, err = buf.ReadFrom(file) diff --git a/pkg/helm/render_test.go b/pkg/helm/render_test.go index 93973db..947e62c 100644 --- a/pkg/helm/render_test.go +++ b/pkg/helm/render_test.go @@ -33,7 +33,7 @@ func TestRenderChartWithCrdsAndTemplates(t *testing.T) { defaultValues, err := GetDefaultValues(chart) require.NoError(t, err) - valuesMap := map[string]interface{}{} + valuesMap := map[string]any{} err = yaml.Unmarshal(defaultValues, &valuesMap) require.NoError(t, err) @@ -54,14 +54,13 @@ func TestRenderChartWithCrdsAndTemplates(t *testing.T) { assert.Equal(t, "loggings.logging.banzaicloud.io", o.GetName()) } - func TestRenderChartWithCrdsOnly(t *testing.T) { chart := http.Dir("testdata/crds-only/logging-operator") defaultValues, err := GetDefaultValues(chart) require.NoError(t, err) - valuesMap := map[string]interface{}{} + valuesMap := map[string]any{} err = yaml.Unmarshal(defaultValues, &valuesMap) require.NoError(t, err) @@ -85,7 +84,7 @@ func TestRenderWithScheme(t *testing.T) { defaultValues, err := GetDefaultValues(chart) require.NoError(t, err) - valuesMap := map[string]interface{}{} + valuesMap := map[string]any{} err = yaml.Unmarshal(defaultValues, &valuesMap) require.NoError(t, err) @@ -95,7 +94,7 @@ func TestRenderWithScheme(t *testing.T) { objects, err := Render(chart, valuesMap, ReleaseOptions{ Name: "release-name", Namespace: "release-namespace", - Scheme: scheme, + Scheme: scheme, }, "logging-operator") require.NoError(t, err) diff --git a/pkg/helm/strimap.go b/pkg/helm/strimap.go index 321228b..47aea65 100644 --- a/pkg/helm/strimap.go +++ b/pkg/helm/strimap.go @@ -14,7 +14,9 @@ package helm -type Strimap = map[string]interface{} +import "maps" + +type Strimap = map[string]any type StrimapBuilder Strimap @@ -36,9 +38,7 @@ func (s StrimapBuilder) Getin(strs ...string) Strimap { func MergeMaps(a, b Strimap) Strimap { out := make(Strimap, len(a)) - for k, v := range a { - out[k] = v - } + maps.Copy(out, a) for k, v := range b { if v, ok := v.(Strimap); ok { if bv, ok := out[k]; ok { @@ -51,4 +51,4 @@ func MergeMaps(a, b Strimap) Strimap { out[k] = v } return out -} \ No newline at end of file +} diff --git a/pkg/helm/templatereconciler/reconciler.go b/pkg/helm/templatereconciler/reconciler.go index 63b5341..25308fc 100644 --- a/pkg/helm/templatereconciler/reconciler.go +++ b/pkg/helm/templatereconciler/reconciler.go @@ -41,7 +41,7 @@ import ( type ReleaseData struct { Chart http.FileSystem - Values map[string]interface{} + Values map[string]any Namespace string ChartName string ReleaseName string @@ -184,7 +184,6 @@ func (rec *HelmReconciler) Reconcile(object runtime.Object, component Component) return &reconcile.Result{ RequeueAfter: time.Second * 5, }, nil - } } @@ -316,13 +315,13 @@ func (rec *HelmReconciler) reconcile(parent reconciler.ResourceOwner, component ).(*reconciler.GenericResourceReconciler), rec.client, reconciler.NewReconciledComponent( - func(_ reconciler.ResourceOwner, _ interface{}) []reconciler.ResourceBuilder { + func(_ reconciler.ResourceOwner, _ any) []reconciler.ResourceBuilder { return resourceBuilders }, nil, rec.inventory.TypesToPurge, ), - func(_ runtime.Object) (reconciler.ResourceOwner, interface{}) { + func(_ runtime.Object) (reconciler.ResourceOwner, any) { return nil, nil }, append(rec.nativeReconcilerOpts, reconciler.NativeReconcilerWithScheme(rec.scheme))..., @@ -353,7 +352,6 @@ func (rec *HelmReconciler) setDesiredStateOverrides(resourceBuilders []reconcile resources := []reconciler.ResourceBuilder{} for _, rb := range resourceBuilders { - rb := rb resources = append(resources, func() (runtime.Object, reconciler.DesiredState, error) { o, state, err := rb() if err != nil { diff --git a/pkg/helm/values.go b/pkg/helm/values.go index 3f26ca1..2d810ab 100644 --- a/pkg/helm/values.go +++ b/pkg/helm/values.go @@ -39,7 +39,6 @@ type EnvironmentVariables struct { EnvConfigMap []EnvConfigMap `json:"envConfigMaps,omitempty"` } - // +kubebuilder:object:generate=true type EnvConfigMap struct { Name string `json:"name"` diff --git a/pkg/inventory/inventory.go b/pkg/inventory/inventory.go index e066dda..475fdc1 100644 --- a/pkg/inventory/inventory.go +++ b/pkg/inventory/inventory.go @@ -33,7 +33,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/cisco-open/operator-tools/pkg/reconciler" - "github.com/cisco-open/operator-tools/pkg/utils" ) const ( @@ -108,7 +107,7 @@ func CreateObjectsInventory(namespace, name string, objects []runtime.Object) (* Namespace: namespace, Name: name, }, - Immutable: utils.BoolPointer(false), + Immutable: new(false), Data: map[string]string{ referencesKey: strings.Join(resourceURLs, ","), }, diff --git a/pkg/inventory/inventory_test.go b/pkg/inventory/inventory_test.go index a5a07fc..6b81558 100644 --- a/pkg/inventory/inventory_test.go +++ b/pkg/inventory/inventory_test.go @@ -25,8 +25,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/utils/diff" - - "github.com/cisco-open/operator-tools/pkg/utils" ) func TestCreateObjectsInventory(t *testing.T) { @@ -64,7 +62,7 @@ func TestCreateObjectsInventory(t *testing.T) { Namespace: "test-ns", Name: "test-inv", }, - Immutable: utils.BoolPointer(false), + Immutable: new(false), Data: map[string]string{ referencesKey: "/v1/Service/test-ns/test-svc,apps/v1/Deployment/test-ns/test-deployment", }, @@ -85,7 +83,7 @@ func TestGetObjectsFromInventory(t *testing.T) { Namespace: "test-ns", Name: "test-inv", }, - Immutable: utils.BoolPointer(false), + Immutable: new(false), Data: map[string]string{ referencesKey: "/v1/Service/test-ns/test-svc,apps/v1/Deployment/test-ns/test-deployment", }, diff --git a/pkg/inventory/scope.go b/pkg/inventory/scope.go index a7a5718..0474dd9 100644 --- a/pkg/inventory/scope.go +++ b/pkg/inventory/scope.go @@ -22,8 +22,10 @@ import ( "k8s.io/client-go/discovery" ) -var staticResourceScope map[string]bool -var dynamicResourceScope map[string]bool +var ( + staticResourceScope map[string]bool + dynamicResourceScope map[string]bool +) var mutex = sync.RWMutex{} @@ -86,4 +88,4 @@ func getDynamicResourceScope(gk schema.GroupKind) (bool, bool) { namespaced, ok := dynamicResourceScope[gk.String()] return namespaced, ok -} \ No newline at end of file +} diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 677aa1e..fe7d962 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -32,10 +32,10 @@ type GroupedLogger interface { type Logger interface { Enabled() bool - Info(msg string, keysAndValues ...interface{}) - Error(err error, msg string, keysAndValues ...interface{}) + Info(msg string, keysAndValues ...any) + Error(err error, msg string, keysAndValues ...any) V(level int) Logger - WithValues(keysAndValues ...interface{}) Logger + WithValues(keysAndValues ...any) Logger WithName(name string) Logger GetLogrLogger() logr.Logger @@ -54,7 +54,7 @@ func New(options ...Option) Logger { } } -func (log *logger) Info(msg string, keysAndValues ...interface{}) { +func (log *logger) Info(msg string, keysAndValues ...any) { log.sink.Info(log.level, msg, keysAndValues) } @@ -62,7 +62,7 @@ func (log *logger) Enabled() bool { return log.sink.Enabled(log.level) } -func (log *logger) Error(e error, msg string, keysAndValues ...interface{}) { +func (log *logger) Error(e error, msg string, keysAndValues ...any) { log.sink.Error(e, msg, keysAndValues) } @@ -83,7 +83,7 @@ func (log *logger) WithName(name string) Logger { } } -func (log *logger) WithValues(keysAndValues ...interface{}) Logger { +func (log *logger) WithValues(keysAndValues ...any) Logger { sink := log.sink.copyLogger() sink.values = keysAndValues @@ -105,7 +105,7 @@ func (log *logger) Plain(msg string) { } } -func (log *logger) Plainf(format string, args ...interface{}) { +func (log *logger) Plainf(format string, args ...any) { if GlobalLogLevel >= log.level { fmt.Println(fmt.Sprintf(format, args...)) } @@ -139,8 +139,8 @@ func (log *logger) Grouped(state bool) { log.sink.grouped = state } -func EnableGroupSession(logger interface{}) func() { - var l interface{} +func EnableGroupSession(logger any) func() { + var l any if lwrap, ok := logger.(interface{ GetSink() logr.LogSink }); ok { l = lwrap.GetSink() diff --git a/pkg/logger/logr_adapter.go b/pkg/logger/logr_adapter.go index 8f32cfa..c201fc3 100644 --- a/pkg/logger/logr_adapter.go +++ b/pkg/logger/logr_adapter.go @@ -38,7 +38,7 @@ func (log *LogrAdapter) V(level int) Logger { } } -func (log *LogrAdapter) WithValues(keysAndValues ...interface{}) Logger { +func (log *LogrAdapter) WithValues(keysAndValues ...any) Logger { return &LogrAdapter{ Logger: log.Logger.WithValues(keysAndValues...), } diff --git a/pkg/logger/logsink.go b/pkg/logger/logsink.go index 7112738..a470a03 100644 --- a/pkg/logger/logsink.go +++ b/pkg/logger/logsink.go @@ -36,7 +36,7 @@ const ( type SpinnerLogSink struct { names []string - values []interface{} + values []any out io.Writer err io.Writer @@ -86,8 +86,7 @@ func NewSpinnerLogSink(options ...Option) *SpinnerLogSink { func (log *SpinnerLogSink) Init(_ logr.RuntimeInfo) {} // Info implements logr.LogSink interface -func (log *SpinnerLogSink) Info(level int, msg string, keysAndValues ...interface{}) { - +func (log *SpinnerLogSink) Info(level int, msg string, keysAndValues ...any) { colorPrinter := log.getColorPrinter(log.colors.Info) if !log.Enabled(level) { @@ -139,7 +138,7 @@ func (log *SpinnerLogSink) Enabled(level int) bool { } // Error implements logr.LogSink interface -func (log *SpinnerLogSink) Error(e error, msg string, keysAndValues ...interface{}) { +func (log *SpinnerLogSink) Error(e error, msg string, keysAndValues ...any) { allVal := append(keysAndValues, log.values...) colorPrinter := log.getColorPrinter(log.colors.Error) @@ -184,7 +183,7 @@ func (log *SpinnerLogSink) WithName(name string) logr.LogSink { } // WithValues implements logr.LogSink interface -func (log *SpinnerLogSink) WithValues(keysAndValues ...interface{}) logr.LogSink { +func (log *SpinnerLogSink) WithValues(keysAndValues ...any) logr.LogSink { l := log.copyLogger() l.values = append(l.values, keysAndValues...) @@ -218,11 +217,11 @@ func (log *SpinnerLogSink) Grouped(state bool) { log.grouped = state } -func (log *SpinnerLogSink) GetValues() []interface{} { +func (log *SpinnerLogSink) GetValues() []any { return log.values } -func (log *SpinnerLogSink) AddValues(keyAndValues []interface{}) { +func (log *SpinnerLogSink) AddValues(keyAndValues []any) { log.values = append(log.values, keyAndValues...) } @@ -296,7 +295,7 @@ func (log *SpinnerLogSink) copyLogger() *SpinnerLogSink { names := make([]string, len(log.names)) copy(names, log.names) - values := make([]interface{}, len(log.values)) + values := make([]any, len(log.values)) copy(values, log.values) return &SpinnerLogSink{ @@ -332,8 +331,8 @@ func (*SpinnerLogSink) truncateString(str string, num int) string { return bnoden } -func (log *SpinnerLogSink) joinAndSeparatePairs(values []interface{}) string { - joined := "" +func (log *SpinnerLogSink) joinAndSeparatePairs(values []any) string { + var joined strings.Builder c := log.colors.Key for i, v := range values { s, err := cast.ToStringE(v) @@ -342,19 +341,19 @@ func (log *SpinnerLogSink) joinAndSeparatePairs(values []interface{}) string { } colorPrinter := log.getColorPrinter(c) - joined += colorPrinter.Sprint(s) + joined.WriteString(colorPrinter.Sprint(s)) if i%2 == 0 { c = 0 - joined += "=" + joined.WriteString("=") } else { c = log.colors.Key if i < len(values)-1 { - joined += ", " + joined.WriteString(", ") } } } - return joined + return joined.String() } func (log *SpinnerLogSink) getDetailedErr(err error) string { diff --git a/pkg/merge/merge.go b/pkg/merge/merge.go index d4650b8..ff10ea4 100644 --- a/pkg/merge/merge.go +++ b/pkg/merge/merge.go @@ -25,7 +25,7 @@ import ( // Merge merges `overrides` into `base` using the SMP (structural merge patch) approach. // - It intentionally does not remove fields present in base but missing from overrides // - It merges slices only if the `patchStrategy:"merge"` tag is present and the `patchMergeKey` identifies the unique field -func Merge(base, overrides interface{}) error { +func Merge(base, overrides any) error { baseBytes, err := json.Marshal(base) if err != nil { return errors.Wrap(err, "failed to convert current object to byte sequence") @@ -60,4 +60,4 @@ func Merge(base, overrides interface{}) error { } valueOfBase.Set(reflect.Indirect(into)) return nil -} \ No newline at end of file +} diff --git a/pkg/merge/merge_test.go b/pkg/merge/merge_test.go index 83c5d78..ac92df1 100644 --- a/pkg/merge/merge_test.go +++ b/pkg/merge/merge_test.go @@ -26,7 +26,6 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "github.com/cisco-open/operator-tools/pkg/typeoverride" - "github.com/cisco-open/operator-tools/pkg/utils" ) func TestMerge(t *testing.T) { @@ -286,12 +285,12 @@ func TestMergeWithEmbeddedType(t *testing.T) { func TestMergeStatefulSetReplicas(t *testing.T) { base := &v1.StatefulSet{ Spec: v1.StatefulSetSpec{ - Replicas: utils.IntPointer(1), + Replicas: new(int32(1)), }, } overrides := v1.StatefulSet{ Spec: v1.StatefulSetSpec{ - Replicas: utils.IntPointer(0), + Replicas: new(int32(0)), }, } err := Merge(base, overrides) @@ -347,7 +346,7 @@ func TestMergeMap(t *testing.T) { "a": "1", "b": "3", "c": "4", - }, base.ObjectMeta.Labels) + }, base.Labels) } func TestMergeMapWithEmbeddedType(t *testing.T) { @@ -375,7 +374,7 @@ func TestMergeMapWithEmbeddedType(t *testing.T) { "a": "1", "b": "3", "c": "4", - }, base.ObjectMeta.Labels) + }, base.Labels) } func TestMergeService(t *testing.T) { @@ -435,7 +434,7 @@ func TestMergeService(t *testing.T) { "a": "1", "b": "3", "c": "4", - }, base.ObjectMeta.Labels) + }, base.Labels) require.Equal(t, base.Spec, corev1.ServiceSpec{ Ports: []corev1.ServicePort{ diff --git a/pkg/prometheus/servicemonitor.go b/pkg/prometheus/servicemonitor.go index cca79cb..61409e6 100644 --- a/pkg/prometheus/servicemonitor.go +++ b/pkg/prometheus/servicemonitor.go @@ -17,9 +17,9 @@ package prometheus import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/controller-runtime/pkg/scheme" ) const ( @@ -33,14 +33,16 @@ var ( GroupVersion = schema.GroupVersion{Group: "monitoring.coreos.com", Version: "v1"} // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) // AddToScheme adds the types in this group-version to the given scheme. AddToScheme = SchemeBuilder.AddToScheme ) -func init() { - SchemeBuilder.Register(&ServiceMonitor{}, &ServiceMonitorList{}) +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(GroupVersion, &ServiceMonitor{}, &ServiceMonitorList{}) + metav1.AddToGroupVersion(scheme, GroupVersion) + return nil } // +kubebuilder:object:root=true @@ -148,21 +150,21 @@ type BasicAuth struct { // +kubebuilder:object:generate=true type RelabelConfig struct { - //The source labels select values from existing labels. Their content is concatenated - //using the configured separator and matched against the configured regular expression - //for the replace, keep, and drop actions. + // The source labels select values from existing labels. Their content is concatenated + // using the configured separator and matched against the configured regular expression + // for the replace, keep, and drop actions. SourceLabels []string `json:"sourceLabels,omitempty"` - //Separator placed between concatenated source label values. default is ';'. + // Separator placed between concatenated source label values. default is ';'. Separator string `json:"separator,omitempty"` - //Label to which the resulting value is written in a replace action. - //It is mandatory for replace actions. Regex capture groups are available. + // Label to which the resulting value is written in a replace action. + // It is mandatory for replace actions. Regex capture groups are available. TargetLabel string `json:"targetLabel,omitempty"` - //Regular expression against which the extracted value is matched. defailt is '(.*)' + // Regular expression against which the extracted value is matched. defailt is '(.*)' Regex string `json:"regex,omitempty"` // Modulus to take of the hash of the source label values. Modulus uint64 `json:"modulus,omitempty"` - //Replacement value against which a regex replace is performed if the - //regular expression matches. Regex capture groups are available. Default is '$1' + // Replacement value against which a regex replace is performed if the + // regular expression matches. Regex capture groups are available. Default is '$1' Replacement string `json:"replacement,omitempty"` // Action to perform based on regex matching. Default is 'replace' Action string `json:"action,omitempty"` diff --git a/pkg/prometheus/zz_generated.deepcopy.go b/pkg/prometheus/zz_generated.deepcopy.go index 8878724..69395a4 100644 --- a/pkg/prometheus/zz_generated.deepcopy.go +++ b/pkg/prometheus/zz_generated.deepcopy.go @@ -19,7 +19,7 @@ package prometheus import ( - runtime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" ) diff --git a/pkg/reconciler/component.go b/pkg/reconciler/component.go index 65915bf..2f125a6 100644 --- a/pkg/reconciler/component.go +++ b/pkg/reconciler/component.go @@ -157,7 +157,7 @@ func (r *Dispatcher) Handle(object runtime.Object) (ctrl.Result, error) { combinedResult.CombineErr(errors.WrapIf(uerr, "unable to update status for component")) } } else { - if result == nil || (!result.Requeue && result.RequeueAfter == 0) { + if result == nil || result.RequeueAfter == 0 { status := types.ReconcileStatusRemoved if cr.IsEnabled(object) { status = types.ReconcileStatusAvailable diff --git a/pkg/reconciler/native.go b/pkg/reconciler/native.go index 5dd7dd0..ff8d19f 100644 --- a/pkg/reconciler/native.go +++ b/pkg/reconciler/native.go @@ -25,7 +25,6 @@ import ( crdv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" - apimeta "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" @@ -58,9 +57,9 @@ type ResourceOwnerWithControlNamespace interface { } type ( - ResourceBuilders func(parent ResourceOwner, object interface{}) []ResourceBuilder + ResourceBuilders func(parent ResourceOwner, object any) []ResourceBuilder ResourceBuilder func() (runtime.Object, DesiredState, error) - ResourceTranslate func(runtime.Object) (parent ResourceOwner, config interface{}) + ResourceTranslate func(runtime.Object) (parent ResourceOwner, config any) PurgeTypesFunc func() []schema.GroupVersionKind ) @@ -70,7 +69,6 @@ func GetResourceBuildersFromObjects(objects []runtime.Object, state DesiredState utils.RuntimeObjects(objects).Sort(utils.InstallResourceOrder) for _, o := range objects { - o := o for _, modifierFunc := range modifierFuncs { var err error o, err = modifierFunc(o) @@ -104,7 +102,7 @@ func GetResourceBuildersFromObjects(objects []runtime.Object, state DesiredState } type NativeReconciledComponent interface { - ResourceBuilders(parent ResourceOwner, object interface{}) []ResourceBuilder + ResourceBuilders(parent ResourceOwner, object any) []ResourceBuilder RegisterWatches(*builder.Builder) PurgeTypes() []schema.GroupVersionKind } @@ -131,7 +129,7 @@ func NewReconciledComponent(b ResourceBuilders, w func(b *builder.Builder), p fu } } -func (d *DefaultReconciledComponent) ResourceBuilders(parent ResourceOwner, object interface{}) []ResourceBuilder { +func (d *DefaultReconciledComponent) ResourceBuilders(parent ResourceOwner, object any) []ResourceBuilder { return d.builders(parent, object) } @@ -243,8 +241,9 @@ func NewNativeReconciler( rec *GenericResourceReconciler, client client.Client, reconciledComponent NativeReconciledComponent, - resourceTranslate func(runtime.Object) (parent ResourceOwner, config interface{}), - opts ...NativeReconcilerOpt) *NativeReconciler { + resourceTranslate func(runtime.Object) (parent ResourceOwner, config any), + opts ...NativeReconcilerOpt, +) *NativeReconciler { reconciler := &NativeReconciler{ GenericResourceReconciler: rec, Client: client, @@ -330,7 +329,7 @@ LOOP: } } - // desired state can be overriden to create-only by an annotation + // desired state can be overridden to create-only by an annotation if _, ok := objectMeta.GetAnnotations()[types.BanzaiCloudDesiredStateCreated]; ok { if ds, ok := state.(DynamicDesiredState); ok && ds.DesiredState == StatePresent || state == StatePresent { state = StateCreated @@ -439,7 +438,7 @@ func (rec *NativeReconciler) gvkExists(gvk schema.GroupVersionKind) bool { } mappings, err := rec.restMapper.RESTMappings(gvk.GroupKind(), gvk.Version) - if apimeta.IsNoMatchError(err) { + if meta.IsNoMatchError(err) { return false } if err != nil { @@ -466,7 +465,7 @@ func (rec *NativeReconciler) purge(excluded map[string]bool, componentId string) objects := &unstructured.UnstructuredList{} objects.SetGroupVersionKind(gvk) err := rec.List(context.TODO(), objects) - if apimeta.IsNoMatchError(err) { + if meta.IsNoMatchError(err) { // skip unknown GVKs continue } @@ -504,7 +503,7 @@ func (rec *NativeReconciler) purge(excluded map[string]bool, componentId string) utils.RuntimeObjects(purgeObjects).Sort(utils.UninstallResourceOrder) for _, o := range purgeObjects { - if err := rec.Client.Delete(context.TODO(), o.(client.Object)); err != nil && !k8serrors.IsNotFound(err) { + if err := rec.Delete(context.TODO(), o.(client.Object)); err != nil && !k8serrors.IsNotFound(err) { allErr = errors.Combine(allErr, err) } else { rec.addReconciledObjectState(ReconciledObjectStatePurged, o.DeepCopyObject()) diff --git a/pkg/reconciler/native_test.go b/pkg/reconciler/native_test.go index 85031f0..8802faf 100644 --- a/pkg/reconciler/native_test.go +++ b/pkg/reconciler/native_test.go @@ -52,12 +52,12 @@ func TestNativeReconcilerKeepsTheSecret(t *testing.T) { reconciler.NewGenericReconciler(k8sClient, log, reconciler.ReconcilerOpts{}), k8sClient, reconciler.NewReconciledComponent( - func(parent reconciler.ResourceOwner, object interface{}) []reconciler.ResourceBuilder { + func(parent reconciler.ResourceOwner, object any) []reconciler.ResourceBuilder { parentWithControlNamespace := parent.(reconciler.ResourceOwnerWithControlNamespace) rb := []reconciler.ResourceBuilder{} // depending on the incoming config we return 0 or more items count := cast.ToInt(object) - for i := 0; i < count; i++ { + for i := range count { name := fmt.Sprintf("asd-%d", i) rb = append(rb, func() (object runtime.Object, state reconciler.DesiredState, e error) { return &corev1.ConfigMap{ @@ -90,7 +90,7 @@ func TestNativeReconcilerKeepsTheSecret(t *testing.T) { } }, ), - func(object runtime.Object) (reconciler.ResourceOwner, interface{}) { + func(object runtime.Object) (reconciler.ResourceOwner, any) { return &FakeResourceOwner{ConfigMap: object.(*corev1.ConfigMap)}, object.(*corev1.ConfigMap).Data["count"] }, ) @@ -279,7 +279,7 @@ func TestNativeReconcilerSetControllerRefMultipleTimes(t *testing.T) { }, } - for i := 0; i < 2; i++ { + for range 2 { _, err := nativeReconciler.Reconcile(fakeOwnerObject) if err != nil { t.Fatalf("%+v", err) @@ -335,7 +335,7 @@ func TestCreatedDesiredStateAnnotationWithStaticStatePresent(t *testing.T) { desiredMutated := desired.DeepCopy() desiredMutated.Data["a"] = "c" - nr := reconciler.NewNativeReconcilerWithDefaults("test", k8sClient, clientgoscheme.Scheme, logr.Discard(), func(parent reconciler.ResourceOwner, object interface{}) []reconciler.ResourceBuilder { + nr := reconciler.NewNativeReconcilerWithDefaults("test", k8sClient, clientgoscheme.Scheme, logr.Discard(), func(parent reconciler.ResourceOwner, object any) []reconciler.ResourceBuilder { return []reconciler.ResourceBuilder{ func() (runtime.Object, reconciler.DesiredState, error) { return desiredMutated, reconciler.StatePresent, nil @@ -343,7 +343,7 @@ func TestCreatedDesiredStateAnnotationWithStaticStatePresent(t *testing.T) { } }, func() []schema.GroupVersionKind { return nil - }, func(_ runtime.Object) (reconciler.ResourceOwner, interface{}) { + }, func(_ runtime.Object) (reconciler.ResourceOwner, any) { return nil, nil }) @@ -388,7 +388,7 @@ func TestCreatedDesiredStateAnnotationWithDynamicStatePresent(t *testing.T) { desiredMutated := desired.DeepCopy() desiredMutated.Data["a"] = "c" - nr := reconciler.NewNativeReconcilerWithDefaults("test", k8sClient, clientgoscheme.Scheme, logr.Discard(), func(parent reconciler.ResourceOwner, object interface{}) []reconciler.ResourceBuilder { + nr := reconciler.NewNativeReconcilerWithDefaults("test", k8sClient, clientgoscheme.Scheme, logr.Discard(), func(parent reconciler.ResourceOwner, object any) []reconciler.ResourceBuilder { return []reconciler.ResourceBuilder{ func() (runtime.Object, reconciler.DesiredState, error) { return desiredMutated, reconciler.DynamicDesiredState{ @@ -398,7 +398,7 @@ func TestCreatedDesiredStateAnnotationWithDynamicStatePresent(t *testing.T) { } }, func() []schema.GroupVersionKind { return nil - }, func(_ runtime.Object) (reconciler.ResourceOwner, interface{}) { + }, func(_ runtime.Object) (reconciler.ResourceOwner, any) { return nil, nil }) @@ -423,7 +423,7 @@ func createReconcilerForRefTests(opts ...reconciler.NativeReconcilerOpt) *reconc reconciler.NewGenericReconciler(k8sClient, log, reconciler.ReconcilerOpts{}), k8sClient, reconciler.NewReconciledComponent( - func(parent reconciler.ResourceOwner, object interface{}) []reconciler.ResourceBuilder { + func(parent reconciler.ResourceOwner, object any) []reconciler.ResourceBuilder { parentWithControlNamespace := parent.(reconciler.ResourceOwnerWithControlNamespace) var rb []reconciler.ResourceBuilder rb = append(rb, func() (object runtime.Object, state reconciler.DesiredState, e error) { @@ -439,7 +439,7 @@ func createReconcilerForRefTests(opts ...reconciler.NativeReconcilerOpt) *reconc func(b *builder.Builder) {}, func() []schema.GroupVersionKind { return []schema.GroupVersionKind{} }, ), - func(object runtime.Object) (reconciler.ResourceOwner, interface{}) { + func(object runtime.Object) (reconciler.ResourceOwner, any) { return &FakeResourceOwner{ConfigMap: object.(*corev1.ConfigMap)}, nil }, opts..., diff --git a/pkg/reconciler/patch.go b/pkg/reconciler/patch.go index 1cef6a2..60eb99e 100644 --- a/pkg/reconciler/patch.go +++ b/pkg/reconciler/patch.go @@ -18,7 +18,6 @@ import ( "encoding/json" "emperror.dev/errors" - "github.com/cisco-open/k8s-objectmatcher/patch" ) @@ -39,12 +38,12 @@ func IgnoreManagedFields() patch.CalculateOption { } func deleteManagedFields(obj []byte) ([]byte, error) { - var objectMap map[string]interface{} + var objectMap map[string]any err := json.Unmarshal(obj, &objectMap) if err != nil { return []byte{}, errors.WrapIf(err, "could not unmarshal byte sequence") } - if metadata, ok := objectMap["metadata"].(map[string]interface{}); ok { + if metadata, ok := objectMap["metadata"].(map[string]any); ok { delete(metadata, "managedFields") objectMap["metadata"] = metadata } diff --git a/pkg/reconciler/patch_fallback.go b/pkg/reconciler/patch_fallback.go new file mode 100644 index 0000000..88ed1cb --- /dev/null +++ b/pkg/reconciler/patch_fallback.go @@ -0,0 +1,79 @@ +// Copyright © 2026 Banzai Cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package reconciler + +import ( + "emperror.dev/errors" + "github.com/cisco-open/k8s-objectmatcher/patch" + json "github.com/json-iterator/go" + "k8s.io/apimachinery/pkg/runtime" +) + +// FallbackPatchMaker falls back to a three-way JSON merge patch when the +// primary patch.Maker errors — e.g. on types whose custom MarshalJSON +// flattens map entries to top-level JSON keys that reflective strategic-merge +// cannot resolve (opentelemetry-operator's AnyConfig). +type FallbackPatchMaker struct { + primary patch.Maker + annotator *patch.Annotator + jsonMergePatcher patch.JSONMergePatcher +} + +func NewFallbackPatchMaker(primary patch.Maker, annotator *patch.Annotator, jsonMergePatcher patch.JSONMergePatcher) *FallbackPatchMaker { + return &FallbackPatchMaker{primary: primary, annotator: annotator, jsonMergePatcher: jsonMergePatcher} +} + +func (m *FallbackPatchMaker) Calculate(current, modified runtime.Object, opts ...patch.CalculateOption) (*patch.PatchResult, error) { + if result, err := m.primary.Calculate(current, modified, opts...); err == nil { + return result, nil + } + return m.calculateJSONMerge(current, modified, opts...) +} + +func (m *FallbackPatchMaker) calculateJSONMerge(currentObj, modifiedObj runtime.Object, opts ...patch.CalculateOption) (*patch.PatchResult, error) { + current, err := json.ConfigCompatibleWithStandardLibrary.Marshal(currentObj) + if err != nil { + return nil, errors.Wrap(err, "marshal current") + } + modified, err := json.ConfigCompatibleWithStandardLibrary.Marshal(modifiedObj) + if err != nil { + return nil, errors.Wrap(err, "marshal modified") + } + + for _, opt := range opts { + if current, modified, err = opt(current, modified); err != nil { + return nil, errors.Wrap(err, "apply CalculateOption") + } + } + + if current, _, err = patch.DeleteNullInJson(current); err != nil { + return nil, errors.Wrap(err, "strip nulls from current") + } + if modified, _, err = patch.DeleteNullInJson(modified); err != nil { + return nil, errors.Wrap(err, "strip nulls from modified") + } + + original, err := m.annotator.GetOriginalConfiguration(currentObj) + if err != nil { + return nil, errors.Wrap(err, "read last-applied annotation") + } + + patchBytes, err := m.jsonMergePatcher.CreateThreeWayJSONMergePatch(original, modified, current) + if err != nil { + return nil, errors.Wrap(err, "json merge fallback") + } + + return &patch.PatchResult{Patch: patchBytes, Current: current, Modified: modified, Original: original}, nil +} diff --git a/pkg/reconciler/patch_fallback_test.go b/pkg/reconciler/patch_fallback_test.go new file mode 100644 index 0000000..2e2492b --- /dev/null +++ b/pkg/reconciler/patch_fallback_test.go @@ -0,0 +1,137 @@ +// Copyright © 2026 Banzai Cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package reconciler_test + +import ( + "encoding/json" + "testing" + + "github.com/cisco-open/k8s-objectmatcher/patch" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/cisco-open/operator-tools/pkg/reconciler" +) + +// flattenedMapConfig mimics opentelemetry-operator's AnyConfig: a struct +// whose JSON form is its internal map hoisted to top level. Strategic-merge +// cannot resolve those keys against the Go struct. +type flattenedMapConfig struct { + Object map[string]any `json:"-"` +} + +func (c *flattenedMapConfig) MarshalJSON() ([]byte, error) { + if c == nil { + return []byte("{}"), nil + } + return json.Marshal(c.Object) +} + +func (c *flattenedMapConfig) UnmarshalJSON(b []byte) error { + m := map[string]any{} + if err := json.Unmarshal(b, &m); err != nil { + return err + } + c.Object = m + return nil +} + +func (c *flattenedMapConfig) DeepCopyInto(out *flattenedMapConfig) { + out.Object = make(map[string]any, len(c.Object)) + for k, v := range c.Object { + out.Object[k] = v + } +} + +type flattenedResource struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata"` + Spec flattenedMapConfig `json:"spec"` +} + +func (r *flattenedResource) GetObjectKind() schema.ObjectKind { + return &r.TypeMeta +} + +func (r *flattenedResource) DeepCopyObject() runtime.Object { + out := &flattenedResource{TypeMeta: r.TypeMeta, ObjectMeta: *r.DeepCopy()} + r.Spec.DeepCopyInto(&out.Spec) + return out +} + +func TestFallbackPatchMaker_FallsBackOnStrategicMergeFailure(t *testing.T) { + current := &flattenedResource{ + ObjectMeta: metav1.ObjectMeta{Name: "x", Namespace: "default"}, + Spec: flattenedMapConfig{Object: map[string]any{ + "exporters/prometheus": map[string]any{"endpoint": ":9090"}, + }}, + } + desired := &flattenedResource{ + ObjectMeta: metav1.ObjectMeta{Name: "x", Namespace: "default"}, + Spec: flattenedMapConfig{Object: map[string]any{ + "exporters/prometheus": map[string]any{"endpoint": ":9091"}, + }}, + } + + require.NoError(t, patch.DefaultAnnotator.SetLastAppliedAnnotation(current)) + + _, err := patch.DefaultPatchMaker.Calculate(current, desired) + require.Error(t, err, "expected strategic-merge to fail on flattened-map type") + + maker := reconciler.NewFallbackPatchMaker(patch.DefaultPatchMaker, patch.DefaultAnnotator, &patch.BaseJSONMergePatcher{}) + result, err := maker.Calculate(current, desired) + require.NoError(t, err) + require.NotNil(t, result) + assert.False(t, result.IsEmpty(), "expected non-empty patch for differing specs") + assert.Contains(t, string(result.Patch), ":9091") +} + +func TestFallbackPatchMaker_DelegatesWhenPrimarySucceeds(t *testing.T) { + current := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: "cm", Namespace: "default"}, + Data: map[string]string{"k": "v1"}, + } + desired := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: "cm", Namespace: "default"}, + Data: map[string]string{"k": "v2"}, + } + require.NoError(t, patch.DefaultAnnotator.SetLastAppliedAnnotation(current)) + + maker := reconciler.NewFallbackPatchMaker(patch.DefaultPatchMaker, patch.DefaultAnnotator, &patch.BaseJSONMergePatcher{}) + result, err := maker.Calculate(current, desired) + require.NoError(t, err) + require.NotNil(t, result) + assert.False(t, result.IsEmpty()) +} + +func TestFallbackPatchMaker_EmptyPatchWhenInSync(t *testing.T) { + obj := &flattenedResource{ + ObjectMeta: metav1.ObjectMeta{Name: "x", Namespace: "default"}, + Spec: flattenedMapConfig{Object: map[string]any{ + "exporters/prometheus": map[string]any{"endpoint": ":9090"}, + }}, + } + require.NoError(t, patch.DefaultAnnotator.SetLastAppliedAnnotation(obj)) + + maker := reconciler.NewFallbackPatchMaker(patch.DefaultPatchMaker, patch.DefaultAnnotator, &patch.BaseJSONMergePatcher{}) + result, err := maker.Calculate(obj, obj) + require.NoError(t, err) + require.NotNil(t, result) + assert.True(t, result.IsEmpty(), "current == desired should produce empty patch") +} diff --git a/pkg/reconciler/predicates.go b/pkg/reconciler/predicates.go index 1cee7da..ed3b811 100644 --- a/pkg/reconciler/predicates.go +++ b/pkg/reconciler/predicates.go @@ -15,10 +15,10 @@ package reconciler import ( + "github.com/cisco-open/k8s-objectmatcher/patch" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/predicate" - "github.com/cisco-open/k8s-objectmatcher/patch" "github.com/cisco-open/operator-tools/pkg/types" ) diff --git a/pkg/reconciler/reconcileretry.go b/pkg/reconciler/reconcileretry.go index 9feb68c..cc6694c 100644 --- a/pkg/reconciler/reconcileretry.go +++ b/pkg/reconciler/reconcileretry.go @@ -36,7 +36,7 @@ func (r *ReconcileRetry) Reconcile(component func() (*reconcile.Result, error)) if result == nil { return nil } - if !result.Requeue && result.RequeueAfter == 0 { + if result.RequeueAfter == 0 { break } else { if result.RequeueAfter > 0 { diff --git a/pkg/reconciler/resource.go b/pkg/reconciler/resource.go index 4ceb0ac..fcc3085 100644 --- a/pkg/reconciler/resource.go +++ b/pkg/reconciler/resource.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "reflect" + "slices" "strings" "time" @@ -199,24 +200,19 @@ func NewGenericReconciler(c client.Client, log logr.Logger, opts ReconcilerOpts) _ = clientgoscheme.AddToScheme(opts.Scheme) } if opts.RecreateRequeueDelay == nil { - opts.RecreateRequeueDelay = utils.IntPointer(DefaultRecreateRequeueDelay) + opts.RecreateRequeueDelay = new(DefaultRecreateRequeueDelay) } if opts.RecreateErrorMessageSubstring == nil { if opts.RecreateErrorMessageCondition == nil { opts.RecreateErrorMessageCondition = MatchImmutableErrorMessages } else { - opts.RecreateErrorMessageSubstring = utils.StringPointer("immutable") + opts.RecreateErrorMessageSubstring = new("immutable") } } if opts.RecreateEnabledResourceCondition == nil { // only allow a custom set of types and only specific errors opts.RecreateEnabledResourceCondition = func(kind schema.GroupVersionKind, status metav1.Status) bool { - for _, gk := range DefaultRecreateEnabledGroupKinds { - if gk == kind.GroupKind() { - return true - } - } - return false + return slices.Contains(DefaultRecreateEnabledGroupKinds, kind.GroupKind()) } } if len(opts.RecreatePropagationPolicy) == 0 { @@ -224,7 +220,7 @@ func NewGenericReconciler(c client.Client, log logr.Logger, opts ReconcilerOpts) opts.RecreatePropagationPolicy = client.PropagationPolicy(metav1.DeletePropagationBackground) } if opts.PatchMaker == nil { - opts.PatchMaker = patch.DefaultPatchMaker + opts.PatchMaker = NewFallbackPatchMaker(patch.DefaultPatchMaker, patch.DefaultAnnotator, &patch.BaseJSONMergePatcher{}) } if opts.PatchCalculateOptions == nil { opts.PatchCalculateOptions = []patch.CalculateOption{patch.IgnoreStatusFields()} @@ -257,11 +253,11 @@ func WithEnableRecreateWorkload() ResourceReconcilerOption { // Apply the given amount of delay before recreating a resource after it has been removed func WithRecreateRequeueDelay(delay int32) ResourceReconcilerOption { return func(o *ReconcilerOpts) { - o.RecreateRequeueDelay = utils.IntPointer(delay) + o.RecreateRequeueDelay = new(delay) } } -// Use this option for the legacy behaviour +// Use this option for the legacy behavior func WithRecreateEnabledForAll() ResourceReconcilerOption { return func(o *ReconcilerOpts) { o.RecreateEnabledResourceCondition = func(_ schema.GroupVersionKind, _ metav1.Status) bool { @@ -270,7 +266,7 @@ func WithRecreateEnabledForAll() ResourceReconcilerOption { } } -// Use this option for the legacy behaviour +// Use this option for the legacy behavior func WithRecreateEnabledFor(condition RecreateResourceCondition) ResourceReconcilerOption { return func(o *ReconcilerOpts) { o.RecreateEnabledResourceCondition = condition @@ -296,7 +292,7 @@ func WithRecreateImmediately() ResourceReconcilerOption { // Recreate only if the error message contains the given substring func WithRecreateErrorMessageSubstring(substring string) ResourceReconcilerOption { return func(o *ReconcilerOpts) { - o.RecreateErrorMessageSubstring = utils.StringPointer(substring) + o.RecreateErrorMessageSubstring = new(substring) } } @@ -310,7 +306,7 @@ func WithRecreateErrorMessageCondition(condition ErrorMessageCondition) Resource // Disable checking the error message before recreating resources func WithRecreateErrorMessageIgnored() ResourceReconcilerOption { return func(o *ReconcilerOpts) { - o.RecreateErrorMessageSubstring = utils.StringPointer("") + o.RecreateErrorMessageSubstring = new("") } } @@ -351,7 +347,7 @@ func (r *GenericResourceReconciler) shouldRecreate(sErr *apierrors.StatusError) return r.Options.RecreateErrorMessageCondition(sErr.ErrStatus.Message) } // Fall back to substring matching - return strings.Contains(sErr.ErrStatus.Message, utils.PointerToString(r.Options.RecreateErrorMessageSubstring)) + return strings.Contains(sErr.ErrStatus.Message, utils.DerefOrZero(r.Options.RecreateErrorMessageSubstring)) } // ReconcileResource reconciles various kubernetes types @@ -378,6 +374,11 @@ func (r *GenericResourceReconciler) ReconcileResource(desired runtime.Object, de if err != nil { return nil, errors.WrapIfWithDetails(err, "failed to create resource", resourceDetails...) } + case StateAbsent: + _, err := r.delete(desired, desiredState) + if err != nil { + return nil, errors.WrapIfWithDetails(err, "failed to delete resource", resourceDetails...) + } default: created, current, err := r.CreateIfNotExist(desired, desiredState) if err == nil && created { @@ -496,20 +497,16 @@ func (r *GenericResourceReconciler) ReconcileResource(desired runtime.Object, de } return nil, nil } - if err != nil { - return nil, errors.WrapIfWithDetails(err, "failed to recreate resource", resourceDetails...) - } + return nil, errors.WrapIfWithDetails(err, "failed to recreate resource", resourceDetails...) } - err := r.Client.Delete(context.TODO(), current.(client.Object), + if err := r.Client.Delete(context.TODO(), current.(client.Object), // wait until all dependent resources get cleared up client.PropagationPolicy(metav1.DeletePropagationForeground), - ) - if err != nil { + ); err != nil { return nil, errors.WrapIfWithDetails(err, "failed to delete current resource", resourceDetails...) } return &reconcile.Result{ - Requeue: true, - RequeueAfter: time.Second * time.Duration(utils.PointerToInt32(r.Options.RecreateRequeueDelay)), + RequeueAfter: time.Second * time.Duration(utils.DerefOrZero(r.Options.RecreateRequeueDelay)), }, nil } else { return nil, errors.WrapIf(sErr, r.Options.EnableRecreateWorkloadOnImmutableFieldChangeHelp) @@ -518,22 +515,16 @@ func (r *GenericResourceReconciler) ReconcileResource(desired runtime.Object, de return nil, errors.WrapIfWithDetails(err, "updating resource failed", resourceDetails...) } debugLog.Info("resource updated") - - case StateAbsent: - _, err := r.delete(desired, desiredState) - if err != nil { - return nil, errors.WrapIfWithDetails(err, "failed to delete resource", resourceDetails...) - } } return nil, nil } -func (r *GenericResourceReconciler) fromDesired(desired runtime.Object) (runtime.Object, error) { +func (r *GenericResourceReconciler) fromDesired(desired runtime.Object) runtime.Object { if _, ok := desired.(*unstructured.Unstructured); ok { if r.Options.Scheme != nil { object, err := r.Options.Scheme.New(desired.GetObjectKind().GroupVersionKind()) if err == nil { - return object, nil + return object } r.Log.V(2).Info("unable to detect correct type for the resource, falling back to unstructured") } @@ -541,16 +532,13 @@ func (r *GenericResourceReconciler) fromDesired(desired runtime.Object) (runtime desiredGVK := desired.GetObjectKind() current.SetKind(desiredGVK.GroupVersionKind().Kind) current.SetAPIVersion(desiredGVK.GroupVersionKind().GroupVersion().String()) - return current, nil + return current } - return reflect.New(reflect.Indirect(reflect.ValueOf(desired)).Type()).Interface().(runtime.Object), nil + return reflect.New(reflect.Indirect(reflect.ValueOf(desired)).Type()).Interface().(runtime.Object) } func (r *GenericResourceReconciler) CreateIfNotExist(desired runtime.Object, desiredState DesiredState) (bool, runtime.Object, error) { - current, err := r.fromDesired(desired) - if err != nil { - return false, nil, errors.WrapIf(err, "failed to create new object based on desired") - } + current := r.fromDesired(desired) m, err := meta.Accessor(desired) if err != nil { return false, nil, errors.WrapIf(err, "failed to get object key") @@ -625,10 +613,7 @@ func (r *GenericResourceReconciler) CreateIfNotExist(desired runtime.Object, des } func (r *GenericResourceReconciler) delete(desired runtime.Object, desiredState DesiredState) (bool, error) { - current, err := r.fromDesired(desired) - if err != nil { - return false, errors.WrapIf(err, "failed to create new object based on desired") - } + current := r.fromDesired(desired) m, err := meta.Accessor(desired) if err != nil { return false, errors.WrapIf(err, "failed to get object key") @@ -705,14 +690,14 @@ func crdReadyV1(crd *v1.CustomResourceDefinition) bool { return false } -func (r *GenericResourceReconciler) resourceDetails(desired runtime.Object) ([]interface{}, schema.GroupVersionKind, error) { +func (r *GenericResourceReconciler) resourceDetails(desired runtime.Object) ([]any, schema.GroupVersionKind, error) { gvk := schema.GroupVersionKind{} m, err := meta.Accessor(desired) if err != nil { return nil, gvk, errors.WithStackIf(err) } key := client.ObjectKey{Namespace: m.GetNamespace(), Name: m.GetName()} - values := []interface{}{"name", key.Name} + values := []any{"name", key.Name} if key.Namespace != "" { values = append(values, "namespace", key.Namespace) } @@ -731,7 +716,7 @@ func (r *GenericResourceReconciler) resourceDetails(desired runtime.Object) ([]i return values, gvk, nil } -func (r *GenericResourceReconciler) resourceLog(desired runtime.Object, details ...interface{}) logr.Logger { +func (r *GenericResourceReconciler) resourceLog(_ runtime.Object, details ...any) logr.Logger { if len(details) > 0 { return r.Log.WithValues(details...) } diff --git a/pkg/reconciler/resource_test.go b/pkg/reconciler/resource_test.go index 7597cba..520f8b3 100644 --- a/pkg/reconciler/resource_test.go +++ b/pkg/reconciler/resource_test.go @@ -17,6 +17,7 @@ package reconciler_test import ( "context" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -62,8 +63,8 @@ func TestNewReconcilerWith(t *testing.T) { func TestNewReconcilerWithUnstructured(t *testing.T) { desired := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "metadata": map[string]interface{}{ + Object: map[string]any{ + "metadata": map[string]any{ "name": "test", "namespace": controlNamespace, }, @@ -155,7 +156,7 @@ func TestRecreateObjectFailIfNotAllowed(t *testing.T) { }, wantResult: func(result *reconcile.Result) { require.NotNil(t, result) - require.True(t, result.Requeue) + require.Greater(t, result.RequeueAfter, time.Duration(0)) }, }, { @@ -248,7 +249,6 @@ func TestRecreateObjectFailIfNotAllowed(t *testing.T) { } for _, tt := range testData { - tt := tt t.Run(tt.name, func(t *testing.T) { _, err := tt.reconciler.ReconcileResource(tt.desired, reconciler.StatePresent) require.NoError(t, err) diff --git a/pkg/reconciler/result.go b/pkg/reconciler/result.go index ac2b433..d952224 100644 --- a/pkg/reconciler/result.go +++ b/pkg/reconciler/result.go @@ -22,15 +22,12 @@ import ( // Collects results and errors of all subcomponents instead of failing and bailing out immediately type CombinedResult struct { Result reconcile.Result - Err error + Err error } func (c *CombinedResult) Combine(sub *reconcile.Result, err error) { c.CombineErr(err) if sub != nil { - if sub.Requeue { - c.Result.Requeue = true - } // combined should be requeued at the minimum of all subresults if sub.RequeueAfter > 0 { if c.Result.RequeueAfter == 0 || sub.RequeueAfter < c.Result.RequeueAfter { diff --git a/pkg/reconciler/suite_test.go b/pkg/reconciler/suite_test.go index 3b922c9..6908bf6 100644 --- a/pkg/reconciler/suite_test.go +++ b/pkg/reconciler/suite_test.go @@ -33,12 +33,14 @@ import ( "github.com/cisco-open/operator-tools/pkg/utils" ) -var cfg *rest.Config -var k8sClient client.Client -var testEnv *envtest.Environment -var testNamespace = "test-" + uuid.New()[:8] -var controlNamespace = "control" -var log logr.Logger +var ( + cfg *rest.Config + k8sClient client.Client + testEnv *envtest.Environment + testNamespace = "test-" + uuid.New()[:8] + controlNamespace = "control" + log logr.Logger +) func TestMain(m *testing.M) { log = utils.Log @@ -116,5 +118,3 @@ func assertSecretList(t *testing.T, a func(l *corev1.SecretList)) { a(l) } - - diff --git a/pkg/resources/object.go b/pkg/resources/object.go index 380cc4c..cdb7c55 100644 --- a/pkg/resources/object.go +++ b/pkg/resources/object.go @@ -151,15 +151,15 @@ func (p *ObjectParser) ParseYAMLToK8sObject(yaml []byte, yamlModifiers ...YAMLMo } func (p *ObjectParser) removeNonYAMLLines(yms string) string { - out := "" - for _, s := range strings.Split(yms, "\n") { + var out strings.Builder + for s := range strings.SplitSeq(yms, "\n") { if strings.HasPrefix(s, "#") { continue } - out += s + "\n" + out.WriteString(s + "\n") } - return strings.TrimSpace(out) + return strings.TrimSpace(out.String()) } // IsObjectBeingDeleted returns true, if the given object is being deleted with finalizers still diff --git a/pkg/resources/objectmodifiers.go b/pkg/resources/objectmodifiers.go index 85e3a77..027090a 100644 --- a/pkg/resources/objectmodifiers.go +++ b/pkg/resources/objectmodifiers.go @@ -21,13 +21,14 @@ import ( batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apimachinery/pkg/runtime" ) -type ObjectModifierFunc func(o runtime.Object) (runtime.Object, error) -type ObjectModifierWithParentFunc func(o, p runtime.Object) (runtime.Object, error) +type ( + ObjectModifierFunc func(o runtime.Object) (runtime.Object, error) + ObjectModifierWithParentFunc func(o, p runtime.Object) (runtime.Object, error) +) var DefaultModifiers = []ObjectModifierFunc{ ClearCRDStatusModifier, diff --git a/pkg/resources/overlay.go b/pkg/resources/overlay.go index c61c444..bf9a5dd 100644 --- a/pkg/resources/overlay.go +++ b/pkg/resources/overlay.go @@ -65,14 +65,14 @@ func PatchYAMLModifier(overlay K8SResourceOverlay, parser *ObjectParser) (Object var opsDefinitions []ypatch.OpDefinition for _, patch := range overlay.Patches { - var value interface{} + var value any if patch.ParseValue { - err := yaml.Unmarshal([]byte(utils.PointerToString(patch.Value)), &value) + err := yaml.Unmarshal([]byte(utils.DerefOrZero(patch.Value)), &value) if err != nil { return nil, errors.WrapIf(err, "could not unmarshal value") } } else { - value = interface{}(patch.Value) + value = any(patch.Value) } op := ypatch.OpDefinition{ @@ -120,7 +120,7 @@ func PatchYAMLModifier(overlay K8SResourceOverlay, parser *ObjectParser) (Object return o, errors.WrapIf(err, "could not init patch ops from definitions") } - var in interface{} + var in any err = yaml.Unmarshal(y, &in) if err != nil { return o, errors.WrapIf(err, "could not unmarshal resource yaml") diff --git a/pkg/resources/overlay_test.go b/pkg/resources/overlay_test.go index 7c3ca10..440e485 100644 --- a/pkg/resources/overlay_test.go +++ b/pkg/resources/overlay_test.go @@ -25,7 +25,6 @@ import ( clientgoscheme "k8s.io/client-go/kubernetes/scheme" "github.com/cisco-open/operator-tools/pkg/types" - "github.com/cisco-open/operator-tools/pkg/utils" ) func TestPatchYAMLModifier(t *testing.T) { @@ -93,17 +92,17 @@ func TestPatchYAMLModifier(t *testing.T) { Patches: []K8SResourceOverlayPatch{ { Type: ReplaceOverlayPatchType, - Path: utils.StringPointer("/spec/loadBalancerIP"), - Value: utils.StringPointer("5.6.7.8"), + Path: new("/spec/loadBalancerIP"), + Value: new("5.6.7.8"), }, { Type: ReplaceOverlayPatchType, - Path: utils.StringPointer("/spec/ports/0/name"), - Value: utils.StringPointer("port2"), + Path: new("/spec/ports/0/name"), + Value: new("port2"), }, { Type: DeleteOverlayPatchType, - Path: utils.StringPointer("/spec/ports/1"), + Path: new("/spec/ports/1"), }, }, }, @@ -115,17 +114,17 @@ func TestPatchYAMLModifier(t *testing.T) { Patches: []K8SResourceOverlayPatch{ { Type: ReplaceOverlayPatchType, - Path: utils.StringPointer("/spec/loadBalancerIP"), - Value: utils.StringPointer("5.6.7.8"), + Path: new("/spec/loadBalancerIP"), + Value: new("5.6.7.8"), }, { Type: ReplaceOverlayPatchType, - Path: utils.StringPointer("/spec/ports/0/name"), - Value: utils.StringPointer("port2"), + Path: new("/spec/ports/0/name"), + Value: new("port2"), }, { Type: DeleteOverlayPatchType, - Path: utils.StringPointer("/spec/ports/1"), + Path: new("/spec/ports/1"), }, }, }, @@ -140,17 +139,17 @@ func TestPatchYAMLModifier(t *testing.T) { Patches: []K8SResourceOverlayPatch{ { Type: ReplaceOverlayPatchType, - Path: utils.StringPointer("/spec/loadBalancerIP"), - Value: utils.StringPointer("5.6.7.8"), + Path: new("/spec/loadBalancerIP"), + Value: new("5.6.7.8"), }, { Type: ReplaceOverlayPatchType, - Path: utils.StringPointer("/spec/ports/0/name"), - Value: utils.StringPointer("port2"), + Path: new("/spec/ports/0/name"), + Value: new("port2"), }, { Type: DeleteOverlayPatchType, - Path: utils.StringPointer("/spec/ports/1"), + Path: new("/spec/ports/1"), }, }, }, @@ -165,17 +164,17 @@ func TestPatchYAMLModifier(t *testing.T) { Patches: []K8SResourceOverlayPatch{ { Type: ReplaceOverlayPatchType, - Path: utils.StringPointer("/spec/loadBalancerIP"), - Value: utils.StringPointer("5.6.7.8"), + Path: new("/spec/loadBalancerIP"), + Value: new("5.6.7.8"), }, { Type: ReplaceOverlayPatchType, - Path: utils.StringPointer("/spec/ports/0/name"), - Value: utils.StringPointer("port2"), + Path: new("/spec/ports/0/name"), + Value: new("port2"), }, { Type: DeleteOverlayPatchType, - Path: utils.StringPointer("/spec/ports/1"), + Path: new("/spec/ports/1"), }, }, }, diff --git a/pkg/resources/yamlmodifiers.go b/pkg/resources/yamlmodifiers.go index 8719692..4ac0a8c 100644 --- a/pkg/resources/yamlmodifiers.go +++ b/pkg/resources/yamlmodifiers.go @@ -25,8 +25,8 @@ func ReplaceAPIVersionYAMLModifier(from, to string) YAMLModifierFuncs { return func(y []byte) []byte { y = bytes.ReplaceAll( y, - []byte(fmt.Sprintf("apiVersion: %s", from)), - []byte(fmt.Sprintf("apiVersion: %s", to)), + fmt.Appendf(nil, "apiVersion: %s", from), + fmt.Appendf(nil, "apiVersion: %s", to), ) return y diff --git a/pkg/resources/zz_generated.deepcopy.go b/pkg/resources/zz_generated.deepcopy.go index c0c983d..51095d3 100644 --- a/pkg/resources/zz_generated.deepcopy.go +++ b/pkg/resources/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated // Copyright © 2020 Banzai Cloud diff --git a/pkg/secret/secret.go b/pkg/secret/secret.go index c78e756..af11900 100644 --- a/pkg/secret/secret.go +++ b/pkg/secret/secret.go @@ -75,7 +75,8 @@ func (k *secretLoader) Load(secret *Secret) (string, error) { secretItem := &corev1.Secret{} err := k.client.Get(context.TODO(), types.NamespacedName{ Name: secret.MountFrom.SecretKeyRef.Name, - Namespace: k.namespace}, secretItem) + Namespace: k.namespace, + }, secretItem) if err != nil { return "", errors.WrapIfWithDetails( err, "failed to load secret", "secret", secret.MountFrom.SecretKeyRef.Name, "namespace", k.namespace) @@ -88,7 +89,8 @@ func (k *secretLoader) Load(secret *Secret) (string, error) { k8sSecret := &corev1.Secret{} err := k.client.Get(context.TODO(), types.NamespacedName{ Name: secret.ValueFrom.SecretKeyRef.Name, - Namespace: k.namespace}, k8sSecret) + Namespace: k.namespace, + }, k8sSecret) if err != nil { return "", errors.WrapIff(err, "failed to get kubernetes secret %s:%s", k.namespace, diff --git a/pkg/secret/secret_types.go b/pkg/secret/secret_types.go index b36085c..18e1ccc 100644 --- a/pkg/secret/secret_types.go +++ b/pkg/secret/secret_types.go @@ -18,23 +18,25 @@ import ( corev1 "k8s.io/api/core/v1" ) -//nolint:unused,deadcode // +docName:"Secret abstraction" // Provides an abstraction to refer to secrets from other types // SecretLoader facilitates loading the secrets from an operator. // Leverages core types from kubernetes/api/core/v1 -type _docSecret interface{} - +// //nolint:unused,deadcode +type _docSecret any + // +name:"Secret" // +description:"Secret referencing abstraction" -type _metaSecret interface{} +// +//nolint:unused,deadcode +type _metaSecret any // +kubebuilder:object:generate=true type Secret struct { // Refers to a non-secret value - Value string `json:"value,omitempty"` + Value string `json:"value,omitempty"` // Refers to a secret value to be used directly ValueFrom *ValueFrom `json:"valueFrom,omitempty"` // Refers to a secret value to be used through a volume mount diff --git a/pkg/secret/secretgetter.go b/pkg/secret/secretgetter.go index f4b3972..61eba29 100644 --- a/pkg/secret/secretgetter.go +++ b/pkg/secret/secretgetter.go @@ -19,7 +19,6 @@ import ( "time" "emperror.dev/errors" - corev1 "k8s.io/api/core/v1" k8sErrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/pkg/typeoverride/override.go b/pkg/typeoverride/override.go index 6cffdf7..a070930 100644 --- a/pkg/typeoverride/override.go +++ b/pkg/typeoverride/override.go @@ -15,6 +15,8 @@ package typeoverride import ( + "maps" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/api/extensions/v1beta1" @@ -47,17 +49,13 @@ func (override *ObjectMeta) Merge(meta metav1.ObjectMeta) metav1.ObjectMeta { if meta.Annotations == nil { meta.Annotations = make(map[string]string) } - for key, val := range override.Annotations { - meta.Annotations[key] = val - } + maps.Copy(meta.Annotations, override.Annotations) } if len(override.Labels) > 0 { if meta.Labels == nil { meta.Labels = make(map[string]string) } - for key, val := range override.Labels { - meta.Labels[key] = val - } + maps.Copy(meta.Labels, override.Labels) } return meta } diff --git a/pkg/types/base_types.go b/pkg/types/base_types.go index a767c37..92a9521 100644 --- a/pkg/types/base_types.go +++ b/pkg/types/base_types.go @@ -15,6 +15,8 @@ package types import ( + "maps" + appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -87,7 +89,7 @@ func AggregatedState(componentStatuses []ReconcileStatus) ReconcileStatus { if cs != "" { statusMap[cs] = true } - if !(cs == "" || cs.Stable()) { + if cs != "" && !cs.Stable() { hasUnstable = true } } @@ -120,7 +122,7 @@ func (ec EnabledComponent) IsDisabled() bool { // IsEnabled returns true iff the component is explicitly enabled func (ec EnabledComponent) IsEnabled() bool { - return utils.PointerToBool(ec.Enabled) + return utils.DerefOrZero(ec.Enabled) } // IsSkipped returns true iff the component is neither enabled nor disabled explicitly @@ -145,17 +147,13 @@ func (base *MetaBase) Merge(meta metav1.ObjectMeta) metav1.ObjectMeta { if meta.Annotations == nil { meta.Annotations = make(map[string]string) } - for key, val := range base.Annotations { - meta.Annotations[key] = val - } + maps.Copy(meta.Annotations, base.Annotations) } if len(base.Labels) > 0 { if meta.Labels == nil { meta.Labels = make(map[string]string) } - for key, val := range base.Labels { - meta.Labels[key] = val - } + maps.Copy(meta.Labels, base.Labels) } return meta } @@ -312,7 +310,7 @@ func (base *DeploymentBase) Override(deployment appsv1.Deployment) appsv1.Deploy return deployment } if base.MetaBase != nil { - deployment.ObjectMeta = base.MetaBase.Merge(deployment.ObjectMeta) + deployment.ObjectMeta = base.Merge(deployment.ObjectMeta) } if base.Spec != nil { deployment.Spec = base.Spec.Override(deployment.Spec) @@ -362,7 +360,7 @@ func (base *StatefulSetBase) Override(statefulSet appsv1.StatefulSet) appsv1.Sta return statefulSet } if base.MetaBase != nil { - statefulSet.ObjectMeta = base.MetaBase.Merge(statefulSet.ObjectMeta) + statefulSet.ObjectMeta = base.Merge(statefulSet.ObjectMeta) } if base.Spec != nil { statefulSet.Spec = base.Spec.Override(statefulSet.Spec) @@ -416,7 +414,7 @@ func (base *DaemonSetBase) Override(daemonset appsv1.DaemonSet) appsv1.DaemonSet return daemonset } if base.MetaBase != nil { - daemonset.ObjectMeta = base.MetaBase.Merge(daemonset.ObjectMeta) + daemonset.ObjectMeta = base.Merge(daemonset.ObjectMeta) } if base.Spec != nil { daemonset.Spec = base.Spec.Override(daemonset.Spec) @@ -468,9 +466,7 @@ func mergeSelectors(base, spec *metav1.LabelSelector) *metav1.LabelSelector { if spec.MatchLabels == nil { spec.MatchLabels = make(map[string]string) } - for k, v := range base.MatchLabels { - spec.MatchLabels[k] = v - } + maps.Copy(spec.MatchLabels, base.MatchLabels) } if base.MatchExpressions != nil { spec.MatchExpressions = append(spec.MatchExpressions, base.MatchExpressions...) diff --git a/pkg/types/base_types_test.go b/pkg/types/base_types_test.go index 5012edd..7525d34 100644 --- a/pkg/types/base_types_test.go +++ b/pkg/types/base_types_test.go @@ -22,14 +22,12 @@ import ( appsv1 "k8s.io/api/apps/v1" v12 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/cisco-open/operator-tools/pkg/types" - "github.com/cisco-open/operator-tools/pkg/utils" ) func TestMetaBaseEmptyOverrideOnEmptyObject(t *testing.T) { - original := v1.ObjectMeta{} + original := metav1.ObjectMeta{} overrides := types.MetaBase{} result := overrides.Merge(original) @@ -44,7 +42,7 @@ func TestMetaBaseEmptyOverrideOnEmptyObject(t *testing.T) { } func TestMetaBaseOverrideOnEmptyObject(t *testing.T) { - original := v1.ObjectMeta{} + original := metav1.ObjectMeta{} overrides := types.MetaBase{ Annotations: map[string]string{ "annotation": "a", @@ -66,7 +64,7 @@ func TestMetaBaseOverrideOnEmptyObject(t *testing.T) { } func TestMetaBaseOverrideOnExistingObject(t *testing.T) { - original := v1.ObjectMeta{ + original := metav1.ObjectMeta{ Annotations: map[string]string{ "annotation": "a", }, @@ -108,7 +106,7 @@ func TestDeploymentBaseOverrideOnExistingObject(t *testing.T) { }, } overrides := types.DeploymentSpecBase{ - Replicas: utils.IntPointer(3), + Replicas: new(int32(3)), Selector: &metav1.LabelSelector{ MatchLabels: map[string]string{"foo": "bar", "bar": "baz"}, MatchExpressions: []metav1.LabelSelectorRequirement{ @@ -126,7 +124,7 @@ func TestDeploymentBaseOverrideOnExistingObject(t *testing.T) { result := overrides.Override(original) require.NotNil(t, result) - require.Equal(t, utils.IntPointer(3), result.Replicas) + require.Equal(t, new(int32(3)), result.Replicas) require.Equal(t, &metav1.LabelSelector{ MatchLabels: map[string]string{"tik": "tak", "foo": "bar", "bar": "baz"}, @@ -157,8 +155,8 @@ func TestDeploymentBaseOverride(t *testing.T) { { name: "nil", base: nil, - spec: appsv1.DeploymentSpec{Replicas: utils.IntPointer(77)}, - want: appsv1.DeploymentSpec{Replicas: utils.IntPointer(77)}, + spec: appsv1.DeploymentSpec{Replicas: new(int32(77))}, + want: appsv1.DeploymentSpec{Replicas: new(int32(77))}, }, { name: "empty", @@ -168,16 +166,17 @@ func TestDeploymentBaseOverride(t *testing.T) { }, { name: "override replicates", - base: &types.DeploymentSpecBase{Replicas: utils.IntPointer(3)}, + base: &types.DeploymentSpecBase{Replicas: new(int32(3))}, spec: appsv1.DeploymentSpec{}, - want: appsv1.DeploymentSpec{Replicas: utils.IntPointer(3)}, + want: appsv1.DeploymentSpec{Replicas: new(int32(3))}, }, { name: "override deploymentStrategy", base: &types.DeploymentSpecBase{ Strategy: &appsv1.DeploymentStrategy{ Type: appsv1.RecreateDeploymentStrategyType, - }}, + }, + }, spec: appsv1.DeploymentSpec{}, want: appsv1.DeploymentSpec{ Strategy: appsv1.DeploymentStrategy{ @@ -248,7 +247,7 @@ func TestDeploymentBaseOverride(t *testing.T) { name: "merge empty base", base: &types.DeploymentSpecBase{}, spec: appsv1.DeploymentSpec{ - Replicas: utils.IntPointer(77), + Replicas: new(int32(77)), Selector: &metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -264,7 +263,7 @@ func TestDeploymentBaseOverride(t *testing.T) { }, }, want: appsv1.DeploymentSpec{ - Replicas: utils.IntPointer(77), + Replicas: new(int32(77)), Selector: &metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -283,7 +282,7 @@ func TestDeploymentBaseOverride(t *testing.T) { { name: "merge base to empty spec", base: &types.DeploymentSpecBase{ - Replicas: utils.IntPointer(3), + Replicas: new(int32(3)), Selector: &metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -300,7 +299,7 @@ func TestDeploymentBaseOverride(t *testing.T) { }, spec: appsv1.DeploymentSpec{}, want: appsv1.DeploymentSpec{ - Replicas: utils.IntPointer(3), + Replicas: new(int32(3)), Selector: &metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -318,14 +317,12 @@ func TestDeploymentBaseOverride(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { if got := tt.base.Override(tt.spec); !reflect.DeepEqual(got, tt.want) { t.Errorf("base.Override() = \n%#v\nwant\n%#v\n", got, tt.want) } }) } - } func TestStatefulsetBaseOverride(t *testing.T) { @@ -338,8 +335,8 @@ func TestStatefulsetBaseOverride(t *testing.T) { { name: "nil", base: nil, - spec: appsv1.StatefulSetSpec{Replicas: utils.IntPointer(77)}, - want: appsv1.StatefulSetSpec{Replicas: utils.IntPointer(77)}, + spec: appsv1.StatefulSetSpec{Replicas: new(int32(77))}, + want: appsv1.StatefulSetSpec{Replicas: new(int32(77))}, }, { name: "empty", @@ -349,9 +346,9 @@ func TestStatefulsetBaseOverride(t *testing.T) { }, { name: "override replicates", - base: &types.StatefulsetSpecBase{Replicas: utils.IntPointer(3)}, + base: &types.StatefulsetSpecBase{Replicas: new(int32(3))}, spec: appsv1.StatefulSetSpec{}, - want: appsv1.StatefulSetSpec{Replicas: utils.IntPointer(3)}, + want: appsv1.StatefulSetSpec{Replicas: new(int32(3))}, }, { name: "override podManagementPolicy", @@ -365,15 +362,16 @@ func TestStatefulsetBaseOverride(t *testing.T) { UpdateStrategy: &appsv1.StatefulSetUpdateStrategy{ Type: appsv1.OnDeleteStatefulSetStrategyType, RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{ - Partition: utils.IntPointer(33), + Partition: new(int32(33)), }, - }}, + }, + }, spec: appsv1.StatefulSetSpec{}, want: appsv1.StatefulSetSpec{ UpdateStrategy: appsv1.StatefulSetUpdateStrategy{ Type: appsv1.OnDeleteStatefulSetStrategyType, RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{ - Partition: utils.IntPointer(33), + Partition: new(int32(33)), }, }, }, @@ -441,7 +439,7 @@ func TestStatefulsetBaseOverride(t *testing.T) { name: "merge empty base", base: &types.StatefulsetSpecBase{}, spec: appsv1.StatefulSetSpec{ - Replicas: utils.IntPointer(77), + Replicas: new(int32(77)), Selector: &metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -455,12 +453,12 @@ func TestStatefulsetBaseOverride(t *testing.T) { UpdateStrategy: appsv1.StatefulSetUpdateStrategy{ Type: appsv1.OnDeleteStatefulSetStrategyType, RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{ - Partition: utils.IntPointer(33), + Partition: new(int32(33)), }, }, }, want: appsv1.StatefulSetSpec{ - Replicas: utils.IntPointer(77), + Replicas: new(int32(77)), Selector: &metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -474,7 +472,7 @@ func TestStatefulsetBaseOverride(t *testing.T) { UpdateStrategy: appsv1.StatefulSetUpdateStrategy{ Type: appsv1.OnDeleteStatefulSetStrategyType, RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{ - Partition: utils.IntPointer(33), + Partition: new(int32(33)), }, }, }, @@ -482,7 +480,7 @@ func TestStatefulsetBaseOverride(t *testing.T) { { name: "merge base to empty spec", base: &types.StatefulsetSpecBase{ - Replicas: utils.IntPointer(3), + Replicas: new(int32(3)), Selector: &metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -496,13 +494,13 @@ func TestStatefulsetBaseOverride(t *testing.T) { UpdateStrategy: &appsv1.StatefulSetUpdateStrategy{ Type: appsv1.OnDeleteStatefulSetStrategyType, RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{ - Partition: utils.IntPointer(33), + Partition: new(int32(33)), }, }, }, spec: appsv1.StatefulSetSpec{}, want: appsv1.StatefulSetSpec{ - Replicas: utils.IntPointer(3), + Replicas: new(int32(3)), Selector: &metav1.LabelSelector{ MatchExpressions: []metav1.LabelSelectorRequirement{ { @@ -516,14 +514,13 @@ func TestStatefulsetBaseOverride(t *testing.T) { UpdateStrategy: appsv1.StatefulSetUpdateStrategy{ Type: appsv1.OnDeleteStatefulSetStrategyType, RollingUpdate: &appsv1.RollingUpdateStatefulSetStrategy{ - Partition: utils.IntPointer(33), + Partition: new(int32(33)), }, }, }, }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { if got := tt.base.Override(tt.spec); !reflect.DeepEqual(got, tt.want) { t.Errorf("base.Override() = \n%#v\nwant\n%#v\n", got, tt.want) @@ -547,13 +544,13 @@ func TestStatefulSetOverride(t *testing.T) { "old": "old-value", }, }}, - spec: appsv1.StatefulSet{ObjectMeta: v1.ObjectMeta{ + spec: appsv1.StatefulSet{ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ "override": "ooo", "new": "new-value", }, }}, - want: appsv1.StatefulSet{ObjectMeta: v1.ObjectMeta{ + want: appsv1.StatefulSet{ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ "override": "winning", "old": "old-value", @@ -565,23 +562,22 @@ func TestStatefulSetOverride(t *testing.T) { name: "spec gets merged", base: &types.StatefulSetBase{ Spec: &types.StatefulsetSpecBase{ - Replicas: utils.IntPointer(12), + Replicas: new(int32(12)), }, }, spec: appsv1.StatefulSet{ Spec: appsv1.StatefulSetSpec{ - Replicas: utils.IntPointer(1), + Replicas: new(int32(1)), }, }, want: appsv1.StatefulSet{ Spec: appsv1.StatefulSetSpec{ - Replicas: utils.IntPointer(12), + Replicas: new(int32(12)), }, }, }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { if got := tt.base.Override(tt.spec); !reflect.DeepEqual(got, tt.want) { t.Errorf("base.Override() = \n%#v\nwant\n%#v\n", got, tt.want) @@ -677,7 +673,6 @@ func TestPodSpecOverride(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { if got := tt.base.Override(tt.spec); !reflect.DeepEqual(got, tt.want) { t.Errorf("base.Override() = \n%#v\nwant\n%#v\n", got, tt.want) @@ -716,7 +711,6 @@ func TestPodTemplateOverride(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { if got := tt.base.Override(tt.spec); !reflect.DeepEqual(got, tt.want) { t.Errorf("base.Override() = \n%#v\nwant\n%#v\n", got, tt.want) diff --git a/pkg/utils/log.go b/pkg/utils/log.go index e075e25..108823a 100644 --- a/pkg/utils/log.go +++ b/pkg/utils/log.go @@ -18,6 +18,7 @@ import ( "fmt" "io" "os" + "strings" "emperror.dev/errors" "github.com/go-logr/logr" @@ -31,26 +32,26 @@ var Log = NewLogger("", os.Stderr, os.Stderr, 0) func NewLogger(name string, out, err io.Writer, level int) logr.Logger { sink := &logSink{ name: name, - values: make([]interface{}, 0), + values: make([]any, 0), out: out, err: err, } return logr.New(sink).V(level) } -func joinAndSeparatePairs(values []interface{}) string { - joined := "" +func joinAndSeparatePairs(values []any) string { + var joined strings.Builder for i, v := range values { - joined += cast.ToString(v) + joined.WriteString(cast.ToString(v)) if i%2 == 0 { - joined += ": " + joined.WriteString(": ") } else { if i < len(values)-1 { - joined += ", " + joined.WriteString(", ") } } } - return joined + return joined.String() } func getDetailedErr(err error) string { @@ -63,7 +64,7 @@ func getDetailedErr(err error) string { type logSink struct { name string - values []interface{} + values []any out io.Writer err io.Writer } @@ -74,7 +75,7 @@ func (s logSink) Enabled(level int) bool { return GlobalLogLevel >= level } -func (s logSink) Info(level int, msg string, keysAndValues ...interface{}) { +func (s logSink) Info(level int, msg string, keysAndValues ...any) { if !s.Enabled(level) { return } @@ -86,7 +87,7 @@ func (s logSink) Info(level int, msg string, keysAndValues ...interface{}) { } } -func (s logSink) Error(err error, msg string, keysAndValues ...interface{}) { +func (s logSink) Error(err error, msg string, keysAndValues ...any) { s.values = append(s.values, keysAndValues...) if len(s.values) == 0 { _, _ = fmt.Fprintf(s.err, "%s> %s %s\n", s.name, msg, getDetailedErr(err)) @@ -95,7 +96,7 @@ func (s logSink) Error(err error, msg string, keysAndValues ...interface{}) { } } -func (s logSink) WithValues(keysAndValues ...interface{}) logr.LogSink { +func (s logSink) WithValues(keysAndValues ...any) logr.LogSink { l := len(s.values) s.values = append(s.values[:l:l], keysAndValues...) return s diff --git a/pkg/utils/sort.go b/pkg/utils/sort.go index e702852..f94af1b 100644 --- a/pkg/utils/sort.go +++ b/pkg/utils/sort.go @@ -21,9 +21,11 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -type RuntimeObjects []runtime.Object -type ResourceOrder string -type ResourceScoreFunc func(o runtime.Object) int +type ( + RuntimeObjects []runtime.Object + ResourceOrder string + ResourceScoreFunc func(o runtime.Object) int +) const ( InstallResourceOrder ResourceOrder = "Install" @@ -68,7 +70,7 @@ func (os RuntimeObjects) Sort(order ResourceOrder) { } func InstallObjectOrder() func(o runtime.Object) int { - var Order = []string{ + Order := []string{ "CustomResourceDefinition", "Namespace", "ResourceQuota", @@ -118,7 +120,7 @@ func InstallObjectOrder() func(o runtime.Object) int { } func UninstallObjectOrder() func(o runtime.Object) int { - var Order = []string{ + Order := []string{ "MutatingWebhookConfiguration", "ValidatingWebhookConfiguration", "APIService", diff --git a/pkg/utils/types.go b/pkg/utils/types.go index 11ecc71..d403bb6 100644 --- a/pkg/utils/types.go +++ b/pkg/utils/types.go @@ -17,6 +17,8 @@ package utils import ( "fmt" "hash/fnv" + "maps" + "slices" "sort" "emperror.dev/errors" @@ -29,71 +31,21 @@ import ( func MergeLabels(labelGroups ...map[string]string) map[string]string { mergedLabels := make(map[string]string) for _, labels := range labelGroups { - for k, v := range labels { - mergedLabels[k] = v - } + maps.Copy(mergedLabels, labels) } return mergedLabels } -func PointerToBool(b *bool) bool { - if b == nil { - return false - } - - return *b -} - -func PointerToUint(i *uint) uint { - if i == nil { - return 0 - } - - return *i -} - -func PointerToInt(i *int) int { - if i == nil { - return 0 - } - - return *i -} - -func PointerToInt32(i *int32) int32 { - if i == nil { - return 0 - } - - return *i +// DerefOrZero returns the value referenced by p, or the zero-value of the type +func DerefOrZero[T any](p *T) T { + return DerefOr(p, *new(T)) } -func PointerToString(s *string) string { - if s == nil { - return "" +func DerefOr[T any](p *T, defVal T) T { + if p == nil { + return defVal } - - return *s -} - -// IntPointer converts int32 to *int32 -func IntPointer(i int32) *int32 { - return &i -} - -// IntPointer converts int64 to *int64 -func IntPointer64(i int64) *int64 { - return &i -} - -// BoolPointer converts bool to *bool -func BoolPointer(b bool) *bool { - return &b -} - -// StringPointer converts string to *string -func StringPointer(s string) *string { - return &s + return *p } // OrderedStringMap @@ -108,12 +60,7 @@ func OrderedStringMap(original map[string]string) *orderedmap.OrderedMap { // Contains check if a string item exists in []string func Contains(s []string, e string) bool { - for _, i := range s { - if i == e { - return true - } - } - return false + return slices.Contains(s, e) } // Hash32 calculate for string diff --git a/pkg/volume/volume_types.go b/pkg/volume/volume_types.go index fa7e24b..0eedfdf 100644 --- a/pkg/volume/volume_types.go +++ b/pkg/volume/volume_types.go @@ -28,13 +28,13 @@ import ( // Leverages core types from kubernetes/api/core/v1 // //nolint:unused,deadcode -type _docKubernetesVolume interface{} +type _docKubernetesVolume any // +name:"KubernetesVolume" // +description:"Kubernetes volume abstraction" // //nolint:unused,deadcode -type _metaKubernetesVolume interface{} +type _metaKubernetesVolume any // +kubebuilder:object:generate=true diff --git a/pkg/wait/checks.go b/pkg/wait/checks.go index 2a9439f..777f9a0 100644 --- a/pkg/wait/checks.go +++ b/pkg/wait/checks.go @@ -23,8 +23,10 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -type ResourceConditionCheck func(runtime.Object, error) bool -type CustomResourceConditionCheck func() (bool, error) +type ( + ResourceConditionCheck func(runtime.Object, error) bool + CustomResourceConditionCheck func() (bool, error) +) func ExistsConditionCheck(obj runtime.Object, k8serror error) bool { return k8serror == nil diff --git a/pkg/wait/wait.go b/pkg/wait/wait.go index aa7eb33..363f20c 100644 --- a/pkg/wait/wait.go +++ b/pkg/wait/wait.go @@ -41,7 +41,7 @@ type ResourceConditionChecks struct { func NewResourceConditionChecks(client client.Client, backoff Backoff, log logr.Logger, scheme *runtime.Scheme) *ResourceConditionChecks { return &ResourceConditionChecks{ client: client, - backoff: wait.Backoff(backoff), + backoff: backoff, log: log, scheme: scheme, } @@ -133,7 +133,6 @@ func (c *ResourceConditionChecks) waitForResourceConditions(object runtime.Objec return true, nil }) - if err != nil { return err } @@ -143,7 +142,7 @@ func (c *ResourceConditionChecks) waitForResourceConditions(object runtime.Objec return nil } -func (r *ResourceConditionChecks) resourceDetails(desired runtime.Object) (values []interface{}) { +func (r *ResourceConditionChecks) resourceDetails(desired runtime.Object) (values []any) { m, err := meta.Accessor(desired) key := client.ObjectKey{Namespace: m.GetNamespace(), Name: m.GetName()} if err == nil {