From 72ffa0ef91296abcdf86124df6c2b2cfa05377a4 Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 09:19:28 +0300 Subject: [PATCH 01/10] chore(deps): Update to CAPI 1.14.2 Cluster API v1.14 raises the floor for controller-runtime (v0.24.x) and the Kubernetes libraries (v1.36.x), so this bump pulls those in as well, along with controller-tools v0.21. The first part of the upstream code organization proposal landed in v1.14 and accounts for most of the non-mechanical changes. The API types now live in their own `sigs.k8s.io/cluster-api/api` Go module: the import paths are unchanged, but the root and test/e2e modules need an explicit require on it. The same reorganization moved the core provider manifests from config/ to core/config/, so getFilePathToCAPICRDs in the envtest helper had to follow, otherwise the controller integration suite cannot install the CAPI CRDs. Two APIs in use became deprecated. controller-runtime deprecates pkg/scheme.Builder in favour of the apimachinery builder, so groupversion_info.go switches to runtime.NewSchemeBuilder and the eight types files append to objectTypes instead of calling SchemeBuilder.Register. CAPI deprecates util/record; its three call sites in pkg/cloud are dropped, since record.InitFromRecorder was never called and they were writing to a FakeRecorder. Unrelated to CAPI, k8s.io/apimachinery/pkg/util/dump became a deprecated //go:fix inline shim in v0.36, which trips the govet inline analyzer. pkg/scope/hash.go now imports k8s.io/utils/dump directly, which is what the shim delegated to, so hashes are unchanged. Also aligns the tool pins with CAPI v1.14.2 (envtest 1.37.0, setup-envtest release-0.24, controller-gen v0.21.0, conversion-gen v0.36.0), updates the e2e config to v1.14.2, and adds the missing 1.13 and 1.14 release series to the shared e2e metadata, without which clusterctl cannot resolve the contract for the configured CAPI version. Co-Authored-By: Claude Opus 5 (1M context) --- .github/dependabot.yaml | 2 + Makefile | 10 +- api/v1beta3/cloudstackaffinitygroup_types.go | 2 +- api/v1beta3/cloudstackcluster_types.go | 2 +- .../cloudstackclustertemplate_types.go | 2 +- api/v1beta3/cloudstackfailuredomain_types.go | 2 +- .../cloudstackisolatednetwork_types.go | 2 +- api/v1beta3/cloudstackmachine_types.go | 2 +- .../cloudstackmachinestatechecker_types.go | 2 +- .../cloudstackmachinetemplate_types.go | 2 +- api/v1beta3/groupversion_info.go | 16 +- api/v1beta3/zz_generated.deepcopy.go | 2 +- ...ter.x-k8s.io_cloudstackaffinitygroups.yaml | 2 +- ...e.cluster.x-k8s.io_cloudstackclusters.yaml | 2 +- ...r.x-k8s.io_cloudstackclustertemplates.yaml | 2 +- ...ter.x-k8s.io_cloudstackfailuredomains.yaml | 2 +- ...r.x-k8s.io_cloudstackisolatednetworks.yaml | 2 +- ...e.cluster.x-k8s.io_cloudstackmachines.yaml | 2 +- ...k8s.io_cloudstackmachinestatecheckers.yaml | 2 +- ...r.x-k8s.io_cloudstackmachinetemplates.yaml | 2 +- go.mod | 77 +++---- go.sum | 169 +++++++------- hack/tools/go.mod | 16 +- hack/tools/go.sum | 40 ++-- pkg/cloud/isolated_network.go | 13 +- pkg/scope/hash.go | 2 +- test/e2e/config/cloudstack.yaml | 20 +- test/e2e/data/shared/v1beta1/metadata.yaml | 6 + test/e2e/go.mod | 84 +++---- test/e2e/go.sum | 210 +++++++++--------- test/helpers/envtest.go | 5 +- 31 files changed, 369 insertions(+), 335 deletions(-) diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index 71cba4b0..cdc4a3bc 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -35,6 +35,8 @@ updates: # Ignore capi since it's tied to controller-runtime. - dependency-name: "sigs.k8s.io/cluster-api" update-types: [ "version-update:semver-major", "version-update:semver-minor" ] + - dependency-name: "sigs.k8s.io/cluster-api/api" + update-types: [ "version-update:semver-major", "version-update:semver-minor" ] - dependency-name: "sigs.k8s.io/cluster-api/test" update-types: [ "version-update:semver-major", "version-update:semver-minor" ] # Ignore k8s and its transitives modules as they are upgraded manually together with controller-runtime. diff --git a/Makefile b/Makefile index a5c7294b..0f230dbd 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ export GOPROXY # # Kubebuilder. # -export KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.36.0 +export KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.37.0 export KUBEBUILDER_CONTROLPLANE_START_TIMEOUT ?= 60s export KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT ?= @@ -67,12 +67,12 @@ KUSTOMIZE_BIN := kustomize KUSTOMIZE := $(abspath $(TOOLS_BIN_DIR)/$(KUSTOMIZE_BIN)-$(KUSTOMIZE_VER)) KUSTOMIZE_PKG := sigs.k8s.io/kustomize/kustomize/v5 -SETUP_ENVTEST_VER := release-0.23 +SETUP_ENVTEST_VER := release-0.24 SETUP_ENVTEST_BIN := setup-envtest SETUP_ENVTEST := $(abspath $(TOOLS_BIN_DIR)/$(SETUP_ENVTEST_BIN)-$(SETUP_ENVTEST_VER)) SETUP_ENVTEST_PKG := sigs.k8s.io/controller-runtime/tools/setup-envtest -CONTROLLER_GEN_VER := v0.20.0 +CONTROLLER_GEN_VER := v0.21.0 CONTROLLER_GEN_BIN := controller-gen CONTROLLER_GEN := $(abspath $(TOOLS_BIN_DIR)/$(CONTROLLER_GEN_BIN)-$(CONTROLLER_GEN_VER)) CONTROLLER_GEN_PKG := sigs.k8s.io/controller-tools/cmd/controller-gen @@ -82,7 +82,7 @@ GOTESTSUM_BIN := gotestsum GOTESTSUM := $(abspath $(TOOLS_BIN_DIR)/$(GOTESTSUM_BIN)-$(GOTESTSUM_VER)) GOTESTSUM_PKG := gotest.tools/gotestsum -CONVERSION_GEN_VER := v0.35.0 +CONVERSION_GEN_VER := v0.36.0 CONVERSION_GEN_BIN := conversion-gen # We are intentionally using the binary without version suffix, to avoid the version # in generated files. @@ -308,7 +308,7 @@ delete-kind-cluster: kind delete cluster --name $(KIND_CLUSTER_NAME) cluster-api: ## Clone cluster-api repository for tilt use. - git clone --branch v1.13.5 --depth 1 https://github.com/kubernetes-sigs/cluster-api.git + git clone --branch v1.14.2 --depth 1 https://github.com/kubernetes-sigs/cluster-api.git cluster-api/tilt-settings.json: hack/tilt-settings.json cluster-api cp ./hack/tilt-settings.json cluster-api diff --git a/api/v1beta3/cloudstackaffinitygroup_types.go b/api/v1beta3/cloudstackaffinitygroup_types.go index 2cc4ec99..8349c448 100644 --- a/api/v1beta3/cloudstackaffinitygroup_types.go +++ b/api/v1beta3/cloudstackaffinitygroup_types.go @@ -70,5 +70,5 @@ type CloudStackAffinityGroupList struct { } func init() { - SchemeBuilder.Register(&CloudStackAffinityGroup{}, &CloudStackAffinityGroupList{}) + objectTypes = append(objectTypes, &CloudStackAffinityGroup{}, &CloudStackAffinityGroupList{}) } diff --git a/api/v1beta3/cloudstackcluster_types.go b/api/v1beta3/cloudstackcluster_types.go index 9a4b0349..055ca721 100644 --- a/api/v1beta3/cloudstackcluster_types.go +++ b/api/v1beta3/cloudstackcluster_types.go @@ -114,5 +114,5 @@ type CloudStackClusterList struct { } func init() { - SchemeBuilder.Register(&CloudStackCluster{}, &CloudStackClusterList{}) + objectTypes = append(objectTypes, &CloudStackCluster{}, &CloudStackClusterList{}) } diff --git a/api/v1beta3/cloudstackclustertemplate_types.go b/api/v1beta3/cloudstackclustertemplate_types.go index 57c434b4..6fe2738f 100644 --- a/api/v1beta3/cloudstackclustertemplate_types.go +++ b/api/v1beta3/cloudstackclustertemplate_types.go @@ -58,5 +58,5 @@ type CloudStackClusterTemplateList struct { } func init() { - SchemeBuilder.Register(&CloudStackClusterTemplate{}, &CloudStackClusterTemplateList{}) + objectTypes = append(objectTypes, &CloudStackClusterTemplate{}, &CloudStackClusterTemplateList{}) } diff --git a/api/v1beta3/cloudstackfailuredomain_types.go b/api/v1beta3/cloudstackfailuredomain_types.go index 6dd034be..fa6b4463 100644 --- a/api/v1beta3/cloudstackfailuredomain_types.go +++ b/api/v1beta3/cloudstackfailuredomain_types.go @@ -131,5 +131,5 @@ type CloudStackFailureDomainList struct { } func init() { - SchemeBuilder.Register(&CloudStackFailureDomain{}, &CloudStackFailureDomainList{}) + objectTypes = append(objectTypes, &CloudStackFailureDomain{}, &CloudStackFailureDomainList{}) } diff --git a/api/v1beta3/cloudstackisolatednetwork_types.go b/api/v1beta3/cloudstackisolatednetwork_types.go index 43b54a1a..df2311b2 100644 --- a/api/v1beta3/cloudstackisolatednetwork_types.go +++ b/api/v1beta3/cloudstackisolatednetwork_types.go @@ -106,5 +106,5 @@ type CloudStackIsolatedNetworkList struct { } func init() { - SchemeBuilder.Register(&CloudStackIsolatedNetwork{}, &CloudStackIsolatedNetworkList{}) + objectTypes = append(objectTypes, &CloudStackIsolatedNetwork{}, &CloudStackIsolatedNetworkList{}) } diff --git a/api/v1beta3/cloudstackmachine_types.go b/api/v1beta3/cloudstackmachine_types.go index cc4b0a0d..cda94746 100644 --- a/api/v1beta3/cloudstackmachine_types.go +++ b/api/v1beta3/cloudstackmachine_types.go @@ -252,5 +252,5 @@ type CloudStackMachineList struct { } func init() { - SchemeBuilder.Register(&CloudStackMachine{}, &CloudStackMachineList{}) + objectTypes = append(objectTypes, &CloudStackMachine{}, &CloudStackMachineList{}) } diff --git a/api/v1beta3/cloudstackmachinestatechecker_types.go b/api/v1beta3/cloudstackmachinestatechecker_types.go index dcc46ddd..c76c9d96 100644 --- a/api/v1beta3/cloudstackmachinestatechecker_types.go +++ b/api/v1beta3/cloudstackmachinestatechecker_types.go @@ -54,5 +54,5 @@ type CloudStackMachineStateCheckerList struct { } func init() { - SchemeBuilder.Register(&CloudStackMachineStateChecker{}, &CloudStackMachineStateCheckerList{}) + objectTypes = append(objectTypes, &CloudStackMachineStateChecker{}, &CloudStackMachineStateCheckerList{}) } diff --git a/api/v1beta3/cloudstackmachinetemplate_types.go b/api/v1beta3/cloudstackmachinetemplate_types.go index 9cb46eac..86aa86cd 100644 --- a/api/v1beta3/cloudstackmachinetemplate_types.go +++ b/api/v1beta3/cloudstackmachinetemplate_types.go @@ -72,5 +72,5 @@ type CloudStackMachineTemplateList struct { } func init() { - SchemeBuilder.Register(&CloudStackMachineTemplate{}, &CloudStackMachineTemplateList{}) + objectTypes = append(objectTypes, &CloudStackMachineTemplate{}, &CloudStackMachineTemplateList{}) } diff --git a/api/v1beta3/groupversion_info.go b/api/v1beta3/groupversion_info.go index 277c8cbb..78b2072a 100644 --- a/api/v1beta3/groupversion_info.go +++ b/api/v1beta3/groupversion_info.go @@ -20,17 +20,29 @@ limitations under the License. package v1beta3 import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" ) var ( // GroupVersion is group version used to register these objects. GroupVersion = schema.GroupVersion{Group: "infrastructure.cluster.x-k8s.io", Version: "v1beta3"} + // objectTypes is the list of types registered by this group-version. Each + // types file appends to it from its own init function. + objectTypes = []runtime.Object{} + // SchemeBuilder is used to add go types to the GroupVersionKind scheme. - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) // AddToScheme adds the types in this group-version to the given scheme. AddToScheme = SchemeBuilder.AddToScheme ) + +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(GroupVersion, objectTypes...) + metav1.AddToGroupVersion(scheme, GroupVersion) + + return nil +} diff --git a/api/v1beta3/zz_generated.deepcopy.go b/api/v1beta3/zz_generated.deepcopy.go index 725bc9df..406dab28 100644 --- a/api/v1beta3/zz_generated.deepcopy.go +++ b/api/v1beta3/zz_generated.deepcopy.go @@ -22,7 +22,7 @@ package v1beta3 import ( "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/cluster-api/api/core/v1beta1" ) diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackaffinitygroups.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackaffinitygroups.yaml index c93e521f..bb9ed81f 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackaffinitygroups.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackaffinitygroups.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.0 + controller-gen.kubebuilder.io/version: v0.21.0 name: cloudstackaffinitygroups.infrastructure.cluster.x-k8s.io spec: group: infrastructure.cluster.x-k8s.io diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclusters.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclusters.yaml index b20f29f6..c83e5c36 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclusters.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclusters.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.0 + controller-gen.kubebuilder.io/version: v0.21.0 name: cloudstackclusters.infrastructure.cluster.x-k8s.io spec: group: infrastructure.cluster.x-k8s.io diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclustertemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclustertemplates.yaml index ed00014e..4d92dd4b 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclustertemplates.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackclustertemplates.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.0 + controller-gen.kubebuilder.io/version: v0.21.0 name: cloudstackclustertemplates.infrastructure.cluster.x-k8s.io spec: group: infrastructure.cluster.x-k8s.io diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackfailuredomains.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackfailuredomains.yaml index df45e046..789383dd 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackfailuredomains.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackfailuredomains.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.0 + controller-gen.kubebuilder.io/version: v0.21.0 name: cloudstackfailuredomains.infrastructure.cluster.x-k8s.io spec: group: infrastructure.cluster.x-k8s.io diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackisolatednetworks.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackisolatednetworks.yaml index cd67523c..4cac0f12 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackisolatednetworks.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackisolatednetworks.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.0 + controller-gen.kubebuilder.io/version: v0.21.0 name: cloudstackisolatednetworks.infrastructure.cluster.x-k8s.io spec: group: infrastructure.cluster.x-k8s.io diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachines.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachines.yaml index 211bb8fa..8a22fef5 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachines.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachines.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.0 + controller-gen.kubebuilder.io/version: v0.21.0 name: cloudstackmachines.infrastructure.cluster.x-k8s.io spec: group: infrastructure.cluster.x-k8s.io diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinestatecheckers.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinestatecheckers.yaml index 94c92fb1..414ef946 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinestatecheckers.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinestatecheckers.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.0 + controller-gen.kubebuilder.io/version: v0.21.0 name: cloudstackmachinestatecheckers.infrastructure.cluster.x-k8s.io spec: group: infrastructure.cluster.x-k8s.io diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinetemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinetemplates.yaml index 45ae63ea..a673d631 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinetemplates.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinetemplates.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.20.0 + controller-gen.kubebuilder.io/version: v0.21.0 name: cloudstackmachinetemplates.infrastructure.cluster.x-k8s.io spec: group: infrastructure.cluster.x-k8s.io diff --git a/go.mod b/go.mod index 71248226..2dd49a3b 100644 --- a/go.mod +++ b/go.mod @@ -4,31 +4,32 @@ go 1.26.0 require ( github.com/apache/cloudstack-go/v2 v2.17.1 - github.com/go-logr/logr v1.4.3 + github.com/go-logr/logr v1.4.4 github.com/google/go-cmp v0.7.0 github.com/hashicorp/go-multierror v1.1.1 github.com/jellydator/ttlcache/v3 v3.4.0 - github.com/onsi/ginkgo/v2 v2.28.3 - github.com/onsi/gomega v1.40.0 + github.com/onsi/ginkgo/v2 v2.32.0 + github.com/onsi/gomega v1.42.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.23.2 github.com/spf13/pflag v1.0.10 go.uber.org/mock v0.6.0 - golang.org/x/text v0.39.0 + golang.org/x/text v0.41.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.35.8 - k8s.io/apiextensions-apiserver v0.35.8 - k8s.io/apimachinery v0.35.8 - k8s.io/client-go v0.35.8 - k8s.io/component-base v0.35.8 - k8s.io/klog/v2 v2.130.1 - k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 - sigs.k8s.io/cluster-api v1.13.5 - sigs.k8s.io/controller-runtime v0.23.3 + k8s.io/api v0.36.3 + k8s.io/apiextensions-apiserver v0.36.3 + k8s.io/apimachinery v0.36.3 + k8s.io/client-go v0.36.3 + k8s.io/component-base v0.36.3 + k8s.io/klog/v2 v2.140.0 + k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 + sigs.k8s.io/cluster-api v1.14.2 + sigs.k8s.io/cluster-api/api v1.14.2 + sigs.k8s.io/controller-runtime v0.24.1 ) require ( - cel.dev/expr v0.25.1 // indirect + cel.dev/expr v0.25.2 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect @@ -49,7 +50,6 @@ require ( github.com/go-openapi/swag v0.23.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobuffalo/flect v1.0.3 // indirect - github.com/google/btree v1.1.3 // indirect github.com/google/cel-go v0.29.0 // indirect github.com/google/gnostic-models v0.7.0 // indirect github.com/google/pprof v0.0.0-20260402051712-545e8a4df936 // indirect @@ -64,45 +64,46 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.66.1 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.19.2 // indirect github.com/spf13/cobra v1.10.2 // indirect github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/sdk v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect + go.opentelemetry.io/otel/sdk v1.44.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect - golang.org/x/mod v0.37.0 // indirect - golang.org/x/net v0.56.0 // indirect + golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect + golang.org/x/mod v0.38.0 // indirect + golang.org/x/net v0.57.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.21.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/term v0.44.0 // indirect - golang.org/x/time v0.9.0 // indirect - golang.org/x/tools v0.47.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/term v0.45.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.48.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect - google.golang.org/grpc v1.82.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/grpc v1.83.1 // indirect google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - k8s.io/apiserver v0.35.8 // indirect - k8s.io/cluster-bootstrap v0.35.4 // indirect - k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect + k8s.io/apiserver v0.36.3 // indirect + k8s.io/cluster-bootstrap v0.36.3 // indirect + k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect + k8s.io/streaming v0.36.3 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.2 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index cb7d54a7..5cad2ceb 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= +cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= 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/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= @@ -26,8 +26,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.34 h1:Evzog/Av6/EQVy/xEAVZo2wsYAWMirIlunDfXxLg5Hk= -github.com/coredns/corefile-migration v1.0.34/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= +github.com/coredns/corefile-migration v1.0.35 h1:kZ4NRtenBmavOkFHCBCekxhrvoEzwAKRlNnD+9daVkI= +github.com/coredns/corefile-migration v1.0.35/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -55,8 +55,8 @@ github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6O github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -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/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/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= @@ -77,8 +77,6 @@ github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= 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.29.0 h1:fEG+Ja3YRwNOqnQxTyJwoByAUAvTuxUGiro/jhrm4F4= github.com/google/cel-go v0.29.0/go.mod h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= @@ -139,24 +137,25 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.28.3 h1:4JvMdwtFU0imd8fHx25OJXoDMRexnf8v5NHKYSTTji4= -github.com/onsi/ginkgo/v2 v2.28.3/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= -github.com/onsi/gomega v1.40.0 h1:Vtol0e1MghCD2ZVIilPDIg44XSL9l2QAn8ZNaljWcJc= -github.com/onsi/gomega v1.40.0/go.mod h1:M/Uqpu/8qTjtzCLUA2zJHX9Iilrau25x1PdoSRbWh5A= +github.com/onsi/ginkgo/v2 v2.32.0 h1:Hw7s2pVrQo/8Yz5N77qdnpHaoc+c6cC9WIV1Jce+J6E= +github.com/onsi/ginkgo/v2 v2.32.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= +github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I= +github.com/onsi/gomega v1.42.1/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= 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/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= 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.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -194,20 +193,20 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -216,44 +215,44 @@ go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= -go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= -golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= -golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk= -golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= -golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ= -golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/crypto v0.56.0 h1:GUh5Ii4J5jtcseSMiRqr1jXCNHoxjeV9Fmekc2oLy6Y= +golang.org/x/crypto v0.56.0/go.mod h1:OMW5y6CY9l38uPLmxU6l6pwcXp1obtLo3e6gT7gQR2I= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= +golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= +golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= +golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= +golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc= -golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= -golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus= -golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= -golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= -golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q= -golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= +golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= -google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= -google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.83.1 h1:HIO0+BEtBP6soyqvqC8sNUjZ7bTs+0hFQuFF+RAy++Y= +google.golang.org/grpc v1.83.1/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -266,37 +265,41 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.35.8 h1:hxpmPYdneQPKNh0cZyB09Hwd3vgXzdcJs5R3toDXsvU= -k8s.io/api v0.35.8/go.mod h1:I5gVNknFd4hfVVcMCixrenD7V38JUY78q3jtpGyC19c= -k8s.io/apiextensions-apiserver v0.35.8 h1:2lvyZ28M01/1uOPftaPXIbsOaCslzKHTEcdCjCI0VRE= -k8s.io/apiextensions-apiserver v0.35.8/go.mod h1:/ZbM1upeajFY5yHqGMKEzWTLb5Tx3kU2SkxTCtqB4Uw= -k8s.io/apimachinery v0.35.8 h1:piOyQQgse1sGztJVfy3B8f11YpT+KwK5KkD5Jie1EK0= -k8s.io/apimachinery v0.35.8/go.mod h1:z9Vq5oR1X38pkhh0wV531iKSeqmOVjqgHdYMjvzq2+o= -k8s.io/apiserver v0.35.8 h1:DuwdXkMrrNi6ovUaQk9EZhIgP7cDaWOvNP/CvrLJNfM= -k8s.io/apiserver v0.35.8/go.mod h1:97kTXpbFyeZwLcrK5hRYfc9ZfM3T7D4oYC0WXsJoXXM= -k8s.io/client-go v0.35.8 h1:tIW2sirCQMiGoCSvtOYqS059CDQ5n1nrDQa+PVt4nqY= -k8s.io/client-go v0.35.8/go.mod h1:fT8dATMU8FHMq4hlOudbsxihQ1LIQfDaLNDXBnIk6OQ= -k8s.io/cluster-bootstrap v0.35.4 h1:XAOSQ+4dvUPdksaVHp/C9rq0XlFmF3UHkx4KGgNgaU4= -k8s.io/cluster-bootstrap v0.35.4/go.mod h1:9tlzRvPEjXAhKV2cok7pJLnMjiRgKZdT9IR3iJzksek= -k8s.io/component-base v0.35.8 h1:71CLVx1zho3wxSpKroYAzaV5e1yexwWFQqUxIEimGGk= -k8s.io/component-base v0.35.8/go.mod h1:kM4Ide4Gh+bdZElhhgVvx5fC7oK39Smy8F3PbxEvV5o= -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-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= -k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/cluster-api v1.13.5 h1:RH6xfpOhKvQSJf5LxQWWbhXkc9Y1DXvQCkiscYvkAdc= -sigs.k8s.io/cluster-api v1.13.5/go.mod h1:LalzJFvxSP1GQJreWrqeXWaLlUD0X5Z8+tgMyQW+9mE= -sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80= -sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= +k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w= +k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg= +k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0= +k8s.io/apiextensions-apiserver v0.36.3/go.mod h1:KTXFqgXiuw2pRoL+Wpmttqc+up9Xt/GohadPWeLLOa4= +k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM= +k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE= +k8s.io/apiserver v0.36.3 h1:MGSg2SkdfuytiDEcRylT5mQFmmSsbx90XFUO67Y4bsQ= +k8s.io/apiserver v0.36.3/go.mod h1:fVH7zv9EUNUA7Fl7LtDKh8aB9W7u1VQPSGtWV5SjUxg= +k8s.io/client-go v0.36.3 h1:M4JdVzXxYcZk4fGpfDdYnxSwhLKWCFoQsHW6t+z8Hfg= +k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30= +k8s.io/cluster-bootstrap v0.36.3 h1:pyPFVCjsHrwl3mIQV3dp7YuXn//1DHVpCDzpcjqF6tI= +k8s.io/cluster-bootstrap v0.36.3/go.mod h1:yWUirkNm9DKtLZhGP/lbdJAIU9iUuH/Z9NDdZnkutAk= +k8s.io/component-base v0.36.3 h1:vc/UFvPCkW0irPz84LAodAL1j3f4xktPM6dDJIEheAY= +k8s.io/component-base v0.36.3/go.mod h1:hZbNFG+gCMl9EbykDGEu73feKP9/Cq6JsV4pTo9GTO8= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= +k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w= +k8s.io/streaming v0.36.3/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/cluster-api v1.14.2 h1:o3GFNaeNFAOEEMpDPfhCK+2CjmV6gtQ8yLEcUwCg7bA= +sigs.k8s.io/cluster-api v1.14.2/go.mod h1:QGMq7dEyUsceFGBLIrnPDVmX2J316yfY20Woq1S9GuU= +sigs.k8s.io/cluster-api/api v1.14.2 h1:B0XWZGFrb4+R1pH2nApdR9d4tcQGIhpEquRxxf36fHg= +sigs.k8s.io/cluster-api/api v1.14.2/go.mod h1:LJ/5hdS9tqTBi9YqyLRnd1t53Sn/cXsa7rEVaY0bBms= +sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= +sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2 h1:qdOxHwrl2Kaag1aQEarlYcOA9vSyGCp3CIki3aW8c4Q= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/hack/tools/go.mod b/hack/tools/go.mod index 7b6a2015..5cd05cba 100644 --- a/hack/tools/go.mod +++ b/hack/tools/go.mod @@ -2,20 +2,20 @@ module sigs.k8s.io/cluster-api-provider-cloudstack/hack/tools go 1.26.0 -require sigs.k8s.io/cluster-api/hack/tools v0.0.0-20260811155519-4b85c3d44290 +require sigs.k8s.io/cluster-api/hack/tools v0.0.0-20260912202113-4e137920d8cf require ( github.com/blang/semver/v4 v4.0.0 // indirect - github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/logr v1.4.4 // indirect github.com/pkg/errors v0.9.1 // indirect - k8s.io/apimachinery v0.35.8 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect + k8s.io/apimachinery v0.36.3 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000 // indirect - sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d // indirect + sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20260611053758-c72b289c1ec8 // indirect ) replace ( - sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.13.5 - sigs.k8s.io/cluster-api/test => sigs.k8s.io/cluster-api/test v1.13.5 + sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.14.2 + sigs.k8s.io/cluster-api/test => sigs.k8s.io/cluster-api/test v1.14.2 ) diff --git a/hack/tools/go.sum b/hack/tools/go.sum index 9a65be6e..e0f12730 100644 --- a/hack/tools/go.sum +++ b/hack/tools/go.sum @@ -2,12 +2,12 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 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/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= -github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= +github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I= +github.com/onsi/gomega v1.42.1/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -16,21 +16,21 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= -golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus= -golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= +golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= +golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/apimachinery v0.35.8 h1:piOyQQgse1sGztJVfy3B8f11YpT+KwK5KkD5Jie1EK0= -k8s.io/apimachinery v0.35.8/go.mod h1:z9Vq5oR1X38pkhh0wV531iKSeqmOVjqgHdYMjvzq2+o= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/cluster-api v1.13.5 h1:RH6xfpOhKvQSJf5LxQWWbhXkc9Y1DXvQCkiscYvkAdc= -sigs.k8s.io/cluster-api v1.13.5/go.mod h1:LalzJFvxSP1GQJreWrqeXWaLlUD0X5Z8+tgMyQW+9mE= -sigs.k8s.io/cluster-api/hack/tools v0.0.0-20260811155519-4b85c3d44290 h1:3M87dNpTaD/l/NEsvGHuxCDwtu89DpN1zxdJl3Q5930= -sigs.k8s.io/cluster-api/hack/tools v0.0.0-20260811155519-4b85c3d44290/go.mod h1:XhLj3VJfn1DYhf8+9WIxdnF+1jGRBq9iKjSeMuUPBXg= -sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d h1:KLiQzLW3RZJR19+j4pw2h5iioyAyqCkDBEAFdnGa3N8= -sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d/go.mod h1:NRdZafr4zSCseLQggdvIMXa7umxf+Q+PJzrj3wFwiGE= +k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM= +k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM= +k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +sigs.k8s.io/cluster-api v1.14.2 h1:o3GFNaeNFAOEEMpDPfhCK+2CjmV6gtQ8yLEcUwCg7bA= +sigs.k8s.io/cluster-api v1.14.2/go.mod h1:QGMq7dEyUsceFGBLIrnPDVmX2J316yfY20Woq1S9GuU= +sigs.k8s.io/cluster-api/hack/tools v0.0.0-20260912202113-4e137920d8cf h1:RB87eIvIPOtaJhM295Az2uQRGNIJ9URZ7yY5k0juc+o= +sigs.k8s.io/cluster-api/hack/tools v0.0.0-20260912202113-4e137920d8cf/go.mod h1:CS0z6ga2QfxqqJSVonKqczQkVwm4r1X8sHxiTcAdV4Q= +sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20260611053758-c72b289c1ec8 h1:WQFJf05iNLy4/Gp2is7sW4C70lmh+fNSEspeNaeNP4E= +sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20260611053758-c72b289c1ec8/go.mod h1:7VHLn3+d4NLLgk4eaoXQVnhhbV0XA0MB66sVsJbPhMQ= diff --git a/pkg/cloud/isolated_network.go b/pkg/cloud/isolated_network.go index 39efe9a2..05d081af 100644 --- a/pkg/cloud/isolated_network.go +++ b/pkg/cloud/isolated_network.go @@ -27,7 +27,6 @@ import ( "github.com/hashicorp/go-multierror" "github.com/pkg/errors" utilsnet "k8s.io/utils/net" - "sigs.k8s.io/cluster-api/util/record" infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3" capcstrings "sigs.k8s.io/cluster-api-provider-cloudstack/pkg/utils/strings" @@ -686,7 +685,9 @@ func getCanonicalAllowedCIDRs(isoNet *infrav1.CloudStackIsolatedNetwork, csClust allowedCIDRs = append(allowedCIDRs, "0.0.0.0/0") } - // Filter invalid CIDRs and convert any IPs into CIDRs. + // Filter invalid CIDRs and convert any IPs into CIDRs. Entries that are + // neither a valid IPv4 address nor a valid IPv4 CIDR are dropped and never + // make it into a firewall rule. validCIDRs := []string{} for _, v := range allowedCIDRs { switch { @@ -694,8 +695,6 @@ func getCanonicalAllowedCIDRs(isoNet *infrav1.CloudStackIsolatedNetwork, csClust validCIDRs = append(validCIDRs, v+"/32") case utilsnet.IsIPv4CIDRString(v): validCIDRs = append(validCIDRs, v) - default: - record.Warnf(csCluster, "FailedIPAddressValidation", "%s is not a valid IPv4 nor CIDR address and will not get applied to firewall rules", v) } } @@ -807,9 +806,6 @@ func (c *client) AssignVMToLoadBalancerRules(isoNet *infrav1.CloudStackIsolatedN if isLBRuleNotFound(err) { // The load balancer rule no longer exists in CloudStack. Skip it; the // isolated network controller will re-create it on its next reconciliation. - record.Warnf(isoNet, "LoadBalancerRuleNotFound", - "Load balancer rule %s no longer exists, skipping assignment for instance %s", lbRuleID, instanceID) - continue } c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) @@ -855,9 +851,6 @@ func (c *client) RemoveVMFromLoadBalancerRules(isoNet *infrav1.CloudStackIsolate if isLBRuleNotFound(err) { // The load balancer rule no longer exists in CloudStack, so the VM // is implicitly not assigned to it. Skip it. - record.Warnf(isoNet, "LoadBalancerRuleNotFound", - "Load balancer rule %s no longer exists, skipping removal for instance %s", lbRuleID, instanceID) - continue } c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) diff --git a/pkg/scope/hash.go b/pkg/scope/hash.go index 66f7a8e2..95dff8a1 100644 --- a/pkg/scope/hash.go +++ b/pkg/scope/hash.go @@ -5,7 +5,7 @@ import ( "hash" "hash/fnv" - "k8s.io/apimachinery/pkg/util/dump" + "k8s.io/utils/dump" ) // HashConfig returns the hash of the config. It is used as the key for the client cache. diff --git a/test/e2e/config/cloudstack.yaml b/test/e2e/config/cloudstack.yaml index be715cb2..c441b1d8 100644 --- a/test/e2e/config/cloudstack.yaml +++ b/test/e2e/config/cloudstack.yaml @@ -15,13 +15,13 @@ images: ## PLEASE KEEP THESE UP TO DATE WITH THE COMPONENTS # Cluster API v1beta1 Preloads - - name: gcr.io/k8s-staging-cluster-api/cluster-api-controller:v1.13.5 + - name: gcr.io/k8s-staging-cluster-api/cluster-api-controller:v1.14.2 loadBehavior: tryLoad - - name: gcr.io/k8s-staging-cluster-api/kubeadm-bootstrap-controller:v1.13.5 + - name: gcr.io/k8s-staging-cluster-api/kubeadm-bootstrap-controller:v1.14.2 loadBehavior: tryLoad - - name: gcr.io/k8s-staging-cluster-api/kubeadm-control-plane-controller:v1.13.5 + - name: gcr.io/k8s-staging-cluster-api/kubeadm-control-plane-controller:v1.14.2 loadBehavior: tryLoad - - name: gcr.io/k8s-staging-cluster-api/capd-manager-amd64:v1.13.5 + - name: gcr.io/k8s-staging-cluster-api/capd-manager-amd64:v1.14.2 loadBehavior: tryLoad - name: quay.io/jetstack/cert-manager-cainjector:v1.21.1 loadBehavior: tryLoad @@ -34,8 +34,8 @@ providers: - name: cluster-api type: CoreProvider versions: - - name: v1.13.5 - value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.13.5/core-components.yaml" + - name: v1.14.2 + value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.14.2/core-components.yaml" type: "url" contract: v1beta2 replacements: @@ -47,8 +47,8 @@ providers: - name: kubeadm type: BootstrapProvider versions: - - name: v1.13.5 - value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.13.5/bootstrap-components.yaml" + - name: v1.14.2 + value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.14.2/bootstrap-components.yaml" type: "url" contract: v1beta2 replacements: @@ -60,8 +60,8 @@ providers: - name: kubeadm type: ControlPlaneProvider versions: - - name: v1.13.5 - value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.13.5/control-plane-components.yaml" + - name: v1.14.2 + value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.14.2/control-plane-components.yaml" type: "url" contract: v1beta2 replacements: diff --git a/test/e2e/data/shared/v1beta1/metadata.yaml b/test/e2e/data/shared/v1beta1/metadata.yaml index 15003fd6..6aa3a33d 100644 --- a/test/e2e/data/shared/v1beta1/metadata.yaml +++ b/test/e2e/data/shared/v1beta1/metadata.yaml @@ -1,6 +1,12 @@ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 kind: Metadata releaseSeries: + - major: 1 + minor: 14 + contract: v1beta2 + - major: 1 + minor: 13 + contract: v1beta2 - major: 1 minor: 12 contract: v1beta2 diff --git a/test/e2e/go.mod b/test/e2e/go.mod index 4dfe6a2f..59d40ab9 100644 --- a/test/e2e/go.mod +++ b/test/e2e/go.mod @@ -6,16 +6,17 @@ require ( github.com/Shopify/toxiproxy/v2 v2.12.0 github.com/apache/cloudstack-go/v2 v2.17.1 github.com/blang/semver v3.5.1+incompatible - github.com/onsi/ginkgo/v2 v2.28.3 - github.com/onsi/gomega v1.40.0 + github.com/onsi/ginkgo/v2 v2.32.0 + github.com/onsi/gomega v1.42.1 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.35.8 - k8s.io/apimachinery v0.35.8 - k8s.io/klog/v2 v2.130.1 - k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 - sigs.k8s.io/cluster-api v1.13.5 - sigs.k8s.io/cluster-api/test v1.13.5 - sigs.k8s.io/controller-runtime v0.23.3 + k8s.io/api v0.36.3 + k8s.io/apimachinery v0.36.3 + k8s.io/klog/v2 v2.140.0 + k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 + sigs.k8s.io/cluster-api v1.14.2 + sigs.k8s.io/cluster-api/api v1.14.2 + sigs.k8s.io/cluster-api/test v1.14.2 + sigs.k8s.io/controller-runtime v0.24.1 ) require ( @@ -28,6 +29,8 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/clipperhouse/displaywidth v0.10.0 // indirect + github.com/clipperhouse/uax29/v2 v2.6.0 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -41,7 +44,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect - github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -49,41 +52,41 @@ require ( github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gobuffalo/flect v1.0.3 // indirect - github.com/google/btree v1.1.3 // indirect github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-github/v82 v82.0.0 // indirect github.com/google/go-querystring v1.2.0 // indirect github.com/google/pprof v0.0.0-20260402051712-545e8a4df936 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect - github.com/moby/moby/api v1.54.2 // indirect - github.com/moby/moby/client v0.4.1 // indirect + github.com/moby/moby/api v1.55.0 // indirect + github.com/moby/moby/client v0.5.1 // indirect + github.com/moby/spdystream v0.5.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect - github.com/olekukonko/errors v1.1.0 // indirect - github.com/olekukonko/ll v0.1.1 // indirect - github.com/olekukonko/tablewriter v1.0.9 // indirect + github.com/olekukonko/errors v1.2.0 // indirect + github.com/olekukonko/ll v0.1.6 // indirect + github.com/olekukonko/tablewriter v1.1.4 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.66.1 // indirect - github.com/prometheus/procfs v0.16.1 // indirect - github.com/rivo/uniseg v0.4.7 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.19.2 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect @@ -95,35 +98,36 @@ require ( github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect go.uber.org/mock v0.5.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/mod v0.37.0 // indirect - golang.org/x/net v0.56.0 // indirect + golang.org/x/mod v0.38.0 // indirect + golang.org/x/net v0.57.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.21.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/term v0.44.0 // indirect - golang.org/x/text v0.39.0 // indirect - golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.47.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/term v0.45.0 // indirect + golang.org/x/text v0.41.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.48.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - k8s.io/apiextensions-apiserver v0.35.8 // indirect - k8s.io/apiserver v0.35.8 // indirect - k8s.io/client-go v0.35.8 // indirect - k8s.io/cluster-bootstrap v0.35.4 // indirect - k8s.io/component-base v0.35.8 // indirect - k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect + k8s.io/apiextensions-apiserver v0.36.3 // indirect + k8s.io/apiserver v0.36.3 // indirect + k8s.io/client-go v0.36.3 // indirect + k8s.io/cluster-bootstrap v0.36.3 // indirect + k8s.io/component-base v0.36.3 // indirect + k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect + k8s.io/streaming v0.36.3 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect - sigs.k8s.io/kind v0.32.0 // indirect + sigs.k8s.io/kind v0.33.0 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.2 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/test/e2e/go.sum b/test/e2e/go.sum index 1ae08984..307f447c 100644 --- a/test/e2e/go.sum +++ b/test/e2e/go.sum @@ -1,7 +1,7 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= +cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= 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/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= @@ -24,6 +24,8 @@ github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYW github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/apache/cloudstack-go/v2 v2.17.1 h1:XD0bGDOv+MCavXJfc/qxILgJh+cHJbudpqQ1FzA2sDI= github.com/apache/cloudstack-go/v2 v2.17.1/go.mod h1:p/YBUwIEkQN6CQxFhw8Ff0wzf1MY0qRRRuGYNbcb1F8= +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/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= @@ -34,14 +36,18 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/clipperhouse/displaywidth v0.10.0 h1:GhBG8WuerxjFQQYeuZAeVTuyxuX+UraiZGD4HJQ3Y8g= +github.com/clipperhouse/displaywidth v0.10.0/go.mod h1:XqJajYsaiEwkxOj4bowCTMcT1SgvHo9flfF3jQasdbs= +github.com/clipperhouse/uax29/v2 v2.6.0 h1:z0cDbUV+aPASdFb2/ndFnS9ts/WNXgTNNGFoKXuhpos= +github.com/clipperhouse/uax29/v2 v2.6.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= 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/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.34 h1:Evzog/Av6/EQVy/xEAVZo2wsYAWMirIlunDfXxLg5Hk= -github.com/coredns/corefile-migration v1.0.34/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= +github.com/coredns/corefile-migration v1.0.35 h1:kZ4NRtenBmavOkFHCBCekxhrvoEzwAKRlNnD+9daVkI= +github.com/coredns/corefile-migration v1.0.35/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -79,8 +85,8 @@ github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6O github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -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/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/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= @@ -101,8 +107,6 @@ github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4 github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -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.29.0 h1:fEG+Ja3YRwNOqnQxTyJwoByAUAvTuxUGiro/jhrm4F4= github.com/google/cel-go v0.29.0/go.mod h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= @@ -124,6 +128,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/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/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= @@ -155,8 +161,8 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -165,10 +171,12 @@ 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/moby/api v1.54.2 h1:wiat9QAhnDQjA7wk1kh/TqHz2I1uUA7M7t9SAl/JNXg= -github.com/moby/moby/api v1.54.2/go.mod h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs= -github.com/moby/moby/client v0.4.1 h1:DMQgisVoMkmMs7fp3ROSdiBnoAu8+vo3GggFl06M/wY= -github.com/moby/moby/client v0.4.1/go.mod h1:z52C9O2POPOsnxZAy//WtKcQ32P+jT/NGeXu/7nfjGQ= +github.com/moby/moby/api v1.55.0 h1:2/sexvQyqIWS8pRSCFddBfpW2qE7vR7FCL+vN8pxwMc= +github.com/moby/moby/api v1.55.0/go.mod h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs= +github.com/moby/moby/client v0.5.1 h1:tYNaJno4c0HXz12y5BiqEDy0rVTYkWzI26lGvnTMiJw= +github.com/moby/moby/client v0.5.1/go.mod h1:odLstlZ6uSnfvAgVxMpvgmb8SUdd+siH2T0GBuxVAlM= +github.com/moby/spdystream v0.5.1 h1:9sNYeYZUcci9R6/w7KDaFWEWeV4LStVG78Mpyq/Zm/Y= +github.com/moby/spdystream v0.5.1/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= 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= @@ -179,16 +187,16 @@ 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/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc= github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0= -github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= -github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= -github.com/olekukonko/ll v0.1.1 h1:9Dfeed5/Mgaxb9lHRAftLK9pVfYETvHn+If6lywVhJc= -github.com/olekukonko/ll v0.1.1/go.mod h1:2dJo+hYZcJMLMbKwHEWvxCUbAOLc/CXWS9noET22Mdo= -github.com/olekukonko/tablewriter v1.0.9 h1:XGwRsYLC2bY7bNd93Dk51bcPZksWZmLYuaTHR0FqfL8= -github.com/olekukonko/tablewriter v1.0.9/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo= -github.com/onsi/ginkgo/v2 v2.28.3 h1:4JvMdwtFU0imd8fHx25OJXoDMRexnf8v5NHKYSTTji4= -github.com/onsi/ginkgo/v2 v2.28.3/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= -github.com/onsi/gomega v1.40.0 h1:Vtol0e1MghCD2ZVIilPDIg44XSL9l2QAn8ZNaljWcJc= -github.com/onsi/gomega v1.40.0/go.mod h1:M/Uqpu/8qTjtzCLUA2zJHX9Iilrau25x1PdoSRbWh5A= +github.com/olekukonko/errors v1.2.0 h1:10Zcn4GeV59t/EGqJc8fUjtFT/FuUh5bTMzZ1XwmCRo= +github.com/olekukonko/errors v1.2.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.1.6 h1:lGVTHO+Qc4Qm+fce/2h2m5y9LvqaW+DCN7xW9hsU3uA= +github.com/olekukonko/ll v0.1.6/go.mod h1:NVUmjBb/aCtUpjKk75BhWrOlARz3dqsM+OtszpY4o88= +github.com/olekukonko/tablewriter v1.1.4 h1:ORUMI3dXbMnRlRggJX3+q7OzQFDdvgbN9nVWj1drm6I= +github.com/olekukonko/tablewriter v1.1.4/go.mod h1:+kedxuyTtgoZLwif3P1Em4hARJs+mVnzKxmsCL/C5RY= +github.com/onsi/ginkgo/v2 v2.32.0 h1:Hw7s2pVrQo/8Yz5N77qdnpHaoc+c6cC9WIV1Jce+J6E= +github.com/onsi/ginkgo/v2 v2.32.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= +github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I= +github.com/onsi/gomega v1.42.1/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= 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= @@ -199,19 +207,17 @@ github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0 github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= -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/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= 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.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -259,20 +265,20 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -281,43 +287,43 @@ go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= -go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= -golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= -golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= -golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= -golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ= -golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/crypto v0.56.0 h1:GUh5Ii4J5jtcseSMiRqr1jXCNHoxjeV9Fmekc2oLy6Y= +golang.org/x/crypto v0.56.0/go.mod h1:OMW5y6CY9l38uPLmxU6l6pwcXp1obtLo3e6gT7gQR2I= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= +golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= +golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= +golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= +golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc= -golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= -golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus= -golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= -golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q= -golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= +golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= -google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= -google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.83.1 h1:HIO0+BEtBP6soyqvqC8sNUjZ7bTs+0hFQuFF+RAy++Y= +google.golang.org/grpc v1.83.1/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -332,43 +338,47 @@ 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.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -k8s.io/api v0.35.8 h1:hxpmPYdneQPKNh0cZyB09Hwd3vgXzdcJs5R3toDXsvU= -k8s.io/api v0.35.8/go.mod h1:I5gVNknFd4hfVVcMCixrenD7V38JUY78q3jtpGyC19c= -k8s.io/apiextensions-apiserver v0.35.8 h1:2lvyZ28M01/1uOPftaPXIbsOaCslzKHTEcdCjCI0VRE= -k8s.io/apiextensions-apiserver v0.35.8/go.mod h1:/ZbM1upeajFY5yHqGMKEzWTLb5Tx3kU2SkxTCtqB4Uw= -k8s.io/apimachinery v0.35.8 h1:piOyQQgse1sGztJVfy3B8f11YpT+KwK5KkD5Jie1EK0= -k8s.io/apimachinery v0.35.8/go.mod h1:z9Vq5oR1X38pkhh0wV531iKSeqmOVjqgHdYMjvzq2+o= -k8s.io/apiserver v0.35.8 h1:DuwdXkMrrNi6ovUaQk9EZhIgP7cDaWOvNP/CvrLJNfM= -k8s.io/apiserver v0.35.8/go.mod h1:97kTXpbFyeZwLcrK5hRYfc9ZfM3T7D4oYC0WXsJoXXM= -k8s.io/client-go v0.35.8 h1:tIW2sirCQMiGoCSvtOYqS059CDQ5n1nrDQa+PVt4nqY= -k8s.io/client-go v0.35.8/go.mod h1:fT8dATMU8FHMq4hlOudbsxihQ1LIQfDaLNDXBnIk6OQ= -k8s.io/cluster-bootstrap v0.35.4 h1:XAOSQ+4dvUPdksaVHp/C9rq0XlFmF3UHkx4KGgNgaU4= -k8s.io/cluster-bootstrap v0.35.4/go.mod h1:9tlzRvPEjXAhKV2cok7pJLnMjiRgKZdT9IR3iJzksek= -k8s.io/component-base v0.35.8 h1:71CLVx1zho3wxSpKroYAzaV5e1yexwWFQqUxIEimGGk= -k8s.io/component-base v0.35.8/go.mod h1:kM4Ide4Gh+bdZElhhgVvx5fC7oK39Smy8F3PbxEvV5o= -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-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= -k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w= +k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg= +k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0= +k8s.io/apiextensions-apiserver v0.36.3/go.mod h1:KTXFqgXiuw2pRoL+Wpmttqc+up9Xt/GohadPWeLLOa4= +k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM= +k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE= +k8s.io/apiserver v0.36.3 h1:MGSg2SkdfuytiDEcRylT5mQFmmSsbx90XFUO67Y4bsQ= +k8s.io/apiserver v0.36.3/go.mod h1:fVH7zv9EUNUA7Fl7LtDKh8aB9W7u1VQPSGtWV5SjUxg= +k8s.io/client-go v0.36.3 h1:M4JdVzXxYcZk4fGpfDdYnxSwhLKWCFoQsHW6t+z8Hfg= +k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30= +k8s.io/cluster-bootstrap v0.36.3 h1:pyPFVCjsHrwl3mIQV3dp7YuXn//1DHVpCDzpcjqF6tI= +k8s.io/cluster-bootstrap v0.36.3/go.mod h1:yWUirkNm9DKtLZhGP/lbdJAIU9iUuH/Z9NDdZnkutAk= +k8s.io/component-base v0.36.3 h1:vc/UFvPCkW0irPz84LAodAL1j3f4xktPM6dDJIEheAY= +k8s.io/component-base v0.36.3/go.mod h1:hZbNFG+gCMl9EbykDGEu73feKP9/Cq6JsV4pTo9GTO8= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= +k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w= +k8s.io/streaming v0.36.3/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/cluster-api v1.13.5 h1:RH6xfpOhKvQSJf5LxQWWbhXkc9Y1DXvQCkiscYvkAdc= -sigs.k8s.io/cluster-api v1.13.5/go.mod h1:LalzJFvxSP1GQJreWrqeXWaLlUD0X5Z8+tgMyQW+9mE= -sigs.k8s.io/cluster-api/test v1.13.5 h1:zA0p1ExH7zx79siE5IDIpuL0w5Vt7WP2F1KxTRaw6ak= -sigs.k8s.io/cluster-api/test v1.13.5/go.mod h1:Q+HhpGGQF35TODSwVxg+dLhjK/JN776Mc2+ydSGiOno= -sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80= -sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/cluster-api v1.14.2 h1:o3GFNaeNFAOEEMpDPfhCK+2CjmV6gtQ8yLEcUwCg7bA= +sigs.k8s.io/cluster-api v1.14.2/go.mod h1:QGMq7dEyUsceFGBLIrnPDVmX2J316yfY20Woq1S9GuU= +sigs.k8s.io/cluster-api/api v1.14.2 h1:B0XWZGFrb4+R1pH2nApdR9d4tcQGIhpEquRxxf36fHg= +sigs.k8s.io/cluster-api/api v1.14.2/go.mod h1:LJ/5hdS9tqTBi9YqyLRnd1t53Sn/cXsa7rEVaY0bBms= +sigs.k8s.io/cluster-api/test v1.14.2 h1:nZ/Ql57cR7Huwqd7o3X+2AFSg5kcAmSTUZovLwzIhIs= +sigs.k8s.io/cluster-api/test v1.14.2/go.mod h1:xkOSqS/oubBOl9hMep16P/U3IdxpMI/chDunwf1pvpA= +sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= +sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/kind v0.32.0 h1:p9hscbj98u/qyrjVpjId86LI70nQmbSsipV7wCG10Xk= -sigs.k8s.io/kind v0.32.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= +sigs.k8s.io/kind v0.33.0 h1:AjvDv3vOygb/VKLVQW87lfktIBzkxR8Ump9DjxC8+Lk= +sigs.k8s.io/kind v0.33.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2 h1:qdOxHwrl2Kaag1aQEarlYcOA9vSyGCp3CIki3aW8c4Q= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/test/helpers/envtest.go b/test/helpers/envtest.go index e1226838..e7340d0a 100644 --- a/test/helpers/envtest.go +++ b/test/helpers/envtest.go @@ -317,7 +317,10 @@ func getFilePathToCAPICRDs(root string) string { } gopath := envOr("GOPATH", build.Default.GOPATH) - return filepath.Join(gopath, "pkg", "mod", "sigs.k8s.io", fmt.Sprintf("cluster-api@v%s", clusterAPIVersion), "config", "crd", "bases") + + // Since CAPI v1.14 the core provider manifests live under core/config instead + // of config, as a result of the upstream code organization proposal. + return filepath.Join(gopath, "pkg", "mod", "sigs.k8s.io", fmt.Sprintf("cluster-api@v%s", clusterAPIVersion), "core", "config", "crd", "bases") } func envOr(envKey, defaultValue string) string { From 4b5b34fa1b7347c2dedd727444c6e94d98d5786e Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 09:38:03 +0300 Subject: [PATCH 02/10] chore(deps): Bump the k8s.io group to v0.36.4 Applies the patch bump across all three modules, so root, hack/tools and test/e2e keep resolving the same Kubernetes library versions. The bumped set is api, apiextensions-apiserver, apimachinery, apiserver, client-go, cluster-bootstrap, component-base and streaming. k8s.io/streaming is new to the group as of the CAPI 1.14.2 bump; it was split out of the core libraries in Kubernetes 1.36 and arrives via k8s.io/apiserver. No broad update was run, so no unrelated transitive drift is pulled in. CAPI v1.14.2 itself requires v0.36.3, which module resolution simply takes the higher of. Co-Authored-By: Claude Opus 5 (1M context) --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- hack/tools/go.mod | 2 +- hack/tools/go.sum | 4 ++-- test/e2e/go.mod | 16 ++++++++-------- test/e2e/go.sum | 32 ++++++++++++++++---------------- 6 files changed, 51 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 2dd49a3b..f4e1e0b5 100644 --- a/go.mod +++ b/go.mod @@ -16,11 +16,11 @@ require ( go.uber.org/mock v0.6.0 golang.org/x/text v0.41.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.36.3 - k8s.io/apiextensions-apiserver v0.36.3 - k8s.io/apimachinery v0.36.3 - k8s.io/client-go v0.36.3 - k8s.io/component-base v0.36.3 + k8s.io/api v0.36.4 + k8s.io/apiextensions-apiserver v0.36.4 + k8s.io/apimachinery v0.36.4 + k8s.io/client-go v0.36.4 + k8s.io/component-base v0.36.4 k8s.io/klog/v2 v2.140.0 k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 sigs.k8s.io/cluster-api v1.14.2 @@ -97,10 +97,10 @@ require ( google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - k8s.io/apiserver v0.36.3 // indirect - k8s.io/cluster-bootstrap v0.36.3 // indirect + k8s.io/apiserver v0.36.4 // indirect + k8s.io/cluster-bootstrap v0.36.4 // indirect k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect - k8s.io/streaming v0.36.3 // indirect + k8s.io/streaming v0.36.4 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect diff --git a/go.sum b/go.sum index 5cad2ceb..684f2b57 100644 --- a/go.sum +++ b/go.sum @@ -265,26 +265,26 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w= -k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg= -k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0= -k8s.io/apiextensions-apiserver v0.36.3/go.mod h1:KTXFqgXiuw2pRoL+Wpmttqc+up9Xt/GohadPWeLLOa4= -k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM= -k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE= -k8s.io/apiserver v0.36.3 h1:MGSg2SkdfuytiDEcRylT5mQFmmSsbx90XFUO67Y4bsQ= -k8s.io/apiserver v0.36.3/go.mod h1:fVH7zv9EUNUA7Fl7LtDKh8aB9W7u1VQPSGtWV5SjUxg= -k8s.io/client-go v0.36.3 h1:M4JdVzXxYcZk4fGpfDdYnxSwhLKWCFoQsHW6t+z8Hfg= -k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30= -k8s.io/cluster-bootstrap v0.36.3 h1:pyPFVCjsHrwl3mIQV3dp7YuXn//1DHVpCDzpcjqF6tI= -k8s.io/cluster-bootstrap v0.36.3/go.mod h1:yWUirkNm9DKtLZhGP/lbdJAIU9iUuH/Z9NDdZnkutAk= -k8s.io/component-base v0.36.3 h1:vc/UFvPCkW0irPz84LAodAL1j3f4xktPM6dDJIEheAY= -k8s.io/component-base v0.36.3/go.mod h1:hZbNFG+gCMl9EbykDGEu73feKP9/Cq6JsV4pTo9GTO8= +k8s.io/api v0.36.4 h1:RxrvqCL6vgH5/+UnTeu1IIFqYmGfy0hnyrod1rn35Oo= +k8s.io/api v0.36.4/go.mod h1:S2B3orCFBDhrgyWbLeuKcT2QdHIpQesBkCYSlWtwUOw= +k8s.io/apiextensions-apiserver v0.36.4 h1:SfvCVt+4CqKWvzuVytYDT5g9hyb9MztoiYELIkPVrFc= +k8s.io/apiextensions-apiserver v0.36.4/go.mod h1:JT9V2Ju7ys1FY4zbSpmX9XOvKB3/BwsODc4hFQEa+Xo= +k8s.io/apimachinery v0.36.4 h1:PT2UzkupGuAx/+xT5XjiMJ1WGpY3fn9/hdAvjweRet4= +k8s.io/apimachinery v0.36.4/go.mod h1:p2I2dipt7JHG+quVwQ1d02d28O4GdDi77RByQ13MTpk= +k8s.io/apiserver v0.36.4 h1:AtKjaf2eUiX5G6TfF2IOlhuUuvMsHh49Ivr1+4fZ2gA= +k8s.io/apiserver v0.36.4/go.mod h1:RyiGghXP67hb0Ll+7iLJ6GGv2JpEzCn7ljbiA+L3cJ0= +k8s.io/client-go v0.36.4 h1:MDvfDNvMSt0Br94SK8neviVlwL9qifw9B26hJCpD1K0= +k8s.io/client-go v0.36.4/go.mod h1:pNK4WKELbwlEDvtbE8l22lEZL5THYF61H5EealokZmA= +k8s.io/cluster-bootstrap v0.36.4 h1:5M50BP7ICe69bZX5hpIt5aWRzvTmc5/aL7hC5syPqJc= +k8s.io/cluster-bootstrap v0.36.4/go.mod h1:5E8V95icgPg1dMiqhMkpZuTiJ+FrF8EASsGyh7SKXgc= +k8s.io/component-base v0.36.4 h1:tz75yC2xgq3kd7vPdBtR8do5iMx0OHf6Zd1kuaxDB84= +k8s.io/component-base v0.36.4/go.mod h1:DCwb306U8ou89NNAp45Csuy8ok+1rp1ELDVPhzN5AWc= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= -k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w= -k8s.io/streaming v0.36.3/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= +k8s.io/streaming v0.36.4 h1:RS5YlhrdBN2pKGVjgygGntdu6SNdsduyjGWGe3cX0vo= +k8s.io/streaming v0.36.4/go.mod h1:tJ6S2bZa2HxIBauguBbCWSCYyd93Grfz1+z3tcOvlDE= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= diff --git a/hack/tools/go.mod b/hack/tools/go.mod index 5cd05cba..45c6ba9e 100644 --- a/hack/tools/go.mod +++ b/hack/tools/go.mod @@ -8,7 +8,7 @@ require ( github.com/blang/semver/v4 v4.0.0 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/pkg/errors v0.9.1 // indirect - k8s.io/apimachinery v0.36.3 // indirect + k8s.io/apimachinery v0.36.4 // indirect k8s.io/klog/v2 v2.140.0 // indirect k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 // indirect sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000 // indirect diff --git a/hack/tools/go.sum b/hack/tools/go.sum index e0f12730..caa21126 100644 --- a/hack/tools/go.sum +++ b/hack/tools/go.sum @@ -22,8 +22,8 @@ golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM= -k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE= +k8s.io/apimachinery v0.36.4 h1:PT2UzkupGuAx/+xT5XjiMJ1WGpY3fn9/hdAvjweRet4= +k8s.io/apimachinery v0.36.4/go.mod h1:p2I2dipt7JHG+quVwQ1d02d28O4GdDi77RByQ13MTpk= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM= diff --git a/test/e2e/go.mod b/test/e2e/go.mod index 59d40ab9..ebc22820 100644 --- a/test/e2e/go.mod +++ b/test/e2e/go.mod @@ -9,8 +9,8 @@ require ( github.com/onsi/ginkgo/v2 v2.32.0 github.com/onsi/gomega v1.42.1 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.36.3 - k8s.io/apimachinery v0.36.3 + k8s.io/api v0.36.4 + k8s.io/apimachinery v0.36.4 k8s.io/klog/v2 v2.140.0 k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 sigs.k8s.io/cluster-api v1.14.2 @@ -118,13 +118,13 @@ require ( google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - k8s.io/apiextensions-apiserver v0.36.3 // indirect - k8s.io/apiserver v0.36.3 // indirect - k8s.io/client-go v0.36.3 // indirect - k8s.io/cluster-bootstrap v0.36.3 // indirect - k8s.io/component-base v0.36.3 // indirect + k8s.io/apiextensions-apiserver v0.36.4 // indirect + k8s.io/apiserver v0.36.4 // indirect + k8s.io/client-go v0.36.4 // indirect + k8s.io/cluster-bootstrap v0.36.4 // indirect + k8s.io/component-base v0.36.4 // indirect k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect - k8s.io/streaming v0.36.3 // indirect + k8s.io/streaming v0.36.4 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/kind v0.33.0 // indirect sigs.k8s.io/randfill v1.0.0 // indirect diff --git a/test/e2e/go.sum b/test/e2e/go.sum index 307f447c..1e4c2ac5 100644 --- a/test/e2e/go.sum +++ b/test/e2e/go.sum @@ -338,26 +338,26 @@ 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.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w= -k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg= -k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0= -k8s.io/apiextensions-apiserver v0.36.3/go.mod h1:KTXFqgXiuw2pRoL+Wpmttqc+up9Xt/GohadPWeLLOa4= -k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM= -k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE= -k8s.io/apiserver v0.36.3 h1:MGSg2SkdfuytiDEcRylT5mQFmmSsbx90XFUO67Y4bsQ= -k8s.io/apiserver v0.36.3/go.mod h1:fVH7zv9EUNUA7Fl7LtDKh8aB9W7u1VQPSGtWV5SjUxg= -k8s.io/client-go v0.36.3 h1:M4JdVzXxYcZk4fGpfDdYnxSwhLKWCFoQsHW6t+z8Hfg= -k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30= -k8s.io/cluster-bootstrap v0.36.3 h1:pyPFVCjsHrwl3mIQV3dp7YuXn//1DHVpCDzpcjqF6tI= -k8s.io/cluster-bootstrap v0.36.3/go.mod h1:yWUirkNm9DKtLZhGP/lbdJAIU9iUuH/Z9NDdZnkutAk= -k8s.io/component-base v0.36.3 h1:vc/UFvPCkW0irPz84LAodAL1j3f4xktPM6dDJIEheAY= -k8s.io/component-base v0.36.3/go.mod h1:hZbNFG+gCMl9EbykDGEu73feKP9/Cq6JsV4pTo9GTO8= +k8s.io/api v0.36.4 h1:RxrvqCL6vgH5/+UnTeu1IIFqYmGfy0hnyrod1rn35Oo= +k8s.io/api v0.36.4/go.mod h1:S2B3orCFBDhrgyWbLeuKcT2QdHIpQesBkCYSlWtwUOw= +k8s.io/apiextensions-apiserver v0.36.4 h1:SfvCVt+4CqKWvzuVytYDT5g9hyb9MztoiYELIkPVrFc= +k8s.io/apiextensions-apiserver v0.36.4/go.mod h1:JT9V2Ju7ys1FY4zbSpmX9XOvKB3/BwsODc4hFQEa+Xo= +k8s.io/apimachinery v0.36.4 h1:PT2UzkupGuAx/+xT5XjiMJ1WGpY3fn9/hdAvjweRet4= +k8s.io/apimachinery v0.36.4/go.mod h1:p2I2dipt7JHG+quVwQ1d02d28O4GdDi77RByQ13MTpk= +k8s.io/apiserver v0.36.4 h1:AtKjaf2eUiX5G6TfF2IOlhuUuvMsHh49Ivr1+4fZ2gA= +k8s.io/apiserver v0.36.4/go.mod h1:RyiGghXP67hb0Ll+7iLJ6GGv2JpEzCn7ljbiA+L3cJ0= +k8s.io/client-go v0.36.4 h1:MDvfDNvMSt0Br94SK8neviVlwL9qifw9B26hJCpD1K0= +k8s.io/client-go v0.36.4/go.mod h1:pNK4WKELbwlEDvtbE8l22lEZL5THYF61H5EealokZmA= +k8s.io/cluster-bootstrap v0.36.4 h1:5M50BP7ICe69bZX5hpIt5aWRzvTmc5/aL7hC5syPqJc= +k8s.io/cluster-bootstrap v0.36.4/go.mod h1:5E8V95icgPg1dMiqhMkpZuTiJ+FrF8EASsGyh7SKXgc= +k8s.io/component-base v0.36.4 h1:tz75yC2xgq3kd7vPdBtR8do5iMx0OHf6Zd1kuaxDB84= +k8s.io/component-base v0.36.4/go.mod h1:DCwb306U8ou89NNAp45Csuy8ok+1rp1ELDVPhzN5AWc= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= -k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w= -k8s.io/streaming v0.36.3/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= +k8s.io/streaming v0.36.4 h1:RS5YlhrdBN2pKGVjgygGntdu6SNdsduyjGWGe3cX0vo= +k8s.io/streaming v0.36.4/go.mod h1:tJ6S2bZa2HxIBauguBbCWSCYyd93Grfz1+z3tcOvlDE= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= From 0a3dc05df9595bd63a2843de16253cae2bfcf7da Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 12:19:15 +0300 Subject: [PATCH 03/10] chore(deps): Bump test libraries and consolidate on blang/semver/v4 Bumps ginkgo to v2.32.2 and gomega to v1.43.0 in both the root module and test/e2e. Keeping the two in step matters here because the Makefile derives GINGKO_VER from the root go.mod, so a root-only bump builds the ginkgo runner from one version while the e2e module compiles against another. Also bumps two unrelated direct dependencies that only had patch or minor updates: jellydator/ttlcache to v3.4.1 and golang.org/x/text to v0.42.0. go mod tidy carries golang.org/x/mod, net, sync and tools along as indirect requirements. test/e2e required github.com/blang/semver v3.5.1+incompatible, a pre-modules version, while already carrying blang/semver/v4 as an indirect requirement. It is now on v4 alone. The only use is a single semver.ParseTolerant call in common.go, whose signature is identical in both versions and whose result is discarded, so the import path is the whole change. Deliberately not bumped: - sigs.k8s.io/controller-runtime v0.24.1 -> v0.25.1. Cluster API v1.14.2 requires v0.24.1, and v0.25 pairs with CAPI v1.15. dependabot already ignores minor bumps here for that reason. - github.com/prometheus/client_golang v1.23.2 -> v1.24.1, which controller-runtime v0.24.1 pins at v1.23.2. dependabot groups prometheus/* with the dependencies upgraded manually alongside controller-runtime, so this rides along with the next bump of it. Co-Authored-By: Claude Opus 5 (1M context) --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- test/e2e/common.go | 2 +- test/e2e/go.mod | 7 +++---- test/e2e/go.sum | 10 ++++------ 5 files changed, 32 insertions(+), 35 deletions(-) diff --git a/go.mod b/go.mod index f4e1e0b5..a941cf6c 100644 --- a/go.mod +++ b/go.mod @@ -7,14 +7,14 @@ require ( github.com/go-logr/logr v1.4.4 github.com/google/go-cmp v0.7.0 github.com/hashicorp/go-multierror v1.1.1 - github.com/jellydator/ttlcache/v3 v3.4.0 - github.com/onsi/ginkgo/v2 v2.32.0 - github.com/onsi/gomega v1.42.1 + github.com/jellydator/ttlcache/v3 v3.4.1 + github.com/onsi/ginkgo/v2 v2.32.2 + github.com/onsi/gomega v1.43.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.23.2 github.com/spf13/pflag v1.0.10 go.uber.org/mock v0.6.0 - golang.org/x/text v0.41.0 + golang.org/x/text v0.42.0 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.36.4 k8s.io/apiextensions-apiserver v0.36.4 @@ -82,14 +82,14 @@ require ( go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect - golang.org/x/mod v0.38.0 // indirect - golang.org/x/net v0.57.0 // indirect + golang.org/x/mod v0.41.0 // indirect + golang.org/x/net v0.58.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.22.0 // indirect + golang.org/x/sync v0.23.0 // indirect golang.org/x/sys v0.47.0 // indirect golang.org/x/term v0.45.0 // indirect golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.48.0 // indirect + golang.org/x/tools v0.49.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect diff --git a/go.sum b/go.sum index 684f2b57..31a3a05f 100644 --- a/go.sum +++ b/go.sum @@ -100,8 +100,8 @@ github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP4mnWdTY= -github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= +github.com/jellydator/ttlcache/v3 v3.4.1 h1:bOdXmXiycyK6E6Qjyuj5vl+/vU3SCOoDs8a86NbHjAQ= +github.com/jellydator/ttlcache/v3 v3.4.1/go.mod h1:j7LO12PNghFg5+0v9budMAT4rDK4JY969jb9vOdOBBk= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= @@ -137,10 +137,10 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.32.0 h1:Hw7s2pVrQo/8Yz5N77qdnpHaoc+c6cC9WIV1Jce+J6E= -github.com/onsi/ginkgo/v2 v2.32.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= -github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I= -github.com/onsi/gomega v1.42.1/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= +github.com/onsi/ginkgo/v2 v2.32.2 h1:2o6vyFvR6snrJWgRVztC+OwuqqPEMI1UzYl2s2iU7Cg= +github.com/onsi/ginkgo/v2 v2.32.2/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= +github.com/onsi/gomega v1.43.0 h1:VlG/1FxqNxhSO+lq/OHBNaaqwiBK/mO8JbVkX9Y+FeU= +github.com/onsi/gomega v1.43.0/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= 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/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -225,24 +225,24 @@ golang.org/x/crypto v0.56.0 h1:GUh5Ii4J5jtcseSMiRqr1jXCNHoxjeV9Fmekc2oLy6Y= golang.org/x/crypto v0.56.0/go.mod h1:OMW5y6CY9l38uPLmxU6l6pwcXp1obtLo3e6gT7gQR2I= golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= -golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= -golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= -golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= -golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= +golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= +golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= -golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= -golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= -golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= +golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= +golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= -golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= diff --git a/test/e2e/common.go b/test/e2e/common.go index f816271a..ca67b6a8 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -30,7 +30,7 @@ import ( "k8s.io/klog/v2" "github.com/apache/cloudstack-go/v2/cloudstack" - "github.com/blang/semver" + "github.com/blang/semver/v4" . "github.com/onsi/ginkgo/v2" corev1 "k8s.io/api/core/v1" diff --git a/test/e2e/go.mod b/test/e2e/go.mod index ebc22820..17e0557a 100644 --- a/test/e2e/go.mod +++ b/test/e2e/go.mod @@ -5,9 +5,9 @@ go 1.26.0 require ( github.com/Shopify/toxiproxy/v2 v2.12.0 github.com/apache/cloudstack-go/v2 v2.17.1 - github.com/blang/semver v3.5.1+incompatible - github.com/onsi/ginkgo/v2 v2.32.0 - github.com/onsi/gomega v1.42.1 + github.com/blang/semver/v4 v4.0.0 + github.com/onsi/ginkgo/v2 v2.32.2 + github.com/onsi/gomega v1.43.0 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.36.4 k8s.io/apimachinery v0.36.4 @@ -27,7 +27,6 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/adrg/xdg v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/clipperhouse/displaywidth v0.10.0 // indirect github.com/clipperhouse/uax29/v2 v2.6.0 // indirect diff --git a/test/e2e/go.sum b/test/e2e/go.sum index 1e4c2ac5..c3e5673e 100644 --- a/test/e2e/go.sum +++ b/test/e2e/go.sum @@ -28,8 +28,6 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= @@ -193,10 +191,10 @@ github.com/olekukonko/ll v0.1.6 h1:lGVTHO+Qc4Qm+fce/2h2m5y9LvqaW+DCN7xW9hsU3uA= github.com/olekukonko/ll v0.1.6/go.mod h1:NVUmjBb/aCtUpjKk75BhWrOlARz3dqsM+OtszpY4o88= github.com/olekukonko/tablewriter v1.1.4 h1:ORUMI3dXbMnRlRggJX3+q7OzQFDdvgbN9nVWj1drm6I= github.com/olekukonko/tablewriter v1.1.4/go.mod h1:+kedxuyTtgoZLwif3P1Em4hARJs+mVnzKxmsCL/C5RY= -github.com/onsi/ginkgo/v2 v2.32.0 h1:Hw7s2pVrQo/8Yz5N77qdnpHaoc+c6cC9WIV1Jce+J6E= -github.com/onsi/ginkgo/v2 v2.32.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= -github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I= -github.com/onsi/gomega v1.42.1/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= +github.com/onsi/ginkgo/v2 v2.32.2 h1:2o6vyFvR6snrJWgRVztC+OwuqqPEMI1UzYl2s2iU7Cg= +github.com/onsi/ginkgo/v2 v2.32.2/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= +github.com/onsi/gomega v1.43.0 h1:VlG/1FxqNxhSO+lq/OHBNaaqwiBK/mO8JbVkX9Y+FeU= +github.com/onsi/gomega v1.43.0/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= 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= From b79dc03ba44f40ab9dadc9840c5feaa06097956a Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 12:36:35 +0300 Subject: [PATCH 04/10] chore: Alias pkg/errors as pkgerrors and enable errorlint github.com/pkg/errors was imported unaliased in all 29 files that use it, so the bare identifier errors meant pkg/errors everywhere and the standard library errors package was unreachable without a rename. The package a reader sees as errors was not the one they would expect. This adopts the convention upstream Cluster API uses. CAPI v1.14.2 imports pkg/errors in 278 files and aliases it as pkgerrors at every one of those sites, which frees the bare errors for the standard library. Doing the same here keeps us aligned with upstream rather than diverging from it. Migrating off pkg/errors entirely was considered and rejected. CAPI requires it directly, so it stays in our module graph as an indirect dependency whether or not we import it, and upstream shows no sign of moving: v1.14.2 still has 901 Wrapf, 415 Wrap, 451 Errorf and 317 New calls. A rewrite would mean ~191 behaviour-bearing call sites, including a few where Wrap(nil) returning nil is load-bearing, for no dependency reduction and a permanent style split with upstream. The rename itself is a pure identifier substitution: same package, same functions, no behaviour change. Inverting it on the working tree reproduces the previous revision byte for byte, and the per-function call counts are unchanged at 54 New, 49 Wrap, 42 Errorf, 39 Wrapf, 5 Is, 1 Cause and 1 As. The apierrors and kerrors aliases in the seven files that also import an apimachinery errors package are untouched. An importas entry pins the alias, so a future unaliased import fails lint instead of quietly reintroducing the shadow. errorlint is enabled alongside it and already passes with no findings; it guards the fmt.Errorf %w sites that pkg/cloud/instance.go already has, and anything added later. Note it only inspects fmt.Errorf, so it cannot see pkgerrors.Errorf or Wrapf. Co-Authored-By: Claude Opus 5 (1M context) --- .golangci.yml | 3 + .../cloudstackaffinitygroup_controller.go | 4 +- .../cloudstackcluster_controller.go | 10 +-- .../cloudstackfailuredomain_controller.go | 14 ++-- .../cloudstackisolatednetwork_controller.go | 20 ++--- .../cloudstackmachine_controller.go | 26 +++---- internal/controllers/helpers.go | 4 +- pkg/cloud/affinity_groups.go | 10 +-- pkg/cloud/client.go | 18 ++--- pkg/cloud/helpers.go | 6 +- pkg/cloud/instance.go | 58 +++++++------- pkg/cloud/instance_test.go | 10 +-- pkg/cloud/isolated_network.go | 76 +++++++++---------- pkg/cloud/isolated_network_test.go | 12 +-- pkg/cloud/network.go | 10 +-- pkg/cloud/tags.go | 6 +- pkg/cloud/tags_test.go | 4 +- pkg/cloud/user_credentials.go | 32 ++++---- pkg/cloud/zone.go | 20 ++--- pkg/cloud/zone_test.go | 10 +-- pkg/metrics/metrics.go | 4 +- pkg/scope/affinitygroup.go | 8 +- pkg/scope/clients.go | 18 ++--- pkg/scope/cluster.go | 8 +- pkg/scope/failuredomain.go | 8 +- pkg/scope/isolatednetwork.go | 8 +- pkg/scope/machinescope.go | 18 ++--- pkg/scope/machinetemplate.go | 8 +- pkg/scope/mock.go | 4 +- test/helpers/envtest.go | 6 +- 30 files changed, 223 insertions(+), 220 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index aacf635e..d924737c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -18,6 +18,7 @@ linters: - durationcheck - errcheck - errchkjson + - errorlint - ginkgolinter - goconst - gocritic @@ -109,6 +110,8 @@ linters: alias: metav1 - pkg: k8s.io/apimachinery/pkg/util/errors alias: kerrors + - pkg: github.com/pkg/errors + alias: pkgerrors - pkg: sigs.k8s.io/controller-runtime/pkg/conversion alias: ctrlconversion - pkg: sigs.k8s.io/cluster-api/util/conversion diff --git a/internal/controllers/cloudstackaffinitygroup_controller.go b/internal/controllers/cloudstackaffinitygroup_controller.go index 019fef0a..c96f98f5 100644 --- a/internal/controllers/cloudstackaffinitygroup_controller.go +++ b/internal/controllers/cloudstackaffinitygroup_controller.go @@ -20,7 +20,7 @@ import ( "context" "fmt" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/events" @@ -181,7 +181,7 @@ func (r *CloudStackAffinityGroupReconciler) SetupWithManager(ctx context.Context WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(r.Scheme, log.GetLogger(), r.WatchFilterValue)). Complete(r) if err != nil { - return errors.Wrap(err, "failed setting up with a controller manager") + return pkgerrors.Wrap(err, "failed setting up with a controller manager") } return nil diff --git a/internal/controllers/cloudstackcluster_controller.go b/internal/controllers/cloudstackcluster_controller.go index aff07616..86d28400 100644 --- a/internal/controllers/cloudstackcluster_controller.go +++ b/internal/controllers/cloudstackcluster_controller.go @@ -22,7 +22,7 @@ import ( "time" "github.com/google/go-cmp/cmp" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -169,7 +169,7 @@ func (r *CloudStackClusterReconciler) reconcileNormal(ctx context.Context, scope if err := r.CreateFailureDomain(ctx, scope, fdSpec); err != nil { if !apierrors.IsAlreadyExists(err) { v1beta1conditions.MarkFalse(scope.CloudStackCluster, infrav1.FailureDomainsReadyCondition, infrav1.FailureDomainsErrorReason, clusterv1beta1.ConditionSeverityError, "%s", err.Error()) - return ctrl.Result{}, errors.Wrap(err, "creating CloudStackFailureDomains") + return ctrl.Result{}, pkgerrors.Wrap(err, "creating CloudStackFailureDomains") } } scope.SetFailureDomain(fdSpec.Name, clusterv1beta1.FailureDomainSpec{ @@ -237,7 +237,7 @@ func (r *CloudStackClusterReconciler) GetFailureDomains(ctx context.Context, clu client.InNamespace(clusterScope.CloudStackCluster.Namespace), client.MatchingLabels(capiClusterLabel), ); err != nil { - return errors.Wrap(err, "failed to list failure domains") + return pkgerrors.Wrap(err, "failed to list failure domains") } return nil @@ -280,7 +280,7 @@ func (r *CloudStackClusterReconciler) DeleteRemovedFailureDomains(ctx context.Co if _, present := fdPresenceByName[fd.Spec.Name]; !present { toDelete := fd if err := r.Client.Delete(ctx, &toDelete); err != nil { - return errors.Wrap(err, "failed to delete obsolete failure domain") + return pkgerrors.Wrap(err, "failed to delete obsolete failure domain") } } } @@ -328,7 +328,7 @@ func (r *CloudStackClusterReconciler) SetupWithManager(ctx context.Context, mgr WithEventFilter(predicates.ResourceIsNotExternallyManaged(r.Scheme, log.GetLogger())). Complete(r) if err != nil { - return errors.Wrap(err, "failed setting up with a controller manager") + return pkgerrors.Wrap(err, "failed setting up with a controller manager") } return nil diff --git a/internal/controllers/cloudstackfailuredomain_controller.go b/internal/controllers/cloudstackfailuredomain_controller.go index 9153ebf3..bc888fef 100644 --- a/internal/controllers/cloudstackfailuredomain_controller.go +++ b/internal/controllers/cloudstackfailuredomain_controller.go @@ -23,7 +23,7 @@ import ( "strings" "time" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -195,16 +195,16 @@ func (r *CloudStackFailureDomainReconciler) reconcileNormal(ctx context.Context, // Get the zone and network information. if err := scope.ResolveZone(); err != nil { - return ctrl.Result{}, errors.Wrap(err, "resolving CloudStack zone information") + return ctrl.Result{}, pkgerrors.Wrap(err, "resolving CloudStack zone information") } if err := scope.ResolveNetwork(); err != nil && !strings.Contains(strings.ToLower(err.Error()), "no match") { - return ctrl.Result{}, errors.Wrap(err, "resolving Cloudstack network information") + return ctrl.Result{}, pkgerrors.Wrap(err, "resolving Cloudstack network information") } if scope.NetworkID() == "" || scope.NetworkType() == infrav1.NetworkTypeIsolated { if err := r.GenerateIsolatedNetwork(ctx, scope); err != nil { - return ctrl.Result{}, errors.Wrap(err, "generating isolated network") + return ctrl.Result{}, pkgerrors.Wrap(err, "generating isolated network") } // Get the isolated network from the cluster. @@ -212,7 +212,7 @@ func (r *CloudStackFailureDomainReconciler) reconcileNormal(ctx context.Context, objectKey := client.ObjectKey{Name: scope.IsolatedNetworkName(), Namespace: scope.Namespace()} err := client.IgnoreNotFound(r.Client.Get(ctx, objectKey, r.IsoNet)) if err != nil { - return ctrl.Result{}, errors.Wrap(err, "failed to get CloudStackIsolatedNetwork") + return ctrl.Result{}, pkgerrors.Wrap(err, "failed to get CloudStackIsolatedNetwork") } if r.IsoNet.Name == "" { @@ -257,7 +257,7 @@ func (r *CloudStackFailureDomainReconciler) GenerateIsolatedNetwork(ctx context. csIsoNet.Spec.ControlPlaneEndpoint.Port = scope.Cluster.Spec.ControlPlaneEndpoint.Port if err := r.Client.Create(ctx, csIsoNet); err != nil && !strings.Contains(strings.ToLower(err.Error()), "already exists") { - return errors.Wrap(err, "failed to create CloudStackIsolatedNetwork resource") + return pkgerrors.Wrap(err, "failed to create CloudStackIsolatedNetwork resource") } return nil @@ -375,7 +375,7 @@ func (r *CloudStackFailureDomainReconciler) SetupWithManager(ctx context.Context WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(r.Scheme, log.GetLogger(), r.WatchFilterValue)). Complete(r) if err != nil { - return errors.Wrap(err, "failed setting up with a controller manager") + return pkgerrors.Wrap(err, "failed setting up with a controller manager") } return nil diff --git a/internal/controllers/cloudstackisolatednetwork_controller.go b/internal/controllers/cloudstackisolatednetwork_controller.go index 722dd245..04f09f94 100644 --- a/internal/controllers/cloudstackisolatednetwork_controller.go +++ b/internal/controllers/cloudstackisolatednetwork_controller.go @@ -23,7 +23,7 @@ import ( "time" "github.com/google/go-cmp/cmp" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" @@ -173,7 +173,7 @@ func (r *CloudStackIsolatedNetworkReconciler) reconcileNormal(ctx context.Contex // Set endpoint of CloudStackCluster if it is not currently set. (uses patcher to do so) csClusterPatcher, err := patch.NewHelper(scope.CloudStackCluster, r.Client) if err != nil { - return ctrl.Result{}, errors.Wrap(err, "setting up CloudStackCluster patcher") + return ctrl.Result{}, pkgerrors.Wrap(err, "setting up CloudStackCluster patcher") } if scope.FailureDomainZoneID() == "" { scope.Info("Zone ID not resolved yet.") @@ -186,14 +186,14 @@ func (r *CloudStackIsolatedNetworkReconciler) reconcileNormal(ctx context.Contex } // Tag the created network. if err := scope.CSUser().AddClusterTag(cloud.ResourceTypeNetwork, scope.CloudStackIsolatedNetwork.Spec.ID, scope.CloudStackCluster); err != nil { - return ctrl.Result{}, errors.Wrapf(err, "tagging network with id %s", scope.CloudStackIsolatedNetwork.Spec.ID) + return ctrl.Result{}, pkgerrors.Wrapf(err, "tagging network with id %s", scope.CloudStackIsolatedNetwork.Spec.ID) } // Assign IP and configure API server load balancer, if enabled and this cluster is not externally managed. if !annotations.IsExternallyManaged(scope.CloudStackCluster) { pubIP, err := scope.CSUser().AssociatePublicIPAddress(scope.CloudStackFailureDomain, scope.CloudStackIsolatedNetwork, scope.CloudStackCluster.Spec.ControlPlaneEndpoint.Host) if err != nil { - return ctrl.Result{}, errors.Wrap(err, "failed to associate public IP address") + return ctrl.Result{}, pkgerrors.Wrap(err, "failed to associate public IP address") } scope.SetControlPlaneEndpointHost(pubIP.Ipaddress) scope.SetControlPlaneEndpointPort(getAPIServerPort(scope.CloudStackCluster)) @@ -206,17 +206,17 @@ func (r *CloudStackIsolatedNetworkReconciler) reconcileNormal(ctx context.Contex scope.APIServerLoadBalancer().IPAddressID = pubIP.Id scope.APIServerLoadBalancer().IPAddress = pubIP.Ipaddress if err := scope.CSUser().AddClusterTag(cloud.ResourceTypeIPAddress, pubIP.Id, scope.CloudStackCluster); err != nil { - return ctrl.Result{}, errors.Wrapf(err, + return ctrl.Result{}, pkgerrors.Wrapf(err, "adding cluster tag to public IP address with ID %s", pubIP.Id) } if err := scope.CSUser().ReconcileLoadBalancer(scope.CloudStackFailureDomain, scope.CloudStackIsolatedNetwork, scope.CloudStackCluster); err != nil { - return ctrl.Result{}, errors.Wrap(err, "reconciling load balancer") + return ctrl.Result{}, pkgerrors.Wrap(err, "reconciling load balancer") } } if err := csClusterPatcher.Patch(ctx, scope.CloudStackCluster); err != nil { - return ctrl.Result{}, errors.Wrap(err, "patching endpoint update to CloudStackCluster") + return ctrl.Result{}, pkgerrors.Wrap(err, "patching endpoint update to CloudStackCluster") } scope.SetReady() @@ -251,7 +251,7 @@ func getAPIServerPort(csc *infrav1.CloudStackCluster) int32 { func (r *CloudStackIsolatedNetworkReconciler) CloudStackClusterToCloudStackIsolatedNetworks(obj client.ObjectList, scheme *runtime.Scheme, log logger.Wrapper) (handler.MapFunc, error) { gvk, err := apiutil.GVKForObject(obj, scheme) if err != nil { - return nil, errors.Wrap(err, "failed to find GVK for CloudStackIsolatedNetwork") + return nil, pkgerrors.Wrap(err, "failed to find GVK for CloudStackIsolatedNetwork") } return func(ctx context.Context, o client.Object) []ctrl.Request { @@ -306,7 +306,7 @@ func (r *CloudStackIsolatedNetworkReconciler) SetupWithManager(ctx context.Conte log := logger.FromContext(ctx) cloudStackClusterToCloudStackIsolatedNetworksMapper, err := r.CloudStackClusterToCloudStackIsolatedNetworks(&infrav1.CloudStackIsolatedNetworkList{}, r.Scheme, log) if err != nil { - return errors.Wrap(err, "failed to create CloudStackClusterToCloudStackIsolatedNetworks mapper") + return pkgerrors.Wrap(err, "failed to create CloudStackClusterToCloudStackIsolatedNetworks mapper") } err = ctrl.NewControllerManagedBy(mgr). @@ -339,7 +339,7 @@ func (r *CloudStackIsolatedNetworkReconciler) SetupWithManager(ctx context.Conte ). Complete(r) if err != nil { - return errors.Wrap(err, "failed setting up with a controller manager") + return pkgerrors.Wrap(err, "failed setting up with a controller manager") } return nil diff --git a/internal/controllers/cloudstackmachine_controller.go b/internal/controllers/cloudstackmachine_controller.go index 2ac0b2a8..ecb1a531 100644 --- a/internal/controllers/cloudstackmachine_controller.go +++ b/internal/controllers/cloudstackmachine_controller.go @@ -26,7 +26,7 @@ import ( "github.com/apache/cloudstack-go/v2/cloudstack" "github.com/google/go-cmp/cmp" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "golang.org/x/text/cases" "golang.org/x/text/language" corev1 "k8s.io/api/core/v1" @@ -188,7 +188,7 @@ func (r *CloudStackMachineReconciler) reconcileDelete(ctx context.Context, scope scope.Info("Reconcile CloudStackMachine deletion") vm, err := r.findInstance(scope) - if err != nil && !errors.Is(err, cloud.ErrNotFound) { + if err != nil && !pkgerrors.Is(err, cloud.ErrNotFound) { return ctrl.Result{}, err } if vm == nil { @@ -211,7 +211,7 @@ func (r *CloudStackMachineReconciler) reconcileDelete(ctx context.Context, scope if err := r.reconcileLBattachments(scope); err != nil { v1beta1conditions.MarkFalse(scope.CloudStackMachine, infrav1.LoadBalancerAttachedCondition, "DeletingFailed", clusterv1beta1.ConditionSeverityWarning, "%s", err.Error()) - return ctrl.Result{}, errors.Errorf("failed to reconcile LB attachment: %+v", err) + return ctrl.Result{}, pkgerrors.Errorf("failed to reconcile LB attachment: %+v", err) } if scope.IsControlPlane() { @@ -339,7 +339,7 @@ func (r *CloudStackMachineReconciler) reconcileNormal(ctx context.Context, scope } vm, err := r.findInstance(scope) - if err != nil && !errors.Is(err, cloud.ErrNotFound) { + if err != nil && !pkgerrors.Is(err, cloud.ErrNotFound) { v1beta1conditions.MarkUnknown(scope.CloudStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceNotFoundReason, "%s", err.Error()) return ctrl.Result{}, err } @@ -414,7 +414,7 @@ func (r *CloudStackMachineReconciler) reconcileNormal(ctx context.Context, scope // If it does have a node reference, it could be a temporary condition. if !scope.Machine.Status.NodeRef.IsDefined() { scope.SetFailureReason(UpdateMachineError) - scope.SetFailureMessage(errors.Errorf("CloudStack instance state %s is unexpected", vm.State)) + scope.SetFailureMessage(pkgerrors.Errorf("CloudStack instance state %s is unexpected", vm.State)) } shouldRequeue = true case cloud.InstanceStateExpunging, cloud.InstanceStateDestroyed: @@ -423,7 +423,7 @@ func (r *CloudStackMachineReconciler) reconcileNormal(ctx context.Context, scope r.Recorder.Eventf(scope.CloudStackMachine, nil, corev1.EventTypeWarning, "InstanceUnexpectedTermination", "CheckInstanceState", "Unexpected CloudStack instance termination") v1beta1conditions.MarkFalse(scope.CloudStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceTerminatedReason, clusterv1beta1.ConditionSeverityError, "") scope.SetFailureReason(UpdateMachineError) - scope.SetFailureMessage(errors.Errorf("CloudStack instance state %s is unexpected", vm.State)) + scope.SetFailureMessage(pkgerrors.Errorf("CloudStack instance state %s is unexpected", vm.State)) default: scope.SetNotReady() scope.Info("Instance state is unexpected", "state", vm.State, "instance-id", scope.GetInstanceID()) @@ -464,7 +464,7 @@ func (r *CloudStackMachineReconciler) reconcileNormal(ctx context.Context, scope func (r *CloudStackMachineReconciler) reconcileLBattachments(scope *scope.MachineScope) error { if !scope.IsExternallyManaged() && scope.IsControlPlane() && scope.NetworkType() == cloud.NetworkTypeIsolated && scope.IsLBEnabled() { if scope.CloudStackIsolatedNetwork == nil { - return errors.New("Could not get required Isolated Network for VM") + return pkgerrors.New("Could not get required Isolated Network for VM") } if scope.CloudStackMachineIsDeleted() || scope.MachineIsDeleted() || !scope.InstanceIsRunning() { @@ -527,7 +527,7 @@ func (r *CloudStackMachineReconciler) findInstance(scope *scope.MachineScope) (* if scope.GetInstanceID() != "" { instance, err = scope.CSUser().GetVMInstanceByID(scope.GetInstanceID()) - if err != nil && !errors.Is(err, cloud.ErrNotFound) { + if err != nil && !pkgerrors.Is(err, cloud.ErrNotFound) { return nil, err } if instance != nil { @@ -546,7 +546,7 @@ func (r *CloudStackMachineReconciler) findInstance(scope *scope.MachineScope) (* func GenerateAffinityGroupName(csMachine infrav1.CloudStackMachine, capiMachine *clusterv1.Machine, capiCluster *clusterv1.Cluster) (string, error) { managerOwnerRef := GetManagementOwnerRef(capiMachine) if managerOwnerRef == nil { - return "", errors.Errorf("could not find owner UID for %s/%s", capiMachine.Namespace, capiMachine.Name) + return "", pkgerrors.Errorf("could not find owner UID for %s/%s", capiMachine.Namespace, capiMachine.Name) } titleCaser := cases.Title(language.English) @@ -585,7 +585,7 @@ func (r *CloudStackMachineReconciler) GetOrCreateAffinityGroup(ctx context.Conte case infrav1.AffinityTypeSoftAnti: scope.CloudStackAffinityGroup.Spec.Type = "non-strict host anti-affinity" default: - return errors.Errorf("unrecognized affinity type %s", scope.AffinityType()) + return pkgerrors.Errorf("unrecognized affinity type %s", scope.AffinityType()) } // Setup basic metadata. @@ -610,7 +610,7 @@ func (r *CloudStackMachineReconciler) GetOrCreateAffinityGroup(ctx context.Conte }) if err := r.Client.Create(ctx, scope.CloudStackAffinityGroup); err != nil && !strings.Contains(strings.ToLower(err.Error()), "already exists") { - return errors.Wrap(err, "creating CloudStackAffinityGroup CRD") + return pkgerrors.Wrap(err, "creating CloudStackAffinityGroup CRD") } return nil @@ -789,7 +789,7 @@ func (r *CloudStackMachineReconciler) CloudStackIsolatedNetworkToControlPlaneClo clusterName, ok := csIsoNet.GetLabels()[clusterv1.ClusterNameLabel] if !ok { - log.Error(errors.New("failed to find cluster name label"), "CloudStackIsolatedNetwork is missing cluster name label or cluster does not exist, skipping mapping.") + log.Error(pkgerrors.New("failed to find cluster name label"), "CloudStackIsolatedNetwork is missing cluster name label or cluster does not exist, skipping mapping.") } machineList := &clusterv1.MachineList{} @@ -905,7 +905,7 @@ func (r *CloudStackMachineReconciler) SetupWithManager(ctx context.Context, mgr ). Complete(r) if err != nil { - return errors.Wrap(err, "failed setting up with a controller manager") + return pkgerrors.Wrap(err, "failed setting up with a controller manager") } return nil diff --git a/internal/controllers/helpers.go b/internal/controllers/helpers.go index ecef8f2d..5c5b347d 100644 --- a/internal/controllers/helpers.go +++ b/internal/controllers/helpers.go @@ -19,7 +19,7 @@ package controllers import ( "context" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" @@ -73,7 +73,7 @@ func GetFailureDomainByName(ctx context.Context, k8sClient client.Client, name, fd := &infrav1.CloudStackFailureDomain{} metaHashName := infrav1.FailureDomainHashedMetaName(name, clusterName) if err := k8sClient.Get(ctx, client.ObjectKey{Name: metaHashName, Namespace: namespace}, fd); err != nil { - return nil, errors.Wrapf(err, "failed to get failure domain with name %s", name) + return nil, pkgerrors.Wrapf(err, "failed to get failure domain with name %s", name) } return fd, nil diff --git a/pkg/cloud/affinity_groups.go b/pkg/cloud/affinity_groups.go index 105a7f9c..65657afd 100644 --- a/pkg/cloud/affinity_groups.go +++ b/pkg/cloud/affinity_groups.go @@ -18,7 +18,7 @@ package cloud import ( "github.com/apache/cloudstack-go/v2/cloudstack" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3" ) @@ -54,7 +54,7 @@ func (c *client) FetchAffinityGroup(group *AffinityGroup) error { return err } else if count > 1 { // handle via creating a new error. - return errors.New("count bad") + return pkgerrors.New("count bad") } group.Name = affinityGroup.Name group.Type = affinityGroup.Type @@ -70,7 +70,7 @@ func (c *client) FetchAffinityGroup(group *AffinityGroup) error { return err } else if count > 1 { // handle via creating a new error. - return errors.New("count bad") + return pkgerrors.New("count bad") } group.ID = affinityGroup.Id group.Type = affinityGroup.Type @@ -78,7 +78,7 @@ func (c *client) FetchAffinityGroup(group *AffinityGroup) error { return nil } - return errors.Errorf(`could not fetch AffinityGroup by name "%s" or id "%s"`, group.Name, group.ID) + return pkgerrors.Errorf(`could not fetch AffinityGroup by name "%s" or id "%s"`, group.Name, group.ID) } func (c *client) GetOrCreateAffinityGroup(group *AffinityGroup) error { @@ -119,7 +119,7 @@ func (c *client) getCurrentAffinityGroups(csMachine *infrav1.CloudStackMachine) return nil, err } else if count > 1 { - return nil, errors.Errorf("found more than one VM for ID: %s", *csMachine.Spec.InstanceID) + return nil, pkgerrors.Errorf("found more than one VM for ID: %s", *csMachine.Spec.InstanceID) } groups := make([]AffinityGroup, 0, len(virtM.Affinitygroup)) for _, v := range virtM.Affinitygroup { diff --git a/pkg/cloud/client.go b/pkg/cloud/client.go index a7c51469..59ee5211 100644 --- a/pkg/cloud/client.go +++ b/pkg/cloud/client.go @@ -27,7 +27,7 @@ import ( "github.com/apache/cloudstack-go/v2/cloudstack" "github.com/hashicorp/go-multierror" "github.com/jellydator/ttlcache/v3" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "gopkg.in/yaml.v3" corev1 "k8s.io/api/core/v1" @@ -60,13 +60,13 @@ type Config struct { func (c *Config) Validate() (err error) { if c.APIUrl == "" { - err = multierror.Append(err, errors.New("api-url is required")) + err = multierror.Append(err, pkgerrors.New("api-url is required")) } if c.APIKey == "" { - err = multierror.Append(err, errors.New("api-key is required")) + err = multierror.Append(err, pkgerrors.New("api-key is required")) } if c.SecretKey == "" { - err = multierror.Append(err, errors.New("secret-key is required")) + err = multierror.Append(err, pkgerrors.New("secret-key is required")) } return err @@ -115,7 +115,7 @@ func UnmarshalAllSecretConfigs(in []byte, out *[]SecretConfig) error { var conf SecretConfig if err := decoder.Decode(&conf); err != nil { // Break when there are no more documents to decode - if errors.Is(err, io.EOF) { + if pkgerrors.Is(err, io.EOF) { return err } @@ -172,7 +172,7 @@ func NewClientFromYamlPath(confPath string, secretName string, options ...Client } } if conf.APIKey == "" { - return nil, errors.Errorf("config with secret name %s not found", secretName) + return nil, pkgerrors.Errorf("config with secret name %s not found", secretName) } return NewClientFromConf(conf, nil, options...) @@ -234,7 +234,7 @@ func NewClientFromConf(conf Config, clientConfig *corev1.ConfigMap, options ...C if found, err := c.GetUserWithKeys(user); err != nil { return nil, err } else if !found { - return nil, errors.Errorf( + return nil, pkgerrors.Errorf( "could not find sufficient user (with API keys) in domain/account %s/%s", userResponse.Users[0].Domain, userResponse.Users[0].Account) } clientCache.Set(clientCacheKey, c, ttlcache.DefaultTTL) @@ -262,7 +262,7 @@ func NewClientInDomainAndAccount(c Client, domain string, account string, option if found, err := client.GetUserWithKeys(user); err != nil { return nil, err } else if !found { - return nil, errors.Errorf( + return nil, pkgerrors.Errorf( "could not find sufficient user (with API keys) in domain/account %s/%s", domain, account) } client.config.APIKey = user.APIKey @@ -345,7 +345,7 @@ type ClientOption func(*client) error func WithProject(project string) ClientOption { return func(c *client) error { if c == nil || c.user == nil { - return errors.New("cannot create client with nil user") + return pkgerrors.New("cannot create client with nil user") } // project arg empty or project ID already set through cloud config. diff --git a/pkg/cloud/helpers.go b/pkg/cloud/helpers.go index b2f1ae5f..2675505d 100644 --- a/pkg/cloud/helpers.go +++ b/pkg/cloud/helpers.go @@ -20,7 +20,7 @@ import ( "bytes" "compress/gzip" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" ) type ( @@ -55,11 +55,11 @@ func GzipBytes(dat []byte) ([]byte, error) { var buf bytes.Buffer gz := gzip.NewWriter(&buf) if _, err := gz.Write(dat); err != nil { - return []byte{}, errors.Wrap(err, "failed to gzip bytes") + return []byte{}, pkgerrors.Wrap(err, "failed to gzip bytes") } if err := gz.Close(); err != nil { - return []byte{}, errors.Wrap(err, "failed to gzip bytes") + return []byte{}, pkgerrors.Wrap(err, "failed to gzip bytes") } return buf.Bytes(), nil diff --git a/pkg/cloud/instance.go b/pkg/cloud/instance.go index 9369746e..0e77b606 100644 --- a/pkg/cloud/instance.go +++ b/pkg/cloud/instance.go @@ -24,7 +24,7 @@ import ( "github.com/apache/cloudstack-go/v2/cloudstack" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" @@ -52,7 +52,7 @@ const ( ) var ( - ErrNotFound = errors.New("not found") + ErrNotFound = pkgerrors.New("not found") // InstanceRunningStates are the states that indicate the instance is running. InstanceRunningStates = sets.NewString(InstanceStateStarting, InstanceStateRunning) @@ -74,7 +74,7 @@ type VMIface interface { // GetVMInstanceByID returns the VM instance with the given instance ID. func (c *client) GetVMInstanceByID(id string) (*cloudstack.VirtualMachine, error) { if id == "" { - return nil, errors.New("instance ID is required") + return nil, pkgerrors.New("instance ID is required") } params := c.cs.VirtualMachine.NewListVirtualMachinesParams() @@ -100,7 +100,7 @@ func (c *client) GetVMInstanceByID(id string) (*cloudstack.VirtualMachine, error // GetVMInstanceByName returns the VM instance with the given name. func (c *client) GetVMInstanceByName(name string) (*cloudstack.VirtualMachine, error) { if name == "" { - return nil, errors.New("instance name is required") + return nil, pkgerrors.New("instance name is required") } params := c.cs.VirtualMachine.NewListVirtualMachinesParams() @@ -183,7 +183,7 @@ func (c *client) CreateVMInstance(csMachine *infrav1.CloudStackMachine, capiMach // clean up. vm, findErr := findVirtualMachine(c.cs.VirtualMachine, c.user.Project.ID, templateID, fd, csMachine) if findErr != nil { - if errors.Is(findErr, ErrNotFound) { + if pkgerrors.Is(findErr, ErrNotFound) { // We didn't find a VM so return the original error. return nil, err } @@ -211,7 +211,7 @@ func (c *client) GetInstanceAddresses(vm *cloudstack.VirtualMachine) ([]corev1.N } } } else { - return addresses, errors.New("instance does not have any NIC (yet)") + return addresses, pkgerrors.New("instance does not have any NIC (yet)") } return addresses, nil } @@ -264,7 +264,7 @@ func (c *client) ResolveVMInstanceDetails(csMachine *infrav1.CloudStackMachine) } } - return errors.New("no match found") + return pkgerrors.New("no match found") } // resolveServiceOffering attempts to look up the service offering of a CloudStackMachine by ID first and name second. @@ -274,15 +274,15 @@ func (c *client) resolveServiceOffering(csMachine *infrav1.CloudStackMachine, zo if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return nil, multierror.Append(retErr, errors.Wrapf( + return nil, multierror.Append(retErr, pkgerrors.Wrapf( err, "could not get Service Offering by ID %s", csMachine.Spec.Offering.ID)) } else if count != 1 { - return csOffering, multierror.Append(retErr, errors.Errorf( + return csOffering, multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Service Offering with UUID %s, but got %d", csMachine.Spec.Offering.ID, count)) } if len(csMachine.Spec.Offering.Name) > 0 && csMachine.Spec.Offering.Name != csOffering.Name { - return csOffering, multierror.Append(retErr, errors.Errorf( + return csOffering, multierror.Append(retErr, pkgerrors.Errorf( "offering name %s does not match name %s returned using UUID %s", csMachine.Spec.Offering.Name, csOffering.Name, csMachine.Spec.Offering.ID)) } @@ -292,10 +292,10 @@ func (c *client) resolveServiceOffering(csMachine *infrav1.CloudStackMachine, zo if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return nil, multierror.Append(retErr, errors.Wrapf( + return nil, multierror.Append(retErr, pkgerrors.Wrapf( err, "could not get Service Offering ID from %s in zone %s", csMachine.Spec.Offering.Name, zoneID)) } else if count != 1 { - return csOffering, multierror.Append(retErr, errors.Errorf( + return csOffering, multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Service Offering with name %s in zone %s, but got %d", csMachine.Spec.Offering.Name, zoneID, count)) } @@ -312,15 +312,15 @@ func (c *client) resolveTemplate( if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return "", multierror.Append(retErr, errors.Wrapf( + return "", multierror.Append(retErr, pkgerrors.Wrapf( err, "could not get Template by ID %s", csMachine.Spec.Template.ID)) } else if count != 1 { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Template with UUID %s, but got %d", csMachine.Spec.Template.ID, count)) } if len(csMachine.Spec.Template.Name) > 0 && csMachine.Spec.Template.Name != csTemplate.Name { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "template name %s does not match name %s returned using UUID %s", csMachine.Spec.Template.Name, csTemplate.Name, csMachine.Spec.Template.ID)) } @@ -340,10 +340,10 @@ func (c *client) resolveTemplate( if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return "", multierror.Append(retErr, errors.Wrapf( + return "", multierror.Append(retErr, pkgerrors.Wrapf( err, "could not get Template ID from %s", csMachine.Spec.Template.Name)) } else if count != 1 { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Template with name %s, but got %d", csMachine.Spec.Template.Name, count)) } @@ -363,17 +363,17 @@ func (c *client) resolveDiskOffering(csMachine *infrav1.CloudStackMachine, zoneI if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return "", multierror.Append(retErr, errors.Wrapf( + return "", multierror.Append(retErr, pkgerrors.Wrapf( err, "could not get DiskOffering ID from %s", csMachine.Spec.DiskOffering.Name)) } else if count != 1 { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "expected 1 DiskOffering with name %s in zone %s, but got %d", csMachine.Spec.DiskOffering.Name, zoneID, count)) } else if len(csMachine.Spec.DiskOffering.ID) > 0 && diskID != csMachine.Spec.DiskOffering.ID { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "diskOffering ID %s does not match ID %s returned using name %s in zone %s", csMachine.Spec.DiskOffering.ID, diskID, csMachine.Spec.DiskOffering.Name, zoneID)) } else if len(diskID) == 0 { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "empty diskOffering ID %s returned using name %s in zone %s", diskID, csMachine.Spec.DiskOffering.Name, zoneID)) } @@ -392,21 +392,21 @@ func verifyDiskoffering(csMachine *infrav1.CloudStackMachine, c *client, diskOff if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return "", multierror.Append(retErr, errors.Wrapf( + return "", multierror.Append(retErr, pkgerrors.Wrapf( err, "could not get DiskOffering by ID %s", diskOfferingID)) } else if count != 1 { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "expected 1 DiskOffering with UUID %s, but got %d", diskOfferingID, count)) } if csDiskOffering.Iscustomized && csMachine.Spec.DiskOffering.CustomSize == 0 { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "diskOffering with UUID %s is customized, disk size can not be 0 GB", diskOfferingID)) } if !csDiskOffering.Iscustomized && csMachine.Spec.DiskOffering.CustomSize > 0 { - return "", multierror.Append(retErr, errors.Errorf( + return "", multierror.Append(retErr, pkgerrors.Errorf( "diskOffering with UUID %s is not customized, disk size can not be specified", diskOfferingID)) } @@ -433,7 +433,7 @@ func (c *client) checkAccountLimits(offering *cloudstack.ServiceOffering) error if c.user.Account.VMAvailable != LimitUnlimited { vmAvailable, err := strconv.ParseInt(c.user.Account.VMAvailable, 10, 0) if err == nil && vmAvailable < 1 { - return errors.New("VM limit in account has reached its maximum value") + return pkgerrors.New("VM limit in account has reached its maximum value") } } @@ -459,7 +459,7 @@ func (c *client) checkDomainLimits(offering *cloudstack.ServiceOffering) error { if c.user.Domain.VMAvailable != LimitUnlimited { vmAvailable, err := strconv.ParseInt(c.user.Domain.VMAvailable, 10, 0) if err == nil && vmAvailable < 1 { - return errors.New("VM limit in domain has reached its maximum value") + return pkgerrors.New("VM limit in domain has reached its maximum value") } } @@ -500,7 +500,7 @@ func (c *client) checkLimits( offering *cloudstack.ServiceOffering, ) error { if offering == nil { - return errors.New("offering cannot be nil") + return pkgerrors.New("offering cannot be nil") } err := c.checkAccountLimits(offering) @@ -592,7 +592,7 @@ func (c *client) DestroyVMInstance(csMachine *infrav1.CloudStackMachine) error { return err } - return errors.New("VM deletion in progress") + return pkgerrors.New("VM deletion in progress") } // listVMInstanceDatadiskVolumeIDs fetches a list of any data disks associated with the VM (that were created upon VM diff --git a/pkg/cloud/instance_test.go b/pkg/cloud/instance_test.go index 0db14eb7..7c0127b7 100644 --- a/pkg/cloud/instance_test.go +++ b/pkg/cloud/instance_test.go @@ -22,7 +22,7 @@ import ( "github.com/apache/cloudstack-go/v2/cloudstack" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "go.uber.org/mock/gomock" "k8s.io/utils/ptr" @@ -42,8 +42,8 @@ var _ = Describe("Instance", func() { templateName = "template" ) - notFoundError := errors.New("no match found") - unknownError := errors.New(unknownErrorMessage) + notFoundError := pkgerrors.New("no match found") + unknownError := pkgerrors.New(unknownErrorMessage) var ( mockCtrl *gomock.Controller @@ -798,7 +798,7 @@ var _ = Describe("Instance", func() { listVolumesParams.SetKeyword("DATA-") vms.EXPECT().NewDestroyVirtualMachineParams(*dummies.CSMachine1.Spec.InstanceID). Return(expungeDestroyParams) - vms.EXPECT().DestroyVirtualMachine(expungeDestroyParams).Return(nil, errors.New("unable to find uuid for id")) + vms.EXPECT().DestroyVirtualMachine(expungeDestroyParams).Return(nil, pkgerrors.New("unable to find uuid for id")) vs.EXPECT().NewListVolumesParams().Return(listVolumesParams) vs.EXPECT().ListVolumes(listVolumesParams).Return(listVolumesResponse, nil) Ω(client.DestroyVMInstance(dummies.CSMachine1)). @@ -811,7 +811,7 @@ var _ = Describe("Instance", func() { listVolumesParams.SetKeyword("DATA-") vms.EXPECT().NewDestroyVirtualMachineParams(*dummies.CSMachine1.Spec.InstanceID). Return(expungeDestroyParams) - vms.EXPECT().DestroyVirtualMachine(expungeDestroyParams).Return(nil, errors.New("new error")) + vms.EXPECT().DestroyVirtualMachine(expungeDestroyParams).Return(nil, pkgerrors.New("new error")) vs.EXPECT().NewListVolumesParams().Return(listVolumesParams) vs.EXPECT().ListVolumes(listVolumesParams).Return(listVolumesResponse, nil) Ω(client.DestroyVMInstance(dummies.CSMachine1)).Should(MatchError("new error")) diff --git a/pkg/cloud/isolated_network.go b/pkg/cloud/isolated_network.go index 05d081af..6481b54b 100644 --- a/pkg/cloud/isolated_network.go +++ b/pkg/cloud/isolated_network.go @@ -25,7 +25,7 @@ import ( "github.com/apache/cloudstack-go/v2/cloudstack" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" utilsnet "k8s.io/utils/net" infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3" @@ -62,7 +62,7 @@ func (c *client) getNetworkOfferingID() (string, error) { return "", retErr } else if count != 1 { - return "", errors.New("found more than one network offering") + return "", pkgerrors.New("found more than one network offering") } return offeringID, nil @@ -77,7 +77,7 @@ func (c *client) AssociatePublicIPAddress( // Check specified IP address is available or get an unused one if not specified. publicAddress, err := c.GetPublicIP(fd, desiredIP) if err != nil { - return nil, errors.Wrap(err, "fetching a public IP address") + return nil, pkgerrors.Wrap(err, "fetching a public IP address") } // Check if the address is already associated with the network. @@ -93,11 +93,11 @@ func (c *client) AssociatePublicIPAddress( if _, err := c.cs.Address.AssociateIpAddress(p); err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return nil, errors.Wrapf(err, + return nil, pkgerrors.Wrapf(err, "associating public IP address with ID %s to network with ID %s", publicAddress.Id, isoNet.Spec.ID) } else if err := c.AddCreatedByCAPCTag(ResourceTypeIPAddress, publicAddress.Id); err != nil { - return nil, errors.Wrapf(err, + return nil, pkgerrors.Wrapf(err, "adding tag to public IP address with ID %s", publicAddress.Id) } @@ -119,7 +119,7 @@ func (c *client) CreateIsolatedNetwork(fd *infrav1.CloudStackFailureDomain, isoN if isoNet.Spec.CIDR != "" { m, err := parseCIDR(isoNet.Spec.CIDR) if err != nil { - return errors.Wrap(err, "parsing CIDR") + return pkgerrors.Wrap(err, "parsing CIDR") } // Set the needed IP subnet config p.SetGateway(m["gateway"]) @@ -131,7 +131,7 @@ func (c *client) CreateIsolatedNetwork(fd *infrav1.CloudStackFailureDomain, isoN if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return errors.Wrapf(err, "creating network with name %s", isoNet.Spec.Name) + return pkgerrors.Wrapf(err, "creating network with name %s", isoNet.Spec.Name) } isoNet.Spec.ID = resp.Id isoNet.Spec.CIDR = resp.Cidr @@ -156,7 +156,7 @@ func (c *client) CreateEgressFirewallRules(isoNet *infrav1.CloudStackIsolatedNet !strings.Contains(strings.ToLower(err.Error()), "there is already") && // Ignore errors regarding already existing fw rule for ICMP !strings.Contains(strings.ToLower(err.Error()), "new rule conflicts with existing rule") { - retErr = multierror.Append(retErr, errors.Wrapf( + retErr = multierror.Append(retErr, pkgerrors.Wrapf( err, "failed creating egress firewall rule for network ID %s protocol %s", isoNet.Spec.ID, proto)) } } @@ -192,10 +192,10 @@ func (c *client) GetPublicIP( } } - return nil, errors.New("all Public IP Address(es) found were already allocated") + return nil, pkgerrors.New("all Public IP Address(es) found were already allocated") } - return nil, errors.New("no public addresses found in available networks") + return nil, pkgerrors.New("no public addresses found in available networks") } // GetIsolatedNetwork gets an isolated network in the relevant Zone. @@ -203,9 +203,9 @@ func (c *client) GetIsolatedNetwork(isoNet *infrav1.CloudStackIsolatedNetwork) ( netDetails, count, err := c.cs.Network.GetNetworkByName(isoNet.Spec.Name, cloudstack.WithProject(c.user.Project.ID)) if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - retErr = multierror.Append(retErr, errors.Wrapf(err, "could not get Network ID from %s", isoNet.Spec.Name)) + retErr = multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Network ID from %s", isoNet.Spec.Name)) } else if count != 1 { - retErr = multierror.Append(retErr, errors.Errorf( + retErr = multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Network with name %s, but got %d", isoNet.Name, count)) } else { // Got netID from the network's name. isoNet.Spec.ID = netDetails.Id @@ -218,9 +218,9 @@ func (c *client) GetIsolatedNetwork(isoNet *infrav1.CloudStackIsolatedNetwork) ( if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return multierror.Append(retErr, errors.Wrapf(err, "could not get Network by ID %s", isoNet.Spec.ID)) + return multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Network by ID %s", isoNet.Spec.ID)) } else if count != 1 { - return multierror.Append(retErr, errors.Errorf("expected 1 Network with UUID %s, but got %d", isoNet.Spec.ID, count)) + return multierror.Append(retErr, pkgerrors.Errorf("expected 1 Network with UUID %s, but got %d", isoNet.Spec.ID, count)) } isoNet.Spec.Name = netDetails.Name isoNet.Spec.CIDR = netDetails.Cidr @@ -237,7 +237,7 @@ func (c *client) GetLoadBalancerRules(isoNet *infrav1.CloudStackIsolatedNetwork) if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return nil, errors.Wrap(err, "listing load balancer rules") + return nil, pkgerrors.Wrap(err, "listing load balancer rules") } return loadBalancerRules.LoadBalancerRules, nil @@ -254,7 +254,7 @@ func (c *client) ReconcileLoadBalancerRules(isoNet *infrav1.CloudStackIsolatedNe if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return errors.Wrap(err, "retrieving load balancer rules") + return pkgerrors.Wrap(err, "retrieving load balancer rules") } portsAndIDs := mapExistingLoadBalancerRules(lbr) @@ -339,7 +339,7 @@ func (c *client) getOrCreateLoadBalancerRule(isoNet *infrav1.CloudStackIsolatedN // If not found, create the lb rule for port ruleID, err := c.CreateLoadBalancerRule(isoNet, port) if err != nil { - return "", errors.Wrap(err, "creating load balancer rule") + return "", pkgerrors.Wrap(err, "creating load balancer rule") } return ruleID, nil @@ -350,7 +350,7 @@ func (c *client) cleanupObsoleteLoadBalancerRules(portsAndIDs map[string]string, for port, ruleID := range portsAndIDs { intPort, err := strconv.Atoi(port) if err != nil { - return errors.Wrap(err, "converting port to int") + return pkgerrors.Wrap(err, "converting port to int") } if !slices.Contains(ports, intPort) { if err := c.deleteLoadBalancerRuleByID(ruleID); err != nil { @@ -377,10 +377,10 @@ func (c *client) cleanupAllLoadBalancerRules(portsAndIDs map[string]string) erro func (c *client) deleteLoadBalancerRuleByID(ruleID string) error { success, err := c.DeleteLoadBalancerRule(ruleID) if err != nil { - return errors.Wrap(err, "deleting load balancer rule") + return pkgerrors.Wrap(err, "deleting load balancer rule") } if !success { - return errors.New("delete load balancer rule returned unsuccessful") + return pkgerrors.New("delete load balancer rule returned unsuccessful") } return nil @@ -409,7 +409,7 @@ func (c *client) CreateLoadBalancerRule(isoNet *infrav1.CloudStackIsolatedNetwor return "", err } if err := c.AddCreatedByCAPCTag(ResourceTypeLoadBalancerRule, resp.Id); err != nil { - return "", errors.Wrap(err, "adding created by CAPC tag") + return "", pkgerrors.Wrap(err, "adding created by CAPC tag") } return resp.Id, nil @@ -423,7 +423,7 @@ func (c *client) DeleteLoadBalancerRule(id string) (bool, error) { } if !isCAPCManaged { - return false, errors.Errorf("load balancer rule with id %s is not managed by CAPC", id) + return false, pkgerrors.Errorf("load balancer rule with id %s is not managed by CAPC", id) } p := c.csAsync.LoadBalancer.NewDeleteLoadBalancerRuleParams(id) @@ -447,7 +447,7 @@ func (c *client) GetFirewallRules(isoNet *infrav1.CloudStackIsolatedNetwork) ([] if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return nil, errors.Wrap(err, "listing firewall rules") + return nil, pkgerrors.Wrap(err, "listing firewall rules") } return fwRules.FirewallRules, nil @@ -464,7 +464,7 @@ func (c *client) ReconcileFirewallRules(isoNet *infrav1.CloudStackIsolatedNetwor if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return errors.Wrap(err, "retrieving firewall rules") + return pkgerrors.Wrap(err, "retrieving firewall rules") } portsAndIDs := mapExistingFirewallRules(fwr) @@ -577,7 +577,7 @@ func (c *client) createMissingFirewallRules(isoNet *infrav1.CloudStackIsolatedNe _, createCIDRs := capcstrings.SliceDiff(foundCIDRs, allowedCIDRS) for _, cidr := range createCIDRs { if err := c.CreateFirewallRule(isoNet, port, cidr); err != nil { - return errors.Wrap(err, "creating firewall rule") + return pkgerrors.Wrap(err, "creating firewall rule") } } @@ -616,10 +616,10 @@ func (c *client) cleanupAllFirewallRules(portsAndIDs map[int][]string) error { func (c *client) deleteFirewallRuleByID(ruleID string) error { success, err := c.DeleteFirewallRule(ruleID) if err != nil { - return errors.Wrap(err, "deleting firewall rule") + return pkgerrors.Wrap(err, "deleting firewall rule") } if !success { - return errors.New("delete firewall rule returned unsuccessful") + return pkgerrors.New("delete firewall rule returned unsuccessful") } return nil @@ -639,7 +639,7 @@ func (c *client) CreateFirewallRule(isoNet *infrav1.CloudStackIsolatedNetwork, p return err } if err := c.AddCreatedByCAPCTag(ResourceTypeFirewallRule, resp.Id); err != nil { - return errors.Wrap(err, "adding created by CAPC tag") + return pkgerrors.Wrap(err, "adding created by CAPC tag") } return nil @@ -653,7 +653,7 @@ func (c *client) DeleteFirewallRule(id string) (bool, error) { } if !isCAPCManaged { - return false, errors.Errorf("firewall rule with id %s is not managed by CAPC", id) + return false, pkgerrors.Errorf("firewall rule with id %s is not managed by CAPC", id) } p := c.csAsync.Firewall.NewDeleteFirewallRuleParams(id) @@ -711,7 +711,7 @@ func (c *client) GetOrCreateIsolatedNetwork( network := isoNet.Network() if err := c.ResolveNetwork(network); err != nil { // Doesn't exist, create isolated network. if err = c.CreateIsolatedNetwork(fd, isoNet); err != nil { - return errors.Wrap(err, "creating a new isolated network") + return pkgerrors.Wrap(err, "creating a new isolated network") } } else { // Network existed and was resolved. Set ID on isoNet CloudStackIsolatedNetwork in case it only had name set. @@ -720,7 +720,7 @@ func (c *client) GetOrCreateIsolatedNetwork( } // Open the Isolated Network egress firewall. - return errors.Wrap(c.CreateEgressFirewallRules(isoNet), "opening the isolated network's egress firewall") + return pkgerrors.Wrap(c.CreateEgressFirewallRules(isoNet), "opening the isolated network's egress firewall") } // ReconcileLoadBalancer configures the API server load balancer. @@ -745,25 +745,25 @@ func (c *client) ReconcileLoadBalancer( if csCluster.Spec.APIServerLoadBalancer.IsEnabled() { // Associate Public IP with CloudStackIsolatedNetwork if err := c.AssociatePublicIPAddress(fd, isoNet, csCluster); err != nil { - return errors.Wrapf(err, "associating public IP address to csCluster") + return pkgerrors.Wrapf(err, "associating public IP address to csCluster") } }*/ // Set up load balancing rules to map VM ports to Public IP ports. if err := c.ReconcileLoadBalancerRules(isoNet, csCluster); err != nil { - return errors.Wrap(err, "reconciling load balancing rules") + return pkgerrors.Wrap(err, "reconciling load balancing rules") } // Set up firewall rules to manage access to load balancer public IP ports. if err := c.ReconcileFirewallRules(isoNet, csCluster); err != nil { - return errors.Wrap(err, "reconciling firewall rules") + return pkgerrors.Wrap(err, "reconciling firewall rules") } if !csCluster.Spec.APIServerLoadBalancer.IsEnabled() && isoNet.Status.APIServerLoadBalancer != nil { // If the APIServerLoadBalancer has been disabled, release its IP unless it's the SNAT IP. released, err := c.DisassociatePublicIPAddressIfNotInUse(isoNet.Status.APIServerLoadBalancer.IPAddressID) if err != nil { - return errors.Wrap(err, "disassociating public IP address") + return pkgerrors.Wrap(err, "disassociating public IP address") } if released { isoNet.Status.APIServerLoadBalancer.IPAddress = "" @@ -888,7 +888,7 @@ func (c *client) DeleteNetwork(net infrav1.Network) error { _, err := c.cs.Network.DeleteNetwork(c.cs.Network.NewDeleteNetworkParams(net.ID)) c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return errors.Wrapf(err, "deleting network with id %s", net.ID) + return pkgerrors.Wrapf(err, "deleting network with id %s", net.ID) } // DisposeIsoNetResources cleans up isolated network resources. @@ -952,7 +952,7 @@ func (c *client) DeleteNetworkIfNotInUse(net infrav1.Network) error { // disassociated, and an error in case an error occurred. func (c *client) DisassociatePublicIPAddressIfNotInUse(ipAddressID string) (bool, error) { if ipAddressID == "" { - return false, errors.New("ipAddressID cannot be empty") + return false, pkgerrors.New("ipAddressID cannot be empty") } if tagsAllowDisposal, err := c.DoClusterTagsAllowDisposal(ResourceTypeIPAddress, ipAddressID); err != nil { return false, err @@ -976,7 +976,7 @@ func (c *client) DisassociatePublicIPAddressIfNotInUse(ipAddressID string) (bool // DisassociatePublicIPAddress removes a CloudStack public IP association an isolated network. func (c *client) DisassociatePublicIPAddress(ipAddressID string) error { if ipAddressID == "" { - return errors.New("ipAddressID cannot be empty") + return pkgerrors.New("ipAddressID cannot be empty") } // Remove the CAPC creation tag, so it won't be there the next time this address is associated. diff --git a/pkg/cloud/isolated_network_test.go b/pkg/cloud/isolated_network_test.go index 76d14bdc..845c5600 100644 --- a/pkg/cloud/isolated_network_test.go +++ b/pkg/cloud/isolated_network_test.go @@ -22,7 +22,7 @@ import ( csapi "github.com/apache/cloudstack-go/v2/cloudstack" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "go.uber.org/mock/gomock" "k8s.io/utils/ptr" @@ -36,7 +36,7 @@ var _ = Describe("Network", func() { errorMessage = "Error" ) - fakeError := errors.New(errorMessage) + fakeError := pkgerrors.New(errorMessage) var ( // Declare shared vars. mockCtrl *gomock.Controller mockClient *csapi.CloudStackClient @@ -285,7 +285,7 @@ var _ = Describe("Network", func() { }, nil) aip := &csapi.AssociateIpAddressParams{} as.EXPECT().NewAssociateIpAddressParams().Return(aip) - as.EXPECT().AssociateIpAddress(aip).Return(nil, errors.New("Failed to allocate IP address")) + as.EXPECT().AssociateIpAddress(aip).Return(nil, pkgerrors.New("Failed to allocate IP address")) _, err := client.AssociatePublicIPAddress(dummies.CSFailureDomain1, dummies.CSISONet1, dummies.CSCluster.Spec.ControlPlaneEndpoint.Host) Ω(err.Error()).Should(ContainSubstring("associating public IP address with ID")) @@ -540,7 +540,7 @@ var _ = Describe("Network", func() { lbip := &csapi.ListLoadBalancerRuleInstancesParams{} lbs.EXPECT().NewListLoadBalancerRuleInstancesParams(dummies.CSISONet1.Status.LoadBalancerRuleIDs[0]). Return(lbip) - lbs.EXPECT().ListLoadBalancerRuleInstances(lbip).Return(nil, errors.New("No match found for stale-rule-id")) + lbs.EXPECT().ListLoadBalancerRuleInstances(lbip).Return(nil, pkgerrors.New("No match found for stale-rule-id")) assigned, err := client.AssignVMToLoadBalancerRules(dummies.CSISONet1, *dummies.CSMachine1.Spec.InstanceID) Ω(assigned).Should(BeFalse()) @@ -555,7 +555,7 @@ var _ = Describe("Network", func() { lbs.EXPECT().NewListLoadBalancerRuleInstancesParams("stale-rule-id"). Return(lbip), lbs.EXPECT().ListLoadBalancerRuleInstances(lbip). - Return(nil, errors.New("entity does not exist")), + Return(nil, pkgerrors.New("entity does not exist")), lbs.EXPECT().NewListLoadBalancerRuleInstancesParams("valid-rule-id"). Return(lbip), @@ -577,7 +577,7 @@ var _ = Describe("Network", func() { lbip := &csapi.ListLoadBalancerRuleInstancesParams{} lbs.EXPECT().NewListLoadBalancerRuleInstancesParams("stale-rule-id"). Return(lbip) - lbs.EXPECT().ListLoadBalancerRuleInstances(lbip).Return(nil, errors.New("Unable to find uuid for id stale-rule-id")) + lbs.EXPECT().ListLoadBalancerRuleInstances(lbip).Return(nil, pkgerrors.New("Unable to find uuid for id stale-rule-id")) removed, err := client.RemoveVMFromLoadBalancerRules(dummies.CSISONet1, *dummies.CSMachine1.Spec.InstanceID) Ω(removed).Should(BeFalse()) diff --git a/pkg/cloud/network.go b/pkg/cloud/network.go index de31f121..1097908b 100644 --- a/pkg/cloud/network.go +++ b/pkg/cloud/network.go @@ -19,7 +19,7 @@ package cloud import ( "github.com/apache/cloudstack-go/v2/cloudstack" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3" ) @@ -46,9 +46,9 @@ func (c *client) ResolveNetwork(net *infrav1.Network) (retErr error) { netDetails, count, err := c.cs.Network.GetNetworkByName(netName, cloudstack.WithProject(c.user.Project.ID)) if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - retErr = multierror.Append(retErr, errors.Wrapf(err, "could not get Network ID from %s", netName)) + retErr = multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Network ID from %s", netName)) } else if count != 1 { - retErr = multierror.Append(retErr, errors.Errorf( + retErr = multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Network with name %s, but got %d", netName, count)) } else { // Got netID from the network's name. net.ID = netDetails.Id @@ -62,11 +62,11 @@ func (c *client) ResolveNetwork(net *infrav1.Network) (retErr error) { // Now get network details. netDetails, count, err = c.cs.Network.GetNetworkByID(net.ID, cloudstack.WithProject(c.user.Project.ID)) if err != nil { - return multierror.Append(retErr, errors.Wrapf(err, "could not get Network by ID %s", net.ID)) + return multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Network by ID %s", net.ID)) } else if count != 1 { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return multierror.Append(retErr, errors.Errorf("expected 1 Network with UUID %s, but got %d", net.ID, count)) + return multierror.Append(retErr, pkgerrors.Errorf("expected 1 Network with UUID %s, but got %d", net.ID, count)) } net.Name = netDetails.Name net.ID = netDetails.Id diff --git a/pkg/cloud/tags.go b/pkg/cloud/tags.go index 0515c523..74b2c2e7 100644 --- a/pkg/cloud/tags.go +++ b/pkg/cloud/tags.go @@ -20,7 +20,7 @@ import ( "strings" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3" ) @@ -61,7 +61,7 @@ func ignoreAlreadyPresentErrors(err error, rType ResourceType, rID string) error func (c *client) IsCapcManaged(resourceType ResourceType, resourceID string) (bool, error) { tags, err := c.GetTags(resourceType, resourceID) if err != nil { - return false, errors.Wrapf(err, + return false, pkgerrors.Wrapf(err, "checking if %s with ID: %s is tagged as CAPC managed", resourceType, resourceID) } _, CreatedByCAPC := tags[CreatedByCAPCTagName] @@ -166,7 +166,7 @@ func (c *client) DeleteTags(rType ResourceType, rID string, tagsToDelete map[str if tags, err2 := c.GetTags(rType, rID); len(tags) != 0 { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err2) if _, foundTag := tags[tagkey]; foundTag { - return errors.Wrapf(multierror.Append(err1, err2), + return pkgerrors.Wrapf(multierror.Append(err1, err2), "could not remove tag %s from %s with ID %s", currTag, rType, rID) } } diff --git a/pkg/cloud/tags_test.go b/pkg/cloud/tags_test.go index d9854e77..e8b233bc 100644 --- a/pkg/cloud/tags_test.go +++ b/pkg/cloud/tags_test.go @@ -20,7 +20,7 @@ import ( csapi "github.com/apache/cloudstack-go/v2/cloudstack" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "go.uber.org/mock/gomock" "sigs.k8s.io/cluster-api-provider-cloudstack/pkg/cloud" @@ -32,7 +32,7 @@ var _ = Describe("Tag Unit Tests", func() { errorMessage = "Error" ) - fakeError := errors.New(errorMessage) + fakeError := pkgerrors.New(errorMessage) var ( // Declare shared vars. mockCtrl *gomock.Controller mockClient *csapi.CloudStackClient diff --git a/pkg/cloud/user_credentials.go b/pkg/cloud/user_credentials.go index fe6b3beb..ed4b8f30 100644 --- a/pkg/cloud/user_credentials.go +++ b/pkg/cloud/user_credentials.go @@ -19,7 +19,7 @@ package cloud import ( "strings" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" ) const ( @@ -115,10 +115,10 @@ func (c *client) ResolveDomain(domain *Domain) error { // If the Id was provided. if domain.ID != "" { if resp.Count != 1 { - return errors.Errorf("domain ID %s provided, expected exactly one domain, got %d", domain.ID, resp.Count) + return pkgerrors.Errorf("domain ID %s provided, expected exactly one domain, got %d", domain.ID, resp.Count) } if domain.Path != "" && !strings.EqualFold(resp.Domains[0].Path, domain.Path) { - return errors.Errorf("domain Path %s did not match domain ID %s", domain.Path, domain.ID) + return pkgerrors.Errorf("domain Path %s did not match domain ID %s", domain.Path, domain.ID) } domain.Path = resp.Domains[0].Path domain.Name = resp.Domains[0].Name @@ -132,7 +132,7 @@ func (c *client) ResolveDomain(domain *Domain) error { // Consider the case where only the domain name is provided. if domain.Path == "" && domain.Name != "" { if resp.Count != 1 { - return errors.Errorf( + return pkgerrors.Errorf( "only domain name: %s provided, expected exactly one domain, got %d", domain.Name, resp.Count) } } @@ -150,7 +150,7 @@ func (c *client) ResolveDomain(domain *Domain) error { return nil } - return errors.Errorf("domain not found for domain path %s", domain.Path) + return pkgerrors.Errorf("domain not found for domain path %s", domain.Path) } // ResolveAccount resolves an account's information. @@ -158,7 +158,7 @@ func (c *client) ResolveAccount(account *Account) error { // Resolve domain prior to any account resolution activity. if err := c.ResolveDomain(&account.Domain); err != nil && !strings.Contains(err.Error(), "The API [listDomains] does not exist or is not available for the account Account") { - return errors.Wrapf(err, "resolving domain %s details", account.Domain.Name) + return pkgerrors.Wrapf(err, "resolving domain %s details", account.Domain.Name) } p := c.cs.Account.NewListAccountsParams() @@ -171,9 +171,9 @@ func (c *client) ResolveAccount(account *Account) error { return retErr } else if resp.Count == 0 { - return errors.Errorf("could not find account %s", account.Name) + return pkgerrors.Errorf("could not find account %s", account.Name) } else if resp.Count != 1 { - return errors.Errorf("expected 1 Account with account name %s in domain ID %s, but got %d", + return pkgerrors.Errorf("expected 1 Account with account name %s in domain ID %s, but got %d", account.Name, account.Domain.ID, resp.Count) } account.ID = resp.Accounts[0].Id @@ -202,9 +202,9 @@ func (c *client) ResolveProject(user *User) error { return err } else if resp.Count == 0 { - return errors.Errorf("could not find project with ID '%s'", user.Project.ID) + return pkgerrors.Errorf("could not find project with ID '%s'", user.Project.ID) } else if resp.Count != 1 { - return errors.Errorf("expected 1 Project with ID '%s' in domain ID '%s', but got %d", + return pkgerrors.Errorf("expected 1 Project with ID '%s' in domain ID '%s', but got %d", user.Project.ID, c.user.Domain.ID, resp.Count) } c.user.Project.ID = resp.Projects[0].Id @@ -220,7 +220,7 @@ func (c *client) ResolveProject(user *User) error { func (c *client) ResolveUser(user *User) error { // Resolve account prior to any user resolution activity. if err := c.ResolveAccount(&user.Account); err != nil { - return errors.Wrapf(err, "resolving account %s details", user.Account.Name) + return pkgerrors.Wrapf(err, "resolving account %s details", user.Account.Name) } p := c.cs.User.NewListUsersParams() @@ -234,7 +234,7 @@ func (c *client) ResolveUser(user *User) error { return err } else if resp.Count != 1 { - return errors.Errorf("expected 1 User with username %s but got %d", user.Name, resp.Count) + return pkgerrors.Errorf("expected 1 User with username %s but got %d", user.Name, resp.Count) } user.ID = resp.Users[0].Id @@ -247,7 +247,7 @@ func (c *client) ResolveUser(user *User) error { func (c *client) ResolveUserKeys(user *User) error { // Resolve user prior to any api key resolution activity. if err := c.ResolveUser(user); err != nil { - return errors.Wrap(err, "error encountered when resolving user details") + return pkgerrors.Wrap(err, "error encountered when resolving user details") } p := c.cs.User.NewGetUserKeysParams(user.ID) @@ -255,7 +255,7 @@ func (c *client) ResolveUserKeys(user *User) error { if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return errors.Errorf("error encountered when resolving user api keys for user %s", user.Name) + return pkgerrors.Errorf("error encountered when resolving user api keys for user %s", user.Name) } user.APIKey = resp.Apikey user.SecretKey = resp.Secretkey @@ -268,11 +268,11 @@ func (c *client) ResolveUserKeys(user *User) error { func (c *client) GetUserWithKeys(user *User) (bool, error) { // Resolve account prior to any user resolution activity. if err := c.ResolveAccount(&user.Account); err != nil { - return false, errors.Wrapf(err, "resolving account %s details", user.Account.Name) + return false, pkgerrors.Wrapf(err, "resolving account %s details", user.Account.Name) } if err := c.ResolveProject(user); err != nil { - return false, errors.Wrapf(err, "resolving project %s details", user.Project.Name) + return false, pkgerrors.Wrapf(err, "resolving project %s details", user.Project.Name) } // List users and take first user that has already has api keys. diff --git a/pkg/cloud/zone.go b/pkg/cloud/zone.go index f6f2cb5a..2be1a3c5 100644 --- a/pkg/cloud/zone.go +++ b/pkg/cloud/zone.go @@ -19,7 +19,7 @@ package cloud import ( "github.com/apache/cloudstack-go/v2/cloudstack" "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3" ) @@ -31,11 +31,11 @@ type ZoneIFace interface { func (c *client) ResolveZone(zSpec *infrav1.CloudStackZoneSpec) (retErr error) { if zoneID, count, err := c.cs.Zone.GetZoneID(zSpec.Name); err != nil { - retErr = multierror.Append(retErr, errors.Wrapf(err, "could not get Zone ID from %v", zSpec.Name)) + retErr = multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Zone ID from %v", zSpec.Name)) c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - retErr = multierror.Append(retErr, errors.Wrapf(err, "could not get Zone ID from %v", zSpec.Name)) + retErr = multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Zone ID from %v", zSpec.Name)) } else if count != 1 { - retErr = multierror.Append(retErr, errors.Errorf( + retErr = multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Zone with name %s, but got %d", zSpec.Name, count)) } else { zSpec.ID = zoneID @@ -45,9 +45,9 @@ func (c *client) ResolveZone(zSpec *infrav1.CloudStackZoneSpec) (retErr error) { if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return multierror.Append(retErr, errors.Wrapf(err, "could not get Zone by ID %v", zSpec.ID)) + return multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Zone by ID %v", zSpec.ID)) } else if count != 1 { - return multierror.Append(retErr, errors.Errorf( + return multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Zone with UUID %s, but got %d", zSpec.ID, count)) } zSpec.Name = resp.Name @@ -61,9 +61,9 @@ func (c *client) ResolveNetworkForZone(zSpec *infrav1.CloudStackZoneSpec) (retEr netDetails, count, err := c.cs.Network.GetNetworkByName(netName, cloudstack.WithProject(c.user.Project.ID)) if err != nil { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - retErr = multierror.Append(retErr, errors.Wrapf(err, "could not get Network ID from %v", netName)) + retErr = multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Network ID from %v", netName)) } else if count != 1 { - retErr = multierror.Append(retErr, errors.Errorf( + retErr = multierror.Append(retErr, pkgerrors.Errorf( "expected 1 Network with name %s, but got %d", netName, count)) } else { // Got netID from the network's name. zSpec.Network.ID = netDetails.Id @@ -75,11 +75,11 @@ func (c *client) ResolveNetworkForZone(zSpec *infrav1.CloudStackZoneSpec) (retEr // Now get network details. netDetails, count, err = c.cs.Network.GetNetworkByID(zSpec.Network.ID, cloudstack.WithProject(c.user.Project.ID)) if err != nil { - return multierror.Append(retErr, errors.Wrapf(err, "could not get Network by ID %s", zSpec.Network.ID)) + return multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Network by ID %s", zSpec.Network.ID)) } else if count != 1 { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) - return multierror.Append(retErr, errors.Errorf("expected 1 Network with UUID %v, but got %d", zSpec.Network.ID, count)) + return multierror.Append(retErr, pkgerrors.Errorf("expected 1 Network with UUID %v, but got %d", zSpec.Network.ID, count)) } zSpec.Network.Name = netDetails.Name zSpec.Network.ID = netDetails.Id diff --git a/pkg/cloud/zone_test.go b/pkg/cloud/zone_test.go index a4464394..eb2e1d67 100644 --- a/pkg/cloud/zone_test.go +++ b/pkg/cloud/zone_test.go @@ -22,7 +22,7 @@ import ( csapi "github.com/apache/cloudstack-go/v2/cloudstack" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "go.uber.org/mock/gomock" "sigs.k8s.io/cluster-api-provider-cloudstack/pkg/cloud" @@ -34,7 +34,7 @@ var _ = Describe("Zone", func() { errorMessage = "Error" ) - fakeError := errors.New(errorMessage) + fakeError := pkgerrors.New(errorMessage) var ( client cloud.Client mockCtrl *gomock.Controller @@ -58,17 +58,17 @@ var _ = Describe("Zone", func() { Context("an existing abstract dummies.CSCluster", func() { It("handles zone not found.", func() { - expectedErr := errors.New("Not found") + expectedErr := pkgerrors.New("Not found") zs.EXPECT().GetZoneID(dummies.Zone1.Name).Return("", -1, expectedErr) zs.EXPECT().GetZoneByID(dummies.Zone1.ID).Return(nil, -1, expectedErr) err := client.ResolveZone(&dummies.CSFailureDomain1.Spec.Zone) - Expect(errors.Cause(err)).To(MatchError(expectedErr)) + Expect(pkgerrors.Cause(err)).To(MatchError(expectedErr)) }) It("handles multiple zone IDs returned", func() { zs.EXPECT().GetZoneID(dummies.Zone1.Name).Return(dummies.Zone1.ID, 2, nil) - zs.EXPECT().GetZoneByID(dummies.Zone1.ID).Return(nil, -1, errors.New("Not found")) + zs.EXPECT().GetZoneByID(dummies.Zone1.ID).Return(nil, -1, pkgerrors.New("Not found")) Ω(client.ResolveZone(&dummies.CSFailureDomain1.Spec.Zone)).Should(MatchError(And( ContainSubstring("expected 1 Zone with name "+dummies.Zone1.Name+", but got 2"), diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 95f67f00..35c25f0e 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -20,7 +20,7 @@ package metrics import ( "regexp" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" crtlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics" ) @@ -43,7 +43,7 @@ func NewCustomMetrics() ACSCustomMetrics { ) if err := crtlmetrics.Registry.Register(customMetrics.acsReconciliationErrorCount); err != nil { are := prometheus.AlreadyRegisteredError{} - if errors.As(err, &are) { + if pkgerrors.As(err, &are) { customMetrics.acsReconciliationErrorCount = are.ExistingCollector.(*prometheus.CounterVec) } else { // Something else went wrong! diff --git a/pkg/scope/affinitygroup.go b/pkg/scope/affinitygroup.go index 69da6328..3b8fbf4c 100644 --- a/pkg/scope/affinitygroup.go +++ b/pkg/scope/affinitygroup.go @@ -19,7 +19,7 @@ package scope import ( "context" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "k8s.io/klog/v2" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util/patch" @@ -43,10 +43,10 @@ type AffinityGroupScopeParams struct { // This is meant to be called for each reconcile iteration. func NewAffinityGroupScope(params AffinityGroupScopeParams) (*AffinityGroupScope, error) { if params.Cluster == nil { - return nil, errors.New("failed to generate new scope from nil Cluster") + return nil, pkgerrors.New("failed to generate new scope from nil Cluster") } if params.CloudStackAffinityGroup == nil { - return nil, errors.New("failed to generate new scope from nil CloudStackAffinityGroup") + return nil, pkgerrors.New("failed to generate new scope from nil CloudStackAffinityGroup") } if params.Logger == nil { @@ -65,7 +65,7 @@ func NewAffinityGroupScope(params AffinityGroupScopeParams) (*AffinityGroupScope helper, err := patch.NewHelper(params.CloudStackAffinityGroup, params.Client) if err != nil { - return nil, errors.Wrap(err, "failed to init patch helper") + return nil, pkgerrors.Wrap(err, "failed to init patch helper") } affinityGroupScope.patchHelper = helper diff --git a/pkg/scope/clients.go b/pkg/scope/clients.go index 7a60395e..84d456b5 100644 --- a/pkg/scope/clients.go +++ b/pkg/scope/clients.go @@ -22,7 +22,7 @@ import ( "fmt" "time" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "gopkg.in/yaml.v3" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" @@ -94,17 +94,17 @@ func NewClientScopeFactory(maxCacheSize int) ClientScopeFactory { func (s *clientScopeFactory) NewClientScopeForFailureDomain(ctx context.Context, k8sClient client.Client, fd *infrav1.CloudStackFailureDomain) (scope Scope, err error) { if fd == nil { - return nil, errors.New("failure domain is nil") + return nil, pkgerrors.New("failure domain is nil") } cloudConfig, err := getCloudConfigFromSecret(ctx, k8sClient, fd.Spec.ACSEndpoint.Namespace, fd.Spec.ACSEndpoint.Name) if err != nil { - return nil, errors.Wrapf(err, "getting client config from secret") + return nil, pkgerrors.Wrapf(err, "getting client config from secret") } clientConfig, err := getClientConfig(ctx, k8sClient, fd.Spec.ACSEndpoint.Namespace, fd.Spec.ACSEndpoint.Name) if err != nil { - return nil, errors.Wrapf(err, "getting client configuration configmap") + return nil, pkgerrors.Wrapf(err, "getting client configuration configmap") } return NewClientScope(s.clientCache, fd, cloudConfig, clientConfig) @@ -128,14 +128,14 @@ func NewClientScope(cache *cache.LRUExpireCache, fd *infrav1.CloudStackFailureDo csClient, err := cloud.NewClientFromConf(cloudConfig, clientConfig, cloud.WithProject(fd.Spec.Project)) if err != nil { - return nil, errors.Wrapf(err, "parsing ACSEndpoint secret with ref: %v", fd.Spec.ACSEndpoint) + return nil, pkgerrors.Wrapf(err, "parsing ACSEndpoint secret with ref: %v", fd.Spec.ACSEndpoint) } csUser := csClient if fd.Spec.Account != "" { // Set CSUser CloudStack Client per Account and Domain. csUser, err = cloud.NewClientInDomainAndAccount(csClient, fd.Spec.Domain, fd.Spec.Account, cloud.WithProject(fd.Spec.Project)) if err != nil { - return nil, errors.Wrapf(err, "creating CloudStack User Client with domain %s and account %s", fd.Spec.Domain, fd.Spec.Account) + return nil, pkgerrors.Wrapf(err, "creating CloudStack User Client with domain %s and account %s", fd.Spec.Domain, fd.Spec.Account) } } @@ -162,7 +162,7 @@ func getCloudConfigFromSecret(ctx context.Context, k8sClient client.Client, secr endpointSecret := &corev1.Secret{} key := client.ObjectKey{Name: secretName, Namespace: secretNamespace} if err := k8sClient.Get(ctx, key, endpointSecret); err != nil { - return cloudConfig, errors.Wrapf(err, "getting ACSEndpoint secret with ref: %s/%s", secretNamespace, secretName) + return cloudConfig, pkgerrors.Wrapf(err, "getting ACSEndpoint secret with ref: %s/%s", secretNamespace, secretName) } endpointSecretStrings := map[string]string{} @@ -179,7 +179,7 @@ func getCloudConfigFromSecret(ctx context.Context, k8sClient client.Client, secr } if err := cloudConfig.Validate(); err != nil { - return cloudConfig, errors.Wrapf(err, "invalid cloud config") + return cloudConfig, pkgerrors.Wrapf(err, "invalid cloud config") } return cloudConfig, nil @@ -191,7 +191,7 @@ func getClientConfig(ctx context.Context, k8sClient client.Client, configMapName key := client.ObjectKey{Name: configMapName, Namespace: configMapNamespace} if err := k8sClient.Get(ctx, key, clientConfig); err != nil { if !k8serrors.IsNotFound(err) { - return nil, errors.Wrapf(err, "getting client configuration configmap with ref: %s/%s", configMapNamespace, configMapName) + return nil, pkgerrors.Wrapf(err, "getting client configuration configmap with ref: %s/%s", configMapNamespace, configMapName) } } diff --git a/pkg/scope/cluster.go b/pkg/scope/cluster.go index a6bc0704..d188854a 100644 --- a/pkg/scope/cluster.go +++ b/pkg/scope/cluster.go @@ -20,7 +20,7 @@ package scope import ( "context" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/klog/v2" "k8s.io/utils/ptr" @@ -47,10 +47,10 @@ type ClusterScopeParams struct { // This is meant to be called for each reconcile iteration. func NewClusterScope(params ClusterScopeParams) (*ClusterScope, error) { if params.Cluster == nil { - return nil, errors.New("failed to generate new scope from nil Cluster") + return nil, pkgerrors.New("failed to generate new scope from nil Cluster") } if params.CloudStackCluster == nil { - return nil, errors.New("failed to generate new scope from nil CloudStackCluster") + return nil, pkgerrors.New("failed to generate new scope from nil CloudStackCluster") } if params.Logger == nil { @@ -68,7 +68,7 @@ func NewClusterScope(params ClusterScopeParams) (*ClusterScope, error) { helper, err := v1beta1patch.NewHelper(params.CloudStackCluster, params.Client) if err != nil { - return nil, errors.Wrap(err, "failed to init patch helper") + return nil, pkgerrors.Wrap(err, "failed to init patch helper") } clusterScope.patchHelper = helper diff --git a/pkg/scope/failuredomain.go b/pkg/scope/failuredomain.go index b90d7e80..c8b2c8fc 100644 --- a/pkg/scope/failuredomain.go +++ b/pkg/scope/failuredomain.go @@ -23,7 +23,7 @@ import ( "regexp" "strings" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/klog/v2" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" @@ -50,10 +50,10 @@ var metaNameRegex = regexp.MustCompile(`[^a-z0-9-]+`) // This is meant to be called for each reconcile iteration. func NewFailureDomainScope(params FailureDomainScopeParams) (*FailureDomainScope, error) { if params.Cluster == nil { - return nil, errors.New("failed to generate new scope from nil Cluster") + return nil, pkgerrors.New("failed to generate new scope from nil Cluster") } if params.CloudStackFailureDomain == nil { - return nil, errors.New("failed to generate new scope from nil CloudStackFailureDomain") + return nil, pkgerrors.New("failed to generate new scope from nil CloudStackFailureDomain") } if params.Logger == nil { @@ -72,7 +72,7 @@ func NewFailureDomainScope(params FailureDomainScopeParams) (*FailureDomainScope helper, err := patch.NewHelper(params.CloudStackFailureDomain, params.Client) if err != nil { - return nil, errors.Wrap(err, "failed to init patch helper") + return nil, pkgerrors.Wrap(err, "failed to init patch helper") } failureDomainScope.patchHelper = helper diff --git a/pkg/scope/isolatednetwork.go b/pkg/scope/isolatednetwork.go index 182f494c..d70bcf3a 100644 --- a/pkg/scope/isolatednetwork.go +++ b/pkg/scope/isolatednetwork.go @@ -20,7 +20,7 @@ package scope import ( "context" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/klog/v2" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" @@ -47,10 +47,10 @@ type IsolatedNetworkScopeParams struct { // This is meant to be called for each reconcile iteration. func NewIsolatedNetworkScope(params IsolatedNetworkScopeParams) (*IsolatedNetworkScope, error) { if params.Cluster == nil { - return nil, errors.New("failed to generate new scope from nil Cluster") + return nil, pkgerrors.New("failed to generate new scope from nil Cluster") } if params.CloudStackIsolatedNetwork == nil { - return nil, errors.New("failed to generate new scope from nil CloudStackIsolatedNetwork") + return nil, pkgerrors.New("failed to generate new scope from nil CloudStackIsolatedNetwork") } if params.Logger == nil { @@ -71,7 +71,7 @@ func NewIsolatedNetworkScope(params IsolatedNetworkScopeParams) (*IsolatedNetwor helper, err := patch.NewHelper(params.CloudStackIsolatedNetwork, params.Client) if err != nil { - return nil, errors.Wrap(err, "failed to init patch helper") + return nil, pkgerrors.Wrap(err, "failed to init patch helper") } isolatedNetworkScope.patchHelper = helper diff --git a/pkg/scope/machinescope.go b/pkg/scope/machinescope.go index f720163e..fe8ae59b 100644 --- a/pkg/scope/machinescope.go +++ b/pkg/scope/machinescope.go @@ -22,7 +22,7 @@ import ( "fmt" "strings" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" @@ -59,13 +59,13 @@ type MachineScopeParams struct { // This is meant to be called for each reconcile iteration. func NewMachineScope(params MachineScopeParams) (*MachineScope, error) { if params.Cluster == nil { - return nil, errors.New("failed to generate new scope from nil Cluster") + return nil, pkgerrors.New("failed to generate new scope from nil Cluster") } if params.Machine == nil { - return nil, errors.New("failed to generate new scope from nil Machine") + return nil, pkgerrors.New("failed to generate new scope from nil Machine") } if params.CloudStackMachine == nil { - return nil, errors.New("failed to generate new scope from nil CloudStackMachine") + return nil, pkgerrors.New("failed to generate new scope from nil CloudStackMachine") } if params.Logger == nil { @@ -87,7 +87,7 @@ func NewMachineScope(params MachineScopeParams) (*MachineScope, error) { helper, err := v1beta1patch.NewHelper(params.CloudStackMachine, params.Client) if err != nil { - return nil, errors.Wrap(err, "failed to init patch helper") + return nil, pkgerrors.Wrap(err, "failed to init patch helper") } machineScope.patchHelper = helper @@ -211,7 +211,7 @@ func (s *MachineScope) IsolatedNetwork(ctx context.Context) (*infrav1.CloudStack isonet := &infrav1.CloudStackIsolatedNetwork{} err := s.client.Get(ctx, client.ObjectKey{Name: s.IsolatedNetworkName(), Namespace: s.Namespace()}, isonet) if err != nil { - return nil, errors.Wrapf(err, "failed to get isolated network with name %s", s.IsolatedNetworkName()) + return nil, pkgerrors.Wrapf(err, "failed to get isolated network with name %s", s.IsolatedNetworkName()) } return isonet, nil @@ -286,18 +286,18 @@ func (s *MachineScope) SetInstanceID(id string) { // GetBootstrapData returns the bootstrap data from the secret in the Machine's bootstrap.dataSecretName. func (s *MachineScope) GetBootstrapData() ([]byte, error) { if s.Machine.Spec.Bootstrap.DataSecretName == nil { - return nil, errors.New("error retrieving bootstrap data: linked Machine's bootstrap.dataSecretName is nil") + return nil, pkgerrors.New("error retrieving bootstrap data: linked Machine's bootstrap.dataSecretName is nil") } secret := &corev1.Secret{} key := types.NamespacedName{Namespace: s.Machine.Namespace, Name: *s.Machine.Spec.Bootstrap.DataSecretName} if err := s.client.Get(context.TODO(), key, secret); err != nil { - return nil, errors.Wrapf(err, "failed to retrieve bootstrap data secret for CloudStackMachine %s/%s", s.Namespace(), s.Name()) + return nil, pkgerrors.Wrapf(err, "failed to retrieve bootstrap data secret for CloudStackMachine %s/%s", s.Namespace(), s.Name()) } value, ok := secret.Data["value"] if !ok { - return nil, errors.New("error retrieving bootstrap data: secret value key is missing") + return nil, pkgerrors.New("error retrieving bootstrap data: secret value key is missing") } return value, nil diff --git a/pkg/scope/machinetemplate.go b/pkg/scope/machinetemplate.go index 2767945c..fa192833 100644 --- a/pkg/scope/machinetemplate.go +++ b/pkg/scope/machinetemplate.go @@ -3,7 +3,7 @@ package scope import ( "context" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "k8s.io/klog/v2" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util/patch" @@ -27,10 +27,10 @@ type MachineTemplateScopeParams struct { // This is meant to be called for each reconcile iteration. func NewMachineTemplateScope(params MachineTemplateScopeParams) (*MachineTemplateScope, error) { if params.Cluster == nil { - return nil, errors.New("failed to generate new scope from nil Cluster") + return nil, pkgerrors.New("failed to generate new scope from nil Cluster") } if params.CloudStackMachineTemplate == nil { - return nil, errors.New("failed to generate new scope from nil CloudStackMachineTemplate") + return nil, pkgerrors.New("failed to generate new scope from nil CloudStackMachineTemplate") } if params.Logger == nil { @@ -49,7 +49,7 @@ func NewMachineTemplateScope(params MachineTemplateScopeParams) (*MachineTemplat helper, err := patch.NewHelper(params.CloudStackMachineTemplate, params.Client) if err != nil { - return nil, errors.Wrap(err, "failed to init patch helper") + return nil, pkgerrors.Wrap(err, "failed to init patch helper") } machineTemplateScope.patchHelper = helper diff --git a/pkg/scope/mock.go b/pkg/scope/mock.go index 7823b296..cbab4d6f 100644 --- a/pkg/scope/mock.go +++ b/pkg/scope/mock.go @@ -19,7 +19,7 @@ package scope import ( "context" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" "go.uber.org/mock/gomock" "sigs.k8s.io/controller-runtime/pkg/client" @@ -43,7 +43,7 @@ func NewMockClientScopeFactory(mockCtrl *gomock.Controller, projectID string) *M func (m *MockClientScopeFactory) NewClientScopeForFailureDomain(_ context.Context, _ client.Client, fd *infrav1.CloudStackFailureDomain) (Scope, error) { if fd == nil { - return nil, errors.New("failure domain is nil") + return nil, pkgerrors.New("failure domain is nil") } return m, nil diff --git a/test/helpers/envtest.go b/test/helpers/envtest.go index e7340d0a..df712e60 100644 --- a/test/helpers/envtest.go +++ b/test/helpers/envtest.go @@ -32,7 +32,7 @@ import ( "time" "github.com/onsi/ginkgo/v2" - "github.com/pkg/errors" + pkgerrors "github.com/pkg/errors" admissionv1 "k8s.io/api/admissionregistration/v1" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -237,11 +237,11 @@ func buildModifiedWebhook(tag string, relativeFilePath string) (admissionv1.Muta var validatingWebhook admissionv1.ValidatingWebhookConfiguration data, err := os.ReadFile(filepath.Clean(filepath.Join(root, relativeFilePath))) if err != nil { - return mutatingWebhook, validatingWebhook, errors.Wrap(err, "failed to read webhook configuration file") + return mutatingWebhook, validatingWebhook, pkgerrors.Wrap(err, "failed to read webhook configuration file") } objs, err := utilyaml.ToUnstructured(data) if err != nil { - return mutatingWebhook, validatingWebhook, errors.Wrap(err, "failed to parse yaml") + return mutatingWebhook, validatingWebhook, pkgerrors.Wrap(err, "failed to parse yaml") } for i := range objs { o := objs[i] From a261495f6db6e57cf390d80c570989d22825f482 Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 12:38:32 +0300 Subject: [PATCH 05/10] chore: Use the standard library for errors.Is, As and the ErrNotFound sentinel With pkg/errors now aliased as pkgerrors, the bare errors identifier is free for the standard library. These seven sites are the ones where pkg/errors adds nothing, so they move over. This mirrors upstream Cluster API, which uses stdlib errors.New, errors.Is and errors.As alongside pkgerrors. pkg/errors' Is and As are thin forwarders to the standard library, so the six call sites in cloudstackmachine_controller.go, pkg/cloud/instance.go, pkg/cloud/client.go and pkg/metrics/metrics.go call exactly the same function before and after. cloud.ErrNotFound is returned bare and never wrapped, and every comparison against it is by identity, so stdlib errors.New is equivalent. It also drops a stack trace that nothing ever formatted. pkg/metrics/metrics.go had errors.As as its only pkg/errors use, so it no longer imports pkg/errors at all. The other three files keep it for Wrap, Wrapf, Errorf and New. Co-Authored-By: Claude Opus 5 (1M context) --- internal/controllers/cloudstackmachine_controller.go | 7 ++++--- pkg/cloud/client.go | 3 ++- pkg/cloud/instance.go | 5 +++-- pkg/metrics/metrics.go | 4 ++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/internal/controllers/cloudstackmachine_controller.go b/internal/controllers/cloudstackmachine_controller.go index ecb1a531..5ca719c2 100644 --- a/internal/controllers/cloudstackmachine_controller.go +++ b/internal/controllers/cloudstackmachine_controller.go @@ -18,6 +18,7 @@ package controllers import ( "context" + "errors" "fmt" "hash/crc32" "sort" @@ -188,7 +189,7 @@ func (r *CloudStackMachineReconciler) reconcileDelete(ctx context.Context, scope scope.Info("Reconcile CloudStackMachine deletion") vm, err := r.findInstance(scope) - if err != nil && !pkgerrors.Is(err, cloud.ErrNotFound) { + if err != nil && !errors.Is(err, cloud.ErrNotFound) { return ctrl.Result{}, err } if vm == nil { @@ -339,7 +340,7 @@ func (r *CloudStackMachineReconciler) reconcileNormal(ctx context.Context, scope } vm, err := r.findInstance(scope) - if err != nil && !pkgerrors.Is(err, cloud.ErrNotFound) { + if err != nil && !errors.Is(err, cloud.ErrNotFound) { v1beta1conditions.MarkUnknown(scope.CloudStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceNotFoundReason, "%s", err.Error()) return ctrl.Result{}, err } @@ -527,7 +528,7 @@ func (r *CloudStackMachineReconciler) findInstance(scope *scope.MachineScope) (* if scope.GetInstanceID() != "" { instance, err = scope.CSUser().GetVMInstanceByID(scope.GetInstanceID()) - if err != nil && !pkgerrors.Is(err, cloud.ErrNotFound) { + if err != nil && !errors.Is(err, cloud.ErrNotFound) { return nil, err } if instance != nil { diff --git a/pkg/cloud/client.go b/pkg/cloud/client.go index 59ee5211..686c275d 100644 --- a/pkg/cloud/client.go +++ b/pkg/cloud/client.go @@ -18,6 +18,7 @@ package cloud import ( "bytes" + "errors" "fmt" "io" "os" @@ -115,7 +116,7 @@ func UnmarshalAllSecretConfigs(in []byte, out *[]SecretConfig) error { var conf SecretConfig if err := decoder.Decode(&conf); err != nil { // Break when there are no more documents to decode - if pkgerrors.Is(err, io.EOF) { + if errors.Is(err, io.EOF) { return err } diff --git a/pkg/cloud/instance.go b/pkg/cloud/instance.go index 0e77b606..b3892e32 100644 --- a/pkg/cloud/instance.go +++ b/pkg/cloud/instance.go @@ -18,6 +18,7 @@ package cloud import ( "encoding/base64" + "errors" "fmt" "strconv" "strings" @@ -52,7 +53,7 @@ const ( ) var ( - ErrNotFound = pkgerrors.New("not found") + ErrNotFound = errors.New("not found") // InstanceRunningStates are the states that indicate the instance is running. InstanceRunningStates = sets.NewString(InstanceStateStarting, InstanceStateRunning) @@ -183,7 +184,7 @@ func (c *client) CreateVMInstance(csMachine *infrav1.CloudStackMachine, capiMach // clean up. vm, findErr := findVirtualMachine(c.cs.VirtualMachine, c.user.Project.ID, templateID, fd, csMachine) if findErr != nil { - if pkgerrors.Is(findErr, ErrNotFound) { + if errors.Is(findErr, ErrNotFound) { // We didn't find a VM so return the original error. return nil, err } diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 35c25f0e..b270af79 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -18,9 +18,9 @@ limitations under the License. package metrics import ( + "errors" "regexp" - pkgerrors "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" crtlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics" ) @@ -43,7 +43,7 @@ func NewCustomMetrics() ACSCustomMetrics { ) if err := crtlmetrics.Registry.Register(customMetrics.acsReconciliationErrorCount); err != nil { are := prometheus.AlreadyRegisteredError{} - if pkgerrors.As(err, &are) { + if errors.As(err, &are) { customMetrics.acsReconciliationErrorCount = are.ExistingCollector.(*prometheus.CounterVec) } else { // Something else went wrong! From 98e70a34af894a67ce7493592b5ee0f1ecaa957e Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 12:48:59 +0300 Subject: [PATCH 06/10] fix(e2e): Stop printing CloudStack credentials on an invalid secret CreateCloudStackClient validated the secret and, on failure, called Fail with "Invalid secret: %+v, %s, %s, %s" against secret.Data, apiURL, apiKey and secretKey. That wrote the entire secret map plus the CloudStack api-key and secret-key in cleartext into the test output, which in CI means the job log. The failure path only needs to say which keys are missing, so it now names them and prints nothing else. The secret's namespace and name are included so the message still points at the right object. This is also a better failure message: previously a missing verify-ssl or a typo'd key gave you a wall of base64 to read, and now it names the offending keys directly. Swept the rest of the repo for other places credentials could reach logs or test output and found none. Co-Authored-By: Claude Opus 5 (1M context) --- test/e2e/common.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/e2e/common.go b/test/e2e/common.go index f816271a..6d362629 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -402,8 +402,17 @@ func CreateCloudStackClient(ctx context.Context, kubeConfigPath string) *cloudst apiKey := string(secret.Data["api-key"]) secretKey := string(secret.Data["secret-key"]) verifySSL := string(secret.Data["verify-ssl"]) - if apiURL == "" || apiKey == "" || secretKey == "" { - Fail(fmt.Sprintf("Invalid secret: %+v, %s, %s, %s", secret.Data, apiURL, apiKey, secretKey)) + // Report which keys are missing by name only. The values are CloudStack + // credentials, so neither they nor secret.Data may reach the test output. + var missing []string + for _, key := range []string{"api-url", "api-key", "secret-key"} { + if len(secret.Data[key]) == 0 { + missing = append(missing, key) + } + } + if len(missing) > 0 { + Fail(fmt.Sprintf("Invalid secret %s/%s: missing or empty keys: %s", + namepace, name, strings.Join(missing, ", "))) } return cloudstack.NewClient(apiURL, apiKey, secretKey, strings.ToLower(verifySSL) == "true") From 06b54b0968f25cbb31ead29de61f5e69b7b84050 Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 12:52:22 +0300 Subject: [PATCH 07/10] fix(cloud): Stop appending the same Zone ID error twice ResolveZone appended an identical Wrapf of the GetZoneID error to retErr both before and after the metrics call, so a failure to resolve a zone by name reported the same "could not get Zone ID from " message twice in the returned multierror. Keeps one append and puts the metrics call first, matching the equivalent block in ResolveNetworkForZone directly below it. No test asserted on the duplication, so nothing had pinned the behaviour. Co-Authored-By: Claude Opus 5 (1M context) --- pkg/cloud/zone.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/cloud/zone.go b/pkg/cloud/zone.go index 2be1a3c5..01e6a784 100644 --- a/pkg/cloud/zone.go +++ b/pkg/cloud/zone.go @@ -31,7 +31,6 @@ type ZoneIFace interface { func (c *client) ResolveZone(zSpec *infrav1.CloudStackZoneSpec) (retErr error) { if zoneID, count, err := c.cs.Zone.GetZoneID(zSpec.Name); err != nil { - retErr = multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Zone ID from %v", zSpec.Name)) c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) retErr = multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Zone ID from %v", zSpec.Name)) } else if count != 1 { From 4350da040902dccb8b087fe70b70696edd360a6c Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 12:53:53 +0300 Subject: [PATCH 08/10] fix(controllers): Wrap the LB attachment error instead of formatting it reconcileLBattachments' error was turned into a new error with errors.Errorf("failed to reconcile LB attachment: %+v", err). Two problems. Errorf does not wrap, so the original error was flattened into a string and errors.Is and errors.As could not see through it. Any caller wanting to match on a sentinel underneath, cloud.ErrNotFound for instance, silently could not. %+v on a pkg/errors value renders a full stack trace, so the returned error's message carried that trace into the controller logs on every failed load balancer detach. errors.Wrap fixes both: it keeps the "failed to reconcile LB attachment:" prefix, renders the cause without a stack trace, and implements Unwrap, so Is and As now traverse the chain. This was the only production call formatting an error into a new one. The remaining %v cases are panics in envtest setup and one Info log, where there is no error to propagate. Co-Authored-By: Claude Opus 5 (1M context) --- internal/controllers/cloudstackmachine_controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/controllers/cloudstackmachine_controller.go b/internal/controllers/cloudstackmachine_controller.go index 5ca719c2..840c220b 100644 --- a/internal/controllers/cloudstackmachine_controller.go +++ b/internal/controllers/cloudstackmachine_controller.go @@ -212,7 +212,7 @@ func (r *CloudStackMachineReconciler) reconcileDelete(ctx context.Context, scope if err := r.reconcileLBattachments(scope); err != nil { v1beta1conditions.MarkFalse(scope.CloudStackMachine, infrav1.LoadBalancerAttachedCondition, "DeletingFailed", clusterv1beta1.ConditionSeverityWarning, "%s", err.Error()) - return ctrl.Result{}, pkgerrors.Errorf("failed to reconcile LB attachment: %+v", err) + return ctrl.Result{}, pkgerrors.Wrap(err, "failed to reconcile LB attachment") } if scope.IsControlPlane() { From bd2111aec97d779d0bbfd20edcecbe5f279788be Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 12:55:01 +0300 Subject: [PATCH 09/10] fix(cloud): Count ACS errors from GetNetworkByID, not empty result sets ResolveNetworkForZone called the ACS error counter in the count != 1 branch of the GetNetworkByID check, where err is nil by construction. The counter ignores nil, so that call did nothing, while a genuine error from GetNetworkByID returned early without ever being counted. Moves the call into the err != nil branch. This matches both the GetNetworkByName block at the top of the same function and the GetZoneByID block in ResolveZone: count the ACS error, do not count a well-formed response that simply did not match one network. Found while fixing the duplicate append in ResolveZone; same copy-paste origin. Co-Authored-By: Claude Opus 5 (1M context) --- pkg/cloud/zone.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cloud/zone.go b/pkg/cloud/zone.go index 01e6a784..96191ffc 100644 --- a/pkg/cloud/zone.go +++ b/pkg/cloud/zone.go @@ -74,10 +74,10 @@ func (c *client) ResolveNetworkForZone(zSpec *infrav1.CloudStackZoneSpec) (retEr // Now get network details. netDetails, count, err = c.cs.Network.GetNetworkByID(zSpec.Network.ID, cloudstack.WithProject(c.user.Project.ID)) if err != nil { - return multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Network by ID %s", zSpec.Network.ID)) - } else if count != 1 { c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err) + return multierror.Append(retErr, pkgerrors.Wrapf(err, "could not get Network by ID %s", zSpec.Network.ID)) + } else if count != 1 { return multierror.Append(retErr, pkgerrors.Errorf("expected 1 Network with UUID %v, but got %d", zSpec.Network.ID, count)) } zSpec.Network.Name = netDetails.Name From 225dc22054c4d8ed73abdf7faaf1037dd1c452f7 Mon Sep 17 00:00:00 2001 From: Hans Rakers Date: Tue, 15 Sep 2026 13:15:34 +0300 Subject: [PATCH 10/10] chore: Add the 0.15 release series to metadata.yaml clusterctl reads this file to map a provider version to a Cluster API contract, so a version whose series is missing cannot be resolved and the provider cannot be installed or upgraded at it. Tagging v0.15.0-develop-1 publishes a release in the 0.15 series, so the entry has to exist first. v1beta1 is the correct contract: the CRD label key in config/crd/kustomization.yaml is still cluster.x-k8s.io/v1beta1, and every other series in this file declares the same. The move to the v1beta2 contract is separate and still in progress. Note that the comment at the top says to update this file only when a new major or minor version is released. Following that literally is what left v0.14.0 shipping a metadata.yaml without its own series, which had to be hotfixed in v0.14.1. The entry belongs in place before the first tag in a series, not after. Co-Authored-By: Claude Opus 5 (1M context) --- metadata.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/metadata.yaml b/metadata.yaml index c9f1e0c3..8947e542 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -6,6 +6,9 @@ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 kind: Metadata releaseSeries: + - major: 0 + minor: 15 + contract: v1beta1 - major: 0 minor: 14 contract: v1beta1