Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package clusterctl for openSUSE:Factory checked in at 2026-02-18 17:13:30 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/clusterctl (Old) and /work/SRC/openSUSE:Factory/.clusterctl.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "clusterctl" Wed Feb 18 17:13:30 2026 rev:28 rq:1333766 version:1.12.3 Changes: -------- --- /work/SRC/openSUSE:Factory/clusterctl/clusterctl.changes 2026-01-21 14:18:33.025862320 +0100 +++ /work/SRC/openSUSE:Factory/.clusterctl.new.1977/clusterctl.changes 2026-02-18 17:13:49.106678694 +0100 @@ -1,0 +2,9 @@ +Wed Feb 18 08:12:59 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.12.3: + * Others + - clusterctl: Update cert-manager to v1.19.3 (#13314) + - clusterctl: Update to cert-manager v1.19.2 (#13278) + - Dependency: Go bump 1.24.13 (#13324) + +------------------------------------------------------------------- Old: ---- clusterctl-1.12.2.obscpio New: ---- clusterctl-1.12.3.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ clusterctl.spec ++++++ --- /var/tmp/diff_new_pack.zYOw2Q/_old 2026-02-18 17:13:52.102803373 +0100 +++ /var/tmp/diff_new_pack.zYOw2Q/_new 2026-02-18 17:13:52.106803539 +0100 @@ -20,7 +20,7 @@ %define version_git_minor %(echo %{version} | awk 'BEGIN { FS=\".\"}; {print $2}') Name: clusterctl -Version: 1.12.2 +Version: 1.12.3 Release: 0 Summary: CLI tool to handle the lifecycle of a Cluster API management cluster License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.zYOw2Q/_old 2026-02-18 17:13:52.158805703 +0100 +++ /var/tmp/diff_new_pack.zYOw2Q/_new 2026-02-18 17:13:52.166806037 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/kubernetes-sigs/cluster-api</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v1.12.2</param> + <param name="revision">v1.12.3</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.zYOw2Q/_old 2026-02-18 17:13:52.206807701 +0100 +++ /var/tmp/diff_new_pack.zYOw2Q/_new 2026-02-18 17:13:52.210807868 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/kubernetes-sigs/cluster-api</param> - <param name="changesrevision">9ee80d1ff529c48ae0b8e022ec01d70ac496e8e5</param></service></servicedata> + <param name="changesrevision">1a1852c74072febc3fbf9823c9dd32f4cd6cc747</param></service></servicedata> (No newline at EOF) ++++++ clusterctl-1.12.2.obscpio -> clusterctl-1.12.3.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/Makefile new/clusterctl-1.12.3/Makefile --- old/clusterctl-1.12.2/Makefile 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/Makefile 2026-02-17 11:43:04.000000000 +0100 @@ -23,7 +23,7 @@ # # Go. # -GO_VERSION ?= 1.24.12 +GO_VERSION ?= 1.24.13 GO_DIRECTIVE_VERSION ?= 1.24.0 GO_CONTAINER_IMAGE ?= docker.io/library/golang:$(GO_VERSION) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/Tiltfile new/clusterctl-1.12.3/Tiltfile --- old/clusterctl-1.12.2/Tiltfile 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/Tiltfile 2026-02-17 11:43:04.000000000 +0100 @@ -172,7 +172,7 @@ tilt_helper_dockerfile_header = """ # Tilt image -FROM golang:1.24.12 as tilt-helper +FROM golang:1.24.13 as tilt-helper # Install delve. Note this should be kept in step with the Go release minor version. RUN go install github.com/go-delve/delve/cmd/[email protected] # Support live reloading with Tilt @@ -183,7 +183,7 @@ """ tilt_dockerfile_header = """ -FROM golang:1.24.12 as tilt +FROM golang:1.24.13 as tilt WORKDIR / COPY --from=tilt-helper /process.txt . COPY --from=tilt-helper /start.sh . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/cmd/clusterctl/client/config/cert_manager_client.go new/clusterctl-1.12.3/cmd/clusterctl/client/config/cert_manager_client.go --- old/clusterctl-1.12.2/cmd/clusterctl/client/config/cert_manager_client.go 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/cmd/clusterctl/client/config/cert_manager_client.go 2026-02-17 11:43:04.000000000 +0100 @@ -29,7 +29,7 @@ CertManagerConfigKey = "cert-manager" // CertManagerDefaultVersion defines the default cert-manager version to be used by clusterctl. - CertManagerDefaultVersion = "v1.19.1" + CertManagerDefaultVersion = "v1.19.3" // CertManagerDefaultURL defines the default cert-manager repository url to be used by clusterctl. // NOTE: At runtime CertManagerDefaultVersion may be replaced with the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/docs/book/src/clusterctl/commands/init.md new/clusterctl-1.12.3/docs/book/src/clusterctl/commands/init.md --- old/clusterctl-1.12.2/docs/book/src/clusterctl/commands/init.md 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/docs/book/src/clusterctl/commands/init.md 2026-02-17 11:43:04.000000000 +0100 @@ -194,7 +194,7 @@ Cluster API providers require a cert-manager version supporting the `cert-manager.io/v1` API to be installed in the cluster. While doing init, clusterctl checks if there is a version of cert-manager already installed. If not, clusterctl will -install a default version (currently cert-manager v1.19.1). See [clusterctl configuration](../configuration.md) for +install a default version (currently cert-manager v1.19.3). See [clusterctl configuration](../configuration.md) for available options to customize this operation. <aside class="note warning"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/docs/book/src/developer/getting-started.md new/clusterctl-1.12.3/docs/book/src/developer/getting-started.md --- old/clusterctl-1.12.2/docs/book/src/developer/getting-started.md 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/docs/book/src/developer/getting-started.md 2026-02-17 11:43:04.000000000 +0100 @@ -83,7 +83,7 @@ You'll need to deploy [cert-manager] components on your [management cluster][mcluster], using `kubectl` ```bash -kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.1/cert-manager.yaml +kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.3/cert-manager.yaml ``` Ensure the cert-manager webhook service is ready before creating the Cluster API components. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/docs/book/src/reference/versions.md new/clusterctl-1.12.3/docs/book/src/reference/versions.md --- old/clusterctl-1.12.2/docs/book/src/reference/versions.md 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/docs/book/src/reference/versions.md 2026-02-17 11:43:04.000000000 +0100 @@ -403,7 +403,9 @@ | v1.11 | v1.12.3 | | v1.11.2 | v1.12.4 | | >= v1.11.3 | v1.13.1 | +| >= v1.11.6 | v1.14.1 | | v1.12 | v1.13.1 | +| >= v1.12.3 | v1.14.1 | See [corefile-migration](https://github.com/coredns/corefile-migration) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/docs/book/src/user/concepts.md new/clusterctl-1.12.3/docs/book/src/user/concepts.md --- old/clusterctl-1.12.2/docs/book/src/user/concepts.md 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/docs/book/src/user/concepts.md 2026-02-17 11:43:04.000000000 +0100 @@ -1,53 +1,79 @@ # Concepts - - -## Management cluster - -A Kubernetes cluster that manages the lifecycle of Workload Clusters. A Management Cluster is also where one or more providers run, and where resources such as Machines are stored. - -### Workload cluster - -A Kubernetes cluster whose lifecycle is managed by a Management Cluster. - -## Infrastructure provider +Similar to how you can use StatefulSets or Deployments in Kubernetes to manage a group of Pods, in Cluster API you can use custom resources like KubeadmControlPlane (a control plane implementation) to manage a set of control plane Machines, or you can use MachineDeployments to manage a group of worker Machines, each one of them representing a host server and the corresponding Kubernetes Node. -A component responsible for the provisioning of infrastructure/computational resources required by the Cluster or by Machines (e.g. VMs, networking, etc.). -For example, cloud Infrastructure Providers include AWS, Azure, and Google, and bare metal Infrastructure Providers include VMware, MAAS, and metal3.io. - -When there is more than one way to obtain resources from the same Infrastructure Provider (such as AWS offering both EC2 and EKS), each way is referred to as a variant. +Extensibility is at the core of Cluster API and Cluster API providers like Cluster API provider VSphere, AWS, GCP etc. can be used +to deploy Cluster API managed Clusters to your preferred infrastructure, as well as to configure many other parts of the system. + -## Bootstrap provider +See also [Quick start](quick-start.md). -A component responsible for turning a server into a Kubernetes node as well as for: +## Management cluster -1. Generating the cluster certificates, if not otherwise specified -2. Initializing the control plane, and gating the creation of other nodes until it is complete -3. Joining control plane and worker nodes to the cluster +A Kubernetes cluster where Cluster API and one or more Cluster API providers run, and that can be used to manage the lifecycle of your Kubernetes Cluster via a set of custom resources such as [Cluster](#cluster) or [Machines](#machine). -## Control plane +### Cluster -The [control plane](https://kubernetes.io/docs/concepts/overview/components/) is a set of components that serve the Kubernetes API and continuously reconcile desired state using [control loops](https://kubernetes.io/docs/concepts/architecture/controller/). +A "Cluster" is a custom resource that represent a Kubernetes cluster whose lifecycle is managed by Cluster API, usually also referred to as workload cluster. -* __Self-provisioned__: A Kubernetes control plane consisting of pods or machines wholly managed by a single Cluster API deployment. - e.g kubeadm uses [static pods](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/) for running components such as [kube-apiserver](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/), [kube-controller-manager](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/) and [kube-scheduler](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/) - on control plane machines. +Common properties such as network CIDRs are modeled as fields on the Cluster's spec. Any information that is provider-specific is part of the custom resources +referenced via `infrastructureRef` or `controlPlaneRef` and is not portable between different providers. -* __Pod-based__ deployments require an external hosting cluster. The control plane components are deployed using standard *Deployment* and *StatefulSet* objects and the API is exposed using a *Service*. +```yaml +apiVersion: cluster.x-k8s.io/v1beta2 +kind: Cluster +metadata: + name: my-cluster +spec: + clusterNetwork: + pods: + cidrBlocks: + - 192.168.0.0/16 + infrastructureRef: + apiGroup: infrastructure.cluster.x-k8s.io + kind: VSphereCluster + name: my-cluster-infrastructure + controlPlaneRef: + apiGroup: controlplane.cluster.x-k8s.io + kind: KubeadmControlPlane + name: my-control-plane +``` -* __External__ or __Managed__ control planes are offered and controlled by some system other than Cluster API, such as GKE, AKS, EKS, or IKS. +In most recent versions of Cluster API, the Cluster object can be used as a single point of control for the entire cluster. +See [ClusterClass](../tasks/experimental-features/cluster-class) -The default provider uses kubeadm to bootstrap the control plane. As of v1alpha3, it exposes the configuration via the `KubeadmControlPlane` object. The controller, `capi-kubeadm-control-plane-controller-manager`, can then create Machine and BootstrapConfig objects based on the requested replicas in the `KubeadmControlPlane` object. +### Machine -## Custom Resource Definitions (CRDs) +A "Machine" is a custom resource providing the declarative spec for infrastructure hosting a Kubernetes Node (for example, a VM). -A [CustomResourceDefinition](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) is a built-in resource that lets you extend the Kubernetes API. Each CustomResourceDefinition represents a customization of a Kubernetes installation. The Cluster API provides and relies on several CustomResourceDefinitions: +```yaml +apiVersion: cluster.x-k8s.io/v1beta2 +kind: Machine +metadata: + name: my-machine +spec: + clusterName: my-cluster + version: v1.35.0 + infrastructureRef: + apiGroup: infrastructure.cluster.x-k8s.io + kind: VSphereMachineTemplate + name: my-machine-infrastructure + bootstrap: + configRef: + apiGroup: bootstrap.cluster.x-k8s.io + kind: KubeadmConfigTemplate + name: my-bootstrap-config +status: + nodeRef: + name: the-node-running-on-my-machine +``` -### Machine +Common fields such as the Kubernetes version are modeled as fields on the Machine's spec. Any information that is provider-specific is part of the custom resources +referenced via `infrastructureRef` or `bootstrap.configRef` and is not portable between different providers. -A "Machine" is the declarative spec for an infrastructure component hosting a Kubernetes Node (for example, a VM). If a new Machine object is created, a provider-specific controller will provision and install a new host to register as a new Node matching the Machine spec. If the Machine's spec is updated, the controller replaces the host with a new one matching the updated spec. If a Machine object is deleted, its underlying infrastructure and corresponding Node will be deleted by the controller. +If a new Machine object is created, a provider-specific controller will provision and install a new host to register as a new Node matching the Machine spec. If a Machine object is deleted, its underlying infrastructure and corresponding Node will be deleted. -Common fields such as Kubernetes version are modeled as fields on the Machine's spec. Any information that is provider-specific is part of the `InfrastructureRef` and is not portable between different providers. +Like for Pods in Kubernetes, also for Machines in Cluster API it is more convenient to not manage single Machines directly. Instead you should use resources like KubeadmControlPlane (a control plane implementation), [MachineDeployments](#machinedeployment) or [MachinePools](#machinepool) to manage a group of Machines. #### Machine Immutability (In-place update vs. Replace) @@ -58,7 +84,7 @@ Over time several improvement have been applied to Cluster API in oder to perform machine rollout only when necessary and for minimizing risks and impact of this operation on users workloads. -Starting from Cluster API v1.12, users can intentionally trade off some of the benefits that they get of Machine immutability by +Starting from Cluster API v1.12, users can intentionally trade off some of the benefits that they get of Machine immutability by using Cluster API extensions points to add the capability to perform in-place updates under well-defined circumstances. Notably, the Cluster API user experience will remain the same no matter of the in-place update feature is enabled @@ -67,6 +93,43 @@ Cluster API is responsible to choose the best strategy to achieve desired state, and with the introduction of update extensions, Cluster API is expanding the set of tools that can be used to achieve the desired state. +## Infrastructure provider + +A component responsible for the provisioning of infrastructure/computational resources required by the Cluster or by Machines (e.g. VMs, networking, etc.). +For example, cloud Infrastructure Providers include AWS, Azure, and Google, and bare metal Infrastructure Providers include VMware, MAAS, and metal3.io. + +When there is more than one way to obtain resources from the same Infrastructure Provider (such as AWS offering both EC2 and EKS), each way is referred to as a variant. + +## Control plane provider + +A component responsible for the provisioning and for the management of the control plane of your Kubernetes Cluster, like e.g. the KubeadmControlPlane provider. + +Control plane providers can take different approach on how to manage the control plane; + +* __Self-provisioned__: A Kubernetes control plane consisting of pods or machines wholly managed by a single Cluster API deployment. + e.g kubeadm uses [static pods](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/) for running components such as [kube-apiserver](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/), [kube-controller-manager](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/) and [kube-scheduler](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/) + on control plane machines. + +* __Pod-based__ deployments require an external hosting cluster. The control plane components are deployed using standard *Deployment* and *StatefulSet* objects and the API is exposed using a *Service*. + +* __External__ or __Managed__ control planes are offered and controlled by some system other than Cluster API, such as GKE, AKS, EKS, or IKS. + +## Bootstrap provider + +A component responsible for turning a server into a Kubernetes node as well as for: + +1. Generating the cluster certificates, if not otherwise specified +2. Initializing the control plane, and gating the creation of other nodes until it is complete +3. Joining control plane and worker nodes to the cluster + +Boostrap provider achieve this goal by generating BootstrapData, which contains the Machine or Node role-specific initialization data (usually cloud-init). The bootstrap data is used by the Infrastructure Provider to bootstrap a Machine into a Node. + +## KubeadmControlPlane + +The KubeadmControlPlane is a custom resource that is provided by the Kubeadm provider, and that allows to manage a set of Machines hosting control plane Nodes created with kubeadm. + +Other control plane providers implement similar resources as well. + ### MachineDeployment A MachineDeployment provides declarative updates for Machines and MachineSets. @@ -91,6 +154,6 @@ MachineHealthChecks will only remediate Nodes if they are owned by a MachineSet. This ensures that the Kubernetes cluster does not lose capacity, since the MachineSet will create a new Machine to replace the failed Machine. -### BootstrapData +## Custom Resource Definitions (CRDs) -BootstrapData contains the Machine or Node role-specific initialization data (usually cloud-init) used by the Infrastructure Provider to bootstrap a Machine into a Node. +A [CustomResourceDefinition](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) is a built-in resource that lets you extend the Kubernetes API. Each CustomResourceDefinition represents a customization of a Kubernetes installation. The Cluster API provides and relies on several CustomResourceDefinitions: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/go.mod new/clusterctl-1.12.3/go.mod --- old/clusterctl-1.12.2/go.mod 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/go.mod 2026-02-17 11:43:04.000000000 +0100 @@ -7,7 +7,7 @@ github.com/Masterminds/sprig/v3 v3.3.0 github.com/adrg/xdg v0.5.3 github.com/blang/semver/v4 v4.0.0 - github.com/coredns/corefile-migration v1.0.29 + github.com/coredns/corefile-migration v1.0.30 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/distribution/reference v0.6.0 github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/go.sum new/clusterctl-1.12.3/go.sum --- old/clusterctl-1.12.2/go.sum 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/go.sum 2026-02-17 11:43:04.000000000 +0100 @@ -65,8 +65,8 @@ github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= 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.29 h1:g4cPYMXXDDs9uLE2gFYrJaPBuUAR07eEMGyh9JBE13w= -github.com/coredns/corefile-migration v1.0.29/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= +github.com/coredns/corefile-migration v1.0.30 h1:ljZNPGgna+4yKv81gfkvkgLEWdtz0NjBR1glaiPI140= +github.com/coredns/corefile-migration v1.0.30/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= github.com/coreos/go-semver v0.1.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/hack/tools/go.sum new/clusterctl-1.12.3/hack/tools/go.sum --- old/clusterctl-1.12.2/hack/tools/go.sum 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/hack/tools/go.sum 2026-02-17 11:43:04.000000000 +0100 @@ -79,8 +79,8 @@ github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= 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.29 h1:g4cPYMXXDDs9uLE2gFYrJaPBuUAR07eEMGyh9JBE13w= -github.com/coredns/corefile-migration v1.0.29/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= +github.com/coredns/corefile-migration v1.0.30 h1:ljZNPGgna+4yKv81gfkvkgLEWdtz0NjBR1glaiPI140= +github.com/coredns/corefile-migration v1.0.30/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/netlify.toml new/clusterctl-1.12.3/netlify.toml --- old/clusterctl-1.12.2/netlify.toml 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/netlify.toml 2026-02-17 11:43:04.000000000 +0100 @@ -4,7 +4,7 @@ publish = "docs/book/book" [build.environment] - GO_VERSION = "1.24.12" + GO_VERSION = "1.24.13" # Standard Netlify redirects [[redirects]] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/scripts/ci-e2e-lib.sh new/clusterctl-1.12.3/scripts/ci-e2e-lib.sh --- old/clusterctl-1.12.2/scripts/ci-e2e-lib.sh 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/scripts/ci-e2e-lib.sh 2026-02-17 11:43:04.000000000 +0100 @@ -258,9 +258,9 @@ # the actual test run less sensible to the network speed. kind:prepullAdditionalImages () { # Pulling cert manager images so we can pre-load in kind nodes - kind::prepullImage "quay.io/jetstack/cert-manager-cainjector:v1.19.1" - kind::prepullImage "quay.io/jetstack/cert-manager-webhook:v1.19.1" - kind::prepullImage "quay.io/jetstack/cert-manager-controller:v1.19.1" + kind::prepullImage "quay.io/jetstack/cert-manager-cainjector:v1.19.3" + kind::prepullImage "quay.io/jetstack/cert-manager-webhook:v1.19.3" + kind::prepullImage "quay.io/jetstack/cert-manager-controller:v1.19.3" # Pull all images defined in DOCKER_PRELOAD_IMAGES. for IMAGE in $(grep DOCKER_PRELOAD_IMAGES: < "$E2E_CONF_FILE" | sed -E 's/.*\[(.*)\].*/\1/' | tr ',' ' '); do @@ -282,7 +282,7 @@ retVal=0 if [[ "$(docker images -q "$image" 2> /dev/null)" == "" ]]; then TMPFILE="$(mktemp)" - + echo "+ Pulling $image" crane pull "$image" "${TMPFILE}" || retVal=$? diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/test/e2e/cluster_upgrade_runtimesdk_test.go new/clusterctl-1.12.3/test/e2e/cluster_upgrade_runtimesdk_test.go --- old/clusterctl-1.12.2/test/e2e/cluster_upgrade_runtimesdk_test.go 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/test/e2e/cluster_upgrade_runtimesdk_test.go 2026-02-17 11:43:04.000000000 +0100 @@ -39,7 +39,15 @@ PostUpgrade: func(proxy framework.ClusterProxy, namespace, clusterName string) { // This check ensures that the resourceVersions are stable, i.e. it verifies there are no // continuous reconciles when everything should be stable. - framework.ValidateResourceVersionStable(ctx, proxy, namespace, clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName)) + spec := "k8s-upgrade-with-runtimesdk" + resourceVersionInput := framework.ValidateResourceVersionStableInput{ + ClusterProxy: proxy, + Namespace: namespace, + OwnerGraphFilterFunction: clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName), + WaitToBecomeStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-become-stable"), + WaitToRemainStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-remain-stable"), + } + framework.ValidateResourceVersionStable(ctx, resourceVersionInput) }, // "upgrades" is the same as the "topology" flavor but with an additional MachinePool. Flavor: ptr.To("upgrades-runtimesdk"), @@ -65,7 +73,15 @@ PostUpgrade: func(proxy framework.ClusterProxy, namespace, clusterName string) { // This check ensures that the resourceVersions are stable, i.e. it verifies there are no // continuous reconciles when everything should be stable. - framework.ValidateResourceVersionStable(ctx, proxy, namespace, clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName)) + spec := "k8s-upgrade-with-runtimesdk" + resourceVersionInput := framework.ValidateResourceVersionStableInput{ + ClusterProxy: proxy, + Namespace: namespace, + OwnerGraphFilterFunction: clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName), + WaitToBecomeStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-become-stable"), + WaitToRemainStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-remain-stable"), + } + framework.ValidateResourceVersionStable(ctx, resourceVersionInput) }, // "upgrades" is the same as the "topology" flavor but with an additional MachinePool. Flavor: ptr.To("upgrades-runtimesdk"), @@ -93,7 +109,15 @@ PostUpgrade: func(proxy framework.ClusterProxy, namespace, clusterName string) { // This check ensures that the resourceVersions are stable, i.e. it verifies there are no // continuous reconciles when everything should be stable. - framework.ValidateResourceVersionStable(ctx, proxy, namespace, clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName)) + spec := "k8s-upgrade-with-runtimesdk" + resourceVersionInput := framework.ValidateResourceVersionStableInput{ + ClusterProxy: proxy, + Namespace: namespace, + OwnerGraphFilterFunction: clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName), + WaitToBecomeStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-become-stable"), + WaitToRemainStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-remain-stable"), + } + framework.ValidateResourceVersionStable(ctx, resourceVersionInput) }, // "upgrades" is the same as the "topology" flavor but with an additional MachinePool. Flavor: ptr.To("upgrades-runtimesdk"), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/test/e2e/clusterctl_upgrade.go new/clusterctl-1.12.3/test/e2e/clusterctl_upgrade.go --- old/clusterctl-1.12.2/test/e2e/clusterctl_upgrade.go 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/test/e2e/clusterctl_upgrade.go 2026-02-17 11:43:04.000000000 +0100 @@ -727,7 +727,14 @@ // continuous reconciles when everything should be stable. if i == len(input.Upgrades)-1 { Byf("[%d] Checking that resourceVersions are stable", i) - framework.ValidateResourceVersionStable(ctx, managementClusterProxy, workloadCluster.Namespace, clusterctlcluster.FilterClusterObjectsWithNameFilter(workloadCluster.Name)) + resourceVersionInput := framework.ValidateResourceVersionStableInput{ + ClusterProxy: managementClusterProxy, + Namespace: workloadCluster.Namespace, + OwnerGraphFilterFunction: clusterctlcluster.FilterClusterObjectsWithNameFilter(workloadCluster.Name), + WaitToBecomeStable: input.E2EConfig.GetIntervals(specName, "wait-resource-versions-become-stable"), + WaitToRemainStable: input.E2EConfig.GetIntervals(specName, "wait-resource-versions-remain-stable"), + } + framework.ValidateResourceVersionStable(ctx, resourceVersionInput) // NOTE: Checks on conditions works on v1beta2 only, so running this checks only in the last step which is // always current version. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/test/e2e/config/docker.yaml new/clusterctl-1.12.3/test/e2e/config/docker.yaml --- old/clusterctl-1.12.2/test/e2e/config/docker.yaml 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/test/e2e/config/docker.yaml 2026-02-17 11:43:04.000000000 +0100 @@ -21,11 +21,11 @@ loadBehavior: tryLoad - name: gcr.io/k8s-staging-cluster-api/test-extension-{ARCH}:dev loadBehavior: tryLoad -- name: quay.io/jetstack/cert-manager-cainjector:v1.19.1 +- name: quay.io/jetstack/cert-manager-cainjector:v1.19.3 loadBehavior: tryLoad -- name: quay.io/jetstack/cert-manager-webhook:v1.19.1 +- name: quay.io/jetstack/cert-manager-webhook:v1.19.3 loadBehavior: tryLoad -- name: quay.io/jetstack/cert-manager-controller:v1.19.1 +- name: quay.io/jetstack/cert-manager-controller:v1.19.3 loadBehavior: tryLoad providers: @@ -420,6 +420,8 @@ default/wait-nodes-ready: ["10m", "10s"] default/wait-machine-remediation: ["5m", "10s"] default/wait-autoscaler: ["5m", "10s"] + default/wait-resource-versions-become-stable: ["2m", "15s"] + default/wait-resource-versions-remain-stable: ["2m", "5s"] node-drain/wait-deployment-available: ["3m", "10s"] node-drain/wait-control-plane: ["15m", "10s"] node-drain/wait-machine-deleted: ["2m", "10s"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/test/e2e/quick_start_test.go new/clusterctl-1.12.3/test/e2e/quick_start_test.go --- old/clusterctl-1.12.2/test/e2e/quick_start_test.go 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/test/e2e/quick_start_test.go 2026-02-17 11:43:04.000000000 +0100 @@ -69,7 +69,15 @@ // This check ensures that the resourceVersions are stable, i.e. it verifies there are no // continuous reconciles when everything should be stable. By("Checking that resourceVersions are stable") - framework.ValidateResourceVersionStable(ctx, proxy, namespace, clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName)) + spec := "quick-start" + resourceVersionInput := framework.ValidateResourceVersionStableInput{ + ClusterProxy: proxy, + Namespace: namespace, + OwnerGraphFilterFunction: clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName), + WaitToBecomeStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-become-stable"), + WaitToRemainStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-remain-stable"), + } + framework.ValidateResourceVersionStable(ctx, resourceVersionInput) }, } }) @@ -116,7 +124,15 @@ // This check ensures that the resourceVersions are stable, i.e. it verifies there are no // continuous reconciles when everything should be stable. By("Checking that resourceVersions are stable") - framework.ValidateResourceVersionStable(ctx, proxy, namespace, clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName)) + spec := "quick-start" + resourceVersionInput := framework.ValidateResourceVersionStableInput{ + ClusterProxy: proxy, + Namespace: namespace, + OwnerGraphFilterFunction: clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName), + WaitToBecomeStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-become-stable"), + WaitToRemainStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-remain-stable"), + } + framework.ValidateResourceVersionStable(ctx, resourceVersionInput) }, } }) @@ -141,7 +157,15 @@ // This check ensures that the resourceVersions are stable, i.e. it verifies there are no // continuous reconciles when everything should be stable. By("Checking that resourceVersions are stable") - framework.ValidateResourceVersionStable(ctx, proxy, namespace, clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName)) + spec := "quick-start" + resourceVersionInput := framework.ValidateResourceVersionStableInput{ + ClusterProxy: proxy, + Namespace: namespace, + OwnerGraphFilterFunction: clusterctlcluster.FilterClusterObjectsWithNameFilter(clusterName), + WaitToBecomeStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-become-stable"), + WaitToRemainStable: e2eConfig.GetIntervals(spec, "wait-resource-versions-remain-stable"), + } + framework.ValidateResourceVersionStable(ctx, resourceVersionInput) }, } }) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/test/framework/resourceversion_helpers.go new/clusterctl-1.12.3/test/framework/resourceversion_helpers.go --- old/clusterctl-1.12.2/test/framework/resourceversion_helpers.go 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/test/framework/resourceversion_helpers.go 2026-02-17 11:43:04.000000000 +0100 @@ -20,7 +20,6 @@ "context" "fmt" "strings" - "time" "github.com/google/go-cmp/cmp" . "github.com/onsi/gomega" @@ -32,14 +31,27 @@ clusterctlcluster "sigs.k8s.io/cluster-api/cmd/clusterctl/client/cluster" ) +// ValidateResourceVersionStableInput contains parameters for [ValidateResourceVersionStable]. +type ValidateResourceVersionStableInput struct { + ClusterProxy ClusterProxy + Namespace string + OwnerGraphFilterFunction clusterctlcluster.GetOwnerGraphFilterFunction + WaitToBecomeStable []any + WaitToRemainStable []any +} + // ValidateResourceVersionStable checks that resourceVersions are stable. -func ValidateResourceVersionStable(ctx context.Context, proxy ClusterProxy, namespace string, ownerGraphFilterFunction clusterctlcluster.GetOwnerGraphFilterFunction) { +func ValidateResourceVersionStable(ctx context.Context, input ValidateResourceVersionStableInput) { // Wait until resourceVersions are stable for a bit. byf("Check resourceVersions are stable") var previousResourceVersions map[string]string var previousObjects map[string]client.Object + waitToBecomeStable := input.WaitToBecomeStable + if len(waitToBecomeStable) == 0 { + waitToBecomeStable = []any{"2m", "15s"} + } Eventually(func(g Gomega) { - objectsWithResourceVersion, objects, err := getObjectsWithResourceVersion(ctx, proxy, namespace, ownerGraphFilterFunction) + objectsWithResourceVersion, objects, err := getObjectsWithResourceVersion(ctx, input.ClusterProxy, input.Namespace, input.OwnerGraphFilterFunction) g.Expect(err).ToNot(HaveOccurred()) defer func() { @@ -49,15 +61,19 @@ }() // This is intentionally failing on the first run. g.Expect(objectsWithResourceVersion).To(BeComparableTo(previousResourceVersions)) - }, 2*time.Minute, 15*time.Second).MustPassRepeatedly(4).Should(Succeed(), "resourceVersions never became stable") + }, waitToBecomeStable...).MustPassRepeatedly(4).Should(Succeed(), "resourceVersions never became stable") // Verify resourceVersions are stable for a while. byf("Check resourceVersions remain stable") + waitToRemainStable := input.WaitToRemainStable + if len(waitToRemainStable) == 0 { + waitToRemainStable = []any{"2m", "5s"} + } Consistently(func(g Gomega) { - objectsWithResourceVersion, objects, err := getObjectsWithResourceVersion(ctx, proxy, namespace, ownerGraphFilterFunction) + objectsWithResourceVersion, objects, err := getObjectsWithResourceVersion(ctx, input.ClusterProxy, input.Namespace, input.OwnerGraphFilterFunction) g.Expect(err).ToNot(HaveOccurred()) g.Expect(previousResourceVersions).To(BeComparableTo(objectsWithResourceVersion), printObjectDiff(previousObjects, objects)) - }, 2*time.Minute, 5*time.Second).Should(Succeed(), "resourceVersions didn't stay stable") + }, waitToRemainStable...).Should(Succeed(), "resourceVersions didn't stay stable") } func printObjectDiff(previousObjects, newObjects map[string]client.Object) func() string { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/test/go.sum new/clusterctl-1.12.3/test/go.sum --- old/clusterctl-1.12.2/test/go.sum 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/test/go.sum 2026-02-17 11:43:04.000000000 +0100 @@ -50,8 +50,8 @@ github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= 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.29 h1:g4cPYMXXDDs9uLE2gFYrJaPBuUAR07eEMGyh9JBE13w= -github.com/coredns/corefile-migration v1.0.29/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= +github.com/coredns/corefile-migration v1.0.30 h1:ljZNPGgna+4yKv81gfkvkgLEWdtz0NjBR1glaiPI140= +github.com/coredns/corefile-migration v1.0.30/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= github.com/coreos/go-semver v0.1.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/util/deprecated/v1beta1/patch/utils.go new/clusterctl-1.12.3/util/deprecated/v1beta1/patch/utils.go --- old/clusterctl-1.12.2/util/deprecated/v1beta1/patch/utils.go 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/util/deprecated/v1beta1/patch/utils.go 2026-02-17 11:43:04.000000000 +0100 @@ -182,7 +182,7 @@ // We assume the type is implemented according to transition guidelines clusterv1ConditionsFields = []string{"status", "deprecated", "v1beta1", "conditions"} } else { - if v1Beta1Field := deprecatedElem.FieldByName("V1Beta1"); deprecatedField != (reflect.Value{}) { + if v1Beta1Field := deprecatedElem.FieldByName("V1Beta1"); v1Beta1Field != (reflect.Value{}) { if v1Beta1Field.Kind() != reflect.Pointer { return nil, nil, errors.New("obj.status.deprecated.v1beta1 must be a pointer") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clusterctl-1.12.2/util/patch/utils.go new/clusterctl-1.12.3/util/patch/utils.go --- old/clusterctl-1.12.2/util/patch/utils.go 2026-01-19 18:39:47.000000000 +0100 +++ new/clusterctl-1.12.3/util/patch/utils.go 2026-02-17 11:43:04.000000000 +0100 @@ -182,7 +182,7 @@ // We assume the type is implemented according to transition guidelines clusterv1ConditionsFields = []string{"status", "deprecated", "v1beta1", "conditions"} } else { - if v1Beta1Field := deprecatedElem.FieldByName("V1Beta1"); deprecatedField != (reflect.Value{}) { + if v1Beta1Field := deprecatedElem.FieldByName("V1Beta1"); v1Beta1Field != (reflect.Value{}) { if v1Beta1Field.Kind() != reflect.Pointer { return nil, nil, errors.New("obj.status.deprecated.v1beta1 must be a pointer") } ++++++ clusterctl.obsinfo ++++++ --- /var/tmp/diff_new_pack.zYOw2Q/_old 2026-02-18 17:13:56.062968168 +0100 +++ /var/tmp/diff_new_pack.zYOw2Q/_new 2026-02-18 17:13:56.070968502 +0100 @@ -1,5 +1,5 @@ name: clusterctl -version: 1.12.2 -mtime: 1768844387 -commit: 9ee80d1ff529c48ae0b8e022ec01d70ac496e8e5 +version: 1.12.3 +mtime: 1771324984 +commit: 1a1852c74072febc3fbf9823c9dd32f4cd6cc747 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/clusterctl/vendor.tar.gz /work/SRC/openSUSE:Factory/.clusterctl.new.1977/vendor.tar.gz differ: char 134, line 1
