Add minor update target-stage gate annotation#1913
Add minor update target-stage gate annotation#1913ciecierski wants to merge 1 commit intoopenstack-k8s-operators:mainfrom
Conversation
Introduce the core.openstack.org/minor-update-target-stage annotation on OpenStackVersion. When set, the minor update controller completes all stages up to and including the named stage, marks the next stage as blocked (FalseCondition/RequestedReason), and pauses reconciliation. Removing the annotation or advancing it to a later stage resumes the update. Includes stage-name constants, the gated-message format string, controller logic for all seven stages, functional tests for block/resume/ advance scenarios, and updated operator documentation. AI-assisted: Cursor (Claude Sonnet 4.6 by Anthropic)
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: ciecierski The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
OpenStackControlPlane CRD Size Report
Threshold reference
|
|
@ciecierski: The following tests failed, say
Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
| OpenStackVersionMinorUpdateAvailableMessage = "update available" | ||
|
|
||
| // OpenStackVersionMinorUpdateReadyGatedMessage - format string; arg is the target stage name | ||
| OpenStackVersionMinorUpdateReadyGatedMessage = "Minor update progression stopped after stage: %s . Set annotation to next stage after %s to resume OpenStack update" |
There was a problem hiding this comment.
| OpenStackVersionMinorUpdateReadyGatedMessage = "Minor update progression stopped after stage: %s . Set annotation to next stage after %s to resume OpenStack update" | |
| OpenStackVersionMinorUpdateReadyGatedMessage = "Minor update progression stopped after stage: %s . Set annotation to any stage after %s to resume OpenStack update" |
There was a problem hiding this comment.
It doesn't have to be the next stage only, right? Can be any of the stages that follow?
| cond := osversion.Status.Conditions.Get(corev1.OpenStackVersionMinorUpdateOVNDataplane) | ||
| g.Expect(cond).ShouldNot(BeNil()) | ||
| g.Expect(cond.Status).Should(Equal(k8s_corev1.ConditionFalse)) | ||
| g.Expect(cond.Reason).Should(Equal(condition.RequestedReason)) |
There was a problem hiding this comment.
| g.Expect(cond.Reason).Should(Equal(condition.RequestedReason)) | |
| g.Expect(cond.Reason).Should(Equal(condition.Reason(condition.RequestedReason))) |
| cond := osversion.Status.Conditions.Get(corev1.OpenStackVersionMinorUpdateRabbitMQ) | ||
| g.Expect(cond).ShouldNot(BeNil()) | ||
| g.Expect(cond.Status).Should(Equal(k8s_corev1.ConditionFalse)) | ||
| g.Expect(cond.Reason).Should(Equal(condition.RequestedReason)) |
There was a problem hiding this comment.
| g.Expect(cond.Reason).Should(Equal(condition.RequestedReason)) | |
| g.Expect(cond.Reason).Should(Equal(condition.Reason(condition.RequestedReason))) |
stuggi
left a comment
There was a problem hiding this comment.
I think we might want to add webhook validation for the annotation values, like validating the annotation value in the ValidateUpdate webhook on OpenStackVersion . If someone sets target-stage=tyop, the webhook rejects the update immediately with a clear error, rather than silently ignoring it and not would run a full update.
The OpenStackVersion already has a webhook. Adding a check like:
if stage, ok := r.Annotations[MinorUpdateTargetStageAnnotation]; ok {
validStages := map[string]bool{...}
if !validStages[stage] {
return Forbidden("invalid target stage")
}
}
| OpenStackVersionMinorUpdateAvailableMessage = "update available" | ||
|
|
||
| // OpenStackVersionMinorUpdateReadyGatedMessage - format string; arg is the target stage name | ||
| OpenStackVersionMinorUpdateReadyGatedMessage = "Minor update progression stopped after stage: %s . Set annotation to next stage after %s to resume OpenStack update" |
There was a problem hiding this comment.
you could also remove the annotation entirely, so I think the message should be something like
Update paused after stage: %s. To resume, advance the annotation to the next stage or remove it to run to completion.
There was a problem hiding this comment.
what we also could do is to name the next possible stages, like if one did set it to rabbitmq, it would show
Update paused after stage: rabbitmq. To resume, set annotation to one of: mariadb, memcached, keystone, controlplane — or remove the annotation to run to completion.
| // stages will be blocked until the annotation is removed or updated to a later stage. | ||
| // Valid values: "ovn-controlplane", "ovn-dataplane", "rabbitmq", "mariadb", "memcached", | ||
| // "keystone", "controlplane". Remove the annotation to let the update proceed to completion. | ||
| MinorUpdateTargetStageAnnotation string = "core.openstack.org/minor-update-target-stage" |
There was a problem hiding this comment.
wondering if we could shorten it to core.openstack.org/update-target-stage
Introduce the core.openstack.org/minor-update-target-stage annotation on OpenStackVersion. When set, the minor update controller completes all stages up to and including the named stage, marks the next stage as blocked (FalseCondition/RequestedReason), and pauses reconciliation. Removing the annotation or advancing it to a later stage resumes the update. Includes stage-name constants, the gated-message format string, controller logic for all seven stages, functional tests for block/resume/ advance scenarios, and updated operator documentation.
AI-assisted: Cursor (Claude Sonnet 4.6 by Anthropic)