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/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..88956db 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,30 @@ 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" + 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 +kind: Secret `)}, "metadata/annotations.yaml": &fstest.MapFile{Data: []byte(` annotations: @@ -33,60 +62,174 @@ 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" + 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 +`)), }, - }}, - 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..30d0d5f 100644 --- a/internal/pkg/bundle/registry/v1/manifests.go +++ b/internal/pkg/bundle/registry/v1/manifests.go @@ -1,39 +1,102 @@ package v1 import ( + "bytes" + "cmp" "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/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" - autoscalingv1 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" + "k8s.io/apimachinery/pkg/version" "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) load() error { - var loadErrs []error +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 *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,29 +105,65 @@ 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 } - m.manifestFiles = append(m.manifestFiles, *mf) + defer f.Close() + + mf, err := newManifestFileFromReader(f, path) + if err != nil { + loadErrs = append(loadErrs, err) + return nil + } + 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, m.validateOneObjectPerFile, m.validateExactlyOneCSV, + m.validateUniqueGroupKindName, m.validateSupportedKinds, + m.validateOwnedAPIs, } { if err := validationFn(); err != nil { validationErrors = append(validationErrors, err) @@ -76,10 +175,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 +187,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 +200,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 +220,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 +245,121 @@ func (m *manifests) validateSupportedKinds() error { return nil } -type manifestFile struct { - filename string - objects []client.Object +type nameVersion struct { + name string + version string } -func newManifestFile(fsys fs.FS, path string) (*manifestFile, error) { - file, err := fsys.Open(path) - if err != nil { - return nil, err +func (nv *nameVersion) Compare(other nameVersion) int { + if v := cmp.Compare(nv.name, other.name); v != 0 { + return v } - defer file.Close() + return version.CompareKubeAwareVersionStrings(nv.version, other.version) +} + +func (m manifestFiles) validateOwnedAPIs() error { var ( - m = &manifestFile{filename: path} + 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 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 +371,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..33aa9fe 100644 --- a/internal/pkg/bundle/registry/v1/manifests_test.go +++ b/internal/pkg/bundle/registry/v1/manifests_test.go @@ -7,6 +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" @@ -14,36 +17,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 +86,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 +127,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 +163,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 +178,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) { - other := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Other"}) - csv := makeObject(v1alpha1.SchemeGroupVersion.WithKind(v1alpha1.ClusterServiceVersionKind)) +func Test_manifestFiles_validateExactlyOneCSV(t *testing.T) { + 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 - 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 +222,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 +237,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 +266,218 @@ 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_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_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 +487,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"}, "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"}, "u", "")}), }, assertErr: func(t require.TestingT, err error, i ...interface{}) { require.ErrorContains(t, err, "subdirectories not allowed") @@ -282,40 +502,40 @@ 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) +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() []manifestFile { - unsupported1 := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported1"}) - unsupported2 := makeObject(schema.GroupVersionKind{Group: "example.com", Version: "v1alpha1", Kind: "Unsupported2"}) +func unsupportedManifestFiles() []File[[]client.Object] { + 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 []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)) - 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}}) +func supportedManifestFiles() []File[[]client.Object] { + kinds := sets.List(internal.SupportedKinds) + 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 } 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) }