From 7ed43e7743327a4a7451c850c8a3447520e9445f Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Tue, 12 Aug 2025 15:03:05 -0400 Subject: [PATCH 1/2] loader pattern --- demos/Makefile | 2 +- demos/bundles/Makefile | 13 + demos/bundles/registryv1/Makefile | 18 +- .../{ => argocd-operator}/0.1.0.kpmspec.yaml | 0 ...operator.v0.1.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.1.0/manifests/argoproj.io_argocds.yaml | 0 .../0.1.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.10.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...perator.v0.10.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.10.0/manifests/argoproj.io_argocds.yaml | 0 ...goproj.io_notificationsconfigurations.yaml | 0 .../0.10.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.10.1.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...perator.v0.10.1.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.10.1/manifests/argoproj.io_argocds.yaml | 0 ...goproj.io_notificationsconfigurations.yaml | 0 .../0.10.1/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.11.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...perator.v0.11.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.11.0/manifests/argoproj.io_argocds.yaml | 0 ...goproj.io_notificationsconfigurations.yaml | 0 .../0.11.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.2.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...operator.v0.2.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.2.0/manifests/argoproj.io_argocds.yaml | 0 .../0.2.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.2.1.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...operator.v0.2.1.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.2.1/manifests/argoproj.io_argocds.yaml | 0 .../0.2.1/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.3.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...operator.v0.3.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.3.0/manifests/argoproj.io_argocds.yaml | 0 .../0.3.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.4.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...operator.v0.4.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.4.0/manifests/argoproj.io_argocds.yaml | 0 .../0.4.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.5.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...operator.v0.5.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.5.0/manifests/argoproj.io_argocds.yaml | 0 .../0.5.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.6.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...operator.v0.6.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.6.0/manifests/argoproj.io_argocds.yaml | 0 .../0.6.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.7.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...operator.v0.7.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.7.0/manifests/argoproj.io_argocds.yaml | 0 .../0.7.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.8.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...operator.v0.8.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.8.0/manifests/argoproj.io_argocds.yaml | 0 .../0.8.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.9.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...operator.v0.9.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.9.0/manifests/argoproj.io_argocds.yaml | 0 .../0.9.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.9.1.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...operator.v0.9.1.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.9.1/manifests/argoproj.io_argocds.yaml | 0 .../0.9.1/metadata/annotations.yaml | 0 .../{ => argocd-operator}/0.9.2.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...operator.v0.9.2.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../0.9.2/manifests/argoproj.io_argocds.yaml | 0 .../0.9.2/metadata/annotations.yaml | 0 .../{ => argocd-operator}/1.10.0.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...perator.v0.10.0.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../1.10.0/manifests/argoproj.io_argocds.yaml | 0 ...goproj.io_notificationsconfigurations.yaml | 0 .../1.10.0/metadata/annotations.yaml | 0 .../{ => argocd-operator}/1.10.1.kpmspec.yaml | 0 ...er-manager-metrics-service_v1_service.yaml | 0 ...-operator-manager-config_v1_configmap.yaml | 0 ...c.authorization.k8s.io_v1_clusterrole.yaml | 0 ...d-operator-webhook-service_v1_service.yaml | 0 ...perator.v0.10.1.clusterserviceversion.yaml | 0 .../manifests/argoproj.io_applications.yaml | 0 .../argoproj.io_applicationsets.yaml | 0 .../manifests/argoproj.io_appprojects.yaml | 0 .../manifests/argoproj.io_argocdexports.yaml | 0 .../1.10.1/manifests/argoproj.io_argocds.yaml | 0 ...goproj.io_notificationsconfigurations.yaml | 0 .../1.10.1/metadata/annotations.yaml | 0 .../registryv1/argocd-operator/Makefile | 7 + go.mod | 283 ++++--- go.sum | 718 +++++++++++------- internal/api/fbc/v1/types.go | 19 + internal/api/fbc/v2/types.go | 1 + internal/pkg/bundle/registry/internal/do.go | 11 + .../registry/internal/supported_kinds.go | 77 ++ internal/pkg/bundle/registry/v1/bundle.go | 187 +++-- .../pkg/bundle/registry/v1/bundle_test.go | 195 ++++- internal/pkg/bundle/registry/v1/file.go | 43 ++ internal/pkg/bundle/registry/v1/manifests.go | 279 ++++--- .../pkg/bundle/registry/v1/manifests_test.go | 209 ++--- internal/pkg/bundle/registry/v1/metadata.go | 246 +++--- .../pkg/bundle/registry/v1/metadata_test.go | 482 +++++------- internal/pkg/bundle/registry/v1/oci.go | 105 --- internal/pkg/bundle/registry/v1/oci_test.go | 75 -- internal/pkg/spec/registryv1.go | 3 +- 218 files changed, 1707 insertions(+), 1266 deletions(-) create mode 100644 demos/bundles/Makefile rename demos/bundles/registryv1/{ => argocd-operator}/0.1.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.1.0/manifests/argocd-operator.v0.1.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.1.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.1.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.1.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.1.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.1.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.1.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/manifests/argoproj.io_notificationsconfigurations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/manifests/argoproj.io_notificationsconfigurations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.10.1/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argocd-operator.v0.11.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/manifests/argoproj.io_notificationsconfigurations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.11.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argocd-operator.v0.2.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argocd-operator.v0.2.1.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.2.1/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argocd-operator.v0.3.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.3.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argocd-operator.v0.4.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.4.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argocd-operator.v0.5.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.5.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argocd-operator.v0.6.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.6.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argocd-operator.v0.7.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.7.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argocd-operator.v0.8.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.8.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argocd-operator.v0.9.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argocd-operator.v0.9.1.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.1/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argocd-operator.v0.9.2.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/0.9.2/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/manifests/argoproj.io_notificationsconfigurations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.0/metadata/annotations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1.kpmspec.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argoproj.io_applications.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argoproj.io_applicationsets.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argoproj.io_appprojects.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argoproj.io_argocdexports.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argoproj.io_argocds.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/manifests/argoproj.io_notificationsconfigurations.yaml (100%) rename demos/bundles/registryv1/{ => argocd-operator}/1.10.1/metadata/annotations.yaml (100%) create mode 100644 demos/bundles/registryv1/argocd-operator/Makefile create mode 100644 internal/api/fbc/v1/types.go create mode 100644 internal/api/fbc/v2/types.go create mode 100644 internal/pkg/bundle/registry/internal/do.go create mode 100644 internal/pkg/bundle/registry/internal/supported_kinds.go create mode 100644 internal/pkg/bundle/registry/v1/file.go delete mode 100644 internal/pkg/bundle/registry/v1/oci.go delete mode 100644 internal/pkg/bundle/registry/v1/oci_test.go diff --git a/demos/Makefile b/demos/Makefile index 161937a..512055e 100644 --- a/demos/Makefile +++ b/demos/Makefile @@ -1,4 +1,4 @@ -DEMOS := $(shell find . -mindepth 2 -name Makefile -exec dirname {} \; | sort) +DEMOS := $(shell find . -mindepth 2 -maxdepth 2 -name Makefile -exec dirname {} \; | sort) CLEANS := $(addsuffix .clean,$(DEMOS)) .PHONY: all $(DEMOS) diff --git a/demos/bundles/Makefile b/demos/bundles/Makefile new file mode 100644 index 0000000..512055e --- /dev/null +++ b/demos/bundles/Makefile @@ -0,0 +1,13 @@ +DEMOS := $(shell find . -mindepth 2 -maxdepth 2 -name Makefile -exec dirname {} \; | sort) +CLEANS := $(addsuffix .clean,$(DEMOS)) + +.PHONY: all $(DEMOS) +all: $(DEMOS) +$(DEMOS): + $(MAKE) -C $@ + + +.PHONY: clean $(CLEANS) +clean: $(CLEANS) +$(CLEANS): %.clean: + $(MAKE) -C $* clean diff --git a/demos/bundles/registryv1/Makefile b/demos/bundles/registryv1/Makefile index c6c2af9..512055e 100644 --- a/demos/bundles/registryv1/Makefile +++ b/demos/bundles/registryv1/Makefile @@ -1,7 +1,13 @@ -.PHONY: all -all: - ls *.kpmspec.yaml | xargs -n1 kpm build +DEMOS := $(shell find . -mindepth 2 -maxdepth 2 -name Makefile -exec dirname {} \; | sort) +CLEANS := $(addsuffix .clean,$(DEMOS)) -.PHONY: -clean: - rm -f *.kpm +.PHONY: all $(DEMOS) +all: $(DEMOS) +$(DEMOS): + $(MAKE) -C $@ + + +.PHONY: clean $(CLEANS) +clean: $(CLEANS) +$(CLEANS): %.clean: + $(MAKE) -C $* clean diff --git a/demos/bundles/registryv1/0.1.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.1.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.1.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.1.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.1.0/manifests/argocd-operator.v0.1.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argocd-operator.v0.1.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.1.0/manifests/argocd-operator.v0.1.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argocd-operator.v0.1.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.1.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.1.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.1.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.1.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.1.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.1.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.1.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.1.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.1.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.1.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.1.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.1.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.1.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.1.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.1.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.10.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.10.0/manifests/argoproj.io_notificationsconfigurations.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_notificationsconfigurations.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/manifests/argoproj.io_notificationsconfigurations.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/manifests/argoproj.io_notificationsconfigurations.yaml diff --git a/demos/bundles/registryv1/0.10.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.10.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.10.1.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.10.1/manifests/argoproj.io_notificationsconfigurations.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_notificationsconfigurations.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/manifests/argoproj.io_notificationsconfigurations.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/manifests/argoproj.io_notificationsconfigurations.yaml diff --git a/demos/bundles/registryv1/0.10.1/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.10.1/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.10.1/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.10.1/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.11.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argocd-operator.v0.11.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator.v0.11.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argocd-operator.v0.11.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argocd-operator.v0.11.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.11.0/manifests/argoproj.io_notificationsconfigurations.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_notificationsconfigurations.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/manifests/argoproj.io_notificationsconfigurations.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/manifests/argoproj.io_notificationsconfigurations.yaml diff --git a/demos/bundles/registryv1/0.11.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.11.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.11.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.11.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.2.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argocd-operator.v0.2.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argocd-operator.v0.2.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argocd-operator.v0.2.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argocd-operator.v0.2.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.2.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.2.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.2.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.2.1.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argocd-operator.v0.2.1.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argocd-operator.v0.2.1.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argocd-operator.v0.2.1.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argocd-operator.v0.2.1.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.2.1/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.2.1/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.2.1/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.2.1/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.2.1/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.3.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argocd-operator.v0.3.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argocd-operator.v0.3.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argocd-operator.v0.3.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argocd-operator.v0.3.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.3.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.3.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.3.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.3.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.3.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.4.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argocd-operator.v0.4.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argocd-operator.v0.4.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argocd-operator.v0.4.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argocd-operator.v0.4.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.4.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.4.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.4.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.4.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.4.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.5.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argocd-operator.v0.5.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argocd-operator.v0.5.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argocd-operator.v0.5.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argocd-operator.v0.5.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.5.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.5.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.5.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.5.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.5.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.6.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argocd-operator.v0.6.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argocd-operator.v0.6.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argocd-operator.v0.6.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argocd-operator.v0.6.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.6.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.6.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.6.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.6.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.6.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.7.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argocd-operator.v0.7.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argocd-operator.v0.7.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argocd-operator.v0.7.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argocd-operator.v0.7.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.7.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.7.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.7.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.7.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.7.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.8.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argocd-operator.v0.8.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator.v0.8.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argocd-operator.v0.8.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argocd-operator.v0.8.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.8.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.8.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.8.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.8.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.8.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.9.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argocd-operator.v0.9.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator.v0.9.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argocd-operator.v0.9.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argocd-operator.v0.9.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.9.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.9.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.9.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.9.1.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argocd-operator.v0.9.1.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator.v0.9.1.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argocd-operator.v0.9.1.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argocd-operator.v0.9.1.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.9.1/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.9.1/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.9.1/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.1/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.1/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/0.9.2.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2.kpmspec.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argocd-operator.v0.9.2.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator.v0.9.2.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argocd-operator.v0.9.2.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argocd-operator.v0.9.2.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/0.9.2/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/0.9.2/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/0.9.2/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/0.9.2/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/0.9.2/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/1.10.0.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0.kpmspec.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argocd-operator.v0.10.0.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/1.10.0/manifests/argoproj.io_notificationsconfigurations.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_notificationsconfigurations.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/manifests/argoproj.io_notificationsconfigurations.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/manifests/argoproj.io_notificationsconfigurations.yaml diff --git a/demos/bundles/registryv1/1.10.0/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/1.10.0/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.0/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.0/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/1.10.1.kpmspec.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1.kpmspec.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1.kpmspec.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1.kpmspec.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator-controller-manager-metrics-service_v1_service.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator-manager-config_v1_configmap.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator-webhook-service_v1_service.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argocd-operator.v0.10.1.clusterserviceversion.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argoproj.io_applications.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_applications.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argoproj.io_applications.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_applications.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argoproj.io_applicationsets.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_applicationsets.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argoproj.io_applicationsets.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_applicationsets.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argoproj.io_appprojects.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_appprojects.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argoproj.io_appprojects.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_appprojects.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argoproj.io_argocdexports.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_argocdexports.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argoproj.io_argocdexports.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_argocdexports.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argoproj.io_argocds.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_argocds.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argoproj.io_argocds.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_argocds.yaml diff --git a/demos/bundles/registryv1/1.10.1/manifests/argoproj.io_notificationsconfigurations.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_notificationsconfigurations.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/manifests/argoproj.io_notificationsconfigurations.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/manifests/argoproj.io_notificationsconfigurations.yaml diff --git a/demos/bundles/registryv1/1.10.1/metadata/annotations.yaml b/demos/bundles/registryv1/argocd-operator/1.10.1/metadata/annotations.yaml similarity index 100% rename from demos/bundles/registryv1/1.10.1/metadata/annotations.yaml rename to demos/bundles/registryv1/argocd-operator/1.10.1/metadata/annotations.yaml diff --git a/demos/bundles/registryv1/argocd-operator/Makefile b/demos/bundles/registryv1/argocd-operator/Makefile new file mode 100644 index 0000000..c6c2af9 --- /dev/null +++ b/demos/bundles/registryv1/argocd-operator/Makefile @@ -0,0 +1,7 @@ +.PHONY: all +all: + ls *.kpmspec.yaml | xargs -n1 kpm build + +.PHONY: +clean: + rm -f *.kpm diff --git a/go.mod b/go.mod index d73b6f2..43be810 100644 --- a/go.mod +++ b/go.mod @@ -1,43 +1,57 @@ module github.com/joelanford/kpm -go 1.24.2 +go 1.24.3 + +toolchain go1.24.6 require ( github.com/blang/semver/v4 v4.0.0 github.com/google/renameio/v2 v2.0.0 + github.com/onsi/ginkgo/v2 v2.23.4 + github.com/onsi/gomega v1.37.0 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.1 github.com/openshift/api v0.0.0-20250509202259-b7d0ca2f7643 - github.com/operator-framework/api v0.31.0 + github.com/operator-framework/api v0.32.0 + github.com/operator-framework/operator-registry v1.56.0 github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.82.2 + github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.9.1 github.com/stretchr/testify v1.10.0 - k8s.io/api v0.33.0 - k8s.io/apiextensions-apiserver v0.33.0 - k8s.io/apimachinery v0.33.0 - k8s.io/autoscaler/vertical-pod-autoscaler v1.3.1 - k8s.io/cli-runtime v0.33.0 + golang.org/x/text v0.26.0 + k8s.io/api v0.33.2 + k8s.io/apiextensions-apiserver v0.33.2 + k8s.io/apimachinery v0.33.2 + k8s.io/cli-runtime v0.33.2 + k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 oras.land/oras-go/v2 v2.6.0 - sigs.k8s.io/controller-runtime v0.20.4 - sigs.k8s.io/yaml v1.4.0 + sigs.k8s.io/controller-runtime v0.21.0 + sigs.k8s.io/yaml v1.5.0 ) require ( - cloud.google.com/go v0.112.1 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.1.6 // indirect - cloud.google.com/go/kms v1.15.8 // indirect - cloud.google.com/go/storage v1.39.1 // indirect + al.essio.dev/pkg/shellescape v1.6.0 // indirect + cel.dev/expr v0.24.0 // indirect + cloud.google.com/go v0.120.0 // indirect + cloud.google.com/go/auth v0.16.1 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/kms v1.22.0 // indirect + cloud.google.com/go/longrunning v0.6.7 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect + cloud.google.com/go/storage v1.50.0 // indirect code.gitea.io/sdk/gitea v0.18.0 // indirect dario.cat/mergo v1.0.1 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // 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/azcore v1.17.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.29 // indirect github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect @@ -47,46 +61,51 @@ require ( github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/BurntSushi/toml v1.4.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // indirect + github.com/BurntSushi/toml v1.5.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProtonMail/go-crypto v1.0.0 // indirect - github.com/alessio/shellescape v1.4.2 // indirect + github.com/Microsoft/hcsshim v0.13.0 // indirect + github.com/ProtonMail/go-crypto v1.1.6 // indirect github.com/anchore/bubbly v0.0.0-20230518153401-87b6af8ccf22 // indirect github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a // indirect github.com/anchore/go-macholibre v0.0.0-20220308212642-53e6d0aaf6fb // indirect github.com/anchore/quill v0.4.1 // indirect + github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/atc0005/go-teams-notify/v2 v2.10.0 // indirect - github.com/aws/aws-sdk-go v1.53.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.26.1 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.13 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.13 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3 // indirect + github.com/aws/aws-sdk-go v1.55.6 // indirect + github.com/aws/aws-sdk-go-v2 v1.36.4 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect + github.com/aws/aws-sdk-go-v2/config v1.29.16 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.69 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.31 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.35 // indirect github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0 // indirect github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.23.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3 // indirect - github.com/aws/aws-sdk-go-v2/service/kms v1.30.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 // indirect - github.com/aws/smithy-go v1.20.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.16 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.16 // indirect + github.com/aws/aws-sdk-go-v2/service/kms v1.38.1 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.80.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.21 // indirect + github.com/aws/smithy-go v1.22.2 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20240514230400-03fa26f5508f // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect github.com/blacktop/go-dwarf v1.0.9 // indirect github.com/blacktop/go-macho v1.1.162 // indirect github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb // indirect @@ -101,34 +120,52 @@ require ( github.com/carlmjohnson/versioninfo v0.22.5 // indirect github.com/cavaliergopher/cpio v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/bubbletea v0.22.1 // indirect github.com/charmbracelet/lipgloss v0.10.0 // indirect github.com/charmbracelet/x/exp/ordered v0.0.0-20231010190216-1cb11efc897d // indirect github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect - github.com/cloudflare/circl v1.3.8 // indirect + github.com/cloudflare/circl v1.6.1 // indirect + github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect + github.com/containerd/cgroups/v3 v3.0.5 // indirect github.com/containerd/console v1.0.4 // indirect - github.com/containerd/continuity v0.4.2 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.15.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect - github.com/cyphar/filepath-securejoin v0.3.6 // indirect + github.com/containerd/containerd v1.7.27 // indirect + github.com/containerd/containerd/api v1.9.0 // indirect + github.com/containerd/continuity v0.4.5 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/errdefs/pkg v0.3.0 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect + github.com/containerd/ttrpc v1.2.7 // indirect + github.com/containerd/typeurl/v2 v2.2.3 // indirect + github.com/containers/common v0.63.1 // indirect + github.com/containers/image/v5 v5.35.0 // indirect + github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect + github.com/containers/ocicrypt v1.2.1 // indirect + github.com/containers/storage v1.58.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidmz/go-pageant v1.0.2 // indirect github.com/dghubble/go-twitter v0.0.0-20211115160449-93a8679adecb // indirect github.com/dghubble/oauth1 v0.7.3 // indirect github.com/dghubble/sling v1.4.0 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/distribution/distribution/v3 v3.0.0-beta.1 // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/cli v27.1.2+incompatible // indirect + github.com/docker/cli v28.3.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v27.1.1+incompatible // indirect - github.com/docker/docker-credential-helpers v0.8.2 // indirect + github.com/docker/docker v28.2.2+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.3 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/elliotchance/orderedmap/v2 v2.2.0 // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect @@ -138,13 +175,13 @@ require ( github.com/go-errors/errors v1.4.2 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-git/go-git/v5 v5.12.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.4 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-git/v5 v5.16.2 // indirect + github.com/go-jose/go-jose/v4 v4.1.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/analysis v0.23.0 // indirect - github.com/go-openapi/errors v0.22.0 // indirect + github.com/go-openapi/errors v0.22.1 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/loads v0.22.0 // indirect @@ -154,33 +191,38 @@ require ( github.com/go-openapi/swag v0.23.1 // indirect github.com/go-openapi/validate v0.24.0 // indirect github.com/go-restruct/restruct v1.2.0-alpha // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/google/cel-go v0.25.0 // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/go-containerregistry v0.20.0 // indirect + github.com/google/go-containerregistry v0.20.6 // indirect github.com/google/go-github/v62 v62.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/ko v0.15.4 // indirect + github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect github.com/google/rpmpack v0.6.1-0.20240329070804-c2247cbb881a // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.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/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/goreleaser/chglog v0.6.1 // indirect github.com/goreleaser/fileglob v1.3.0 // indirect github.com/goreleaser/goreleaser v1.26.2 // indirect github.com/goreleaser/nfpm/v2 v2.37.1 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0 // indirect + github.com/h2non/filetype v1.1.3 // indirect + github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -205,7 +247,7 @@ require ( github.com/ipfs/go-metrics-interface v0.0.1 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jbenet/goprocess v0.1.4 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect @@ -213,7 +255,7 @@ require ( github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/letsencrypt/boulder v0.0.0-20240418210053-89b07f4543e0 // indirect + github.com/letsencrypt/boulder v0.0.0-20250624003606-5ddd5acf990d // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.9.0 // indirect @@ -227,7 +269,12 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect - github.com/moby/sys/user v0.3.0 // indirect + github.com/moby/locker v1.0.1 // indirect + github.com/moby/sys/capability v0.4.0 // indirect + github.com/moby/sys/mountinfo v0.7.2 // indirect + github.com/moby/sys/sequential v0.6.0 // indirect + github.com/moby/sys/user v0.4.0 // indirect + github.com/moby/sys/userns v0.1.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 @@ -247,42 +294,48 @@ require ( github.com/multiformats/go-varint v0.0.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oklog/ulid v1.3.1 // indirect + github.com/opencontainers/runtime-spec v1.2.1 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/otiai10/copy v1.14.1 // indirect + github.com/otiai10/mint v1.6.3 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pjbgf/sha1cd v0.3.2 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect + github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.63.0 // indirect + github.com/prometheus/common v0.65.0 // indirect github.com/prometheus/procfs v0.16.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e // indirect - github.com/secure-systems-lab/go-securesystemslib v0.8.0 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sigstore/cosign/v2 v2.2.4 // indirect - github.com/sigstore/rekor v1.3.6 // indirect - github.com/sigstore/sigstore v1.8.4 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/skeema/knownhosts v1.2.2 // indirect + github.com/sigstore/rekor v1.3.10 // indirect + github.com/sigstore/sigstore v1.9.5 // indirect + github.com/skeema/knownhosts v1.3.1 // indirect github.com/slack-go/slack v0.13.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/spf13/pflag v1.0.6 // indirect - github.com/spf13/viper v1.18.2 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/stoewer/go-strcase v1.3.1 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect github.com/ulikunitz/xz v0.5.12 // indirect - github.com/vbatts/tar-split v0.11.5 // indirect + github.com/vbatts/tar-split v0.12.1 // indirect github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 // indirect github.com/wagoodman/go-progress v0.0.0-20220614130704-4b1c25a33c7c // indirect github.com/whyrusleeping/cbor-gen v0.1.1-0.20240311221002-68b9f235c302 // indirect @@ -291,40 +344,46 @@ require ( github.com/xanzy/go-gitlab v0.105.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xlab/treeprint v1.2.0 // indirect + github.com/zeebo/errs v1.4.0 // indirect gitlab.com/digitalxero/go-conventional-commit v1.0.7 // indirect - go.mongodb.org/mongo-driver v1.14.0 // indirect + go.etcd.io/bbolt v1.4.2 // indirect + go.mongodb.org/mongo-driver v1.17.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect - go.opentelemetry.io/proto/otlp v1.6.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.36.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/sdk v1.36.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect + go.opentelemetry.io/otel/trace v1.36.0 // indirect + go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/automaxprocs v1.5.3 // indirect + go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - gocloud.dev v0.37.0 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect - golang.org/x/mod v0.24.0 // indirect - golang.org/x/net v0.40.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.3 // indirect + gocloud.dev v0.40.0 // indirect + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/net v0.41.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.14.0 // indirect + golang.org/x/sync v0.15.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/term v0.32.0 // indirect - golang.org/x/text v0.25.0 // indirect - golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.33.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/api v0.172.0 // indirect - google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 // indirect - google.golang.org/grpc v1.72.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.34.0 // indirect + golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect + google.golang.org/api v0.232.0 // indirect + google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/grpc v1.73.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect @@ -332,15 +391,17 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/mail.v2 v2.3.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.1 // indirect - k8s.io/client-go v0.33.0 // indirect + k8s.io/apiserver v0.33.2 // indirect + k8s.io/client-go v0.33.2 // indirect + k8s.io/component-base v0.33.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect - k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 // indirect + k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a // indirect lukechampine.com/blake3 v1.2.1 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect - sigs.k8s.io/kind v0.24.0 // indirect + sigs.k8s.io/kind v0.29.0 // indirect sigs.k8s.io/kustomize/api v0.19.0 // indirect sigs.k8s.io/kustomize/kyaml v0.19.0 // indirect sigs.k8s.io/randfill v1.0.0 // indirect diff --git a/go.sum b/go.sum index 8f6f477..04ff66f 100644 --- a/go.sum +++ b/go.sum @@ -1,38 +1,58 @@ +al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA= +al.essio.dev/pkg/shellescape v1.6.0/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -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/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= -cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs= -cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs= -cloud.google.com/go/storage v1.39.1 h1:MvraqHKhogCOTXTlct/9C3K3+Uy2jBmFYb3/Sp6dVtY= -cloud.google.com/go/storage v1.39.1/go.mod h1:xK6xZmxZmo+fyP7+DEF6FhNc24/JAe95OLyOHCXFH1o= +cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= +cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= +cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= +cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk= +cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8= +cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= +cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= +cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= code.gitea.io/sdk/gitea v0.18.0 h1:+zZrwVmujIrgobt6wVBWCqITz6bn1aBjnCUHmpZrerI= code.gitea.io/sdk/gitea v0.18.0/go.mod h1:IG9xZJoltDNeDSW0qiF2Vqx5orMWa7OhVWrjvrd5NpI= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -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/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 h1:m/sWOGCREuSBqg2htVQTBY8nOZpyajYztF0vUvSZTuM= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0/go.mod h1:Pu5Zksi2KrU7LPbZbNINx6fuVrUp/ffvpxdDj+i8LeE= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= -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.1 h1:fXPMAmuh0gDuRDey0atC8cXBuKIlqCzCkL8sm1n9Ov0= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.1/go.mod h1:SUZc9YRRHfx2+FAQKNDGrssXehqLpxmwRv2mC/5ntj4= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kgwIPQOUect7EoR/+sbP4wQKdzxM= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0/go.mod h1:cTvi54pg19DoT07ekoeMgE/taAwNtCShVeZqA+Iv2xI= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc= @@ -58,13 +78,23 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -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/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 h1:H5xDQaE3XowWfhZRUpnfC+rGZMEVoSiji+b+/HFAPU4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= -github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 h1:5IT7xOdq17MtcdtL/vtl6mGfzhaq4m4vpollPRmlsBQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0 h1:nNMpRpnkWDAaqcpxMJvxa/Ud98gjbYwayJY4/9bdjiU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 h1:ig/FpDD2JofP/NExKQUbn7uOSZzJAQqogfqluZK4ed4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= @@ -74,18 +104,20 @@ github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSC github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= +github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= +github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= github.com/ProtonMail/gopenpgp/v2 v2.7.1 h1:Awsg7MPc2gD3I7IFac2qE3Gdls0lZW8SzrFZ3k1oz0s= github.com/ProtonMail/gopenpgp/v2 v2.7.1/go.mod h1:/BU5gfAVwqyd8EfC3Eu7zmuhwYQpKs+cGD8M//iiaxs= +github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= +github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/alessio/shellescape v1.4.2 h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4uEoM0= -github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/anchore/bubbly v0.0.0-20230518153401-87b6af8ccf22 h1:5NFK6VGgqBUOAX2SYyzFYvNdOiYDxzim8jga386FlZY= github.com/anchore/bubbly v0.0.0-20230518153401-87b6af8ccf22/go.mod h1:Kv+Mm9CdtnV8iem48iEPIwy7/N4Wmk0hpxYNH5gTwKQ= github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a h1:nJ2G8zWKASyVClGVgG7sfM5mwoZlZ2zYpIzN2OhjWkw= @@ -97,58 +129,60 @@ github.com/anchore/quill v0.4.1/go.mod h1:t6hOPYDohN8wn2SRWQdNkJBkhmK8s3gzuHzzgc github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= +github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/atc0005/go-teams-notify/v2 v2.10.0 h1:eQvRIkyESQgBvlUdQ/iPol/lj3QcRyrdEQM3+c/nXhM= github.com/atc0005/go-teams-notify/v2 v2.10.0/go.mod h1:SIeE1UfCcVRYMqP5b+r1ZteHyA/2UAjzWF5COnZ8q0w= -github.com/aws/aws-sdk-go v1.53.0 h1:MMo1x1ggPPxDfHMXJnQudTbGXYlD4UigUAud1DJxPVo= -github.com/aws/aws-sdk-go v1.53.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= -github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 h1:gTK2uhtAPtFcdRRJilZPx8uJLL2J85xK11nKtWL0wfU= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1/go.mod h1:sxpLb+nZk7tIfCWChfd+h4QwHNUR57d8hA1cleTkjJo= -github.com/aws/aws-sdk-go-v2/config v1.27.13 h1:WbKW8hOzrWoOA/+35S5okqO/2Ap8hkkFUzoW8Hzq24A= -github.com/aws/aws-sdk-go-v2/config v1.27.13/go.mod h1:XLiyiTMnguytjRER7u5RIkhIqS8Nyz41SwAWb4xEjxs= -github.com/aws/aws-sdk-go-v2/credentials v1.17.13 h1:XDCJDzk/u5cN7Aple7D/MiAhx1Rjo/0nueJ0La8mRuE= -github.com/aws/aws-sdk-go-v2/credentials v1.17.13/go.mod h1:FMNcjQrmuBYvOTZDtOLCIu0esmxjF7RuA/89iSXWzQI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9 h1:vXY/Hq1XdxHBIYgBUmug/AbMyIe1AKulPYS2/VE1X70= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.9/go.mod h1:GyJJTZoHVuENM4TeJEl5Ffs4W9m19u+4wKJcDi/GZ4A= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= -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.3.3 h1:mDnFOE2sVkyphMWtTH+stv0eW3k0OTx94K63xpxHty4= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3/go.mod h1:V8MuRVcCRt5h1S+Fwu8KbC7l/gBGo3yBAyUbJM2IJOk= +github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= +github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.36.4 h1:GySzjhVvx0ERP6eyfAbAuAXLtAda5TEy19E5q5W8I9E= +github.com/aws/aws-sdk-go-v2 v1.36.4/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14= +github.com/aws/aws-sdk-go-v2/config v1.29.16 h1:XkruGnXX1nEZ+Nyo9v84TzsX+nj86icbFAeust6uo8A= +github.com/aws/aws-sdk-go-v2/config v1.29.16/go.mod h1:uCW7PNjGwZ5cOGZ5jr8vCWrYkGIhPoTNV23Q/tpHKzg= +github.com/aws/aws-sdk-go-v2/credentials v1.17.69 h1:8B8ZQboRc3uaIKjshve/XlvJ570R7BKNy3gftSbS178= +github.com/aws/aws-sdk-go-v2/credentials v1.17.69/go.mod h1:gPME6I8grR1jCqBFEGthULiolzf/Sexq/Wy42ibKK9c= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.31 h1:oQWSGexYasNpYp4epLGZxxjsDo8BMBh6iNWkTXQvkwk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.31/go.mod h1:nc332eGUU+djP3vrMI6blS0woaCfHTe3KiSQUVTMRq0= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 h1:zeN9UtUlA6FTx0vFSayxSX32HDw73Yb6Hh2izDSFxXY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10/go.mod h1:3HKuexPDcwLWPaqpW2UR/9n8N/u/3CKcGAzSs8p8u8g= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.35 h1:o1v1VFfPcDVlK3ll1L5xHsaQAFdNtZ5GXnNR7SwueC4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.35/go.mod h1:rZUQNYMNG+8uZxz9FOerQJ+FceCiodXvixpeRtdESrU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.35 h1:R5b82ubO2NntENm3SAm0ADME+H630HomNJdgv+yZ3xw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.35/go.mod h1:FuA+nmgMRfkzVKYDNEqQadvEMxtxl9+RLT9ribCwEMs= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.35 h1:th/m+Q18CkajTw1iqx2cKkLCij/uz8NMwJFPK91p2ug= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.35/go.mod h1:dkJuf0a1Bc8HAA0Zm2MoTGm/WDC18Td9vSbrQ1+VqE8= github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0 h1:rdPrcOZmqT2F+yzmKEImrx5XUs7Hpf4V9Rp6E8mhsxQ= github.com/aws/aws-sdk-go-v2/service/ecr v1.28.0/go.mod h1:if7ybzzjOmDB8pat9FE35AHTY6ZxlYSy3YviSmFZv8c= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.23.5 h1:452e/nFuqPvwPg+1OD2CG/v29R9MH8egJSJKh2Qduv8= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.23.5/go.mod h1:8pvvNAklmq+hKmqyvFoMRg0bwg9sdGOvdwximmKiKP0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5 h1:mbWNpfRUTT6bnacmvOTKXZjR/HycibdWzNpfbrbLDIs= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5/go.mod h1:FCOPWGjsshkkICJIn9hq9xr6dLKtyaWpuUojiN3W1/8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3 h1:4t+QEX7BsXz98W8W1lNvMAG+NX8qHz2CjLBxQKku40g= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3/go.mod h1:oFcjjUq5Hm09N9rpxTdeMeLeQcxS7mIkBkL8qUKng+A= -github.com/aws/aws-sdk-go-v2/service/kms v1.30.0 h1:yS0JkEdV6h9JOo8sy2JSpjX+i7vsKifU8SIeHrqiDhU= -github.com/aws/aws-sdk-go-v2/service/kms v1.30.0/go.mod h1:+I8VUUSVD4p5ISQtzpgSva4I8cJ4SQ4b1dcBcof7O+g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4 h1:lW5xUzOPGAMY7HPuNF4FdyBwRc3UJ/e8KsapbesVeNU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.51.4/go.mod h1:MGTaf3x/+z7ZGugCGvepnx2DS6+caCYYqKhzVoLNYPk= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 h1:o5cTaeunSpfXiLTIBx5xo2enQmiChtu1IBbzXnfU9Hs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.6/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 h1:Qe0r0lVURDDeBQJ4yP+BOrJkvkiCo/3FH/t+wY11dmw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 h1:et3Ta53gotFR4ERLXXHIHl/Uuk1qYpP5uU7cvNql8ns= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.7/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.3 h1:VHPZakq2L7w+RLzV54LmQavbvheFaR2u1NomJRSEfcU= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.3/go.mod h1:DX1e/lkbsAt0MkY3NgLYuH4jQvRfw8MYxTe9feR7aXM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.16 h1:/ldKrPPXTC421bTNWrUIpq3CxwHwRI/kpc+jPUTJocM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.16/go.mod h1:5vkf/Ws0/wgIMJDQbjI4p2op86hNW6Hie5QtebrDgT8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.16 h1:2HuI7vWKhFWsBhIr2Zq8KfFZT6xqaId2XXnXZjkbEuc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.16/go.mod h1:BrwWnsfbFtFeRjdx0iM1ymvlqDX1Oz68JsQaibX/wG8= +github.com/aws/aws-sdk-go-v2/service/kms v1.38.1 h1:tecq7+mAav5byF+Mr+iONJnCBf4B4gon8RSp4BrweSc= +github.com/aws/aws-sdk-go-v2/service/kms v1.38.1/go.mod h1:cQn6tAF77Di6m4huxovNM7NVAozWTZLsDRp9t8Z/WYk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.80.2 h1:T6Wu+8E2LeTUqzqQ/Bh1EoFNj1u4jUyveMgmTlu9fDU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.80.2/go.mod h1:chSY8zfqmS0OnhZoO/hpPx/BHfAIL80m77HwhRLYScY= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.4 h1:EU58LP8ozQDVroOEyAfcq0cGc5R/FTZjVoYJ6tvby3w= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.4/go.mod h1:CrtOgCcysxMvrCoHnvNAD7PHWclmoFG78Q2xLK0KKcs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.2 h1:XB4z0hbQtpmBnb1FQYvKaCM7UsS6Y/u8jVBwIUGeCTk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.2/go.mod h1:hwRpqkRxnQ58J9blRDrB4IanlXCpcKmsC83EhG77upg= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.21 h1:nyLjs8sYJShFYj6aiyjCBI3EcLn1udWrQTjEF+SOXB0= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.21/go.mod h1:EhdxtZ+g84MSGrSrHzZiUm9PYiZkrADNja15wtRJSJo= +github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= +github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20240514230400-03fa26f5508f h1:Z0kS9pJDQgCg3u2lH6+CdYaFbyQtyukVTiUCG6re0E4= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20240514230400-03fa26f5508f/go.mod h1:rAE739ssmE5O5fLuQ2y8uHdmOJaelE5I0Es3SxV0y1A= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= @@ -170,7 +204,6 @@ github.com/bluesky-social/indigo v0.0.0-20240411170459-440932307e0d h1:xxPhzCOpm github.com/bluesky-social/indigo v0.0.0-20240411170459-440932307e0d/go.mod h1:ysMQ0a4RYWjgyvKrl5ME352oHA6QgK900g5sB9XXgPE= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/caarlos0/ctrlc v1.2.0 h1:AtbThhmbeYx1WW3WXdWrd94EHKi+0NPRGS4/4pzrjwk= github.com/caarlos0/ctrlc v1.2.0/go.mod h1:n3gDlSjsXZ7rbD9/RprIR040b7oaLfNStikPd4gFago= github.com/caarlos0/env/v11 v11.0.1 h1:A8dDt9Ub9ybqRSUF3fQc/TA/gTam2bKT4Pit+cwrsPs= @@ -192,6 +225,8 @@ github.com/cavaliergopher/cpio v1.0.1/go.mod h1:pBdaqQjnvXxdS/6CvNDwIANIFSP0xRKI github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= +github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20180118203423-deb3ae2ef261/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -207,24 +242,58 @@ github.com/charmbracelet/x/exp/ordered v0.0.0-20231010190216-1cb11efc897d/go.mod github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4= github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= -github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= +github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= -github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII= +github.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0= +github.com/containerd/containerd/api v1.9.0 h1:HZ/licowTRazus+wt9fM6r/9BQO7S0vD5lMcWspGIg0= +github.com/containerd/containerd/api v1.9.0/go.mod h1:GhghKFmTR3hNtyznBoQ0EMWr9ju5AqHjcZPsSpTKutI= +github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= +github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= +github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= -github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= +github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= +github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ= +github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= +github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= +github.com/containers/common v0.63.1 h1:6g02gbW34PaRVH4Heb2Pk11x0SdbQ+8AfeKKeQGqYBE= +github.com/containers/common v0.63.1/go.mod h1:+3GCotSqNdIqM3sPs152VvW7m5+Mg8Kk+PExT3G9hZw= +github.com/containers/image/v5 v5.35.0 h1:T1OeyWp3GjObt47bchwD9cqiaAm/u4O4R9hIWdrdrP8= +github.com/containers/image/v5 v5.35.0/go.mod h1:8vTsgb+1gKcBL7cnjyNOInhJQfTUQjJoO2WWkKDoebM= +github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA= +github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= +github.com/containers/ocicrypt v1.2.1 h1:0qIOTT9DoYwcKmxSt8QJt+VzMY18onl9jUXsxpVhSmM= +github.com/containers/ocicrypt v1.2.1/go.mod h1:aD0AAqfMp0MtwqWgHM1bUwe1anx0VazI108CRrSKINQ= +github.com/containers/storage v1.58.0 h1:Q7SyyCCjqgT3wYNgRNIL8o/wUS92heIj2/cc8Sewvcc= +github.com/containers/storage v1.58.0/go.mod h1:w7Jl6oG+OpeLGLzlLyOZPkmUso40kjpzgrHUk5tyBlo= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= -github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= +github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= 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= @@ -237,30 +306,34 @@ github.com/dghubble/oauth1 v0.7.3 h1:EkEM/zMDMp3zOsX2DC/ZQ2vnEX3ELK0/l9kb+vs4ptE github.com/dghubble/oauth1 v0.7.3/go.mod h1:oxTe+az9NSMIucDPDCCtzJGsPhciJV33xocHfcR2sVY= github.com/dghubble/sling v1.4.0 h1:/n8MRosVTthvMbwlNZgLx579OGVjUOy3GNEv5BIqAWY= github.com/dghubble/sling v1.4.0/go.mod h1:0r40aNsU9EdDUVBNhfCstAtFgutjgJGYbO1oNzkMoM8= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/distribution/distribution/v3 v3.0.0-beta.1 h1:X+ELTxPuZ1Xe5MsD3kp2wfGUhc8I+MPfRis8dZ818Ic= -github.com/distribution/distribution/v3 v3.0.0-beta.1/go.mod h1:O9O8uamhHzWWQVTjuQpyYUVm/ShPHPUDgvQMpHGVBDs= +github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN6UX90KJc4HjyM= +github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v27.1.2+incompatible h1:nYviRv5Y+YAKx3dFrTvS1ErkyVVunKOhoweCTE1BsnI= -github.com/docker/cli v27.1.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v28.3.1+incompatible h1:ZUdwOLDEBoE3TE5rdC9IXGY5HPHksJK3M+hJEWhh2mc= +github.com/docker/cli v28.3.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= -github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= -github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= +github.com/docker/docker v28.2.2+incompatible h1:CjwRSksz8Yo4+RmQ339Dp/D2tGO5JxwYeqtMOEe0LDw= +github.com/docker/docker v28.2.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= +github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-events v0.0.0-20250114142523-c867878c5e32 h1:EHZfspsnLAz8Hzccd67D5abwLiqoqym2jz/jOS39mCk= +github.com/docker/go-events v0.0.0-20250114142523-c867878c5e32/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/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/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/elliotchance/orderedmap/v2 v2.2.0 h1:7/2iwO98kYT4XkOjA9mBEIwvi4KpGB4cyHeOFOnj4Vk= github.com/elliotchance/orderedmap/v2 v2.2.0/go.mod h1:85lZyVbpGaGvHvnKa7Qhx7zncAdBIBq6u56Hb1PRU5Q= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= @@ -270,7 +343,15 @@ github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FM 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/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= @@ -289,33 +370,33 @@ github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/github/smimesign v0.2.0 h1:Hho4YcX5N1I9XNqhq0fNx0Sts8MhLonHd+HRXVGNjvk= github.com/github/smimesign v0.2.0/go.mod h1:iZiiwNT4HbtGRVqCQu7uJPEZCuEE5sfSSttcnePkDl4= -github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= -github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= 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-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= -github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= -github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E= -github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= +github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM= +github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY= +github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= -github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= -github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= +github.com/go-openapi/errors v0.22.1 h1:kslMRRnK7NCb/CvR1q1VWuEQCEIsBGn5GgKD9e+HYhU= +github.com/go-openapi/errors v0.22.1/go.mod h1:+n/5UdIqdVnLIJ6Q9Se8HNGUXYaY6CN8ImWzfi/Gzp0= github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= @@ -339,10 +420,10 @@ github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= @@ -353,13 +434,17 @@ github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +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-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs= +github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/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.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -371,6 +456,10 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD 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 v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/cel-go v0.25.0 h1:jsFw9Fhn+3y2kBbltZR4VEz5xKkcIFRPDnuEzAGv5GY= +github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI= 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= @@ -384,32 +473,30 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 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/go-containerregistry v0.20.0 h1:wRqHpOeVh3DnenOrPy9xDOLdnLatiGuuNRVelR2gSbg= -github.com/google/go-containerregistry v0.20.0/go.mod h1:YCMFNQeeXeLF+dnhhWkqDItx/JSkH01j1Kis4PsjzFI= +github.com/google/go-containerregistry v0.20.6 h1:cvWX87UxxLgaH76b4hIvya6Dzz9qHB31qAwjAohdSTU= +github.com/google/go-containerregistry v0.20.6/go.mod h1:T0x8MuoAoKX/873bkeSfLD2FAkwCDf9/HZgsFJ02E2Y= github.com/google/go-github/v62 v62.0.0 h1:/6mGCaRywZz9MuHyw9gD1CwsbmBX8GWsbFkwMmHdhl4= github.com/google/go-github/v62 v62.0.0/go.mod h1:EMxeUqGJq2xRu9DYBMwel/mr7kZrzUOfQmmpYrZn2a4= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/go-replayers/grpcreplay v1.1.0 h1:S5+I3zYyZ+GQz68OfbURDdt/+cSMqCK1wrvNx7WBzTE= -github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= +github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/ko v0.15.4 h1:0blRbIdPmSy6v4LvedGxbI/8krdJYQgbSih3v6Y8V1c= github.com/google/ko v0.15.4/go.mod h1:ZkcmfV91Xt6ZzOBHc/cXXGYnqWdNWDVy/gHoUU9sjag= -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-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= +github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= github.com/google/rpmpack v0.6.1-0.20240329070804-c2247cbb881a h1:JJBdjSfqSy3mnDT0940ASQFghwcZ4y4cb6ttjAoXqwE= github.com/google/rpmpack v0.6.1-0.20240329070804-c2247cbb881a/go.mod h1:uqVAUVQLq8UY2hCDfmJ/+rtO3aw7qyhc90rCVEabEfI= -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/safetext v0.0.0-20220905092116-b49f7bc46da2 h1:SJ+NtwL6QaZ21U+IrK7d0gGgpjGGvd2kz+FzTHVzdqI= -github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC9t8wNnpPdctvtSUOPUUg4SHeE6vR1Ir2hmg= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= 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/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= @@ -418,10 +505,10 @@ 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/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= -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.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= @@ -434,14 +521,21 @@ github.com/goreleaser/goreleaser v1.26.2 h1:1iY1HaXtRiMTrwy6KE1sNjkRjsjMi+9l0k6W github.com/goreleaser/goreleaser v1.26.2/go.mod h1:mHi6zr6fuuOh5eHdWWgyo/N8BWED5WEVtb/4GETc9jQ= github.com/goreleaser/nfpm/v2 v2.37.1 h1:RUmeEt8OlEVeSzKRrO5Vl5qVWCtUwx4j9uivGuRo5fw= github.com/goreleaser/nfpm/v2 v2.37.1/go.mod h1:q8+sZXFqn106/eGw+9V+I8+izFxZ/sJjrhwmEUxXhUg= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0 h1:+epNPbD5EqgpEMm5wrl4Hqts3jZt8+kYaqUisuuIGTk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= +github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= +github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= +github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c h1:fEE5/5VNnYUoBOj2I9TP8Jc+a7lge3QWn9DKE7NCwfc= +github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -458,6 +552,10 @@ github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mO github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8zEbfAAzRv52KQ= +github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= @@ -500,8 +598,8 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -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 v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= +github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/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/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= @@ -514,6 +612,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= +github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= 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.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= @@ -531,8 +631,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/letsencrypt/boulder v0.0.0-20240418210053-89b07f4543e0 h1:aiPrFdHDCCvigNBCkOWj2lv9Bx5xDp210OANZEoiP0I= -github.com/letsencrypt/boulder v0.0.0-20240418210053-89b07f4543e0/go.mod h1:srVwm2N3DC/tWqQ+igZXDrmKlNRN8X/dmJ1wEZrv760= +github.com/letsencrypt/boulder v0.0.0-20250624003606-5ddd5acf990d h1:fCRb9hXR4QQJpwc7xnGugnva0DD5ollTGkys0n8aXT4= +github.com/letsencrypt/boulder v0.0.0-20250624003606-5ddd5acf990d/go.mod h1:BVoSL2Ed8oCncct0meeBqoTY7b1Mzx7WqEOZ8EisFmY= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -555,8 +655,12 @@ github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRC github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= +github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= 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/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -569,10 +673,22 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo= -github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= +github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= +github.com/moby/sys/capability v0.4.0/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I= +github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= +github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= +github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -616,36 +732,46 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= -github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= -github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= +github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= +github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= +github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/opencontainers/runc v1.2.0-rc.1 h1:SMjop2pxxYRTfKdsigna/8xRoaoCfIQfD2cVuOb64/o= -github.com/opencontainers/runc v1.2.0-rc.1/go.mod h1:m9JwxfHzXz5YTTXBQr7EY9KTuazFAGPyMQx2nRR3vTw= +github.com/opencontainers/runc v1.2.6 h1:P7Hqg40bsMvQGCS4S7DJYhUZOISMLJOB2iGX5COWiPk= +github.com/opencontainers/runc v1.2.6/go.mod h1:dOQeFo29xZKBNeRBI0B19mJtfHv68YgCTh1X+YphA+4= +github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= +github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/openshift/api v0.0.0-20250509202259-b7d0ca2f7643 h1:pMHjFvKy0Q4Hxocx7U4JmI5qIo9j+xrU3R+ym3lIzHs= github.com/openshift/api v0.0.0-20250509202259-b7d0ca2f7643/go.mod h1:yk60tHAmHhtVpJQo3TwVYq2zpuP70iJIFDCmeKMIzPw= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/operator-framework/api v0.31.0 h1:tRsFTuZ51xD8U5QgiPo3+mZgVipHZVgRXYrI6RRXOh8= -github.com/operator-framework/api v0.31.0/go.mod h1:57oCiHNeWcxmzu1Se8qlnwEKr/GGXnuHvspIYFCcXmY= +github.com/operator-framework/api v0.32.0 h1:LZSZr7at3NrjsjwQVNsYD+04o5wMq75jrR0dMYiIIH8= +github.com/operator-framework/api v0.32.0/go.mod h1:OGJo6HUYxoQwpGaLr0lPJzSek51RiXajJSSa8Jzjvp8= +github.com/operator-framework/operator-registry v1.56.0 h1:vbTyee/gahpnh7qw1hV1osnWy9YpTjIbEuHpwIdoEUs= +github.com/operator-framework/operator-registry v1.56.0/go.mod h1:NOmQyrgOGW0cwUxHG5ZqKxdObOzQNmO4Rxcf7JC32FU= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= +github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= +github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= +github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= +github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pborman/getopt v0.0.0-20180811024354-2b5b3bfb099b/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= +github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= 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.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= 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= @@ -653,6 +779,8 @@ github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/proglottis/gpgme v0.1.4 h1:3nE7YNA70o2aLjcg63tXMOhPD7bplfE5CBdV+hLAm2M= +github.com/proglottis/gpgme v0.1.4/go.mod h1:5LoXMgpE4bttgwwdv9bLs/vwqv3qV7F4glEEZ7mRKrM= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.82.2 h1:XXoaK87apyXqLm7xVEQ63pk8+GDupbVtHaBiW8IxPow= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.82.2/go.mod h1:hY5yoQsoIalncoxYqXXCDL5y7f+GGYYlW9Bi2IdU5KY= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= @@ -660,30 +788,36 @@ github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= -github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/redis/go-redis/extra/rediscmd/v9 v9.10.0 h1:uTiEyEyfLhkw678n6EulHVto8AkcXVr8zUcBJNZ0ark= +github.com/redis/go-redis/extra/rediscmd/v9 v9.10.0/go.mod h1:eFYL/99JvdLP4T9/3FZ5t2pClnv7mMskc+WstTcyVr4= +github.com/redis/go-redis/extra/redisotel/v9 v9.10.0 h1:4z7/hCJ9Jft8EBb2tDmK38p2WjyIEJ1ShhhwAhjOCps= +github.com/redis/go-redis/extra/redisotel/v9 v9.10.0/go.mod h1:B0thqLh4hB8MvvcUKSwyP5YiIcCCp8UrQ0cA9gEqyjk= +github.com/redis/go-redis/v9 v9.10.0 h1:FxwK3eV8p/CQa0Ch276C7u2d0eNC9kCmAYQ7mCXCzVs= +github.com/redis/go-redis/v9 v9.10.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +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/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= +github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sassoftware/go-rpmutils v0.4.0 h1:ojND82NYBxgwrV+mX1CWsd5QJvvEZTKddtCdFLPWhpg= github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jNYPjT5mVcQcIsYzI= github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e h1:7q6NSFZDeGfvvtIRwBrU/aegEYJYmvev0cHAwo17zZQ= github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e/go.mod h1:DkpGd78rljTxKAnTDPFqXSGxvETQnJyuSOQwsHycqfs= -github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA= -github.com/secure-systems-lab/go-securesystemslib v0.8.0/go.mod h1:UH2VZVuJfCYR8WgMlCU1uFsOUU+KeyrTWcSS73NBOzU= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= @@ -692,17 +826,23 @@ github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+D github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sigstore/cosign/v2 v2.2.4 h1:iY4vtEacmu2hkNj1Fh+8EBqBwKs2DHM27/lbNWDFJro= github.com/sigstore/cosign/v2 v2.2.4/go.mod h1:JZlRD2uaEjVAvZ1XJ3QkkZJhTqSDVtLaet+C/TMR81Y= -github.com/sigstore/rekor v1.3.6 h1:QvpMMJVWAp69a3CHzdrLelqEqpTM3ByQRt5B5Kspbi8= -github.com/sigstore/rekor v1.3.6/go.mod h1:JDTSNNMdQ/PxdsS49DJkJ+pRJCO/83nbR5p3aZQteXc= -github.com/sigstore/sigstore v1.8.4 h1:g4ICNpiENFnWxjmBzBDWUn62rNFeny/P77HUC8da32w= -github.com/sigstore/sigstore v1.8.4/go.mod h1:1jIKtkTFEeISen7en+ZPWdDHazqhxco/+v9CNjc7oNg= +github.com/sigstore/fulcio v1.7.1 h1:RcoW20Nz49IGeZyu3y9QYhyyV3ZKQ85T+FXPKkvE+aQ= +github.com/sigstore/fulcio v1.7.1/go.mod h1:7lYY+hsd8Dt+IvKQRC+KEhWpCZ/GlmNvwIa5JhypMS8= +github.com/sigstore/protobuf-specs v0.4.3 h1:kRgJ+ciznipH9xhrkAbAEHuuxD3GhYnGC873gZpjJT4= +github.com/sigstore/protobuf-specs v0.4.3/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc= +github.com/sigstore/rekor v1.3.10 h1:/mSvRo4MZ/59ECIlARhyykAlQlkmeAQpvBPlmJtZOCU= +github.com/sigstore/rekor v1.3.10/go.mod h1:JvryKJ40O0XA48MdzYUPu0y4fyvqt0C4iSY7ri9iu3A= +github.com/sigstore/sigstore v1.9.5 h1:Wm1LT9yF4LhQdEMy5A2JeGRHTrAWGjT3ubE5JUSrGVU= +github.com/sigstore/sigstore v1.9.5/go.mod h1:VtxgvGqCmEZN9X2zhFSOkfXxvKUjpy8RpUW39oCtoII= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= -github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= +github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/slack-go/slack v0.13.0 h1:7my/pR2ubZJ9912p9FtvALYpbt0cQPAqkRy2jaSI1PQ= github.com/slack-go/slack v0.13.0/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= +github.com/smallstep/pkcs7 v0.2.1 h1:6Kfzr/QizdIuB6LSv8y1LJdZ3aPSfTNhTLqAx9CTLfA= +github.com/smallstep/pkcs7 v0.2.1/go.mod h1:RcXHsMfL+BzH8tRhmrF1NkkpebKpq3JEM66cOFxanf0= github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= @@ -713,16 +853,22 @@ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9yS github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= +github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= +github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw= +github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= +github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= +github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -737,6 +883,7 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -748,8 +895,10 @@ github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFy github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts= -github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk= +github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo= +github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= +github.com/vbauerster/mpb/v8 v8.10.2 h1:2uBykSHAYHekE11YvJhKxYmLATKHAGorZwFlyNw4hHM= +github.com/vbauerster/mpb/v8 v8.10.2/go.mod h1:+Ja4P92E3/CorSZgfDtK46D7AVbDqmBQRTmyTqPElo0= github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 h1:jIVmlAFIqV3d+DOxazTR9v+zgj8+VYuQBzPgBZvWBHA= github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651/go.mod h1:b26F2tHLqaoRQf8DywqzVaV1MQ9yvjb0OMcNl7Nxu20= github.com/wagoodman/go-progress v0.0.0-20220614130704-4b1c25a33c7c h1:gFwUKtkv6QzQsFdIjvPqd0Qdw42DHUEbbUdiUTI1uco= @@ -780,54 +929,78 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= gitlab.com/digitalxero/go-conventional-commit v1.0.7 h1:8/dO6WWG+98PMhlZowt/YjuiKhqhGlOCwlIV8SqqGh8= gitlab.com/digitalxero/go-conventional-commit v1.0.7/go.mod h1:05Xc2BFsSyC5tKhK0y+P3bs0AwUtNuTp+mTpbCU/DZ0= -go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= -go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.etcd.io/bbolt v1.4.2 h1:IrUHp260R8c+zYx/Tm8QZr04CX+qWS5PGfPdevhdm1I= +go.etcd.io/bbolt v1.4.2/go.mod h1:Is8rSHO/b4f3XigBC0lL0+4FwAQv3HXEEIgFMuKHceM= +go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= +go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= +go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= +go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= +go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= +go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= +go.mongodb.org/mongo-driver v1.17.4 h1:jUorfmVzljjr0FLzYQsGP8cgN/qzzxlY9Vh0C9KFXVw= +go.mongodb.org/mongo-driver v1.17.4/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/exporters/autoexport v0.46.1 h1:ysCfPZB9AjUlMa1UHYup3c9dAOCMQX/6sxSfPBUoxHw= -go.opentelemetry.io/contrib/exporters/autoexport v0.46.1/go.mod h1:ha0aiYm+DOPsLHjh0zoQ8W8sLT+LJ58J3j47lGpSLrU= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+BofXTvcY1q8CGs4ItwQarYtJPOWmVobfM1HpVI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 h1:FyjCyI9jVEfqhUh2MoSkmolPjfh5fp2hnV0b0irxH4Q= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= -go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= -go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI= -go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc= +go.opentelemetry.io/contrib/bridges/prometheus v0.61.0 h1:RyrtJzu5MAmIcbRrwg75b+w3RlZCP0vJByDVzcpAe3M= +go.opentelemetry.io/contrib/bridges/prometheus v0.61.0/go.mod h1:tirr4p9NXbzjlbruiRGp53IzlYrDk5CO2fdHj0sSSaY= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= +go.opentelemetry.io/contrib/exporters/autoexport v0.61.0 h1:XfzKtKSrbtYk9TNCF8dkO0Y9M7IOfb4idCwBOTwGBiI= +go.opentelemetry.io/contrib/exporters/autoexport v0.61.0/go.mod h1:N6otC+qXTD5bAnbK2O1f/1SXq3cX+3KYSWrkBUqG0cw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2/go.mod h1:DvPtKE63knkDVP88qpatBj81JxN+w1bqfVbsbCbj1WY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 h1:tPLwQlXbJ8NSOfZc4OkgU5h2A38M4c9kfHSVc4PFQGs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2/go.mod h1:QTnxBwT/1rBIgAG1goq6xMydfYOBKU6KTiYF4fp5zL8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0 h1:zwdo1gS2eH26Rg+CoqVQpEK1h8gvt5qyU5Kk5Bixvow= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0/go.mod h1:rUKCPscaRWWcqGT6HnEmYrK+YNe5+Sw64xgQTOJ5b30= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 h1:gAU726w9J8fwr4qRDqu1GYMNNs4gXrU+Pv20/N1UpB4= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0/go.mod h1:RboSDkp7N292rgu+T0MgVt2qgFGu6qa1RpZDOtpL76w= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 h1:dNzwXjZKpMpE2JhmO+9HsPl42NIXFIFSUSSs0fiqra0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 h1:JgtbA0xkWHnTmYk7YusopJFX6uleBmAuZ8n05NEh8nQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0/go.mod h1:179AK5aar5R3eS9FucPy6rggvU0g52cvKId8pv4+v0c= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 h1:nRVXXvf78e00EwY6Wp0YII8ww2JVWshZ20HfTlE11AM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0/go.mod h1:r49hO7CgrxY9Voaj3Xe8pANWtr0Oq916d0XAmOoCZAQ= +go.opentelemetry.io/otel/exporters/prometheus v0.58.0 h1:CJAxWKFIqdBennqxJyOgnt5LqkeFRT+Mz3Yjz3hL+h8= +go.opentelemetry.io/otel/exporters/prometheus v0.58.0/go.mod h1:7qo/4CLI+zYSNbv0GMNquzuss2FVZo3OYrGh96n4HNc= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2 h1:12vMqzLLNZtXuXbJhSENRg+Vvx+ynNilV8twBLBsXMY= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2/go.mod h1:ZccPZoPOoq8x3Trik/fCsba7DEYDUnN6yX79pgp2BUQ= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 h1:G8Xec/SgZQricwWBJF/mHZc7A02YHedfFDENwJEdRA0= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0/go.mod h1:PD57idA/AiFD5aqoxGxCvT/ILJPeHy3MjqU/NS7KogY= +go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= +go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0= +go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= +go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= -go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= @@ -840,8 +1013,12 @@ go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -gocloud.dev v0.37.0 h1:XF1rN6R0qZI/9DYjN16Uy0durAmSlf58DHOcb28GPro= -gocloud.dev v0.37.0/go.mod h1:7/O4kqdInCNsc6LqgmuFnS0GRew4XNNYWpA44yQnwco= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE= +go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI= +gocloud.dev v0.40.0 h1:f8LgP+4WDqOG/RXoUcyLpeIAGOcAbZrZbDQCUee10ng= +gocloud.dev v0.40.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -852,16 +1029,14 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= -golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -874,8 +1049,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= 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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -889,14 +1064,12 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= @@ -910,8 +1083,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -930,8 +1103,6 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -941,9 +1112,7 @@ golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= @@ -953,16 +1122,14 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= -golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -980,34 +1147,34 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= 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= -google.golang.org/api v0.172.0 h1:/1OcMZGPmW1rX2LCu2CmGUD1KXK1+pfzxotxyRUCCdk= -google.golang.org/api v0.172.0/go.mod h1:+fJZq6QXWfa9pXhnIzsjx4yI22d4aI9ZpLb58gvXjis= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +google.golang.org/api v0.232.0 h1:qGnmaIMf7KcuwHOlF3mERVzChloDYwRfOJOrHt8YC3I= +google.golang.org/api v0.232.0/go.mod h1:p9QCfBWZk1IJETUdbTKloR5ToFdKbYh2fkjsUL6vNoY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7 h1:ImUcDPHjTrAqNhlOkSocDLfG9rrNHH7w7uoKWPaWZ8s= -google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7/go.mod h1:/3XmxOjePkvmKrHuBy4zNFw7IzxJXtAgdpXi8Ll990U= -google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0= -google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 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.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= -google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= +google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= 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= @@ -1046,39 +1213,43 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.33.0 h1:yTgZVn1XEe6opVpP1FylmNrIFWuDqe2H0V8CT5gxfIU= -k8s.io/api v0.33.0/go.mod h1:CTO61ECK/KU7haa3qq8sarQ0biLq2ju405IZAd9zsiM= -k8s.io/apiextensions-apiserver v0.33.0 h1:d2qpYL7Mngbsc1taA4IjJPRJ9ilnsXIrndH+r9IimOs= -k8s.io/apiextensions-apiserver v0.33.0/go.mod h1:VeJ8u9dEEN+tbETo+lFkwaaZPg6uFKLGj5vyNEwwSzc= -k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ= -k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/autoscaler/vertical-pod-autoscaler v1.3.1 h1:/4sWdEE8grPknfFOXS+hs3HfatymRHcseidxrGtWYIY= -k8s.io/autoscaler/vertical-pod-autoscaler v1.3.1/go.mod h1:W4k7qGP8A9Xqp+UK+lM49AfsWkAdXzE80F/s8kxwWVI= -k8s.io/cli-runtime v0.33.0 h1:Lbl/pq/1o8BaIuyn+aVLdEPHVN665tBAXUePs8wjX7c= -k8s.io/cli-runtime v0.33.0/go.mod h1:QcA+r43HeUM9jXFJx7A+yiTPfCooau/iCcP1wQh4NFw= -k8s.io/client-go v0.33.0 h1:UASR0sAYVUzs2kYuKn/ZakZlcs2bEHaizrrHUZg0G98= -k8s.io/client-go v0.33.0/go.mod h1:kGkd+l/gNGg8GYWAPr0xF1rRKvVWvzh9vmZAMXtaKOg= +k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY= +k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs= +k8s.io/apiextensions-apiserver v0.33.2 h1:6gnkIbngnaUflR3XwE1mCefN3YS8yTD631JXQhsU6M8= +k8s.io/apiextensions-apiserver v0.33.2/go.mod h1:IvVanieYsEHJImTKXGP6XCOjTwv2LUMos0YWc9O+QP8= +k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY= +k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/apiserver v0.33.2 h1:KGTRbxn2wJagJowo29kKBp4TchpO1DRO3g+dB/KOJN4= +k8s.io/apiserver v0.33.2/go.mod h1:9qday04wEAMLPWWo9AwqCZSiIn3OYSZacDyu/AcoM/M= +k8s.io/cli-runtime v0.33.2 h1:koNYQKSDdq5AExa/RDudXMhhtFasEg48KLS2KSAU74Y= +k8s.io/cli-runtime v0.33.2/go.mod h1:gnhsAWpovqf1Zj5YRRBBU7PFsRc6NkEkwYNQE+mXL88= +k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E= +k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo= +k8s.io/component-base v0.33.2 h1:sCCsn9s/dG3ZrQTX/Us0/Sx2R0G5kwa0wbZFYoVp/+0= +k8s.io/component-base v0.33.2/go.mod h1:/41uw9wKzuelhN+u+/C59ixxf4tYQKW7p32ddkYNe2k= 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-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 h1:jgJW5IePPXLGB8e/1wvd0Ich9QE97RvvF3a8J3fP/Lg= -k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= +k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= -sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= -sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= +sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/kind v0.24.0 h1:g4y4eu0qa+SCeKESLpESgMmVFBebL0BDa6f777OIWrg= -sigs.k8s.io/kind v0.24.0/go.mod h1:t7ueEpzPYJvHA8aeLtI52rtFftNgUYUaCwvxjk7phfw= +sigs.k8s.io/kind v0.29.0 h1:3TpCsyh908IkXXpcSnsMjWdwdWjIl7o9IMZImZCWFnI= +sigs.k8s.io/kind v0.29.0/go.mod h1:ldWQisw2NYyM6k64o/tkZng/1qQW7OlzcN5a8geJX3o= sigs.k8s.io/kustomize/api v0.19.0 h1:F+2HB2mU1MSiR9Hp1NEgoU2q9ItNOaBJl0I4Dlus5SQ= sigs.k8s.io/kustomize/api v0.19.0/go.mod h1:/BbwnivGVcBh1r+8m3tH1VNxJmHSk1PzP5fkP6lbL1o= sigs.k8s.io/kustomize/kyaml v0.19.0 h1:RFge5qsO1uHhwJsu3ipV7RNolC7Uozc0jUBC/61XSlA= @@ -1088,7 +1259,8 @@ sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ= +sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4= software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k= software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= diff --git a/internal/api/fbc/v1/types.go b/internal/api/fbc/v1/types.go new file mode 100644 index 0000000..15f9181 --- /dev/null +++ b/internal/api/fbc/v1/types.go @@ -0,0 +1,19 @@ +package v1 + +import ( + v1 "github.com/joelanford/kpm/internal/pkg/bundle/registry/v1" +) + +type Package struct { + Schema string `json:"schema"` + Name string `json:"name"` + DefaultChannel string `json:"defaultChannel,omitempty"` + Icon *Icon `json:"icon,omitempty"` + Description string `json:"description,omitempty"` + Properties []v1.Property `json:"properties,omitempty"` +} + +type Icon struct { + Data []byte `json:"base64data"` + MediaType string `json:"mediatype"` +} diff --git a/internal/api/fbc/v2/types.go b/internal/api/fbc/v2/types.go new file mode 100644 index 0000000..5ec3cc8 --- /dev/null +++ b/internal/api/fbc/v2/types.go @@ -0,0 +1 @@ +package v2 diff --git a/internal/pkg/bundle/registry/internal/do.go b/internal/pkg/bundle/registry/internal/do.go new file mode 100644 index 0000000..66482d0 --- /dev/null +++ b/internal/pkg/bundle/registry/internal/do.go @@ -0,0 +1,11 @@ +package internal + +import "errors" + +func DoAll(funcs ...func() error) error { + var errs []error + for _, fn := range funcs { + errs = append(errs, fn()) + } + return errors.Join(errs...) +} diff --git a/internal/pkg/bundle/registry/internal/supported_kinds.go b/internal/pkg/bundle/registry/internal/supported_kinds.go new file mode 100644 index 0000000..9531610 --- /dev/null +++ b/internal/pkg/bundle/registry/internal/supported_kinds.go @@ -0,0 +1,77 @@ +package internal + +import ( + consolev1 "github.com/openshift/api/console/v1" + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + autoscalingv1 "k8s.io/api/autoscaling/v1" + corev1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" + policyv1 "k8s.io/api/policy/v1" + rbacv1 "k8s.io/api/rbac/v1" + schedulingv1 "k8s.io/api/scheduling/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/sets" + + ofv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" +) + +var SupportedKinds = sets.New[string]( + // corev1 + "ConfigMap", + "Secret", + "Service", + "ServiceAccount", + + // apiextensionsv1 + "CustomResourceDefinition", + + // rbacv1 + "ClusterRole", + "ClusterRoleBinding", + "Role", + "RoleBinding", + + // ofv1alpha1 + ofv1alpha1.ClusterServiceVersionKind, + + // schedulingv1 + "PriorityClass", + + // policyv1 + "PodDisruptionBudget", + + // autoscalingv1 + "VerticalPodAutoscaler", + + // monitoringv1 + "PrometheusRule", + "ServiceMonitor", + + // console + "ConsoleYAMLSample", + "ConsoleQuickStart", + "ConsoleCLIDownload", + "ConsoleLink", +) + +func initScheme() *runtime.Scheme { + scheme := runtime.NewScheme() + _ = corev1.AddToScheme(scheme) + _ = apiextensionsv1.AddToScheme(scheme) + _ = rbacv1.AddToScheme(scheme) + _ = ofv1alpha1.AddToScheme(scheme) + _ = schedulingv1.AddToScheme(scheme) + _ = policyv1.AddToScheme(scheme) + _ = autoscalingv1.AddToScheme(scheme) + _ = monitoringv1.AddToScheme(scheme) + _ = networkingv1.AddToScheme(scheme) + _ = consolev1.AddToScheme(scheme) + return scheme +} + +var SupportedKindsScheme *runtime.Scheme + +func init() { + SupportedKindsScheme = initScheme() +} diff --git a/internal/pkg/bundle/registry/v1/bundle.go b/internal/pkg/bundle/registry/v1/bundle.go index a2d045d..fd95531 100644 --- a/internal/pkg/bundle/registry/v1/bundle.go +++ b/internal/pkg/bundle/registry/v1/bundle.go @@ -1,97 +1,152 @@ package v1 import ( + "bytes" + "compress/gzip" + "context" + "crypto/sha256" + "encoding/json" "errors" "fmt" + "io" "io/fs" + "path/filepath" + "testing/fstest" - "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/opencontainers/go-digest" + "github.com/opencontainers/image-spec/specs-go" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" + "oras.land/oras-go/v2" + "oras.land/oras-go/v2/content" + + "github.com/joelanford/kpm/internal/pkg/util/tar" ) -const MediaType = "registry+v1" +const ( + mediaType = "registry+v1" + manifestsDirectory = "manifests/" + metadataDirectory = "metadata/" +) type Bundle struct { - fsys fs.FS - manifests manifests - metadata metadata + manifests *manifests + metadata *metadata +} - csv v1alpha1.ClusterServiceVersion +type BundleLoader interface { + Load() (*Bundle, error) } -func LoadFS(fsys fs.FS) (*Bundle, error) { - metadataFsys, err := fs.Sub(fsys, "metadata") - if err != nil { +type bundleFSLoader struct { + fsys fs.FS +} + +func NewBundleFSLoader(fsys fs.FS) BundleLoader { + return &bundleFSLoader{fsys: fsys} +} + +func (b *bundleFSLoader) Load() (*Bundle, error) { + manifestsFS, manifestsFSErr := fs.Sub(b.fsys, filepath.Clean(manifestsDirectory)) + metadataFS, metadataFSErr := fs.Sub(b.fsys, filepath.Clean(metadataDirectory)) + if err := errors.Join(manifestsFSErr, metadataFSErr); err != nil { return nil, err } - manifestsFsys, err := fs.Sub(fsys, "manifests") - if err != nil { + + manifestsLoader := &manifestsFSLoader{manifestsFS} + metadataLoader := &metadataFSLoader{metadataFS} + + bundleManifests, manifestsErr := manifestsLoader.Load() + bundleMetadata, metadataErr := metadataLoader.Load() + if err := errors.Join(manifestsErr, metadataErr); err != nil { return nil, err } - b := &Bundle{ - fsys: fsys, - metadata: metadata{fsys: metadataFsys}, - manifests: manifests{fsys: manifestsFsys}, - } - for _, fn := range []func() error{ - b.load, - b.validate, - b.complete, - } { - if err := fn(); err != nil { - return nil, err - } - } - return b, nil + + return &Bundle{manifests: bundleManifests, metadata: bundleMetadata}, nil } -func (b *Bundle) load() error { - if err := do( - b.metadata.load, - b.manifests.load, - ); err != nil { - return fmt.Errorf("failed to load bundle: %v", err) - } - return nil +func (b *Bundle) tag() string { + return b.manifests.CSV().Value().Spec.Version.String() } -func (b *Bundle) validate() error { - if err := do( - b.metadata.validate, - b.manifests.validate, - ); err != nil { - return fmt.Errorf("failed to validate bundle: %v", err) - } - return nil +func (b *Bundle) ID() string { + return fmt.Sprintf("%s.v%s", b.metadata.PackageName(), b.tag()) } -func (b *Bundle) complete() error { - if err := do( - b.extractCSV, - ); err != nil { - return fmt.Errorf("failed to complete bundle: %v", err) - } - return nil +func (b *Bundle) imageNameTag() string { + return fmt.Sprintf("%s:%s", b.metadata.PackageName(), b.tag()) } -func (b *Bundle) extractCSV() error { - for _, mf := range b.manifests.manifestFiles { - for _, obj := range mf.objects { - if obj.GetObjectKind().GroupVersionKind().Kind != v1alpha1.ClusterServiceVersionKind { - continue - } - csv := obj.(*v1alpha1.ClusterServiceVersion) - b.csv = *csv - return nil - } +func (b *Bundle) MarshalOCI(ctx context.Context, target oras.Target) (ocispec.Descriptor, error) { + config, layers, err := b.pushConfigAndLayers(ctx, target) + if err != nil { + return ocispec.Descriptor{}, err } - // this should never happen because the earlier validate step ensures there is exactly one CSV in the manifests. - return fmt.Errorf("failed to find ClusterServiceVersion in bundle") + + manifest := ocispec.Manifest{ + Versioned: specs.Versioned{SchemaVersion: 2}, + MediaType: ocispec.MediaTypeImageManifest, + Config: config, + Layers: layers, + } + manifestData, err := json.Marshal(manifest) + if err != nil { + return ocispec.Descriptor{}, err + } + + desc, err := oras.PushBytes(ctx, target, ocispec.MediaTypeImageManifest, manifestData) + if err != nil { + return ocispec.Descriptor{}, fmt.Errorf("failed to push bundle: %v", err) + } + if err := target.Tag(ctx, desc, b.imageNameTag()); err != nil { + return ocispec.Descriptor{}, fmt.Errorf("failed to tag bundle: %v", err) + } + return desc, nil +} + +func (b *Bundle) toFS() fs.FS { + fsys := fstest.MapFS{} + b.manifests.addToFS(fsys) + b.metadata.addToFS(fsys) + return fsys } -func do(funcs ...func() error) error { - var errs []error - for _, fn := range funcs { - errs = append(errs, fn()) +func (b *Bundle) pushConfigAndLayers(ctx context.Context, pusher content.Pusher) (ocispec.Descriptor, []ocispec.Descriptor, error) { + var layerData bytes.Buffer + diffIDHash := sha256.New() + + bundleFS := b.toFS() + if err := func() error { + gzipWriter := gzip.NewWriter(&layerData) + defer gzipWriter.Close() + mw := io.MultiWriter(diffIDHash, gzipWriter) + return tar.Directory(mw, bundleFS) + }(); err != nil { + return ocispec.Descriptor{}, nil, err + } + + annotationsFile := b.metadata.Annotations() + cfg := ocispec.Image{ + Config: ocispec.ImageConfig{ + Labels: annotationsFile.Value().Annotations, + }, + RootFS: ocispec.RootFS{ + Type: "layers", + DiffIDs: []digest.Digest{ + digest.NewDigest(digest.SHA256, diffIDHash), + }, + }, + } + cfgData, err := json.Marshal(cfg) + if err != nil { + return ocispec.Descriptor{}, nil, err + } + cfgDesc, err := oras.PushBytes(ctx, pusher, ocispec.MediaTypeImageConfig, cfgData) + if err != nil { + return ocispec.Descriptor{}, nil, err + } + layerDesc, err := oras.PushBytes(ctx, pusher, ocispec.MediaTypeImageLayerGzip, layerData.Bytes()) + if err != nil { + return ocispec.Descriptor{}, nil, err } - return errors.Join(errs...) + return cfgDesc, []ocispec.Descriptor{layerDesc}, nil } diff --git a/internal/pkg/bundle/registry/v1/bundle_test.go b/internal/pkg/bundle/registry/v1/bundle_test.go index 05793f1..f7e0fe5 100644 --- a/internal/pkg/bundle/registry/v1/bundle_test.go +++ b/internal/pkg/bundle/registry/v1/bundle_test.go @@ -5,14 +5,19 @@ import ( "testing" "testing/fstest" + "github.com/opencontainers/go-digest" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/stretchr/testify/require" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/utils/ptr" + "oras.land/oras-go/v2/content/memory" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/operator-framework/api/pkg/operators/v1alpha1" ) -func TestLoadFS(t *testing.T) { +func Test_BundleFSLoader_Load(t *testing.T) { tests := []struct { name string fsys fs.FS @@ -25,6 +30,18 @@ func TestLoadFS(t *testing.T) { "manifests/csv.yaml": &fstest.MapFile{Data: []byte(` apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion +metadata: + name: example.v1.2.3 +spec: + version: "1.2.3" +`)}, + "manifests/crd.yaml": &fstest.MapFile{Data: []byte(` +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +`)}, + "manifests/secret.yaml": &fstest.MapFile{Data: []byte(` +apiVersion: v1 +kind: Secret `)}, "metadata/annotations.yaml": &fstest.MapFile{Data: []byte(` annotations: @@ -33,60 +50,162 @@ annotations: operators.operatorframework.io.bundle.metadata.v1: metadata/ operators.operatorframework.io.bundle.package.v1: example `)}, + "metadata/properties.yaml": &fstest.MapFile{Data: []byte(`properties: []`)}, + "metadata/dependencies.yaml": &fstest.MapFile{Data: []byte(`dependencies: []`)}, }, expected: &Bundle{ - manifests: manifests{manifestFiles: []manifestFile{ - { - filename: "csv.yaml", - objects: []client.Object{makeObject(v1alpha1.SchemeGroupVersion.WithKind("ClusterServiceVersion"))}, + manifests: &manifests{ + csv: newCSVFromData(t, "csv.yaml", []byte(` +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + name: example.v1.2.3 +spec: + version: "1.2.3" +`)), + crds: []File[*apiextensionsv1.CustomResourceDefinition]{ + newCRDFromData(t, "crd.yaml", []byte(` +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +`)), }, - }}, - metadata: metadata{annotationsFile: Annotations{map[string]string{ - AnnotationMediaType: MediaType, - AnnotationManifests: ManifestsDirectory, - AnnotationMetadata: MetadataDirectory, - AnnotationPackage: "example", - }}}, - csv: v1alpha1.ClusterServiceVersion{ - TypeMeta: metav1.TypeMeta{APIVersion: v1alpha1.SchemeGroupVersion.String(), Kind: "ClusterServiceVersion"}, + others: []File[client.Object]{ + newObjectFromData[*corev1.Secret](t, "secret.yaml", []byte(` +apiVersion: v1 +kind: Secret +`)), + }, + }, + metadata: &metadata{ + annotationsFile: newFromData[Annotations](t, annotationsFileName, []byte(` +annotations: + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: example +`)), + propertiesFile: ptr.To(newFromData[Properties](t, propertiesFileName, []byte(`properties: []`))), + dependenciesFile: ptr.To(newFromData[Dependencies](t, dependenciesFileName, []byte(`dependencies: []`))), }, }, assertErr: require.NoError, }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + l := NewBundleFSLoader(tt.fsys) + actual, err := l.Load() + tt.assertErr(t, err) + require.Equal(t, tt.expected, actual) + }) + } +} + +func Test_Bundle_MarshalOCI(t *testing.T) { + tests := []struct { + name string + bundle Bundle + expected ocispec.Descriptor + assertErr require.ErrorAssertionFunc + shouldPanic bool + }{ { - name: "fails during load step", - fsys: fstest.MapFS{}, - expected: nil, - assertErr: func(t require.TestingT, err error, i ...interface{}) { - require.ErrorContains(t, err, "failed to load bundle:") - }, - }, - { - name: "fails during validate step", - fsys: fstest.MapFS{ - "manifests/csv.yaml": &fstest.MapFile{Data: []byte(` + name: "succeeds", + bundle: Bundle{ + manifests: &manifests{ + csv: newCSVFromData(t, "csv.yaml", []byte(` apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion -`)}, - "metadata/annotations.yaml": &fstest.MapFile{Data: []byte(`annotations: {}`)}, +metadata: + name: example.v1.2.3 +spec: + version: "1.2.3" +`)), + crds: []File[*apiextensionsv1.CustomResourceDefinition]{ + newCRDFromData(t, "crd.yaml", []byte(` +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +`)), + }, + others: []File[client.Object]{ + newObjectFromData[*corev1.Secret](t, "secret.yaml", []byte(` +apiVersion: v1 +kind: Secret +`)), + }, + }, + metadata: &metadata{ + annotationsFile: newFromData[Annotations](t, annotationsFileName, []byte(` +annotations: + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: example +`)), + }, }, - expected: nil, - assertErr: func(t require.TestingT, err error, i ...interface{}) { - require.ErrorContains(t, err, "failed to validate bundle:") + expected: ocispec.Descriptor{ + MediaType: ocispec.MediaTypeImageManifest, + // NOTE: DO NOT CHANGE THIS DIGEST if nothing in the bundle has changed. + // This ensures that bundles can always be rebuilt such that the digest + // never changes if input hasn't changed. + // + // If you need to change something in the bundle, there should be a PR + // where the only changes are in the input/output of this test. + Digest: digest.NewDigestFromEncoded(digest.SHA256, "40ba1bcad69d6e0d1e4be0c21d2ee68f3b90125c585b046ca8c172bb4c828203"), + Size: 401, }, + assertErr: require.NoError, + }, + { + name: "bundle zero-value", + bundle: Bundle{}, + shouldPanic: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - actual, err := LoadFS(tt.fsys) - tt.assertErr(t, err) + target := memory.New() - if actual != nil { - actual.fsys = nil - actual.manifests.fsys = nil - actual.metadata.fsys = nil + doIt := func() { + actual, err := tt.bundle.MarshalOCI(t.Context(), target) + tt.assertErr(t, err) + require.Equal(t, tt.expected, actual) + } + + if tt.shouldPanic { + require.Panics(t, doIt) + } else { + require.NotPanics(t, doIt) } - require.Equal(t, tt.expected, actual) }) } } + +func newCSVFromData(t *testing.T, filename string, data []byte) File[*v1alpha1.ClusterServiceVersion] { + t.Helper() + f, err := NewYAMLDataFile[*v1alpha1.ClusterServiceVersion](filename, data) + require.NoError(t, err) + return *f +} + +func newCRDFromData(t *testing.T, filename string, data []byte) File[*apiextensionsv1.CustomResourceDefinition] { + t.Helper() + f, err := NewYAMLDataFile[*apiextensionsv1.CustomResourceDefinition](filename, data) + require.NoError(t, err) + return *f +} + +func newObjectFromData[T client.Object](t *testing.T, filename string, data []byte) File[client.Object] { + t.Helper() + f, err := NewYAMLDataFile[T](filename, data) + require.NoError(t, err) + return NewPrecomputedFile[client.Object](filename, data, f.Value()) +} + +func newFromData[T any](t *testing.T, filename string, data []byte) File[T] { + t.Helper() + f, err := NewYAMLDataFile[T](filename, data) + require.NoError(t, err) + return *f +} diff --git a/internal/pkg/bundle/registry/v1/file.go b/internal/pkg/bundle/registry/v1/file.go new file mode 100644 index 0000000..7ad2671 --- /dev/null +++ b/internal/pkg/bundle/registry/v1/file.go @@ -0,0 +1,43 @@ +package v1 + +import ( + "sigs.k8s.io/yaml" +) + +type File[T any] struct { + name string + data []byte + value T +} + +func NewYAMLDataFile[T any](name string, data []byte) (*File[T], error) { + var value T + if err := yaml.Unmarshal(data, &value); err != nil { + return nil, err + } + return &File[T]{name: name, data: data, value: value}, nil +} + +func NewYAMLValueFile[T any](name string, value T) (*File[T], error) { + data, err := yaml.Marshal(value) + if err != nil { + return nil, err + } + return &File[T]{name: name, data: data, value: value}, nil +} + +func NewPrecomputedFile[T any](name string, data []byte, value T) File[T] { + return File[T]{name: name, data: data, value: value} +} + +func (m File[T]) Name() string { + return m.name +} + +func (m File[T]) Data() []byte { + return m.data +} + +func (m File[T]) Value() T { + return m.value +} diff --git a/internal/pkg/bundle/registry/v1/manifests.go b/internal/pkg/bundle/registry/v1/manifests.go index e5cd3b1..1ab7f28 100644 --- a/internal/pkg/bundle/registry/v1/manifests.go +++ b/internal/pkg/bundle/registry/v1/manifests.go @@ -1,39 +1,99 @@ package v1 import ( + "bytes" "errors" "fmt" + "io" "io/fs" + "iter" "maps" "path/filepath" "slices" "strings" + "testing/fstest" - consolev1 "github.com/openshift/api/console/v1" - monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" - corev1 "k8s.io/api/core/v1" - policyv1 "k8s.io/api/policy/v1" - rbacv1 "k8s.io/api/rbac/v1" - schedulingv1 "k8s.io/api/scheduling/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" - autoscalingv1 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" "k8s.io/cli-runtime/pkg/resource" "sigs.k8s.io/controller-runtime/pkg/client" - ofv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" -) + "github.com/operator-framework/api/pkg/operators/v1alpha1" -const ManifestsDirectory = "manifests/" + "github.com/joelanford/kpm/internal/pkg/bundle/registry/internal" +) type manifests struct { - fsys fs.FS - manifestFiles []manifestFile + csv File[*v1alpha1.ClusterServiceVersion] + crds []File[*apiextensionsv1.CustomResourceDefinition] + others []File[client.Object] +} + +func (m *manifests) CSV() File[*v1alpha1.ClusterServiceVersion] { + return m.csv +} + +func (m *manifests) CRDs() []File[*apiextensionsv1.CustomResourceDefinition] { + return m.crds +} + +func (m *manifests) Others() []File[client.Object] { + return m.others +} + +func (m *manifests) All() iter.Seq[File[client.Object]] { + return func(yield func(File[client.Object]) bool) { + if !yield(toObjectFile(m.csv)) { + return + } + for _, crd := range m.crds { + if !yield(toObjectFile(crd)) { + return + } + } + for _, other := range m.others { + if !yield(other) { + return + } + } + } +} + +func toObjectFile[T client.Object](in File[T]) File[client.Object] { + return NewPrecomputedFile[client.Object](in.Name(), in.Data(), in.Value()) +} + +func (m *manifests) addToFS(fsys fstest.MapFS) { + for f := range m.All() { + path := filepath.Join(manifestsDirectory, f.Name()) + fsys[path] = &fstest.MapFile{Data: f.Data()} + } +} + +type ManifestsLoader interface { + Load() (*manifests, error) +} + +type manifestsFSLoader struct { + fsys fs.FS +} + +func (m *manifestsFSLoader) Load() (*manifests, error) { + files, err := m.loadFiles() + if err != nil { + return nil, err + } + return files.toManifests() } -func (m *manifests) load() error { - var loadErrs []error +func (m *manifestsFSLoader) loadFiles() (manifestFiles, error) { + var ( + files manifestFiles + loadErrs []error + ) + if err := fs.WalkDir(m.fsys, ".", func(path string, d fs.DirEntry, err error) error { if err != nil { loadErrs = append(loadErrs, err) @@ -42,23 +102,57 @@ func (m *manifests) load() error { if d.IsDir() { return nil } - mf, err := newManifestFile(m.fsys, path) + + f, err := m.fsys.Open(path) + if err != nil { + loadErrs = append(loadErrs, err) + return nil + } + defer f.Close() + + mf, err := newManifestFileFromReader(f, path) if err != nil { loadErrs = append(loadErrs, err) return nil } - m.manifestFiles = append(m.manifestFiles, *mf) + files = append(files, *mf) return nil }); err != nil { - panic("programmer error: walk function should have collected error, not returned it. Error: " + err.Error()) + panic("all errors should be collected by the WalkDirFunc") } if err := errors.Join(loadErrs...); err != nil { - return fmt.Errorf("failed to load manifests: %v", err) + return nil, fmt.Errorf("failed to load manifests: %v", err) } - return nil + return files, nil } -func (m *manifests) validate() error { +type manifestFiles []File[[]client.Object] + +func (m manifestFiles) toManifests() (*manifests, error) { + if err := m.validate(); err != nil { + return nil, err + } + var manifests manifests + for _, mf := range m { + if len(mf.Value()) != 1 { + panic("validation should have ensured that each manifest file has exactly one object") + } + obj := mf.Value()[0] + switch obj.GetObjectKind().GroupVersionKind().Kind { + case v1alpha1.ClusterServiceVersionKind: + csvObj := obj.(*v1alpha1.ClusterServiceVersion) + manifests.csv = NewPrecomputedFile(mf.Name(), mf.Data(), csvObj) + case "CustomResourceDefinition": + crdObj := obj.(*apiextensionsv1.CustomResourceDefinition) + manifests.crds = append(manifests.crds, NewPrecomputedFile(mf.Name(), mf.Data(), crdObj)) + default: + manifests.others = append(manifests.others, NewPrecomputedFile(mf.Name(), mf.Data(), obj)) + } + } + return &manifests, nil +} + +func (m manifestFiles) validate() error { var validationErrors []error for _, validationFn := range []func() error{ m.validateNoSubDirectories, @@ -76,10 +170,10 @@ func (m *manifests) validate() error { return nil } -func (m *manifests) validateNoSubDirectories() error { +func (m manifestFiles) validateNoSubDirectories() error { foundSubDirectories := map[string]struct{}{} - for _, mf := range m.manifestFiles { - foundSubDirectories[filepath.Dir(mf.filename)] = struct{}{} + for _, mf := range m { + foundSubDirectories[filepath.Dir(mf.Name())] = struct{}{} } delete(foundSubDirectories, ".") if len(foundSubDirectories) == 0 { @@ -88,11 +182,11 @@ func (m *manifests) validateNoSubDirectories() error { return fmt.Errorf("found subdirectories %v: subdirectories not allowed", slices.Sorted(maps.Keys(foundSubDirectories))) } -func (m *manifests) validateOneObjectPerFile() error { +func (m manifestFiles) validateOneObjectPerFile() error { var invalidFiles []string - for _, mf := range m.manifestFiles { - if len(mf.objects) != 1 { - invalidFiles = append(invalidFiles, fmt.Sprintf("%q has %d", mf.filename, len(mf.objects))) + for _, mf := range m { + if len(mf.Value()) != 1 { + invalidFiles = append(invalidFiles, fmt.Sprintf("%q has %d", mf.Name(), len(mf.Value()))) } } if len(invalidFiles) > 0 { @@ -101,19 +195,19 @@ func (m *manifests) validateOneObjectPerFile() error { return nil } -func (m *manifests) validateExactlyOneCSV() error { +func (m manifestFiles) validateExactlyOneCSV() error { totalCount := 0 foundCSVs := map[string]int{} - for _, mf := range m.manifestFiles { - for _, o := range mf.objects { - if o.GetObjectKind().GroupVersionKind().Kind == ofv1alpha1.ClusterServiceVersionKind { + for _, mf := range m { + for _, o := range mf.Value() { + if o.GetObjectKind().GroupVersionKind().Kind == v1alpha1.ClusterServiceVersionKind { totalCount++ - foundCSVs[mf.filename]++ + foundCSVs[mf.Name()]++ } } } if totalCount == 0 { - return fmt.Errorf("exactly one %s object is required, found 0", ofv1alpha1.ClusterServiceVersionKind) + return fmt.Errorf("exactly one %s object is required, found 0", v1alpha1.ClusterServiceVersionKind) } if totalCount > 1 { counts := make([]string, 0, len(foundCSVs)) @@ -121,82 +215,23 @@ func (m *manifests) validateExactlyOneCSV() error { csvCount := foundCSVs[filename] counts = append(counts, fmt.Sprintf("%q has %d", filename, csvCount)) } - return fmt.Errorf("exactly one %s object is required, found %d: %v", ofv1alpha1.ClusterServiceVersionKind, totalCount, strings.Join(counts, ", ")) + return fmt.Errorf("exactly one %s object is required, found %d: %v", v1alpha1.ClusterServiceVersionKind, totalCount, strings.Join(counts, ", ")) } return nil } -var supportedKinds = sets.New[string]( - // corev1 - "ConfigMap", - "Secret", - "Service", - "ServiceAccount", - - // apiextensionsv1 - "CustomResourceDefinition", - - // rbacv1 - "ClusterRole", - "ClusterRoleBinding", - "Role", - "RoleBinding", - - // ofv1alpha1 - ofv1alpha1.ClusterServiceVersionKind, - - // schedulingv1 - "PriorityClass", - - // policyv1 - "PodDisruptionBudget", - - // autoscalingv1 - "VerticalPodAutoscaler", - - // monitoringv1 - "PrometheusRule", - "ServiceMonitor", - - // console - "ConsoleYAMLSample", - "ConsoleQuickStart", - "ConsoleCLIDownload", - "ConsoleLink", -) - -func initScheme() *runtime.Scheme { - scheme := runtime.NewScheme() - _ = corev1.AddToScheme(scheme) - _ = apiextensionsv1.AddToScheme(scheme) - _ = rbacv1.AddToScheme(scheme) - _ = ofv1alpha1.AddToScheme(scheme) - _ = schedulingv1.AddToScheme(scheme) - _ = policyv1.AddToScheme(scheme) - _ = autoscalingv1.AddToScheme(scheme) - _ = monitoringv1.AddToScheme(scheme) - _ = consolev1.AddToScheme(scheme) - return scheme -} - -var supportedKindsScheme *runtime.Scheme - -func init() { - supportedKindsScheme = initScheme() -} - -func (m *manifests) validateSupportedKinds() error { +func (m manifestFiles) validateSupportedKinds() error { var unsupported []string - for _, mf := range m.manifestFiles { + for _, mf := range m { fileUnsupported := sets.New[string]() - for _, obj := range mf.objects { + for _, obj := range mf.Value() { kind := obj.GetObjectKind().GroupVersionKind().Kind - if !supportedKinds.Has(kind) { + if !internal.SupportedKinds.Has(kind) { fileUnsupported.Insert(kind) } } if len(fileUnsupported) > 0 { - unsupported = append(unsupported, fmt.Sprintf("file %q contains %v", mf.filename, sets.List(fileUnsupported))) + unsupported = append(unsupported, fmt.Sprintf("file %q contains %v", mf.Name(), sets.List(fileUnsupported))) } } if len(unsupported) > 0 { @@ -205,24 +240,21 @@ func (m *manifests) validateSupportedKinds() error { return nil } -type manifestFile struct { - filename string - objects []client.Object -} - -func newManifestFile(fsys fs.FS, path string) (*manifestFile, error) { - file, err := fsys.Open(path) - if err != nil { - return nil, err - } - defer file.Close() - +func newManifestFileFromReader(file io.Reader, path string) (*File[[]client.Object], error) { var ( - m = &manifestFile{filename: path} + objs []client.Object errs []error ) + + // We'll store the original file contents in this buffer as the + // resource builder reads objects from the stream. + buf := &bytes.Buffer{} + file = io.TeeReader(file, buf) + + resource.NewLocalBuilder() res := resource.NewLocalBuilder(). - WithScheme(supportedKindsScheme, supportedKindsScheme.PrioritizedVersionsAllGroups()...). + ContinueOnError(). + Unstructured(). Flatten(). Stream(file, path). Do() @@ -234,13 +266,26 @@ func newManifestFile(fsys fs.FS, path string) (*manifestFile, error) { errs = append(errs, err) return nil } - m.objects = append(m.objects, info.Object.(client.Object)) + + u := info.Object.(*unstructured.Unstructured) + gvk := u.GroupVersionKind() + + if internal.SupportedKindsScheme.Recognizes(gvk) { + info.Object, _ = internal.SupportedKindsScheme.New(gvk) + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, info.Object); err != nil { + errs = append(errs, err) + return nil + } + } + + objs = append(objs, info.Object.(client.Object)) return nil }); err != nil { - return nil, err + errs = append(errs, err) } - if len(errs) > 0 { - return nil, errors.Join(errs...) + if err := errors.Join(errs...); err != nil { + return nil, err } - return m, nil + f := NewPrecomputedFile(path, buf.Bytes(), objs) + return &f, nil } diff --git a/internal/pkg/bundle/registry/v1/manifests_test.go b/internal/pkg/bundle/registry/v1/manifests_test.go index 4a38e33..5390c67 100644 --- a/internal/pkg/bundle/registry/v1/manifests_test.go +++ b/internal/pkg/bundle/registry/v1/manifests_test.go @@ -7,6 +7,7 @@ import ( "testing/fstest" "github.com/stretchr/testify/require" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" @@ -14,36 +15,67 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/operator-framework/api/pkg/operators/v1alpha1" + + "github.com/joelanford/kpm/internal/pkg/bundle/registry/internal" ) -func Test_manifests_load(t *testing.T) { +func Test_manifestsFSLoader_loadFiles(t *testing.T) { tests := []struct { name string fsys fs.FS - expected []manifestFile + expected manifestFiles assertErr require.ErrorAssertionFunc }{ { - name: "loads successfully", + name: "loads files successfully", fsys: fstest.MapFS{ - "csv.yaml": &fstest.MapFile{ - Data: []byte(` + "manifest.yaml": &fstest.MapFile{Data: []byte(`--- apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion -`), - }, - }, - expected: []manifestFile{ - {filename: "csv.yaml", objects: []client.Object{&v1alpha1.ClusterServiceVersion{TypeMeta: metav1.TypeMeta{Kind: "ClusterServiceVersion", APIVersion: "operators.coreos.com/v1alpha1"}}}}, +--- +apiVersion: v1 +kind: ConfigMap +--- +apiVersion: example.com/v1alpha1 +kind: SomethingElse +`)}, }, + expected: []File[[]client.Object]{ + NewPrecomputedFile("manifest.yaml", []byte(`--- +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +--- +apiVersion: v1 +kind: ConfigMap +--- +apiVersion: example.com/v1alpha1 +kind: SomethingElse +`), []client.Object{ + &v1alpha1.ClusterServiceVersion{ + TypeMeta: metav1.TypeMeta{ + Kind: "ClusterServiceVersion", + APIVersion: "operators.coreos.com/v1alpha1", + }, + }, + &v1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + Kind: "ConfigMap", + APIVersion: "v1", + }, + }, + &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "example.com/v1alpha1", + "kind": "SomethingElse", + }, + }, + })}, assertErr: require.NoError, }, { name: "fails due to invalid yaml", fsys: fstest.MapFS{ - "invalid.yaml": &fstest.MapFile{ - Data: []byte(`}`), - }, + "invalid.yaml": &fstest.MapFile{Data: []byte(`}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "error parsing invalid.yaml") @@ -52,37 +84,37 @@ kind: ClusterServiceVersion } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := &manifests{fsys: tt.fsys} - err := m.load() + m := manifestsFSLoader{fsys: tt.fsys} + files, err := m.loadFiles() tt.assertErr(t, err) - require.Equal(t, tt.expected, m.manifestFiles) + require.Equal(t, tt.expected, files) }) } } -func Test_manifests_validateNoSubDirectories(t *testing.T) { +func Test_manifestFiles_validateNoSubDirectories(t *testing.T) { tests := []struct { name string - manifestFiles []manifestFile + manifestFiles manifestFiles assertErr require.ErrorAssertionFunc }{ { name: "no sub directories, no error", - manifestFiles: []manifestFile{ - {filename: "manifest1.yaml"}, - {filename: "manifest2.yaml"}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, nil), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, nil), }, assertErr: require.NoError, }, { name: "sub directory presence causes error", - manifestFiles: []manifestFile{ - {filename: "manifest1.yaml"}, - {filename: "manifest2.yaml"}, - {filename: "subdir1/manifest10.yaml"}, - {filename: "subdir1/manifest11.yaml"}, - {filename: "subdir2/manifest20.yaml"}, - {filename: "subdir2/manifest21.yaml"}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, nil), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, nil), + NewPrecomputedFile[[]client.Object]("subdir1/manifest10.yaml", nil, nil), + NewPrecomputedFile[[]client.Object]("subdir1/manifest11.yaml", nil, nil), + NewPrecomputedFile[[]client.Object]("subdir2/manifest20.yaml", nil, nil), + NewPrecomputedFile[[]client.Object]("subdir2/manifest21.yaml", nil, nil), }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "subdirectories not allowed") @@ -93,36 +125,33 @@ func Test_manifests_validateNoSubDirectories(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := &manifests{ - manifestFiles: tt.manifestFiles, - } - err := m.validateNoSubDirectories() + err := tt.manifestFiles.validateNoSubDirectories() tt.assertErr(t, err) }) } } -func Test_manifests_validateOneObjectPerFile(t *testing.T) { +func Test_manifestFiles_validateOneObjectPerFile(t *testing.T) { tests := []struct { name string - manifestFiles []manifestFile + manifestFiles manifestFiles assertErr require.ErrorAssertionFunc }{ { name: "one object per file is valid", - manifestFiles: []manifestFile{ - {filename: "manifest1.yaml", objects: make([]client.Object, 1)}, - {filename: "manifest2.yaml", objects: make([]client.Object, 1)}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, make([]client.Object, 1)), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, make([]client.Object, 1)), }, assertErr: require.NoError, }, { name: "manifests with multiple objects are invalid", - manifestFiles: []manifestFile{ - {filename: "manifest1.yaml", objects: make([]client.Object, 1)}, - {filename: "manifest2.yaml", objects: make([]client.Object, 1)}, - {filename: "manifest3.yaml", objects: make([]client.Object, 2)}, - {filename: "manifest4.yaml", objects: make([]client.Object, 3)}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, make([]client.Object, 1)), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, make([]client.Object, 1)), + NewPrecomputedFile[[]client.Object]("manifest3.yaml", nil, make([]client.Object, 2)), + NewPrecomputedFile[[]client.Object]("manifest4.yaml", nil, make([]client.Object, 3)), }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "manifest files must contain exactly one object") @@ -132,11 +161,11 @@ func Test_manifests_validateOneObjectPerFile(t *testing.T) { }, { name: "manifests with no objects are invalid", - manifestFiles: []manifestFile{ - {filename: "manifest1.yaml", objects: make([]client.Object, 1)}, - {filename: "manifest2.yaml", objects: make([]client.Object, 1)}, - {filename: "manifest3.yaml", objects: make([]client.Object, 0)}, - {filename: "manifest4.yaml", objects: make([]client.Object, 0)}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, make([]client.Object, 1)), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, make([]client.Object, 1)), + NewPrecomputedFile[[]client.Object]("manifest3.yaml", nil, make([]client.Object, 0)), + NewPrecomputedFile[[]client.Object]("manifest4.yaml", nil, make([]client.Object, 0)), }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "manifest files must contain exactly one object") @@ -147,38 +176,35 @@ func Test_manifests_validateOneObjectPerFile(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := &manifests{ - manifestFiles: tt.manifestFiles, - } - err := m.validateOneObjectPerFile() + err := tt.manifestFiles.validateOneObjectPerFile() tt.assertErr(t, err) }) } } -func Test_manifests_validateExactlyOneCSV(t *testing.T) { +func Test_manifestFiles_validateExactlyOneCSV(t *testing.T) { other := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Other"}) csv := makeObject(v1alpha1.SchemeGroupVersion.WithKind(v1alpha1.ClusterServiceVersionKind)) tests := []struct { name string - manifestFiles []manifestFile + manifestFiles manifestFiles assertErr require.ErrorAssertionFunc }{ { name: "exactly one csv among all files is valid", - manifestFiles: []manifestFile{ - {filename: "manifest1.yaml", objects: []client.Object{other}}, - {filename: "manifest2.yaml", objects: []client.Object{other}}, - {filename: "csv1.yaml", objects: []client.Object{csv}}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, []client.Object{other}), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, []client.Object{other}), + NewPrecomputedFile[[]client.Object]("csv1.yaml", nil, []client.Object{csv}), }, assertErr: require.NoError, }, { name: "zero csvs among all files is invalid", - manifestFiles: []manifestFile{ - {filename: "manifest1.yaml", objects: []client.Object{other}}, - {filename: "manifest2.yaml", objects: []client.Object{other}}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, []client.Object{other}), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, []client.Object{other}), }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "exactly one ClusterServiceVersion object is required, found 0") @@ -194,11 +220,11 @@ func Test_manifests_validateExactlyOneCSV(t *testing.T) { }, { name: "multiple csvs among all files is invalid", - manifestFiles: []manifestFile{ - {filename: "manifest1.yaml", objects: []client.Object{other}}, - {filename: "manifest2.yaml", objects: []client.Object{other}}, - {filename: "csv1.yaml", objects: []client.Object{csv}}, - {filename: "csv2.yaml", objects: []client.Object{csv}}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, []client.Object{other}), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, []client.Object{other}), + NewPrecomputedFile[[]client.Object]("csv1.yaml", nil, []client.Object{csv}), + NewPrecomputedFile[[]client.Object]("csv2.yaml", nil, []client.Object{csv}), }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "exactly one ClusterServiceVersion object is required, found 2") @@ -209,19 +235,16 @@ func Test_manifests_validateExactlyOneCSV(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := &manifests{ - manifestFiles: tt.manifestFiles, - } - err := m.validateExactlyOneCSV() + err := tt.manifestFiles.validateExactlyOneCSV() tt.assertErr(t, err) }) } } -func Test_manifests_validateSupportedKinds(t *testing.T) { +func Test_manifestFiles_validateSupportedKinds(t *testing.T) { tests := []struct { name string - manifestFiles []manifestFile + manifestFiles manifestFiles assertErr require.ErrorAssertionFunc }{ { @@ -241,19 +264,16 @@ func Test_manifests_validateSupportedKinds(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := &manifests{ - manifestFiles: tt.manifestFiles, - } - err := m.validateSupportedKinds() + err := tt.manifestFiles.validateSupportedKinds() tt.assertErr(t, err) }) } } -func Test_manifests_validate(t *testing.T) { +func Test_manifestFiles_validate(t *testing.T) { tests := []struct { name string - manifestFiles []manifestFile + manifestFiles manifestFiles assertErr require.ErrorAssertionFunc }{ { @@ -263,14 +283,10 @@ func Test_manifests_validate(t *testing.T) { }, { name: "validate collects suberrors", - manifestFiles: []manifestFile{ - {filename: "subdir/service.yaml", objects: []client.Object{ - makeObject(schema.GroupVersionKind{Version: "v1", Kind: "Service"}), - }}, - {filename: "no_objects.yaml", objects: nil}, - {filename: "unsupported.yaml", objects: []client.Object{ - makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported"}), - }}, + manifestFiles: []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("subdir/service.yaml", nil, []client.Object{makeObject(schema.GroupVersionKind{Version: "v1", Kind: "Service"})}), + NewPrecomputedFile[[]client.Object]("no_objects.yaml", nil, nil), + NewPrecomputedFile[[]client.Object]("unsupported.yaml", nil, []client.Object{makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported"})}), }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "subdirectories not allowed") @@ -282,17 +298,14 @@ func Test_manifests_validate(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := &manifests{ - manifestFiles: tt.manifestFiles, - } - err := m.validate() + err := tt.manifestFiles.validate() tt.assertErr(t, err) }) } } func makeObject(gvk schema.GroupVersionKind) client.Object { - obj, _ := supportedKindsScheme.New(gvk) + obj, _ := internal.SupportedKindsScheme.New(gvk) if obj == nil { obj = &unstructured.Unstructured{} } @@ -300,22 +313,22 @@ func makeObject(gvk schema.GroupVersionKind) client.Object { return obj.(client.Object) } -func unsupportedManifestFiles() []manifestFile { +func unsupportedManifestFiles() []File[[]client.Object] { unsupported1 := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported1"}) unsupported2 := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported2"}) - return []manifestFile{ - {filename: "Unsupported1.yaml", objects: []client.Object{unsupported1}}, - {filename: "Unsupported2.yaml", objects: []client.Object{unsupported2}}, + return []File[[]client.Object]{ + NewPrecomputedFile[[]client.Object]("Unsupported1.yaml", nil, []client.Object{unsupported1}), + NewPrecomputedFile[[]client.Object]("Unsupported2.yaml", nil, []client.Object{unsupported2}), } } -func supportedManifestFiles() []manifestFile { - kinds := sets.List(supportedKinds) - manifestFiles := make([]manifestFile, 0, len(kinds)) +func supportedManifestFiles() []File[[]client.Object] { + kinds := sets.List(internal.SupportedKinds) + manifestFiles := make([]File[[]client.Object], 0, len(kinds)) for _, kind := range kinds { obj := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: kind}) - manifestFiles = append(manifestFiles, manifestFile{filename: fmt.Sprintf("%s.yaml", kind), objects: []client.Object{obj}}) + manifestFiles = append(manifestFiles, NewPrecomputedFile(fmt.Sprintf("%s.yaml", kind), nil, []client.Object{obj})) } return manifestFiles } diff --git a/internal/pkg/bundle/registry/v1/metadata.go b/internal/pkg/bundle/registry/v1/metadata.go index f8005a3..f0202d7 100644 --- a/internal/pkg/bundle/registry/v1/metadata.go +++ b/internal/pkg/bundle/registry/v1/metadata.go @@ -5,37 +5,72 @@ import ( "errors" "fmt" "io/fs" + "iter" "maps" + "path/filepath" "regexp" "slices" "strings" + "testing/fstest" "github.com/blang/semver/v4" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" - "sigs.k8s.io/yaml" + + "github.com/joelanford/kpm/internal/pkg/bundle/registry/internal" ) -const ( - MetadataDirectory = "metadata/" +type metadata struct { + annotationsFile AnnotationsFile + propertiesFile *PropertiesFile + dependenciesFile *DependenciesFile +} - AnnotationsFile = "annotations.yaml" - PropertiesFile = "properties.yaml" - DependenciesFile = "dependencies.yaml" +func (m *metadata) PackageName() string { + return m.annotationsFile.Value().Annotations[annotationPackage] +} - AnnotationMediaType = "operators.operatorframework.io.bundle.mediatype.v1" - AnnotationManifests = "operators.operatorframework.io.bundle.manifests.v1" - AnnotationMetadata = "operators.operatorframework.io.bundle.metadata.v1" - AnnotationPackage = "operators.operatorframework.io.bundle.package.v1" -) +func (m *metadata) Annotations() AnnotationsFile { + return m.annotationsFile +} -type metadata struct { - fsys fs.FS - annotationsFile Annotations - propertiesFile Properties - dependenciesFile Dependencies +func (m *metadata) Properties() *PropertiesFile { + return m.propertiesFile +} + +func (m *metadata) Dependencies() *DependenciesFile { + return m.dependenciesFile +} + +func (m *metadata) All() iter.Seq[File[any]] { + return func(yield func(File[any]) bool) { + if !yield(toAnyFile(m.annotationsFile)) { + return + } + if m.propertiesFile != nil && !yield(toAnyFile(*m.propertiesFile)) { + return + } + if m.dependenciesFile != nil && !yield(toAnyFile(*m.dependenciesFile)) { + return + } + } +} + +func toAnyFile[T any](in File[T]) File[any] { + return NewPrecomputedFile[any](in.Name(), in.Data(), in.Value()) +} + +func (m *metadata) addToFS(fsys fstest.MapFS) { + for f := range m.All() { + path := filepath.Join(metadataDirectory, f.Name()) + fsys[path] = &fstest.MapFile{Data: f.Data()} + } } +type AnnotationsFile = File[Annotations] +type PropertiesFile = File[Properties] +type DependenciesFile = File[Dependencies] + type Annotations struct { Annotations map[string]string `json:"annotations"` } @@ -48,57 +83,90 @@ type Dependencies struct { Dependencies []Dependency `json:"dependencies"` } -func (m *metadata) load() error { - var loadErrs []error - for _, loadFn := range []func() error{ - m.loadMetadataAnnotations, - m.loadMetadataProperties, - m.loadMetadataDependencies, - } { - if err := loadFn(); err != nil { - loadErrs = append(loadErrs, err) - } +type Property struct { + Type string `json:"type"` + Value json.RawMessage `json:"value"` +} + +type Dependency = Property + +type MetadataLoader interface { + Load() (*metadata, error) +} +type metadataFSLoader struct { + fsys fs.FS +} + +func (m *metadataFSLoader) loadMetadata() (*metadata, error) { + a, aErr := m.loadAnnotations() + p, pErr := m.loadProperties() + d, dErr := m.loadDependencies() + if err := errors.Join(aErr, pErr, dErr); err != nil { + return nil, err } - return errors.Join(loadErrs...) + return &metadata{ + annotationsFile: *a, + propertiesFile: p, + dependenciesFile: d, + }, nil } -func (m *metadata) loadMetadataAnnotations() error { - annotationsData, err := fs.ReadFile(m.fsys, AnnotationsFile) +func (m *metadataFSLoader) Load() (*metadata, error) { + metadata, err := m.loadMetadata() if err != nil { - return err + return nil, err } - if err := yaml.Unmarshal(annotationsData, &m.annotationsFile, yaml.DisallowUnknownFields); err != nil { - return fmt.Errorf("failed to load annotations from %q: %w", AnnotationsFile, err) + if err := metadata.validate(); err != nil { + return nil, err } - return nil + return metadata, nil } -func (m *metadata) loadMetadataProperties() error { - propertiesData, err := fs.ReadFile(m.fsys, PropertiesFile) +const ( + annotationsFileName = "annotations.yaml" + propertiesFileName = "properties.yaml" + dependenciesFileName = "dependencies.yaml" +) + +func (m *metadataFSLoader) loadAnnotations() (*AnnotationsFile, error) { + data, err := fs.ReadFile(m.fsys, annotationsFileName) + if err != nil { + return nil, err + } + f, err := NewYAMLDataFile[Annotations](annotationsFileName, data) + if err != nil { + return nil, fmt.Errorf("error parsing %s: %v", annotationsFileName, err) + } + return f, err +} + +func (m *metadataFSLoader) loadProperties() (*PropertiesFile, error) { + data, err := fs.ReadFile(m.fsys, propertiesFileName) if err != nil { if errors.Is(err, fs.ErrNotExist) { - return nil + return nil, nil } - return err + return nil, err } - if err := yaml.Unmarshal(propertiesData, &m.propertiesFile, yaml.DisallowUnknownFields); err != nil { - return fmt.Errorf("failed to load properties from %q: %w", PropertiesFile, err) + f, err := NewYAMLDataFile[Properties](propertiesFileName, data) + if err != nil { + return nil, fmt.Errorf("error parsing %s: %v", propertiesFileName, err) } - return nil + return f, err } - -func (m *metadata) loadMetadataDependencies() error { - dependenciesData, err := fs.ReadFile(m.fsys, DependenciesFile) +func (m *metadataFSLoader) loadDependencies() (*DependenciesFile, error) { + data, err := fs.ReadFile(m.fsys, dependenciesFileName) if err != nil { if errors.Is(err, fs.ErrNotExist) { - return nil + return nil, nil } - return err + return nil, err } - if err := yaml.Unmarshal(dependenciesData, &m.dependenciesFile, yaml.DisallowUnknownFields); err != nil { - return fmt.Errorf("failed to load dependencies from %q: %w", DependenciesFile, err) + f, err := NewYAMLDataFile[Dependencies](dependenciesFileName, data) + if err != nil { + return nil, fmt.Errorf("error parsing %s: %v", dependenciesFileName, err) } - return nil + return f, err } func (m *metadata) validate() error { @@ -116,9 +184,16 @@ func (m *metadata) validate() error { return errors.Join(validationErrors...) } +const ( + annotationMediaType = "operators.operatorframework.io.bundle.mediatype.v1" + annotationManifests = "operators.operatorframework.io.bundle.manifests.v1" + annotationMetadata = "operators.operatorframework.io.bundle.metadata.v1" + annotationPackage = "operators.operatorframework.io.bundle.package.v1" +) + func (m *metadata) validateAnnotations() error { if err := func() error { - if m.annotationsFile.Annotations == nil { + if len(m.annotationsFile.Value().Annotations) == 0 { return errors.New("no annotations found") } @@ -140,10 +215,10 @@ func (m *metadata) validateAnnotations() error { } requiredAnnotations := map[string]func(k, v string) error{ - AnnotationMediaType: requireEqual(MediaType), - AnnotationManifests: requireEqual(ManifestsDirectory), - AnnotationMetadata: requireEqual(MetadataDirectory), - AnnotationPackage: requireValid(func(in string) error { + annotationMediaType: requireEqual(mediaType), + annotationManifests: requireEqual(manifestsDirectory), + annotationMetadata: requireEqual(metadataDirectory), + annotationPackage: requireValid(func(in string) error { errs := validation.IsDNS1123Subdomain(in) if len(errs) > 0 { return errors.New(strings.Join(errs, ", ")) @@ -154,7 +229,7 @@ func (m *metadata) validateAnnotations() error { var validationErrors []error for _, key := range slices.Sorted(maps.Keys(requiredAnnotations)) { - value, ok := m.annotationsFile.Annotations[key] + value, ok := m.annotationsFile.Value().Annotations[key] if !ok { validationErrors = append(validationErrors, fmt.Errorf("required key %q not found", key)) continue @@ -174,7 +249,10 @@ func (m *metadata) validateAnnotations() error { } func (m *metadata) validateProperties() error { - if err := do( + if m.propertiesFile == nil { + return nil + } + if err := internal.DoAll( m.validatePropertyTypeValues, m.validatePropertiesNoReservedUsage, ); err != nil { @@ -185,7 +263,7 @@ func (m *metadata) validateProperties() error { func (m *metadata) validatePropertyTypeValues() error { var errs []error - for i, prop := range m.propertiesFile.Properties { + for i, prop := range m.propertiesFile.Value().Properties { validator := validatorFor(prop.Type, propertyScheme, true) if err := validator(prop.Value); err != nil { errs = append(errs, fmt.Errorf("property at index %d with type %q is invalid: %w", i, prop.Type, err)) @@ -200,12 +278,12 @@ func (m *metadata) validatePropertyTypeValues() error { func (m *metadata) validatePropertiesNoReservedUsage() error { reserved := sets.New[string]( - TypePropertyPackage, - TypePropertyGVK, + typePropertyPackage, + typePropertyGVK, ) found := sets.New[string]() - for _, prop := range m.propertiesFile.Properties { + for _, prop := range m.propertiesFile.Value().Properties { if reserved.Has(prop.Type) { found.Insert(prop.Type) } @@ -217,8 +295,11 @@ func (m *metadata) validatePropertiesNoReservedUsage() error { } func (m *metadata) validateDependencies() error { + if m.dependenciesFile == nil { + return nil + } var errs []error - for i, dep := range m.dependenciesFile.Dependencies { + for i, dep := range m.dependenciesFile.Value().Dependencies { validator := validatorFor(dep.Type, dependencyScheme, false) if err := validator(dep.Value); err != nil { errs = append(errs, fmt.Errorf("dependency at index %d with type %q is invalid: %w", i, dep.Type, err)) @@ -233,7 +314,7 @@ func (m *metadata) validateDependencies() error { } type typeValidator interface { - Validate() error + validate() error } func validatorFor(typ string, scheme map[string]func() typeValidator, allowAny bool) func(json.RawMessage) error { @@ -258,7 +339,7 @@ func validatorFor(typ string, scheme map[string]func() typeValidator, allowAny b errs = append(errs, fmt.Errorf("value is required")) } else if err := json.Unmarshal(value, v); err != nil { errs = append(errs, fmt.Errorf("failed to unmarshal value %q: %v", string(value), err)) - } else if err := v.Validate(); err != nil { + } else if err := v.validate(); err != nil { errs = append(errs, fmt.Errorf("failed to validate value %q: %v", string(value), err)) } @@ -267,40 +348,33 @@ func validatorFor(typ string, scheme map[string]func() typeValidator, allowAny b } const ( - TypePropertyPackage = "olm.package" - TypePropertyGVK = "olm.gvk" - TypePropertyPackageRequired = "olm.package.required" - TypePropertyGVKRequired = "olm.gvk.required" + typePropertyPackage = "olm.package" + typePropertyGVK = "olm.gvk" + typePropertyPackageRequired = "olm.package.required" + typePropertyGVKRequired = "olm.gvk.required" - TypeDependencyPackage = "olm.package" - TypeDependencyGVK = "olm.gvk" + typeDependencyPackage = "olm.package" + typeDependencyGVK = "olm.gvk" ) var ( propertyScheme = map[string]func() typeValidator{ - TypePropertyPackageRequired: func() typeValidator { return &PropertyPackageRequired{} }, - TypePropertyGVKRequired: func() typeValidator { return &GVK{} }, + typePropertyPackageRequired: func() typeValidator { return &propertyPackageRequired{} }, + typePropertyGVKRequired: func() typeValidator { return &gvk{} }, } dependencyScheme = map[string]func() typeValidator{ - TypeDependencyPackage: func() typeValidator { return &DependencyPackage{} }, - TypeDependencyGVK: func() typeValidator { return &GVK{} }, + typeDependencyPackage: func() typeValidator { return &dependencyPackage{} }, + typeDependencyGVK: func() typeValidator { return &gvk{} }, } ) -type Property struct { - Type string `json:"type"` - Value json.RawMessage `json:"value"` -} - -type Dependency = Property - -type PropertyPackageRequired struct { +type propertyPackageRequired struct { PackageName string `json:"packageName"` VersionRange string `json:"versionRange"` } -func (p *PropertyPackageRequired) Validate() error { +func (p *propertyPackageRequired) validate() error { var errs []error if err := validatePackageName(p.PackageName); err != nil { errs = append(errs, err) @@ -315,16 +389,16 @@ type anyJSON struct { json.RawMessage } -func (p *anyJSON) Validate() error { +func (p *anyJSON) validate() error { return nil } -type DependencyPackage struct { +type dependencyPackage struct { PackageName string `json:"packageName"` Version string `json:"version"` } -func (d *DependencyPackage) Validate() error { +func (d *dependencyPackage) validate() error { var errs []error if err := validatePackageName(d.PackageName); err != nil { errs = append(errs, err) @@ -335,7 +409,7 @@ func (d *DependencyPackage) Validate() error { return errors.Join(errs...) } -type GVK struct { +type gvk struct { Group string `json:"group"` Version string `json:"version"` Kind string `json:"kind"` @@ -351,7 +425,7 @@ var ( kindRegexp = regexp.MustCompile(kindPattern) ) -func (p *GVK) Validate() error { +func (p *gvk) validate() error { var errs []error if p.Group == "" { errs = append(errs, fmt.Errorf("group is required")) diff --git a/internal/pkg/bundle/registry/v1/metadata_test.go b/internal/pkg/bundle/registry/v1/metadata_test.go index 5762d48..8034557 100644 --- a/internal/pkg/bundle/registry/v1/metadata_test.go +++ b/internal/pkg/bundle/registry/v1/metadata_test.go @@ -1,209 +1,189 @@ package v1 import ( - "encoding/json" "io/fs" "maps" "testing" "testing/fstest" "github.com/stretchr/testify/require" - "sigs.k8s.io/yaml" + "k8s.io/utils/ptr" ) -func Test_metadata_load(t *testing.T) { - loadableAnnotations, _ := yaml.Marshal(map[string]any{"annotations": map[string]string{"foo": "bar"}}) - loadableProperties, _ := yaml.Marshal(map[string]any{"properties": []Property{{Type: "fizz", Value: json.RawMessage(`["buzz"]`)}}}) - loadableDependencies, _ := yaml.Marshal(map[string]any{"dependencies": []Property{{Type: "tic", Value: json.RawMessage(`{"tac":"toe"}`)}}}) - +func Test_metadataFSLoader_loadMetadata(t *testing.T) { tests := []struct { name string fsys fs.FS - expected metadata + expected *metadata assertErr require.ErrorAssertionFunc }{ { - name: "metadata loads minimum required files successfully", + name: "loads minimum metadata successfully", fsys: fstest.MapFS{ - AnnotationsFile: &fstest.MapFile{Data: loadableAnnotations}, + annotationsFileName: &fstest.MapFile{Data: []byte(`annotations: {}`)}, }, - expected: metadata{ - annotationsFile: Annotations{Annotations: map[string]string{"foo": "bar"}}, + expected: &metadata{ + annotationsFile: NewPrecomputedFile[Annotations](annotationsFileName, []byte(`annotations: {}`), Annotations{Annotations: map[string]string{}}), }, assertErr: require.NoError, }, { - name: "metadata loads all files successfully", + name: "loads all metadata successfully", fsys: fstest.MapFS{ - AnnotationsFile: &fstest.MapFile{Data: loadableAnnotations}, - PropertiesFile: &fstest.MapFile{Data: loadableProperties}, - DependenciesFile: &fstest.MapFile{Data: loadableDependencies}, - }, - expected: metadata{ - annotationsFile: Annotations{Annotations: map[string]string{"foo": "bar"}}, - propertiesFile: Properties{Properties: []Property{ - {Type: "fizz", Value: json.RawMessage(`["buzz"]`)}, - }}, - dependenciesFile: Dependencies{Dependencies: []Dependency{ - {Type: "tic", Value: json.RawMessage(`{"tac":"toe"}`)}, - }}, + annotationsFileName: &fstest.MapFile{Data: []byte(`annotations: {"foo": "bar"}`)}, + propertiesFileName: &fstest.MapFile{Data: []byte(`properties: [{"type":"a", "value":[]}]`)}, + dependenciesFileName: &fstest.MapFile{Data: []byte(`dependencies: [{"type":"b", "value":{}}]`)}, + }, + expected: &metadata{ + annotationsFile: NewPrecomputedFile[Annotations](annotationsFileName, []byte(`annotations: {"foo": "bar"}`), + Annotations{Annotations: map[string]string{"foo": "bar"}}), + propertiesFile: ptr.To(NewPrecomputedFile[Properties](propertiesFileName, []byte(`properties: [{"type":"a", "value":[]}]`), + Properties{Properties: []Property{{Type: "a", Value: []byte(`[]`)}}})), + dependenciesFile: ptr.To(NewPrecomputedFile[Dependencies](dependenciesFileName, []byte(`dependencies: [{"type":"b", "value":{}}]`), + Dependencies{Dependencies: []Dependency{{Type: "b", Value: []byte(`{}`)}}})), }, assertErr: require.NoError, }, { - name: "metadata load fails due to missing annotations", - fsys: fstest.MapFS{}, - assertErr: func(t require.TestingT, err error, i ...interface{}) { - require.ErrorContains(t, err, "open annotations.yaml: file does not exist") - }, - }, - { - name: "metadata load fails due to malformed annotations", + name: "fails due to invalid yaml", fsys: fstest.MapFS{ - AnnotationsFile: &fstest.MapFile{Data: []byte(`{"foo":"bar"}`)}, + "annotations.yaml": &fstest.MapFile{Data: []byte(`}`)}, + "properties.yaml": &fstest.MapFile{Data: []byte(`}`)}, + "dependencies.yaml": &fstest.MapFile{Data: []byte(`}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { - require.ErrorContains(t, err, `failed to load annotations from "annotations.yaml"`) - require.ErrorContains(t, err, `unknown field "foo"`) + require.ErrorContains(t, err, "error parsing annotations.yaml") + require.ErrorContains(t, err, "error parsing properties.yaml") + require.ErrorContains(t, err, "error parsing dependencies.yaml") }, }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := metadataFSLoader{fsys: tt.fsys} + metadata, err := m.loadMetadata() + tt.assertErr(t, err) + require.Equal(t, tt.expected, metadata) + }) + } +} + +func Test_Metadata_Validate(t *testing.T) { + tests := []struct { + name string + metadata metadata + assertErr require.ErrorAssertionFunc + }{ { - name: "metadata load fails due to malformed properties", - fsys: fstest.MapFS{ - AnnotationsFile: &fstest.MapFile{Data: loadableAnnotations}, - PropertiesFile: &fstest.MapFile{Data: []byte(`{"foo":"bar"}`)}, - }, - expected: metadata{ - annotationsFile: Annotations{Annotations: map[string]string{"foo": "bar"}}, - }, - assertErr: func(t require.TestingT, err error, i ...interface{}) { - require.ErrorContains(t, err, `failed to load properties from "properties.yaml"`) - require.ErrorContains(t, err, `unknown field "foo"`) + name: "passes all validations", + metadata: metadata{ + annotationsFile: newAnnotationsFile(map[string]string{ + annotationMediaType: mediaType, + annotationManifests: manifestsDirectory, + annotationMetadata: metadataDirectory, + annotationPackage: "example", + }), }, + assertErr: require.NoError, }, { - name: "metadata load fails due to malformed dependencies", - fsys: fstest.MapFS{ - AnnotationsFile: &fstest.MapFile{Data: loadableAnnotations}, - DependenciesFile: &fstest.MapFile{Data: []byte(`{"foo":"bar"}`)}, - }, - expected: metadata{ - annotationsFile: Annotations{Annotations: map[string]string{"foo": "bar"}}, - }, - assertErr: func(t require.TestingT, err error, i ...interface{}) { - require.ErrorContains(t, err, `failed to load dependencies from "dependencies.yaml"`) - require.ErrorContains(t, err, `unknown field "foo"`) + name: "validate collects suberrors", + metadata: metadata{ + annotationsFile: newAnnotationsFile(map[string]string{"foo": "bar"}), + propertiesFile: newPropertiesFile([]Property{{Type: "a"}}), + dependenciesFile: newDependenciesFile([]Dependency{{Type: typeDependencyPackage}}), + }, assertErr: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "invalid annotations") + require.ErrorContains(t, err, "invalid properties") + require.ErrorContains(t, err, "invalid dependencies") }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := &metadata{fsys: tt.fsys} - err := m.load() + err := tt.metadata.validate() tt.assertErr(t, err) - - require.Equal(t, tt.expected.annotationsFile, m.annotationsFile) - require.Equal(t, tt.expected.propertiesFile, m.propertiesFile) - require.Equal(t, tt.expected.dependenciesFile, m.dependenciesFile) }) } } -func Test_metadata_validateAnnotations(t *testing.T) { +func Test_Metadata_validateAnnotations(t *testing.T) { validAnnotations := map[string]string{ - AnnotationMediaType: MediaType, - AnnotationManifests: ManifestsDirectory, - AnnotationMetadata: MetadataDirectory, - AnnotationPackage: "example", + annotationMediaType: mediaType, + annotationManifests: manifestsDirectory, + annotationMetadata: metadataDirectory, + annotationPackage: "example", } tests := []struct { - name string - annotationsFile Annotations - assertErr require.ErrorAssertionFunc + name string + annotations map[string]string + assertErr require.ErrorAssertionFunc }{ { - name: "valid annotations", - annotationsFile: Annotations{ - Annotations: validAnnotations, - }, - assertErr: require.NoError, + name: "valid annotations", + annotations: validAnnotations, + assertErr: require.NoError, }, { - name: "zero annotations is invalid", - annotationsFile: Annotations{}, + name: "zero annotations is invalid", + annotations: map[string]string{}, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "no annotations found") }, }, { - name: "missing media type", - annotationsFile: Annotations{ - Annotations: mapWithoutKey(validAnnotations, AnnotationMediaType), - }, + name: "missing media type", + annotations: mapWithoutKey(validAnnotations, annotationMediaType), assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `required key "operators.operatorframework.io.bundle.mediatype.v1" not found`) }, }, { - name: "missing manifests directory", - annotationsFile: Annotations{ - Annotations: mapWithoutKey(validAnnotations, AnnotationManifests), - }, + name: "missing manifests directory", + annotations: mapWithoutKey(validAnnotations, annotationManifests), assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `required key "operators.operatorframework.io.bundle.manifests.v1" not found`) }, }, { - name: "missing metadata directory", - annotationsFile: Annotations{ - Annotations: mapWithoutKey(validAnnotations, AnnotationMetadata), - }, + name: "missing metadata directory", + annotations: mapWithoutKey(validAnnotations, annotationMetadata), assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `required key "operators.operatorframework.io.bundle.metadata.v1" not found`) }, }, { - name: "missing package", - annotationsFile: Annotations{ - Annotations: mapWithoutKey(validAnnotations, AnnotationPackage), - }, + name: "missing package", + annotations: mapWithoutKey(validAnnotations, annotationPackage), assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `required key "operators.operatorframework.io.bundle.package.v1" not found`) }, }, { - name: "invalid media type", - annotationsFile: Annotations{ - Annotations: mapWithKeyValue(validAnnotations, AnnotationMediaType, "invalid"), - }, + name: "invalid media type", + annotations: mapWithKeyValue(validAnnotations, annotationMediaType, "invalid"), assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `invalid value for annotation key "operators.operatorframework.io.bundle.mediatype.v1": requires value "registry+v1"`) }, }, { - name: "invalid manifests directory", - annotationsFile: Annotations{ - Annotations: mapWithKeyValue(validAnnotations, AnnotationManifests, "invalid"), - }, + name: "invalid manifests directory", + annotations: mapWithKeyValue(validAnnotations, annotationManifests, "invalid"), assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `invalid value for annotation key "operators.operatorframework.io.bundle.manifests.v1": requires value "manifests/"`) }, }, { - name: "invalid metadata directory", - annotationsFile: Annotations{ - Annotations: mapWithKeyValue(validAnnotations, AnnotationMetadata, "invalid"), - }, + name: "invalid metadata directory", + annotations: mapWithKeyValue(validAnnotations, annotationMetadata, "invalid"), assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `invalid value for annotation key "operators.operatorframework.io.bundle.metadata.v1": requires value "metadata/"`) }, }, { - name: "invalid package", - annotationsFile: Annotations{ - Annotations: mapWithKeyValue(validAnnotations, AnnotationPackage, "$package"), - }, + name: "invalid package", + annotations: mapWithKeyValue(validAnnotations, annotationPackage, "$package"), assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `invalid value for annotation key "operators.operatorframework.io.bundle.package.v1"`) require.ErrorContains(t, err, "RFC 1123 subdomain") @@ -213,7 +193,7 @@ func Test_metadata_validateAnnotations(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { m := &metadata{ - annotationsFile: tt.annotationsFile, + annotationsFile: newAnnotationsFile(tt.annotations), } err := m.validateAnnotations() tt.assertErr(t, err) @@ -221,57 +201,49 @@ func Test_metadata_validateAnnotations(t *testing.T) { } } -func Test_metadata_validateProperties(t *testing.T) { +func Test_Metadata_validateProperties(t *testing.T) { tests := []struct { - name string - propertiesFile Properties - assertErr require.ErrorAssertionFunc + name string + properties []Property + assertErr require.ErrorAssertionFunc }{ { - name: "empty properties is valid", - propertiesFile: Properties{}, - assertErr: require.NoError, + name: "empty properties is valid", + properties: []Property{}, + assertErr: require.NoError, }, { name: "arbitrary properties are valid", - propertiesFile: Properties{ - Properties: []Property{ - {Type: "a", Value: []byte(`null`)}, - {Type: "b", Value: []byte(`0`)}, - {Type: "c", Value: []byte(`1.1`)}, - {Type: "d", Value: []byte(`"hello world"`)}, - {Type: "e", Value: []byte(`[]`)}, - {Type: "f", Value: []byte(`{}`)}, - }, + properties: []Property{ + {Type: "a", Value: []byte(`null`)}, + {Type: "b", Value: []byte(`0`)}, + {Type: "c", Value: []byte(`1.1`)}, + {Type: "d", Value: []byte(`"hello world"`)}, + {Type: "e", Value: []byte(`[]`)}, + {Type: "f", Value: []byte(`{}`)}, }, assertErr: require.NoError, }, { name: "duplicate properties are valid", - propertiesFile: Properties{ - Properties: []Property{ - {Type: "a", Value: []byte(`[1]`)}, - {Type: "a", Value: []byte(`[2]`)}, - }, + properties: []Property{ + {Type: "a", Value: []byte(`[1]`)}, + {Type: "a", Value: []byte(`[2]`)}, }, assertErr: require.NoError, }, { name: "using property variants of dependencies is valid", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyPackageRequired, Value: []byte(`{"packageName":"foo","versionRange":"<=1.2.3"}`)}, - {Type: TypePropertyGVKRequired, Value: []byte(`{"group":"example.com","version":"v1","kind":"Foo"}`)}, - }, + properties: []Property{ + {Type: typePropertyPackageRequired, Value: []byte(`{"packageName":"foo","versionRange":"<=1.2.3"}`)}, + {Type: typePropertyGVKRequired, Value: []byte(`{"group":"example.com","version":"v1","kind":"Foo"}`)}, }, assertErr: require.NoError, }, { name: "use of reserved olm.package is invalid", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyPackage, Value: []byte(`{"packageName":"foo","version":"1.2.3"}`)}, - }, + properties: []Property{ + {Type: typePropertyPackage, Value: []byte(`{"packageName":"foo","version":"1.2.3"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "found reserved properties") @@ -279,10 +251,8 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "use of reserved olm.gvk is invalid", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyGVK, Value: []byte(`{"group":"example.com","version":"v1","kind":"Foo"}`)}, - }, + properties: []Property{ + {Type: typePropertyGVK, Value: []byte(`{"group":"example.com","version":"v1","kind":"Foo"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "found reserved properties") @@ -290,12 +260,11 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "olm.package.required must have package name", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyPackageRequired, Value: []byte(`{"packageName":"","versionRange":"<=1.2.3"}`)}, - {Type: TypePropertyPackageRequired, Value: []byte(`{"versionRange":"<=1.2.3"}`)}, - }, + properties: []Property{ + {Type: typePropertyPackageRequired, Value: []byte(`{"packageName":"","versionRange":"<=1.2.3"}`)}, + {Type: typePropertyPackageRequired, Value: []byte(`{"versionRange":"<=1.2.3"}`)}, }, + assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `failed to validate value "{\"packageName\":\"\",\"versionRange\":\"<=1.2.3\"}": packageName is required`) require.ErrorContains(t, err, `failed to validate value "{\"versionRange\":\"<=1.2.3\"}": packageName is required`) @@ -303,10 +272,8 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "olm.package.required package name must be a DNS 1123 subdomain", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyPackageRequired, Value: []byte(`{"packageName":"$foo","versionRange":"<=1.2.3"}`)}, - }, + properties: []Property{ + {Type: typePropertyPackageRequired, Value: []byte(`{"packageName":"$foo","versionRange":"<=1.2.3"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `packageName "$foo" is invalid: a lowercase RFC 1123 subdomain must consist of`) @@ -314,11 +281,9 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "olm.package.required must have version range", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyPackageRequired, Value: []byte(`{"packageName":"foo","versionRange":""}`)}, - {Type: TypePropertyPackageRequired, Value: []byte(`{"packageName":"foo"}`)}, - }, + properties: []Property{ + {Type: typePropertyPackageRequired, Value: []byte(`{"packageName":"foo","versionRange":""}`)}, + {Type: typePropertyPackageRequired, Value: []byte(`{"packageName":"foo"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `failed to validate value "{\"packageName\":\"foo\",\"versionRange\":\"\"}": versionRange is required`) @@ -327,10 +292,8 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "olm.package.required version range must be valid", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyPackageRequired, Value: []byte(`{"packageName":"foo","versionRange":"foobar"}`)}, - }, + properties: []Property{ + {Type: typePropertyPackageRequired, Value: []byte(`{"packageName":"foo","versionRange":"foobar"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `versionRange "foobar" is invalid`) @@ -338,10 +301,8 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "olm.gvk.required must have group, version, and kind", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyGVKRequired, Value: []byte(`{}`)}, - }, + properties: []Property{ + {Type: typePropertyGVKRequired, Value: []byte(`{}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `group is required`) @@ -351,10 +312,8 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "olm.gvk.required must have valid group, version, and kind", - propertiesFile: Properties{ - Properties: []Property{ - {Type: TypePropertyGVKRequired, Value: []byte(`{"group":"$foo","version":"bar", "kind":"baz"}`)}, - }, + properties: []Property{ + {Type: typePropertyGVKRequired, Value: []byte(`{"group":"$foo","version":"bar", "kind":"baz"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `group "$foo" is invalid: a lowercase RFC 1123 subdomain must consist`) @@ -364,10 +323,8 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "property types must be set", - propertiesFile: Properties{ - Properties: []Property{ - {Type: "", Value: []byte(`null`)}, - }, + properties: []Property{ + {Type: "", Value: []byte(`null`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `property at index 0 with type "" is invalid: type is required`) @@ -375,11 +332,9 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "empty property values are invalid", - propertiesFile: Properties{ - Properties: []Property{ - {Type: "a", Value: []byte(``)}, - {Type: "b", Value: nil}, - }, + properties: []Property{ + {Type: "a", Value: []byte(``)}, + {Type: "b", Value: nil}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `property at index 0 with type "a" is invalid: value is required`) @@ -388,10 +343,8 @@ func Test_metadata_validateProperties(t *testing.T) { }, { name: "non-JSON property values are invalid", - propertiesFile: Properties{ - Properties: []Property{ - {Type: "a", Value: []byte(`}`)}, - }, + properties: []Property{ + {Type: "a", Value: []byte(`}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `property at index 0 with type "a" is invalid: failed to unmarshal value`) @@ -401,7 +354,7 @@ func Test_metadata_validateProperties(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { m := &metadata{ - propertiesFile: tt.propertiesFile, + propertiesFile: newPropertiesFile(tt.properties), } err := m.validateProperties() tt.assertErr(t, err) @@ -409,45 +362,39 @@ func Test_metadata_validateProperties(t *testing.T) { } } -func Test_metadata_validateDependencies(t *testing.T) { +func Test_Metadata_validateDependencies(t *testing.T) { tests := []struct { - name string - dependenciesFile Dependencies - assertErr require.ErrorAssertionFunc + name string + dependencies []Dependency + assertErr require.ErrorAssertionFunc }{ { - name: "empty dependencies is valid", - dependenciesFile: Dependencies{}, - assertErr: require.NoError, + name: "empty dependencies is valid", + dependencies: []Dependency{}, + assertErr: require.NoError, }, { name: "known dependencies are valid", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyPackage, Value: []byte(`{"packageName":"foo","version":"1.2.3"}`)}, - {Type: TypeDependencyGVK, Value: []byte(`{"group":"example.com","version":"v1","kind":"Foo"}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyPackage, Value: []byte(`{"packageName":"foo","version":"1.2.3"}`)}, + {Type: typeDependencyGVK, Value: []byte(`{"group":"example.com","version":"v1","kind":"Foo"}`)}, }, assertErr: require.NoError, }, { name: "duplicate dependencies of the same type are valid", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyPackage, Value: []byte(`{"packageName":"foo","version":"1.2.3"}`)}, - {Type: TypeDependencyPackage, Value: []byte(`{"packageName":"bar","version":"1.2.3"}`)}, - {Type: TypeDependencyGVK, Value: []byte(`{"group":"example.com","version":"v1","kind":"Foo"}`)}, - {Type: TypeDependencyGVK, Value: []byte(`{"group":"example.com","version":"v1","kind":"Bar"}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyPackage, Value: []byte(`{"packageName":"foo","version":"1.2.3"}`)}, + {Type: typeDependencyPackage, Value: []byte(`{"packageName":"bar","version":"1.2.3"}`)}, + {Type: typeDependencyGVK, Value: []byte(`{"group":"example.com","version":"v1","kind":"Foo"}`)}, + {Type: typeDependencyGVK, Value: []byte(`{"group":"example.com","version":"v1","kind":"Bar"}`)}, }, assertErr: require.NoError, }, { name: "dependency types must be set", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: "", Value: []byte(`null`)}, - }, + dependencies: []Dependency{ + {Type: "", Value: []byte(`null`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `type is required`) @@ -455,10 +402,8 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "unknown dependency types are invalid", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: "a", Value: []byte(`null`)}, - }, + dependencies: []Dependency{ + {Type: "a", Value: []byte(`null`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `dependency at index 0 with type "a" is invalid: unknown type`) @@ -466,13 +411,11 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "empty dependency values are invalid", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyPackage, Value: []byte(``)}, - {Type: TypeDependencyPackage, Value: nil}, - {Type: TypeDependencyGVK, Value: []byte(``)}, - {Type: TypeDependencyGVK, Value: nil}, - }, + dependencies: []Dependency{ + {Type: typeDependencyPackage, Value: []byte(``)}, + {Type: typeDependencyPackage, Value: nil}, + {Type: typeDependencyGVK, Value: []byte(``)}, + {Type: typeDependencyGVK, Value: nil}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `dependency at index 0 with type "olm.package" is invalid: value is required`) @@ -483,11 +426,9 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "non-JSON dependency values are invalid", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyPackage, Value: []byte(`}`)}, - {Type: TypeDependencyGVK, Value: []byte(`}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyPackage, Value: []byte(`}`)}, + {Type: typeDependencyGVK, Value: []byte(`}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `dependency at index 0 with type "olm.package" is invalid: failed to unmarshal value`) @@ -496,11 +437,9 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "olm.package must have package name", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyPackage, Value: []byte(`{"packageName":"","version":"<=1.2.3"}`)}, - {Type: TypeDependencyPackage, Value: []byte(`{"version":"<=1.2.3"}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyPackage, Value: []byte(`{"packageName":"","version":"<=1.2.3"}`)}, + {Type: typeDependencyPackage, Value: []byte(`{"version":"<=1.2.3"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `failed to validate value "{\"packageName\":\"\",\"version\":\"<=1.2.3\"}": packageName is required`) @@ -509,10 +448,8 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "olm.package package name must be a DNS 1123 subdomain", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyPackage, Value: []byte(`{"packageName":"$foo","version":"<=1.2.3"}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyPackage, Value: []byte(`{"packageName":"$foo","version":"<=1.2.3"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `packageName "$foo" is invalid: a lowercase RFC 1123 subdomain must consist of`) @@ -520,11 +457,9 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "olm.package must have version range", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyPackage, Value: []byte(`{"packageName":"foo","version":""}`)}, - {Type: TypeDependencyPackage, Value: []byte(`{"packageName":"foo"}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyPackage, Value: []byte(`{"packageName":"foo","version":""}`)}, + {Type: typeDependencyPackage, Value: []byte(`{"packageName":"foo"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `failed to validate value "{\"packageName\":\"foo\",\"version\":\"\"}": version is required`) @@ -533,10 +468,8 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "olm.package version range must be valid", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyPackage, Value: []byte(`{"packageName":"foo","version":"foobar"}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyPackage, Value: []byte(`{"packageName":"foo","version":"foobar"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `version "foobar" is invalid`) @@ -544,10 +477,8 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "olm.gvk must have group, version, and kind", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyGVK, Value: []byte(`{}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyGVK, Value: []byte(`{}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `group is required`) @@ -557,10 +488,8 @@ func Test_metadata_validateDependencies(t *testing.T) { }, { name: "olm.gvk must have valid group, version, and kind", - dependenciesFile: Dependencies{ - Dependencies: []Dependency{ - {Type: TypeDependencyGVK, Value: []byte(`{"group":"$foo","version":"bar", "kind":"baz"}`)}, - }, + dependencies: []Dependency{ + {Type: typeDependencyGVK, Value: []byte(`{"group":"$foo","version":"bar", "kind":"baz"}`)}, }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, `group "$foo" is invalid: a lowercase RFC 1123 subdomain must consist`) @@ -575,7 +504,7 @@ func Test_metadata_validateDependencies(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { m := &metadata{ - dependenciesFile: tt.dependenciesFile, + dependenciesFile: newDependenciesFile(tt.dependencies), } err := m.validateDependencies() tt.assertErr(t, err) @@ -583,43 +512,18 @@ func Test_metadata_validateDependencies(t *testing.T) { } } -func Test_metadata_validate(t *testing.T) { - tests := []struct { - name string - metadata metadata - assertErr require.ErrorAssertionFunc - }{ - { - name: "passes all validations", - metadata: metadata{ - annotationsFile: Annotations{Annotations: map[string]string{ - AnnotationMediaType: MediaType, - AnnotationManifests: ManifestsDirectory, - AnnotationMetadata: MetadataDirectory, - AnnotationPackage: "example", - }}, - }, - assertErr: require.NoError, - }, - { - name: "validate collects suberrors", - metadata: metadata{ - annotationsFile: Annotations{Annotations: map[string]string{"foo": "bar"}}, - propertiesFile: Properties{Properties: []Property{{Type: "a"}}}, - dependenciesFile: Dependencies{Dependencies: []Dependency{{Type: TypeDependencyPackage}}}, - }, assertErr: func(t require.TestingT, err error, i ...interface{}) { - require.ErrorContains(t, err, "invalid annotations") - require.ErrorContains(t, err, "invalid properties") - require.ErrorContains(t, err, "invalid dependencies") - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.metadata.validate() - tt.assertErr(t, err) - }) - } +func newAnnotationsFile(annotations map[string]string) AnnotationsFile { + return NewPrecomputedFile[Annotations](annotationsFileName, nil, Annotations{Annotations: annotations}) +} + +func newPropertiesFile(properties []Property) *PropertiesFile { + f := NewPrecomputedFile[Properties](propertiesFileName, nil, Properties{Properties: properties}) + return &f +} + +func newDependenciesFile(dependencies []Dependency) *DependenciesFile { + f := NewPrecomputedFile[Dependencies](dependenciesFileName, nil, Dependencies{Dependencies: dependencies}) + return &f } func mapWithoutKey[K comparable, V any](m map[K]V, key K) map[K]V { diff --git a/internal/pkg/bundle/registry/v1/oci.go b/internal/pkg/bundle/registry/v1/oci.go deleted file mode 100644 index 80e3862..0000000 --- a/internal/pkg/bundle/registry/v1/oci.go +++ /dev/null @@ -1,105 +0,0 @@ -package v1 - -import ( - "bytes" - "compress/gzip" - "context" - "crypto/sha256" - "encoding/json" - "errors" - "fmt" - "io" - - "github.com/opencontainers/go-digest" - "github.com/opencontainers/image-spec/specs-go" - ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "oras.land/oras-go/v2" - "oras.land/oras-go/v2/content" - - "github.com/joelanford/kpm/internal/pkg/util/tar" -) - -func (b *Bundle) name() string { - return b.metadata.annotationsFile.Annotations[AnnotationPackage] -} - -func (b *Bundle) tag() string { - return b.csv.Spec.Version.String() -} - -func (b *Bundle) ID() string { - return fmt.Sprintf("%s.v%s", b.name(), b.tag()) -} - -func (b *Bundle) imageNameTag() string { - return fmt.Sprintf("%s:%s", b.name(), b.tag()) -} - -func (b *Bundle) MarshalOCI(ctx context.Context, target oras.Target) (ocispec.Descriptor, error) { - if b == nil || b.fsys == nil { - return ocispec.Descriptor{}, errors.New("cannot marshal uninitialized bundle") - } - config, layers, err := b.pushConfigAndLayers(ctx, target) - if err != nil { - return ocispec.Descriptor{}, err - } - - manifest := ocispec.Manifest{ - Versioned: specs.Versioned{SchemaVersion: 2}, - MediaType: ocispec.MediaTypeImageManifest, - Config: config, - Layers: layers, - } - manifestData, err := json.Marshal(manifest) - if err != nil { - return ocispec.Descriptor{}, err - } - - desc, err := oras.PushBytes(ctx, target, ocispec.MediaTypeImageManifest, manifestData) - if err != nil { - return ocispec.Descriptor{}, fmt.Errorf("failed to push bundle: %v", err) - } - if err := target.Tag(ctx, desc, b.imageNameTag()); err != nil { - return ocispec.Descriptor{}, fmt.Errorf("failed to tag bundle: %v", err) - } - return desc, nil -} - -func (b *Bundle) pushConfigAndLayers(ctx context.Context, pusher content.Pusher) (ocispec.Descriptor, []ocispec.Descriptor, error) { - var layerData bytes.Buffer - diffIDHash := sha256.New() - - if err := func() error { - gzipWriter := gzip.NewWriter(&layerData) - defer gzipWriter.Close() - mw := io.MultiWriter(diffIDHash, gzipWriter) - return tar.Directory(mw, b.fsys) - }(); err != nil { - return ocispec.Descriptor{}, nil, err - } - - cfg := ocispec.Image{ - Config: ocispec.ImageConfig{ - Labels: b.metadata.annotationsFile.Annotations, - }, - RootFS: ocispec.RootFS{ - Type: "layers", - DiffIDs: []digest.Digest{ - digest.NewDigest(digest.SHA256, diffIDHash), - }, - }, - } - cfgData, err := json.Marshal(cfg) - if err != nil { - return ocispec.Descriptor{}, nil, err - } - cfgDesc, err := oras.PushBytes(ctx, pusher, ocispec.MediaTypeImageConfig, cfgData) - if err != nil { - return ocispec.Descriptor{}, nil, err - } - layerDesc, err := oras.PushBytes(ctx, pusher, ocispec.MediaTypeImageLayerGzip, layerData.Bytes()) - if err != nil { - return ocispec.Descriptor{}, nil, err - } - return cfgDesc, []ocispec.Descriptor{layerDesc}, nil -} diff --git a/internal/pkg/bundle/registry/v1/oci_test.go b/internal/pkg/bundle/registry/v1/oci_test.go deleted file mode 100644 index f50a0a8..0000000 --- a/internal/pkg/bundle/registry/v1/oci_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package v1 - -import ( - "testing" - "testing/fstest" - - "github.com/opencontainers/go-digest" - ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/stretchr/testify/require" - "oras.land/oras-go/v2/content/memory" -) - -func TestBundle_MarshalOCI(t *testing.T) { - tests := []struct { - name string - bundle func(t *testing.T) Bundle - expected ocispec.Descriptor - assertErr require.ErrorAssertionFunc - }{ - { - name: "succeeds", - bundle: func(t *testing.T) Bundle { - b, err := LoadFS(fstest.MapFS{ - "manifests/csv.yaml": &fstest.MapFile{Data: []byte(` -apiVersion: operators.coreos.com/v1alpha1 -kind: ClusterServiceVersion -metadata: - name: example.v1.2.3 -spec: - version: "1.2.3" -`)}, - "metadata/annotations.yaml": &fstest.MapFile{Data: []byte(` -annotations: - operators.operatorframework.io.bundle.mediatype.v1: registry+v1 - operators.operatorframework.io.bundle.manifests.v1: manifests/ - operators.operatorframework.io.bundle.metadata.v1: metadata/ - operators.operatorframework.io.bundle.package.v1: example -`)}, - }) - require.NoError(t, err) - return *b - }, - expected: ocispec.Descriptor{ - MediaType: ocispec.MediaTypeImageManifest, - // NOTE: DO NOT CHANGE THIS DIGEST if nothing in the bundle has changed. - // This ensures that bundles can always be rebuilt such that the digest - // never changes if input hasn't changed. - // - // If you need to change something in the bundle, there should be a PR - // where the only changes are in the input/output of this test. - Digest: digest.NewDigestFromEncoded(digest.SHA256, "7aff8e3aa41d7aef60557437aceeda0ea1c091c3b571acba4fc38c653b197868"), - Size: 401, - }, - assertErr: require.NoError, - }, - { - name: "bundle zero-value", - bundle: func(t *testing.T) Bundle { return Bundle{} }, - assertErr: func(t require.TestingT, err error, i ...interface{}) { - require.ErrorContains(t, err, "cannot marshal uninitialized bundle") - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - b := tt.bundle(t) - target := memory.New() - - actual, err := b.MarshalOCI(t.Context(), target) - - tt.assertErr(t, err) - require.Equal(t, tt.expected, actual) - }) - } -} diff --git a/internal/pkg/spec/registryv1.go b/internal/pkg/spec/registryv1.go index 307850f..cbaa49b 100644 --- a/internal/pkg/spec/registryv1.go +++ b/internal/pkg/spec/registryv1.go @@ -28,7 +28,8 @@ func loadRegistryV1Bytes(specData []byte, workingDir string) (Spec, error) { func loadRegistryV1(spec specsv1.RegistryV1, workingDir string) (Spec, error) { switch spec.Source.SourceType { case specsv1.RegistryV1SourceTypeBundleDirectory: - return registryv1.LoadFS(os.DirFS(filepath.Join(workingDir, spec.Source.BundleDirectory.Path))) + l := registryv1.NewBundleFSLoader(os.DirFS(filepath.Join(workingDir, spec.Source.BundleDirectory.Path))) + return l.Load() default: return nil, fmt.Errorf("unknown source type: %q", spec.Source.SourceType) } From 2aaab58904ef77e480f97a5470875e1b0ce8afee Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 20 Aug 2025 10:41:14 -0400 Subject: [PATCH 2/2] more registry+v1 manifests validations 1. Validate that all CRD versions in the manifests are listed as owned in the CSV spec 2. Validate that there are no duplicate manifests (based on group, kind, and name) --- internal/api/fbc/v1/types.go | 19 -- internal/api/fbc/v2/types.go | 1 - .../pkg/bundle/registry/v1/bundle_test.go | 24 ++ internal/pkg/bundle/registry/v1/manifests.go | 105 ++++++++ .../pkg/bundle/registry/v1/manifests_test.go | 235 ++++++++++++++++-- 5 files changed, 350 insertions(+), 34 deletions(-) delete mode 100644 internal/api/fbc/v1/types.go delete mode 100644 internal/api/fbc/v2/types.go diff --git a/internal/api/fbc/v1/types.go b/internal/api/fbc/v1/types.go deleted file mode 100644 index 15f9181..0000000 --- a/internal/api/fbc/v1/types.go +++ /dev/null @@ -1,19 +0,0 @@ -package v1 - -import ( - v1 "github.com/joelanford/kpm/internal/pkg/bundle/registry/v1" -) - -type Package struct { - Schema string `json:"schema"` - Name string `json:"name"` - DefaultChannel string `json:"defaultChannel,omitempty"` - Icon *Icon `json:"icon,omitempty"` - Description string `json:"description,omitempty"` - Properties []v1.Property `json:"properties,omitempty"` -} - -type Icon struct { - Data []byte `json:"base64data"` - MediaType string `json:"mediatype"` -} diff --git a/internal/api/fbc/v2/types.go b/internal/api/fbc/v2/types.go deleted file mode 100644 index 5ec3cc8..0000000 --- a/internal/api/fbc/v2/types.go +++ /dev/null @@ -1 +0,0 @@ -package v2 diff --git a/internal/pkg/bundle/registry/v1/bundle_test.go b/internal/pkg/bundle/registry/v1/bundle_test.go index f7e0fe5..88956db 100644 --- a/internal/pkg/bundle/registry/v1/bundle_test.go +++ b/internal/pkg/bundle/registry/v1/bundle_test.go @@ -34,10 +34,22 @@ metadata: name: example.v1.2.3 spec: version: "1.2.3" + customresourcedefinitions: + owned: + - name: resources.group.example.com + version: v1alpha1 + kind: Resource `)}, "manifests/crd.yaml": &fstest.MapFile{Data: []byte(` apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + name: resources.group.example.com +spec: + names: + kind: Resource + versions: + - name: v1alpha1 `)}, "manifests/secret.yaml": &fstest.MapFile{Data: []byte(` apiVersion: v1 @@ -62,11 +74,23 @@ metadata: name: example.v1.2.3 spec: version: "1.2.3" + customresourcedefinitions: + owned: + - name: resources.group.example.com + version: v1alpha1 + kind: Resource `)), crds: []File[*apiextensionsv1.CustomResourceDefinition]{ newCRDFromData(t, "crd.yaml", []byte(` apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + name: resources.group.example.com +spec: + names: + kind: Resource + versions: + - name: v1alpha1 `)), }, others: []File[client.Object]{ diff --git a/internal/pkg/bundle/registry/v1/manifests.go b/internal/pkg/bundle/registry/v1/manifests.go index 1ab7f28..30d0d5f 100644 --- a/internal/pkg/bundle/registry/v1/manifests.go +++ b/internal/pkg/bundle/registry/v1/manifests.go @@ -2,6 +2,7 @@ package v1 import ( "bytes" + "cmp" "errors" "fmt" "io" @@ -16,7 +17,9 @@ import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/version" "k8s.io/cli-runtime/pkg/resource" "sigs.k8s.io/controller-runtime/pkg/client" @@ -158,7 +161,9 @@ func (m manifestFiles) validate() error { m.validateNoSubDirectories, m.validateOneObjectPerFile, m.validateExactlyOneCSV, + m.validateUniqueGroupKindName, m.validateSupportedKinds, + m.validateOwnedAPIs, } { if err := validationFn(); err != nil { validationErrors = append(validationErrors, err) @@ -240,6 +245,106 @@ func (m manifestFiles) validateSupportedKinds() error { return nil } +type nameVersion struct { + name string + version string +} + +func (nv *nameVersion) Compare(other nameVersion) int { + if v := cmp.Compare(nv.name, other.name); v != 0 { + return v + } + return version.CompareKubeAwareVersionStrings(nv.version, other.version) +} + +func (m manifestFiles) validateOwnedAPIs() error { + + var ( + crdNVKs = sets.New[nameVersion]() + csvNVKs = sets.New[nameVersion]() + ) + + for _, mf := range m { + for _, obj := range mf.Value() { + switch val := obj.(type) { + case *apiextensionsv1.CustomResourceDefinition: + for _, crdVersion := range val.Spec.Versions { + crdNVKs.Insert(nameVersion{ + name: val.Name, + version: crdVersion.Name, + }) + } + case *v1alpha1.ClusterServiceVersion: + for _, ownedAPI := range val.Spec.CustomResourceDefinitions.Owned { + csvNVKs.Insert(nameVersion{ + name: ownedAPI.Name, + version: ownedAPI.Version, + }) + } + } + } + } + + var errs []error + if crdOnly := crdNVKs.Difference(csvNVKs); crdOnly.Len() > 0 { + crdOnlySorted := crdOnly.UnsortedList() + slices.SortFunc(crdOnlySorted, func(a, b nameVersion) int { + return a.Compare(b) + }) + for _, crd := range crdOnlySorted { + errs = append(errs, fmt.Errorf("CRD %q, version %q not owned by CSV", crd.name, crd.version)) + } + } + if csvOnly := csvNVKs.Difference(crdNVKs); csvOnly.Len() > 0 { + csvOnlySorted := csvOnly.UnsortedList() + slices.SortFunc(csvOnlySorted, func(a, b nameVersion) int { + return a.Compare(b) + }) + for _, crd := range csvOnlySorted { + errs = append(errs, fmt.Errorf("CSV-owned CRD %q, version %q not found in manifests", crd.name, crd.version)) + } + } + if err := errors.Join(errs...); err != nil { + return fmt.Errorf("mismatch between CRDs and CSV.spec.customresourcedefinitions.owned: %v", err) + } + return nil +} + +type gkn struct { + schema.GroupKind + Name string +} + +func (v gkn) String() string { + return fmt.Sprintf("%s/%s", v.GroupKind, v.Name) +} + +func (m manifestFiles) validateUniqueGroupKindName() error { + counts := make(map[gkn]int, len(m)) + for _, mf := range m { + for _, obj := range mf.Value() { + key := gkn{ + GroupKind: obj.GetObjectKind().GroupVersionKind().GroupKind(), + Name: client.ObjectKeyFromObject(obj).Name, + } + counts[key]++ + } + } + + var dups []string + for key, count := range counts { + if count <= 1 { + continue + } + dups = append(dups, key.String()) + } + slices.Sort(dups) + if len(dups) > 0 { + return fmt.Errorf("duplicate group kind names: %v", strings.Join(dups, ", ")) + } + return nil +} + func newManifestFileFromReader(file io.Reader, path string) (*File[[]client.Object], error) { var ( objs []client.Object diff --git a/internal/pkg/bundle/registry/v1/manifests_test.go b/internal/pkg/bundle/registry/v1/manifests_test.go index 5390c67..33aa9fe 100644 --- a/internal/pkg/bundle/registry/v1/manifests_test.go +++ b/internal/pkg/bundle/registry/v1/manifests_test.go @@ -7,7 +7,9 @@ import ( "testing/fstest" "github.com/stretchr/testify/require" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" @@ -183,8 +185,8 @@ func Test_manifestFiles_validateOneObjectPerFile(t *testing.T) { } func Test_manifestFiles_validateExactlyOneCSV(t *testing.T) { - other := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Other"}) - csv := makeObject(v1alpha1.SchemeGroupVersion.WithKind(v1alpha1.ClusterServiceVersionKind)) + other := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Other"}, "other-name", "") + csv := makeObject(v1alpha1.SchemeGroupVersion.WithKind(v1alpha1.ClusterServiceVersionKind), "csv-name", "") tests := []struct { name string @@ -270,6 +272,208 @@ func Test_manifestFiles_validateSupportedKinds(t *testing.T) { } } +func Test_manifestFiles_validateOwnedCRDs(t *testing.T) { + tests := []struct { + name string + manifestFiles manifestFiles + assertErr require.ErrorAssertionFunc + }{ + { + name: "valid", + manifestFiles: manifestFiles{ + NewPrecomputedFile[[]client.Object]("csv.yaml", nil, []client.Object{&v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{Name: "example.v0.0.1"}, + Spec: v1alpha1.ClusterServiceVersionSpec{ + CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ + Owned: []v1alpha1.CRDDescription{ + {Name: "bars.group.example.com", Version: "v1", Kind: "Bar"}, + {Name: "bars.group.example.com", Version: "v2", Kind: "Bar"}, + {Name: "foos.group.example.com", Version: "v1alpha1", Kind: "Foo"}, + {Name: "foos.group.example.com", Version: "v1alpha2", Kind: "Foo"}, + }, + }, + }, + }}), + NewPrecomputedFile[[]client.Object]("foos.crd.yaml", nil, []client.Object{&apiextensionsv1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "foos.group.example.com"}, + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ + Kind: "Foo", + }, + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + {Name: "v1alpha1"}, {Name: "v1alpha2"}, + }, + }, + }}), + NewPrecomputedFile[[]client.Object]("bars.crd.yaml", nil, []client.Object{&apiextensionsv1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "bars.group.example.com"}, + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ + Kind: "Bar", + }, + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + {Name: "v1"}, {Name: "v2"}, + }, + }, + }}), + }, + assertErr: require.NoError, + }, + { + name: "missing CRD version in CRD manifest", + manifestFiles: manifestFiles{ + NewPrecomputedFile[[]client.Object]("csv.yaml", nil, []client.Object{&v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{Name: "example.v0.0.1"}, + Spec: v1alpha1.ClusterServiceVersionSpec{ + CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ + Owned: []v1alpha1.CRDDescription{ + {Name: "bars.group.example.com", Version: "v1", Kind: "Bar"}, + {Name: "bars.group.example.com", Version: "v2", Kind: "Bar"}, + {Name: "foos.group.example.com", Version: "v1alpha1", Kind: "Foo"}, + {Name: "foos.group.example.com", Version: "v1alpha2", Kind: "Foo"}, + }, + }, + }, + }}), + NewPrecomputedFile[[]client.Object]("foos.crd.yaml", nil, []client.Object{&apiextensionsv1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "foos.group.example.com"}, + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ + Kind: "Foo", + }, + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + {Name: "v1alpha1"}, {Name: "v1alpha2"}, + }, + }, + }}), + NewPrecomputedFile[[]client.Object]("bars.crd.yaml", nil, []client.Object{&apiextensionsv1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "bars.group.example.com"}, + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ + Kind: "Bar", + }, + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + {Name: "v1"}, + }, + }, + }}), + }, + assertErr: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, `CSV-owned CRD "bars.group.example.com", version "v2" not found in manifests`) + }, + }, + { + name: "missing CRDs", + manifestFiles: manifestFiles{ + NewPrecomputedFile[[]client.Object]("csv.yaml", nil, []client.Object{&v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{Name: "example.v0.0.1"}, + Spec: v1alpha1.ClusterServiceVersionSpec{ + CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ + Owned: []v1alpha1.CRDDescription{ + {Name: "bars.group.example.com", Version: "v1", Kind: "Bar"}, + {Name: "bars.group.example.com", Version: "v2", Kind: "Bar"}, + {Name: "foos.group.example.com", Version: "v1alpha1", Kind: "Foo"}, + {Name: "foos.group.example.com", Version: "v1alpha2", Kind: "Foo"}, + }, + }, + }, + }}), + }, + assertErr: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, `CSV-owned CRD "bars.group.example.com", version "v1" not found in manifests`) + require.ErrorContains(t, err, `CSV-owned CRD "bars.group.example.com", version "v2" not found in manifests`) + require.ErrorContains(t, err, `CSV-owned CRD "foos.group.example.com", version "v1alpha1" not found in manifests`) + require.ErrorContains(t, err, `CSV-owned CRD "foos.group.example.com", version "v1alpha2" not found in manifests`) + }, + }, + { + name: "CSV missing owned CRD", + manifestFiles: manifestFiles{ + NewPrecomputedFile[[]client.Object]("csv.yaml", nil, []client.Object{&v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{Name: "example.v0.0.1"}, + }}), + NewPrecomputedFile[[]client.Object]("foos.crd.yaml", nil, []client.Object{&apiextensionsv1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "foos.group.example.com"}, + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Names: apiextensionsv1.CustomResourceDefinitionNames{ + Kind: "Foo", + }, + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + {Name: "v1alpha1"}, {Name: "v1alpha2"}, + }, + }, + }}), + }, + assertErr: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, `CRD "foos.group.example.com", version "v1alpha1" not owned by CSV`) + require.ErrorContains(t, err, `CRD "foos.group.example.com", version "v1alpha2" not owned by CSV`) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.manifestFiles.validateOwnedAPIs() + tt.assertErr(t, err) + }) + } +} + +func Test_manifestFiles_validateUniqueGroupKindName(t *testing.T) { + tests := []struct { + name string + manifestFiles manifestFiles + assertErr require.ErrorAssertionFunc + }{ + { + name: "valid", + manifestFiles: supportedManifestFiles(), + assertErr: require.NoError, + }, + { + name: "valid: duplicate GK, different names", + manifestFiles: manifestFiles{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, []client.Object{ + makeObject(appsv1.SchemeGroupVersion.WithKind("Deployment"), "name1", ""), + }), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, []client.Object{ + makeObject(appsv1.SchemeGroupVersion.WithKind("Deployment"), "name2", ""), + }), + }, + assertErr: require.NoError, + }, + { + name: "valid: duplicate names, different GKs", + manifestFiles: manifestFiles{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, []client.Object{ + makeObject(appsv1.SchemeGroupVersion.WithKind("Deployment"), "name", ""), + }), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, []client.Object{ + makeObject(appsv1.SchemeGroupVersion.WithKind("ReplicaSet"), "name", ""), + }), + }, + assertErr: require.NoError, + }, + { + name: "invalid: duplicate GKN", + manifestFiles: manifestFiles{ + NewPrecomputedFile[[]client.Object]("manifest1.yaml", nil, []client.Object{ + makeObject(appsv1.SchemeGroupVersion.WithKind("Deployment"), "dep", ""), + }), + NewPrecomputedFile[[]client.Object]("manifest2.yaml", nil, []client.Object{ + makeObject(appsv1.SchemeGroupVersion.WithKind("Deployment"), "dep", ""), + }), + }, + assertErr: require.Error, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.manifestFiles.validateUniqueGroupKindName() + tt.assertErr(t, err) + }) + } +} + func Test_manifestFiles_validate(t *testing.T) { tests := []struct { name string @@ -284,9 +488,9 @@ func Test_manifestFiles_validate(t *testing.T) { { name: "validate collects suberrors", manifestFiles: []File[[]client.Object]{ - NewPrecomputedFile[[]client.Object]("subdir/service.yaml", nil, []client.Object{makeObject(schema.GroupVersionKind{Version: "v1", Kind: "Service"})}), + NewPrecomputedFile[[]client.Object]("subdir/service.yaml", nil, []client.Object{makeObject(schema.GroupVersionKind{Version: "v1", Kind: "Service"}, "svc", "")}), NewPrecomputedFile[[]client.Object]("no_objects.yaml", nil, nil), - NewPrecomputedFile[[]client.Object]("unsupported.yaml", nil, []client.Object{makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported"})}), + NewPrecomputedFile[[]client.Object]("unsupported.yaml", nil, []client.Object{makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported"}, "u", "")}), }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "subdirectories not allowed") @@ -304,18 +508,21 @@ func Test_manifestFiles_validate(t *testing.T) { } } -func makeObject(gvk schema.GroupVersionKind) client.Object { +func makeObject(gvk schema.GroupVersionKind, name string, namespace string) client.Object { obj, _ := internal.SupportedKindsScheme.New(gvk) if obj == nil { obj = &unstructured.Unstructured{} } - obj.GetObjectKind().SetGroupVersionKind(gvk) - return obj.(client.Object) + cObj := obj.(client.Object) + cObj.GetObjectKind().SetGroupVersionKind(gvk) + cObj.SetName(name) + cObj.SetNamespace(namespace) + return cObj } func unsupportedManifestFiles() []File[[]client.Object] { - unsupported1 := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported1"}) - unsupported2 := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported2"}) + unsupported1 := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported1"}, "u1", "") + unsupported2 := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported2"}, "u2", "") return []File[[]client.Object]{ NewPrecomputedFile[[]client.Object]("Unsupported1.yaml", nil, []client.Object{unsupported1}), @@ -325,10 +532,10 @@ func unsupportedManifestFiles() []File[[]client.Object] { func supportedManifestFiles() []File[[]client.Object] { kinds := sets.List(internal.SupportedKinds) - manifestFiles := make([]File[[]client.Object], 0, len(kinds)) - for _, kind := range kinds { - obj := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: kind}) - manifestFiles = append(manifestFiles, NewPrecomputedFile(fmt.Sprintf("%s.yaml", kind), nil, []client.Object{obj})) + mf := make([]File[[]client.Object], 0, len(kinds)) + for i, kind := range kinds { + obj := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: kind}, fmt.Sprintf("obj%d", i), "") + mf = append(mf, NewPrecomputedFile(fmt.Sprintf("%s.yaml", kind), nil, []client.Object{obj})) } - return manifestFiles + return mf }