Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package clusterctl for openSUSE:Factory 
checked in at 2025-06-18 15:58:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/clusterctl (Old)
 and      /work/SRC/openSUSE:Factory/.clusterctl.new.19631 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "clusterctl"

Wed Jun 18 15:58:00 2025 rev:18 rq:1286517 version:1.10.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/clusterctl/clusterctl.changes    2025-05-22 
16:56:14.820333180 +0200
+++ /work/SRC/openSUSE:Factory/.clusterctl.new.19631/clusterctl.changes 
2025-06-18 16:03:21.390061325 +0200
@@ -1,0 +2,8 @@
+Wed Jun 18 05:04:43 UTC 2025 - Johannes Kastl 
<opensuse_buildserv...@ojkastl.de>
+
+- Update to version 1.10.3:
+  * fix govulncheck security scan
+  * [release-1.10] clusterctl: accept upper case version
+    (#12321)
+
+-------------------------------------------------------------------

Old:
----
  clusterctl-1.10.2.obscpio

New:
----
  clusterctl-1.10.3.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ clusterctl.spec ++++++
--- /var/tmp/diff_new_pack.D9JsDQ/_old  2025-06-18 16:03:22.362101561 +0200
+++ /var/tmp/diff_new_pack.D9JsDQ/_new  2025-06-18 16:03:22.366101727 +0200
@@ -20,7 +20,7 @@
 %define version_git_minor 8
 
 Name:           clusterctl
-Version:        1.10.2
+Version:        1.10.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.D9JsDQ/_old  2025-06-18 16:03:22.398103052 +0200
+++ /var/tmp/diff_new_pack.D9JsDQ/_new  2025-06-18 16:03:22.398103052 +0200
@@ -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.10.2</param>
+    <param name="revision">v1.10.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.D9JsDQ/_old  2025-06-18 16:03:22.418103880 +0200
+++ /var/tmp/diff_new_pack.D9JsDQ/_new  2025-06-18 16:03:22.422104045 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/kubernetes-sigs/cluster-api</param>
-              <param 
name="changesrevision">525566440a77696f6d57535229987ad226a5e51a</param></service></servicedata>
+              <param 
name="changesrevision">9beb81e3a3efdbfb21779d90d95d2640273f1d4d</param></service></servicedata>
 (No newline at EOF)
 

++++++ clusterctl-1.10.2.obscpio -> clusterctl-1.10.3.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/.gitattributes 
new/clusterctl-1.10.3/.gitattributes
--- old/clusterctl-1.10.2/.gitattributes        1970-01-01 01:00:00.000000000 
+0100
+++ new/clusterctl-1.10.3/.gitattributes        2025-06-13 16:36:55.000000000 
+0200
@@ -0,0 +1,3 @@
+# Hide generated crd yamls by default in the Github diff UX
+**/config/crd/bases/*.yaml linguist-generated=true
+cmd/clusterctl/config/manifest/clusterctl-api.yaml linguist-generated=true
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/bug_report.yaml 
new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/bug_report.yaml
--- old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/bug_report.yaml        
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/bug_report.yaml        
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,48 @@
+name: 🐛 Bug Report
+description: Report a bug encountered while using Cluster API
+body:
+  - type: textarea
+    id: problem
+    attributes:
+      label: What steps did you take and what happened?
+      description: |
+        Please provide as much info as possible. Not doing so may result in 
your bug not being addressed in a timely manner.
+        If this matter is security related, please follow the guidelines 
described in 
https://github.com/kubernetes-sigs/cluster-api/blob/main/SECURITY_CONTACTS
+      placeholder: "A clear and concise description on how to REPRODUCE the 
bug."
+    validations:
+      required: true
+
+  - type: textarea
+    id: expected
+    attributes:
+      label: What did you expect to happen?
+    validations:
+      required: true
+
+  - type: textarea
+    id: capiVersion
+    attributes:
+      label: Cluster API version
+      placeholder: "The version of the Cluster API used in the environment."
+    validations:
+      required: true
+
+  - type: textarea
+    id: kubeVersion
+    attributes:
+      label: Kubernetes version
+      placeholder: "$kubectl version"
+
+  - type: textarea
+    id: additional
+    attributes:
+      label: Anything else you would like to add?
+      placeholder: "Miscellaneous information that will assist in solving the 
issue."
+
+  - type: textarea
+    id: templateLabel
+    attributes:
+      label: Label(s) to be applied
+      value: |
+        /kind bug
+        One or more /area label. See 
https://github.com/kubernetes-sigs/cluster-api/labels?q=area for the list of 
labels.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/failing_test.yaml 
new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/failing_test.yaml
--- old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/failing_test.yaml      
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/failing_test.yaml      
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,49 @@
+name: 🚨 Failing Test
+description: Report continuously failing tests or jobs in Cluster API CI
+body:
+  - type: textarea
+    id: jobs
+    attributes:
+      label: Which jobs are failing?
+      placeholder: |
+        Please only use this template for submitting reports about 
continuously failing tests or jobs in Cluster API CI.
+    validations:
+      required: true
+
+  - type: textarea
+    id: tests
+    attributes:
+      label: Which tests are failing?
+    validations:
+      required: true
+
+  - type: textarea
+    id: since
+    attributes:
+      label: Since when has it been failing?
+    validations:
+      required: true
+
+  - type: input
+    id: testgrid
+    attributes:
+      label: Testgrid link
+
+  - type: textarea
+    id: reason
+    attributes:
+      label: Reason for failure (if possible)
+
+  - type: textarea
+    id: additional
+    attributes:
+      label: Anything else we need to know?
+      placeholder: "Miscellaneous information that will assist in fixing the 
failing test."
+
+  - type: textarea
+    id: templateLabel
+    attributes:
+      label: Label(s) to be applied
+      value: |
+        /kind failing-test
+        One or more /area label. See 
https://github.com/kubernetes-sigs/cluster-api/labels?q=area for the list of 
labels.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/feature_request.yaml 
new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/feature_request.yaml
--- old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/feature_request.yaml   
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/feature_request.yaml   
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,35 @@
+name: ✨ Feature request
+description: Suggest an idea for this project.
+body:
+  - type: textarea
+    id: user_story
+    attributes:
+      label: What would you like to be added (User Story)?
+      description: |
+        A large proposal that works through the design along with the 
implications of the change can be opened as a CAEP.
+        See 
https://github.com/kubernetes-sigs/cluster-api/blob/main/CONTRIBUTING.md#proposal-process-caep
+      placeholder: "As a [developer/user/operator] I would like to [high level 
description] for [reasons]."
+    validations:
+      required: true
+
+  - type: textarea
+    id: detailed_feature_description
+    attributes:
+      label: Detailed Description
+      placeholder: "A clear and concise description of what you want to 
happen."
+    validations:
+      required: true
+
+  - type: textarea
+    id: additional
+    attributes:
+      label: Anything else you would like to add?
+      placeholder: "Miscellaneous information that will assist in solving the 
issue."
+
+  - type: textarea
+    id: templateLabel
+    attributes:
+      label: Label(s) to be applied
+      value: |
+        /kind feature
+        One or more /area label. See 
https://github.com/kubernetes-sigs/cluster-api/labels?q=area for the list of 
labels.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/flaking_test.yaml 
new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/flaking_test.yaml
--- old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/flaking_test.yaml      
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/flaking_test.yaml      
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,50 @@
+name: ❄️ Flaking Test
+description: Report flaky tests or jobs in Cluster API CI
+body:
+  - type: textarea
+    id: jobs
+    attributes:
+      label: Which jobs are flaking?
+      description: |
+        Please only use this template for submitting reports about flaky tests 
or jobs (pass or fail with no underlying change in code) in Cluster API CI.
+        Links to go.k8s.io/triage and/or links to specific failures in 
spyglass are appreciated.
+    validations:
+      required: true
+
+  - type: textarea
+    id: tests
+    attributes:
+      label: Which tests are flaking?
+    validations:
+      required: true
+
+  - type: textarea
+    id: since
+    attributes:
+      label: Since when has it been flaking?
+    validations:
+      required: true
+
+  - type: input
+    id: testgrid
+    attributes:
+      label: Testgrid link
+
+  - type: textarea
+    id: reason
+    attributes:
+      label: Reason for failure (if possible)
+
+  - type: textarea
+    id: additional
+    attributes:
+      label: Anything else we need to know?
+      placeholder: "Miscellaneous information that will assist in fixing the 
flaking test."
+
+  - type: textarea
+    id: templateLabel
+    attributes:
+      label: Label(s) to be applied
+      value: |
+        /kind flake
+        One or more /area label. See 
https://github.com/kubernetes-sigs/cluster-api/labels?q=area for the list of 
labels.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/kubernetes_bump.md 
new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/kubernetes_bump.md
--- old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/kubernetes_bump.md     
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/kubernetes_bump.md     
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,103 @@
+---
+name: 🚀 Kubernetes bump
+about: "[Only for release team lead] Create an issue to track tasks to support 
a new Kubernetes minor release."
+title: Tasks to bump to Kubernetes v1.<minor-version>
+labels: ''
+assignees: ''
+
+---
+
+This issue is tracking the tasks that should be implemented **after** the 
Kubernetes minor release has been released.
+
+## Tasks
+
+**Note:** If feasible we usually cherry-pick the changes back to the latest 
release series.
+
+### Supporting managing and running on the new Kubernetes version
+
+This section contains tasks to update our book, e2e testing and CI to use and 
test the new Kubernetes version
+as well as changes to Cluster API that we might have to make to support the 
new Kubernetes version. All of these
+changes should be cherry-picked to all release series that will support the 
new Kubernetes version.
+
+* [ ] Continuously modify CAPD to use early versions of the upcoming 
Kubernetes release (betas and rcs):
+  * Bump the Kubernetes version in `test/*` except for 
`test/infrastructure/kind/*`.
+  * Prior art: https://github.com/kubernetes-sigs/cluster-api/pull/10922
+* [ ] Modify CAPD to use the new Kubernetes release after it is GA:
+  * Bump the Kubernetes version in `test/*` except for 
`test/infrastructure/kind/*`.
+  * Prior art: https://github.com/kubernetes-sigs/cluster-api/pull/11030
+* [ ] Ensure the jobs are adjusted to provide test coverage according to our 
[support 
policy](https://cluster-api.sigs.k8s.io/reference/versions.html#supported-kubernetes-versions):
+
+  * At the `.versions`  section in the `cluster-api-prowjob-gen.yaml` file in 
[test-infra](https://github.com/kubernetes/test-infra/blob/master/config/jobs/kubernetes-sigs/cluster-api/):
+    * Add a new entry for the new Kubernetes version
+    * Adjust the released Kubernetes's version entry to refer 
`stable-1.<minor>` instead of `ci/latest-1.<minor>`
+    * Check and update the versions for the keys `etcd` and `coreDNS` if 
necessary:
+      * For etcd, see the `DefaultEtcdVersion` kubeadm constant: [e.g. for 
v1.28.0](https://github.com/kubernetes/kubernetes/blob/v1.28.0/cmd/kubeadm/app/constants/constants.go#L308)
+      * For coredns, see the `CoreDNSVersion` kubeadm constant:[e.g. for 
v1.28.0](https://github.com/kubernetes/kubernetes/blob/v1.28.0/cmd/kubeadm/app/constants/constants.go#L344)
+  * For the `.branches.main` section in the `cluster-api-prowjob-gen.yaml` 
file in 
[test-infra](https://github.com/kubernetes/test-infra/blob/master/config/jobs/kubernetes-sigs/cluster-api/):
+    * For the `.upgrades` section:
+      * Drop the oldest upgrade
+      * Add a new upgrade entry from the previous to the new Kubernetes version
+    * Bump the version set at `.kubernetesVersionManagement` to the new 
minimum supported management cluster version (This is the image version 
available as kind image).
+    * Bump the version set at `.kubebuilderEnvtestKubernetesVersion` to the 
new minimum supported management cluster version.
+  * Run `make generate-test-infra-prowjobs` to generate the resulting prowjob 
configuration:
+
+    ```sh
+    TEST_INFRA_DIR=../../k8s.io/test-infra make generate-test-infra-prowjobs
+    ```
+
+  * Prior art: https://github.com/kubernetes/test-infra/pull/33294
+
+* [ ] Update book:
+  * Update supported versions in `versions.md`
+  * Prior art: https://github.com/kubernetes-sigs/cluster-api/pull/11030
+
+* [ ] Issues specific to the Kubernetes minor release:
+  * Sometimes there are adjustments that we have to make in Cluster API to be 
able to support
+    a new Kubernetes minor version. Please add these issues here when they are 
identified.
+
+### Bump quickstart and kind image references in CAPD
+
+Prerequisites:
+
+* The target Kubernetes version is GA
+* There is a new [kind version with/or a new set of kind 
images](https://github.com/kubernetes-sigs/kind/releases) for the target 
Kubernetes version
+
+* [ ] Bump quickstart and kind image references in CAPD:
+  * Bump the Kubernetes version in:
+    * `docs/*`
+    * `Tiltfile`
+  * Bump kind image references in CAPD (and also kind if necessary, including 
the latest images for this kind release)
+    * Add new images in the [kind 
mapper.go](https://github.com/kubernetes-sigs/cluster-api/blob/0f47a19e038ee6b0d3b1e7675a62cdaf84face8c/test/infrastructure/kind/mapper.go#L79).
+      * See the [kind releases 
page](https://github.com/kubernetes-sigs/kind/releases) for the list of 
released images.
+    * Set new default image for the [test 
framework](https://github.com/kubernetes-sigs/cluster-api/blob/0f47a19e038ee6b0d3b1e7675a62cdaf84face8c/test/framework/bootstrap/kind_provider.go#L40)
+    * If code changes are required for CAPD to incorporate the new Kind 
version, update [kind 
latestMode](https://github.com/kubernetes-sigs/cluster-api/blob/0f47a19e038ee6b0d3b1e7675a62cdaf84face8c/test/infrastructure/kind/mapper.go#L66)
+  * Verify the quickstart manually
+  * Prior art: https://github.com/kubernetes-sigs/cluster-api/pull/10610
+* [ ] Cherry-pick above PR to the latest release branch.
+
+### Using new Kubernetes dependencies
+
+This section contains tasks to update Cluster API to use the latest Kubernetes 
Go dependencies and related topics
+like using the right Go version and build images. These changes are only made 
on the main branch. We don't
+need them in older releases as they are not necessary to manage workload 
clusters of the new Kubernetes version or
+run the Cluster API controllers on the new Kubernetes version.
+
+* [ ] Ensure there is a new controller-runtime minor release which uses the 
new Kubernetes Go dependencies.
+* [ ] Update our ProwJobs for the `main` branch to use the `kubekins-e2e` with 
the correct Kubernetes version via 
[cluster-api-prowjob-gen.yaml](https://github.com/kubernetes/test-infra/blob/master/config/jobs/kubernetes-sigs/cluster-api/cluster-api-prowjob-gen.yaml)
 and by running `make generate-test-infra-prowjobs`.
+  * It is recommended to have one PR for presubmit and one for periodic jobs 
to reduce the risk of breaking the periodic jobs.
+  * Prior art: https://github.com/kubernetes/test-infra/pull/32380
+* [ ] Bump the Go version in Cluster API: (if Kubernetes is using a new Go 
minor version)
+  * Search for the currently used Go version across the repository and update 
it
+  * We have to at least modify it in: `hack/ensure-go.sh`, `.golangci.yml`, 
`cloudbuild*.yaml`, `go.mod`, `Makefile`, `netlify.toml`, `Tiltfile`
+  * Prior art: https://github.com/kubernetes-sigs/cluster-api/pull/10452
+* [ ] Bumps in Cluster API repo:
+  * controller-runtime & controller-tools in go.mod files
+  * setup-envtest via `SETUP_ENVTEST_VER` in `Makefile`
+  * controller-gen via `CONTROLLER_GEN_VER` in `Makefile`
+  * conversion-gen via `CONVERSION_GEN_VER` in `Makefile`
+  * Prior art: https://github.com/kubernetes-sigs/cluster-api/pull/10803
+* [ ] Bump the Kubernetes version used in integration tests via 
`KUBEBUILDER_ENVTEST_KUBERNETES_VERSION` in `Makefile`
+  * **Note**: This PR should be cherry-picked as well. It is part of this 
section as it depends on kubebuilder/controller-runtime releases and is not 
strictly necessary for [Supporting managing and running on the new Kubernetes 
version](#supporting-managing-and-running-on-the-new-kubernetes-version).
+  * Prior art to release envtest binaries: 
https://github.com/kubernetes-sigs/controller-tools/pull/1032
+  * Prior art: #7193
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/release_tracking.md 
new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/release_tracking.md
--- old/clusterctl-1.10.2/.github/ISSUE_TEMPLATE/release_tracking.md    
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/ISSUE_TEMPLATE/release_tracking.md    
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,85 @@
+---
+name: 🚋 Release cycle tracking
+about: Create a new release cycle tracking issue for a Cluster API minor 
release
+about: "[Only for release team lead] Create an issue to track tasks for a 
Cluster API minor release."
+title: Tasks for v<release-tag> release cycle
+labels: ''
+assignees: ''
+
+---
+
+Please see the corresponding sections of the 
[role-handbooks](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks)
 for documentation of individual tasks.  
+
+## Tasks
+
+**Notes**:
+* Weeks are only specified to give some orientation.
+* The following is based on the v1.6 release cycle. Modify according to the 
tracked release cycle.
+
+Week 1:
+* [ ] [Release Lead] [Finalize release schedule and 
team](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#finalize-release-schedule-and-team)
+* [ ] [Release Lead] [Add/remove release team 
members](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#addremove-release-team-members)
+* [ ] [Release Lead] [Prepare main branch for development of the new 
release](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#prepare-main-branch-for-development-of-the-new-release)
+* [ ] [Communications Manager] [Add docs to collect release notes for users 
and migration notes for provider 
implementers](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/communications#add-docs-to-collect-release-notes-for-users-and-migration-notes-for-provider-implementers)
+* [ ] [Communications Manager] [Update supported 
versions](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/communications#update-supported-versions)
+
+Week 1 to 4:
+* [ ] [Release Lead] [Track] [Remove previously deprecated 
code](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#track-remove-previously-deprecated-code)
+
+Week 6:
+* [ ] [Release Lead] [Cut the v1.5.1 & v1.4.6 
releases](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+
+Week 9:
+* [ ] [Release Lead] [Cut the v1.5.2 & v1.4.7 
releases](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+
+Week 11 to 12:
+* [ ] [Release Lead] [Track] [Bump 
dependencies](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#track-bump-dependencies)
+
+Week 13:
+* [ ] [Release Lead] [Cut the v1.6.0-beta.0 
release](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+* [ ] [Release Lead] [Cut the v1.5.3 & v1.4.8 
releases](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+* [ ] [Release Lead] [Create a new GitHub milestone for the next 
release](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#create-a-new-github-milestone-for-the-next-release)
+* [ ] [Communications Manager] [Communicate beta to 
providers](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/communications#communicate-beta-to-providerss)
+
+Week 14:
+* [ ] [Release Lead] [Cut the v1.6.0-beta.1 
release](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+* [ ] [Release Lead] [Set a tentative release date for the next minor 
release](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#set-a-tentative-release-date-for-the-next-minor-release)
+* [ ] [Release Lead] [Assemble next release 
team](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#set-a-tentative-release-date-for-the-next-minor-release)
+* [ ] [Release Lead] Select release lead for the next release cycle
+
+Week 15:
+
+* KubeCon idle week
+
+Week 16:
+* [ ] [Release Lead] [Cut the v1.6.0-rc.0 
release](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+* [ ] [Release Lead] [Update milestone applier and GitHub 
Actions](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#update-milestone-applier-and-github-actions)
+* [ ] [CI Manager] [Setup jobs and dashboards for the release-1.6 release 
branch](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/ci-signal#setup-jobs-and-dashboards-for-a-new-release-branch)
+* [ ] [Communications Manager] [Ensure the book for the new release is 
available](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/communications#ensure-the-book-for-the-new-release-is-available)
+
+Week 17:
+* [ ] [Release Lead] [Cut the v1.6.0-rc.1 
release](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+
+Week 18:
+* [ ] [Release Lead] [Cut the v1.6.0 
release](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+* [ ] [Release Lead] [Cut the v1.5.4 & v1.4.9 
releases](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#repeatedly-cut-a-release)
+* [ ] [Release Lead] Organize release retrospective
+* [ ] [Communications Manager] [Change production branch in Netlify to the new 
release 
branch](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/communications#change-production-branch-in-netlify-to-the-new-release-branch)
+* [ ] [Communications Manager] [Update clusterctl links in the 
quickstart](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/communications#update-clusterctl-links-in-the-quickstart)
+
+Continuously:
+* [Release lead] [Maintain the GitHub release 
milestone](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#continuously-maintain-the-github-release-milestone)
+* [Release lead] [Bump the Go 
version](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#continuously-bump-the-go-version)
+* [Communications Manager] [Communicate key dates to the 
community](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/communications#continuously-communicate-key-dates-to-the-community)
+* [Communications Manager] Improve release process documentation
+* [Communications Manager] Maintain and improve user facing documentation 
about releases, release policy and release calendar
+* [CI Manager] [Monitor CI 
signal](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/ci-signal#continuously-monitor-ci-signal)
+* [CI Manager] [Reduce the amount of flaky 
tests](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/ci-signal#continuously-reduce-the-amount-of-flaky-tests)
+
+If and when necessary:
+* [ ] [Release Lead] [Track] [Bump the Cluster API 
apiVersion](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#optional-track-bump-the-cluster-api-apiversion)
+* [ ] [Release Lead] [Track] [Bump the Kubernetes 
version](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#optional-track-bump-the-kubernetes-version)
+* [ ] [Release Lead] [Track Release and Improvement 
tasks](https://github.com/kubernetes-sigs/cluster-api/tree/main/docs/release/role-handbooks/release-lead#optional-track-release-and-improvement-tasks)
+
+/priority critical-urgent
+/kind feature
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/.github/PULL_REQUEST_TEMPLATE.md 
new/clusterctl-1.10.3/.github/PULL_REQUEST_TEMPLATE.md
--- old/clusterctl-1.10.2/.github/PULL_REQUEST_TEMPLATE.md      1970-01-01 
01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/PULL_REQUEST_TEMPLATE.md      2025-06-13 
16:36:55.000000000 +0200
@@ -0,0 +1,18 @@
+<!-- Thanks for sending a pull request! Here are some tips for you:
+    1. If this is your first time, please read our contributor guidelines: 
https://github.com/kubernetes-sigs/cluster-api/blob/main/CONTRIBUTING.md#contributing-a-patch
 and developer guide 
https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/book/src/developer/getting-started.md
+
+    2. Please add an icon to the title of this PR (see 
https://sigs.k8s.io/cluster-api/CONTRIBUTING.md#contributing-a-patch), and 
delete this line and similar ones
+    the icon will be either ⚠️ (:warning:, major or breaking changes), ✨ 
(:sparkles:, feature additions), 🐛 (:bug:, patch and bugfixes), 📖 (:book:, 
documentation or proposals), or 🌱 (:seedling:, minor or other) 
+-->
+
+**What this PR does / why we need it**:
+
+**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes 
#<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:
+Fixes #
+
+<!-- 
+Please label this pull request according to what area(s) you are addressing. 
For reference on PR/issue labels, see: 
https://github.com/kubernetes-sigs/cluster-api/labels?q=area+
+
+Area example:
+/area runtime-sdk
+-->
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/.github/dependabot.yaml 
new/clusterctl-1.10.3/.github/dependabot.yaml
--- old/clusterctl-1.10.2/.github/dependabot.yaml       1970-01-01 
01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/dependabot.yaml       2025-06-13 
16:36:55.000000000 +0200
@@ -0,0 +1,59 @@
+# Please see the documentation for all configuration options:
+# 
https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+version: 2
+updates:
+# GitHub Actions
+- package-ecosystem: "github-actions"
+  directory: "/"
+  schedule:
+      interval: "weekly"
+  groups:
+    all-github-actions:
+      patterns: [ "*" ]
+  commit-message:
+      prefix: ":seedling:"
+  labels:
+    - "area/ci"
+    - "ok-to-test"
+
+# Go modules
+- package-ecosystem: "gomod"
+  directories:
+  - "/"
+  - "/test"
+  - "/hack/tools"
+  schedule:
+    interval: "weekly"
+    day: "monday"
+  ## group all dependencies with a k8s.io prefix into a single PR.
+  groups:
+    all-go-mod-patch-and-minor:
+      patterns: [ "*" ]
+      update-types: [ "patch", "minor" ]
+  ignore:
+  # Ignore controller-runtime as its upgraded manually.
+  - dependency-name: "sigs.k8s.io/controller-runtime"
+    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.
+  - dependency-name: "k8s.io/*"
+    update-types: [ "version-update:semver-major", 
"version-update:semver-minor" ]
+  - dependency-name: "github.com/prometheus/*"
+    update-types: [ "version-update:semver-major", 
"version-update:semver-minor"]
+  - dependency-name: "go.etcd.io/*"
+    update-types: [ "version-update:semver-major", 
"version-update:semver-minor" ]
+  - dependency-name: "google.golang.org/grpc"
+    update-types: [ "version-update:semver-major", 
"version-update:semver-minor" ]
+  # Note: We have to keep this 100% in sync with k8s.io, so we get exactly the 
behavior
+  # that the k8s.io CEL code expects.
+  - dependency-name: "github.com/google/cel-go"
+    # Ignore kind as its upgraded manually.
+  - dependency-name: "sigs.k8s.io/kind"
+    update-types: [ "version-update:semver-major", 
"version-update:semver-minor" ]
+    # Bumping the kustomize API independently can break compatibility with 
client-go as they share k8s.io/kube-openapi as a dependency.
+  - dependency-name: "sigs.k8s.io/kustomize/api"
+    update-types: [ "version-update:semver-major", 
"version-update:semver-minor" ]
+  commit-message:
+    prefix: ":seedling:"
+  labels:
+    - "area/dependency"
+    - "ok-to-test"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/workflows/pr-dependabot.yaml 
new/clusterctl-1.10.3/.github/workflows/pr-dependabot.yaml
--- old/clusterctl-1.10.2/.github/workflows/pr-dependabot.yaml  1970-01-01 
01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/pr-dependabot.yaml  2025-06-13 
16:36:55.000000000 +0200
@@ -0,0 +1,49 @@
+name: PR dependabot code generation and go modules fix
+
+# This action runs on other PRs opened by dependabot. It updates modules and 
generated code on PRs opened by dependabot.
+on:
+  pull_request:
+    branches:
+      - dependabot/**
+  push:
+    branches:
+      - dependabot/**
+  workflow_dispatch:
+
+permissions:
+  contents: write # Allow to update the PR.
+
+jobs:
+  build:
+    name: Build
+    runs-on: ubuntu-latest
+    steps:
+    - name: Check out code into the Go module directory
+      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+    - name: Calculate go version
+      id: vars
+      run: echo "go_version=$(make go-version)" >> $GITHUB_OUTPUT
+    - name: Set up Go
+      uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # 
tag=v5.3.0
+      with:
+        go-version: ${{ steps.vars.outputs.go_version }}
+    - uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # tag=v4.2.2
+      name: Restore go cache
+      with:
+        path: |
+          ~/.cache/go-build
+          ~/go/pkg/mod
+        key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
+        restore-keys: |
+          ${{ runner.os }}-go-
+    - name: Update all modules
+      run: make generate-modules
+    - name: Update generated code
+      run: make generate
+    - uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # 
tag=v9.1.4
+      name: Commit changes
+      with:
+        author_name: dependabot[bot]
+        author_email: 49699333+dependabot[bot]@users.noreply.github.com
+        default_author: github_actor
+        message: 'Update generated code'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/workflows/pr-gh-workflow-approve.yaml 
new/clusterctl-1.10.3/.github/workflows/pr-gh-workflow-approve.yaml
--- old/clusterctl-1.10.2/.github/workflows/pr-gh-workflow-approve.yaml 
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/pr-gh-workflow-approve.yaml 
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,42 @@
+name: PR approve GH Workflows
+
+on:
+  pull_request_target:
+    types:
+      - edited
+      - labeled
+      - reopened
+      - synchronize
+
+permissions: {}
+
+jobs:
+  approve:
+    name: Approve ok-to-test
+    if: contains(github.event.pull_request.labels.*.name, 'ok-to-test')
+    runs-on: ubuntu-latest
+    permissions:
+      actions: write
+    steps:
+      - name: Update PR
+        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # 
v7.0.1
+        continue-on-error: true
+        with:
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+          script: |
+            const result = await github.rest.actions.listWorkflowRunsForRepo({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              event: "pull_request",
+              status: "action_required",
+              head_sha: context.payload.pull_request.head.sha,
+              per_page: 100
+            });
+
+            for (var run of result.data.workflow_runs) {
+              await github.rest.actions.approveWorkflowRun({
+                owner: context.repo.owner,
+                repo: context.repo.repo,
+                run_id: run.id
+              });
+            }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/workflows/pr-golangci-lint.yaml 
new/clusterctl-1.10.3/.github/workflows/pr-golangci-lint.yaml
--- old/clusterctl-1.10.2/.github/workflows/pr-golangci-lint.yaml       
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/pr-golangci-lint.yaml       
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,37 @@
+name: PR golangci-lint
+
+on:
+  pull_request:
+    types: [opened, edited, synchronize, reopened]
+
+# Remove all permissions from GITHUB_TOKEN except metadata.
+permissions: {}
+
+jobs:
+  golangci:
+    name: lint
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        working-directory:
+          - ""
+          - test
+          - hack/tools
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+      - name: Calculate go version
+        id: vars
+        run: echo "go_version=$(make go-version)" >> $GITHUB_OUTPUT
+      - name: Set up Go
+        uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # 
tag=v5.3.0
+        with:
+          go-version: ${{ steps.vars.outputs.go_version }}
+      - name: golangci-lint
+        uses: 
golangci/golangci-lint-action@4696ba8babb6127d732c3c6dde519db15edab9ea # 
tag=v6.5.1
+        with:
+          version: v1.63.4
+          args: --out-format=colored-line-number
+          working-directory: ${{matrix.working-directory}}
+      - name: Lint API
+        run: GOLANGCI_LINT_EXTRA_ARGS=--out-format=colored-line-number make 
lint-api
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/workflows/pr-md-link-check.yaml 
new/clusterctl-1.10.3/.github/workflows/pr-md-link-check.yaml
--- old/clusterctl-1.10.2/.github/workflows/pr-md-link-check.yaml       
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/pr-md-link-check.yaml       
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,23 @@
+name: PR check Markdown links
+
+on:
+  pull_request:
+    types: [opened, edited, synchronize, reopened]
+    paths:
+      - '**.md'
+
+# Remove all permissions from GITHUB_TOKEN except metadata.
+permissions: {}
+
+jobs:
+  markdown-link-check:
+    name: Broken Links
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+    - uses: 
gaurav-nelson/github-action-markdown-link-check@3c3b66f1f7d0900e37b71eca45b63ea9eedfce31
 # tag=1.0.17
+      with:
+        use-quiet-mode: 'yes'
+        config-file: .markdownlinkcheck.json
+        check-modified-files-only: 'yes'
+        base-branch: ${{ github.base_ref }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/.github/workflows/pr-verify.yaml 
new/clusterctl-1.10.3/.github/workflows/pr-verify.yaml
--- old/clusterctl-1.10.2/.github/workflows/pr-verify.yaml      1970-01-01 
01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/pr-verify.yaml      2025-06-13 
16:36:55.000000000 +0200
@@ -0,0 +1,19 @@
+name: PR title verifier
+
+on:
+  pull_request_target:
+    types: [opened, edited, synchronize, reopened]
+
+jobs:
+  verify:
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+
+      - name: Check if PR title is valid
+        env:
+          PR_TITLE: ${{ github.event.pull_request.title }}
+        run: |
+          ./hack/verify-pr-title.sh "${PR_TITLE}"
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/.github/workflows/release.yaml 
new/clusterctl-1.10.3/.github/workflows/release.yaml
--- old/clusterctl-1.10.2/.github/workflows/release.yaml        1970-01-01 
01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/release.yaml        2025-06-13 
16:36:55.000000000 +0200
@@ -0,0 +1,114 @@
+name: Create Release
+
+on:
+  push:
+    branches:
+      - main
+    paths:
+      - 'CHANGELOG/*.md'
+
+permissions:
+  contents: write # Allow to push a tag, create a release branch and publish a 
draft release.
+
+jobs:
+  push_release_tags:
+    runs-on: ubuntu-latest
+    outputs:
+      release_tag: ${{ steps.release-version.outputs.release_version }}
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+        with:
+          fetch-depth: 0
+      - name: Get changed files
+        id: changed-files
+        uses: 
tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # tag=v46.0.1
+      - name: Get release version
+        id: release-version
+        run: |
+            if [[ ${{ steps.changed-files.outputs.all_changed_files_count }} 
!= 1 ]]; then
+              echo "1 release notes file should be changed to create a release 
tag, found ${{ steps.changed-files.outputs.all_changed_files_count }}"
+              exit 1
+            fi
+            for changed_file in ${{ 
steps.changed-files.outputs.all_changed_files }}; do
+              export RELEASE_VERSION=$(echo "${changed_file}" | grep -oP 
'(?<=/)[^/]+(?=\.md)')
+              echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV
+              echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_OUTPUT
+              if [[ "$RELEASE_VERSION" =~ 
^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$
 ]]; then
+                echo "Valid semver: $RELEASE_VERSION"
+              else
+                echo "Invalid semver: $RELEASE_VERSION"
+                exit 1
+              fi
+            done
+      - name: Determine the release branch to use
+        run: |
+            # Use the release branch for all v1.10 releases
+            if [[ ! $RELEASE_VERSION =~ ^v1\.10 ]] && [[ $RELEASE_VERSION =~ 
beta ]] || [[ $RELEASE_VERSION =~ alpha ]]; then
+              export RELEASE_BRANCH=main
+              echo "RELEASE_BRANCH=$RELEASE_BRANCH" >> $GITHUB_ENV
+              echo "This is a beta or alpha release, will use release branch 
$RELEASE_BRANCH"
+            else
+              export RELEASE_BRANCH=release-$(echo $RELEASE_VERSION | sed -E 
's/^v([0-9]+)\.([0-9]+)\..*$/\1.\2/')
+              echo "RELEASE_BRANCH=$RELEASE_BRANCH" >> $GITHUB_ENV
+              echo "This is not a beta or alpha release, will use release 
branch $RELEASE_BRANCH"
+            fi
+      - name: Create or checkout release branch
+        run: |
+          if git show-ref --verify --quiet 
"refs/remotes/origin/$RELEASE_BRANCH"; then
+            echo "Branch $RELEASE_BRANCH already exists"
+            git checkout "$RELEASE_BRANCH"
+          else
+            git checkout -b "$RELEASE_BRANCH"
+            git push origin "$RELEASE_BRANCH"
+            echo "Created branch $RELEASE_BRANCH"
+          fi
+      - name: Validate tag does not already exist
+        run: |
+          if [[ $(git tag -l $RELEASE_VERSION) ]]; then
+            echo "Tag $RELEASE_VERSION already exists, exiting"
+            exit 1
+          fi
+      - name: Create Release Tag
+        run: |
+          git config user.name "${GITHUB_ACTOR}"
+          git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
+          git tag -a ${RELEASE_VERSION} -m ${RELEASE_VERSION}
+          git tag test/${RELEASE_VERSION}
+          git push origin ${RELEASE_VERSION}
+          git push origin test/${RELEASE_VERSION}
+          echo "Created tags $RELEASE_VERSION and test/${RELEASE_VERSION}"
+  release:
+    name: create draft release
+    runs-on: ubuntu-latest
+    needs: push_release_tags
+    steps:
+      - name: Set env
+        run:  echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV
+        env:
+          RELEASE_TAG: ${{needs.push_release_tags.outputs.release_tag}}
+      - name: checkout code
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+        with:
+          fetch-depth: 0
+          ref: ${{ env.RELEASE_TAG }}
+      - name: Calculate go version
+        run: echo "go_version=$(make go-version)" >> $GITHUB_ENV
+      - name: Set up Go
+        uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # 
tag=v5.3.0
+        with:
+          go-version: ${{ env.go_version }}
+      - name: generate release artifacts
+        run: |
+          make release
+      - name: get release notes
+        run: |
+          curl -L "https://raw.githubusercontent.com/${{ github.repository 
}}/main/CHANGELOG/${{ env.RELEASE_TAG }}.md" \
+          -o "${{ env.RELEASE_TAG }}.md"
+      - name: Release
+        uses: 
softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # 
tag=v2.2.1
+        with:
+          draft: true
+          files: out/*
+          body_path: ${{ env.RELEASE_TAG }}.md
+          tag_name: ${{ env.RELEASE_TAG }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/workflows/weekly-md-link-check.yaml 
new/clusterctl-1.10.3/.github/workflows/weekly-md-link-check.yaml
--- old/clusterctl-1.10.2/.github/workflows/weekly-md-link-check.yaml   
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/weekly-md-link-check.yaml   
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,26 @@
+name: Weekly check all Markdown links
+
+on:
+  schedule:
+    # Cron for every Monday at 12:00 UTC.
+    - cron: "0 12 * * 1"
+
+# Remove all permissions from GITHUB_TOKEN except metadata.
+permissions: {}
+
+jobs:
+  markdown-link-check:
+    name: Broken Links
+    strategy:
+      fail-fast: false
+      matrix:
+        branch: [ main, release-1.9, release-1.8 ]
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+        with:
+          ref: ${{ matrix.branch }}
+      - uses: 
gaurav-nelson/github-action-markdown-link-check@3c3b66f1f7d0900e37b71eca45b63ea9eedfce31
 # tag=1.0.17
+        with:
+          use-quiet-mode: 'yes'
+          config-file: .markdownlinkcheck.json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/workflows/weekly-security-scan.yaml 
new/clusterctl-1.10.3/.github/workflows/weekly-security-scan.yaml
--- old/clusterctl-1.10.2/.github/workflows/weekly-security-scan.yaml   
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/weekly-security-scan.yaml   
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,32 @@
+name: Weekly security scan
+
+on:
+  schedule:
+    # Cron for every Monday at 12:00 UTC.
+    - cron: "0 12 * * 1"
+
+# Remove all permissions from GITHUB_TOKEN except metadata.
+permissions: {}
+
+jobs:
+  scan:
+    strategy:
+      fail-fast: false
+      matrix:
+        branch: [ main, release-1.9, release-1.8 ]
+    name: Trivy
+    runs-on: ubuntu-latest
+    steps:
+    - name: Check out code
+      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+      with:
+        ref: ${{ matrix.branch }}
+    - name: Calculate go version
+      id: vars
+      run: echo "go_version=$(make go-version)" >> $GITHUB_OUTPUT
+    - name: Set up Go
+      uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # 
tag=v5.3.0
+      with:
+        go-version: ${{ steps.vars.outputs.go_version }}
+    - name: Run verify security target
+      run: make verify-security
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/.github/workflows/weekly-test-release.yaml 
new/clusterctl-1.10.3/.github/workflows/weekly-test-release.yaml
--- old/clusterctl-1.10.2/.github/workflows/weekly-test-release.yaml    
1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.github/workflows/weekly-test-release.yaml    
2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,40 @@
+name: Weekly release test
+
+# Note: This workflow does not build for releases. It attempts to build 
release binaries periodically to ensure the repo
+# release machinery is in a good state.
+
+on:
+  schedule:
+    # Cron for every day at 12:00 UTC.
+    - cron: "0 12 * * *"
+
+# Remove all permissions from GITHUB_TOKEN except metadata.
+permissions: {}
+
+jobs:
+  weekly-test-release:
+    name: Test release
+    strategy:
+      fail-fast: false
+      matrix:
+        branch: [ main, release-1.9, release-1.8 ]
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 
tag=v4.2.2
+        with:
+          ref: ${{ matrix.branch }}
+          fetch-depth: 0
+      - name: Set env
+        run:  echo "RELEASE_TAG=v9.9.9-fake" >> $GITHUB_ENV
+      - name: Set fake tag for release
+        run: |
+          git tag ${{ env.RELEASE_TAG }}
+      - name: Calculate go version
+        run: echo "go_version=$(make go-version)" >> $GITHUB_ENV
+      - name: Set up Go
+        uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # 
tag=v5.3.0
+        with:
+          go-version: ${{ env.go_version }}
+      - name: Test release
+        run: |
+          make release
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/.gitignore 
new/clusterctl-1.10.3/.gitignore
--- old/clusterctl-1.10.2/.gitignore    1970-01-01 01:00:00.000000000 +0100
+++ new/clusterctl-1.10.3/.gitignore    2025-06-13 16:36:55.000000000 +0200
@@ -0,0 +1,96 @@
+# Binaries for programs and plugins
+*.exe
+*.dll
+*.so
+*.dylib
+cmd/clusterctl/clusterctl
+bin
+hack/tools/bin
+
+# Test binary, build with `go test -c`
+*.test
+
+# E2E test templates
+test/e2e/data/infrastructure-docker/**/cluster-template*.yaml
+!test/e2e/data/infrastructure-docker/**/clusterclass-quick-start.yaml
+!test/e2e/data/infrastructure-docker/**/clusterclass-quick-start-runtimesdk.yaml
+!test/e2e/data/infrastructure-docker/**/cluster-template-in-memory.yaml
+!test/e2e/data/infrastructure-docker/**/clusterclass-in-memory.yaml
+test/e2e/data/infrastructure-docker/**/clusterclass-*.yaml
+test/e2e/data/infrastructure-inmemory/**/cluster-template*.yaml
+
+# Output of Makefile targets using sed on MacOS systems
+*.yaml-e
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# IntelliJ
+.idea/
+*.iml
+
+# VSCode
+.vscode/
+*.code-workspace
+
+# go.work files
+go.work
+go.work.sum
+
+# kubeconfigs
+minikube.kubeconfig
+
+# Book
+docs/book/book/
+
+# Common editor / temporary files
+*~
+*.tmp
+.DS_Store
+
+# rbac and manager config for example provider
+config/ci/rbac/role_binding.yaml
+config/ci/rbac/role.yaml
+config/ci/rbac/aggregated_role.yaml
+config/ci/rbac/auth_proxy_role.yaml
+config/ci/rbac/auth_proxy_role_binding.yaml
+config/ci/rbac/auth_proxy_service.yaml
+config/ci/manager/manager.yaml
+
+# Sample config files auto-generated by kubebuilder
+config/samples
+
+# Temporary clusterctl directory
+cmd/clusterctl/config/manifest
+
+# The golang vendor directory that contains local copies of external
+# dependencies that satisfy Go imports in this project.
+vendor
+
+# User-supplied Tiltfile extensions, settings, and builds
+tilt.d
+tilt-settings.json
+tilt-settings.yaml
+.tiltbuild
+
+# User-supplied clusterctl hacks settings
+clusterctl-settings.json
+
+# test results
+_artifacts
+
+# release artifacts
+out
+
+# Helm
+.helm
+
+# Used during parts of the build process. Files _should_ get cleaned up 
automatically.
+# This is also a good location for any temporary manfiests used during 
development
+tmp
+
+# asdf (not a typo! ;) used to manage multiple versions of tools
+.tool-versions
+
+# Development container configurations (https://containers.dev/)
+.devcontainer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/Makefile 
new/clusterctl-1.10.3/Makefile
--- old/clusterctl-1.10.2/Makefile      2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/Makefile      2025-06-13 16:36:55.000000000 +0200
@@ -23,7 +23,7 @@
 #
 # Go.
 #
-GO_VERSION ?= 1.23.8
+GO_VERSION ?= 1.23.10
 GO_DIRECTIVE_VERSION ?= 1.23.0
 GO_CONTAINER_IMAGE ?= docker.io/library/golang:$(GO_VERSION)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/Tiltfile 
new/clusterctl-1.10.3/Tiltfile
--- old/clusterctl-1.10.2/Tiltfile      2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/Tiltfile      2025-06-13 16:36:55.000000000 +0200
@@ -172,7 +172,7 @@
 
 tilt_helper_dockerfile_header = """
 # Tilt image
-FROM golang:1.23.8 as tilt-helper
+FROM golang:1.23.10 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/dlv@v1.23
 # Support live reloading with Tilt
@@ -183,7 +183,7 @@
 """
 
 tilt_dockerfile_header = """
-FROM golang:1.23.8 as tilt
+FROM golang:1.23.10 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.10.2/bootstrap/kubeadm/api/v1beta1/kubeadmconfig_types.go 
new/clusterctl-1.10.3/bootstrap/kubeadm/api/v1beta1/kubeadmconfig_types.go
--- old/clusterctl-1.10.2/bootstrap/kubeadm/api/v1beta1/kubeadmconfig_types.go  
2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/bootstrap/kubeadm/api/v1beta1/kubeadmconfig_types.go  
2025-06-13 16:36:55.000000000 +0200
@@ -442,7 +442,7 @@
        // The data format is documented here: 
https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/
        // +optional
        // +kubebuilder:validation:MinLength=1
-       // +kubebuilder:validation:MaxLength=10240
+       // +kubebuilder:validation:MaxLength=32768
        AdditionalConfig string `json:"additionalConfig,omitempty"`
 
        // strict controls if AdditionalConfig should be strictly parsed. If 
so, warnings are treated as errors.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml
 
new/clusterctl-1.10.3/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml
--- 
old/clusterctl-1.10.2/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml
     2025-05-20 11:37:16.000000000 +0200
+++ 
new/clusterctl-1.10.3/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml
     2025-06-13 16:36:55.000000000 +0200
@@ -3121,7 +3121,7 @@
                           configuration generated by the bootstrapper 
controller. More info: 
https://coreos.github.io/ignition/operator-notes/#config-merging
 
                           The data format is documented here: 
https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/
-                        maxLength: 10240
+                        maxLength: 32768
                         minLength: 1
                         type: string
                       strict:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml
 
new/clusterctl-1.10.3/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml
--- 
old/clusterctl-1.10.2/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml
     2025-05-20 11:37:16.000000000 +0200
+++ 
new/clusterctl-1.10.3/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml
     2025-06-13 16:36:55.000000000 +0200
@@ -3100,7 +3100,7 @@
                                   configuration generated by the bootstrapper 
controller. More info: 
https://coreos.github.io/ignition/operator-notes/#config-merging
 
                                   The data format is documented here: 
https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/
-                                maxLength: 10240
+                                maxLength: 32768
                                 minLength: 1
                                 type: string
                               strict:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/cmd/clusterctl/client/common.go 
new/clusterctl-1.10.3/cmd/clusterctl/client/common.go
--- old/clusterctl-1.10.2/cmd/clusterctl/client/common.go       2025-05-20 
11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/cmd/clusterctl/client/common.go       2025-06-13 
16:36:55.000000000 +0200
@@ -62,7 +62,7 @@
 
 // parseProviderName defines a utility function that parses the abbreviated 
syntax for name[:version].
 func parseProviderName(provider string) (name string, version string, err 
error) {
-       t := strings.Split(strings.ToLower(provider), ":")
+       t := strings.Split(provider, ":")
        if len(t) > 2 {
                return "", "", errors.Errorf("invalid provider name %q. 
Provider name should be in the form name[:version]", provider)
        }
@@ -71,7 +71,7 @@
                return "", "", errors.Errorf("invalid provider name %q. 
Provider name should be in the form name[:version] and name cannot be empty", 
provider)
        }
 
-       name = t[0]
+       name = strings.ToLower(t[0])
        if err := validateDNS1123Label(name); err != nil {
                return "", "", errors.Wrapf(err, "invalid provider name %q. 
Provider name should be in the form name[:version] and the name should be 
valid", provider)
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/cmd/clusterctl/client/common_test.go 
new/clusterctl-1.10.3/cmd/clusterctl/client/common_test.go
--- old/clusterctl-1.10.2/cmd/clusterctl/client/common_test.go  2025-05-20 
11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/cmd/clusterctl/client/common_test.go  2025-06-13 
16:36:55.000000000 +0200
@@ -51,6 +51,24 @@
                        wantVersion: "version",
                        wantErr:     false,
                },
+               {
+                       name: "name & upper case version",
+                       args: args{
+                               provider: "provider:1.0.0-VERSION",
+                       },
+                       wantName:    "provider",
+                       wantVersion: "1.0.0-VERSION",
+                       wantErr:     false,
+               },
+               {
+                       name: "upper name & version",
+                       args: args{
+                               provider: "PROVIDER:VERSION",
+                       },
+                       wantName:    "provider",
+                       wantVersion: "VERSION",
+                       wantErr:     false,
+               },
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
@@ -59,9 +77,9 @@
                        gotName, gotVersion, err := 
parseProviderName(tt.args.provider)
                        if tt.wantErr {
                                g.Expect(err).To(HaveOccurred())
-                       } else {
-                               g.Expect(err).ToNot(HaveOccurred())
+                               return
                        }
+                       g.Expect(err).ToNot(HaveOccurred())
                        g.Expect(gotName).To(Equal(tt.wantName))
 
                        g.Expect(gotVersion).To(Equal(tt.wantVersion))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/cmd/clusterctl/client/config/providers_client.go 
new/clusterctl-1.10.3/cmd/clusterctl/client/config/providers_client.go
--- old/clusterctl-1.10.2/cmd/clusterctl/client/config/providers_client.go      
2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/cmd/clusterctl/client/config/providers_client.go      
2025-06-13 16:36:55.000000000 +0200
@@ -532,6 +532,10 @@
                return errors.New("name value cannot be empty")
        }
 
+       if r.Name() != strings.ToLower(r.Name()) {
+               return errors.Errorf("provider name %s must be in lower case", 
r.Name())
+       }
+
        if (r.Name() == ClusterAPIProviderName) != (r.Type() == 
clusterctlv1.CoreProviderType) {
                return errors.Errorf("name %s must be used with the %s type 
(name: %s, type: %s)", ClusterAPIProviderName, clusterctlv1.CoreProviderType, 
r.Name(), r.Type())
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml
 
new/clusterctl-1.10.3/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml
--- 
old/clusterctl-1.10.2/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml
 2025-05-20 11:37:16.000000000 +0200
+++ 
new/clusterctl-1.10.3/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml
 2025-06-13 16:36:55.000000000 +0200
@@ -3606,7 +3606,7 @@
                               configuration generated by the bootstrapper 
controller. More info: 
https://coreos.github.io/ignition/operator-notes/#config-merging
 
                               The data format is documented here: 
https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/
-                            maxLength: 10240
+                            maxLength: 32768
                             minLength: 1
                             type: string
                           strict:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml
 
new/clusterctl-1.10.3/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml
--- 
old/clusterctl-1.10.2/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml
 2025-05-20 11:37:16.000000000 +0200
+++ 
new/clusterctl-1.10.3/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml
 2025-06-13 16:36:55.000000000 +0200
@@ -2326,7 +2326,7 @@
                                       configuration generated by the 
bootstrapper controller. More info: 
https://coreos.github.io/ignition/operator-notes/#config-merging
 
                                       The data format is documented here: 
https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/
-                                    maxLength: 10240
+                                    maxLength: 32768
                                     minLength: 1
                                     type: string
                                   strict:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/docs/book/src/developer/providers/contracts/clusterctl.md 
new/clusterctl-1.10.3/docs/book/src/developer/providers/contracts/clusterctl.md
--- 
old/clusterctl-1.10.2/docs/book/src/developer/providers/contracts/clusterctl.md 
    2025-05-20 11:37:16.000000000 +0200
+++ 
new/clusterctl-1.10.3/docs/book/src/developer/providers/contracts/clusterctl.md 
    2025-06-13 16:36:55.000000000 +0200
@@ -57,7 +57,7 @@
 - As soon as possible, create an issue to the [Cluster API 
repository](https://sigs.k8s.io/cluster-api) declaring the intent to add a new 
provider;
   each provider must have a unique name & type in the pre-defined list of 
providers shipped with `clusterctl`; the provider's name
   must be declared in the issue above and abide to the following naming 
convention:
-  - The name must consist of lower case alphanumeric characters or '-', and 
must start and end with an alphanumeric character.
+  - The name must consist of lower case alphanumeric characters or '-', and 
must start and end with an alphanumeric character. If the name includes upper 
case alphanumeric characters, clusterctl enforces it lower case it.
   - The name length should not exceed 63 characters.
   - For providers not in the kubernetes-sigs org, in order to prevent 
conflicts the `clusterctl` name must be prefixed with
     the provider's GitHub org name followed by `-` (see note below).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/go.mod new/clusterctl-1.10.3/go.mod
--- old/clusterctl-1.10.2/go.mod        2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/go.mod        2025-06-13 16:36:55.000000000 +0200
@@ -68,7 +68,7 @@
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/cenkalti/backoff/v4 v4.3.0 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
-       github.com/cloudflare/circl v1.3.7 // indirect
+       github.com/cloudflare/circl v1.6.1 // indirect
        github.com/coredns/caddy v1.1.1 // indirect
        github.com/coreos/go-semver v0.3.1 // indirect
        github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // 
indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/go.sum new/clusterctl-1.10.3/go.sum
--- old/clusterctl-1.10.2/go.sum        2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/go.sum        2025-06-13 16:36:55.000000000 +0200
@@ -63,8 +63,8 @@
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod 
h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cloudflare/circl v1.1.0/go.mod 
h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
-github.com/cloudflare/circl v1.3.7 
h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
-github.com/cloudflare/circl v1.3.7/go.mod 
h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
+github.com/cloudflare/circl v1.6.1 
h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
+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.26 
h1:xiiEkVB1Dwolb24pkeDUDBfygV9/XsOSq79yFCrhptY=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/hack/tools/go.mod 
new/clusterctl-1.10.3/hack/tools/go.mod
--- old/clusterctl-1.10.2/hack/tools/go.mod     2025-05-20 11:37:16.000000000 
+0200
+++ new/clusterctl-1.10.3/hack/tools/go.mod     2025-06-13 16:36:55.000000000 
+0200
@@ -83,7 +83,7 @@
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
        github.com/cheggaaa/pb/v3 v3.1.5 // indirect
-       github.com/cloudflare/circl v1.3.7 // indirect
+       github.com/cloudflare/circl v1.6.1 // indirect
        github.com/cyphar/filepath-securejoin v0.2.4 // indirect
        github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // 
indirect
        github.com/distribution/reference v0.6.0 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/hack/tools/go.sum 
new/clusterctl-1.10.3/hack/tools/go.sum
--- old/clusterctl-1.10.2/hack/tools/go.sum     2025-05-20 11:37:16.000000000 
+0200
+++ new/clusterctl-1.10.3/hack/tools/go.sum     2025-06-13 16:36:55.000000000 
+0200
@@ -69,8 +69,8 @@
 github.com/cheggaaa/pb/v3 v3.1.5 
h1:QuuUzeM2WsAqG2gMqtzaWithDJv0i+i6UlnwSCI4QLk=
 github.com/cheggaaa/pb/v3 v3.1.5/go.mod 
h1:CrxkeghYTXi1lQBEI7jSn+3svI3cuc19haAj6jM60XI=
 github.com/cloudflare/circl v1.3.3/go.mod 
h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
-github.com/cloudflare/circl v1.3.7 
h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
-github.com/cloudflare/circl v1.3.7/go.mod 
h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
+github.com/cloudflare/circl v1.6.1 
h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
+github.com/cloudflare/circl v1.6.1/go.mod 
h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
 github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 
h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk=
 github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod 
h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
 github.com/containerd/log v0.1.0 
h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/internal/controllers/topology/cluster/current_state.go 
new/clusterctl-1.10.3/internal/controllers/topology/cluster/current_state.go
--- 
old/clusterctl-1.10.2/internal/controllers/topology/cluster/current_state.go    
    2025-05-20 11:37:16.000000000 +0200
+++ 
new/clusterctl-1.10.3/internal/controllers/topology/cluster/current_state.go    
    2025-06-13 16:36:55.000000000 +0200
@@ -19,6 +19,7 @@
 import (
        "context"
        "fmt"
+       "strings"
 
        "github.com/pkg/errors"
        corev1 "k8s.io/api/core/v1"
@@ -84,7 +85,7 @@
 // getCurrentInfrastructureClusterState looks for the state of the 
InfrastructureCluster. If a reference is set but not
 // found, either from an error or the object not being found, an error is 
thrown.
 func (r *Reconciler) getCurrentInfrastructureClusterState(ctx context.Context, 
blueprintInfrastructureClusterTemplate *unstructured.Unstructured, cluster 
*clusterv1.Cluster) (*unstructured.Unstructured, error) {
-       ref, err := alignRefAPIVersion(blueprintInfrastructureClusterTemplate, 
cluster.Spec.InfrastructureRef)
+       ref, err := alignRefAPIVersion(blueprintInfrastructureClusterTemplate, 
cluster.Spec.InfrastructureRef, false)
        if err != nil {
                return nil, errors.Wrapf(err, "failed to read %s %s", 
cluster.Spec.InfrastructureRef.Kind, 
klog.KRef(cluster.Spec.InfrastructureRef.Namespace, 
cluster.Spec.InfrastructureRef.Name))
        }
@@ -109,7 +110,7 @@
        res := &scope.ControlPlaneState{}
 
        // Get the control plane object.
-       ref, err := alignRefAPIVersion(blueprintControlPlane.Template, 
cluster.Spec.ControlPlaneRef)
+       ref, err := alignRefAPIVersion(blueprintControlPlane.Template, 
cluster.Spec.ControlPlaneRef, false)
        if err != nil {
                return nil, errors.Wrapf(err, "failed to read %s %s", 
cluster.Spec.ControlPlaneRef.Kind, 
klog.KRef(cluster.Spec.ControlPlaneRef.Namespace, 
cluster.Spec.ControlPlaneRef.Name))
        }
@@ -134,7 +135,7 @@
        if err != nil {
                return res, errors.Wrapf(err, "failed to get 
InfrastructureMachineTemplate reference for %s %s", res.Object.GetKind(), 
klog.KObj(res.Object))
        }
-       ref, err = 
alignRefAPIVersion(blueprintControlPlane.InfrastructureMachineTemplate, 
machineInfrastructureRef)
+       ref, err = 
alignRefAPIVersion(blueprintControlPlane.InfrastructureMachineTemplate, 
machineInfrastructureRef, true)
        if err != nil {
                return nil, errors.Wrapf(err, "failed to get 
InfrastructureMachineTemplate for %s %s", res.Object.GetKind(), 
klog.KObj(res.Object))
        }
@@ -229,11 +230,11 @@
                                if !ok {
                                        return nil, fmt.Errorf("failed to find 
MachineDeployment class %s in ClusterClass", mdClassName)
                                }
-                               bootstrapRef, err = 
alignRefAPIVersion(mdBluePrint.BootstrapTemplate, bootstrapRef)
+                               bootstrapRef, err = 
alignRefAPIVersion(mdBluePrint.BootstrapTemplate, bootstrapRef, true)
                                if err != nil {
                                        return nil, errors.Wrap(err, 
fmt.Sprintf("MachineDeployment %s Bootstrap reference could not be retrieved", 
klog.KObj(m)))
                                }
-                               infraRef, err = 
alignRefAPIVersion(mdBluePrint.InfrastructureMachineTemplate, infraRef)
+                               infraRef, err = 
alignRefAPIVersion(mdBluePrint.InfrastructureMachineTemplate, infraRef, true)
                                if err != nil {
                                        return nil, errors.Wrap(err, 
fmt.Sprintf("MachineDeployment %s Infrastructure reference could not be 
retrieved", klog.KObj(m)))
                                }
@@ -349,11 +350,11 @@
                        if !ok {
                                return nil, fmt.Errorf("failed to find 
MachinePool class %s in ClusterClass", mpClassName)
                        }
-                       bootstrapRef, err = 
alignRefAPIVersion(mpBluePrint.BootstrapTemplate, bootstrapRef)
+                       bootstrapRef, err = 
alignRefAPIVersion(mpBluePrint.BootstrapTemplate, bootstrapRef, false)
                        if err != nil {
                                return nil, errors.Wrap(err, 
fmt.Sprintf("MachinePool %s Bootstrap reference could not be retrieved", 
klog.KObj(m)))
                        }
-                       infraRef, err = 
alignRefAPIVersion(mpBluePrint.InfrastructureMachinePoolTemplate, infraRef)
+                       infraRef, err = 
alignRefAPIVersion(mpBluePrint.InfrastructureMachinePoolTemplate, infraRef, 
false)
                        if err != nil {
                                return nil, errors.Wrap(err, 
fmt.Sprintf("MachinePool %s Infrastructure reference could not be retrieved", 
klog.KObj(m)))
                        }
@@ -398,7 +399,7 @@
 // If group or kind was changed in the ClusterClass, an exact copy of the 
currentRef is returned because
 // it will end up in a diff and a rollout anyway.
 // Only bootstrap template refs in a ClusterClass can change their group and 
kind.
-func alignRefAPIVersion(templateFromClusterClass *unstructured.Unstructured, 
currentRef *corev1.ObjectReference) (*corev1.ObjectReference, error) {
+func alignRefAPIVersion(templateFromClusterClass *unstructured.Unstructured, 
currentRef *corev1.ObjectReference, isCurrentTemplate bool) 
(*corev1.ObjectReference, error) {
        currentGV, err := schema.ParseGroupVersion(currentRef.APIVersion)
        if err != nil {
                return nil, errors.Wrapf(err, "failed to parse apiVersion: %q", 
currentRef.APIVersion)
@@ -406,9 +407,19 @@
 
        apiVersion := currentRef.APIVersion
        // Use apiVersion from ClusterClass if group and kind is the same.
-       if templateFromClusterClass.GroupVersionKind().Group == currentGV.Group 
&&
-               templateFromClusterClass.GetKind() == currentRef.Kind {
-               apiVersion = templateFromClusterClass.GetAPIVersion()
+       if templateFromClusterClass.GroupVersionKind().Group == currentGV.Group 
{
+               if isCurrentTemplate {
+                       // If the current object is a template, kind has to be 
identical.
+                       if templateFromClusterClass.GetKind() == 
currentRef.Kind {
+                               apiVersion = 
templateFromClusterClass.GetAPIVersion()
+                       }
+               } else {
+                       // If the current object is not a template, 
currentRef.Kind should be the kind from CC without the Template suffix,
+                       // e.g. KubeadmControlPlaneTemplate == 
KubeadmControlPlane
+                       if 
strings.TrimSuffix(templateFromClusterClass.GetKind(), "Template") == 
currentRef.Kind {
+                               apiVersion = 
templateFromClusterClass.GetAPIVersion()
+                       }
+               }
        }
 
        return &corev1.ObjectReference{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clusterctl-1.10.2/internal/controllers/topology/cluster/current_state_test.go
 
new/clusterctl-1.10.3/internal/controllers/topology/cluster/current_state_test.go
--- 
old/clusterctl-1.10.2/internal/controllers/topology/cluster/current_state_test.go
   2025-05-20 11:37:16.000000000 +0200
+++ 
new/clusterctl-1.10.3/internal/controllers/topology/cluster/current_state_test.go
   2025-06-13 16:36:55.000000000 +0200
@@ -27,6 +27,7 @@
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+       "k8s.io/apimachinery/pkg/runtime/schema"
        "k8s.io/utils/ptr"
        "sigs.k8s.io/controller-runtime/pkg/client"
        "sigs.k8s.io/controller-runtime/pkg/client/fake"
@@ -1187,14 +1188,15 @@
                name                     string
                templateFromClusterClass *unstructured.Unstructured
                currentRef               *corev1.ObjectReference
+               isCurrentTemplate        bool
                want                     *corev1.ObjectReference
                wantErr                  bool
        }{
                {
                        name: "Error for invalid apiVersion",
                        templateFromClusterClass: 
&unstructured.Unstructured{Object: map[string]interface{}{
-                               "apiVersion": 
"infrastructure.cluster.x-k8s.io/v1beta1",
-                               "kind":       "DockerCluster",
+                               "apiVersion": schema.GroupVersion{Group: 
"infrastructure.cluster.x-k8s.io", Version: "v1beta1"}.String(),
+                               "kind":       "DockerClusterTemplate",
                        }},
                        currentRef: &corev1.ObjectReference{
                                APIVersion: "invalid/api/version",
@@ -1202,29 +1204,52 @@
                                Name:       "my-cluster-abc",
                                Namespace:  metav1.NamespaceDefault,
                        },
-                       wantErr: true,
+                       isCurrentTemplate: false,
+                       wantErr:           true,
                },
                {
-                       name: "Use apiVersion from ClusterClass: group and kind 
is the same",
+                       name: "Use apiVersion from ClusterClass: group and kind 
is the same (+/- Template suffix)",
                        templateFromClusterClass: 
&unstructured.Unstructured{Object: map[string]interface{}{
-                               "apiVersion": 
"infrastructure.cluster.x-k8s.io/v1beta1",
-                               "kind":       "DockerCluster",
+                               "apiVersion": schema.GroupVersion{Group: 
"infrastructure.cluster.x-k8s.io", Version: "v1beta1"}.String(),
+                               "kind":       "DockerClusterTemplate",
                        }},
                        currentRef: &corev1.ObjectReference{
-                               APIVersion: 
"infrastructure.cluster.x-k8s.io/v1beta2",
+                               APIVersion: 
"infrastructure.cluster.x-k8s.io/different", // should be overwritten with 
version from CC
                                Kind:       "DockerCluster",
                                Name:       "my-cluster-abc",
                                Namespace:  metav1.NamespaceDefault,
                        },
+                       isCurrentTemplate: false,
                        want: &corev1.ObjectReference{
-                               // Group & kind is the same => apiVersion is 
taken from ClusterClass.
-                               APIVersion: 
"infrastructure.cluster.x-k8s.io/v1beta1",
+                               // Group & kind is the same (+/- Template 
suffix) => apiVersion is taken from ClusterClass.
+                               APIVersion: schema.GroupVersion{Group: 
"infrastructure.cluster.x-k8s.io", Version: "v1beta1"}.String(),
                                Kind:       "DockerCluster",
                                Name:       "my-cluster-abc",
                                Namespace:  metav1.NamespaceDefault,
                        },
                },
                {
+                       name: "Use apiVersion from ClusterClass: group and kind 
is the same",
+                       templateFromClusterClass: 
&unstructured.Unstructured{Object: map[string]interface{}{
+                               "apiVersion": schema.GroupVersion{Group: 
"bootstrap.cluster.x-k8s.io", Version: "v1beta1"}.String(),
+                               "kind":       "KubeadmConfigTemplate",
+                       }},
+                       currentRef: &corev1.ObjectReference{
+                               APIVersion: 
"bootstrap.cluster.x-k8s.io/different", // should be overwritten with version 
from CC
+                               Kind:       "KubeadmConfigTemplate",
+                               Name:       "my-cluster-abc",
+                               Namespace:  metav1.NamespaceDefault,
+                       },
+                       isCurrentTemplate: true,
+                       want: &corev1.ObjectReference{
+                               // Group & kind is the same => apiVersion is 
taken from ClusterClass.
+                               APIVersion: schema.GroupVersion{Group: 
"bootstrap.cluster.x-k8s.io", Version: "v1beta1"}.String(),
+                               Kind:       "KubeadmConfigTemplate",
+                               Name:       "my-cluster-abc",
+                               Namespace:  metav1.NamespaceDefault,
+                       },
+               },
+               {
                        name: "Use apiVersion from currentRef: kind is 
different",
                        templateFromClusterClass: 
&unstructured.Unstructured{Object: map[string]interface{}{
                                "apiVersion": 
"bootstrap.cluster.x-k8s.io/v1alpha4",
@@ -1236,6 +1261,7 @@
                                Name:       "my-cluster-abc",
                                Namespace:  metav1.NamespaceDefault,
                        },
+                       isCurrentTemplate: true,
                        want: &corev1.ObjectReference{
                                // kind is different => apiVersion is taken 
from currentRef.
                                APIVersion: 
"bootstrap.cluster.x-k8s.io/v1beta1",
@@ -1256,6 +1282,7 @@
                                Name:       "my-cluster-abc",
                                Namespace:  metav1.NamespaceDefault,
                        },
+                       isCurrentTemplate: true,
                        want: &corev1.ObjectReference{
                                // group is different => apiVersion is taken 
from currentRef.
                                APIVersion: 
"bootstrap.cluster.x-k8s.io/v1beta1",
@@ -1269,7 +1296,7 @@
                t.Run(tt.name, func(t *testing.T) {
                        g := NewWithT(t)
 
-                       got, err := 
alignRefAPIVersion(tt.templateFromClusterClass, tt.currentRef)
+                       got, err := 
alignRefAPIVersion(tt.templateFromClusterClass, tt.currentRef, 
tt.isCurrentTemplate)
                        if tt.wantErr {
                                g.Expect(err).To(HaveOccurred())
                                return
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/netlify.toml 
new/clusterctl-1.10.3/netlify.toml
--- old/clusterctl-1.10.2/netlify.toml  2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/netlify.toml  2025-06-13 16:36:55.000000000 +0200
@@ -4,7 +4,7 @@
     publish = "docs/book/book"
 
 [build.environment]
-    GO_VERSION = "1.23.8"
+    GO_VERSION = "1.23.10"
 
 # Standard Netlify redirects
 [[redirects]]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/test/go.mod 
new/clusterctl-1.10.3/test/go.mod
--- old/clusterctl-1.10.2/test/go.mod   2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/test/go.mod   2025-06-13 16:36:55.000000000 +0200
@@ -56,7 +56,7 @@
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/cenkalti/backoff/v4 v4.3.0 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
-       github.com/cloudflare/circl v1.3.7 // indirect
+       github.com/cloudflare/circl v1.6.1 // indirect
        github.com/containerd/log v0.1.0 // indirect
        github.com/coreos/go-semver v0.3.1 // indirect
        github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // 
indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/clusterctl-1.10.2/test/go.sum 
new/clusterctl-1.10.3/test/go.sum
--- old/clusterctl-1.10.2/test/go.sum   2025-05-20 11:37:16.000000000 +0200
+++ new/clusterctl-1.10.3/test/go.sum   2025-06-13 16:36:55.000000000 +0200
@@ -42,8 +42,8 @@
 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/cloudflare/circl v1.1.0/go.mod 
h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
-github.com/cloudflare/circl v1.3.7 
h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
-github.com/cloudflare/circl v1.3.7/go.mod 
h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
+github.com/cloudflare/circl v1.6.1 
h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
+github.com/cloudflare/circl v1.6.1/go.mod 
h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
 github.com/containerd/log v0.1.0 
h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
 github.com/containerd/log v0.1.0/go.mod 
h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
 github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0=

++++++ clusterctl.obsinfo ++++++
--- /var/tmp/diff_new_pack.D9JsDQ/_old  2025-06-18 16:03:23.574151733 +0200
+++ /var/tmp/diff_new_pack.D9JsDQ/_new  2025-06-18 16:03:23.578151899 +0200
@@ -1,5 +1,5 @@
 name: clusterctl
-version: 1.10.2
-mtime: 1747733836
-commit: 525566440a77696f6d57535229987ad226a5e51a
+version: 1.10.3
+mtime: 1749825415
+commit: 9beb81e3a3efdbfb21779d90d95d2640273f1d4d
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/clusterctl/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.clusterctl.new.19631/vendor.tar.gz differ: char 16, 
line 1

Reply via email to