Scenario 1: Azure Private Cluster Without External DNS Completes Successfully

Objective: Verify the primary bug fix — a Private cluster without --external-dns-domain provisions to completion with all cluster operators healthy.

Cluster: brcox-100054-hc on Azure self-managed management cluster (eastus), 2 nodes, OCP 5.0.0-ec.5

CPO image: quay.io/rh_ee_brcox/hypershift:OCPBUGS-100054-2026-08-05-1

Overall Scenario 1: PASS — All 11 checks verified.
StepCheckResultEvidence
1 Private cluster created without --external-dns-domain PASS --endpoint-access Private, no --external-dns-domain flag
2 HostedCluster reaches Available=True PASS Available: True since 2026-08-05T12:48:57Z, Progressing: False, Degraded: False
3 ClusterVersion completed PASS Version 5.0.0-ec.5, state Completed at 2026-08-05T12:54:35Z (~8 min install)
4a AzurePLSCreated=True PASS True (AzureSuccess) at 2026-08-05T12:44:55Z
4b AzurePrivateDNSAvailable=True PASS True (AzureSuccess) at 2026-08-05T12:47:41Z
4c AzurePrivateEndpointAvailable=True PASS True (AzureSuccess) at 2026-08-05T12:46:37Z
4d AzurePrivateLinkServiceAvailable=True PASS True (AzureSuccess) at 2026-08-05T12:44:55Z
4e AzureInternalLoadBalancerAvailable=True PASS True (AzureSuccess) at 2026-08-05T12:44:35Z
5 2/2 machines Running and Ready PASS Both machines Phase=Running, Ready=True, version=5.0.0-ec.5. NodePool: desired=2, current=2
6 47/47 control plane pods Running PASS 46 Running, 1 Completed (featuregate-generator). 0 non-Running/non-Completed
7 All 21 guest ClusterOperators healthy PASS 21 COs: Available=True, Progressing=False, Degraded=False, version=5.0.0-ec.5
8 No non-running pods on guest cluster PASS No resources found for non-Running/non-Succeeded pods
9 Ingress ClusterOperator healthy PASS Available=True, Degraded=False, Upgradeable=True
10 publicZoneID is set on HostedCluster PASS Points to os4-common public DNS zone
11 privateZoneID is set on HostedCluster PASS Points to brcox-100054-hc.hcp-sm-azure... private DNS zone

Commands & Outputs

Step 1: Create cluster (script excerpt)

$ cat create_hc.sh | grep -E '(endpoint-access|external-dns)'
  --endpoint-access Private \
  # NOTE: No --external-dns-domain flag

Step 2: Verify HostedCluster conditions

$ oc get hostedcluster brcox-100054-hc -n clusters -o jsonpath='{.status.conditions}' | jq -r '.[] | select(.type | test("Available|Progressing|Degraded")) | "\(.type): \(.status) (\(.reason)) [\(.lastTransitionTime)]"'
Available: True (AsExpected) [2026-08-05T12:48:57Z]
Progressing: False (AsExpected) [2026-08-05T12:54:35Z]
Degraded: False (AsExpected) [2026-08-05T12:41:56Z]

Step 3: Verify ClusterVersion completed

$ oc get hostedcluster brcox-100054-hc -n clusters -o jsonpath='{.status.version}' | jq .
{
  "availableUpdates": null,
  "desired": {
    "image": "quay.io/openshift-release-dev/ocp-release@sha256:d1c0459e0a513c95a3946ae16d9c88b7fc85c5a53960ead6ac56646ec5c593cb",
    "version": "5.0.0-ec.5"
  },
  "history": [
    {
      "completionTime": "2026-08-05T12:54:35Z",
      "image": "quay.io/openshift-release-dev/ocp-release@sha256:d1c0459e0a513c95a3946ae16d9c88b7fc85c5a53960ead6ac56646ec5c593cb",
      "startedTime": "2026-08-05T12:46:20Z",
      "state": "Completed",
      "verified": false,
      "version": "5.0.0-ec.5"
    }
  ],
  "observedGeneration": 1
}

Steps 4a-4e: Azure Private Link conditions

$ oc get hostedcluster brcox-100054-hc -n clusters -o jsonpath='{.status.conditions}' | jq -r '.[] | select(.type | startswith("Azure")) | "\(.type): \(.status) (\(.reason)) [\(.lastTransitionTime)] \(.message)"'
AzureInternalLoadBalancerAvailable: True (AzureSuccess) [2026-08-05T12:44:35Z] "All is well"
AzurePLSCreated: True (AzureSuccess) [2026-08-05T12:44:55Z] "All is well"
AzurePrivateDNSAvailable: True (AzureSuccess) [2026-08-05T12:47:41Z] "All is well"
AzurePrivateEndpointAvailable: True (AzureSuccess) [2026-08-05T12:46:37Z] "All is well"
AzurePrivateLinkServiceAvailable: True (AzureSuccess) [2026-08-05T12:44:55Z] "All is well"

Step 5: Verify machines

$ oc get machines -n clusters-brcox-100054-hc
NAME                          CLUSTER                 NODE NAME                     READY   AVAILABLE   UP-TO-DATE   PHASE     VERSION
brcox-100054-hc-lq4rl-jn9pg   brcox-100054-hc-7prcj   brcox-100054-hc-lq4rl-jn9pg   True    True        True         Running   5.0.0-ec.5
brcox-100054-hc-lq4rl-mvrzd   brcox-100054-hc-7prcj   brcox-100054-hc-lq4rl-mvrzd   True    True        True         Running   5.0.0-ec.5

$ oc get nodepool -n clusters -o wide | grep brcox-100054
NAME              CLUSTER           DESIRED   CURRENT   UPDATING   AUTOREPAIR   VERSION      AUTOSCALING   SECURITY-UPDATES
brcox-100054-hc   brcox-100054-hc   2         2         False      False        5.0.0-ec.5   False         False

Step 6: Control plane pods

$ kubectl get pods -n clusters-brcox-100054-hc --no-headers | wc -l
47

$ kubectl get pods -n clusters-brcox-100054-hc --no-headers | awk '{print $3}' | sort | uniq -c
  1 Completed
 46 Running

Step 7: Guest ClusterOperators

$ kubectl get co (via port-forward to guest KAS)
NAME                                       VERSION      AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
console                                    5.0.0-ec.5   True        False         False      75m
csi-snapshot-controller                    5.0.0-ec.5   True        False         False      82m
dns                                        5.0.0-ec.5   True        False         False      75m
image-registry                             5.0.0-ec.5   True        False         False      75m
ingress                                    5.0.0-ec.5   True        False         False      75m
insights                                   5.0.0-ec.5   True        False         False      76m
kube-apiserver                             5.0.0-ec.5   True        False         False      82m
kube-controller-manager                    5.0.0-ec.5   True        False         False      82m
kube-scheduler                             5.0.0-ec.5   True        False         False      82m
kube-storage-version-migrator              5.0.0-ec.5   True        False         False      76m
monitoring                                 5.0.0-ec.5   True        False         False      75m
network                                    5.0.0-ec.5   True        False         False      81m
node-tuning                                5.0.0-ec.5   True        False         False      76m
openshift-apiserver                        5.0.0-ec.5   True        False         False      82m
openshift-controller-manager               5.0.0-ec.5   True        False         False      82m
openshift-samples                          5.0.0-ec.5   True        False         False      75m
operator-lifecycle-manager                 5.0.0-ec.5   True        False         False      82m
operator-lifecycle-manager-catalog         5.0.0-ec.5   True        False         False      82m
operator-lifecycle-manager-packageserver   5.0.0-ec.5   True        False         False      82m
service-ca                                 5.0.0-ec.5   True        False         False      76m
storage                                    5.0.0-ec.5   True        False         False      76m

Step 8: Guest non-running pods

$ kubectl get pods -A --field-selector 'status.phase!=Running,status.phase!=Succeeded' --no-headers
No resources found

Step 9: Ingress ClusterOperator detail

$ kubectl get co ingress -o json | jq '.status.conditions[]'
Available: True    "The \"default\" ingress controller reports Available=True."
Progressing: False "desired and current number of IngressControllers are equal"
Degraded: False    "The \"default\" ingress controller reports Degraded=False."
Upgradeable: True
EvaluationConditionsDetected: False

Steps 10-11: DNS zone IDs on HostedCluster

$ oc get hostedcluster brcox-100054-hc -n clusters -o jsonpath='{.spec.dns}' | jq .
{
  "baseDomain": "hcp-sm-azure.azure.devcluster.openshift.com",
  "privateZoneID": "/subscriptions/237432b9-9dc5-4b0b-b058-8868ac6a774b/resourceGroups/brcox-100054-hc-brcox-100054/providers/Microsoft.Network/privateDnsZones/brcox-100054-hc.hcp-sm-azure.azure.devcluster.openshift.com",
  "publicZoneID": "/subscriptions/237432b9-9dc5-4b0b-b058-8868ac6a774b/resourceGroups/os4-common/providers/Microsoft.Network/dnszones/hcp-sm-azure.azure.devcluster.openshift.com"
}
← Dashboard Scenario 2 →