diff --git a/config/v1/tests/infrastructures.config.openshift.io/DualReplica.yaml b/config/v1/tests/infrastructures.config.openshift.io/DualReplica.yaml
index aa83cf190e6..bc1592c5ac9 100644
--- a/config/v1/tests/infrastructures.config.openshift.io/DualReplica.yaml
+++ b/config/v1/tests/infrastructures.config.openshift.io/DualReplica.yaml
@@ -21,59 +21,63 @@ tests:
kind: Infrastructure
spec:
platformSpec:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
updated: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: DualReplica
infrastructureTopology: HighlyAvailable
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws: {}
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
expected: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: DualReplica
cpuPartitioning: None
infrastructureTopology: HighlyAvailable
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws:
- cloudLoadBalancerConfig:
- dnsType: PlatformDefault
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
- name: should not allow changing infrastructureTopology value to `DualReplica`
initial: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
updated: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: HighlyAvailable
infrastructureTopology: DualReplica
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws: {}
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
expectedStatusError: 'status.infrastructureTopology: Unsupported value: "DualReplica": supported values: "HighlyAvailable", "SingleReplica"'
diff --git a/config/v1/tests/infrastructures.config.openshift.io/HighlyAvailableArbiter+DualReplica.yaml b/config/v1/tests/infrastructures.config.openshift.io/HighlyAvailableArbiter+DualReplica.yaml
index 20bd8ddc9ca..76db93fc07d 100644
--- a/config/v1/tests/infrastructures.config.openshift.io/HighlyAvailableArbiter+DualReplica.yaml
+++ b/config/v1/tests/infrastructures.config.openshift.io/HighlyAvailableArbiter+DualReplica.yaml
@@ -22,61 +22,63 @@ tests:
kind: Infrastructure
spec:
platformSpec:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
updated: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: HighlyAvailableArbiter
infrastructureTopology: HighlyAvailable
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
expected: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: HighlyAvailableArbiter
cpuPartitioning: None
infrastructureTopology: HighlyAvailable
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws:
- cloudLoadBalancerConfig:
- dnsType: PlatformDefault
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
- name: should not allow changing infrastructureTopology value to `HighlyAvailableArbiter`
initial: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
updated: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: HighlyAvailable
infrastructureTopology: HighlyAvailableArbiter
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws: {}
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
expectedStatusError: 'status.infrastructureTopology: Unsupported value: "HighlyAvailableArbiter": supported values: "HighlyAvailable", "SingleReplica"'
- name: status should allow controlPlaneTopology value for `DualReplica`
initial: |
@@ -84,59 +86,63 @@ tests:
kind: Infrastructure
spec:
platformSpec:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
updated: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: DualReplica
infrastructureTopology: HighlyAvailable
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws: {}
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
expected: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: DualReplica
cpuPartitioning: None
infrastructureTopology: HighlyAvailable
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws:
- cloudLoadBalancerConfig:
- dnsType: PlatformDefault
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
- name: should not allow changing infrastructureTopology value to `DualReplica`
initial: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
updated: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: HighlyAvailable
infrastructureTopology: DualReplica
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws: {}
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
expectedStatusError: 'status.infrastructureTopology: Unsupported value: "DualReplica": supported values: "HighlyAvailable", "SingleReplica"'
diff --git a/config/v1/tests/infrastructures.config.openshift.io/HighlyAvailableArbiter.yaml b/config/v1/tests/infrastructures.config.openshift.io/HighlyAvailableArbiter.yaml
index 6e67544834f..724888cfd5c 100644
--- a/config/v1/tests/infrastructures.config.openshift.io/HighlyAvailableArbiter.yaml
+++ b/config/v1/tests/infrastructures.config.openshift.io/HighlyAvailableArbiter.yaml
@@ -21,59 +21,61 @@ tests:
kind: Infrastructure
spec:
platformSpec:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
updated: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: HighlyAvailableArbiter
infrastructureTopology: HighlyAvailable
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
expected: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: HighlyAvailableArbiter
cpuPartitioning: None
infrastructureTopology: HighlyAvailable
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws:
- cloudLoadBalancerConfig:
- dnsType: PlatformDefault
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
- name: should not allow changing infrastructureTopology value to `HighlyAvailableArbiter`
initial: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- aws: {}
- type: AWS
+ baremetal: {}
+ type: BareMetal
updated: |
apiVersion: config.openshift.io/v1
kind: Infrastructure
spec:
platformSpec:
- type: AWS
- aws: {}
+ type: BareMetal
+ baremetal: {}
status:
controlPlaneTopology: HighlyAvailable
infrastructureTopology: HighlyAvailableArbiter
- platform: AWS
+ platform: BareMetal
platformStatus:
- aws: {}
- type: AWS
+ baremetal:
+ loadBalancer:
+ type: OpenShiftManagedDefault
+ type: BareMetal
expectedStatusError: 'status.infrastructureTopology: Unsupported value: "HighlyAvailableArbiter": supported values: "HighlyAvailable", "SingleReplica"'
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 6dcc0cfb6aa..1ae221ca458 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
@@ -1051,6 +1051,7 @@ spec:
its components are not visible within the cluster.
enum:
- HighlyAvailable
+ - HighlyAvailableArbiter
- SingleReplica
- External
type: string
diff --git a/features.md b/features.md
index c20741dfa28..d1f559c0c75 100644
--- a/features.md
+++ b/features.md
@@ -33,7 +33,6 @@
| ExternalOIDCWithUIDAndExtraClaimMappings| | | Enabled | Enabled | Enabled | Enabled |
| GCPClusterHostedDNS| | | Enabled | Enabled | Enabled | Enabled |
| GCPCustomAPIEndpoints| | | Enabled | Enabled | Enabled | Enabled |
-| HighlyAvailableArbiter| | | Enabled | Enabled | Enabled | Enabled |
| ImageModeStatusReporting| | | Enabled | Enabled | Enabled | Enabled |
| ImageStreamImportMode| | | Enabled | Enabled | Enabled | Enabled |
| IngressControllerDynamicConfigurationManager| | | Enabled | Enabled | Enabled | Enabled |
@@ -77,6 +76,7 @@
| GatewayAPI| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled |
| GatewayAPIController| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled |
| HardwareSpeed| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled |
+| HighlyAvailableArbiter| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled |
| IngressControllerLBSubnetsAWS| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled |
| KMSv1| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled |
| MachineConfigNodes| Enabled | Enabled | Enabled | Enabled | Enabled | Enabled |
diff --git a/features/features.go b/features/features.go
index ac87294baca..98780867fe2 100644
--- a/features/features.go
+++ b/features/features.go
@@ -698,11 +698,8 @@ var (
contactPerson("eggfoobar").
productScope(ocpSpecific).
enhancementPR("https://github.com/openshift/enhancements/pull/1674").
- // TODO: Do not go GA until jira issue is resolved: https://issues.redhat.com/browse/OCPEDGE-1637
- // Annotations must correctly handle either DualReplica or HighlyAvailableArbiter going GA with
- // the other still in TechPreview.
- enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade).
- mustRegister()
+ enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default).
+ mustRegister()
FeatureGateCVOConfiguration = newFeatureGate("ClusterVersionOperatorConfiguration").
reportProblemsToJiraComponent("Cluster Version Operator").
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 c6b83d32542..96b84fb71be 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
@@ -1332,6 +1332,7 @@ spec:
its components are not visible within the cluster.
enum:
- HighlyAvailable
+ - HighlyAvailableArbiter
- SingleReplica
- External
type: string
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 6dcc0cfb6aa..1ae221ca458 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
@@ -1051,6 +1051,7 @@ spec:
its components are not visible within the cluster.
enum:
- HighlyAvailable
+ - HighlyAvailableArbiter
- SingleReplica
- External
type: string
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 c6b83d32542..96b84fb71be 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
@@ -1332,6 +1332,7 @@ spec:
its components are not visible within the cluster.
enum:
- HighlyAvailable
+ - HighlyAvailableArbiter
- SingleReplica
- External
type: string
diff --git a/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml b/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml
index f1d65162fb3..4523a9c714d 100644
--- a/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml
+++ b/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml
@@ -82,9 +82,6 @@
{
"name": "GCPCustomAPIEndpoints"
},
- {
- "name": "HighlyAvailableArbiter"
- },
{
"name": "ImageModeStatusReporting"
},
@@ -246,6 +243,9 @@
{
"name": "HardwareSpeed"
},
+ {
+ "name": "HighlyAvailableArbiter"
+ },
{
"name": "IngressControllerLBSubnetsAWS"
},
diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml b/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml
index 72d0e9bd686..070928192e0 100644
--- a/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml
+++ b/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml
@@ -85,9 +85,6 @@
{
"name": "GCPCustomAPIEndpoints"
},
- {
- "name": "HighlyAvailableArbiter"
- },
{
"name": "ImageModeStatusReporting"
},
@@ -243,6 +240,9 @@
{
"name": "HardwareSpeed"
},
+ {
+ "name": "HighlyAvailableArbiter"
+ },
{
"name": "IngressControllerLBSubnetsAWS"
},
diff --git a/tools/codegen/cmd/featuregate-test-analyzer.go b/tools/codegen/cmd/featuregate-test-analyzer.go
index 5ad3bc6830c..60f1fc7c5d5 100644
--- a/tools/codegen/cmd/featuregate-test-analyzer.go
+++ b/tools/codegen/cmd/featuregate-test-analyzer.go
@@ -368,14 +368,14 @@ var (
Topology: "ha",
NetworkStack: "dual",
},
+ {
+ Cloud: "aws",
+ Architecture: "amd64",
+ Topology: "single-node",
+ },
// TODO restore these once we run TechPreview jobs that contain them
//{
- // Cloud: "aws",
- // Architecture: "amd64",
- // Topology: "single-node",
- //},
- //{
// Cloud: "metal-ipi",
// Architecture: "amd64",
// Topology: "single-node",
@@ -394,6 +394,42 @@ var (
Architecture: "amd64",
Topology: "ha",
},
+ {
+ Cloud: "metal",
+ Architecture: "amd64",
+ Topology: "two-node-arbiter",
+ NetworkStack: "ipv4",
+ },
+ {
+ Cloud: "metal",
+ Architecture: "amd64",
+ Topology: "two-node-arbiter",
+ NetworkStack: "ipv6",
+ },
+ {
+ Cloud: "metal",
+ Architecture: "amd64",
+ Topology: "two-node-arbiter",
+ NetworkStack: "dual",
+ },
+ {
+ Cloud: "metal",
+ Architecture: "amd64",
+ Topology: "two-node-fencing",
+ NetworkStack: "ipv4",
+ },
+ {
+ Cloud: "metal",
+ Architecture: "amd64",
+ Topology: "two-node-fencing",
+ NetworkStack: "ipv6",
+ },
+ {
+ Cloud: "metal",
+ Architecture: "amd64",
+ Topology: "two-node-fencing",
+ NetworkStack: "dual",
+ },
}
nonHypershiftPlatforms = regexp.MustCompile("(?i)nutanix|metal|vsphere|openstack|azure|gcp")
@@ -503,8 +539,9 @@ func filterVariants(featureGate string, variantsList ...[]JobVariant) []JobVaria
for _, variant := range variants {
normalizedCloud := strings.ReplaceAll(strings.ToLower(variant.Cloud), "-ipi", "") // The feature gate probably won't include the install type, but some cloud variants do
normalizedArchitecture := strings.ToLower(variant.Architecture)
+ normalizedTopology := strings.ToLower(variant.Topology)
- if strings.Contains(normalizedFeatureGate, normalizedCloud) || strings.Contains(normalizedFeatureGate, normalizedArchitecture) {
+ if strings.Contains(normalizedFeatureGate, normalizedCloud) || strings.Contains(normalizedFeatureGate, normalizedArchitecture) || matchTwoNodeFeatureGates(normalizedFeatureGate, normalizedTopology) {
filteredVariants = append(filteredVariants, variant)
}
}
@@ -680,3 +717,14 @@ func listTestResultForVariant(featureGate string, jobVariant JobVariant) (*Testi
return jobVariantResults, nil
}
+
+// Check for Arbiter and DualReplica or Fencing featureGates as these have special topologies
+func matchTwoNodeFeatureGates(featureGate string, topology string) bool {
+ if strings.Contains(featureGate, "arbiter") && strings.Contains(topology, "arbiter") {
+ return true
+ }
+ if (strings.Contains(featureGate, "dualreplica") || strings.Contains(featureGate, "fencing")) && strings.Contains(topology, "fencing") {
+ return true
+ }
+ return false
+}