MOC 2.0 · Platform State

Open Accelerator
updated —

At a glance

From — and —

i What this is

WhatEight roll-ups computed from the cluster records further down the page.

WhyThe platform's state is spread across five repositories, so a reader needs one place that says how big it is. Every number here is derived from the detail below rather than typed in, because a hand-maintained total drifts from the thing it summarises the first time anyone edits one and not the other.

Look forTiles labelled partial. That means a figure is incomplete, not that it is small — a value no source records is excluded from the total rather than counted as zero.

Architecture

i What this is

WhatThe connection map: identity sources, AWS, the edge, the hubs, the workload clusters and storage.

WhyTwo constraints shaped this. Hardware was scarce — a third of the GPUs failed before the build started — so rather than spend three machines on a control plane per cluster, every workload cluster's control plane runs as pods on a shared hub. And the identity provider sits outside the data centre, because the thing that lets you log in must not depend on the thing you log in to fix. The diagram exists to make both visible at once.

Look forBoxes marked NO LINKS IN SOURCES — real components whose connections nothing records, drawn unconnected rather than wired up by guesswork. Also any ?, and the absence of control-plane nodes on the workload clusters: that absence is the architecture working.

Clusters

i What this is

WhatEach cluster as declared in Git — node pools, components, tenant projects, isolation tiers, VLANs and machines.

WhyUnder hosted control planes a workload cluster owns only worker nodes. Its API server, etcd and scheduler are pods in a clusters-<name> namespace on its hub, which is why a workload cluster's size is a node-pool count and its control plane appears in the hub's namespace list instead. Hubs are ordinary clusters and do have their own nodes, but they are installed by a different route and so are declared in a different repository.

Look forGPU counts marked needs data; the source line under a hub's node count; and whether the node-pool replicas in oac-apps agree with the machine inventory — two independent sources counting the same thing.

Timeline

i What this is

WhatProgramme phases from 2026-07-08 to 2026-09-19, against the September 1 deadline.

WhyThe deadline was fixed and the hardware came from decommissioning the previous platform, so building could not begin until the old cloud was switched off. That sequencing is why the shape looks the way it does: roughly six weeks of deciding, then about twelve days of building.

Look forBars still running to the right edge — work that never landed inside the window, which is where the next phase inherits its risk.

2026-07-08 → 2026-09-19

Diamonds are milestones.

i

WhatProgramme phases as bars, milestones as diamonds, against the deadline.

WhyDates are curated, since no repository records when a phase began. The value is the proportion: how little of the window was spent building.

Look forBars that cross the deadline line and keep going.

Decisions

RFC status from the tracker.

i What this is

WhatRFC status derived from issue state, and the log of decisions already taken with the alternative each one beat.

WhySeveral decisions were explicitly provisional — hosting identity in a commercial AWS account was recorded as a pilot, with compliance to be worked out later. A decision recorded without its rejected alternative cannot be re-evaluated when the constraints change, and the constraints are about to change, so both halves are kept.

Look forItems sitting in Under review with old dates, and decisions whose stated rationale was time-boxed rather than permanent.

Decision log

i

WhatDecisions already taken, newest first, each with the alternative it beat.

WhyHand-maintained, because a decision and its rejected option live in issue prose, not in any structured field. Every row cites an issue number that the generator verifies exists, so the citations cannot rot silently.

Look forThe Instead of column — that is the thing to revisit when a constraint changes.

Activity

i What this is

WhatIssues opened and closed each week in the tracker.

WhyIssue flow is the only continuous record of where effort actually went; the repositories show what was built but not what it cost to decide. The July spike is requirements work, not building.

Look forWeeks where opened far exceeds closed. Roughly two thirds of the tracker is still open, and that backlog is where the compliance work now lives.

Issues per week

i

WhatIssues opened and closed per week, from issue timestamps.

WhyDerived directly from created_at and closed_at, so it cannot disagree with the tracker.

Look forThe gap between the two bars, week by week.

Opened Closed

Recent issues

i

WhatThe most recently updated issues in the tracker.

WhyThe weekly chart shows volume; this shows what is being touched right now, which is a different question.

Look forCompliance-labelled work entering the list, and long-open items resurfacing.

Recently updated issues

i

WhatIssues that have been discussed — at least one comment after the issue was opened — ordered by the date of the most recent comment, with a summary of where the thread has got to.

WhyThe list above shows what was touched; an issue's updated_at moves for a label change. A comment means someone said something, and the argument is usually in the comments rather than the issue body. The comment count, participants and latest comment are extracted mechanically; the summary is written by a person, because what a thread means cannot be derived from it. An entry with no summary shows the raw last comment and says so.

Look forThreads where the last word is a question, issues closed while the underlying work is still described as unfinished, and long threads whose latest comment is old.

Discoveries

i What this is

WhatDefects and surprises found during the build, with current status, each citing an issue.

WhyThe expensive failures were consequences of the architecture rather than faults in it. Consolidating control planes onto hubs moved the scheduler out of the workload cluster — and took the metric the invoices are built from with it. Keeping these listed is what stops a decision's cost from being forgotten once the decision looks settled.

Look forAnything still Open, especially serious or critical, and whether a fix created its own follow-on problem.

Known platform defects

i

WhatHyperShift defects the team hit while deploying, parsed from oac-apps/docs/hypershift-issues.md.

WhyThese are faults in the platform rather than in the configuration, so they are recorded in the repository by the people who hit them. Keeping them visible turns a repeated debugging session into a checklist, and gives the vendor a reproducible list.

Look forDefects that touch anything you are about to change — certificates, ingress publishing and agent lifecycle account for most of them.

Tenant projects

i What this is

WhatEvery tenant project across all clusters: who asked for it, what it is for, which groups hold edit on it, and the quota it runs under.

WhyA project is the unit of tenancy — it is a namespace, a quota, a limit range, a network policy and a set of RoleBindings created together by the user-projects chart from one entry in a values file. Because that entry is in Git, who requested a project and why is recorded rather than remembered, which is also what makes the tenancy auditable.

Look forProjects whose quota is not the chart default, and the difference between the production clusters, where projects are tracked in a values file, and development, where they are created more loosely.

Identity

From moc-keycloak.

i What this is

WhatRealm settings, federated providers, per-cluster OIDC clients, groups and authentication flows, read from the Terraform.

WhyMOC serves users from many institutions it does not control, so it federates rather than holding passwords. But federation alone would let anyone with a valid university account in, so the first-broker flow links only accounts that already exist — the platform refuses unknown users by construction rather than by policy document. The realm flags are that intent expressed as configuration.

Look forClients marked no cluster — a cluster being prepared before its configuration exists. Values shown as variable, which the repository alone cannot resolve. And the realm flags: registration disabled, email login disabled, duplicate emails disallowed.

Realm

i

WhatThe Keycloak realm’s security-relevant settings.

WhyThese flags are the access policy expressed as configuration rather than as a document: registration disabled, email login disabled, duplicate emails disallowed. A policy written only in prose cannot be checked; these can.

Look forAny flag set true where you expected false, and the token and session lifespans.

Identity providers

i

WhatThe federated providers configured on the realm.

WhyFederating is how a platform serves users from institutions it does not control without ever holding their passwords — the home institution authenticates, MOC receives an assertion.

Look forSync mode, whether email is trusted, and which first-broker flow each provider runs. That flow is what decides whether an unknown user can be created.

OpenShift OIDC clients

i

WhatOne OAuth client per cluster, with its redirect URI and the secret path.

WhyEach cluster gets its own client so a credential taken from one cluster cannot be replayed against another. The secret itself stays in AWS Secrets Manager; only the reference is in Git.

Look forClients whose cluster does not exist in oac-apps — a cluster being prepared ahead of its configuration.

Groups

i

WhatGroups defined in the realm.

WhyOpenShift RBAC binds to group membership, so a tenant project’s permissions begin as a group here and are granted in the cluster by the user-projects chart.

Look forGroups that no declared project references — either an administrative role, or a project that has gone away.

Authentication flows

i

WhatEach flow and its executions, in order, with the requirement level.

WhyThe order and the requirement level are the login policy. Require Existing User First Broker Login detects an existing account and links it, with no step that creates one — which is how “only pre-registered users may log in” is enforced mechanically rather than by policy document.

Look forREQUIRED steps, and whether any flow contains a step that would create a user it has not seen before.

Hardware

i What this is

WhatEvery machine either documented in open-accelerator-infra’s hardware table or named in its Ansible inventory, with the VLANs its NICs carry, its BMC address, and whether a cluster claims it.

WhyThe cluster views only show machines that belong to a cluster, which is a minority of the fleet. The rest is the capacity question: how much idle hardware exists, how much is broken, and how much is being held for the RHOSO 18 build. A platform assembled from decommissioned hardware is defined as much by what is unusable as by what is running.

Look forMachines flagged flagged (boot failures, unreachable BMCs, disk faults) and those reserved for RHOSO 18. Also the inventory only rows: the hardware table documents the production side — rack R4PAC10 plus the prod A100s and H100s — so all eight development machines appear from the inventory alone, with no NIC or resource-class data. That is a gap in the source, not in the parser. The table records its own unknowns too: three R440s are listed as ?? R440-1 ?? and are skipped.

Networks

i What this is

WhatVLANs and switch ports from ansible-switches, joined to CIDRs from the hardware document and Terraform.

WhyA pod is attached only to the cluster network, but the storage array serves NFS and S3 on a separate, faster VLAN. That single fact forces a second network interface on every node, a proxy for object storage, and wider storage subnets — so the physical VLAN table is where an apparently abstract Kubernetes problem becomes a cabling one.

Look forVLANs carrying real ports but claimed by no declared cluster — including the MOCSEC-* set, which is the NIST environment already wired at the network layer. Also whether a storage VLAN's CIDR matches what Portworx declares; the two are maintained in different repositories.

VLANs with no declared cluster

i

WhatVLANs carrying configured switch ports that no cluster in oac-apps claims.

WhyPhysical provisioning runs ahead of cluster configuration — ports and VLANs are cut over before the Git config that uses them exists. So this list is a preview of what is being built next, visible before any cluster declares it.

Look forThe MOCSEC-* set, which is the NIST/HIPAA environment already wired at the network layer, and the OAC staging and dev-workload1 networks.

Switches

i

WhatEvery switch in the ansible-switches inventory, with its management address, network OS and fabric.

WhySwitch configuration is managed as code in the same way cluster configuration is, so the inventory is the authoritative list of what the VLAN assignments are applied to. The fabric column is what decides which VLANs may exist on a switch.

Look forThe mocsecdata and mocsecmgmt fabrics, which belong to the NIST environment rather than to OAC.

Capacity

i What this is

WhatNode pools each workload cluster declares, and the GPU count that implies.

WhyGPUs are the scarce resource and billing is by reservation rather than use, so declared capacity is the number that generates an invoice. The metric that would show real utilisation is unavailable under hosted control planes, so this section deliberately reports what was reserved and says why the other half is missing.

Look forSegments whose GPU count is unknown, and the note on the missing billing metric — the gap between reserved and used is the open policy question, and it currently cannot be measured.

Node pools per cluster

i

WhatEach workload cluster’s node pools, sized by replica count.

WhySegment order follows the pools as written in the cluster’s values file, so the picture matches the source rather than a sorted view of it.

Look forPools whose GPU count is unknown, and the totals at the right.

CPU pool GPU pool

Charts

i What this is

WhatEvery Helm chart in oac-apps and which clusters it deploys to.

WhyThere is no ordering between components. Each chart is an independent Argo CD Application that syncs in parallel, fails if its dependencies do not exist yet, and retries until they do. So where a chart lands is decided by an ACM placement label on the cluster, not by a position in a sequence — which is why the useful question is "which clusters match" rather than "what runs first".

Look forCharts marked not referenced: present in the repository but named by no ApplicationSet, so nothing deploys them.

Rebuilt daily from oac-apps, ansible-switches, open-accelerator-infra and MOC-issues.