diff --git a/.gitignore b/.gitignore index 19923b3adf6..2cbabe79ff8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,8 +11,5 @@ cache/ test-upgrade/ -# must-gather -must-gather/oadp-must-gather -must-gather/must-gather/ -must-gather/must-gather.local.*/ +# must-gather e2e output tests/e2e/must-gather/ diff --git a/Makefile b/Makefile index ec6bb15a2a4..eef13c9f2ab 100644 --- a/Makefile +++ b/Makefile @@ -622,7 +622,7 @@ endif SETTINGS_TMP=/tmp/test-settings .PHONY: test-e2e-setup -test-e2e-setup: login-required build-must-gather +test-e2e-setup: login-required mkdir -p $(SETTINGS_TMP) TMP_DIR=$(SETTINGS_TMP) \ OPENSHIFT_CI="$(OPENSHIFT_CI)" \ @@ -638,8 +638,30 @@ test-e2e-setup: login-required build-must-gather BSL_AWS_PROFILE="$(BSL_AWS_PROFILE)" \ /bin/bash "tests/e2e/scripts/$(CLUSTER_TYPE)_settings.sh" +TTL_DURATION ?= 1h +MUST_GATHER_REPO ?= +MUST_GATHER_BRANCH ?= oadp-1.4 +ifneq ($(MUST_GATHER_REPO),) +MUST_GATHER_IMAGE ?= ttl.sh/oadp-must-gather-$(MUST_GATHER_BRANCH)-$(GIT_REV):$(TTL_DURATION) +else +MUST_GATHER_IMAGE ?= quay.io/konveyor/oadp-must-gather:oadp-1.4 +endif + +.PHONY: build-must-gather +build-must-gather: ## Build must-gather image from GitHub source. Requires MUST_GATHER_REPO (e.g., openshift/oadp-must-gather). Uses MUST_GATHER_BRANCH (default: oadp-1.4). +ifeq ($(MUST_GATHER_REPO),) + $(error MUST_GATHER_REPO is required (e.g., openshift/oadp-must-gather)) +endif + $(eval MUST_GATHER_TMP := $(shell mktemp -d)) + git clone --depth=1 --branch $(MUST_GATHER_BRANCH) https://github.com/$(MUST_GATHER_REPO).git $(MUST_GATHER_TMP) + $(CONTAINER_TOOL) build --load -t $(MUST_GATHER_IMAGE) -f $(MUST_GATHER_TMP)/Dockerfile $(MUST_GATHER_TMP) + $(CONTAINER_TOOL) push $(MUST_GATHER_IMAGE) + rm -rf $(MUST_GATHER_TMP) + @echo "Must-gather image built and pushed: $(MUST_GATHER_IMAGE)" + .PHONY: test-e2e -test-e2e: test-e2e-setup install-ginkgo +test-e2e: test-e2e-setup install-ginkgo $(if $(MUST_GATHER_REPO),build-must-gather) + MUST_GATHER_IMAGE=$(MUST_GATHER_IMAGE) \ ginkgo run -mod=mod tests/e2e/ -- \ -settings=$(SETTINGS_TMP)/oadpcreds \ -provider=$(CLUSTER_TYPE) \ @@ -751,6 +773,3 @@ $(YQ): $(LOCALBIN) fi @ln -sf "$(LOCALBIN)/$(BRANCH_VERSION)/yq" "$(LOCALBIN)/yq" -.PHONY: build-must-gather -build-must-gather: check-go ## Build OADP Must-gather binary must-gather/oadp-must-gather - cd must-gather && go build -mod=mod -a -o oadp-must-gather cmd/main.go diff --git a/docs/developer/testing/TESTING.md b/docs/developer/testing/TESTING.md index 60e41a80b12..649f62751b9 100644 --- a/docs/developer/testing/TESTING.md +++ b/docs/developer/testing/TESTING.md @@ -22,6 +22,9 @@ To get started, you need to provide the following **required** environment varia | `OADP_TEST_NAMESPACE` | The namespace where OADP operator is installed | `openshift-adp` | false | | `OPENSHIFT_CI` | Disable colored output from tests suite run | `true` | false | | `TEST_VIRT` | Exclusively run Virtual Machine backup/restore testing | `false` | false | +| `MUST_GATHER_IMAGE` | Container image to use for must-gather collection via `oc adm must-gather` | `quay.io/konveyor/oadp-must-gather:oadp-1.4` | false | +| `MUST_GATHER_REPO` | GitHub repo (e.g., `openshift/oadp-must-gather`) to build must-gather from source. Sets `MUST_GATHER_IMAGE` to a ttl.sh image automatically | - | false | +| `MUST_GATHER_BRANCH` | Branch to use when building from `MUST_GATHER_REPO` | `oadp-1.4` | false | The expected format for `OADP_CRED_FILE` and `CI_CRED_FILE` files is: ``` diff --git a/must-gather/Dockerfile b/must-gather/Dockerfile deleted file mode 100644 index 27f1f34f952..00000000000 --- a/must-gather/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -FROM --platform=$BUILDPLATFORM quay.io/konveyor/builder:ubi9-latest AS builder -ARG BUILDPLATFORM -ARG TARGETOS -ARG TARGETARCH -ARG KOPIA_BRANCH=oadp-1.4 -ARG RESTIC_BRANCH=oadp-1.4 - -WORKDIR /workspace - -COPY go.mod go.mod -COPY go.sum go.sum - -RUN go mod download - -COPY cmd/main.go cmd/main.go -COPY pkg/ pkg/ -COPY deprecated/ deprecated/ - -RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -mod=mod -a -o gather cmd/main.go - -RUN curl --location --output kopia.tgz https://github.com/migtools/kopia/archive/refs/heads/${KOPIA_BRANCH}.tar.gz && \ - tar -xzvf kopia.tgz && cd kopia-${KOPIA_BRANCH} && \ - CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -mod=mod -a -ldflags '-extldflags "-static"' -o /kopia github.com/kopia/kopia && \ - cd .. && rm -rf kopia.tgz kopia-${KOPIA_BRANCH} - -RUN curl --location --output restic.tgz https://github.com/openshift/restic/archive/refs/heads/${RESTIC_BRANCH}.tar.gz && \ - tar -xzvf restic.tgz && cd restic-${RESTIC_BRANCH} && \ - CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -mod=mod -a -ldflags '-extldflags "-static"' -o /restic github.com/restic/restic/cmd/restic && \ - cd .. && rm -rf restic.tgz restic-${RESTIC_BRANCH} - -FROM registry.access.redhat.com/ubi9-minimal:latest - -# oc adm must-gather uses these packages to download the output -RUN microdnf -y install rsync tar - -COPY --from=builder /workspace/gather /usr/bin/gather -COPY --from=builder /workspace/deprecated/* /usr/bin/ -COPY --from=builder /kopia /usr/bin/kopia -COPY --from=builder /restic /usr/bin/restic - -ENTRYPOINT ["/usr/bin/gather"] diff --git a/must-gather/Dockerfile.oadp b/must-gather/Dockerfile.oadp deleted file mode 100644 index 399bfae5368..00000000000 --- a/must-gather/Dockerfile.oadp +++ /dev/null @@ -1,67 +0,0 @@ -# upstream src https://github.com/openshift/oadp-operator/blob/master/must-gather/Dockerfile - -# oc -#@follow_tag(registry-proxy.engineering.redhat.com/rh-osbs/openshift-ose-cli-rhel9:v4.18) -FROM brew.registry.redhat.io/rh-osbs/openshift-ose-cli-rhel9:v4.18 AS ose-cli - -#@follow_tag(registry-proxy.engineering.redhat.com/rh-osbs/openshift-golang-builder:rhel_9_golang_1.25) -FROM brew.registry.redhat.io/rh-osbs/openshift-golang-builder:rhel_9_golang_1.25 AS builder - -COPY . /workspace -USER root -RUN chown -R 1001:0 /workspace -USER 1001 - -# mustgather -WORKDIR /workspace/must-gather/ -RUN CGO_ENABLED=1 GOOS=linux go build -a -mod=mod -tags strictfipsruntime -o ./gather cmd/main.go - -# kopia -WORKDIR /workspace/must-gather/kopia/ -RUN CGO_ENABLED=1 GOOS=linux go build -a -mod=mod -tags strictfipsruntime -o ./kopia - -####################################################################### -####################################################################### -# # -# W W AA RRRR N N III N N GGG # -# W W A A R R NN N I NN N G # -# W W W AAAA RRRR N N N I N N N G GG # -# W W W A A R R N NN I N NN G G # -# W W A A R RR N N III N N GGG # -# # -# Any changes to the `velero` and `restic` sections below must also # -# be reconciled in oadp-velero/Dockerfile.in for consistency. # -####################################################################### -# BEGIN # -####################################################################### - -# velero -WORKDIR /workspace/must-gather/velero/ -ENV GOEXPERIMENT strictfipsruntime -RUN CGO_ENABLED=1 GOOS=linux go build -a -mod=mod -ldflags '-X github.com/vmware-tanzu/velero/pkg/buildinfo.Version=v1.14.1-OADP' -tags strictfipsruntime -o ./bin/velero ./cmd/velero - -# restic -WORKDIR /workspace/must-gather/restic/ -ENV GOEXPERIMENT strictfipsruntime -RUN CGO_ENABLED=1 GOOS=linux go build -a -mod=mod -tags strictfipsruntime -o ./bin/restic ./cmd/restic - -####################################################################### -# END # -####################################################################### - -ENV INSTALLATION_NAMESPACE openshift-adp - -#@follow_tag(registry.redhat.io/ubi9/ubi-minimal:latest) -FROM registry.redhat.io/ubi9/ubi-minimal:latest -RUN microdnf -y reinstall tzdata && microdnf clean all -RUN microdnf -y install openssl rsync tar gzip && microdnf -y clean all - -COPY --from=builder /workspace/must-gather/velero/bin/velero /usr/bin/velero -COPY --from=builder /workspace/must-gather/restic/bin/restic /usr/bin/restic -COPY --from=ose-cli /usr/bin/oc /usr/bin/oc -COPY --from=builder /workspace/must-gather/kopia/kopia /usr/bin/kopia -COPY --from=builder /workspace/must-gather/gather /usr/bin/gather -COPY --from=builder /workspace/must-gather/deprecated/gather_* /usr/bin/ - -ENTRYPOINT /usr/bin/gather - diff --git a/must-gather/README.md b/must-gather/README.md deleted file mode 100644 index 6fe3cbc3afb..00000000000 --- a/must-gather/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# OADP Must-gather - -To test OADP Must-gather, run -```sh -go run cmd/main.go -h -go run cmd/main.go -``` - -To test OADP Must-gather with `oc adm must-gather`, run -```sh -podman build -t ttl.sh/oadp/must-gather-$(git rev-parse --short HEAD)-$(echo $RANDOM):1h -f Dockerfile . --platform= -podman push -oc adm must-gather --image= -- /usr/bin/gather -h -oc adm must-gather --image= -``` -OADP Must-gather is also tested through OADP E2E tests, being run after test cases and checking if summary does not contain errors and all required objects were collected. - -To test omg tool, create `omg.Dockerfile` file -```Dockerfile -FROM python:3.10.12-slim-bullseye - -WORKDIR /test-omg -COPY ./ ./ -RUN pip install o-must-gather -``` -and run -```sh -podman build -t omg-container -f omg.Dockerfile . -podman run -ti --rm omg-container bash -# inside container -omg use must-gather/clusters/ -omg get backup -n # and other OADP resources -``` - -To update OADP Must-gather `go.mod` dependencies, run -```sh -go get github.com/openshift/oadp-operator@master -go get github.com/migtools/oadp-non-admin@master -# manually update github.com/openshift/velero version in replace section of go.mod to match OADP operator -go mod tidy -go mod verify -``` -Update it often. It must be updated prior to releases. - -Possible necessary updates over the time -```sh -go get github.com/openshift/oc@ -go mod tidy -go mod verify -``` - -## OADP release - -Prior to each release, OADP Must-gather must be updated. - -To update OADP Must-gather `go.mod` dependencies, run -```sh -go get github.com/openshift/oadp-operator@ -go get github.com/migtools/oadp-non-admin@ -# manually update github.com/openshift/velero version in replace section of go.mod to match OADP operator -go mod tidy -go mod verify -``` - -`must-gather/pkg/cli.go` file must be updated -```diff - const ( -- mustGatherVersion = "1.5.0" -+ mustGatherVersion = "1.5.1" - mustGatherImage = "registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.5" -``` - -> **Note:** If it is a minor release, `mustGatherImage` must also be updated. - -## Deprecated folder - -Scripts under `deprecated/` folder are for backwards compatibility with old OADP Must-gather shell script. Users should use new OADP Must-gather Go script, as highlighted in product documentation. - -## Standards - -OADP Must-gather must comply with https://github.com/openshift/enhancements/blob/995b620cb04c030bf62c908e188472fe7031a704/enhancements/oc/must-gather.md?plain=1#L94-L104 - ->1. Must have a zero-arg, executable file at `/usr/bin/gather` that does your default gathering - -OADP Must-gather binary can be called without args. All OADP Must-gather binary args are optional - ->2. Must produce data to be copied back at `/must-gather`. The data must not contain any sensitive data. We don't string PII information, only secret information. - -OADP Must-gather collected data is stored at `/must-gather` folder in the same path the binary was called. - -Most of the data is collected through `oc adm inspect` command (including Secrets). The other data are cluster information, OADP related information (CRDs and CRs) and storage information (StorageClasses, VolumeSnapshotClasses and CSIDrivers CRDs and CRs). These objects should not contain any sensitive data. - ->3. Must produce a text `/must-gather/version` that indicates the product (first line) and the version (second line, `major.minor.micro-qualifier`), -> so that programmatic analysis can be developed. - -OADP Must-gather stores version information in `/must-gather/version` file - -Example content of the file -```txt -OpenShift API for Data Protection (OADP) Must-gather -master-branch -``` - ->4. Should honor the user-provided values for `--since` and `--since-time`, which are passed to plugins via -> environment variables named `MUST_GATHER_SINCE` and `MUST_GATHER_SINCE_TIME`, respectively. - -TODO `oc adm inspect` command is called through Go code. But both `since` and `since-time` are private. Need to change this in https://github.com/openshift/oc/blob/ae1bd9e4a75b8ab617a569e5c8e1a0d7285a16f6/pkg/cli/admin/inspect/inspect.go#L118-L119 to allow usage in OADP Must-gather diff --git a/must-gather/cmd/main.go b/must-gather/cmd/main.go deleted file mode 100644 index 257393d0710..00000000000 --- a/must-gather/cmd/main.go +++ /dev/null @@ -1,26 +0,0 @@ -package main - -import ( - "os" - - "github.com/spf13/cobra" - - "github.com/openshift/oadp-operator/must-gather/pkg" -) - -func init() { - pkg.CLI.Flags().DurationVarP(&pkg.RequestTimeout, "request-timeout", "r", pkg.DefaultRequestTimeout, "Timeout per OADP server request (like collecting logs from a backup)") - pkg.CLI.Flags().BoolVarP(&pkg.SkipTLS, "skip-tls", "s", false, "Run OADP server requests with insecure TLS connections (recommended if a custom CA certificate is used) (default false)") - // TODO caCertFile? - pkg.CLI.Flags().BoolP("help", "h", false, "Show OADP Must-gather help message.") - - pkg.CLI.SetHelpCommand(&cobra.Command{Hidden: true, Use: ""}) -} - -func main() { - // TODO JSON output in the future? - err := pkg.CLI.Execute() - if err != nil { - os.Exit(1) - } -} diff --git a/must-gather/deprecated/gather_1h b/must-gather/deprecated/gather_1h deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_1h +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_1h_essential b/must-gather/deprecated/gather_1h_essential deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_1h_essential +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_24h b/must-gather/deprecated/gather_24h deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_24h +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_24h_essential b/must-gather/deprecated/gather_24h_essential deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_24h_essential +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_6h b/must-gather/deprecated/gather_6h deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_6h +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_6h_essential b/must-gather/deprecated/gather_6h_essential deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_6h_essential +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_72h b/must-gather/deprecated/gather_72h deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_72h +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_72h_essential b/must-gather/deprecated/gather_72h_essential deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_72h_essential +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_all b/must-gather/deprecated/gather_all deleted file mode 100755 index 074594c22cc..00000000000 --- a/must-gather/deprecated/gather_all +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -echo "This script is deprecated, use /usr/bin/gather instead" -logs_since="${logs_since}" -skip_tls="${skip_tls}" -request_timeout="${request_timeout}" -if [ ! -z "${logs_since}" ]; then - echo "logs_since variable is not supported anymore" - exit 1 -fi -if [ ! -z "${skip_tls}" ] && [ ! -z "${request_timeout}" ]; then - echo "insecure-skip-tls-verify: ${skip_tls}" - echo "timeout: ${request_timeout}" - /usr/bin/gather --skip-tls=${skip_tls} --request-timeout=${request_timeout} - exit -fi -if [ ! -z "${skip_tls}" ]; then - echo "insecure-skip-tls-verify: ${skip_tls}" - /usr/bin/gather --skip-tls=${skip_tls} - exit -fi -if [ ! -z "${request_timeout}" ]; then - echo "timeout: ${request_timeout}" - /usr/bin/gather --request-timeout=${request_timeout} - exit -fi -/usr/bin/gather diff --git a/must-gather/deprecated/gather_all_essential b/must-gather/deprecated/gather_all_essential deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_all_essential +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_metrics_dump b/must-gather/deprecated/gather_metrics_dump deleted file mode 100755 index 1040aa674de..00000000000 --- a/must-gather/deprecated/gather_metrics_dump +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -echo "This script is not supported anymore, use /usr/bin/gather instead" -echo "/usr/bin/gather help" -/usr/bin/gather -h -exit 1 diff --git a/must-gather/deprecated/gather_with_timeout b/must-gather/deprecated/gather_with_timeout deleted file mode 100755 index 0b01a3056be..00000000000 --- a/must-gather/deprecated/gather_with_timeout +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -echo "This script is deprecated, use /usr/bin/gather instead" -logs_since="${logs_since}" -skip_tls="${skip_tls}" -echo "timeout: $1" -if [ ! -z "${logs_since}" ]; then - echo "logs_since variable is not supported anymore" - exit 1 -fi -if [ ! -z "${skip_tls}" ]; then - echo "insecure-skip-tls-verify: ${skip_tls}" - /usr/bin/gather --request-timeout=$1 --skip-tls=${skip_tls} - exit -fi -/usr/bin/gather --request-timeout=$1 diff --git a/must-gather/deprecated/gather_without_tls b/must-gather/deprecated/gather_without_tls deleted file mode 100755 index 5eb803ce298..00000000000 --- a/must-gather/deprecated/gather_without_tls +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -echo "This script is deprecated, use /usr/bin/gather instead" -echo "insecure-skip-tls-verify: $1" -logs_since="${logs_since}" -request_timeout="${request_timeout}" -if [ ! -z "${logs_since}" ]; then - echo "logs_since variable is not supported anymore" - exit 1 -fi -if [ ! -z "${request_timeout}" ]; then - echo "timeout: ${request_timeout}" - /usr/bin/gather --skip-tls=$1 --request-timeout=${request_timeout} - exit -fi -/usr/bin/gather --skip-tls=$1 diff --git a/must-gather/go.mod b/must-gather/go.mod deleted file mode 100644 index 5b3bed89fdd..00000000000 --- a/must-gather/go.mod +++ /dev/null @@ -1,191 +0,0 @@ -module github.com/openshift/oadp-operator/must-gather - -go 1.23.1 - -toolchain go1.23.4 - -require ( - github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 - github.com/openshift/api v0.0.0-20240410141538-3c0461467316 - github.com/openshift/oadp-operator v1.0.2-0.20250403192318-6d871184bfdc - github.com/openshift/oc v0.0.0-alpha.0.0.20250305035534-ee354f66de43 - github.com/operator-framework/api v0.22.0 - github.com/spf13/cobra v1.8.1 - github.com/vmware-tanzu/velero v1.14.0 - k8s.io/api v0.29.7 - k8s.io/apiextensions-apiserver v0.29.7 - k8s.io/apimachinery v0.29.7 - k8s.io/cli-runtime v0.29.7 - k8s.io/client-go v0.29.7 - sigs.k8s.io/controller-runtime v0.17.2 -) - -require ( - cloud.google.com/go v0.112.1 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect - cloud.google.com/go/iam v1.1.7 // indirect - cloud.google.com/go/storage v1.40.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/aws/aws-sdk-go v1.53.12 // indirect - github.com/aws/aws-sdk-go-v2 v1.30.3 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/config v1.26.3 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.26 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.10 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.48.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.22.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 // indirect - github.com/aws/smithy-go v1.20.3 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/bombsimon/logrusr/v3 v3.0.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/chai2010/gettext-go v1.0.2 // indirect - github.com/chmduquesne/rollinghash v4.0.0+incompatible // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.12.1 // 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/fatih/color v1.18.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-errors/errors v1.4.2 // indirect - github.com/go-logr/logr v1.4.2 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/swag v0.23.0 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.2 // indirect - github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/btree v1.0.1 // indirect - github.com/google/gnostic-models v0.6.9 // indirect - github.com/google/go-cmp v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.3 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect - github.com/hashicorp/cronexpr v1.1.2 // indirect - github.com/hashicorp/go-hclog v1.2.0 // indirect - github.com/hashicorp/go-plugin v1.6.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect - github.com/imdario/mergo v0.3.16 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/joho/godotenv v1.3.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect - github.com/klauspost/pgzip v1.2.6 // indirect - github.com/klauspost/reedsolomon v1.12.1 // indirect - github.com/kopia/kopia v0.16.0 // indirect - github.com/kubernetes-csi/external-snapshotter/client/v7 v7.0.0 // indirect - github.com/kylelemons/godebug v1.1.0 // 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.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/minio/md5-simd v1.1.2 // indirect - github.com/minio/minio-go/v7 v7.0.69 // indirect - github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mitchellh/go-testing-interface v1.0.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/moby/spdystream v0.4.0 // indirect - github.com/moby/term v0.5.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/mxk/go-vss v1.2.0 // indirect - github.com/natefinch/atomic v1.0.1 // indirect - github.com/oklog/run v1.0.0 // indirect - github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/pierrec/lz4 v2.6.1+incompatible // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect - github.com/robfig/cron v1.2.0 // indirect - github.com/rs/xid v1.5.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace // indirect - github.com/xlab/treeprint v1.2.0 // indirect - github.com/zeebo/blake3 v0.2.3 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.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 - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.36.0 // indirect - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/net v0.36.0 // indirect - golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/term v0.30.0 // indirect - golang.org/x/text v0.23.0 // indirect - golang.org/x/time v0.9.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/api v0.172.0 // indirect - google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // 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.36.3 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/component-base v0.29.7 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/kubectl v0.29.7 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // 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.3 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect -) - -replace github.com/vmware-tanzu/velero => github.com/openshift/velero v0.10.2-0.20240822153644-9ac863aaa452 - -replace github.com/kopia/kopia => github.com/project-velero/kopia v0.0.0-20240417031915-e07d5b7de567 diff --git a/must-gather/go.sum b/must-gather/go.sum deleted file mode 100644 index d375a5dde59..00000000000 --- a/must-gather/go.sum +++ /dev/null @@ -1,794 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= -cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= -cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= -cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E= -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/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI= -github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -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/aws/aws-sdk-go v1.53.12 h1:8f8K+YaTy2qwtGwVIo2Ftq22UCH96xQAX7Q0lyZKDiA= -github.com/aws/aws-sdk-go v1.53.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY= -github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo= -github.com/aws/aws-sdk-go-v2/config v1.26.3 h1:dKuc2jdp10y13dEEvPqWxqLoc0vF3Z9FC45MvuQSxOA= -github.com/aws/aws-sdk-go-v2/config v1.26.3/go.mod h1:Bxgi+DeeswYofcYO0XyGClwlrq3DZEXli0kLf4hkGA0= -github.com/aws/aws-sdk-go-v2/credentials v1.17.26 h1:tsm8g/nJxi8+/7XyJJcP2dLrnK/5rkFp6+i2nhmz5fk= -github.com/aws/aws-sdk-go-v2/credentials v1.17.26/go.mod h1:3vAM49zkIa3q8WT6o9Ve5Z0vdByDMwmdScO0zvThTgI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 h1:KreluoV8FZDEtI6Co2xuNk/UqI9iwMrOx/87PBNIKqw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.11 h1:I6lAa3wBWfCz/cKkOpAcumsETRkFAl70sWi8ItcMEsM= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.11/go.mod h1:be1NIO30kJA23ORBLqPo1LttEM6tPNSEcjkd1eKzNW0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.10 h1:5oE2WzJE56/mVveuDZPJESKlg/00AaS2pY2QZcnxg4M= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.10/go.mod h1:FHbKWQtRBYUz4vO5WBWjzMD2by126ny5y/1EoaWoLfI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.10 h1:L0ai8WICYHozIKK+OtPzVJBugL7culcuM4E4JOpIEm8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.10/go.mod h1:byqfyxJBshFk0fF9YmK0M0ugIO8OWjzH2T3bPG4eGuA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.10 h1:KOxnQeWy5sXyS37fdKEvAsGHOr9fa/qvwxfJurR/BzE= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.10/go.mod h1:jMx5INQFYFYB3lQD9W0D8Ohgq6Wnl7NYOJ2TQndbulI= -github.com/aws/aws-sdk-go-v2/service/s3 v1.48.0 h1:PJTdBMsyvra6FtED7JZtDpQrIAflYDHFoZAu/sKYkwU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.48.0/go.mod h1:4qXHrG1Ne3VGIMZPCB8OjH/pLFO94sKABIusjh0KWPU= -github.com/aws/aws-sdk-go-v2/service/sso v1.22.3 h1:Fv1vD2L65Jnp5QRsdiM64JvUM4Xe+E0JyVsRQKv6IeA= -github.com/aws/aws-sdk-go-v2/service/sso v1.22.3/go.mod h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 h1:yiwVzJW2ZxZTurVbYWA7QOrAaCYQR72t0wrSBfoesUE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw= -github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE= -github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ= -github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE= -github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -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/bombsimon/logrusr/v3 v3.0.0 h1:tcAoLfuAhKP9npBxWzSdpsvKPQt1XV02nSf2lZA82TQ= -github.com/bombsimon/logrusr/v3 v3.0.0/go.mod h1:PksPPgSFEL2I52pla2glgCyyd2OqOHAnFF5E+g8Ixco= -github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= -github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -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/chmduquesne/rollinghash v4.0.0+incompatible h1:hnREQO+DXjqIw3rUTzWN7/+Dpw+N5Um8zpKV0JOEgbo= -github.com/chmduquesne/rollinghash v4.0.0+incompatible/go.mod h1:Uc2I36RRfTAf7Dge82bi3RU0OQUmXT9iweIcPqvr8A0= -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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= -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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= -github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -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.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -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/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -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/ghodss/yaml v0.0.0-20150909031657-73d445a93680/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-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.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/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-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= -github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -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/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= -github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -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.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -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.4.3/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/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -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.3/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.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.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/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/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -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/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/hanwen/go-fuse/v2 v2.5.1 h1:OQBE8zVemSocRxA4OaFJbjJ5hlpCmIWbGr7r0M4uoQQ= -github.com/hanwen/go-fuse/v2 v2.5.1/go.mod h1:xKwi1cF7nXAOBCXujD5ie0ZKsxc8GGSA1rlMJc+8IJs= -github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= -github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= -github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-plugin v1.6.0 h1:wgd4KxHJTVGGqWBq4QPB1i5BZNEx9BR8+OFmHDmTk8A= -github.com/hashicorp/go-plugin v1.6.0/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= -github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -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.10/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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= -github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/klauspost/reedsolomon v1.12.1 h1:NhWgum1efX1x58daOBGCFWcxtEhOhXKKl1HAPQUp03Q= -github.com/klauspost/reedsolomon v1.12.1/go.mod h1:nEi5Kjb6QqtbofI6s+cbG/j1da11c96IBYBSnVGtuBs= -github.com/kopia/htmluibuild v0.0.1-0.20240405040759-90bfbf000696 h1:MaLdTP4HVGUomnowX7k1i4SOXOdtgSi/ekp1gWgubNU= -github.com/kopia/htmluibuild v0.0.1-0.20240405040759-90bfbf000696/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.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/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -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/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 h1:nHHjmvjitIiyPlUHk/ofpgvBcNcawJLtf4PYHORLjAA= -github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0/go.mod h1:YBCo4DoEeDndqvAn6eeu0vWM7QdXmHEeI9cFWplmBys= -github.com/kubernetes-csi/external-snapshotter/client/v7 v7.0.0 h1:j3YK74myEQRxR/srciTpOrm221SAvz6J5OVWbyfeXFo= -github.com/kubernetes-csi/external-snapshotter/client/v7 v7.0.0/go.mod h1:FlyYFe32mPxKEPaRXKNxfX576d1AoCzstYDoOOnyMA4= -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/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.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -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.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -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/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= -github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0= -github.com/minio/minio-go/v7 v7.0.69/go.mod h1:XAvOPJQ5Xlzk5o3o/ArO2NMbhSGkimC+bpW/ngRKDmQ= -github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= -github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= -github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= -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/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/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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/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/mxk/go-vss v1.2.0 h1:JpdOPc/P6B3XyRoddn0iMiG/ADBi3AuEsv8RlTb+JeE= -github.com/mxk/go-vss v1.2.0/go.mod h1:ZQ4yFxCG54vqPnCd+p2IxAe5jwZdz56wSjbwzBXiFd8= -github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= -github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -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/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= -github.com/openshift/api v0.0.0-20240410141538-3c0461467316 h1:YfatsH1e28WTbuNUl3LZl6PKCr6zBaYLR7JSxg+LJSU= -github.com/openshift/api v0.0.0-20240410141538-3c0461467316/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4= -github.com/openshift/oadp-operator v1.0.2-0.20250403192318-6d871184bfdc h1:hh24544mJJRm6TkQ0gjhFohDhiXxZM6zSZ2/d/S0Els= -github.com/openshift/oadp-operator v1.0.2-0.20250403192318-6d871184bfdc/go.mod h1:5LGZqG9rgJTy5dvOpJVRjNl+PIej7THwSfbzG9BCUn8= -github.com/openshift/oc v0.0.0-alpha.0.0.20250305035534-ee354f66de43 h1:qfukm7LXjBLxah9TdLgPm3AsL2ueMIaS9fjecCTtxIo= -github.com/openshift/oc v0.0.0-alpha.0.0.20250305035534-ee354f66de43/go.mod h1:dwElcRpd0rYVzcMWfFpTy3HvUA/uXeO72XEtvB7NL0I= -github.com/openshift/velero v0.10.2-0.20240822153644-9ac863aaa452 h1:rIGzeje6KnnudkYkiua/LigiNloNZfE6Kr0hCKqhtZI= -github.com/openshift/velero v0.10.2-0.20240822153644-9ac863aaa452/go.mod h1:T+tSiinatCuVO7K3zGVxbCcMNYwfIdnlfc8SmIVDI4U= -github.com/operator-framework/api v0.22.0 h1:UZSn+iaQih4rCReezOnWTTJkMyawwV5iLnIItaOzytY= -github.com/operator-framework/api v0.22.0/go.mod h1:p/7YDbr+n4fmESfZ47yLAV1SvkfE6NU2aX8KhcfI0GA= -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/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= -github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -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= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/project-velero/kopia v0.0.0-20240417031915-e07d5b7de567 h1:Gb5eZktsqgnhOfQmKWIlVA9yKvschdr8n8d6y1RLFA0= -github.com/project-velero/kopia v0.0.0-20240417031915-e07d5b7de567/go.mod h1:2HlqZb/N6SNsWUCZzyeh9Lw29PeDRHDkMUiuQCEWt4Y= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= -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.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -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/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= -github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -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/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -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 v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace h1:9PNP1jnUjRhfmGMlkXHjYPishpcw4jpSt/V/xYY3FMA= -github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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.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/tg123/go-htpasswd v1.2.2 h1:tmNccDsQ+wYsoRfiONzIhDm5OkVHQzN3w4FOBAlN6BY= -github.com/tg123/go-htpasswd v1.2.2/go.mod h1:FcIrK0J+6zptgVwK1JDlqyajW/1B4PtuJ/FLWl7nx8A= -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/zalando/go-keyring v0.2.4 h1:wi2xxTqdiwMKbM6TWwi+uJCG/Tum2UV0jqaQhCa9/68= -github.com/zalando/go-keyring v0.2.4/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk= -github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= -github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= -github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= -github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= -github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -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/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -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/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= -go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= -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.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.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -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-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/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-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= -golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -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-20190227155943-e225da77a7e6/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.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/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.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= -golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= -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= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -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/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.172.0 h1:/1OcMZGPmW1rX2LCu2CmGUD1KXK1+pfzxotxyRUCCdk= -google.golang.org/api v0.172.0/go.mod h1:+fJZq6QXWfa9pXhnIzsjx4yI22d4aI9ZpLb58gvXjis= -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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= -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.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= -google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -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/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/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -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.8/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= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= -k8s.io/api v0.29.7 h1:Q2/thp7YYESgy0MGzxT9RvA/6doLJHBXSFH8GGLxSbc= -k8s.io/api v0.29.7/go.mod h1:mPimdbyuIjwoLtBEVIGVUYb4BKOE+44XHt/n4IqKsLA= -k8s.io/apiextensions-apiserver v0.29.7 h1:X62u7vUGfwW5rYJB5jkZDr0uV2XSyEHJRdxnfD5PaLs= -k8s.io/apiextensions-apiserver v0.29.7/go.mod h1:JzBXxlZKKdtEYGr4yiN+s0eXheCTYgKDay8JXPfSGoQ= -k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.29.7 h1:ICXzya58Q7hyEEfnTrbmdfX1n1schSepX2KUfC2/ykc= -k8s.io/apimachinery v0.29.7/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y= -k8s.io/cli-runtime v0.29.7 h1:6IxyxaIm3N31+PKXb1K7Tpf+100mm9hd9HMMYWMH2QE= -k8s.io/cli-runtime v0.29.7/go.mod h1:0pcclC4k3rkzYNAvw3zeiPNtg8Buv0orK+5MuhEKFBU= -k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU= -k8s.io/client-go v0.29.7 h1:vTtiFrGBKlcBhxaeZC4eDrqui1e108nsTyue/KU63IY= -k8s.io/client-go v0.29.7/go.mod h1:69BvVqdRozgR/9TP45u/oO0tfrdbP+I8RqrcCJQshzg= -k8s.io/code-generator v0.19.0/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/component-base v0.29.7 h1:zXLJvZjvvDWdYmZCwZYk95E1Fd2oRXUz71mQukkRk5I= -k8s.io/component-base v0.29.7/go.mod h1:ddLTpIrjazaRI1EG83M41GNcYEAdskuQmx4JOOSXCOg= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -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.29.7 h1:D+Jheug9M++zlt67cROZgxaIjrDdLqp9jkW/EYrXAoM= -k8s.io/kubectl v0.29.7/go.mod h1:VOEJkcfKTO/X8xSSB6d2JXP/Qni6xtjuI3CUP52T9bM= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= -sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= -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.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.4.3 h1:sCP7Vv3xx/CWIuTPVN38lUPx0uw0lcLfzaiDa8Ja01A= -sigs.k8s.io/structured-merge-diff/v4 v4.4.3/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/must-gather/hack/build/redhat.repo b/must-gather/hack/build/redhat.repo deleted file mode 100644 index c6769d9e8cf..00000000000 --- a/must-gather/hack/build/redhat.repo +++ /dev/null @@ -1,60 +0,0 @@ -[rhel-9-for-$basearch-appstream-rpms] -baseurl = https://cdn.redhat.com/content/dist/rhel9/$releasever/$basearch/appstream/os -enabled = 1 -enabled_metadata = 1 -gpgcheck = 1 -gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release -metadata_expire = 86400 -name = Red Hat Enterprise Linux 9 for $basearch - AppStream (RPMs) -sslcacert = /etc/rhsm/ca/redhat-uep.pem -sslverify = 1 -sslverifystatus = 1 - -[rhel-9-for-$basearch-baseos-rpms] -baseurl = https://cdn.redhat.com/content/dist/rhel9/$releasever/$basearch/baseos/os -enabled = 1 -enabled_metadata = 1 -gpgcheck = 1 -gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release -metadata_expire = 86400 -name = Red Hat Enterprise Linux 9 for $basearch - BaseOS (RPMs) -sslcacert = /etc/rhsm/ca/redhat-uep.pem -sslverify = 1 -sslverifystatus = 1 - -[rhel-9-for-$basearch-baseos-source-rpms] -baseurl = https://cdn.redhat.com/content/dist/rhel9/$releasever/$basearch/baseos/source/SRPMS -enabled = 1 -enabled_metadata = 0 -gpgcheck = 1 -gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release -metadata_expire = 86400 -name = Red Hat Enterprise Linux 9 for $basearch - BaseOS (Source RPMs) -sslcacert = /etc/rhsm/ca/redhat-uep.pem -sslverify = 1 -sslverifystatus = 1 - -[rhocp-4.18-for-rhel-9-$basearch-rpms] -baseurl = https://cdn.redhat.com/content/dist/layered/rhel9/$basearch/rhocp/4.18/os -enabled = 1 -enabled_metadata = 0 -gpgcheck = 1 -gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release -metadata_expire = 86400 -name = Red Hat OpenShift Container Platform 4.18 for RHEL 9 $basearch (RPMs) -sslcacert = /etc/rhsm/ca/redhat-uep.pem -sslverify = 1 -sslverifystatus = 1 - -[rhocp-4.18-for-rhel-9-$basearch-source-rpms] -baseurl = https://cdn.redhat.com/content/dist/layered/rhel9/$basearch/rhocp/4.18/source/SRPMS -enabled = 1 -enabled_metadata = 0 -gpgcheck = 1 -gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release -metadata_expire = 86400 -name = Red Hat OpenShift Container Platform 4.18 for RHEL 9 $basearch (Source RPMs) -sslcacert = /etc/rhsm/ca/redhat-uep.pem -sslverify = 1 -sslverifystatus = 1 - diff --git a/must-gather/hack/build/rpms.in.yaml b/must-gather/hack/build/rpms.in.yaml deleted file mode 100644 index 82031fe762f..00000000000 --- a/must-gather/hack/build/rpms.in.yaml +++ /dev/null @@ -1,15 +0,0 @@ -packages: - - gzip - - openssl - - rsync - - tar -arches: - - aarch64 - - ppc64le - - s390x - - x86_64 -reinstallPackages: - - tzdata -contentOrigin: - repofiles: - - ./redhat.repo diff --git a/must-gather/hack/build/rpms.lock.yaml b/must-gather/hack/build/rpms.lock.yaml deleted file mode 100644 index 0500f7793c5..00000000000 --- a/must-gather/hack/build/rpms.lock.yaml +++ /dev/null @@ -1,279 +0,0 @@ -arches: -- arch: aarch64 - module_metadata: [] - packages: - - checksum: sha256:45710df49b439ddc4a2848fd3877367761b574234ae28b6be46f1cf54f3fcdca - evr: 1.12-1.el9 - name: gzip - repoid: rhel-9-for-aarch64-baseos-rpms - size: 169809 - sourcerpm: gzip-1.12-1.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/os/Packages/g/gzip-1.12-1.el9.aarch64.rpm - - checksum: sha256:f914250a9ef52968e27af0f0e2520745df4443dc354367bec54dd06b4a2da60b - evr: 1:3.2.2-6.el9_5.1 - name: openssl - repoid: rhel-9-for-aarch64-baseos-rpms - size: 1398689 - sourcerpm: openssl-3.2.2-6.el9_5.1.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/os/Packages/o/openssl-3.2.2-6.el9_5.1.aarch64.rpm - - checksum: sha256:99235a7555f6454898ebbcdcf927ebed68e3a60599c9226b9d1d60578d292878 - evr: 3.2.5-3.el9 - name: rsync - repoid: rhel-9-for-aarch64-baseos-rpms - size: 416293 - sourcerpm: rsync-3.2.5-3.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/os/Packages/r/rsync-3.2.5-3.el9.aarch64.rpm - - checksum: sha256:44552dea889d350403c3074a33d7cb274b3f57553e47db998745df13f931b458 - evr: 2:1.34-7.el9 - name: tar - repoid: rhel-9-for-aarch64-baseos-rpms - size: 900197 - sourcerpm: tar-1.34-7.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/os/Packages/t/tar-1.34-7.el9.aarch64.rpm - - checksum: sha256:0687e5a1115ba679137404c8d37a45141a31968ffd01677455530d24c126a0d2 - evr: 2025b-1.el9 - name: tzdata - repoid: rhel-9-for-aarch64-baseos-rpms - size: 862160 - sourcerpm: tzdata-2025b-1.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/os/Packages/t/tzdata-2025b-1.el9.noarch.rpm - source: - - checksum: sha256:a05f582ec42e89258ee5e10af96dee4300bcb2a6a69a76bfb5b46f79e6a6a47b - evr: 1.12-1.el9 - name: gzip - repoid: rhel-9-for-aarch64-baseos-source-rpms - size: 856147 - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/source/SRPMS/Packages/g/gzip-1.12-1.el9.src.rpm - - checksum: sha256:56c0b951be3e5ad6a1da594f9d4f09b8b752e2fb3d6827bcc03892f22f622b22 - evr: 1:3.2.2-6.el9_5.1 - name: openssl - repoid: rhel-9-for-aarch64-baseos-source-rpms - size: 17985138 - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/source/SRPMS/Packages/o/openssl-3.2.2-6.el9_5.1.src.rpm - - checksum: sha256:a1fd44e58d1fb5b52b72586c5ef2e12c040428f771cde1d1350b36d3b9155db0 - evr: 3.2.5-3.el9 - name: rsync - repoid: rhel-9-for-aarch64-baseos-source-rpms - size: 1306931 - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/source/SRPMS/Packages/r/rsync-3.2.5-3.el9.src.rpm - - checksum: sha256:d002c400d29e7305fe8a982ab6b9f49ee7a8780e4574b86fc0c5b3d5510ecb22 - evr: 2:1.34-7.el9 - name: tar - repoid: rhel-9-for-aarch64-baseos-source-rpms - size: 2261512 - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/source/SRPMS/Packages/t/tar-1.34-7.el9.src.rpm - - checksum: sha256:a2668d1f6b053545a5824a428755484895d72475a9d3833cbfbec9e08660aba2 - evr: 2025b-1.el9 - name: tzdata - repoid: rhel-9-for-aarch64-baseos-source-rpms - size: 904607 - url: https://cdn.redhat.com/content/dist/rhel9/9/aarch64/baseos/source/SRPMS/Packages/t/tzdata-2025b-1.el9.src.rpm -- arch: ppc64le - module_metadata: [] - packages: - - checksum: sha256:55b983f08d8b2a0741b07f114cdba89a8ecb207064c001e90e4c76a13836d458 - evr: 1.12-1.el9 - name: gzip - repoid: rhel-9-for-ppc64le-baseos-rpms - size: 175705 - sourcerpm: gzip-1.12-1.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/os/Packages/g/gzip-1.12-1.el9.ppc64le.rpm - - checksum: sha256:56283cbf84234ec9256fb68e2d2669bc5799862eb2ee40521b8ac59044567835 - evr: 1:3.2.2-6.el9_5.1 - name: openssl - repoid: rhel-9-for-ppc64le-baseos-rpms - size: 1422952 - sourcerpm: openssl-3.2.2-6.el9_5.1.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/os/Packages/o/openssl-3.2.2-6.el9_5.1.ppc64le.rpm - - checksum: sha256:1fd8762ad73a60556c9808a5bf2a9d964965adec91c026ef27058266dc75e1f0 - evr: 3.2.5-3.el9 - name: rsync - repoid: rhel-9-for-ppc64le-baseos-rpms - size: 449938 - sourcerpm: rsync-3.2.5-3.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/os/Packages/r/rsync-3.2.5-3.el9.ppc64le.rpm - - checksum: sha256:f2cc206dfacc9981fad6cf33600ad28bcd1c573f16d8c18523dc9df52ca90660 - evr: 2:1.34-7.el9 - name: tar - repoid: rhel-9-for-ppc64le-baseos-rpms - size: 937724 - sourcerpm: tar-1.34-7.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/os/Packages/t/tar-1.34-7.el9.ppc64le.rpm - - checksum: sha256:0687e5a1115ba679137404c8d37a45141a31968ffd01677455530d24c126a0d2 - evr: 2025b-1.el9 - name: tzdata - repoid: rhel-9-for-ppc64le-baseos-rpms - size: 862160 - sourcerpm: tzdata-2025b-1.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/os/Packages/t/tzdata-2025b-1.el9.noarch.rpm - source: - - checksum: sha256:a05f582ec42e89258ee5e10af96dee4300bcb2a6a69a76bfb5b46f79e6a6a47b - evr: 1.12-1.el9 - name: gzip - repoid: rhel-9-for-ppc64le-baseos-source-rpms - size: 856147 - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/source/SRPMS/Packages/g/gzip-1.12-1.el9.src.rpm - - checksum: sha256:56c0b951be3e5ad6a1da594f9d4f09b8b752e2fb3d6827bcc03892f22f622b22 - evr: 1:3.2.2-6.el9_5.1 - name: openssl - repoid: rhel-9-for-ppc64le-baseos-source-rpms - size: 17985138 - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/source/SRPMS/Packages/o/openssl-3.2.2-6.el9_5.1.src.rpm - - checksum: sha256:a1fd44e58d1fb5b52b72586c5ef2e12c040428f771cde1d1350b36d3b9155db0 - evr: 3.2.5-3.el9 - name: rsync - repoid: rhel-9-for-ppc64le-baseos-source-rpms - size: 1306931 - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/source/SRPMS/Packages/r/rsync-3.2.5-3.el9.src.rpm - - checksum: sha256:d002c400d29e7305fe8a982ab6b9f49ee7a8780e4574b86fc0c5b3d5510ecb22 - evr: 2:1.34-7.el9 - name: tar - repoid: rhel-9-for-ppc64le-baseos-source-rpms - size: 2261512 - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/source/SRPMS/Packages/t/tar-1.34-7.el9.src.rpm - - checksum: sha256:a2668d1f6b053545a5824a428755484895d72475a9d3833cbfbec9e08660aba2 - evr: 2025b-1.el9 - name: tzdata - repoid: rhel-9-for-ppc64le-baseos-source-rpms - size: 904607 - url: https://cdn.redhat.com/content/dist/rhel9/9/ppc64le/baseos/source/SRPMS/Packages/t/tzdata-2025b-1.el9.src.rpm -- arch: s390x - module_metadata: [] - packages: - - checksum: sha256:50034ee6281864a218a5f3bc47de5afb434400fb8415907fd31d8351adbdc5a6 - evr: 1.12-1.el9 - name: gzip - repoid: rhel-9-for-s390x-baseos-rpms - size: 173101 - sourcerpm: gzip-1.12-1.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/os/Packages/g/gzip-1.12-1.el9.s390x.rpm - - checksum: sha256:0a24289ee6324c2ecd6edad913f8ecfcfc6db43fbf6fed65458141e3ec0c104f - evr: 1:3.2.2-6.el9_5.1 - name: openssl - repoid: rhel-9-for-s390x-baseos-rpms - size: 1407537 - sourcerpm: openssl-3.2.2-6.el9_5.1.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/os/Packages/o/openssl-3.2.2-6.el9_5.1.s390x.rpm - - checksum: sha256:2d1a87e86fb23bc665b7c7ce8775c73d500ef6e152f15c78493b95638dfb7925 - evr: 3.2.5-3.el9 - name: rsync - repoid: rhel-9-for-s390x-baseos-rpms - size: 418877 - sourcerpm: rsync-3.2.5-3.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/os/Packages/r/rsync-3.2.5-3.el9.s390x.rpm - - checksum: sha256:fa8758bac6a56830de66ad1ab623c87768065bcc6f8242faa42ac4198260d456 - evr: 2:1.34-7.el9 - name: tar - repoid: rhel-9-for-s390x-baseos-rpms - size: 902370 - sourcerpm: tar-1.34-7.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/os/Packages/t/tar-1.34-7.el9.s390x.rpm - - checksum: sha256:0687e5a1115ba679137404c8d37a45141a31968ffd01677455530d24c126a0d2 - evr: 2025b-1.el9 - name: tzdata - repoid: rhel-9-for-s390x-baseos-rpms - size: 862160 - sourcerpm: tzdata-2025b-1.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/os/Packages/t/tzdata-2025b-1.el9.noarch.rpm - source: - - checksum: sha256:a05f582ec42e89258ee5e10af96dee4300bcb2a6a69a76bfb5b46f79e6a6a47b - evr: 1.12-1.el9 - name: gzip - repoid: rhel-9-for-s390x-baseos-source-rpms - size: 856147 - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/source/SRPMS/Packages/g/gzip-1.12-1.el9.src.rpm - - checksum: sha256:56c0b951be3e5ad6a1da594f9d4f09b8b752e2fb3d6827bcc03892f22f622b22 - evr: 1:3.2.2-6.el9_5.1 - name: openssl - repoid: rhel-9-for-s390x-baseos-source-rpms - size: 17985138 - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/source/SRPMS/Packages/o/openssl-3.2.2-6.el9_5.1.src.rpm - - checksum: sha256:a1fd44e58d1fb5b52b72586c5ef2e12c040428f771cde1d1350b36d3b9155db0 - evr: 3.2.5-3.el9 - name: rsync - repoid: rhel-9-for-s390x-baseos-source-rpms - size: 1306931 - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/source/SRPMS/Packages/r/rsync-3.2.5-3.el9.src.rpm - - checksum: sha256:d002c400d29e7305fe8a982ab6b9f49ee7a8780e4574b86fc0c5b3d5510ecb22 - evr: 2:1.34-7.el9 - name: tar - repoid: rhel-9-for-s390x-baseos-source-rpms - size: 2261512 - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/source/SRPMS/Packages/t/tar-1.34-7.el9.src.rpm - - checksum: sha256:a2668d1f6b053545a5824a428755484895d72475a9d3833cbfbec9e08660aba2 - evr: 2025b-1.el9 - name: tzdata - repoid: rhel-9-for-s390x-baseos-source-rpms - size: 904607 - url: https://cdn.redhat.com/content/dist/rhel9/9/s390x/baseos/source/SRPMS/Packages/t/tzdata-2025b-1.el9.src.rpm -- arch: x86_64 - module_metadata: [] - packages: - - checksum: sha256:c8b3e0414d55b1eedb0185a564ac6cb2368bee2fd5f995447d045f6a714488ac - evr: 1.12-1.el9 - name: gzip - repoid: rhel-9-for-x86_64-baseos-rpms - size: 171206 - sourcerpm: gzip-1.12-1.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/os/Packages/g/gzip-1.12-1.el9.x86_64.rpm - - checksum: sha256:f379686df99db814e30568a896b417278775fc96864ac6d2660bf48ef94309e3 - evr: 1:3.2.2-6.el9_5.1 - name: openssl - repoid: rhel-9-for-x86_64-baseos-rpms - size: 1420999 - sourcerpm: openssl-3.2.2-6.el9_5.1.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/os/Packages/o/openssl-3.2.2-6.el9_5.1.x86_64.rpm - - checksum: sha256:b1d90c38b613f2d66dfe0c7c3d067a3ce429f7b2ec5224e560f326fc2fd8d1e5 - evr: 3.2.5-3.el9 - name: rsync - repoid: rhel-9-for-x86_64-baseos-rpms - size: 421930 - sourcerpm: rsync-3.2.5-3.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/os/Packages/r/rsync-3.2.5-3.el9.x86_64.rpm - - checksum: sha256:17f2e592a2c04c050b690afeb9042e02521a0b5ee3288dad837463f4acf542c3 - evr: 2:1.34-7.el9 - name: tar - repoid: rhel-9-for-x86_64-baseos-rpms - size: 910235 - sourcerpm: tar-1.34-7.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/os/Packages/t/tar-1.34-7.el9.x86_64.rpm - - checksum: sha256:0687e5a1115ba679137404c8d37a45141a31968ffd01677455530d24c126a0d2 - evr: 2025b-1.el9 - name: tzdata - repoid: rhel-9-for-x86_64-baseos-rpms - size: 862160 - sourcerpm: tzdata-2025b-1.el9.src.rpm - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/os/Packages/t/tzdata-2025b-1.el9.noarch.rpm - source: - - checksum: sha256:a05f582ec42e89258ee5e10af96dee4300bcb2a6a69a76bfb5b46f79e6a6a47b - evr: 1.12-1.el9 - name: gzip - repoid: rhel-9-for-x86_64-baseos-source-rpms - size: 856147 - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/source/SRPMS/Packages/g/gzip-1.12-1.el9.src.rpm - - checksum: sha256:56c0b951be3e5ad6a1da594f9d4f09b8b752e2fb3d6827bcc03892f22f622b22 - evr: 1:3.2.2-6.el9_5.1 - name: openssl - repoid: rhel-9-for-x86_64-baseos-source-rpms - size: 17985138 - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/source/SRPMS/Packages/o/openssl-3.2.2-6.el9_5.1.src.rpm - - checksum: sha256:a1fd44e58d1fb5b52b72586c5ef2e12c040428f771cde1d1350b36d3b9155db0 - evr: 3.2.5-3.el9 - name: rsync - repoid: rhel-9-for-x86_64-baseos-source-rpms - size: 1306931 - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/source/SRPMS/Packages/r/rsync-3.2.5-3.el9.src.rpm - - checksum: sha256:d002c400d29e7305fe8a982ab6b9f49ee7a8780e4574b86fc0c5b3d5510ecb22 - evr: 2:1.34-7.el9 - name: tar - repoid: rhel-9-for-x86_64-baseos-source-rpms - size: 2261512 - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/source/SRPMS/Packages/t/tar-1.34-7.el9.src.rpm - - checksum: sha256:a2668d1f6b053545a5824a428755484895d72475a9d3833cbfbec9e08660aba2 - evr: 2025b-1.el9 - name: tzdata - repoid: rhel-9-for-x86_64-baseos-source-rpms - size: 904607 - url: https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/source/SRPMS/Packages/t/tzdata-2025b-1.el9.src.rpm -lockfileVendor: redhat -lockfileVersion: 1 diff --git a/must-gather/pkg/cli.go b/must-gather/pkg/cli.go deleted file mode 100644 index 8184c7001a3..00000000000 --- a/must-gather/pkg/cli.go +++ /dev/null @@ -1,341 +0,0 @@ -package pkg - -import ( - "fmt" - "slices" - "strconv" - "strings" - "time" - - volumesnapshotv1 "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1" - openshiftconfigv1 "github.com/openshift/api/config/v1" - oadpv1alpha1 "github.com/openshift/oadp-operator/api/v1alpha1" - ocadminspect "github.com/openshift/oc/pkg/cli/admin/inspect" - operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/spf13/cobra" - velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" - velerov2alpha1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v2alpha1" - corev1 "k8s.io/api/core/v1" - storagev1 "k8s.io/api/storage/v1" - "k8s.io/cli-runtime/pkg/genericiooptions" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/config" - - "github.com/openshift/oadp-operator/must-gather/pkg/gather" - "github.com/openshift/oadp-operator/must-gather/pkg/templates" -) - -const ( - mustGatherVersion = "1.4.5" - mustGatherImage = "registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.4" - - addToSchemeError = "Exiting OADP must-gather, an error happened while adding %s to scheme: %v\n" - - DefaultRequestTimeout = 5 * time.Second -) - -var ( - Timeout time.Duration - RequestTimeout time.Duration - SkipTLS bool - - CLI = &cobra.Command{ - Use: fmt.Sprintf("oc adm must-gather --image=%[1]s -- /usr/bin/gather", mustGatherImage), - Long: `OADP Must-gather: a tool to collect information about OADP installation in a cluster, along with information about its custom resources and cluster storage. - -For more information, check OADP must-gather documentation: https://docs.redhat.com/en/documentation/openshift_container_platform/latest/html/backup_and_restore/oadp-application-backup-and-restore#using-the-must-gather-tool`, - Args: cobra.NoArgs, - Example: fmt.Sprintf(` # running OADP Must-gather with default configuration - oc adm must-gather --image=%[1]s - - # running OADP Must-gather with timeout of 1 minute per OADP server request - oc adm must-gather --image=%[1]s -- /usr/bin/gather --request-timeout 1m - - # running OADP Must-gather with timeout of 15 seconds per OADP server request and with insecure TLS connections - oc adm must-gather --image=%[1]s -- /usr/bin/gather --request-timeout 15s --skip-tls`, mustGatherImage), - SilenceErrors: true, - SilenceUsage: true, - RunE: func(_ *cobra.Command, _ []string) error { - if RequestTimeout <= 0 { - err := fmt.Errorf("--request-timeout value must be greater than zero") - fmt.Printf("Exiting OADP must-gather: %v\n", err) - return err - } - - clusterConfig := config.GetConfigOrDie() - // https://github.com/openshift/oc/blob/46db7c2bce5a57e3c3d9347e7e1e107e61dbd306/pkg/cli/admin/inspect/inspect.go#L142 - clusterConfig.QPS = 999999 - clusterConfig.Burst = 999999 - - clusterClient, err := client.New(clusterConfig, client.Options{}) - if err != nil { - fmt.Printf("Exiting OADP must-gather, an error happened while creating Go client: %v\n", err) - return err - } - - err = openshiftconfigv1.AddToScheme(clusterClient.Scheme()) - if err != nil { - fmt.Printf(addToSchemeError, "github.com/openshift/api/config/v1", err) - return err - } - err = operatorsv1alpha1.AddToScheme(clusterClient.Scheme()) - if err != nil { - fmt.Printf(addToSchemeError, "github.com/operator-framework/api/pkg/operators/v1alpha1", err) - return err - } - err = storagev1.AddToScheme(clusterClient.Scheme()) - if err != nil { - fmt.Printf(addToSchemeError, "k8s.io/api/storage/v1", err) - return err - } - err = volumesnapshotv1.AddToScheme(clusterClient.Scheme()) - if err != nil { - fmt.Printf(addToSchemeError, "github.com/kubernetes-csi/external-snapshotter/client/v8/apis/volumesnapshot/v1", err) - return err - } - err = corev1.AddToScheme(clusterClient.Scheme()) - if err != nil { - fmt.Printf(addToSchemeError, "k8s.io/api/core/v1", err) - return err - } - // OADP CRDs - err = oadpv1alpha1.AddToScheme(clusterClient.Scheme()) - if err != nil { - fmt.Printf(addToSchemeError, "github.com/openshift/oadp-operator/api/v1alpha1", err) - return err - } - err = velerov1.AddToScheme(clusterClient.Scheme()) - if err != nil { - fmt.Printf(addToSchemeError, "github.com/vmware-tanzu/velero/pkg/apis/velero/v1", err) - return err - } - err = velerov2alpha1.AddToScheme(clusterClient.Scheme()) - if err != nil { - fmt.Printf(addToSchemeError, "github.com/vmware-tanzu/velero/pkg/apis/velero/v2alpha1", err) - return err - } - - clusterVersionList := &openshiftconfigv1.ClusterVersionList{} - err = gather.AllResources(clusterClient, clusterVersionList) - if err != nil { - fmt.Printf("Exiting OADP must-gather, an error happened while gathering ClusterVersion: %v\n", err) - return err - } - if len(clusterVersionList.Items) == 0 { - err = fmt.Errorf("no ClusterVersion found in cluster") - fmt.Printf("Exiting OADP must-gather, an error happened while gathering ClusterVersion: %v\n", err) - return err - } - clusterVersion := &clusterVersionList.Items[0] - clusterID := string(clusterVersion.Spec.ClusterID[:8]) - versionParts := strings.Split(clusterVersion.Status.Desired.Version, ".") - major, err := strconv.Atoi(versionParts[0]) - if err != nil { - fmt.Printf("Exiting OADP must-gather, an error happened while parsing OpenShift major version: %v\n", err) - return err - } - minor, err := strconv.Atoi(versionParts[1]) - if err != nil { - fmt.Printf("Exiting OADP must-gather, an error happened while parsing OpenShift minor version: %v\n", err) - return err - } - - // be careful about folder structure, otherwise may break `omg` usage - outputPath := fmt.Sprintf("must-gather/clusters/%s/", clusterID) - - var resourcesToGather []client.ObjectList - infrastructureList := &openshiftconfigv1.InfrastructureList{} - nodeList := &corev1.NodeList{} - clusterServiceVersionList := &operatorsv1alpha1.ClusterServiceVersionList{} - subscriptionList := &operatorsv1alpha1.SubscriptionList{} - - dataProtectionApplicationList := &oadpv1alpha1.DataProtectionApplicationList{} - cloudStorageList := &oadpv1alpha1.CloudStorageList{} - backupStorageLocationList := &velerov1.BackupStorageLocationList{} - volumeSnapshotLocationList := &velerov1.VolumeSnapshotLocationList{} - backupList := &velerov1.BackupList{} - restoreList := &velerov1.RestoreList{} - scheduleList := &velerov1.ScheduleList{} - backupRepositoryList := &velerov1.BackupRepositoryList{} - dataUploadList := &velerov2alpha1.DataUploadList{} - dataDownloadList := &velerov2alpha1.DataDownloadList{} - podVolumeBackupList := &velerov1.PodVolumeBackupList{} - podVolumeRestoreList := &velerov1.PodVolumeRestoreList{} - - deleteBackupRequestList := &velerov1.DeleteBackupRequestList{} - serverStatusRequestList := &velerov1.ServerStatusRequestList{} - - storageClassList := &storagev1.StorageClassList{} - volumeSnapshotClassList := &volumesnapshotv1.VolumeSnapshotClassList{} - csiDriverList := &storagev1.CSIDriverList{} - resourcesToGather = append(resourcesToGather, - infrastructureList, - nodeList, - clusterServiceVersionList, - subscriptionList, - - dataProtectionApplicationList, - cloudStorageList, - backupStorageLocationList, - volumeSnapshotLocationList, - backupList, - restoreList, - scheduleList, - backupRepositoryList, - dataUploadList, - dataDownloadList, - podVolumeBackupList, - podVolumeRestoreList, - - deleteBackupRequestList, - serverStatusRequestList, - - storageClassList, - volumeSnapshotClassList, - csiDriverList, - ) - for _, resource := range resourcesToGather { - // TODO do this part in parallel? - err = gather.AllResources(clusterClient, resource) - if err != nil { - fmt.Println(err) - } - } - - // get namespaces with OADP installs - if len(clusterServiceVersionList.Items) == 0 { - fmt.Println(fmt.Errorf("no ClusterServiceVersion found in cluster")) - } - oadpOperatorsText := "" - foundOADP := false - foundRelatedProducts := false - importantCSVsByNamespace := map[string][]operatorsv1alpha1.ClusterServiceVersion{} - importantSubscriptionsByNamespace := map[string][]operatorsv1alpha1.Subscription{} - oldOADPError := "" - - // ?Managed Velero operator? only available in ROSA? https://github.com/openshift/managed-velero-operator - // - // ?Dell Power Protect? - // labels: - // app: ppdm-controller - // app.kubernetes.io/name: powerprotect - // name: powerprotect-controller-c8dcf8648-nlg85 - // - // upstream velero? - relatedProducts := []string{ - "OpenShift Virtualization", - "Advanced Cluster Management for Kubernetes", - "Submariner", - "IBM Storage Fusion", - } - communityProducts := []string{"KubeVirt HyperConverged Cluster Operator"} - - for _, csv := range clusterServiceVersionList.Items { - // OADP dev, community and prod operators have same spec.displayName - if csv.Spec.DisplayName == "OADP Operator" { - oadpOperatorsText += fmt.Sprintf("Found **%v** version **%v** installed in **%v** namespace\n\n", csv.Spec.DisplayName, csv.Spec.Version, csv.Namespace) - if (csv.Spec.Version.Major < 1 || (csv.Spec.Version.Major == 1 && csv.Spec.Version.Minor < 5)) && major >= 4 && minor >= 19 { - oldOADPError += "❌ OADP 1.4 and lower is not supported in OpenShift 4.19 and higher\n\n" - } - foundOADP = true - importantCSVsByNamespace[csv.Namespace] = append(importantCSVsByNamespace[csv.Namespace], csv) - for _, subscription := range subscriptionList.Items { - if subscription.Status.InstalledCSV == csv.Name { - importantSubscriptionsByNamespace[subscription.Namespace] = append(importantSubscriptionsByNamespace[subscription.Namespace], subscription) - } - } - } - if slices.Contains(relatedProducts, csv.Spec.DisplayName) { - oadpOperatorsText += fmt.Sprintf("Found related product **%v** version **%v** installed in **%v** namespace\n\n", csv.Spec.DisplayName, csv.Spec.Version, csv.Namespace) - foundRelatedProducts = true - importantCSVsByNamespace[csv.Namespace] = append(importantCSVsByNamespace[csv.Namespace], csv) - for _, subscription := range subscriptionList.Items { - if subscription.Status.InstalledCSV == csv.Name { - importantSubscriptionsByNamespace[subscription.Namespace] = append(importantSubscriptionsByNamespace[subscription.Namespace], subscription) - } - } - } - if slices.Contains(communityProducts, csv.Spec.DisplayName) { - oadpOperatorsText += fmt.Sprintf("⚠️ Found related product **%v (Community)** version **%v** installed in **%v** namespace\n\n", csv.Spec.DisplayName, csv.Spec.Version, csv.Namespace) - foundRelatedProducts = true - importantCSVsByNamespace[csv.Namespace] = append(importantCSVsByNamespace[csv.Namespace], csv) - for _, subscription := range subscriptionList.Items { - if subscription.Status.InstalledCSV == csv.Name { - importantSubscriptionsByNamespace[subscription.Namespace] = append(importantSubscriptionsByNamespace[subscription.Namespace], subscription) - } - } - } - } - - // oc adm inspect --dest-dir must-gather/clusters/${clusterID} ns/${ns} - if len(importantCSVsByNamespace) != 0 { - ocAdmInspect := ocadminspect.NewInspectOptions(genericiooptions.NewTestIOStreamsDiscard()) - ocAdmInspect.DestDir = outputPath - ocAdmInspectNamespaces := []string{} - for namespace := range importantCSVsByNamespace { - ocAdmInspectNamespaces = append(ocAdmInspectNamespaces, "ns/"+namespace) - } - - // https://github.com/openshift/oc/blob/ae1bd9e4a75b8ab617a569e5c8e1a0d7285a16f6/pkg/cli/admin/inspect/inspect.go#L108 - err = ocAdmInspect.Complete(ocAdmInspectNamespaces) - if err != nil { - fmt.Println(err) - } - err = ocAdmInspect.Validate() - if err != nil { - fmt.Println(err) - } - err = ocAdmInspect.Run() - if err != nil { - fmt.Println(err) - } - } - - // TODO do processes in parallel!? - // https://gobyexample.com/waitgroups - // https://github.com/konveyor/analyzer-lsp/blob/main/engine/engine.go - templates.ReplaceMustGatherVersion(mustGatherVersion) - templates.ReplaceClusterInformationSection(outputPath, clusterID, clusterVersion, infrastructureList, nodeList) - templates.ReplaceOADPOperatorInstallationSection(outputPath, importantCSVsByNamespace, importantSubscriptionsByNamespace, foundOADP, foundRelatedProducts, oldOADPError, oadpOperatorsText) - templates.ReplaceDataProtectionApplicationsSection(outputPath, dataProtectionApplicationList) - templates.ReplaceCloudStoragesSection(outputPath, cloudStorageList) - templates.ReplaceBackupStorageLocationsSection(outputPath, backupStorageLocationList) - templates.ReplaceVolumeSnapshotLocationsSection(outputPath, volumeSnapshotLocationList) - // this creates DownloadRequests CRs - templates.ReplaceBackupsSection(outputPath, backupList, clusterClient, deleteBackupRequestList, podVolumeBackupList, RequestTimeout, SkipTLS) - templates.ReplaceRestoresSection(outputPath, restoreList, clusterClient, podVolumeRestoreList, RequestTimeout, SkipTLS) - - downloadRequestList := &velerov1.DownloadRequestList{} - err = gather.AllResources(clusterClient, downloadRequestList) - if err != nil { - fmt.Println(err) - } - - templates.ReplaceSchedulesSection(outputPath, scheduleList) - templates.ReplaceBackupRepositoriesSection(outputPath, backupRepositoryList) - templates.ReplaceDataUploadsSection(outputPath, dataUploadList) - templates.ReplaceDataDownloadsSection(outputPath, dataDownloadList) - templates.ReplacePodVolumeBackupsSection(outputPath, podVolumeBackupList) - templates.ReplacePodVolumeRestoresSection(outputPath, podVolumeRestoreList) - templates.ReplaceDownloadRequestsSection(outputPath, downloadRequestList) - templates.ReplaceDeleteBackupRequestsSection(outputPath, deleteBackupRequestList) - templates.ReplaceServerStatusRequestsSection(outputPath, serverStatusRequestList) - templates.ReplaceAvailableStorageClassesSection(outputPath, storageClassList) - templates.ReplaceAvailableVolumeSnapshotClassesSection(outputPath, volumeSnapshotClassList) - templates.ReplaceAvailableCSIDriversSection(outputPath, csiDriverList) - templates.ReplaceCustomResourceDefinitionsSection(outputPath, clusterConfig) - err = templates.WriteVersion(mustGatherVersion) - if err != nil { - fmt.Printf("Error occurred: %v\n", err) - return err - } - // do not tar! - err = templates.Write(outputPath) - if err != nil { - fmt.Printf("Error occurred: %v\n", err) - return err - } - return nil - }, - } -) diff --git a/must-gather/pkg/gather/gather.go b/must-gather/pkg/gather/gather.go deleted file mode 100644 index 4b406cca9dc..00000000000 --- a/must-gather/pkg/gather/gather.go +++ /dev/null @@ -1,11 +0,0 @@ -package gather - -import ( - "context" - - "sigs.k8s.io/controller-runtime/pkg/client" -) - -func AllResources(clusterClient client.Client, clusterResource client.ObjectList) error { - return clusterClient.List(context.Background(), clusterResource) -} diff --git a/must-gather/pkg/gvk/gvk.go b/must-gather/pkg/gvk/gvk.go deleted file mode 100644 index f79239a3754..00000000000 --- a/must-gather/pkg/gvk/gvk.go +++ /dev/null @@ -1,118 +0,0 @@ -package gvk - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" -) - -var ( - CustomResourceDefinitionGVK = schema.GroupVersionKind{ - Group: "apiextensions.k8s.io", - Version: "v1", - Kind: "CustomResourceDefinition", - } - ListGVK = schema.GroupVersionKind{ - Group: "", - Version: "v1", - Kind: "List", - } - ClusterServiceVersionGVK = schema.GroupVersionKind{ - Group: "operators.coreos.com", - Version: "v1alpha1", - Kind: "ClusterServiceVersion", - } - SubscriptionsGVK = schema.GroupVersionKind{ - Group: "operators.coreos.com", - Version: "v1alpha1", - Kind: "Subscription", - } - DataProtectionApplicationGVK = schema.GroupVersionKind{ - Group: "oadp.openshift.io", - Version: "v1alpha1", - Kind: "DataProtectionApplication", - } - CloudStorageGVK = schema.GroupVersionKind{ - Group: "oadp.openshift.io", - Version: "v1alpha1", - Kind: "CloudStorage", - } - BackupStorageLocationGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "BackupStorageLocation", - } - VolumeSnapshotLocationGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "VolumeSnapshotLocation", - } - BackupGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "Backup", - } - RestoreGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "Restore", - } - ScheduleGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "Schedule", - } - BackupRepositoryGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "BackupRepository", - } - DataUploadGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v2alpha1", - Kind: "DataUpload", - } - DataDownloadGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v2alpha1", - Kind: "DataDownload", - } - PodVolumeBackupGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "PodVolumeBackup", - } - PodVolumeRestoreGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "PodVolumeRestore", - } - DownloadRequestGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "DownloadRequest", - } - DeleteBackupRequestGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "DeleteBackupRequest", - } - ServerStatusRequestGVK = schema.GroupVersionKind{ - Group: "velero.io", - Version: "v1", - Kind: "ServerStatusRequest", - } - StorageClassGVK = schema.GroupVersionKind{ - Group: "storage.k8s.io", - Version: "v1", - Kind: "StorageClass", - } - VolumeSnapshotClassGVK = schema.GroupVersionKind{ - Group: "snapshot.storage.k8s.io", - Version: "v1", - Kind: "VolumeSnapshotClass", - } - CSIDriverGVK = schema.GroupVersionKind{ - Group: "storage.k8s.io", - Version: "v1", - Kind: "CSIDriver", - } -) diff --git a/must-gather/pkg/templates/summary.go b/must-gather/pkg/templates/summary.go deleted file mode 100644 index c31d38566f1..00000000000 --- a/must-gather/pkg/templates/summary.go +++ /dev/null @@ -1,1389 +0,0 @@ -package templates - -import ( - "bytes" - "context" - "fmt" - "os" - "path" - "slices" - "strings" - "time" - - volumesnapshotv1 "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1" - openshiftconfigv1 "github.com/openshift/api/config/v1" - oadpv1alpha1 "github.com/openshift/oadp-operator/api/v1alpha1" - operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" - velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" - velerov2alpha1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v2alpha1" - "github.com/vmware-tanzu/velero/pkg/cmd/util/downloadrequest" - "github.com/vmware-tanzu/velero/pkg/cmd/util/output" - "github.com/vmware-tanzu/velero/pkg/label" - corev1 "k8s.io/api/core/v1" - storagev1 "k8s.io/api/storage/v1" - apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" - "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/cli-runtime/pkg/printers" - "k8s.io/client-go/rest" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/openshift/oadp-operator/must-gather/pkg/gvk" -) - -const ( - FilePermission = 0644 - FolderPermission = 0777 -) - -var ( - summaryTemplateReplacesKeys = []string{ - "MUST_GATHER_VERSION", - "ERRORS", - "CLUSTER_ID", "OCP_VERSION", "CLOUD", "ARCH", "CLUSTER_VERSION", - "OADP_VERSIONS", - "DATA_PROTECTION_APPLICATIONS", - "CLOUD_STORAGES", - "BACKUP_STORAGE_LOCATIONS", - "VOLUME_SNAPSHOT_LOCATIONS", - "BACKUPS", - "RESTORES", - "SCHEDULES", - "BACKUPS_REPOSITORIES", - "DATA_UPLOADS", - "DATA_DOWNLOADS", - "POD_VOLUME_BACKUPS", - "POD_VOLUME_RESTORES", - "DOWNLOAD_REQUESTS", - "DELETE_BACKUP_REQUESTS", - "SERVER_STATUS_REQUESTS", - "STORAGE_CLASSES", - "VOLUME_SNAPSHOT_CLASSES", - "CSI_DRIVERS", - "CUSTOM_RESOURCE_DEFINITION", - } - summaryTemplateReplaces = map[string]string{} -) - -const summaryTemplate = `# OADP must-gather summary version <> - -[OADP Frequently Asked Questions](https://access.redhat.com/articles/5456281) - -# Table of Contents - -- [Errors](#errors) -- [Cluster information](#cluster-information) -- [OADP operator installation information](#oadp-operator-installation-information) - - [DataProtectionApplications (DPAs)](#dataprotectionapplications-dpas) - - [CloudStorages](#cloudstorages) - - [BackupStorageLocations (BSLs)](#backupstoragelocations-bsls) - - [VolumeSnapshotLocations (VSLs)](#volumesnapshotlocations-vsls) - - [Backups](#backups) - - [Restores](#restores) - - [Schedules](#schedules) - - [BackupRepositories](#backuprepositories) - - [DataUploads](#datauploads) - - [DataDownloads](#datadownloads) - - [PodVolumeBackups](#podvolumebackups) - - [PodVolumeRestores](#podvolumerestores) - - [DownloadRequests](#downloadrequests) - - [DeleteBackupRequests](#deletebackuprequests) - - [ServerStatusRequests](#serverstatusrequests) - - [NonAdminBackupStorageLocationRequests](#nonadminbackupstoragelocationrequests) - - [NonAdminBackupStorageLocations](#nonadminbackupstoragelocations) - - [NonAdminBackups](#nonadminbackups) - - [NonAdminRestores](#nonadminrestores) - - [NonAdminDownloadRequests](#nonadmindownloadrequests) -- Storage - - [Available StorageClasses in cluster](#available-storageclasses-in-cluster) - - [Available VolumeSnapshotClasses in cluster](#available-volumesnapshotclasses-in-cluster) - - [Available CSIDrivers in cluster](#available-csidrivers-in-cluster) -- [CustomResourceDefinitions](#customresourcedefinitions) - -## Errors - -<> - -## Cluster information - -| Cluster ID | OpenShift version | Cloud provider | Architecture | -| ---------- | ----------------- | -------------- | ------------ | -| <> | <> | <> | <> | - -<> - -## OADP operator installation information - -<> - -### DataProtectionApplications (DPAs) - -<> - -### CloudStorages - -<> - -### BackupStorageLocations (BSLs) - -<> - -### VolumeSnapshotLocations (VSLs) - -<> - -### Backups - -<> - -### Restores - -<> - -### Schedules - -<> - -### BackupRepositories - -<> - -### DataUploads - -<> - -### DataDownloads - -<> - -### PodVolumeBackups - -<> - -### PodVolumeRestores - -<> - -### DownloadRequests - -<> - -### DeleteBackupRequests - -<> - -### ServerStatusRequests - -<> - -## Available StorageClasses in cluster - -<> - -## Available VolumeSnapshotClasses in cluster - -<> - -## Available CSIDrivers in cluster - -<> - -> **Note:** check [supported Container Storage Interface drivers for OpenShift](https://docs.redhat.com/en/documentation/openshift_container_platform/latest/html/storage/using-container-storage-interface-csi#csi-drivers-supported_persistent-storage-csi) - -## CustomResourceDefinitions - -<> -` - -func init() { - for _, key := range summaryTemplateReplacesKeys { - summaryTemplateReplaces[key] = "" - } -} - -func ReplaceMustGatherVersion(version string) { - summaryTemplateReplaces["MUST_GATHER_VERSION"] = "`" + version + "`" -} - -func ReplaceClusterInformationSection( - outputPath string, - clusterID string, - clusterVersion *openshiftconfigv1.ClusterVersion, - infrastructureList *openshiftconfigv1.InfrastructureList, - nodeList *corev1.NodeList, -) { - summaryTemplateReplaces["CLUSTER_ID"] = clusterID - - summaryTemplateReplaces["OCP_VERSION"] = clusterVersion.Status.Desired.Version - summaryTemplateReplaces["CLUSTER_VERSION"] = createYAML(outputPath, "cluster-scoped-resources/config.openshift.io/clusterversions.yaml", clusterVersion) - - if infrastructureList != nil && len(infrastructureList.Items) != 0 { - cloudProvider := string(infrastructureList.Items[0].Spec.PlatformSpec.Type) - summaryTemplateReplaces["CLOUD"] = cloudProvider - } else { - summaryTemplateReplaces["CLOUD"] = "❌ no Infrastructure found in cluster" - summaryTemplateReplaces["ERRORS"] += "⚠️ No Infrastructure found in cluster\n\n" - } - - if nodeList != nil && len(nodeList.Items) != 0 { - architectureText := "" - for _, node := range nodeList.Items { - arch := node.Status.NodeInfo.OperatingSystem + "/" + node.Status.NodeInfo.Architecture - if len(architectureText) == 0 { - architectureText += arch - } else { - if !strings.Contains(architectureText, arch) { - architectureText += " | " + arch - } - } - } - summaryTemplateReplaces["ARCH"] = architectureText - } else { - summaryTemplateReplaces["ARCH"] = "❌ no Node found in cluster" - summaryTemplateReplaces["ERRORS"] += "⚠️ No Node found in cluster\n\n" - } -} - -func ReplaceOADPOperatorInstallationSection( - outputPath string, - importantCSVsByNamespace map[string][]operatorsv1alpha1.ClusterServiceVersion, - importantSubscriptionsByNamespace map[string][]operatorsv1alpha1.Subscription, - foundOADP bool, - foundRelatedProducts bool, - oldOADPError string, - oadpOperatorsText string, -) { - if len(importantCSVsByNamespace) == 0 { - summaryTemplateReplaces["OADP_VERSIONS"] = "❌ No OADP Operator was found installed in the cluster\n\nNo related product was found installed in the cluster" - summaryTemplateReplaces["ERRORS"] += "🚫 No OADP Operator was found installed in the cluster\n\n" - } else { - for namespace, csvs := range importantCSVsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - for _, csv := range csvs { - csv.GetObjectKind().SetGroupVersionKind(gvk.ClusterServiceVersionGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &csv}) - } - folder := fmt.Sprintf("namespaces/%s/operators.coreos.com/clusterserviceversions", namespace) - oadpOperatorsText += createYAML(outputPath, folder+"/clusterserviceversions.yaml", list) - } - for namespace, subscriptions := range importantSubscriptionsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - for _, subscription := range subscriptions { - subscription.GetObjectKind().SetGroupVersionKind(gvk.SubscriptionsGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &subscription}) - } - folder := fmt.Sprintf("namespaces/%s/operators.coreos.com/subscriptions", namespace) - oadpOperatorsText += createYAML(outputPath, folder+"/subscriptions.yaml", list) - } - if len(oldOADPError) > 0 { - summaryTemplateReplaces["ERRORS"] += oldOADPError - } - if !foundOADP { - summaryTemplateReplaces["OADP_VERSIONS"] += "❌ No OADP Operator was found installed in the cluster\n\n" - summaryTemplateReplaces["ERRORS"] += "🚫 No OADP Operator was found installed in the cluster\n\n" - } - summaryTemplateReplaces["OADP_VERSIONS"] += oadpOperatorsText - if !foundRelatedProducts { - summaryTemplateReplaces["OADP_VERSIONS"] += "No related product was found installed in the cluster\n\n" - } - summaryTemplateReplaces["OADP_VERSIONS"] += fmt.Sprintf("For information about all objects collected in each namespace, check [`%[1]snamespaces`](%[1]snamespaces) folder", outputPath) - } -} - -func ReplaceDataProtectionApplicationsSection(outputPath string, dataProtectionApplicationList *oadpv1alpha1.DataProtectionApplicationList) { - if dataProtectionApplicationList != nil && len(dataProtectionApplicationList.Items) != 0 { - dataProtectionApplicationsByNamespace := map[string][]oadpv1alpha1.DataProtectionApplication{} - - for _, dataProtectionApplication := range dataProtectionApplicationList.Items { - dataProtectionApplicationsByNamespace[dataProtectionApplication.Namespace] = append(dataProtectionApplicationsByNamespace[dataProtectionApplication.Namespace], dataProtectionApplication) - } - - summaryTemplateReplaces["DATA_PROTECTION_APPLICATIONS"] += "| Namespace | Name | spec.unsupportedOverrides | status.conditions[0] | yaml |\n| --- | --- | --- | --- | --- |\n" - for namespace, dataProtectionApplications := range dataProtectionApplicationsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/oadp.openshift.io/dataprotectionapplications", namespace) - file := folder + "/dataprotectionapplications.yaml" - for _, dataProtectionApplication := range dataProtectionApplications { - dataProtectionApplication.GetObjectKind().SetGroupVersionKind(gvk.DataProtectionApplicationGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &dataProtectionApplication}) - - unsupportedOverridesText := "false" - if dataProtectionApplication.Spec.UnsupportedOverrides != nil { - for _, value := range dataProtectionApplication.Spec.UnsupportedOverrides { - if value != "" { - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ DataProtectionApplication **%v** in **%v** namespace is using **unsupportedOverrides**\n\n", - dataProtectionApplication.Name, namespace, - ) - unsupportedOverridesText = "⚠️ true" - break - } - } - } - - dpaStatus := "" - if len(dataProtectionApplication.Status.Conditions) == 0 { - dpaStatus = "⚠️ no status" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ DataProtectionApplication **%v** with **no status** in **%v** namespace\n\n", - dataProtectionApplication.Name, namespace, - ) - } else { - condition := dataProtectionApplication.Status.Conditions[0] - if condition.Status == v1.ConditionTrue { - dpaStatus = fmt.Sprintf("✅ status %s: %s", condition.Type, condition.Status) - } else { - dpaStatus = fmt.Sprintf("❌ status %s: %s", condition.Type, condition.Status) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ DataProtectionApplication **%v** with **status %s: %s** in **%v** namespace\n\n", - dataProtectionApplication.Name, condition.Type, condition.Status, namespace, - ) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["DATA_PROTECTION_APPLICATIONS"] += fmt.Sprintf( - "| %v | %v | %v | %v | %s |\n", - namespace, dataProtectionApplication.Name, unsupportedOverridesText, dpaStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["DATA_PROTECTION_APPLICATIONS"] = "❌ No DataProtectionApplication was found in the cluster" - summaryTemplateReplaces["ERRORS"] += "⚠️ No DataProtectionApplication was found in the cluster\n\n" - } -} - -func ReplaceCloudStoragesSection(outputPath string, cloudStorageList *oadpv1alpha1.CloudStorageList) { - if cloudStorageList != nil && len(cloudStorageList.Items) != 0 { - cloudStorageByNamespace := map[string][]oadpv1alpha1.CloudStorage{} - - for _, cloudStorage := range cloudStorageList.Items { - cloudStorageByNamespace[cloudStorage.Namespace] = append(cloudStorageByNamespace[cloudStorage.Namespace], cloudStorage) - } - - summaryTemplateReplaces["CLOUD_STORAGES"] += "| Namespace | Name | yaml |\n| --- | --- | --- |\n" - for namespace, cloudStorages := range cloudStorageByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/oadp.openshift.io/cloudstorages", namespace) - file := folder + "/cloudstorages.yaml" - for _, cloudStorage := range cloudStorages { - cloudStorage.GetObjectKind().SetGroupVersionKind(gvk.CloudStorageGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &cloudStorage}) - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["BACKUPS"] += fmt.Sprintf( - "| %v | %v | %s |\n", - namespace, cloudStorage.Name, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["CLOUD_STORAGES"] = "❌ No CloudStorage was found in the cluster" - } -} - -func ReplaceBackupStorageLocationsSection(outputPath string, backupStorageLocationList *velerov1.BackupStorageLocationList) { - if backupStorageLocationList != nil && len(backupStorageLocationList.Items) != 0 { - backupStorageLocationsByNamespace := map[string][]velerov1.BackupStorageLocation{} - - for _, backupStorageLocation := range backupStorageLocationList.Items { - backupStorageLocationsByNamespace[backupStorageLocation.Namespace] = append(backupStorageLocationsByNamespace[backupStorageLocation.Namespace], backupStorageLocation) - } - - summaryTemplateReplaces["BACKUP_STORAGE_LOCATIONS"] += "| Namespace | Name | spec.default | status.phase | yaml |\n| --- | --- | --- | --- | --- |\n" - for namespace, backupStorageLocations := range backupStorageLocationsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/backupstoragelocations", namespace) - file := folder + "/backupstoragelocations.yaml" - for _, backupStorageLocation := range backupStorageLocations { - backupStorageLocation.GetObjectKind().SetGroupVersionKind(gvk.BackupStorageLocationGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &backupStorageLocation}) - - bslStatus := "" - bslStatusPhase := backupStorageLocation.Status.Phase - if len(bslStatusPhase) == 0 { - bslStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ BackupStorageLocation **%v** with **no status phase** in **%v** namespace\n\n", - backupStorageLocation.Name, namespace, - ) - } else { - if bslStatusPhase == velerov1.BackupStorageLocationPhaseAvailable { - bslStatus = fmt.Sprintf("✅ status phase %s", bslStatusPhase) - } else { - bslStatus = fmt.Sprintf("❌ status phase %s", bslStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ BackupStorageLocation **%v** with **status phase %s** in **%v** namespace\n\n", - backupStorageLocation.Name, bslStatusPhase, namespace, - ) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["BACKUP_STORAGE_LOCATIONS"] += fmt.Sprintf( - "| %v | %v | %t | %v | %s |\n", - namespace, backupStorageLocation.Name, backupStorageLocation.Spec.Default, bslStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["BACKUP_STORAGE_LOCATIONS"] = "❌ No BackupStorageLocation was found in the cluster" - summaryTemplateReplaces["ERRORS"] += "⚠️ No BackupStorageLocation was found in the cluster\n\n" - } -} - -func ReplaceVolumeSnapshotLocationsSection(outputPath string, volumeSnapshotLocationList *velerov1.VolumeSnapshotLocationList) { - if volumeSnapshotLocationList != nil && len(volumeSnapshotLocationList.Items) != 0 { - volumeSnapshotLocationsByNamespace := map[string][]velerov1.VolumeSnapshotLocation{} - - for _, volumeSnapshotLocation := range volumeSnapshotLocationList.Items { - volumeSnapshotLocationsByNamespace[volumeSnapshotLocation.Namespace] = append(volumeSnapshotLocationsByNamespace[volumeSnapshotLocation.Namespace], volumeSnapshotLocation) - } - - summaryTemplateReplaces["VOLUME_SNAPSHOT_LOCATIONS"] += "| Namespace | Name | yaml |\n| --- | --- | --- |\n" - for namespace, volumeSnapshotLocations := range volumeSnapshotLocationsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/volumesnapshotlocations", namespace) - file := folder + "/volumesnapshotlocations.yaml" - for _, volumeSnapshotLocation := range volumeSnapshotLocations { - volumeSnapshotLocation.GetObjectKind().SetGroupVersionKind(gvk.VolumeSnapshotLocationGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &volumeSnapshotLocation}) - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["VOLUME_SNAPSHOT_LOCATIONS"] += fmt.Sprintf( - "| %v | %v | %s |\n", - namespace, volumeSnapshotLocation.Name, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["VOLUME_SNAPSHOT_LOCATIONS"] = "❌ No VolumeSnapshotLocation was found in the cluster" - } -} - -func ReplaceBackupsSection( - outputPath string, - backupList *velerov1.BackupList, - clusterClient client.Client, - deleteBackupRequestList *velerov1.DeleteBackupRequestList, - podVolumeBackupList *velerov1.PodVolumeBackupList, - requestTimeot time.Duration, - skipTLS bool, -) { - if backupList != nil && len(backupList.Items) != 0 { - backupsByNamespace := map[string][]velerov1.Backup{} - - for _, backup := range backupList.Items { - backupsByNamespace[backup.Namespace] = append(backupsByNamespace[backup.Namespace], backup) - } - - summaryTemplateReplaces["BACKUPS"] += "| Namespace | Name | status.phase | describe | logs | yaml |\n| --- | --- | --- | --- | --- | ---|\n" - for namespace, backups := range backupsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/backups", namespace) - file := folder + "/backups.yaml" - for _, backup := range backups { - backup.GetObjectKind().SetGroupVersionKind(gvk.BackupGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &backup}) - - backupStatus := "" - backupStatusPhase := backup.Status.Phase - if len(backupStatusPhase) == 0 { - backupStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ Backup **%v** with **no status phase** in **%v** namespace\n\n", - backup.Name, namespace, - ) - } else { - failedStates := []velerov1.BackupPhase{ - velerov1.BackupPhaseFailed, - velerov1.BackupPhasePartiallyFailed, - velerov1.BackupPhaseFinalizingPartiallyFailed, - velerov1.BackupPhaseWaitingForPluginOperationsPartiallyFailed, - velerov1.BackupPhaseFailedValidation, - } - if backupStatusPhase == velerov1.BackupPhaseCompleted { - backupStatus = fmt.Sprintf("✅ status phase %s", backupStatusPhase) - } else if slices.Contains(failedStates, backupStatusPhase) { - backupStatus = fmt.Sprintf("❌ status phase %s", backupStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ Backup **%v** with **status phase %s** in **%v** namespace\n\n", - backup.Name, backupStatusPhase, namespace, - ) - } else { - backupStatus = fmt.Sprintf("⚠️ status phase %s", backupStatusPhase) - } - } - - var relatedDeleteBackupRequests []velerov1.DeleteBackupRequest - for _, deleteBackupRequest := range deleteBackupRequestList.Items { - if deleteBackupRequest.Labels[velerov1.BackupNameLabel] == label.GetValidName(backup.Name) && - deleteBackupRequest.Labels[velerov1.BackupUIDLabel] == string(backup.UID) { - relatedDeleteBackupRequests = append(relatedDeleteBackupRequests, deleteBackupRequest) - } - } - var relatedPodVolumeBackupLists []velerov1.PodVolumeBackup - for _, podVolumeBackup := range podVolumeBackupList.Items { - if podVolumeBackup.Labels[velerov1.BackupNameLabel] == label.GetValidName(backup.Name) { - relatedPodVolumeBackupLists = append(relatedPodVolumeBackupLists, podVolumeBackup) - } - } - - // TODO caCertFile? - describeOutput := func(ctx context.Context) string { - ctx, cancel := context.WithTimeout(ctx, requestTimeot) - defer cancel() - return output.DescribeBackup(ctx, clusterClient, &backup, relatedDeleteBackupRequests, relatedPodVolumeBackupLists, true, skipTLS, "") - }(context.Background()) - - writeTo := &bytes.Buffer{} - // TODO caCertFile? - err := downloadrequest.Stream(context.Background(), clusterClient, backup.Namespace, backup.Name, velerov1.DownloadTargetKindBackupLog, writeTo, requestTimeot, skipTLS, "") - var logs string - if err != nil { - fmt.Println(err) - logs = fmt.Sprintf("❌ %s", err) - } else { - logs = createFile( - outputPath, - folder+"/"+backup.Name+".log", - writeTo.String(), - "logs", - ) - } - yamlLink := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["BACKUPS"] += fmt.Sprintf( - "| %v | %v | %s | %s | %s | %s |\n", - namespace, backup.Name, - backupStatus, - createFile( - outputPath, - folder+"/describe-"+backup.Name+".txt", - describeOutput, - "describe", - ), - logs, - yamlLink, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["BACKUPS"] = "❌ No Backup was found in the cluster" - } -} - -func ReplaceRestoresSection( - outputPath string, - restoreListList *velerov1.RestoreList, - clusterClient client.Client, - podVolumeRestoreList *velerov1.PodVolumeRestoreList, - requestTimeot time.Duration, - skipTLS bool, -) { - if restoreListList != nil && len(restoreListList.Items) != 0 { - restoresByNamespace := map[string][]velerov1.Restore{} - - for _, restore := range restoreListList.Items { - restoresByNamespace[restore.Namespace] = append(restoresByNamespace[restore.Namespace], restore) - } - - summaryTemplateReplaces["RESTORES"] += "| Namespace | Name | status.phase | describe | logs | yaml |\n| --- | --- | --- | --- | --- | --- |\n" - for namespace, restores := range restoresByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/restores", namespace) - file := folder + "/restores.yaml" - for _, restore := range restores { - restore.GetObjectKind().SetGroupVersionKind(gvk.RestoreGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &restore}) - - restoreStatus := "" - restoreStatusPhase := restore.Status.Phase - if len(restoreStatusPhase) == 0 { - restoreStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ Restore **%v** with **no status phase** in **%v** namespace\n\n", - restore.Name, namespace, - ) - } else { - failedStates := []velerov1.RestorePhase{ - velerov1.RestorePhaseFailed, - velerov1.RestorePhasePartiallyFailed, - velerov1.RestorePhaseFinalizingPartiallyFailed, - velerov1.RestorePhaseWaitingForPluginOperationsPartiallyFailed, - velerov1.RestorePhaseFailedValidation, - } - if restoreStatusPhase == velerov1.RestorePhaseCompleted { - restoreStatus = fmt.Sprintf("✅ status phase %s", restoreStatusPhase) - } else if slices.Contains(failedStates, restoreStatusPhase) { - restoreStatus = fmt.Sprintf("❌ status phase %s", restoreStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ Restore **%v** with **status phase %s** in **%v** namespace\n\n", - restore.Name, restoreStatusPhase, namespace, - ) - } else { - restoreStatus = fmt.Sprintf("⚠️ status phase %s", restoreStatusPhase) - } - } - - var relatedPodVolumeRestoreLists []velerov1.PodVolumeRestore - for _, podVolumeRestore := range podVolumeRestoreList.Items { - if podVolumeRestore.Labels[velerov1.RestoreNameLabel] == label.GetValidName(restore.Name) { - relatedPodVolumeRestoreLists = append(relatedPodVolumeRestoreLists, podVolumeRestore) - } - } - - // TODO caCertFile? - describeOutput := func(ctx context.Context) string { - ctx, cancel := context.WithTimeout(ctx, requestTimeot) - defer cancel() - return output.DescribeRestore(ctx, clusterClient, &restore, relatedPodVolumeRestoreLists, true, skipTLS, "") - }(context.Background()) - - writeTo := &bytes.Buffer{} - // TODO caCertFile? - err := downloadrequest.Stream(context.Background(), clusterClient, restore.Namespace, restore.Name, velerov1.DownloadTargetKindRestoreLog, writeTo, requestTimeot, skipTLS, "") - var logs string - if err != nil { - fmt.Println(err) - logs = fmt.Sprintf("❌ %s", err) - } else { - logs = createFile( - outputPath, - folder+"/"+restore.Name+".log", - writeTo.String(), - "logs", - ) - } - - yamllink := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["RESTORES"] += fmt.Sprintf( - "| %v | %v | %s | %s | %s | %s |\n", - namespace, restore.Name, - restoreStatus, - createFile( - outputPath, - folder+"/describe-"+restore.Name+".txt", - describeOutput, - "describe", - ), - logs, - yamllink, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["RESTORES"] = "❌ No Restore was found in the cluster" - } -} - -func ReplaceSchedulesSection(outputPath string, scheduleList *velerov1.ScheduleList) { - if scheduleList != nil && len(scheduleList.Items) != 0 { - schedulesByNamespace := map[string][]velerov1.Schedule{} - - for _, schedule := range scheduleList.Items { - schedulesByNamespace[schedule.Namespace] = append(schedulesByNamespace[schedule.Namespace], schedule) - } - - summaryTemplateReplaces["SCHEDULES"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, schedules := range schedulesByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/schedules", namespace) - file := folder + "/schedules.yaml" - for _, schedule := range schedules { - schedule.GetObjectKind().SetGroupVersionKind(gvk.ScheduleGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &schedule}) - - scheduleStatus := "" - scheduleStatusPhase := schedule.Status.Phase - if len(scheduleStatusPhase) == 0 { - scheduleStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ Schedule **%v** with **no status phase** in **%v** namespace\n\n", - schedule.Name, namespace, - ) - } else { - if scheduleStatusPhase == velerov1.SchedulePhaseEnabled { - scheduleStatus = fmt.Sprintf("✅ status phase %s", scheduleStatusPhase) - } else if scheduleStatusPhase == velerov1.SchedulePhaseFailedValidation { - scheduleStatus = fmt.Sprintf("❌ status phase %s", scheduleStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ Schedule **%v** with **status phase %s** in **%v** namespace\n\n", - schedule.Name, scheduleStatusPhase, namespace, - ) - } else { - scheduleStatus = fmt.Sprintf("⚠️ status phase %s", scheduleStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["SCHEDULES"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, schedule.Name, scheduleStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["SCHEDULES"] = "❌ No Schedule was found in the cluster" - } -} - -func ReplaceBackupRepositoriesSection(outputPath string, backupRepositoryList *velerov1.BackupRepositoryList) { - if backupRepositoryList != nil && len(backupRepositoryList.Items) != 0 { - backupRepositoriesByNamespace := map[string][]velerov1.BackupRepository{} - - for _, backupRepository := range backupRepositoryList.Items { - backupRepositoriesByNamespace[backupRepository.Namespace] = append(backupRepositoriesByNamespace[backupRepository.Namespace], backupRepository) - } - - summaryTemplateReplaces["BACKUPS_REPOSITORIES"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, backupRepositories := range backupRepositoriesByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/backuprepositories", namespace) - file := folder + "/backuprepositories.yaml" - for _, backupRepository := range backupRepositories { - backupRepository.GetObjectKind().SetGroupVersionKind(gvk.BackupRepositoryGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &backupRepository}) - - backupRepositoryStatus := "" - backupRepositoryStatusPhase := backupRepository.Status.Phase - if len(backupRepositoryStatusPhase) == 0 { - backupRepositoryStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ BackupRepository **%v** with **no status phase** in **%v** namespace\n\n", - backupRepository.Name, namespace, - ) - } else { - if backupRepositoryStatusPhase == velerov1.BackupRepositoryPhaseReady { - backupRepositoryStatus = fmt.Sprintf("✅ status phase %s", backupRepositoryStatusPhase) - } else if backupRepositoryStatusPhase == velerov1.BackupRepositoryPhaseNotReady { - backupRepositoryStatus = fmt.Sprintf("❌ status phase %s", backupRepositoryStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ BackupRepository **%v** with **status phase %s** in **%v** namespace\n\n", - backupRepository.Name, backupRepositoryStatusPhase, namespace, - ) - } else { - backupRepositoryStatus = fmt.Sprintf("⚠️ status phase %s", backupRepositoryStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["BACKUPS_REPOSITORIES"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, backupRepository.Name, backupRepositoryStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["BACKUPS_REPOSITORIES"] = "❌ No BackupRepository was found in the cluster" - } -} - -func ReplaceDataUploadsSection(outputPath string, dataUploadList *velerov2alpha1.DataUploadList) { - if dataUploadList != nil && len(dataUploadList.Items) != 0 { - dataUploadByNamespace := map[string][]velerov2alpha1.DataUpload{} - - for _, dataUpload := range dataUploadList.Items { - dataUploadByNamespace[dataUpload.Namespace] = append(dataUploadByNamespace[dataUpload.Namespace], dataUpload) - } - - summaryTemplateReplaces["DATA_UPLOADS"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, dataUploads := range dataUploadByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/datauploads", namespace) - file := folder + "/datauploads.yaml" - for _, dataUpload := range dataUploads { - dataUpload.GetObjectKind().SetGroupVersionKind(gvk.DataUploadGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &dataUpload}) - - dataUploadStatus := "" - dataUploadStatusPhase := dataUpload.Status.Phase - if len(dataUploadStatusPhase) == 0 { - dataUploadStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ DataUpload **%v** with **no status phase** in **%v** namespace\n\n", - dataUpload.Name, namespace, - ) - } else { - failedStates := []velerov2alpha1.DataUploadPhase{ - velerov2alpha1.DataUploadPhaseCanceling, - velerov2alpha1.DataUploadPhaseCanceled, - velerov2alpha1.DataUploadPhaseFailed, - } - if dataUploadStatusPhase == velerov2alpha1.DataUploadPhaseCompleted { - dataUploadStatus = fmt.Sprintf("✅ status phase %s", dataUploadStatusPhase) - } else if slices.Contains(failedStates, dataUploadStatusPhase) { - dataUploadStatus = fmt.Sprintf("❌ status phase %s", dataUploadStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ DataUpload **%v** with **status phase %s** in **%v** namespace\n\n", - dataUpload.Name, dataUploadStatusPhase, namespace, - ) - } else { - dataUploadStatus = fmt.Sprintf("⚠️ status phase %s", dataUploadStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["DATA_UPLOADS"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, dataUpload.Name, dataUploadStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["DATA_UPLOADS"] = "❌ No DataUpload was found in the cluster" - } -} - -func ReplaceDataDownloadsSection(outputPath string, dataDownloadList *velerov2alpha1.DataDownloadList) { - if dataDownloadList != nil && len(dataDownloadList.Items) != 0 { - dataDownloadByNamespace := map[string][]velerov2alpha1.DataDownload{} - - for _, dataDownload := range dataDownloadList.Items { - dataDownloadByNamespace[dataDownload.Namespace] = append(dataDownloadByNamespace[dataDownload.Namespace], dataDownload) - } - - summaryTemplateReplaces["DATA_DOWNLOADS"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, dataDownloads := range dataDownloadByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/datadownloads", namespace) - file := folder + "/datadownloads.yaml" - for _, dataDownload := range dataDownloads { - dataDownload.GetObjectKind().SetGroupVersionKind(gvk.DataDownloadGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &dataDownload}) - - dataDownloadStatus := "" - dataDownloadStatusPhase := dataDownload.Status.Phase - if len(dataDownloadStatusPhase) == 0 { - dataDownloadStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ DataDownload **%v** with **no status phase** in **%v** namespace\n\n", - dataDownload.Name, namespace, - ) - } else { - failedStates := []velerov2alpha1.DataDownloadPhase{ - velerov2alpha1.DataDownloadPhaseCanceling, - velerov2alpha1.DataDownloadPhaseCanceled, - velerov2alpha1.DataDownloadPhaseFailed, - } - if dataDownloadStatusPhase == velerov2alpha1.DataDownloadPhaseCompleted { - dataDownloadStatus = fmt.Sprintf("✅ status phase %s", dataDownloadStatusPhase) - } else if slices.Contains(failedStates, dataDownloadStatusPhase) { - dataDownloadStatus = fmt.Sprintf("❌ status phase %s", dataDownloadStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ DataDownload **%v** with **status phase %s** in **%v** namespace\n\n", - dataDownload.Name, dataDownloadStatusPhase, namespace, - ) - } else { - dataDownloadStatus = fmt.Sprintf("⚠️ status phase %s", dataDownloadStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["DATA_DOWNLOADS"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, dataDownload.Name, dataDownloadStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["DATA_DOWNLOADS"] = "❌ No DataDownload was found in the cluster" - } -} - -func ReplacePodVolumeBackupsSection(outputPath string, podVolumeBackupList *velerov1.PodVolumeBackupList) { - if podVolumeBackupList != nil && len(podVolumeBackupList.Items) != 0 { - podVolumeBackupsByNamespace := map[string][]velerov1.PodVolumeBackup{} - - for _, podVolumeBackup := range podVolumeBackupList.Items { - podVolumeBackupsByNamespace[podVolumeBackup.Namespace] = append(podVolumeBackupsByNamespace[podVolumeBackup.Namespace], podVolumeBackup) - } - - summaryTemplateReplaces["POD_VOLUME_BACKUPS"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, podVolumeBackups := range podVolumeBackupsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/podvolumebackups", namespace) - file := folder + "/podvolumebackups.yaml" - for _, podVolumeBackup := range podVolumeBackups { - podVolumeBackup.GetObjectKind().SetGroupVersionKind(gvk.PodVolumeBackupGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &podVolumeBackup}) - - podVolumeBackupStatus := "" - podVolumeBackupStatusPhase := podVolumeBackup.Status.Phase - if len(podVolumeBackupStatusPhase) == 0 { - podVolumeBackupStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ PodVolumeBackup **%v** with **no status phase** in **%v** namespace\n\n", - podVolumeBackup.Name, namespace, - ) - } else { - if podVolumeBackupStatusPhase == velerov1.PodVolumeBackupPhaseCompleted { - podVolumeBackupStatus = fmt.Sprintf("✅ status phase %s", podVolumeBackupStatusPhase) - } else if podVolumeBackupStatusPhase == velerov1.PodVolumeBackupPhaseFailed { - podVolumeBackupStatus = fmt.Sprintf("❌ status phase %s", podVolumeBackupStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ PodVolumeBackup **%v** with **status phase %s** in **%v** namespace\n\n", - podVolumeBackup.Name, podVolumeBackupStatusPhase, namespace, - ) - } else { - podVolumeBackupStatus = fmt.Sprintf("⚠️ status phase %s", podVolumeBackupStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["POD_VOLUME_BACKUPS"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, podVolumeBackup.Name, podVolumeBackupStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["POD_VOLUME_BACKUPS"] = "❌ No PodVolumeBackup was found in the cluster" - } -} - -func ReplacePodVolumeRestoresSection(outputPath string, podVolumeRestoreList *velerov1.PodVolumeRestoreList) { - if podVolumeRestoreList != nil && len(podVolumeRestoreList.Items) != 0 { - podVolumeRestoresByNamespace := map[string][]velerov1.PodVolumeRestore{} - - for _, podVolumeRestore := range podVolumeRestoreList.Items { - podVolumeRestoresByNamespace[podVolumeRestore.Namespace] = append(podVolumeRestoresByNamespace[podVolumeRestore.Namespace], podVolumeRestore) - } - - summaryTemplateReplaces["POD_VOLUME_RESTORES"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, podVolumeRestores := range podVolumeRestoresByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/podvolumerestores", namespace) - file := folder + "/podvolumerestores.yaml" - for _, podVolumeRestore := range podVolumeRestores { - podVolumeRestore.GetObjectKind().SetGroupVersionKind(gvk.PodVolumeRestoreGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &podVolumeRestore}) - - podVolumeRestoreStatus := "" - podVolumeRestoreStatusPhase := podVolumeRestore.Status.Phase - if len(podVolumeRestoreStatusPhase) == 0 { - podVolumeRestoreStatus = "⚠️ no status phase" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ PodVolumeRestore **%v** with **no status phase** in **%v** namespace\n\n", - podVolumeRestore.Name, namespace, - ) - } else { - if podVolumeRestoreStatusPhase == velerov1.PodVolumeRestorePhaseCompleted { - podVolumeRestoreStatus = fmt.Sprintf("✅ status phase %s", podVolumeRestoreStatusPhase) - } else if podVolumeRestoreStatusPhase == velerov1.PodVolumeRestorePhaseFailed { - podVolumeRestoreStatus = fmt.Sprintf("❌ status phase %s", podVolumeRestoreStatusPhase) - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "❌ PodVolumeRestore **%v** with **status phase %s** in **%v** namespace\n\n", - podVolumeRestore.Name, podVolumeRestoreStatusPhase, namespace, - ) - } else { - podVolumeRestoreStatus = fmt.Sprintf("⚠️ status phase %s", podVolumeRestoreStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["POD_VOLUME_RESTORES"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, podVolumeRestore.Name, podVolumeRestoreStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["POD_VOLUME_RESTORES"] = "❌ No PodVolumeRestore was found in the cluster" - } -} - -func ReplaceDownloadRequestsSection(outputPath string, downloadRequestList *velerov1.DownloadRequestList) { - if downloadRequestList != nil && len(downloadRequestList.Items) != 0 { - downloadRequestsByNamespace := map[string][]velerov1.DownloadRequest{} - - for _, downloadRequest := range downloadRequestList.Items { - downloadRequestsByNamespace[downloadRequest.Namespace] = append(downloadRequestsByNamespace[downloadRequest.Namespace], downloadRequest) - } - - summaryTemplateReplaces["DOWNLOAD_REQUESTS"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, downloadRequests := range downloadRequestsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/downloadrequests", namespace) - file := folder + "/downloadrequests.yaml" - for _, downloadRequest := range downloadRequests { - downloadRequest.GetObjectKind().SetGroupVersionKind(gvk.DownloadRequestGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &downloadRequest}) - - downloadRequestStatus := "" - downloadRequestStatusPhase := downloadRequest.Status.Phase - if len(downloadRequestStatusPhase) == 0 { - downloadRequestStatus = "⚠️ no status" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ DownloadRequest **%v** with **no status** in **%v** namespace\n\n", - downloadRequest.Name, namespace, - ) - } else { - if downloadRequestStatusPhase == velerov1.DownloadRequestPhaseProcessed { - downloadRequestStatus = fmt.Sprintf("✅ status phase %s", downloadRequestStatusPhase) - } else { - downloadRequestStatus = fmt.Sprintf("⚠️ status phase %s", downloadRequestStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["DOWNLOAD_REQUESTS"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, downloadRequest.Name, downloadRequestStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["DOWNLOAD_REQUESTS"] = "❌ No DownloadRequest was found in the cluster" - } -} - -func ReplaceDeleteBackupRequestsSection(outputPath string, deleteBackupRequestList *velerov1.DeleteBackupRequestList) { - if deleteBackupRequestList != nil && len(deleteBackupRequestList.Items) != 0 { - deleteBackupRequestsByNamespace := map[string][]velerov1.DeleteBackupRequest{} - - for _, deleteBackupRequest := range deleteBackupRequestList.Items { - deleteBackupRequestsByNamespace[deleteBackupRequest.Namespace] = append(deleteBackupRequestsByNamespace[deleteBackupRequest.Namespace], deleteBackupRequest) - } - - summaryTemplateReplaces["DELETE_BACKUP_REQUESTS"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, deleteBackupRequests := range deleteBackupRequestsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/deletebackuprequests", namespace) - file := folder + "/deletebackuprequests.yaml" - for _, deleteBackupRequest := range deleteBackupRequests { - deleteBackupRequest.GetObjectKind().SetGroupVersionKind(gvk.DeleteBackupRequestGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &deleteBackupRequest}) - - deleteBackupRequestStatus := "" - deleteBackupRequestStatusPhase := deleteBackupRequest.Status.Phase - if len(deleteBackupRequestStatusPhase) == 0 { - deleteBackupRequestStatus = "⚠️ no status" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ DeleteBackupRequest **%v** with **no status** in **%v** namespace\n\n", - deleteBackupRequest.Name, namespace, - ) - } else { - if deleteBackupRequestStatusPhase == velerov1.DeleteBackupRequestPhaseProcessed { - deleteBackupRequestStatus = fmt.Sprintf("✅ status phase %s", deleteBackupRequestStatusPhase) - } else { - deleteBackupRequestStatus = fmt.Sprintf("⚠️ status phase %s", deleteBackupRequestStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["DELETE_BACKUP_REQUESTS"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, deleteBackupRequest.Name, deleteBackupRequestStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["DELETE_BACKUP_REQUESTS"] = "❌ No DeleteBackupRequest was found in the cluster" - } -} - -func ReplaceServerStatusRequestsSection(outputPath string, serverStatusRequestList *velerov1.ServerStatusRequestList) { - if serverStatusRequestList != nil && len(serverStatusRequestList.Items) != 0 { - serverStatusRequestsByNamespace := map[string][]velerov1.ServerStatusRequest{} - - for _, serverStatusRequest := range serverStatusRequestList.Items { - serverStatusRequestsByNamespace[serverStatusRequest.Namespace] = append(serverStatusRequestsByNamespace[serverStatusRequest.Namespace], serverStatusRequest) - } - - summaryTemplateReplaces["SERVER_STATUS_REQUESTS"] += "| Namespace | Name | status.phase | yaml |\n| --- | --- | --- | --- |\n" - for namespace, serverStatusRequests := range serverStatusRequestsByNamespace { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - folder := fmt.Sprintf("namespaces/%s/velero.io/serverstatusrequests", namespace) - file := folder + "/serverstatusrequests.yaml" - for _, serverStatusRequest := range serverStatusRequests { - serverStatusRequest.GetObjectKind().SetGroupVersionKind(gvk.ServerStatusRequestGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &serverStatusRequest}) - - serverStatusRequestStatus := "" - serverStatusRequestStatusPhase := serverStatusRequest.Status.Phase - if len(serverStatusRequestStatusPhase) == 0 { - serverStatusRequestStatus = "⚠️ no status" - summaryTemplateReplaces["ERRORS"] += fmt.Sprintf( - "⚠️ ServerStatusRequest **%v** with **no status** in **%v** namespace\n\n", - serverStatusRequest.Name, namespace, - ) - } else { - if serverStatusRequestStatusPhase == velerov1.ServerStatusRequestPhaseProcessed { - serverStatusRequestStatus = fmt.Sprintf("✅ status phase %s", serverStatusRequestStatusPhase) - } else { - serverStatusRequestStatus = fmt.Sprintf("⚠️ status phase %s", serverStatusRequestStatusPhase) - } - } - - link := fmt.Sprintf("[`yaml`](%s)", file) - summaryTemplateReplaces["SERVER_STATUS_REQUESTS"] += fmt.Sprintf( - "| %v | %v | %s | %s |\n", - namespace, serverStatusRequest.Name, serverStatusRequestStatus, link, - ) - } - - createYAML(outputPath, file, list) - } - } else { - summaryTemplateReplaces["SERVER_STATUS_REQUESTS"] = "❌ No ServerStatusRequest was found in the cluster" - } -} - -func ReplaceAvailableStorageClassesSection(outputPath string, storageClassList *storagev1.StorageClassList) { - if storageClassList != nil && len(storageClassList.Items) != 0 { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - for _, storageClass := range storageClassList.Items { - storageClass.GetObjectKind().SetGroupVersionKind(gvk.StorageClassGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &storageClass}) - } - summaryTemplateReplaces["STORAGE_CLASSES"] = createYAML(outputPath, "cluster-scoped-resources/storage.k8s.io/storageclasses/storageclasses.yaml", list) - } else { - summaryTemplateReplaces["STORAGE_CLASSES"] = "❌ No StorageClass was found in the cluster" - summaryTemplateReplaces["ERRORS"] += "⚠️ No StorageClass was found in the cluster\n\n" - } -} - -func ReplaceAvailableVolumeSnapshotClassesSection(outputPath string, volumeSnapshotClassList *volumesnapshotv1.VolumeSnapshotClassList) { - if volumeSnapshotClassList != nil && len(volumeSnapshotClassList.Items) != 0 { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - for _, volumeSnapshotClass := range volumeSnapshotClassList.Items { - volumeSnapshotClass.GetObjectKind().SetGroupVersionKind(gvk.VolumeSnapshotClassGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &volumeSnapshotClass}) - } - summaryTemplateReplaces["VOLUME_SNAPSHOT_CLASSES"] = createYAML(outputPath, "cluster-scoped-resources/snapshot.storage.k8s.io/volumesnapshotclasses/volumesnapshotclasses.yaml", list) - } else { - summaryTemplateReplaces["VOLUME_SNAPSHOT_CLASSES"] = "❌ No VolumeSnapshotClass was found in the cluster" - summaryTemplateReplaces["ERRORS"] += "⚠️ No VolumeSnapshotClass was found in the cluster\n\n" - } -} - -func ReplaceAvailableCSIDriversSection(outputPath string, csiDriverList *storagev1.CSIDriverList) { - if csiDriverList != nil && len(csiDriverList.Items) != 0 { - list := &corev1.List{} - list.GetObjectKind().SetGroupVersionKind(gvk.ListGVK) - - for _, csiDriver := range csiDriverList.Items { - csiDriver.GetObjectKind().SetGroupVersionKind(gvk.CSIDriverGVK) - list.Items = append(list.Items, runtime.RawExtension{Object: &csiDriver}) - } - summaryTemplateReplaces["CSI_DRIVERS"] = createYAML(outputPath, "cluster-scoped-resources/storage.k8s.io/csidrivers/csidrivers.yaml", list) - } else { - summaryTemplateReplaces["CSI_DRIVERS"] = "❌ No CSIDriver was found in the cluster" - summaryTemplateReplaces["ERRORS"] += "⚠️ No CSIDriver was found in the cluster\n\n" - } -} - -func ReplaceCustomResourceDefinitionsSection(outputPath string, clusterConfig *rest.Config) { - errorMessage := "❌ Unable to write CustomResourceDefinitions section: " - - client, err := apiextensionsclientset.NewForConfig(clusterConfig) - if err != nil { - summaryTemplateReplaces["ERRORS"] += errorMessage + err.Error() + "\n\n" - summaryTemplateReplaces["CUSTOM_RESOURCE_DEFINITION"] = errorMessage + err.Error() - return - } - - crdsPath := "cluster-scoped-resources/apiextensions.k8s.io/customresourcedefinitions" - - // CRD spec.names.plural : CRD spec.group - crds := map[string]string{ - "dataprotectionapplications": gvk.DataProtectionApplicationGVK.Group, - "cloudstorages": gvk.CloudStorageGVK.Group, - "backupstoragelocations": gvk.BackupStorageLocationGVK.Group, - "volumesnapshotlocations": gvk.VolumeSnapshotLocationGVK.Group, - "backups": gvk.BackupGVK.Group, - "restores": gvk.RestoreGVK.Group, - "schedules": gvk.ScheduleGVK.Group, - "backuprepositories": gvk.BackupRepositoryGVK.Group, - "datauploads": gvk.DataUploadGVK.Group, - "datadownloads": gvk.DataDownloadGVK.Group, - "podvolumebackups": gvk.PodVolumeBackupGVK.Group, - "podvolumerestores": gvk.PodVolumeRestoreGVK.Group, - "downloadrequests": gvk.DownloadRequestGVK.Group, - "deletebackuprequests": gvk.DeleteBackupRequestGVK.Group, - "serverstatusrequests": gvk.ServerStatusRequestGVK.Group, - "clusterserviceversions": gvk.ClusterServiceVersionGVK.Group, - "subscriptions": gvk.SubscriptionsGVK.Group, - } - - for crdName, crdGroup := range crds { - crd, err := client.ApiextensionsV1().CustomResourceDefinitions().Get(context.Background(), crdName+"."+crdGroup, v1.GetOptions{}) - if err != nil { - summaryTemplateReplaces["ERRORS"] += errorMessage + err.Error() + "\n\n" - summaryTemplateReplaces["CUSTOM_RESOURCE_DEFINITION"] += errorMessage + err.Error() + "\n\n" - continue - } - crd.GetObjectKind().SetGroupVersionKind(gvk.CustomResourceDefinitionGVK) - createYAML(outputPath, crdsPath+fmt.Sprintf("/%s.yaml", crdName), crd) - } - - summaryTemplateReplaces["CUSTOM_RESOURCE_DEFINITION"] += fmt.Sprintf("For more information, check [`%s`](%s)\n\n", crdsPath, crdsPath) -} - -func createYAML(outputPath string, yamlPath string, obj runtime.Object) string { - objFilePath := outputPath + yamlPath - dir := path.Dir(objFilePath) - err := os.MkdirAll(dir, FolderPermission) - if err != nil { - return "❌ Unable to create dir " + dir - } - result := "" - newFile, err := os.Create(objFilePath) - if err != nil { - fmt.Println(err) - result = "❌ Unable to create file " + objFilePath - } else { - printer := printers.YAMLPrinter{} - err = printer.PrintObj(obj, newFile) - if err != nil { - fmt.Println(err) - result = "❌ Unable to write " + objFilePath - } else { - result = fmt.Sprintf("For more information, check [`%s`](%s)\n\n", yamlPath, yamlPath) - } - } - defer newFile.Close() - return result -} - -func createFile(outputPath string, describePath string, describeOutput string, describeTitle string) string { - describeFilePath := outputPath + describePath - dir := path.Dir(describeFilePath) - err := os.MkdirAll(dir, FolderPermission) - if err != nil { - return "❌ Unable to create dir " + dir - } - result := "" - newFile, err := os.Create(describeFilePath) - if err != nil { - fmt.Println(err) - result = "❌ Unable to create file " + describeFilePath - } else { - err := os.WriteFile(describeFilePath, []byte(describeOutput), FilePermission) - if err != nil { - fmt.Println(err) - result = "❌ Unable to write " + describeFilePath - } else { - result = fmt.Sprintf("[`"+describeTitle+"`](%s)", describePath) - } - } - defer newFile.Close() - return result -} - -func Write(outputPath string) error { - if len(summaryTemplateReplaces["ERRORS"]) == 0 { - summaryTemplateReplaces["ERRORS"] += "No errors happened or were found while running OADP must-gather\n\n" - } - - summary := summaryTemplate - for _, key := range summaryTemplateReplacesKeys { - value, ok := summaryTemplateReplaces[key] - if !ok { - return fmt.Errorf("key '%s' not set in SummaryTemplateReplaces", key) - } - if len(value) == 0 { - return fmt.Errorf("value for key '%s' not set in SummaryTemplateReplaces", key) - } - summary = strings.ReplaceAll( - summary, - fmt.Sprintf("<<%s>>", key), - value, - ) - } - - summaryPath := outputPath + "oadp-must-gather-summary.md" - sumary, err := os.Create(summaryPath) - if err != nil { - return err - } - err = os.WriteFile(summaryPath, []byte(summary), FilePermission) - if err != nil { - return err - } - defer sumary.Close() - return nil -} - -func WriteVersion(version string) error { - versionFileContent := fmt.Sprintf( - `OpenShift API for Data Protection (OADP) Must-gather -%s`, - version) - versionFilePath := "must-gather/version" - versionFile, err := os.Create(versionFilePath) - if err != nil { - return err - } - err = os.WriteFile(versionFilePath, []byte(versionFileContent), FilePermission) - if err != nil { - return err - } - defer versionFile.Close() - return nil -} diff --git a/tests/e2e/lib/apps.go b/tests/e2e/lib/apps.go index 16355f46177..f2689ff9002 100755 --- a/tests/e2e/lib/apps.go +++ b/tests/e2e/lib/apps.go @@ -385,19 +385,20 @@ func PrintNamespaceEventsAfterTime(c *kubernetes.Clientset, namespace string, st } func RunMustGather(artifact_dir string, clusterClient client.Client) error { - executablePath, err := os.Executable() + // Use MUST_GATHER_IMAGE env var, default to quay.io/konveyor/oadp-must-gather:oadp-1.4 + // For version-specific testing: MUST_GATHER_IMAGE=quay.io/konveyor/oadp-must-gather:oadp-1.5 + mustGatherImage := os.Getenv("MUST_GATHER_IMAGE") + if mustGatherImage == "" { + mustGatherImage = "quay.io/konveyor/oadp-must-gather:oadp-1.4" + } + + log.Printf("Running must-gather with image: %s", mustGatherImage) + cmd := exec.Command("oc", "adm", "must-gather", + "--image="+mustGatherImage, + "--dest-dir="+artifact_dir) + output, err := cmd.CombinedOutput() if err != nil { - return err - } - - _, err = exec.Command(filepath.Dir(filepath.Dir(filepath.Dir(executablePath))) + "/must-gather/oadp-must-gather").Output() - if err != nil { - return err - } - - _, err = exec.Command("mv", filepath.Dir(executablePath)+"/must-gather", artifact_dir).Output() - if err != nil { - return err + return fmt.Errorf("must-gather command failed: %w, output: %s", err, string(output)) } clusterVersionList := &openshiftconfigv1.ClusterVersionList{} @@ -409,9 +410,25 @@ func RunMustGather(artifact_dir string, clusterClient client.Client) error { return errors.New("no ClusterVersion found in cluster") } clusterVersion := &clusterVersionList.Items[0] - mustGatherPath := fmt.Sprintf("%s/must-gather/clusters/%s/", artifact_dir, string(clusterVersion.Spec.ClusterID[:8])) + clusterID := string(clusterVersion.Spec.ClusterID) + if len(clusterID) > 8 { + clusterID = clusterID[:8] + } - mustGatherSummaryContent, err := os.ReadFile(mustGatherPath + "oadp-must-gather-summary.md") + pattern := filepath.Join(artifact_dir, "*", "clusters", clusterID, "oadp-must-gather-summary.md") + matches, err := filepath.Glob(pattern) + if err != nil { + return fmt.Errorf("error finding must-gather summary: %w", err) + } + if len(matches) == 0 { + dirs, _ := filepath.Glob(filepath.Join(artifact_dir, "*")) + return fmt.Errorf("no must-gather summary found at pattern: %s\nDirectories in artifact_dir: %v", pattern, dirs) + } + + sort.Strings(matches) + summaryPath := matches[len(matches)-1] + log.Printf("Reading must-gather summary from: %s", summaryPath) + mustGatherSummaryContent, err := os.ReadFile(summaryPath) if err != nil { return err } @@ -422,8 +439,6 @@ func RunMustGather(artifact_dir string, clusterClient client.Client) error { return errors.New("expected no errors in must-gather Errors section") } - // TODO validate that everything was collected - return nil }