Skip to content

CNTRLPLANE-3254: Sort how-to guides alphabetically and add CI enforcement - #8248

Merged
openshift-merge-bot[bot] merged 3 commits into
openshift:mainfrom
bryan-cox:fix-docs-formatting
Apr 15, 2026
Merged

openshift-merge-bot[bot] merged 3 commits into
openshift:mainfrom
bryan-cox:fix-docs-formatting

Conversation

@bryan-cox

@bryan-cox bryan-cox commented Apr 15, 2026 •

Copy link
Copy Markdown
Member

What this PR does / why we need it:

  • Sorts all how-to guide entries in docs/mkdocs.yml alphabetically at every level of the nav hierarchy
  • Groups cloud provider sections (Agent, AWS, Azure, GCP, Kubevirt, None, OpenStack, PowerVS) under a new Platform parent section to reduce top-level clutter
  • Adds a verify-docs-nav Makefile target with a Python verification script (hack/verify-docs-nav-order.py) that enforces alphabetical ordering, included in make verify via verify-parallel

The how-to guides at https://hypershift.pages.dev/how-to/ were not sorted alphabetically, making it difficult to find specific guides. This change ensures alphabetical ordering both now and going forward through CI enforcement.

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-3254

Special notes for your reviewer:

  • The verification script resolves display titles from markdown file frontmatter or H1 headings (not filenames), so entries without explicit nav titles are sorted by their actual displayed title
  • Index pages (index.md, *-index.md) are exempt from sorting and kept first in each section
  • The script requires PyYAML (a MkDocs dependency) but gracefully skips if not installed
  • No content changes — only YAML reordering and new files

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

🤖 Generated with Claude Code via /jira:solve [CNTRLPLANE-3254](https://redhat.atlassian.net/browse/CNTRLPLANE-3254)

Summary by CodeRabbit

  • Documentation

    • Restructured How-to guides for improved organization and discoverability; consolidated provider guides under a unified Platform section and reorganized Automated Machine Management, CI, and related topics.
    • Added contributor guidance to keep how-to entries alphabetized by display title.
  • Chores

    • Added a new verification check that enforces docs navigation ordering and runs as part of the verification flow.
  • Tests

    • Minor formatting tweak in an existing test (no behavior changes).

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: LGTM mode

@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Apr 15, 2026
@openshift-ci-robot

openshift-ci-robot commented Apr 15, 2026 •

Copy link
Copy Markdown

@bryan-cox: This pull request references CNTRLPLANE-3254 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "5.0.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

  • Sorts all how-to guide entries in docs/mkdocs.yml alphabetically at every level of the nav hierarchy
  • Groups cloud provider sections (Agent, AWS, Azure, GCP, Kubevirt, None, OpenStack, PowerVS) under a new Platform parent section to reduce top-level clutter
  • Adds a verify-docs-nav Makefile target with a Python verification script (hack/verify-docs-nav-order.py) that enforces alphabetical ordering, included in make verify via verify-parallel

The how-to guides at https://hypershift.pages.dev/how-to/ were not sorted alphabetically, making it difficult to find specific guides. This change ensures alphabetical ordering both now and going forward through CI enforcement.

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-3254

Special notes for your reviewer:

  • The verification script resolves display titles from markdown file frontmatter or H1 headings (not filenames), so entries without explicit nav titles are sorted by their actual displayed title
  • Index pages (index.md, *-index.md) are exempt from sorting and kept first in each section
  • The script requires PyYAML (a MkDocs dependency) but gracefully skips if not installed
  • No content changes — only YAML reordering and new files

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

🤖 Generated with Claude Code via /jira:solve [CNTRLPLANE-3254](https://redhat.atlassian.net/browse/CNTRLPLANE-3254)

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Apr 15, 2026
@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@coderabbitai

coderabbitai Bot commented Apr 15, 2026 •

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This pull request adds a documentation ordering validation: a new Python script (hack/verify-docs-nav-order.py) verifies that entries in the "How-to guides" section of docs/mkdocs.yml are alphabetically ordered by display title (with index pages exempt but required to precede non-index entries). The Makefile exposes a verify-docs-nav phony target and adds it to the verify-parallel dependencies so the check runs during parallel verification. The MkDocs navigation (docs/mkdocs.yml) was reorganized, consolidating provider pages under a new "Platform" section and reordering several how-to guide entries.

Sequence Diagram(s)

sequenceDiagram
    participant Make as Makefile/CI
    participant Script as verify-docs-nav (Python)
    participant YAML as PyYAML Loader
    participant FS as Filesystem (docs/mkdocs.yml + markdown files)
    participant Console as Console/Exit

    Make->>Script: invoke python3 hack/verify-docs-nav-order.py
    Script->>YAML: load docs/mkdocs.yml (SafeLoader)
    YAML-->>Script: parsed nav structure
    Script->>FS: read referenced markdown files for titles
    FS-->>Script: file contents / titles
    Script->>Script: compute display titles, treat index entries, check alphabetical order
    alt order correct
        Script->>Console: print success (exit 0)
        Console-->>Make: success
    else order incorrect or errors
        Script->>Console: print current vs expected order, error message (exit non-zero)
        Console-->>Make: failure
    end
Loading
🚥 Pre-merge checks | ✅ 9 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (9 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: alphabetically sorting how-to guides and adding CI enforcement via a new verification target.
Stable And Deterministic Test Names ✅ Passed PR modifies test file with purely cosmetic formatting in Go standard testing pattern, no Ginkgo test name violations.
Test Structure And Quality ✅ Passed The test file uses Go's standard testing framework, not Ginkgo BDD patterns, so the check requirements are not applicable.
Microshift Test Compatibility ✅ Passed The PR modifies only the formatting of an existing testARM64Provisioning function with no new Ginkgo e2e tests added, making the MicroShift compatibility check inapplicable.
Single Node Openshift (Sno) Test Compatibility ✅ Passed No new Ginkgo e2e tests were added in this pull request. The only change to test/e2e/karpenter_test.go is a formatting adjustment to an existing test function.
Topology-Aware Scheduling Compatibility ✅ Passed PR modifies only documentation files, build config, and test formatting. No deployment manifests, operator code, or controller changes detected.
Ote Binary Stdout Contract ✅ Passed This PR does not introduce OTE test binaries with non-JSON stdout. The new Python script is a CI utility tool, not an OTE binary communicating with openshift-tests.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed This PR does not add any new Ginkgo e2e tests. The karpenter_test.go file uses standard Go testing patterns with t.Run() and t.Parallel(), not Ginkgo patterns. The PR's primary changes are to documentation configuration and a Python verification script.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@openshift-ci openshift-ci Bot added do-not-merge/needs-area area/ci-tooling Indicates the PR includes changes for CI or tooling area/documentation Indicates the PR includes changes for documentation approved Indicates a PR has been approved by an approver from all required OWNERS files. and removed do-not-merge/needs-area labels Apr 15, 2026
@openshift-ci-robot

openshift-ci-robot commented Apr 15, 2026 •

Copy link
Copy Markdown

@bryan-cox: This pull request references CNTRLPLANE-3254 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "5.0.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

  • Sorts all how-to guide entries in docs/mkdocs.yml alphabetically at every level of the nav hierarchy
  • Groups cloud provider sections (Agent, AWS, Azure, GCP, Kubevirt, None, OpenStack, PowerVS) under a new Platform parent section to reduce top-level clutter
  • Adds a verify-docs-nav Makefile target with a Python verification script (hack/verify-docs-nav-order.py) that enforces alphabetical ordering, included in make verify via verify-parallel

The how-to guides at https://hypershift.pages.dev/how-to/ were not sorted alphabetically, making it difficult to find specific guides. This change ensures alphabetical ordering both now and going forward through CI enforcement.

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-3254

Special notes for your reviewer:

  • The verification script resolves display titles from markdown file frontmatter or H1 headings (not filenames), so entries without explicit nav titles are sorted by their actual displayed title
  • Index pages (index.md, *-index.md) are exempt from sorting and kept first in each section
  • The script requires PyYAML (a MkDocs dependency) but gracefully skips if not installed
  • No content changes — only YAML reordering and new files

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

🤖 Generated with Claude Code via /jira:solve [CNTRLPLANE-3254](https://redhat.atlassian.net/browse/CNTRLPLANE-3254)

Summary by CodeRabbit

  • Documentation
  • Restructured How-to guides documentation navigation for improved organization and discoverability.
  • Consolidated cloud and infrastructure provider-specific guides under a new unified Platform section.
  • Enhanced grouping and ordering of Automated Machine Management, CI, and other topic areas.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@bryan-cox
bryan-cox marked this pull request as ready for review April 15, 2026 13:17
@openshift-ci openshift-ci Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Apr 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/mkdocs.yml`:
- Around line 169-172: In the mkdocs.yml nav entry for the 'None' section,
replace the Agent path currently listed as
"how-to/agent/exposing-services-from-hcp.md" (the 'Exposing HCP Services' item)
with the None-specific document "how-to/none/exposing-services-from-hcp.md" so
the None nav entries consistently reference files under how-to/none (same
pattern as 'how-to/none/global-pull-secret.md').

In `@hack/verify-docs-nav-order.py`:
- Around line 90-93: The loop over entries that calls is_index_entry(entry) and
get_display_title(entry) must also enforce that index pages come before
non-index pages: add logic in the iteration (in the same loop that processes
entries in verify-docs-nav-order) to track when the first non-index entry is
seen (e.g., seen_non_index flag) and if you encounter an index entry after
seen_non_index is true, report/fail with a clear message referencing the
offending entry; use the existing is_index_entry(entry) predicate to detect
index pages and get_display_title(entry) to include the title in the error
report so position violations are detected and surfaced.
- Around line 11-16: The current try/except around "import yaml" silently exits
with 0 which makes CI skip the docs nav check; change the behavior in the except
block to detect the OPENSHIFT_CI environment variable and exit non-zero in CI
while keeping the existing graceful exit for local runs—i.e., in the except
ImportError for the "import yaml" statement, if os.environ.get("OPENSHIFT_CI")
is truthy call sys.exit(1) after printing the warning, otherwise keep
sys.exit(0) for local dev. Ensure you reference the "import yaml" ImportError
handler and the OPENSHIFT_CI environment check when making the change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 0b69192f-db79-49ce-9e2a-c2af50b0c858

📥 Commits

Reviewing files that changed from the base of the PR and between 916b455 and 77aaab6.

📒 Files selected for processing (3)
  • Makefile
  • docs/mkdocs.yml
  • hack/verify-docs-nav-order.py

Comment thread docs/mkdocs.yml
Comment thread hack/verify-docs-nav-order.py Outdated
Comment thread hack/verify-docs-nav-order.py Outdated
@openshift-ci
openshift-ci Bot requested review from csrwng and sjenning April 15, 2026 13:18
@bryan-cox
bryan-cox force-pushed the fix-docs-formatting branch from c95a837 to 53254d2 Compare April 15, 2026 13:18
Sort all how-to guide entries in docs/mkdocs.yml alphabetically at
every level, and group cloud provider sections (Agent, AWS, Azure, GCP,
Kubevirt, None, OpenStack, PowerVS) under a new "Platform" parent
section to reduce top-level clutter and improve discoverability.

Fixes: CNTRLPLANE-3254

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@bryan-cox
bryan-cox force-pushed the fix-docs-formatting branch from 53254d2 to 57f8263 Compare April 15, 2026 13:20
@codecov

codecov Bot commented Apr 15, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 34.65%. Comparing base (916b455) to head (fd1ede3).
⚠️ Report is 7 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #8248   +/-   ##
=======================================
  Coverage   34.65%   34.65%           
=======================================
  Files         767      767           
  Lines       93263    93263           
=======================================
  Hits        32318    32318           
  Misses      58266    58266           
  Partials     2679     2679           
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@openshift-ci-robot

openshift-ci-robot commented Apr 15, 2026 •

Copy link
Copy Markdown

@bryan-cox: This pull request references CNTRLPLANE-3254 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "5.0.0" version, but no target version was set.

Details

In response to this:

What this PR does / why we need it:

  • Sorts all how-to guide entries in docs/mkdocs.yml alphabetically at every level of the nav hierarchy
  • Groups cloud provider sections (Agent, AWS, Azure, GCP, Kubevirt, None, OpenStack, PowerVS) under a new Platform parent section to reduce top-level clutter
  • Adds a verify-docs-nav Makefile target with a Python verification script (hack/verify-docs-nav-order.py) that enforces alphabetical ordering, included in make verify via verify-parallel

The how-to guides at https://hypershift.pages.dev/how-to/ were not sorted alphabetically, making it difficult to find specific guides. This change ensures alphabetical ordering both now and going forward through CI enforcement.

Which issue(s) this PR fixes:

Fixes CNTRLPLANE-3254

Special notes for your reviewer:

  • The verification script resolves display titles from markdown file frontmatter or H1 headings (not filenames), so entries without explicit nav titles are sorted by their actual displayed title
  • Index pages (index.md, *-index.md) are exempt from sorting and kept first in each section
  • The script requires PyYAML (a MkDocs dependency) but gracefully skips if not installed
  • No content changes — only YAML reordering and new files

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.
  • This change includes unit tests.

🤖 Generated with Claude Code via /jira:solve [CNTRLPLANE-3254](https://redhat.atlassian.net/browse/CNTRLPLANE-3254)

Summary by CodeRabbit

  • Documentation

  • Restructured How-to guides navigation for improved organization and discoverability.

  • Consolidated provider-specific guides under a unified Platform section and reorganized Automated Machine Management, CI, and related topics.

  • Added contributor guidance on keeping how-to entries alphabetized by display title.

  • Chores

  • Added an automated verification step to enforce docs navigation ordering as part of the verification flow.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
hack/verify-docs-nav-order.py (1)

64-64: Avoid temporary list allocations for single key/value access.

Prefer iterator access (next(iter(...))) over list(...)[0] for clarity and lower overhead. This pattern appears in three places: lines 64, 78, and 120.

Proposed refactor
-        value = list(entry.values())[0]
+        value = next(iter(entry.values()))
@@
-        return list(entry.keys())[0]
+        return next(iter(entry.keys()))
@@
-            value = list(entry.values())[0]
+            value = next(iter(entry.values()))
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hack/verify-docs-nav-order.py` at line 64, Replace the temporary list
allocation pattern like list(entry.values())[0] with iterator-based access using
next(iter(entry.values())) (or next(iter(entry.keys())) where keys are being
accessed) to avoid creating an intermediate list; update the three occurrences
in the script that currently assign via list(...)[0] (the lines that set value =
list(entry.values())[0] and the two analogous places) to use next(iter(...))
instead while preserving the exact behavior and variable names (e.g., keep
assigning to value/from entry).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@hack/verify-docs-nav-order.py`:
- Around line 43-49: The frontmatter end detection using content.find('---', 3)
is too permissive; replace that logic in the block that begins with if
content.startswith('---') so you locate the closing delimiter by scanning lines
and finding a line that equals '---' (after stripping) rather than any
occurrence of '---' within text. Collect lines between the first '---' and the
next delimiter line, then parse those lines for the title key
(line.startswith('title:')) as before, and handle the case where no closing
delimiter is found by returning None or skipping parsing.

---

Nitpick comments:
In `@hack/verify-docs-nav-order.py`:
- Line 64: Replace the temporary list allocation pattern like
list(entry.values())[0] with iterator-based access using
next(iter(entry.values())) (or next(iter(entry.keys())) where keys are being
accessed) to avoid creating an intermediate list; update the three occurrences
in the script that currently assign via list(...)[0] (the lines that set value =
list(entry.values())[0] and the two analogous places) to use next(iter(...))
instead while preserving the exact behavior and variable names (e.g., keep
assigning to value/from entry).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: e1879131-d1a4-4c32-b11a-7c1d7b28cc37

📥 Commits

Reviewing files that changed from the base of the PR and between 77aaab6 and 57f8263.

📒 Files selected for processing (4)
  • Makefile
  • docs/content/contribute/contribute-docs.md
  • docs/mkdocs.yml
  • hack/verify-docs-nav-order.py
✅ Files skipped from review due to trivial changes (1)
  • docs/content/contribute/contribute-docs.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • Makefile
  • docs/mkdocs.yml

Comment on lines +43 to +49
if content.startswith('---'):
end = content.find('---', 3)
if end != -1:
for line in content[3:end].strip().split('\n'):
if line.startswith('title:'):
return line[6:].strip().strip('"').strip("'")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Frontmatter end detection is fragile and can mis-parse titles.

Using content.find('---', 3) can stop on any --- sequence, not just a delimiter line, which can yield wrong titles and false sort failures.

Proposed fix
-    if content.startswith('---'):
-        end = content.find('---', 3)
-        if end != -1:
-            for line in content[3:end].strip().split('\n'):
-                if line.startswith('title:'):
-                    return line[6:].strip().strip('"').strip("'")
+    if content.startswith('---'):
+        lines = content.splitlines()
+        if lines and lines[0].strip() == '---':
+            for idx in range(1, len(lines)):
+                if lines[idx].strip() == '---':
+                    for line in lines[1:idx]:
+                        if line.lstrip().startswith('title:'):
+                            return line.split(':', 1)[1].strip().strip('"').strip("'")
+                    break
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hack/verify-docs-nav-order.py` around lines 43 - 49, The frontmatter end
detection using content.find('---', 3) is too permissive; replace that logic in
the block that begins with if content.startswith('---') so you locate the
closing delimiter by scanning lines and finding a line that equals '---' (after
stripping) rather than any occurrence of '---' within text. Collect lines
between the first '---' and the next delimiter line, then parse those lines for
the title key (line.startswith('title:')) as before, and handle the case where
no closing delimiter is found by returning None or skipping parsing.

bryan-cox and others added 2 commits April 15, 2026 09:47
Add a Python script (hack/verify-docs-nav-order.py) that validates the
how-to guides nav entries in docs/mkdocs.yml are sorted alphabetically.
The script resolves display titles from markdown file frontmatter or H1
headings, exempts index pages from sorting, and recursively checks all
subsections.

Add a verify-docs-nav Makefile target and include it in verify-parallel
so it runs as part of `make verify`. Document the alphabetical ordering
convention in contribute-docs.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Align map literal spacing to satisfy go fmt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@bryan-cox
bryan-cox force-pushed the fix-docs-formatting branch from 57f8263 to fd1ede3 Compare April 15, 2026 13:48
@openshift-ci openshift-ci Bot added the area/testing Indicates the PR includes changes for e2e testing label Apr 15, 2026
@openshift-ci-robot

Copy link
Copy Markdown

@bryan-cox: The verified label has been added.

Details

In response to this:

/verified bypass

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@bryan-cox

Copy link
Copy Markdown
Member Author

/override "Red Hat Konflux / enterprise-contract-mce-217 / hypershift-release-mce-217"

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: Red Hat Konflux / enterprise-contract-mce-217 / hypershift-release-mce-217

Details

In response to this:

/override "Red Hat Konflux / enterprise-contract-mce-217 / hypershift-release-mce-217"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox

Copy link
Copy Markdown
Member Author

/override ci/prow/e2e-aks
/override ci/prow/e2e-aks-4-22
/override ci/prow/e2e-aws
/override ci/prow/e2e-aws-4-22
/override ci/prow/e2e-aws-upgrade-hypershift-operator

@bryan-cox

Copy link
Copy Markdown
Member Author

/override ci/prow/e2e-azure-self-managed
/override ci/prow/e2e-kubevirt-aws-ovn-reduced

@bryan-cox

Copy link
Copy Markdown
Member Author

/override ci/prow/e2e-v2-aws

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-aks, ci/prow/e2e-aks-4-22, ci/prow/e2e-aws, ci/prow/e2e-aws-4-22, ci/prow/e2e-aws-upgrade-hypershift-operator

Details

In response to this:

/override ci/prow/e2e-aks
/override ci/prow/e2e-aks-4-22
/override ci/prow/e2e-aws
/override ci/prow/e2e-aws-4-22
/override ci/prow/e2e-aws-upgrade-hypershift-operator

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-azure-self-managed, ci/prow/e2e-kubevirt-aws-ovn-reduced

Details

In response to this:

/override ci/prow/e2e-azure-self-managed
/override ci/prow/e2e-kubevirt-aws-ovn-reduced

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-v2-aws

Details

In response to this:

/override ci/prow/e2e-v2-aws

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox

Copy link
Copy Markdown
Member Author

/override ci/prow/e2e-aks
/override ci/prow/e2e-aks-4-22
/override ci/prow/e2e-aws
/override ci/prow/e2e-aws-4-22
/override ci/prow/e2e-aws-upgrade-hypershift-operator

@bryan-cox

Copy link
Copy Markdown
Member Author

/override ci/prow/e2e-azure-self-managed
/override ci/prow/e2e-kubevirt-aws-ovn-reduced

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-aks, ci/prow/e2e-aks-4-22, ci/prow/e2e-aws, ci/prow/e2e-aws-4-22, ci/prow/e2e-aws-upgrade-hypershift-operator

Details

In response to this:

/override ci/prow/e2e-aks
/override ci/prow/e2e-aks-4-22
/override ci/prow/e2e-aws
/override ci/prow/e2e-aws-4-22
/override ci/prow/e2e-aws-upgrade-hypershift-operator

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-azure-self-managed, ci/prow/e2e-kubevirt-aws-ovn-reduced

Details

In response to this:

/override ci/prow/e2e-azure-self-managed
/override ci/prow/e2e-kubevirt-aws-ovn-reduced

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox

Copy link
Copy Markdown
Member Author

/override ci/prow/e2e-v2-aws

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-v2-aws

Details

In response to this:

/override ci/prow/e2e-v2-aws

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox

Copy link
Copy Markdown
Member Author

/override Red Hat Konflux / enterprise-contract-mce-217 / hypershift-release-mce-217

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: /override requires failed status contexts, check run or a prowjob name to operate on.
The following unknown contexts/checkruns were given:

  • /
  • Hat
  • Konflux
  • Red
  • enterprise-contract-mce-217
  • hypershift-release-mce-217

Only the following failed contexts/checkruns were expected:

  • CodeRabbit
  • ci/prow/e2e-aks
  • ci/prow/e2e-aks-4-22
  • ci/prow/e2e-aws
  • ci/prow/e2e-aws-4-22
  • ci/prow/e2e-aws-upgrade-hypershift-operator
  • ci/prow/e2e-azure-self-managed
  • ci/prow/e2e-kubevirt-aws-ovn-reduced
  • ci/prow/e2e-v2-aws
  • ci/prow/images
  • ci/prow/okd-scos-images
  • ci/prow/security
  • ci/prow/verify-deps
  • pull-ci-openshift-hypershift-main-e2e-aks
  • pull-ci-openshift-hypershift-main-e2e-aks-4-22
  • pull-ci-openshift-hypershift-main-e2e-aws
  • pull-ci-openshift-hypershift-main-e2e-aws-4-22
  • pull-ci-openshift-hypershift-main-e2e-aws-upgrade-hypershift-operator
  • pull-ci-openshift-hypershift-main-e2e-azure-self-managed
  • pull-ci-openshift-hypershift-main-e2e-kubevirt-aws-ovn-reduced
  • pull-ci-openshift-hypershift-main-e2e-v2-aws
  • pull-ci-openshift-hypershift-main-images
  • pull-ci-openshift-hypershift-main-okd-scos-images
  • pull-ci-openshift-hypershift-main-security
  • pull-ci-openshift-hypershift-main-verify-deps
  • tide

If you are trying to override a checkrun that has a space in it, you must put a double quote on the context.

Details

In response to this:

/override Red Hat Konflux / enterprise-contract-mce-217 / hypershift-release-mce-217

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@bryan-cox

Copy link
Copy Markdown
Member Author

/override "Red Hat Konflux / enterprise-contract-mce-217 / hypershift-release-mce-217"

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: /override requires failed status contexts, check run or a prowjob name to operate on.
The following unknown contexts/checkruns were given:

  • Red Hat Konflux / enterprise-contract-mce-217 / hypershift-release-mce-217

Only the following failed contexts/checkruns were expected:

  • CodeRabbit
  • ci/prow/e2e-aks
  • ci/prow/e2e-aks-4-22
  • ci/prow/e2e-aws
  • ci/prow/e2e-aws-4-22
  • ci/prow/e2e-aws-upgrade-hypershift-operator
  • ci/prow/e2e-azure-self-managed
  • ci/prow/e2e-kubevirt-aws-ovn-reduced
  • ci/prow/e2e-v2-aws
  • ci/prow/images
  • ci/prow/okd-scos-images
  • ci/prow/security
  • ci/prow/verify-deps
  • pull-ci-openshift-hypershift-main-e2e-aks
  • pull-ci-openshift-hypershift-main-e2e-aks-4-22
  • pull-ci-openshift-hypershift-main-e2e-aws
  • pull-ci-openshift-hypershift-main-e2e-aws-4-22
  • pull-ci-openshift-hypershift-main-e2e-aws-upgrade-hypershift-operator
  • pull-ci-openshift-hypershift-main-e2e-azure-self-managed
  • pull-ci-openshift-hypershift-main-e2e-kubevirt-aws-ovn-reduced
  • pull-ci-openshift-hypershift-main-e2e-v2-aws
  • pull-ci-openshift-hypershift-main-images
  • pull-ci-openshift-hypershift-main-okd-scos-images
  • pull-ci-openshift-hypershift-main-security
  • pull-ci-openshift-hypershift-main-verify-deps
  • tide

If you are trying to override a checkrun that has a space in it, you must put a double quote on the context.

Details

In response to this:

/override "Red Hat Konflux / enterprise-contract-mce-217 / hypershift-release-mce-217"

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@hypershift-jira-solve-ci

Copy link
Copy Markdown
Contributor

AI Test Failure Analysis

Job: pull-ci-openshift-hypershift-main-e2e-aks | Build: 2044418802577313792 | Cost: $1.94338025 | Failed step: hypershift-azure-run-e2e

View full analysis report


Generated by hypershift-analyze-e2e-failure post-step using Claude claude-opus-4-6

@hypershift-jira-solve-ci

hypershift-jira-solve-ci Bot commented Apr 15, 2026 •

Copy link
Copy Markdown
Contributor

This confirms the PR only changes documentation files, a Makefile target, a verify script, and a Karpenter test file — none of which affect DNS, networking, or cluster creation. The failure is clearly an Azure ExternalDNS infrastructure issue, not caused by the PR.

Now I have all the evidence. Here's the final report:

Test Failure Analysis Complete

Job Information

  • Prow Job: pull-ci-openshift-hypershift-main-e2e-aks
  • Build ID: 2044418802577313792
  • Target: e2e-aks
  • Job Type: presubmit
  • Cluster: build01
  • PR: #8248 — CNTRLPLANE-3254: Sort how-to guides alphabetically and add CI enforcement
  • Duration: ~1h1m (14:04–15:15 UTC)
  • Failed Step: e2e-aks-hypershift-azure-run-e2e

Test Failure Analysis

Error

ExternalDNSReachable=False: ExternalDNSHostNotReachable(lookup api-*.aks-e2e.hypershift.azure.devcluster.openshift.com on 10.0.0.10:53: no such host)

Available=False: KASLoadBalancerNotReachable(dial tcp: lookup api-*.aks-e2e.hypershift.azure.devcluster.openshift.com: no such host)

Failed to wait for a successful connection to the guest API server in 10m0s: context deadline exceeded

Summary

All 7 Azure-platform e2e tests failed because ExternalDNS did not create DNS A/CNAME records in the aks-e2e.hypershift.azure.devcluster.openshift.com Azure DNS zone. Every hosted cluster's API endpoint was unresolvable (no such host), preventing the test framework from connecting to the guest API servers. This triggered a cascade: no API connectivity → no worker nodes could join → cluster operators remained unavailable → ClusterVersion stuck progressing. The 2 tests that do NOT depend on ExternalDNS (TestHAEtcdChaos using platform None, and TestCreateClusterDefaultSecurityContextUID which only validates UIDs) both passed, confirming DNS is the sole issue. The PR only modifies documentation files, a Makefile, a verify script, and a Karpenter test — none of which affect DNS or cluster creation. This is an infrastructure flake, not a code regression.

Root Cause

The ExternalDNS controller on the AKS management cluster failed to register DNS records for all 7 hosted clusters created during the e2e test run. The specific mechanism is:

  1. HostedClusters were created successfully — all 7 clusters were provisioned in ~2-3 minutes each, with role assignments created and kubeconfig secrets published.

  2. ExternalDNS did not create DNS A/CNAME records — after cluster creation, the HyperShift operator expects ExternalDNS to register api-<cluster-name>.aks-e2e.hypershift.azure.devcluster.openshift.com records pointing to the KAS load balancer. These records were never created.

  3. DNS resolution failed from both the test pod (172.30.0.10:53) and the management cluster (10.0.0.10:53) — confirming the records don't exist in the Azure DNS zone, not just a local DNS cache issue.

  4. Cascade of failures — without DNS resolution:

    • KAS load balancer health checks failed (KASLoadBalancerNotReachable)
    • Guest API server connections timed out after 10 minutes
    • No worker nodes could join the cluster (NoWorkerNodesAvailable)
    • Cluster operators requiring worker nodes (console, dns, image-registry, ingress, etc.) remained unavailable
    • ClusterVersion was stuck progressing

This is an Azure ExternalDNS infrastructure issue — either the ExternalDNS pod was not running, its Azure credentials expired, or there was an Azure DNS zone API issue. The PR changes (docs, Makefile, verify script, karpenter test) have zero overlap with DNS, networking, or cluster provisioning code paths.

Recommendations
  1. Re-trigger the job — /test e2e-aks. This is an infrastructure flake unrelated to the PR changes.

  2. If failure persists, investigate the ExternalDNS deployment on the AKS management cluster:

    • Check if the external-dns pod is running and healthy
    • Verify Azure DNS zone credentials have not expired
    • Check Azure DNS zone aks-e2e.hypershift.azure.devcluster.openshift.com for recent record creation failures
    • Review ExternalDNS pod logs for Azure API errors
  3. No code changes needed — the PR only modifies docs/, Makefile, hack/verify-docs-nav-order.py, and test/e2e/karpenter_test.go, none of which affect DNS functionality.

Evidence
Evidence Detail
Failed tests 7/7 Azure-platform tests: TestCreateCluster, TestCreateClusterCustomConfig, TestAutoscaling, TestUpgradeControlPlane, TestNodePool/HostedCluster0, TestNodePool/HostedCluster2, TestAzureScheduler
Passed tests TestHAEtcdChaos (platform: None, no DNS needed), TestCreateClusterDefaultSecurityContextUID (UID validation only)
Error pattern All failures show identical ExternalDNSHostNotReachable + KASLoadBalancerNotReachable conditions
DNS domains api-autoscaling-4tckt, api-create-cluster-x9md5, api-custom-config-r8gr9, api-node-pool-ghk6b, api-node-pool-76tkw, api-azure-scheduler-h526z, api-control-plane-upgrade-gwpc4 — all under aks-e2e.hypershift.azure.devcluster.openshift.com
DNS servers queried 172.30.0.10:53 (test pod) and 10.0.0.10:53 (management cluster) — both return no such host
Cluster creation All clusters created successfully in 2-3 minutes, kubeconfig secrets published
API connectivity timeout 10 minutes per cluster, all timed out
PR files changed Makefile, docs/content/contribute/contribute-docs.md, docs/content/reference/aggregated-docs.md, docs/mkdocs.yml, hack/verify-docs-nav-order.py, test/e2e/karpenter_test.go
Failed step e2e-aks-hypershift-azure-run-e2e (25m32s)
Pre-phase All pre steps passed (aks-provision, hypershift-install, etc.)
CI analyzer In-cluster hypershift-analyze-e2e-failure step confirmed same root cause

@cwbotbot

Copy link
Copy Markdown

Test Results

e2e-aks

Failed Tests

Total failed tests: 15

  • TestAutoscaling
  • TestAutoscaling/ValidateHostedCluster
  • TestAzureScheduler
  • TestAzureScheduler/ValidateHostedCluster
  • TestCreateCluster

... and 10 more failed tests

1 similar comment
@cwbotbot

Copy link
Copy Markdown

Test Results

e2e-aks

Failed Tests

Total failed tests: 15

  • TestAutoscaling
  • TestAutoscaling/ValidateHostedCluster
  • TestAzureScheduler
  • TestAzureScheduler/ValidateHostedCluster
  • TestCreateCluster

... and 10 more failed tests

@bryan-cox

Copy link
Copy Markdown
Member Author

/override ci/prow/e2e-aks-4-22
/override ci/prow/e2e-aks

@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-aks, ci/prow/e2e-aks-4-22

Details

In response to this:

/override ci/prow/e2e-aks-4-22
/override ci/prow/e2e-aks

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@cwbotbot

Copy link
Copy Markdown

Test Results

e2e-aks

Failed Tests

Total failed tests: 15

  • TestAutoscaling
  • TestAutoscaling/ValidateHostedCluster
  • TestAzureScheduler
  • TestAzureScheduler/ValidateHostedCluster
  • TestCreateCluster

... and 10 more failed tests

@openshift-merge-bot
openshift-merge-bot Bot merged commit f059233 into openshift:main Apr 15, 2026
31 of 32 checks passed
@bryan-cox
bryan-cox deleted the fix-docs-formatting branch April 15, 2026 15:40
@openshift-ci

openshift-ci Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@hypershift-jira-solve-ci

Copy link
Copy Markdown
Contributor

AI Test Failure Analysis

Job: pull-ci-openshift-hypershift-main-e2e-azure-self-managed | Build: 2044422328271507456 | Cost: $2.2524412500000004 | Failed step: hypershift-azure-run-e2e-self-managed

View full analysis report


Generated by hypershift-analyze-e2e-failure post-step using Claude claude-opus-4-6

This branch was successfully deployed

1 active deployment
docs-preview — fd1ede34 Deployed Apr 15, 2026 by bryan-cox via Deploy Preview #159
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. area/ci-tooling Indicates the PR includes changes for CI or tooling area/documentation Indicates the PR includes changes for documentation area/testing Indicates the PR includes changes for e2e testing jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants