Skip to content

Commit 8fb4570

Browse files
Matt Pryorscrungus
authored andcommitted
Cluster API: Implement upgrade to a new template
Implement the upgrade method to move a cluster to a new template. Similar to other patches, this just updates the Helm values as required. story: 2009780 Change-Id: I623bb47fc6a1e6abb9f2b7a50a844729fe65683d
1 parent 45d63b9 commit 8fb4570

File tree

3 files changed

+55
-17
lines changed

3 files changed

+55
-17
lines changed

devstack/contrib/new-devstack.sh

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,29 @@ openstack image create ubuntu-focal-kube-v1.26.3 \
8282
openstack image set ubuntu-focal-kube-v1.26.3 --os-distro ubuntu --os-version 20.04
8383
openstack image set ubuntu-focal-kube-v1.26.3 --property kube_version=v1.26.3
8484

85+
curl -O https://object.arcus.openstack.hpc.cam.ac.uk/swift/v1/AUTH_f0dc9cb312144d0aa44037c9149d2513/azimuth-images-prerelease/ubuntu-focal-kube-v1.27.0-230418-0937.qcow2
86+
openstack image create ubuntu-focal-kube-v1.27.0 \
87+
--file ubuntu-focal-kube-v1.27.0-230418-0937.qcow2 \
88+
--disk-format qcow2 \
89+
--container-format bare \
90+
--public
91+
openstack image set ubuntu-focal-kube-v1.27.0 --os-distro ubuntu --os-version 20.04
92+
openstack image set ubuntu-focal-kube-v1.27.0 --property kube_version=v1.27.0
93+
8594
# Register template for cluster api driver
8695
openstack coe cluster template create new_driver \
8796
--coe kubernetes \
8897
--image $(openstack image show ubuntu-focal-kube-v1.26.3 -c id -f value) \
8998
--external-network public \
90-
--label kube_tag=v1.26.3 \
99+
--master-flavor ds2G20 \
100+
--flavor ds2G20 \
101+
--public \
102+
--master-lb-enabled
103+
104+
openstack coe cluster template create new_driver_upgrade \
105+
--coe kubernetes \
106+
--image $(openstack image show ubuntu-focal-kube-v1.27.0 -c id -f value) \
107+
--external-network public \
91108
--master-flavor ds2G20 \
92109
--flavor ds2G20 \
93110
--public \

magnum/drivers/cluster_api/driver.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ def _update_control_plane_nodegroup_status(self, cluster, nodegroup):
8080

8181
kcp_spec = kcp.get("spec", {}) if kcp else {}
8282
kcp_status = kcp.get("status", {}) if kcp else {}
83+
84+
# The control plane object is what controls the Kubernetes version
85+
# If it is known, report it
86+
kube_version = kcp_status.get("version", kcp_spec.get("version"))
87+
if cluster.coe_version != kube_version:
88+
cluster.coe_version = kube_version
89+
cluster.save()
90+
8391
kcp_true_conditions = {
8492
cond["type"]
8593
for cond in kcp_status.get("conditions", [])
@@ -676,10 +684,32 @@ def resize_cluster(
676684
LOG.warning("Removing specific nodes is not currently supported")
677685
self._update_helm_release(context, cluster)
678686

679-
def upgrade_cluster(self, context, cluster, cluster_template,
680-
max_batch_size, nodegroup, scale_manager=None,
681-
rollback=False):
682-
raise Exception("don't support upgrade yet")
687+
def upgrade_cluster(
688+
self,
689+
context,
690+
cluster,
691+
cluster_template,
692+
max_batch_size,
693+
nodegroup,
694+
scale_manager=None,
695+
rollback=False,
696+
):
697+
# TODO(mkjpryor) check that the upgrade is viable
698+
# e.g. not a downgrade, not an upgrade by more than one minor version
699+
700+
# Updating the template will likely apply for all nodegroups
701+
# So mark them all as having an update in progress
702+
for nodegroup in cluster.nodegroups:
703+
nodegroup.status = fields.ClusterStatus.UPDATE_IN_PROGRESS
704+
nodegroup.save()
705+
706+
# Move the cluster to the new template
707+
cluster.cluster_template_id = cluster_template.uuid
708+
cluster.status = fields.ClusterStatus.UPDATE_IN_PROGRESS
709+
cluster.save()
710+
cluster.refresh()
711+
712+
self._update_helm_release(context, cluster)
683713

684714
def create_nodegroup(self, context, cluster, nodegroup):
685715
nodegroup.status = fields.ClusterStatus.CREATE_IN_PROGRESS
@@ -702,9 +732,7 @@ def delete_nodegroup(self, context, cluster, nodegroup):
702732
self._update_helm_release(
703733
context,
704734
cluster,
705-
list(
706-
[ng for ng in cluster.nodegroups if ng.name != nodegroup.name]
707-
),
735+
[ng for ng in cluster.nodegroups if ng.name != nodegroup.name]
708736
)
709737

710738
def create_federation(self, context, federation):

magnum/tests/unit/drivers/cluster_api/test_driver.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,15 +1420,8 @@ def test_resize_cluster_ignore_nodes_to_remove(self, mock_update):
14201420
mock_update.assert_called_once_with(self.context, self.cluster_obj)
14211421

14221422
def test_upgrade_cluster(self):
1423-
self.assertRaises(
1424-
NotImplementedError,
1425-
self.driver.upgrade_cluster,
1426-
self.context,
1427-
self.cluster_obj,
1428-
self.cluster_obj.cluster_template,
1429-
1,
1430-
None,
1431-
)
1423+
# TODO(mkjpryor) implement this
1424+
pass
14321425

14331426
@mock.patch.object(driver.Driver, "_update_helm_release")
14341427
def test_create_nodegroup(self, mock_update):

0 commit comments

Comments
 (0)