-
Notifications
You must be signed in to change notification settings - Fork 591
OTA-253: Add cluster update preflight mode API #2684
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,197 @@ | ||
| apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this | ||
| name: "ClusterVersion" | ||
| crdName: clusterversions.config.openshift.io | ||
| featureGates: | ||
| - ClusterUpdatePreflight | ||
| tests: | ||
| onCreate: | ||
| - name: Should be able to create with mode Preflight | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: Preflight | ||
| expected: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: Preflight | ||
| - name: Should be able to omit mode field (default behavior) | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| expected: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| - name: Should be able to use Preflight mode with acceptRisks | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: Preflight | ||
| acceptRisks: | ||
| - name: RiskA | ||
| - name: RiskB | ||
| expected: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: Preflight | ||
| acceptRisks: | ||
| - name: RiskA | ||
| - name: RiskB | ||
| - name: Should be able to use Preflight mode with image | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| image: quay.io/openshift-release-dev/ocp-release@sha256:example | ||
| mode: Preflight | ||
| expected: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| image: quay.io/openshift-release-dev/ocp-release@sha256:example | ||
| mode: Preflight | ||
| - name: Invalid mode value should be rejected | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: InvalidMode | ||
| expectedError: "Unsupported value: \"InvalidMode\"" | ||
| - name: Empty mode value should be rejected | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: "" | ||
| expectedError: "Unsupported value: \"\"" | ||
| onUpdate: | ||
| - name: Should be able to transition from normal to Preflight mode | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| updated: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: Preflight | ||
| expected: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: Preflight | ||
| - name: Should allow clearing Preflight mode back to normal | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: Preflight | ||
| updated: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| expected: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| - name: Should allow changing target version while in Preflight mode | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.22.0 | ||
| mode: Preflight | ||
| updated: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.23.0 | ||
| mode: Preflight | ||
| expected: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.23.0 | ||
| mode: Preflight | ||
| - name: Should allow changing from image to version in Preflight mode | ||
| initial: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| image: quay.io/openshift-release-dev/ocp-release@sha256:example | ||
| mode: Preflight | ||
| updated: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.23.0 | ||
| mode: Preflight | ||
| expected: | | ||
| apiVersion: config.openshift.io/v1 | ||
| kind: ClusterVersion | ||
| spec: | ||
| clusterID: foo | ||
| desiredUpdate: | ||
| version: 4.23.0 | ||
| mode: Preflight |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -283,6 +283,17 @@ type UpdateHistory struct { | |
| // ClusterID is string RFC4122 uuid. | ||
| type ClusterID string | ||
|
|
||
| // UpdateModePolicy defines how an update should be processed. | ||
| // Valid values are defined as constants below. | ||
| // +enum | ||
| // +kubebuilder:validation:Enum=Preflight | ||
| type UpdateModePolicy string | ||
|
|
||
| const ( | ||
| // UpdateModePolicyPreflight allows an update to be checked for compatibility without committing to updating the cluster. | ||
| UpdateModePolicyPreflight UpdateModePolicy = "Preflight" | ||
| ) | ||
|
|
||
| // ClusterVersionArchitecture enumerates valid cluster architectures. | ||
| // +kubebuilder:validation:Enum="Multi";"" | ||
| type ClusterVersionArchitecture string | ||
|
|
@@ -760,6 +771,22 @@ type Update struct { | |
| // +listMapKey=name | ||
| // +optional | ||
| AcceptRisks []AcceptRisk `json:"acceptRisks,omitempty"` | ||
|
|
||
| // mode determines how an update should be processed. | ||
| // The only valid value is "Preflight". | ||
| // When omitted, the cluster performs a normal update by applying the specified version or image to the cluster. | ||
| // This is the standard update behavior. | ||
| // When set to "Preflight", the cluster runs compatibility checks against the target release without | ||
| // performing an actual update. The target release's CVO will execute prechecks and report any detected | ||
| // risks in status.conditionalUpdateRisks, alongside risks from the update recommendation service. | ||
| // status.conditionalUpdates contains references/entries that point to the detailed risk objects | ||
| // stored in status.conditionalUpdateRisks from both the update graph and preflight checks executed by the target release's CVO. | ||
| // This allows administrators to assess update readiness and address issues before committing to the update. | ||
| // Preflight mode is particularly useful for skip-level updates where upgrade compatibility needs to be | ||
| // verified across multiple minor versions. | ||
| // +openshift:enable:FeatureGate=ClusterUpdatePreflight | ||
| // +optional | ||
| Mode UpdateModePolicy `json:"mode,omitempty"` | ||
|
Comment on lines
775
to
789
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Clarify which status field carries preflight risks. The doc says risks appear in ✏️ Suggested doc tweak- // risks in status.conditionalUpdates, alongside risks from the update recommendation service.
- // Results appear in status.conditionalUpdates as a union of risks from both the update graph and
- // preflight checks executed by the target release's CVO.
+ // risks in status.conditionalUpdateRisks, alongside risks from the update recommendation service,
+ // and are referenced by status.conditionalUpdates.
+ // Results appear in status.conditionalUpdateRisks as a union of risks from both the update graph and
+ // preflight checks executed by the target release's CVO.🤖 Prompt for AI Agents |
||
| } | ||
|
|
||
| // AcceptRisk represents a risk that is considered acceptable. | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+enum adds an Enum constraint to the OpenAPI schema and appends auto-generated enum documentation to the description.