From 42d9b28d3e560d5f2a45b5477178fcf28c6c552d Mon Sep 17 00:00:00 2001 From: Martin Schuppert Date: Tue, 24 Feb 2026 12:09:26 +0100 Subject: [PATCH 1/2] Fix OpenStackVersion minor update workflow hanging on OVN dataplane check During a minor update, the OpenStackVersion controller was getting stuck with incorrect condition states even after deployments completed: - MinorUpdateOVNDataplane: "in progress" (stuck) - MinorUpdateControlplane: "not started" (never executed) Root Cause: The DataplaneNodesetsOVNControllerImagesMatch function checked nodeset.IsReady(), which failed when subsequent deployments (e.g., edpm-update) started running. This caused the function to return false even though the OVN update deployment (edpm-ovn-update) had already completed successfully. The nodeset's overall Ready status was False because edpm-update was running, blocking the minor update workflow from progressing to the next steps (RabbitMQ, MariaDB, controlplane services, etc.). Solution: Remove the nodeset.IsReady() check from DataplaneNodesetsOVNControllerImagesMatch. The nodeset's Status.ContainerImages["OvnControllerImage"] is only updated when a deployment completes successfully (openstackdataplanenodeset_controller.go:598-600). Therefore, if the OVN image matches the target version, the OVN update deployment has already completed, regardless of the nodeset's overall Ready status. Why we can't check deployment-specific conditions: The nodeset stores deployment conditions in Status.DeploymentStatuses map, keyed by deployment name (e.g., "edpm-ovn-update"). However, deployment names are dynamic and not known at this point in the code, making it impossible to check specific deployment conditions directly. Note: The final DataplaneNodesetsDeployed check still uses nodeset.IsReady() because it validates the completion of the entire minor update workflow, where we do want to ensure the nodeset is fully ready. Jira: OSPRH-25860 Co-Authored-By: Claude Sonnet 4.5 Signed-off-by: Martin Schuppert --- internal/openstack/dataplane.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/internal/openstack/dataplane.go b/internal/openstack/dataplane.go index 5366c3e87..c4a456e78 100644 --- a/internal/openstack/dataplane.go +++ b/internal/openstack/dataplane.go @@ -45,9 +45,11 @@ func DataplaneNodesetsOVNControllerImagesMatch(version *corev1beta1.OpenStackVer // the current nodeset spec), we only check nodesets if they have any nodes // and have deployed OVN if len(nodeset.Spec.Nodes) > 0 && nodeset.Status.ContainerImages["OvnControllerImage"] != "" { - if !nodeset.IsReady() { - return false - } + // Check if OVN controller image matches the target version. + // Note: We don't check nodeset.IsReady() here because this is an intermediate + // step in the minor update workflow. The nodeset might be not-Ready due to + // subsequent deployments running (e.g. edpm-update), but if the OVN image matches, + // it means the OVN update deployment already completed. if nodeset.Status.ContainerImages["OvnControllerImage"] != *version.Status.ContainerImages.OvnControllerImage { return false } From 2fbd40e1d25bb306fded3ca8c157bc4ee5ecd9fe Mon Sep 17 00:00:00 2001 From: Martin Schuppert Date: Tue, 24 Feb 2026 15:01:33 +0100 Subject: [PATCH 2/2] Add zuul minor update job Signed-off-by: Martin Schuppert --- zuul.d/jobs.yaml | 19 ++++++++----------- zuul.d/projects.yaml | 3 +++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml index 06a8a7403..f6af023ff 100644 --- a/zuul.d/jobs.yaml +++ b/zuul.d/jobs.yaml @@ -14,7 +14,7 @@ attempts: 1 required-projects: - github.com/openstack-k8s-operators/openstack-operator - irrelevant-files: + irrelevant-files: &irrelevant-files - .*/*.md - ^\..*$ - ^docs/.*$ @@ -32,16 +32,7 @@ name: openstack-operator-tempest-multinode parent: podified-multinode-edpm-deployment-crc-3comp dependencies: ["openstack-k8s-operators-content-provider"] - irrelevant-files: - - .*/*.md - - ^\..*$ - - ^docs/.*$ - - ^LICENSE$ - - ^OWNERS$ - - ^OWNERS_ALIASES$ - - ^PROJECT$ - - ^README.md$ - - tests?\/functional + irrelevant-files: *irrelevant-files vars: cifmw_operator_build_golang_ct: "docker.io/library/golang:1.24" cifmw_operator_build_golang_alt_ct: "quay.rdoproject.org/openstack-k8s-operators/golang:1.24" @@ -87,3 +78,9 @@ [libvirt] cpu_mode = custom cpu_models = Nehalem + +- job: + name: openstack-operator-edpm-baremetal-minor-update + parent: cifmw-crc-podified-edpm-baremetal-minor-update + dependencies: ["openstack-k8s-operators-content-provider"] + irrelevant-files: *irrelevant-files diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml index 6f9338d95..dfd7d8b9d 100644 --- a/zuul.d/projects.yaml +++ b/zuul.d/projects.yaml @@ -26,3 +26,6 @@ - openstack-operator-docs-preview - openstack-operator-kuttl: voting: false + - openstack-operator-edpm-baremetal-minor-update: + dependencies: ["openstack-k8s-operators-content-provider"] + irrelevant-files: *irrelevant-files