Skip to content

feat(ci): onboard GB200 AWS UAT reservation#1774

Merged
njhensley merged 4 commits into
NVIDIA:mainfrom
njhensley:ci/uat-gb200-onboarding
Jul 16, 2026
Merged

feat(ci): onboard GB200 AWS UAT reservation#1774
njhensley merged 4 commits into
NVIDIA:mainfrom
njhensley:ci/uat-gb200-onboarding

Conversation

@njhensley

Copy link
Copy Markdown
Member

Summary

Onboard the aws-gb200 UAT reservation (cross-account GB200 Capacity Block) and generalize the AWS UAT pipeline to select test configs by <accelerator>-<intent>.

Motivation / Context

The AWS UAT pipeline hardcoded h100-<intent>-config.yaml and a fixed account, so it could only run the standard-tenancy H100 reservation. GB200 capacity lives in a separate tenancy (a time-bounded Capacity Block), so enabling it requires both per-accelerator test-config selection and cross-account role assumption.

Fixes: N/A
Related: #1274

Type of Change

  • New feature (non-breaking change that adds functionality)
  • Build/CI/tooling

Component(s) Affected

  • Other: UAT CI pipeline (.github/workflows/uat-*.yaml), reservation registry (infra/uat/reservations.yaml, pkg/uatbroker), UAT test configs (tests/uat/aws)

Implementation Notes

  • New reservation aws-gb200 in infra/uat/reservations.yaml: cross-account GB200 Capacity Block, opted out of the nightly batch (nightly-intents: []) during bring-up — manual dispatch only via uat-run.yaml.
  • New tests/uat/aws/cluster-config-gb200.yaml: Local-Zone, arm64/Grace, Capacity-Block EKS cluster; deployment.tenancy: 897722687756.
  • New tests/uat/aws/tests/gb200-training-config.yaml: mirrors the H100 training config; platform: kubeflow is load-bearing so the NCCL validators launch via the tolerated Kubeflow Trainer on the all-tainted cluster.
  • Per-accelerator test-config selection: the AWS pipeline now resolves TEST_CONFIG as <accelerator>-<intent>-config.yaml; accelerator is plumbed from the reservation through uat-run.yaml.
  • Account derived, not supplied: AWS_ACCOUNT_ID is now read from the cluster-config's .deployment.tenancy (the single source of truth) and exported to $GITHUB_ENV, instead of being a caller input. This makes it impossible to assume the OIDC role into a different account than the one being provisioned — the previous design carried both an account input and a drift-check assertion; both are removed.

Testing

go test ./pkg/uatbroker/... ./tools/uat-broker/...   # ok
golangci-lint run -c .golangci.yaml ./pkg/uatbroker/... ./tools/uat-broker/...   # 0 issues
actionlint .github/workflows/uat-aws.yaml .github/workflows/uat-run.yaml   # clean (pre-existing SC2016 info note unrelated)

TestCommittedRegistryValid covers the new aws-gb200 row (cloud + nightly-intents: [] guard). The cross-account run itself validates end-to-end via a manual uat-run.yaml dispatch once the AWS account bootstrap lands (GitHub OIDC provider + role in 897722687756).

Risk Assessment

  • Low — Additive: new reservation row + configs, and a pipeline generalization that is behavior-preserving for the existing H100 row (accelerator defaults to h100, tenancy derivation yields the same 615299774277). aws-gb200 is opted out of the nightly batch, so no nightly capacity is provisioned until explicitly enrolled.

Rollout notes: Requires infra/uat-aws-account applied in account 897722687756 (GitHub OIDC provider + github-actions-role-aicr) before the first GB200 dispatch. Runs must fall inside the Capacity Block's active window.

Checklist

  • Tests pass locally (make test with -race)
  • Linter passes (make lint)
  • I did not skip/disable tests to make CI green
  • I added/updated tests for new functionality
  • I updated docs if user-facing behavior changed
  • Changes follow existing patterns in the codebase
  • Commits are cryptographically signed (git commit -S)

@njhensley
njhensley requested review from a team as code owners July 15, 2026 23:16
@njhensley njhensley added the theme/ci-dx CI pipelines, developer experience, and build tooling label Jul 15, 2026
@njhensley njhensley self-assigned this Jul 15, 2026
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: a5f366a6-8b72-4736-8623-aa55d07df53e

📥 Commits

Reviewing files that changed from the base of the PR and between 2536a45 and 397f9c4.

📒 Files selected for processing (1)
  • tests/uat/aws/cluster-config-gb200.yaml

📝 Walkthrough

Walkthrough

The UAT AWS workflow now accepts an accelerator, selects matching test configurations, derives the AWS account from cluster tenancy, and builds platform-specific images. The UAT runner forwards accelerator data from reservations. A new aws-gb200 reservation, EKS cluster configuration, and GB200 training configuration add capacity-block infrastructure and staged validation settings. Registry tests verify the reservation and its nightly-batch opt-out.

Estimated code review effort: 4 (Complex) | ~45 minutes

Suggested labels: area/docs

Suggested reviewers: mchmarny

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the main change of onboarding the GB200 AWS UAT reservation, though it omits the pipeline generalization.
Description check ✅ Passed The description clearly describes the GB200 reservation and AWS UAT pipeline updates.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/uat-aws.yaml (1)

121-121: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Export tenancy before the config guard. TEST_CONFIG is checked before AWS_ACCOUNT_ID is written to GITHUB_ENV, so a missing accelerator/intent config can stop the teardown-only daytime-down path before it can assume the role. Derive and export tenancy first, and skip the TEST_CONFIG existence check for daytime-down.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/uat-aws.yaml at line 121, Update the workflow setup around
TEST_CONFIG to derive and export AWS_ACCOUNT_ID before validating the
configuration file. Bypass the TEST_CONFIG existence guard when inputs.intent is
daytime-down, while retaining the existing guard for other intents so teardown
can assume the role without a test config.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.github/workflows/uat-aws.yaml:
- Line 121: Update the workflow setup around TEST_CONFIG to derive and export
AWS_ACCOUNT_ID before validating the configuration file. Bypass the TEST_CONFIG
existence guard when inputs.intent is daytime-down, while retaining the existing
guard for other intents so teardown can assume the role without a test config.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 3f5f75a0-7418-4a0b-8019-0b91102bd884

📥 Commits

Reviewing files that changed from the base of the PR and between 19ee39a and ace4ff5.

📒 Files selected for processing (1)
  • .github/workflows/uat-aws.yaml

@mchmarny mchmarny left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The cross-account wiring is coherent, but two runtime paths remain blocked: main-cell images do not match the GB200 worker architecture, and teardown can fail before account discovery. Required CI is green, but it does not exercise either path.

workers:
- name: gpu-worker
instanceType: p6e-gb200.36xlarge
architecture: arm64 # GB200 = Grace/arm64 (arm64 Ubuntu EKS AMI)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

blocker: This makes the GPU workers arm64, but the AWS main cell builds the snapshot-agent image only for linux/amd64, and the new test config pins that agent to this gpu-worker pool. The pod cannot start, so the default main UAT path fails before recipe generation. Build and push arm64/multi-arch images here, and verify the validator images scheduled on GPU workers support arm64 too.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Addressed. Main-cell image builds are now arch-aware via a new BUILD_PLATFORMS job env — linux/amd64,linux/arm64 for GB200, linux/amd64 for h100 (so the common nightly path skips the QEMU cross-build).

  • Snapshot-agent: ko build --platform="${BUILD_PLATFORMS}" (Go cross-compile, emits a manifest list).
  • Validators: converted to docker buildx build --platform="${BUILD_PLATFORMS}" --push, with Set up QEMU gated on contains(env.BUILD_PLATFORMS, 'arm64') and Set up Docker Buildx.

On the validator arm64 point: the release pipeline (on-push.yaml/on-tag.yaml) already builds these exact phases (deployment/performance/conformance/aiperf-bench) for linux/amd64 linux/arm64 with an EXPECTED_PLATFORMS assertion, so the Dockerfiles are proven arm64-capable — this change applies the same multi-arch build to main cells. Release cells are unaffected (they pull the already-multi-arch released images).

Comment thread .github/workflows/uat-aws.yaml Outdated
@@ -154,7 +167,20 @@ jobs:
if [[ ! -f "${TEST_CONFIG}" ]]; then

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

blocker: This guard runs for daytime-down and before AWS_ACCOUNT_ID is exported below. If the accelerator/intent config is absent, the job fails before teardown re-authentication can construct the role ARN, potentially leaving the cluster and Capacity Block in use. Derive/export tenancy first, and skip the TEST_CONFIG existence check for daytime-down.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Addressed in the "Validate inputs" step. AWS_ACCOUNT_ID is now derived from .deployment.tenancy and exported to $GITHUB_ENV first, before any lifecycle-specific gate can exit — so daytime-down teardown can always construct the role ARN and re-authenticate. The TEST_CONFIG existence check is now guarded with [[ "${LIFECYCLE}" != "daytime-down" && ! -f "${TEST_CONFIG}" ]], so a missing/absent config no longer fails the job before teardown and can no longer strand the cluster + Capacity Block.

Add the aws-gb200 reservation row (cross-account GB200 Capacity Block),
its EKS cluster-config and Kubeflow training test-config, and generalize
the AWS UAT pipeline's test-config selection from h100-<intent> to
<accelerator>-<intent> so per-accelerator configs are picked up.

Derive AWS_ACCOUNT_ID from the cluster-config's .deployment.tenancy
rather than a caller-supplied input: the OIDC role can only be assumed
into the account being provisioned, removing the two-source drift risk
that a separate account input carried.

Signed-off-by: Nathan Hensley <nhensley@nvidia.com>
Address review on NVIDIA#1774.

- Derive+export AWS_ACCOUNT_ID (from .deployment.tenancy) before any
  lifecycle gate, and skip the TEST_CONFIG existence check for
  daytime-down, so a missing config can't block teardown re-auth and
  strand the Capacity Block.
- Build main-cell images (snapshot-agent via ko, validators via buildx)
  for BUILD_PLATFORMS: multi-arch amd64+arm64 for GB200 (arm64 GPU pool),
  single-arch amd64 for h100. QEMU is set up only when cross-building
  arm64, so the common h100 nightly path is unaffected.

Signed-off-by: Nathan Hensley <nhensley@nvidia.com>
@njhensley
njhensley force-pushed the ci/uat-gb200-onboarding branch from ace4ff5 to 2536a45 Compare July 16, 2026 16:19

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/uat/aws/cluster-config-gb200.yaml`:
- Around line 19-23: Update the cross-account comment in the deployment
configuration to remove the stale reference to the reservations.yaml account
field. Keep the guidance that the pipeline derives the account from
.deployment.tenancy and preserve the existing tenancy value and prerequisite
details.
🪄 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 4cea57a8-c1ea-4d03-9621-f8d6391e6820

📥 Commits

Reviewing files that changed from the base of the PR and between ace4ff5 and 2536a45.

📒 Files selected for processing (6)
  • .github/workflows/uat-aws.yaml
  • .github/workflows/uat-run.yaml
  • infra/uat/reservations.yaml
  • pkg/uatbroker/registry_test.go
  • tests/uat/aws/cluster-config-gb200.yaml
  • tests/uat/aws/tests/gb200-training-config.yaml

Comment thread tests/uat/aws/cluster-config-gb200.yaml Outdated
njhensley and others added 2 commits July 16, 2026 13:42
The aws-gb200 reservation carries no account field; the AWS pipeline
derives AWS_ACCOUNT_ID from .deployment.tenancy, the single source of
truth. Correct the cross-account header note accordingly (CodeRabbit).

Signed-off-by: Nathan Hensley <nhensley@nvidia.com>
@njhensley
njhensley requested a review from mchmarny July 16, 2026 20:54
@njhensley
njhensley merged commit 2f6367b into NVIDIA:main Jul 16, 2026
36 checks passed
@njhensley
njhensley deleted the ci/uat-gb200-onboarding branch July 16, 2026 20:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/ci area/infra area/tests size/L theme/ci-dx CI pipelines, developer experience, and build tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants