Skip to content

feat(images): add repave-ready Ubuntu GB200 host access - #998

Open
Kevin Cho (chokevin) wants to merge 10 commits into
mainfrom
chokevin-gb200-ubuntu-host-image-45d
Open

Kevin Cho (chokevin) wants to merge 10 commits into
mainfrom
chokevin-gb200-ubuntu-host-image-45d

Conversation

@chokevin

@chokevin Kevin Cho (chokevin) commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Repeated GB200 repaves could boot Ubuntu but did not have a reproducible, qualified host image that restored the reviewed lab access policy. The image now bakes native cloud-init users into an ARM64 Ubuntu disk, while MetalMan fails closed before destructive replacement if Machine user-data could override those users; generic host images keep their existing user-data behavior.

  • Adds a reproducible Ubuntu 24.04 ARM64 GB200 disk producer and a dedicated access-policy derivative with pinned kernel, NVIDIA, and ssh-import-id inputs.
  • Uses native per-user ssh_import_id configuration. The intentionally keyless account remains locked without failing cloud-init.
  • Protects only the dedicated image repository from top-level users, multiple YAML documents, trailing YAML, and cloud-init templating. ConfigMap API failures remain retryable; permanent policy violations fail before power actions.
  • Preserves the generic MetalMan unbounded-metal vendor user and existing custom/templated user-data behavior for other images.
  • Extends the image workflow with native ARM64 provenance checks and an ARM64 UEFI/QEMU gate covering cloud-init, networking, SSH, valid authorized keys, MANA, NVIDIA, and the MetalMan vendor-data path.

Evidence

The 15-second recording shows the baked cloud-init policy, actual fail-closed preflight results, and the exact ARM64 disk qualification evidence.

gb200-host-access.mp4

Verification

  • Passed: go test ./internal/metalman/... ./hack/cmd/hostimage-userdata-preflight ./hack/hostimage
  • Passed: 41 GB200 producer Python tests and 3 vendor-data renderer tests
  • Passed: pinned gofumpt, shell syntax, ShellCheck, YAML parsing, and git diff --check
  • Passed: exact-commit native ARM64 OCI build and provenance checks
  • Passed: ARM64 UEFI/QEMU boot gate for 64K kernel, cloud-init final stage, systemd-networkd, SSH, MANA, NVIDIA, user creation, and valid authorized keys
  • Qualified disk SHA-256: 0afd7577f85783689755d25fc7b98d613949738e11db121210b223760a19ee81
  • Not run: repository-wide make fmt; the pinned golangci-lint cannot decode the repository's Go 1.27 export data. Changed Go files were formatted with the pinned gofumpt, and the broad MetalMan test suite passed.

Risk

The strict user-data policy is repository-scoped to ghcr.io/azure/host-ubuntu2404-gb200-hillsboro; generic images retain their prior behavior. This PR does not publish an image or mutate a Machine. Publication remains a manual, gated workflow, and any image activation or HostReplace requires a separate operational decision.

Review guide

  1. Start with internal/metalman/cloudinit/userdata.go and internal/metalman/machineops/controller.go for policy scope, error classification, and pre-side-effect validation.
  2. Review images/host-ubuntu2404-gb200-hillsboro/ for the baked user policy and deterministic boot qualification.
  3. Check .github/workflows/images.yaml and images/host-ubuntu2404-gb200/verify-boot.sh for the publish gate.
  4. Review internal/metalman/{cloudinit,machineops,netboot}/*_test.go for bypass, retry, and generic-image compatibility coverage.

AI assistance: GitHub Copilot helped implement, test, review, and draft this change; the author verified the claims, validation results, and final text.

@chokevin
Kevin Cho (chokevin) requested a review from a team October 24, 2026 05:30
path.parent.mkdir(parents=True, exist_ok=True)
path.write_bytes(value if isinstance(value, bytes) else value.encode())

def command(self, *args):

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant