ADR 0009 — Self-Hosted OpenShift IPI over ROSA HCP

Status: Accepted (D9, docs/deployment-plan.md, 2026-07-09). Build-discovered — this decision was not planned; it replaced a locked earlier choice mid-Phase-1.

Context

The original plan (decision D1) targeted ROSA HCP as the primary-site platform, following Red Hat’s own Cloud Experts reference deployment for OpenShift Virtualization and the fact that AWS Windows License Included for OpenShift Virtualization on ROSA targets HCP specifically (Architecture §4.1, §4.4). Two Terraform apply attempts against this sandbox account changed that plan.

First attempt failed with CLUSTERS-MGMT-400: Invalid number of compute nodes: 2. Hosted clusters require that the compute nodes be a multiple of the private subnets 3 — a mundane replicas-vs-AZ mismatch (2 replicas against a 3-AZ VPC). This result was itself useful evidence: it proved ROSA HCP enablement (OCM auth, account linking, IAM) was not the problem — the cluster create got far enough to validate real HCP-specific constraints before failing on configuration, not access.

Second attempt, after fixing the replica count, hit a harder wall: CLUSTERS-MGMT-400 billing account not linked to organization at the aws marketplace. This is an AWS Marketplace billing-link requirement that is console-only — verified no CLI/API path exists (the aws CLI has no ROSA service; the rosa CLI has no billing-accounts subcommand). This particular sandbox account had that link unset, and there was no scripted or automatable way to set it.

The pivot. Drop ROSA, install self-hosted OpenShift via IPI, which needs only AWS credentials and a pull secret (mintable from an existing OCM refresh token) — sidestepping the Marketplace billing wall entirely, since self-hosted IPI has no Marketplace-billing dependency at all. The metal worker for OpenShift Virtualization became a plain post-install MachineSet rather than a ROSA machine pool — simpler to add after IPI than as an HCP machine pool.

Result, measured. IPI installed end-to-end (3 masters + 3 workers Ready, console up) in 44m35s; the metal Machine took ~20 min separately from provision to node-Ready; the CNV operator installed in ~2 min; HyperConverged converged in ~5 min; the first test VM booted (create-to-Running) in 18s.

The general lesson. The first failed attempt (replicas-vs-AZ) proved enablement was fine; only the second attempt exposed the real platform-level gap (Marketplace billing linkage). Concluding "ROSA HCP is blocked" from the first error alone would have been wrong — it took a second, cheap terraform apply to find the actual blocker. The reusable practice: verify Marketplace/billing linkage — and AZ-vs-replica math — with a cheap apply before assuming a platform enablement gap.

Decision

Install the primary-site cluster as self-hosted OpenShift 4.20 via IPI (sym-aws.sandbox5301.opentlc.com, using openshift-install create cluster with an installer-provisioned VPC), replacing the planned ROSA HCP deployment. Add the OpenShift Virtualization metal worker as a plain post-install MachineSet (virt-metal). The infra/aws ROSA-HCP Terraform is superseded; the pattern generalizes as guidance for future infra choices in this repo: prefer a cheap apply to confirm a platform blocker before designing around it.

Consequences

Pros

  • Sidesteps the Marketplace billing wall entirely — IPI’s credential model (AWS creds + pull secret only) has no dependency on the AWS Marketplace billing-link chain that blocked ROSA HCP in this account, and that link has no CLI/API remediation path today.

  • Simpler credential/dependency chain for a PoC/reference architecture: AWS creds
    pull secret is strictly less fragile than ROSA HCP’s OCM-account + Marketplace-billing dependency chain — fewer moving parts that can independently block a from-scratch environment.

  • Measured and fast: a 44m35s full cluster install is well within the "cluster create ~40 min" expectation the project already budgets for background/loop polling; the metal worker and OpenShift Virtualization convergence add well-bounded, separately measured time on top.

  • Metal capacity is a plain MachineSet, simpler to reason about and to scale (including to zero for cost control) than a ROSA HCP machine pool.

Cons

  • Self-hosted means the project now owns cluster upgrades and SRE — control-plane lifecycle, patching, and platform operational burden that ROSA’s managed control plane exists specifically to remove. This is ROSA’s actual value proposition, and this decision gives it up for the primary site.

  • AWS Windows License Included is a ROSA-only feature — it was confirmed GA (~March 2026) specifically for OpenShift Virtualization on ROSA, bundled per-vCPU into the bare-metal EC2 cost. Self-hosted IPI forfeits this: the AWS-side Windows licensing burden reverts to BYOL, the same problem Architecture §4.4 already had to solve on the alternative (Dedicated Hosts, pre-Oct-2019 perpetual license) path.

  • This decision should be revisited if/when the AWS Marketplace billing link is established for this account — nothing about the IPI choice is permanent, and ROSA HCP’s benefits (managed control plane, native LI Windows) remain the better fit for this design once that blocker is gone.