Skip to content

Umbrella chart charts/ai-rm, rm-controller image, simulated-cluster e2e in CI - #20

Merged
gspark-etri merged 2 commits into
masterfrom
umbrella-chart
Oct 19, 2026
Merged

gspark-etri merged 2 commits into
masterfrom
umbrella-chart

Conversation

@gspark-etri

Copy link
Copy Markdown
Collaborator

Roadmap W2 (maturity): helm install reproduces the control path, and a sim e2e runs on every PR.

What

  • charts/ai-rm (umbrella)
    • L1: rm-accel's rm-abstract-node chart as a subchart (alias node, file:// from the components/l1-accel/rm-accel submodule; helm dependency update charts/ai-rm)
    • crds/: AcceleratorProfile CRD copied verbatim from rm-core v0.1.1 k8s/
    • L4 rm-controller: Deployment (single writer, non-root, read-only root), ConfigMap with its spec built from controller.pools + placementNamespace, ClusterRole (profiles, nodes: read) and a Role limited to airm-placement
    • airm-placement: empty v0.1 document, rendered only when the ConfigMap does not exist (lookup) and helm.sh/resource-policy: keep, so rm-controller owns it after install and upgrades don't fight it. Coexists with hetero-llm-d's airm-install.sh.
    • Example site values deploy/clusters/example/ai-rm.values.yaml; deploy/clusters/example/rm-abstract-node.values.yaml no longer carries the init-container workaround.
  • rm-controller image: packages/rm-controller/Dockerfile (python:3.11-slim, rm-core tarball, no git needed, uid 65534) + .github/workflows/rm-controller-image.yml (build+smoke on PR; push :master, and :X.Y.Z from tags rm-controller-vX.Y.Z; GITHUB_TOKEN, packages: write).
  • Simulated cluster: tools/fake_openai.py (stdlib OpenAI-compatible server: /v1/models, streaming/plain chat, completions with pd timing), tools/airm_sim.py behind tools/airm.py up-sim | e2e-sim [--no-cluster] | down-sim and make chart | up-sim | e2e-sim | down-sim.
    • up-sim: kind cluster airm-sim (control-plane + worker), builds airm/rm-accel:sim (rm-accel Dockerfile) and airm/rm-controller:sim, loads them, installs the chart with ci/sim-values.yaml (provider sim, no host access), waits for 2 profiles per node.
    • e2e-sim: kubectl exec … rm-controller --once (exit 0), reads airm-placement, asserts each pool has prefill+decode with the requested card kinds on one node, no card reused, the two pools on different nodes; runs rm-bench e2e --scenario pd-smoke against the fake pool and asserts exit 0 and slo_attainment_pct = 100 (0 errors).
    • .github/workflows/sim-e2e.yml: chart job (helm lint/template: default, example site, sim) and e2e job (unit tests, kind, make up-sim, make e2e-sim, cluster dump on failure, results artifact).
  • Docs: deploy/README.md + .ko.md (umbrella chart, simulated cluster), docs/getting-started.md + ko (section "simulated cluster"), rm-controller README/manifest.

Depends on

  • Node daemon image ghcr.io/ai-computing/rm-accel; chart 0.5.0 uses it rm-accel#8 (node image, chart 0.5.0 with hostBin). The submodule here points at that PR's head (fba24e3); after it merges, make bump COMPONENT=rm-accel (or --ref v0.4.2) to the merge commit / tag.
  • After merge: make the new ghcr packages rm-controller / rm-accel public and tag rm-controller-v0.1.0 so the chart's default controller.image.tag: 0.1.0 exists (:master is published by the merge).

Verified

  • helm lint / helm template (v3.16.4, Windows binary): default, example site and sim values pass; rendered YAML has no duplicate keys (12 objects for sim).
  • python -m pytest -q tools/tests: 17 passed (fake server endpoints/streaming, placement and bench checks incl. 8 failure cases, e2e-sim --no-cluster).
  • python tools/airm.py e2e-sim --no-cluster: 2 pools on 2 sim nodes (RNGD prefill + ATOM decode each), rm-bench pd-smoke sent=32 failed=0, ttft_p90 ≈ 20 ms, PASS.
  • rm-controller / rm-bench package tests: 12 / 26 passed. The Dockerfile install sequence was replayed in a clean venv (rm-controller --help OK).
  • tools/check_docs.py PASS, tools/check_sensitive.py . clean.
  • Docker/kind are not available on the dev host (Windows, no Docker in WSL): the kind run is verified by this PR's sim-e2e job.

🤖 Generated with Claude Code

gspark-etri and others added 2 commits October 19, 2026 18:43
…2e in CI

- charts/ai-rm: L1 node daemon (rm-accel chart as subchart from the submodule), the
  AcceleratorProfile CRD (rm-core v0.1.1), rm-controller (Deployment, spec ConfigMap, RBAC) and
  the airm-placement ConfigMap (created once, kept). Example site values in
  deploy/clusters/example/ai-rm.values.yaml; sim values in charts/ai-rm/ci/sim-values.yaml.
- packages/rm-controller/Dockerfile + rm-controller-image workflow (ghcr.io/ai-computing/rm-controller).
- tools/fake_openai.py: stdlib OpenAI-compatible stand-in for the PD pool.
- tools/airm.py up-sim / e2e-sim [--no-cluster] / down-sim (tools/airm_sim.py), make targets
  chart, up-sim, e2e-sim, down-sim; sim-e2e workflow runs them on kind.
- rm-accel submodule -> node-image branch (Dockerfile, chart 0.5.0 with hostBin).
- deploy/README, getting-started (EN/KO), rm-controller README/manifest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@gspark-etri
gspark-etri merged commit 8b53ba2 into master Oct 19, 2026
9 checks passed
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