From 7c86ffd61a8132d36f6cabc2637395da17268678 Mon Sep 17 00:00:00 2001 From: Neil Girard Date: Wed, 21 Oct 2026 10:41:58 -0400 Subject: [PATCH] Promote FeatureGateVSphereMultiVCenterDay2 to GA --- ...erator_01_infrastructures-Default.crd.yaml | 17 +++++++++++++--- features.md | 2 +- features/features.go | 2 +- ...nfig_01_controllerconfigs-Default.crd.yaml | 20 +++++++++++++++---- ...erator_01_infrastructures-Default.crd.yaml | 17 +++++++++++++--- ...nfig_01_controllerconfigs-Default.crd.yaml | 20 +++++++++++++++---- .../featureGate-Hypershift-Default.yaml | 6 +++--- .../featureGate-SelfManagedHA-Default.yaml | 6 +++--- 8 files changed, 68 insertions(+), 22 deletions(-) diff --git a/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_infrastructures-Default.crd.yaml b/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_infrastructures-Default.crd.yaml index 948b87fdad3..bf848524b26 100644 --- a/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_infrastructures-Default.crd.yaml +++ b/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_infrastructures-Default.crd.yaml @@ -1010,19 +1010,30 @@ spec: type: array x-kubernetes-list-type: atomic x-kubernetes-validations: + - message: Cannot add and remove vCenters at the same time + rule: 'size(self) >= size(oldSelf) ? oldSelf.all(x, self.exists(y, + y.server == x.server)) : true' + - message: Cannot add and remove vCenters at the same time + rule: 'size(self) < size(oldSelf) ? self.all(x, oldSelf.exists(y, + y.server == x.server)) : true' - message: vcenters must have unique server values rule: self.all(x, self.exists_one(y, y.server == x.server)) type: object x-kubernetes-validations: + - message: all failure domains must have a corresponding vCenter + entry + rule: '!has(self.failureDomains) || size(self.failureDomains) + == 0 || (has(self.vcenters) && self.failureDomains.all(fd, + self.vcenters.exists(vc, vc.server == fd.server)))' - message: apiServerInternalIPs list is required once set rule: '!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)' - message: ingressIPs list is required once set rule: '!has(oldSelf.ingressIPs) || has(self.ingressIPs)' type: object x-kubernetes-validations: - - message: vcenters can have at most 1 item when configured post-install - rule: '!has(oldSelf.vsphere) && has(self.vsphere) ? (has(self.vsphere.vcenters) - && size(self.vsphere.vcenters) < 2) : true' + - message: vcenters is required once set and cannot be removed + rule: 'oldSelf.?vsphere.vcenters.hasValue() ? self.?vsphere.vcenters.hasValue() + : true' type: object status: description: status holds observed values from the cluster. They may not diff --git a/features.md b/features.md index 9d1d91adf62..01a452ae260 100644 --- a/features.md +++ b/features.md @@ -63,7 +63,6 @@ | TranslateStreamCloseWebsocketRequests| | | Enabled | Enabled | Enabled | Enabled | | VSphereConfigurableMaxAllowedBlockVolumesPerNode| | | Enabled | Enabled | Enabled | Enabled | | VSphereHostVMGroupZonal| | | Enabled | Enabled | Enabled | Enabled | -| VSphereMultiVCenterDay2| | | Enabled | Enabled | Enabled | Enabled | | VolumeAttributesClass| | | Enabled | Enabled | Enabled | Enabled | | VolumeGroupSnapshot| | | Enabled | Enabled | Enabled | Enabled | | AdditionalRoutingCapabilities| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled | @@ -103,3 +102,4 @@ | UserNamespacesSupport| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled | | VSphereMultiDisk| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled | | VSphereMultiNetworks| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled | +| VSphereMultiVCenterDay2| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled | diff --git a/features/features.go b/features/features.go index 6bf09817957..bd705e08638 100644 --- a/features/features.go +++ b/features/features.go @@ -788,7 +788,7 @@ var ( contactPerson("vr4manta"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1961"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enableIn(configv1.Default, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). mustRegister() FeatureGatePreconfiguredUDNAddresses = newFeatureGate("PreconfiguredUDNAddresses"). diff --git a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_controllerconfigs-Default.crd.yaml b/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_controllerconfigs-Default.crd.yaml index 18143df940a..022d57433e7 100644 --- a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_controllerconfigs-Default.crd.yaml +++ b/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_controllerconfigs-Default.crd.yaml @@ -1287,11 +1287,24 @@ spec: type: array x-kubernetes-list-type: atomic x-kubernetes-validations: + - message: Cannot add and remove vCenters at the same + time + rule: 'size(self) >= size(oldSelf) ? oldSelf.all(x, + self.exists(y, y.server == x.server)) : true' + - message: Cannot add and remove vCenters at the same + time + rule: 'size(self) < size(oldSelf) ? self.all(x, + oldSelf.exists(y, y.server == x.server)) : true' - message: vcenters must have unique server values rule: self.all(x, self.exists_one(y, y.server == x.server)) type: object x-kubernetes-validations: + - message: all failure domains must have a corresponding + vCenter entry + rule: '!has(self.failureDomains) || size(self.failureDomains) + == 0 || (has(self.vcenters) && self.failureDomains.all(fd, + self.vcenters.exists(vc, vc.server == fd.server)))' - message: apiServerInternalIPs list is required once set rule: '!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)' @@ -1299,10 +1312,9 @@ spec: rule: '!has(oldSelf.ingressIPs) || has(self.ingressIPs)' type: object x-kubernetes-validations: - - message: vcenters can have at most 1 item when configured - post-install - rule: '!has(oldSelf.vsphere) && has(self.vsphere) ? (has(self.vsphere.vcenters) - && size(self.vsphere.vcenters) < 2) : true' + - message: vcenters is required once set and cannot be removed + rule: 'oldSelf.?vsphere.vcenters.hasValue() ? self.?vsphere.vcenters.hasValue() + : true' type: object status: description: status holds observed values from the cluster. They diff --git a/payload-manifests/crds/0000_10_config-operator_01_infrastructures-Default.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_infrastructures-Default.crd.yaml index 948b87fdad3..bf848524b26 100644 --- a/payload-manifests/crds/0000_10_config-operator_01_infrastructures-Default.crd.yaml +++ b/payload-manifests/crds/0000_10_config-operator_01_infrastructures-Default.crd.yaml @@ -1010,19 +1010,30 @@ spec: type: array x-kubernetes-list-type: atomic x-kubernetes-validations: + - message: Cannot add and remove vCenters at the same time + rule: 'size(self) >= size(oldSelf) ? oldSelf.all(x, self.exists(y, + y.server == x.server)) : true' + - message: Cannot add and remove vCenters at the same time + rule: 'size(self) < size(oldSelf) ? self.all(x, oldSelf.exists(y, + y.server == x.server)) : true' - message: vcenters must have unique server values rule: self.all(x, self.exists_one(y, y.server == x.server)) type: object x-kubernetes-validations: + - message: all failure domains must have a corresponding vCenter + entry + rule: '!has(self.failureDomains) || size(self.failureDomains) + == 0 || (has(self.vcenters) && self.failureDomains.all(fd, + self.vcenters.exists(vc, vc.server == fd.server)))' - message: apiServerInternalIPs list is required once set rule: '!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)' - message: ingressIPs list is required once set rule: '!has(oldSelf.ingressIPs) || has(self.ingressIPs)' type: object x-kubernetes-validations: - - message: vcenters can have at most 1 item when configured post-install - rule: '!has(oldSelf.vsphere) && has(self.vsphere) ? (has(self.vsphere.vcenters) - && size(self.vsphere.vcenters) < 2) : true' + - message: vcenters is required once set and cannot be removed + rule: 'oldSelf.?vsphere.vcenters.hasValue() ? self.?vsphere.vcenters.hasValue() + : true' type: object status: description: status holds observed values from the cluster. They may not diff --git a/payload-manifests/crds/0000_80_machine-config_01_controllerconfigs-Default.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_controllerconfigs-Default.crd.yaml index 18143df940a..022d57433e7 100644 --- a/payload-manifests/crds/0000_80_machine-config_01_controllerconfigs-Default.crd.yaml +++ b/payload-manifests/crds/0000_80_machine-config_01_controllerconfigs-Default.crd.yaml @@ -1287,11 +1287,24 @@ spec: type: array x-kubernetes-list-type: atomic x-kubernetes-validations: + - message: Cannot add and remove vCenters at the same + time + rule: 'size(self) >= size(oldSelf) ? oldSelf.all(x, + self.exists(y, y.server == x.server)) : true' + - message: Cannot add and remove vCenters at the same + time + rule: 'size(self) < size(oldSelf) ? self.all(x, + oldSelf.exists(y, y.server == x.server)) : true' - message: vcenters must have unique server values rule: self.all(x, self.exists_one(y, y.server == x.server)) type: object x-kubernetes-validations: + - message: all failure domains must have a corresponding + vCenter entry + rule: '!has(self.failureDomains) || size(self.failureDomains) + == 0 || (has(self.vcenters) && self.failureDomains.all(fd, + self.vcenters.exists(vc, vc.server == fd.server)))' - message: apiServerInternalIPs list is required once set rule: '!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)' @@ -1299,10 +1312,9 @@ spec: rule: '!has(oldSelf.ingressIPs) || has(self.ingressIPs)' type: object x-kubernetes-validations: - - message: vcenters can have at most 1 item when configured - post-install - rule: '!has(oldSelf.vsphere) && has(self.vsphere) ? (has(self.vsphere.vcenters) - && size(self.vsphere.vcenters) < 2) : true' + - message: vcenters is required once set and cannot be removed + rule: 'oldSelf.?vsphere.vcenters.hasValue() ? self.?vsphere.vcenters.hasValue() + : true' type: object status: description: status holds observed values from the cluster. They diff --git a/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml b/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml index c760216ef27..056e4ab78ba 100644 --- a/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml +++ b/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml @@ -202,9 +202,6 @@ { "name": "VSphereMixedNodeEnv" }, - { - "name": "VSphereMultiVCenterDay2" - }, { "name": "VolumeAttributesClass" }, @@ -323,6 +320,9 @@ }, { "name": "VSphereMultiNetworks" + }, + { + "name": "VSphereMultiVCenterDay2" } ], "version": "" diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml b/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml index 0f55cb9dff6..b7d9596f777 100644 --- a/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml +++ b/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml @@ -199,9 +199,6 @@ { "name": "VSphereMixedNodeEnv" }, - { - "name": "VSphereMultiVCenterDay2" - }, { "name": "VolumeAttributesClass" }, @@ -323,6 +320,9 @@ }, { "name": "VSphereMultiNetworks" + }, + { + "name": "VSphereMultiVCenterDay2" } ], "version": ""