diff --git a/config/v1/tests/infrastructures.config.openshift.io/AdaptableTopology.yaml b/config/v1/tests/infrastructures.config.openshift.io/AdaptableTopology.yaml
new file mode 100644
index 00000000000..c55a8289df1
--- /dev/null
+++ b/config/v1/tests/infrastructures.config.openshift.io/AdaptableTopology.yaml
@@ -0,0 +1,81 @@
+apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this
+name: "Infrastructure"
+crdName: infrastructures.config.openshift.io
+featureGates:
+- AdaptableTopology
+tests:
+ onCreate:
+ - name: Should be able to create a minimal Infrastructure
+ initial: |
+ apiVersion: config.openshift.io/v1
+ kind: Infrastructure
+ spec: {} # No spec is required for a Infrastructure
+ expected: |
+ apiVersion: config.openshift.io/v1
+ kind: Infrastructure
+ spec: {}
+ onUpdate:
+ - name: status should allow controlPlaneTopology value for `Adaptable` on platform None
+ initial: |
+ apiVersion: config.openshift.io/v1
+ kind: Infrastructure
+ spec:
+ platformSpec:
+ type: None
+ updated: |
+ apiVersion: config.openshift.io/v1
+ kind: Infrastructure
+ spec:
+ platformSpec:
+ type: None
+ status:
+ controlPlaneTopology: Adaptable
+ infrastructureTopology: HighlyAvailable
+ platform: None
+ platformStatus:
+ type: None
+ expected: |
+ apiVersion: config.openshift.io/v1
+ kind: Infrastructure
+ spec:
+ platformSpec:
+ type: None
+ status:
+ controlPlaneTopology: Adaptable
+ cpuPartitioning: None
+ infrastructureTopology: HighlyAvailable
+ platform: None
+ platformStatus:
+ type: None
+ - name: status should allow infrastructureTopology value for `Adaptable` on platform None
+ initial: |
+ apiVersion: config.openshift.io/v1
+ kind: Infrastructure
+ spec:
+ platformSpec:
+ type: None
+ updated: |
+ apiVersion: config.openshift.io/v1
+ kind: Infrastructure
+ spec:
+ platformSpec:
+ type: None
+ status:
+ controlPlaneTopology: HighlyAvailable
+ infrastructureTopology: Adaptable
+ platform: None
+ platformStatus:
+ type: None
+ expected: |
+ apiVersion: config.openshift.io/v1
+ kind: Infrastructure
+ spec:
+ platformSpec:
+ type: None
+ status:
+ controlPlaneTopology: HighlyAvailable
+ cpuPartitioning: None
+ infrastructureTopology: Adaptable
+ platform: None
+ platformStatus:
+ type: None
diff --git a/config/v1/types_infrastructure.go b/config/v1/types_infrastructure.go
index c579be3a110..68ffb18dee8 100644
--- a/config/v1/types_infrastructure.go
+++ b/config/v1/types_infrastructure.go
@@ -107,6 +107,7 @@ type InfrastructureStatus struct {
// +kubebuilder:default=HighlyAvailable
// +openshift:validation:FeatureGateAwareEnum:featureGate="",enum=HighlyAvailable;HighlyAvailableArbiter;SingleReplica;External
// +openshift:validation:FeatureGateAwareEnum:featureGate=DualReplica,enum=HighlyAvailable;HighlyAvailableArbiter;SingleReplica;DualReplica;External
+ // +openshift:validation:FeatureGateAwareEnum:featureGate=AdaptableTopology,enum=HighlyAvailable;HighlyAvailableArbiter;SingleReplica;DualReplica;Adaptable;External
// +optional
ControlPlaneTopology TopologyMode `json:"controlPlaneTopology"`
@@ -119,6 +120,7 @@ type InfrastructureStatus struct {
// NOTE: External topology mode is not applicable for this field.
// +kubebuilder:default=HighlyAvailable
// +kubebuilder:validation:Enum=HighlyAvailable;SingleReplica
+ // +openshift:validation:FeatureGateAwareEnum:featureGate=AdaptableTopology,enum=HighlyAvailable;SingleReplica;Adaptable
// +optional
InfrastructureTopology TopologyMode `json:"infrastructureTopology,omitempty"`
@@ -159,6 +161,10 @@ const (
// that any of the control plane components such as kubernetes API server or etcd are visible within
// the cluster.
ExternalTopologyMode TopologyMode = "External"
+
+ // "Adaptable" is for clusters that dynamically adjust control-plane and
+ // infrastructure behavior based on current node count.
+ AdaptableTopologyMode TopologyMode = "Adaptable"
)
// CPUPartitioningMode defines the mode for CPU partitioning
diff --git a/config/v1/zz_generated.featuregated-crd-manifests.yaml b/config/v1/zz_generated.featuregated-crd-manifests.yaml
index 84c1443d448..9af29fc4c83 100644
--- a/config/v1/zz_generated.featuregated-crd-manifests.yaml
+++ b/config/v1/zz_generated.featuregated-crd-manifests.yaml
@@ -369,6 +369,7 @@ infrastructures.config.openshift.io:
FeatureGates:
- AWSClusterHostedDNSInstall
- AWSDualStackInstall
+ - AdaptableTopology
- AzureClusterHostedDNSInstall
- AzureDualStackInstall
- DualReplica
diff --git a/features.md b/features.md
index 8112c57f728..1638ef1eb8c 100644
--- a/features.md
+++ b/features.md
@@ -6,6 +6,7 @@
| MachineAPIOperatorDisableMachineHealthCheckController| | | | | | | | |
| MultiArchInstallAzure| | | | | | | | |
| ShortCertRotation| | | | | | | | |
+| AdaptableTopology| | | | Enabled | | | | |
| ClusterAPIComputeInstall| | | Enabled | Enabled | | | | |
| ClusterAPIControlPlaneInstall| | | Enabled | Enabled | | | | |
| ClusterUpdatePreflight| | | Enabled | Enabled | | | | |
diff --git a/features/features.go b/features/features.go
index 5d148165cc5..440616df394 100644
--- a/features/features.go
+++ b/features/features.go
@@ -115,6 +115,14 @@ var (
enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()).
mustRegister()
+ FeatureGateAdaptableTopology = newFeatureGate("AdaptableTopology").
+ reportProblemsToJiraComponent("Adaptable Topology").
+ contactPerson("jaypoulz").
+ productScope(ocpSpecific).
+ enhancementPR("https://github.com/openshift/enhancements/pull/1905").
+ enable(inClusterProfile(SelfManaged), inDevPreviewNoUpgrade()).
+ mustRegister()
+
FeatureGateAzureWorkloadIdentity = newFeatureGate("AzureWorkloadIdentity").
reportProblemsToJiraComponent("cloud-credential-operator").
contactPerson("abutcher").
diff --git a/machineconfiguration/v1/zz_generated.featuregated-crd-manifests.yaml b/machineconfiguration/v1/zz_generated.featuregated-crd-manifests.yaml
index 4e3d9558567..937f19ed430 100644
--- a/machineconfiguration/v1/zz_generated.featuregated-crd-manifests.yaml
+++ b/machineconfiguration/v1/zz_generated.featuregated-crd-manifests.yaml
@@ -32,6 +32,7 @@ controllerconfigs.machineconfiguration.openshift.io:
- AWSClusterHostedDNSInstall
- AWSDualStackInstall
- AWSEuropeanSovereignCloudInstall
+ - AdaptableTopology
- AzureClusterHostedDNSInstall
- AzureDualStackInstall
- DualReplica
diff --git a/payload-manifests/featuregates/featureGate-4-10-Hypershift-Default.yaml b/payload-manifests/featuregates/featureGate-4-10-Hypershift-Default.yaml
index c1d43a43bc4..7c9c97c695a 100644
--- a/payload-manifests/featuregates/featureGate-4-10-Hypershift-Default.yaml
+++ b/payload-manifests/featuregates/featureGate-4-10-Hypershift-Default.yaml
@@ -32,6 +32,9 @@
{
"name": "AWSServiceLBNetworkSecurityGroup"
},
+ {
+ "name": "AdaptableTopology"
+ },
{
"name": "AdditionalStorageConfig"
},
diff --git a/payload-manifests/featuregates/featureGate-4-10-Hypershift-DevPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-4-10-Hypershift-DevPreviewNoUpgrade.yaml
index d407d6bea75..34914b43737 100644
--- a/payload-manifests/featuregates/featureGate-4-10-Hypershift-DevPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-4-10-Hypershift-DevPreviewNoUpgrade.yaml
@@ -16,6 +16,9 @@
"featureGates": [
{
"disabled": [
+ {
+ "name": "AdaptableTopology"
+ },
{
"name": "ClientsAllowCBOR"
},
diff --git a/payload-manifests/featuregates/featureGate-4-10-Hypershift-OKD.yaml b/payload-manifests/featuregates/featureGate-4-10-Hypershift-OKD.yaml
index 8c603acea37..a93c1c11f57 100644
--- a/payload-manifests/featuregates/featureGate-4-10-Hypershift-OKD.yaml
+++ b/payload-manifests/featuregates/featureGate-4-10-Hypershift-OKD.yaml
@@ -34,6 +34,9 @@
{
"name": "AWSServiceLBNetworkSecurityGroup"
},
+ {
+ "name": "AdaptableTopology"
+ },
{
"name": "AdditionalStorageConfig"
},
diff --git a/payload-manifests/featuregates/featureGate-4-10-Hypershift-TechPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-4-10-Hypershift-TechPreviewNoUpgrade.yaml
index 2e4864797f3..4ca32d397cf 100644
--- a/payload-manifests/featuregates/featureGate-4-10-Hypershift-TechPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-4-10-Hypershift-TechPreviewNoUpgrade.yaml
@@ -16,6 +16,9 @@
"featureGates": [
{
"disabled": [
+ {
+ "name": "AdaptableTopology"
+ },
{
"name": "ClientsAllowCBOR"
},
diff --git a/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-Default.yaml b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-Default.yaml
index 4f43aef34ef..14d45f3924f 100644
--- a/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-Default.yaml
+++ b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-Default.yaml
@@ -29,6 +29,9 @@
{
"name": "AWSEuropeanSovereignCloudInstall"
},
+ {
+ "name": "AdaptableTopology"
+ },
{
"name": "AdditionalStorageConfig"
},
diff --git a/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-DevPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-DevPreviewNoUpgrade.yaml
index c69db071a71..f0592fae366 100644
--- a/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-DevPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-DevPreviewNoUpgrade.yaml
@@ -57,6 +57,9 @@
{
"name": "AWSServiceLBNetworkSecurityGroup"
},
+ {
+ "name": "AdaptableTopology"
+ },
{
"name": "AdditionalStorageConfig"
},
diff --git a/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-OKD.yaml b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-OKD.yaml
index 596cc8ad492..d4e1ec1dd5c 100644
--- a/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-OKD.yaml
+++ b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-OKD.yaml
@@ -31,6 +31,9 @@
{
"name": "AWSEuropeanSovereignCloudInstall"
},
+ {
+ "name": "AdaptableTopology"
+ },
{
"name": "AdditionalStorageConfig"
},
diff --git a/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-TechPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-TechPreviewNoUpgrade.yaml
index 11c4f83aaf1..6f5808d6514 100644
--- a/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-TechPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-TechPreviewNoUpgrade.yaml
@@ -16,6 +16,9 @@
"featureGates": [
{
"disabled": [
+ {
+ "name": "AdaptableTopology"
+ },
{
"name": "ClientsAllowCBOR"
},