Repository: kubernetes-sigs/cluster-api-provider-openstack

Issue:
Test ORC upgrades in e2e
We should test upgrading between ORC versions, just like we do with all CAPI providers in clusterctl-upgrade tests. I think it should work by adding an older version in the [e2e_config.yaml](https://github.com/kubernetes-sigs/cluster-api-provider-openstack/blob/main/test/e2e/data/e2e_conf.yaml) and then specify in the [clusterctl-upgrade test](https://github.com/kubernetes-sigs/cluster-api-provider-openstack/blob/606fcbdbce41befe503c723038437570deb59a06/test/e2e/suites/e2e/clusterctl_upgrade_test.go#L59) what version to start from.

Discussion:
@sirpaleet: /assign

Solution patch:
diff --git a/go.mod b/go.mod
index 98310009..cde6105a 100644
--- a/go.mod
+++ b/go.mod
@@ -20,12 +20,12 @@ require (
 	golang.org/x/crypto v0.39.0
 	golang.org/x/text v0.26.0
 	gopkg.in/ini.v1 v1.67.0
-	k8s.io/api v0.32.5
-	k8s.io/apiextensions-apiserver v0.32.5
-	k8s.io/apimachinery v0.32.5
-	k8s.io/client-go v0.32.5
-	k8s.io/code-generator v0.32.5
-	k8s.io/component-base v0.32.5
+	k8s.io/api v0.32.6
+	k8s.io/apiextensions-apiserver v0.32.6
+	k8s.io/apimachinery v0.32.6
+	k8s.io/client-go v0.32.6
+	k8s.io/code-generator v0.32.6
+	k8s.io/component-base v0.32.6
 	k8s.io/klog/v2 v2.130.1
 	k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f
 	k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
@@ -150,7 +150,7 @@ require (
 	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/apiserver v0.32.5 // indirect
+	k8s.io/apiserver v0.32.6 // indirect
 	k8s.io/cluster-bootstrap v0.32.3 // indirect
 	k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 // indirect
 	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect
diff --git a/go.sum b/go.sum
index 8a3e1534..817e548a 100644
--- a/go.sum
+++ b/go.sum
@@ -419,22 +419,22 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
 gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
-k8s.io/api v0.32.5 h1:uqjjsYo1kTJr5NIcoIaP9F+TgXgADH7nKQx91FDAhtk=
-k8s.io/api v0.32.5/go.mod h1:bXXFU3fGCZ/eFMZvfHZC69PeGbXEL4zzjuPVzOxHF64=
-k8s.io/apiextensions-apiserver v0.32.5 h1:o0aKvmzIIs8Uk54pidk32pxET+Pg2ULnh9WI1PuKTwE=
-k8s.io/apiextensions-apiserver v0.32.5/go.mod h1:5fpedJa3HJJFBukAZ6ur91DEDye5gYuXISPbOiNLYpU=
-k8s.io/apimachinery v0.32.5 h1:6We3aJ6crC0ap8EhsEXcgX3LpI6SEjubpiOMXLROwPM=
-k8s.io/apimachinery v0.32.5/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apiserver v0.32.5 h1:phmm2EOUVFI+cLiq8Grtuh166fTt/qgvkGPkpgzp5uY=
-k8s.io/apiserver v0.32.5/go.mod h1:5bfueS1tgARVWVXRJBMI5mHoCmev0jOvbxebai/kiqc=
-k8s.io/client-go v0.32.5 h1:huFmQMzgWu0z4kbWsuZci+Gt4Fo72I4CcrvhToZ/Qp0=
-k8s.io/client-go v0.32.5/go.mod h1:Qchw6f9WIVrur7DKojAHpRgGLcANT0RLIvF39Jz58xA=
+k8s.io/api v0.32.6 h1:UiBAMRzTP24Tz9UT1uhhmAv1auGTT9PT/npywSk9JrU=
+k8s.io/api v0.32.6/go.mod h1:+iFCyQN34v2rsL53iQEN9lYE03mFdgPvgSXvATIDteg=
+k8s.io/apiextensions-apiserver v0.32.6 h1:B9zv1tpW+090Prav3GP53A4W2Bv908AAouZYJWp0fy8=
+k8s.io/apiextensions-apiserver v0.32.6/go.mod h1:3lAgylV3582qpXg8NWW4NOLdzxLC8mTcfPqqjAzOSTs=
+k8s.io/apimachinery v0.32.6 h1:odtEUjg7OT3132sBFsFn4Arj4Gd+BplYekmLQP8L3ak=
+k8s.io/apimachinery v0.32.6/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/apiserver v0.32.6 h1:SKt+2e4klvHes4nw3moBI3mCPuh3RFp0XtYzsjZOOjk=
+k8s.io/apiserver v0.32.6/go.mod h1:CleW9S9cdw3EAevI/RCFc7RtHTEgbcTFhZV28IEdRtU=
+k8s.io/client-go v0.32.6 h1:Q+O+Sd9LKKFnsGZNVX2q1RDILYRpQZX+ea2RoIgjKlM=
+k8s.io/client-go v0.32.6/go.mod h1:yqL9XJ2cTXy3WdJwdeyob3O6xiLwWrh9DP7SeszniW0=
 k8s.io/cluster-bootstrap v0.32.3 h1:AqIpsUhB6MUeaAsl1WvaUw54AHRd2hfZrESlKChtd8s=
 k8s.io/cluster-bootstrap v0.32.3/go.mod h1:CHbBwgOb6liDV6JFUTkx5t85T2xidy0sChBDoyYw344=
-k8s.io/code-generator v0.32.5 h1:dvoXgaWTDPLsg0txUzWj5xPV8UwHOsBhmm4JC9Gd1Qo=
-k8s.io/code-generator v0.32.5/go.mod h1:7S6jUv4ZAnI2yDUJUQUEuc3gv6+qFhnkB5Fhs9Eb0d8=
-k8s.io/component-base v0.32.5 h1:2HiX+m3s9Iz5CMqdCVDH2V942UqzQvjuhcXb4W+KCsg=
-k8s.io/component-base v0.32.5/go.mod h1:jDsPNFFElv9m27TcYxlpEX7TZ3vdgx2g4PaqMUHpV/Y=
+k8s.io/code-generator v0.32.6 h1:PxUFh/DLYQhL6t/hMjKaxUF5RDMV3YXh1FfzZkZ00uc=
+k8s.io/code-generator v0.32.6/go.mod h1:ZgPiUB+rnn6/tdyxi2o9E139v7AgwVeVcIVNUxOAeTc=
+k8s.io/component-base v0.32.6 h1:LwKaAlUcTyRouaqUdpQ+JLvtwyZlrWrNey1axNbE0ac=
+k8s.io/component-base v0.32.6/go.mod h1:fFJq5U4s+BAjmTV5gnT9CIfRbVujyITuO93ambmplcE=
 k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 h1:si3PfKm8dDYxgfbeA6orqrtLkvvIeH8UqffFJDl0bz4=
 k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index 1575edfb..ee8ee5b2 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -8,7 +8,7 @@ require (
 	github.com/itchyny/gojq v0.12.17
 	github.com/onsi/ginkgo/v2 v2.23.4
 	go.uber.org/mock v0.5.2
-	k8s.io/code-generator v0.32.5
+	k8s.io/code-generator v0.32.6
 	sigs.k8s.io/cluster-api-provider-openstack v0.0.0
 	sigs.k8s.io/cluster-api/hack/tools v0.0.0-20221129083400-679ae3e9e6b6
 	sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20230926180527-c93e2abcb28e
@@ -117,13 +117,13 @@ require (
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/api v0.32.5 // indirect
-	k8s.io/apiextensions-apiserver v0.32.5 // indirect
-	k8s.io/apimachinery v0.32.5 // indirect
-	k8s.io/apiserver v0.32.5 // indirect
-	k8s.io/client-go v0.32.5 // indirect
+	k8s.io/api v0.32.6 // indirect
+	k8s.io/apiextensions-apiserver v0.32.6 // indirect
+	k8s.io/apimachinery v0.32.6 // indirect
+	k8s.io/apiserver v0.32.6 // indirect
+	k8s.io/client-go v0.32.6 // indirect
 	k8s.io/cluster-bootstrap v0.32.3 // indirect
-	k8s.io/component-base v0.32.5 // indirect
+	k8s.io/component-base v0.32.6 // indirect
 	k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9 // indirect
 	k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 // indirect
 	k8s.io/klog v0.2.0 // indirect
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index ac2b652e..2a2e2471 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -428,22 +428,22 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.32.5 h1:uqjjsYo1kTJr5NIcoIaP9F+TgXgADH7nKQx91FDAhtk=
-k8s.io/api v0.32.5/go.mod h1:bXXFU3fGCZ/eFMZvfHZC69PeGbXEL4zzjuPVzOxHF64=
-k8s.io/apiextensions-apiserver v0.32.5 h1:o0aKvmzIIs8Uk54pidk32pxET+Pg2ULnh9WI1PuKTwE=
-k8s.io/apiextensions-apiserver v0.32.5/go.mod h1:5fpedJa3HJJFBukAZ6ur91DEDye5gYuXISPbOiNLYpU=
-k8s.io/apimachinery v0.32.5 h1:6We3aJ6crC0ap8EhsEXcgX3LpI6SEjubpiOMXLROwPM=
-k8s.io/apimachinery v0.32.5/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apiserver v0.32.5 h1:phmm2EOUVFI+cLiq8Grtuh166fTt/qgvkGPkpgzp5uY=
-k8s.io/apiserver v0.32.5/go.mod h1:5bfueS1tgARVWVXRJBMI5mHoCmev0jOvbxebai/kiqc=
-k8s.io/client-go v0.32.5 h1:huFmQMzgWu0z4kbWsuZci+Gt4Fo72I4CcrvhToZ/Qp0=
-k8s.io/client-go v0.32.5/go.mod h1:Qchw6f9WIVrur7DKojAHpRgGLcANT0RLIvF39Jz58xA=
+k8s.io/api v0.32.6 h1:UiBAMRzTP24Tz9UT1uhhmAv1auGTT9PT/npywSk9JrU=
+k8s.io/api v0.32.6/go.mod h1:+iFCyQN34v2rsL53iQEN9lYE03mFdgPvgSXvATIDteg=
+k8s.io/apiextensions-apiserver v0.32.6 h1:B9zv1tpW+090Prav3GP53A4W2Bv908AAouZYJWp0fy8=
+k8s.io/apiextensions-apiserver v0.32.6/go.mod h1:3lAgylV3582qpXg8NWW4NOLdzxLC8mTcfPqqjAzOSTs=
+k8s.io/apimachinery v0.32.6 h1:odtEUjg7OT3132sBFsFn4Arj4Gd+BplYekmLQP8L3ak=
+k8s.io/apimachinery v0.32.6/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/apiserver v0.32.6 h1:SKt+2e4klvHes4nw3moBI3mCPuh3RFp0XtYzsjZOOjk=
+k8s.io/apiserver v0.32.6/go.mod h1:CleW9S9cdw3EAevI/RCFc7RtHTEgbcTFhZV28IEdRtU=
+k8s.io/client-go v0.32.6 h1:Q+O+Sd9LKKFnsGZNVX2q1RDILYRpQZX+ea2RoIgjKlM=
+k8s.io/client-go v0.32.6/go.mod h1:yqL9XJ2cTXy3WdJwdeyob3O6xiLwWrh9DP7SeszniW0=
 k8s.io/cluster-bootstrap v0.32.3 h1:AqIpsUhB6MUeaAsl1WvaUw54AHRd2hfZrESlKChtd8s=
 k8s.io/cluster-bootstrap v0.32.3/go.mod h1:CHbBwgOb6liDV6JFUTkx5t85T2xidy0sChBDoyYw344=
-k8s.io/code-generator v0.32.5 h1:dvoXgaWTDPLsg0txUzWj5xPV8UwHOsBhmm4JC9Gd1Qo=
-k8s.io/code-generator v0.32.5/go.mod h1:7S6jUv4ZAnI2yDUJUQUEuc3gv6+qFhnkB5Fhs9Eb0d8=
-k8s.io/component-base v0.32.5 h1:2HiX+m3s9Iz5CMqdCVDH2V942UqzQvjuhcXb4W+KCsg=
-k8s.io/component-base v0.32.5/go.mod h1:jDsPNFFElv9m27TcYxlpEX7TZ3vdgx2g4PaqMUHpV/Y=
+k8s.io/code-generator v0.32.6 h1:PxUFh/DLYQhL6t/hMjKaxUF5RDMV3YXh1FfzZkZ00uc=
+k8s.io/code-generator v0.32.6/go.mod h1:ZgPiUB+rnn6/tdyxi2o9E139v7AgwVeVcIVNUxOAeTc=
+k8s.io/component-base v0.32.6 h1:LwKaAlUcTyRouaqUdpQ+JLvtwyZlrWrNey1axNbE0ac=
+k8s.io/component-base v0.32.6/go.mod h1:fFJq5U4s+BAjmTV5gnT9CIfRbVujyITuO93ambmplcE=
 k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9 h1:1bLA4Agvs1DILmc+q2Bbcqjx6jOHO7YEFA+G+0aTZoc=
 k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 h1:si3PfKm8dDYxgfbeA6orqrtLkvvIeH8UqffFJDl0bz4=
diff --git a/kustomize/v1beta1/default/cluster-template.yaml b/kustomize/v1beta1/default/cluster-template.yaml
index ae7db083..d27f558a 100644
--- a/kustomize/v1beta1/default/cluster-template.yaml
+++ b/kustomize/v1beta1/default/cluster-template.yaml
@@ -73,9 +73,6 @@ spec:
           cloud-provider: external
           provider-id: "openstack:///'{{ instance_id }}'"
     clusterConfiguration:
-      apiServer:
-        extraArgs:
-          cloud-provider: external
       controllerManager:
         extraArgs:
           cloud-provider: external
diff --git a/kustomize/v1beta1/flatcar-sysext/patch-flatcar.yaml b/kustomize/v1beta1/flatcar-sysext/patch-flatcar.yaml
index 6c143c85..89113fb0 100644
--- a/kustomize/v1beta1/flatcar-sysext/patch-flatcar.yaml
+++ b/kustomize/v1beta1/flatcar-sysext/patch-flatcar.yaml
@@ -38,16 +38,16 @@ spec:
                 mode: 0644
                 contents:
                   remote:
-                    url: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-${KUBERNETES_VERSION%.*}.conf
+                    url: https://extensions.flatcar.org/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION%.*}.conf
               - path: /etc/sysupdate.d/noop.conf
                 mode: 0644
                 contents:
                   remote:
-                    url: https://github.com/flatcar/sysext-bakery/releases/download/latest/noop.conf
+                    url: https://extensions.flatcar.org/extensions/noop.conf
               - path: /opt/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
                 contents:
                   remote:
-                    url: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
+                    url: https://extensions.flatcar.org/extensions/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
           systemd:
             units:
               - name: systemd-sysupdate.service
@@ -82,10 +82,10 @@ spec:
                       [Service]
                       EnvironmentFile=/run/metadata/flatcar
     preKubeadmCommands:
-      - export COREOS_OPENSTACK_HOSTNAME=$${COREOS_OPENSTACK_HOSTNAME%.*}
-      - export COREOS_OPENSTACK_INSTANCE_UUID=$${COREOS_OPENSTACK_INSTANCE_UUID}
-      - envsubst < /etc/kubeadm.yml > /etc/kubeadm.yml.tmp
-      - mv /etc/kubeadm.yml.tmp /etc/kubeadm.yml
+    - export COREOS_OPENSTACK_HOSTNAME=$${COREOS_OPENSTACK_HOSTNAME%.*}
+    - export COREOS_OPENSTACK_INSTANCE_UUID=$${COREOS_OPENSTACK_INSTANCE_UUID}
+    - envsubst < /etc/kubeadm.yml > /etc/kubeadm.yml.tmp
+    - mv /etc/kubeadm.yml.tmp /etc/kubeadm.yml
 ---
 apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
 kind: KubeadmConfigTemplate
@@ -100,10 +100,10 @@ spec:
           kubeletExtraArgs:
             provider-id: openstack:///$${COREOS_OPENSTACK_INSTANCE_UUID}
       preKubeadmCommands:
-        - export COREOS_OPENSTACK_HOSTNAME=$${COREOS_OPENSTACK_HOSTNAME%.*}
-        - export COREOS_OPENSTACK_INSTANCE_UUID=$${COREOS_OPENSTACK_INSTANCE_UUID}
-        - envsubst < /etc/kubeadm.yml > /etc/kubeadm.yml.tmp
-        - mv /etc/kubeadm.yml.tmp /etc/kubeadm.yml
+      - export COREOS_OPENSTACK_HOSTNAME=$${COREOS_OPENSTACK_HOSTNAME%.*}
+      - export COREOS_OPENSTACK_INSTANCE_UUID=$${COREOS_OPENSTACK_INSTANCE_UUID}
+      - envsubst < /etc/kubeadm.yml > /etc/kubeadm.yml.tmp
+      - mv /etc/kubeadm.yml.tmp /etc/kubeadm.yml
       format: ignition
       ignition:
         containerLinuxConfig:
@@ -118,16 +118,16 @@ spec:
                   mode: 0644
                   contents:
                     remote:
-                      url: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-${KUBERNETES_VERSION%.*}.conf
+                      url: https://extensions.flatcar.org/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION%.*}.conf
                 - path: /etc/sysupdate.d/noop.conf
                   mode: 0644
                   contents:
                     remote:
-                      url: https://github.com/flatcar/sysext-bakery/releases/download/latest/noop.conf
+                      url: https://extensions.flatcar.org/extensions/noop.conf
                 - path: /opt/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
                   contents:
                     remote:
-                      url: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
+                      url: https://extensions.flatcar.org/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
             systemd:
               units:
                 - name: systemd-sysupdate.service
diff --git a/templates/cluster-template-flatcar-sysext.yaml b/templates/cluster-template-flatcar-sysext.yaml
index ec33bdef..32af9f00 100644
--- a/templates/cluster-template-flatcar-sysext.yaml
+++ b/templates/cluster-template-flatcar-sysext.yaml
@@ -30,16 +30,16 @@ spec:
                   mode: 0644
                   contents:
                     remote:
-                      url: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-${KUBERNETES_VERSION%.*}.conf
+                      url: https://extensions.flatcar.org/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION%.*}.conf
                 - path: /etc/sysupdate.d/noop.conf
                   mode: 0644
                   contents:
                     remote:
-                      url: https://github.com/flatcar/sysext-bakery/releases/download/latest/noop.conf
+                      url: https://extensions.flatcar.org/extensions/noop.conf
                 - path: /opt/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
                   contents:
                     remote:
-                      url: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
+                      url: https://extensions.flatcar.org/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
             systemd:
               units:
                 - name: systemd-sysupdate.service
@@ -135,9 +135,6 @@ metadata:
 spec:
   kubeadmConfigSpec:
     clusterConfiguration:
-      apiServer:
-        extraArgs:
-          cloud-provider: external
       controllerManager:
         extraArgs:
           cloud-provider: external
@@ -156,16 +153,16 @@ spec:
                 mode: 0644
                 contents:
                   remote:
-                    url: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-${KUBERNETES_VERSION%.*}.conf
+                    url: https://extensions.flatcar.org/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION%.*}.conf
               - path: /etc/sysupdate.d/noop.conf
                 mode: 0644
                 contents:
                   remote:
-                    url: https://github.com/flatcar/sysext-bakery/releases/download/latest/noop.conf
+                    url: https://extensions.flatcar.org/extensions/noop.conf
               - path: /opt/extensions/kubernetes/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
                 contents:
                   remote:
-                    url: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
+                    url: https://extensions.flatcar.org/extensions/kubernetes-${KUBERNETES_VERSION}-x86-64.raw
           systemd:
             units:
               - name: systemd-sysupdate.service
diff --git a/templates/cluster-template-flatcar.yaml b/templates/cluster-template-flatcar.yaml
index 42822659..bc48e499 100644
--- a/templates/cluster-template-flatcar.yaml
+++ b/templates/cluster-template-flatcar.yaml
@@ -97,9 +97,6 @@ metadata:
 spec:
   kubeadmConfigSpec:
     clusterConfiguration:
-      apiServer:
-        extraArgs:
-          cloud-provider: external
       controllerManager:
         extraArgs:
           cloud-provider: external
diff --git a/templates/cluster-template-without-lb.yaml b/templates/cluster-template-without-lb.yaml
index 6dbf7a72..d6bf52a0 100644
--- a/templates/cluster-template-without-lb.yaml
+++ b/templates/cluster-template-without-lb.yaml
@@ -73,9 +73,6 @@ metadata:
 spec:
   kubeadmConfigSpec:
     clusterConfiguration:
-      apiServer:
-        extraArgs:
-          cloud-provider: external
       controllerManager:
         extraArgs:
           cloud-provider: external
diff --git a/templates/cluster-template.yaml b/templates/cluster-template.yaml
index 3508d37e..d419a7c3 100644
--- a/templates/cluster-template.yaml
+++ b/templates/cluster-template.yaml
@@ -73,9 +73,6 @@ metadata:
 spec:
   kubeadmConfigSpec:
     clusterConfiguration:
-      apiServer:
-        extraArgs:
-          cloud-provider: external
       controllerManager:
         extraArgs:
           cloud-provider: external
diff --git a/templates/clusterclass-dev-test.yaml b/templates/clusterclass-dev-test.yaml
index e4181b24..345eb80e 100644
--- a/templates/clusterclass-dev-test.yaml
+++ b/templates/clusterclass-dev-test.yaml
@@ -308,9 +308,6 @@ spec:
     spec:
       kubeadmConfigSpec:
         clusterConfiguration:
-          apiServer:
-            extraArgs:
-              cloud-provider: external
           controllerManager:
             extraArgs:
               cloud-provider: external



Test patch:
diff --git a/test/e2e/data/e2e_conf.yaml b/test/e2e/data/e2e_conf.yaml
index 8d74e579..40e5b17a 100644
--- a/test/e2e/data/e2e_conf.yaml
+++ b/test/e2e/data/e2e_conf.yaml
@@ -154,6 +154,15 @@ providers:
     replacements:
     - old: "imagePullPolicy: Always"
       new: "imagePullPolicy: IfNotPresent"
+  # This is only for clusterctl upgrade tests, latest stable release of major version v1.0
+  - name: v1.0.2
+    value: ../../../../cluster-api-provider-openstack/test/infrastructure/openstack-resource-controller/config/upgrade-from
+    contract: v1beta1
+    files:
+    - sourcePath: "../data/shared/openstack-resource-controller/metadata.yaml"
+    replacements:
+    - old: "imagePullPolicy: Always"
+      new: "imagePullPolicy: IfNotPresent"
 
 
 # default variables for the e2e test; those values could be overridden via env variables, thus
@@ -161,12 +170,12 @@ providers:
 variables:
   # used to ensure we deploy to the correct management cluster
   KUBE_CONTEXT: "kind-capo-e2e"
-  KUBERNETES_VERSION: "v1.31.2"
-  KUBERNETES_VERSION_UPGRADE_FROM: "v1.30.1"
-  KUBERNETES_VERSION_UPGRADE_TO: "v1.31.2"
+  KUBERNETES_VERSION: "v1.33.1"
+  KUBERNETES_VERSION_UPGRADE_FROM: "v1.32.5"
+  KUBERNETES_VERSION_UPGRADE_TO: "v1.33.1"
   # NOTE: To see default images run kubeadm config images list (optionally with --kubernetes-version=vX.Y.Z)
-  ETCD_VERSION_UPGRADE_TO: "3.5.12-0"
-  COREDNS_VERSION_UPGRADE_TO: "v1.11.1"
+  ETCD_VERSION_UPGRADE_TO: "3.5.21-0"
+  COREDNS_VERSION_UPGRADE_TO: "v1.12.0"
   CONTROL_PLANE_MACHINE_TEMPLATE_UPGRADE_TO: "upgrade-to-control-plane"
   WORKERS_MACHINE_TEMPLATE_UPGRADE_TO: "upgrade-to-md-0"
   CNI: "../../data/cni/calico.yaml"
@@ -186,10 +195,10 @@ variables:
   OPENSTACK_DNS_NAMESERVERS: "8.8.8.8"
   OPENSTACK_FAILURE_DOMAIN: "testaz1"
   OPENSTACK_FAILURE_DOMAIN_ALT: "testaz2"
-  OPENSTACK_IMAGE_NAME: "ubuntu-2404-kube-v1.31.2"
-  OPENSTACK_IMAGE_URL: https://storage.googleapis.com/artifacts.k8s-staging-capi-openstack.appspot.com/test/ubuntu/2024-11-21/ubuntu-2404-kube-v1.31.2.img
-  OPENSTACK_IMAGE_NAME_UPGRADE_FROM: "ubuntu-2204-kube-v1.30.1"
-  OPENSTACK_IMAGE_URL_UPGRADE_FROM: https://storage.googleapis.com/artifacts.k8s-staging-capi-openstack.appspot.com/test/ubuntu/2024-05-28/ubuntu-2204-kube-v1.30.1.img
+  OPENSTACK_IMAGE_NAME: "ubuntu-2404-kube-v1.33.1"
+  OPENSTACK_IMAGE_URL: https://storage.googleapis.com/artifacts.k8s-staging-capi-openstack.appspot.com/test/ubuntu/ubuntu-2404-kube-v1.33.1
+  OPENSTACK_IMAGE_NAME_UPGRADE_FROM: "ubuntu-2404-kube-v1.32.5"
+  OPENSTACK_IMAGE_URL_UPGRADE_FROM: https://storage.googleapis.com/artifacts.k8s-staging-capi-openstack.appspot.com/test/ubuntu/ubuntu-2404-kube-v1.32.5
   OPENSTACK_NODE_MACHINE_FLAVOR: "m1.small"
   OPENSTACK_SSH_KEY_NAME: "cluster-api-provider-openstack-sigs-k8s-io"
   # The default external network created by devstack
@@ -202,8 +211,8 @@ variables:
   SSH_USER_MACHINE: "ubuntu"
   EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION: "true"
   # The Flatcar image produced by the image-builder
-  OPENSTACK_FLATCAR_IMAGE_NAME: "flatcar-stable-4152.2.0-kube-v1.31.2"
-  OPENSTACK_FLATCAR_IMAGE_URL: "https://storage.googleapis.com/artifacts.k8s-staging-capi-openstack.appspot.com/test/flatcar/flatcar-stable-4152.2.0-kube-v1.31.2.img"
+  OPENSTACK_FLATCAR_IMAGE_NAME: "flatcar-stable-4152.2.3-kube-v1.33.1"
+  OPENSTACK_FLATCAR_IMAGE_URL: "https://storage.googleapis.com/artifacts.k8s-staging-capi-openstack.appspot.com/test/flatcar/flatcar-stable-4152.2.3-kube-v1.33.1"
   # A plain Flatcar from the Flatcar releases server
   FLATCAR_IMAGE_NAME: "flatcar_production_openstack_image"
   FLATCAR_IMAGE_URL: https://stable.release.flatcar-linux.net/amd64-usr/current/flatcar_production_openstack_image.img
diff --git a/test/e2e/suites/e2e/clusterctl_upgrade_test.go b/test/e2e/suites/e2e/clusterctl_upgrade_test.go
index ec11037f..39e62276 100644
--- a/test/e2e/suites/e2e/clusterctl_upgrade_test.go
+++ b/test/e2e/suites/e2e/clusterctl_upgrade_test.go
@@ -36,7 +36,7 @@ var (
 	capiRelease19  string
 )
 
-var _ = Describe("When testing clusterctl upgrades (v0.11=>current) [clusterctl-upgrade]", func() {
+var _ = Describe("When testing clusterctl upgrades for CAPO (v0.11=>current) and ORC (v1.0.2=>current) [clusterctl-upgrade]", func() {
 	BeforeEach(func(ctx context.Context) {
 		setDownloadE2EImageEnvVar()
 		// Note: This gives the version without the 'v' prefix, so we need to add it below.
@@ -51,25 +51,26 @@ var _ = Describe("When testing clusterctl upgrades (v0.11=>current) [clusterctl-
 
 	capi_e2e.ClusterctlUpgradeSpec(context.TODO(), func() capi_e2e.ClusterctlUpgradeSpecInput {
 		return capi_e2e.ClusterctlUpgradeSpecInput{
-			E2EConfig:                       e2eCtx.E2EConfig,
-			ClusterctlConfigPath:            e2eCtx.Environment.ClusterctlConfigPath,
-			BootstrapClusterProxy:           e2eCtx.Environment.BootstrapClusterProxy,
-			ArtifactFolder:                  e2eCtx.Settings.ArtifactFolder,
-			SkipCleanup:                     false,
-			InitWithBinary:                  "https://github.com/kubernetes-sigs/cluster-api/releases/download/" + capiRelease19 + "/clusterctl-{OS}-{ARCH}",
-			InitWithProvidersContract:       "v1beta1",
-			InitWithInfrastructureProviders: []string{"openstack:" + capoRelease011},
-			InitWithCoreProvider:            "cluster-api:" + capiRelease19,
-			InitWithBootstrapProviders:      []string{"kubeadm:" + capiRelease19},
-			InitWithControlPlaneProviders:   []string{"kubeadm:" + capiRelease19},
-			MgmtFlavor:                      shared.FlavorDefault,
-			WorkloadFlavor:                  shared.FlavorDefault,
-			InitWithKubernetesVersion:       e2eCtx.E2EConfig.MustGetVariable(shared.KubernetesVersion),
+			E2EConfig:                         e2eCtx.E2EConfig,
+			ClusterctlConfigPath:              e2eCtx.Environment.ClusterctlConfigPath,
+			BootstrapClusterProxy:             e2eCtx.Environment.BootstrapClusterProxy,
+			ArtifactFolder:                    e2eCtx.Settings.ArtifactFolder,
+			SkipCleanup:                       false,
+			InitWithBinary:                    "https://github.com/kubernetes-sigs/cluster-api/releases/download/" + capiRelease19 + "/clusterctl-{OS}-{ARCH}",
+			InitWithProvidersContract:         "v1beta1",
+			InitWithInfrastructureProviders:   []string{"openstack:" + capoRelease011},
+			InitWithCoreProvider:              "cluster-api:" + capiRelease19,
+			InitWithBootstrapProviders:        []string{"kubeadm:" + capiRelease19},
+			InitWithControlPlaneProviders:     []string{"kubeadm:" + capiRelease19},
+			MgmtFlavor:                        shared.FlavorDefault,
+			WorkloadFlavor:                    shared.FlavorDefault,
+			InitWithKubernetesVersion:         e2eCtx.E2EConfig.MustGetVariable(shared.KubernetesVersion),
+			InitWithRuntimeExtensionProviders: []string{"openstack-resource-controller:v1.0.2"},
 		}
 	})
 })
 
-var _ = Describe("When testing clusterctl upgrades (v0.12=>current) [clusterctl-upgrade]", func() {
+var _ = Describe("When testing clusterctl upgrades for CAPO (v0.12=>current) and ORC (v1.0.2=>current)[clusterctl-upgrade]", func() {
 	BeforeEach(func(ctx context.Context) {
 		setDownloadE2EImageEnvVar()
 		// Note: This gives the version without the 'v' prefix, so we need to add it below.
@@ -84,20 +85,21 @@ var _ = Describe("When testing clusterctl upgrades (v0.12=>current) [clusterctl-
 
 	capi_e2e.ClusterctlUpgradeSpec(context.TODO(), func() capi_e2e.ClusterctlUpgradeSpecInput {
 		return capi_e2e.ClusterctlUpgradeSpecInput{
-			E2EConfig:                       e2eCtx.E2EConfig,
-			ClusterctlConfigPath:            e2eCtx.Environment.ClusterctlConfigPath,
-			BootstrapClusterProxy:           e2eCtx.Environment.BootstrapClusterProxy,
-			ArtifactFolder:                  e2eCtx.Settings.ArtifactFolder,
-			SkipCleanup:                     false,
-			InitWithBinary:                  "https://github.com/kubernetes-sigs/cluster-api/releases/download/" + capiRelease19 + "/clusterctl-{OS}-{ARCH}",
-			InitWithProvidersContract:       "v1beta1",
-			InitWithInfrastructureProviders: []string{"openstack:" + capoRelease012},
-			InitWithCoreProvider:            "cluster-api:" + capiRelease19,
-			InitWithBootstrapProviders:      []string{"kubeadm:" + capiRelease19},
-			InitWithControlPlaneProviders:   []string{"kubeadm:" + capiRelease19},
-			MgmtFlavor:                      shared.FlavorDefault,
-			WorkloadFlavor:                  shared.FlavorDefault,
-			InitWithKubernetesVersion:       e2eCtx.E2EConfig.MustGetVariable(shared.KubernetesVersion),
+			E2EConfig:                         e2eCtx.E2EConfig,
+			ClusterctlConfigPath:              e2eCtx.Environment.ClusterctlConfigPath,
+			BootstrapClusterProxy:             e2eCtx.Environment.BootstrapClusterProxy,
+			ArtifactFolder:                    e2eCtx.Settings.ArtifactFolder,
+			SkipCleanup:                       false,
+			InitWithBinary:                    "https://github.com/kubernetes-sigs/cluster-api/releases/download/" + capiRelease19 + "/clusterctl-{OS}-{ARCH}",
+			InitWithProvidersContract:         "v1beta1",
+			InitWithInfrastructureProviders:   []string{"openstack:" + capoRelease012},
+			InitWithCoreProvider:              "cluster-api:" + capiRelease19,
+			InitWithBootstrapProviders:        []string{"kubeadm:" + capiRelease19},
+			InitWithControlPlaneProviders:     []string{"kubeadm:" + capiRelease19},
+			MgmtFlavor:                        shared.FlavorDefault,
+			WorkloadFlavor:                    shared.FlavorDefault,
+			InitWithKubernetesVersion:         e2eCtx.E2EConfig.MustGetVariable(shared.KubernetesVersion),
+			InitWithRuntimeExtensionProviders: []string{"openstack-resource-controller:v1.0.2"},
 		}
 	})
 })
diff --git a/test/infrastructure/openstack-resource-controller/config/upgrade-from/kustomization.yaml b/test/infrastructure/openstack-resource-controller/config/upgrade-from/kustomization.yaml
new file mode 100644
index 00000000..23cecd54
--- /dev/null
+++ b/test/infrastructure/openstack-resource-controller/config/upgrade-from/kustomization.yaml
@@ -0,0 +1,12 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+labels:
+# openstack-resource-controller is not a provider, but by adding this label
+# we can get this installed by Cluster APIs Tiltfile and by the clusterctl machinery we use in E2E tests.
+- pairs:
+    cluster.x-k8s.io/provider: "runtime-extension-openstack-resource-controller"
+
+resources:
+# latest stable release of major version v1.0
+- https://github.com/k-orc/openstack-resource-controller/releases/download/v1.0.2/install.yaml