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