Skip to content

Basic support for the GPU/batch/inference ecosystem (37 kinds)#880

Open
nadaverell wants to merge 1 commit into
mainfrom
feature/gpu-ecosystem-breadth
Open

Basic support for the GPU/batch/inference ecosystem (37 kinds)#880
nadaverell wants to merge 1 commit into
mainfrom
feature/gpu-ecosystem-breadth

Conversation

@nadaverell

@nadaverell nadaverell commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

Phase 1.5 of GPU/inference support — a breadth pass over the GPU scheduling, batch, and inference-serving ecosystem, before the deeper per-tool phases. Follows #878 (merged).

What "basic support" means (per the docs-claim discipline): status badges, smart table columns, working column filters, correct drawer kind chips, sidebar grouping, and in-cluster RBAC — for 37 kinds across 12 tools. Detail views use the generic spec/status renderer; typed renderers/topology/diagnosis come with each tool's deep phase. Every status mapping was verified against upstream Go types, not guessed.

Tool Kinds
Kueue + CA ClusterQueue, LocalQueue, Workload, ResourceFlavor, AdmissionCheck, ProvisioningRequest
KubeRay RayCluster, RayJob, RayService, RayCronJob
KServe InferenceService, ServingRuntime, ClusterServingRuntime, InferenceGraph, TrainedModel, LLMInferenceService
Inference Gateway InferencePool (dual-group), InferenceObjective
Batch SIGs LeaderWorkerSet, JobSet
Volcano Job, Queue, PodGroup, JobFlow, JobTemplate
KAI Scheduler Queue, PodGroup
KAITO Workspace, RAGEngine
NVIDIA NIM NIMService, NIMCache, NIMPipeline
AMD GPU Operator DeviceConfig
Kubeflow training PyTorchJob, TFJob, MPIJob, TrainJob

Collision work (the hard part):

  • Volcano Job shares the jobs plural with batch/v1 — the core JobRenderer line is apiVersion-gated and Volcano CRs fall through to GenericRenderer via the established Crossplane-collision pattern
  • Volcano vs KAI Queue/PodGroup and KAITO Workspace disambiguate by group in table columns (GROUP_QUALIFIED_COLUMN_KEYS), status badges, and filter values
  • 5 dispatch tests pin these routings

Discovery fix (found by the visual test): bare-plural name resolution (/api/resources/clusterqueues without a group, MCP list_resources with a bare kind) resolved to Kueue's aggregated visibility API — a get-only resource shadowing the real plural — because ties across groups went to whichever resource discovery enumerated first. indexResourceLocked now prefers list+watch-capable resources before the existing non-CRD/stability rules; regression test pins both enumeration orders. This generalizes to any aggregated API shadowing a kind's plural.

Multi-version tolerance: Kueue v1beta1↔v1beta2 (cohort/cohortName rename handled), MPIJob v1↔v2beta1, LLMInferenceService v1alpha1↔v1alpha2, InferencePool v1 (spec.endpointPickerRef, status.parents) ↔ v1alpha2 (spec.extensionRef, status.parent — the singular json tag is a real upstream quirk).

Helm chart: 12 new rbac.crdGroups toggles + ClusterRole rules so in-cluster installs can list these groups. No supportedCRDFallbacks warmup entries — these kinds arrive via normal CRD discovery; warmup is reserved for first-class integrations.

Verified: make tsc, Go tests (incl. chart-RBAC guard), 560 frontend tests, helm lint — plus a live visual test on EKS with real Kueue, Volcano, JobSet, KubeRay, and Kubeflow training-operator installed: real Kueue admission rendered end-to-end (suspended Job → Workload admitted → Finished), Volcano↔batch Job collision verified in tables and drawer, Volcano vs KAI queue twins resolve independently, KServe Ready vs BlockedByFailedLoad badges. 10 screenshots + details in the PR comment below.


Note

Medium Risk
Large surface area of new status/column logic and discovery precedence changes; RBAC broadens read access to many CRD groups by default on Helm installs.

Overview
Adds basic browsing support for 37 CRDs across the GPU scheduling, batch, and inference stack (Kueue, KubeRay, KServe, Inference Gateway, JobSet/LWS, Volcano, KAI, KAITO, NIM, AMD GPU, Kubeflow training).

The UI gains per-kind table columns, status badges, and column filters via new resource-utils-* modules and cell renderers wired through ResourcesView and ResourceRendererDispatch. Colliding plurals (jobs, queues, podgroups, workloads, workspaces) are disambiguated by API group in tables, filters, and drawer routing (e.g. Volcano Job skips the core JobRenderer and uses the generic spec/status view).

Helm adds 12 default-on rbac.crdGroups toggles and matching ClusterRole rules; docs/README document the integration scope.

Backend discovery now prefers resources that support list+watch when the same plural is shadowed by a get-only aggregated API (Kueue clusterqueues vs visibility API), with a regression test.

Reviewed by Cursor Bugbot for commit 6ceb11d. Bugbot is set up for automated code reviews on this repo. Configure here.

@nadaverell nadaverell requested a review from hisco as a code owner June 7, 2026 16:18
Base automatically changed from feature/gpu-dra-nvidia to main June 7, 2026 19:01
@nadaverell nadaverell force-pushed the feature/gpu-ecosystem-breadth branch from a273682 to e607b26 Compare June 7, 2026 19:01
@nadaverell

Copy link
Copy Markdown
Contributor Author

Visual test results (live on radar-test-nonprod with real operators — Kueue, Volcano, JobSet, KubeRay, Kubeflow training-operator installed; faked CRs for the operator-less tools):

  • Real Kueue admission flow rendered end-to-end: suspended Job → Workload admitted → Finished, with queue/admitted-by columns
  • Volcano↔batch Job collision verified live: separate tables, separate columns, drawer shows Volcano-routed status badge + GenericRenderer body
  • Volcano vs KAI Queues resolve independently (real controller queues + fixture hierarchy queues)
  • KServe Ready vs BlockedByFailedLoad badges, KAITO/NIM/AMD/GIE/JobSet/LWS all serving data
  • 10 screenshots in the visual-test run; no console errors from the new code

Bug found and fixed by the test (latest commit): bare-plural name resolution (/api/resources/clusterqueues without a group, MCP list_resources with a bare kind) resolved to Kueue's aggregated visibility API — a get-only resource shadowing the real plural — because the discovery index let the first-enumerated resource win ties across groups. indexResourceLocked now prefers list+watch-capable resources before the existing non-CRD/stability rules; regression test covers both enumeration orders.

@nadaverell nadaverell force-pushed the feature/gpu-ecosystem-breadth branch from e607b26 to 077c6fc Compare June 7, 2026 19:05

@cursor cursor 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 2 total unresolved issues (including 1 from previous review).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 077c6fc. Configure here.

Status badges, smart table columns, column filters, drawer kind names,
sidebar grouping, and Helm RBAC for:

- Kueue: ClusterQueue, LocalQueue, Workload, ResourceFlavor,
  AdmissionCheck + Cluster Autoscaler ProvisioningRequest
- KubeRay: RayCluster, RayJob, RayService, RayCronJob
- KServe: InferenceService, ServingRuntime, ClusterServingRuntime,
  InferenceGraph, TrainedModel, LLMInferenceService
- Gateway API Inference Extension: InferencePool (dual-group v1 +
  v1alpha2 with shape-detected accessors), InferenceObjective
- LeaderWorkerSet, JobSet
- Volcano: Job, Queue, PodGroup, JobFlow, JobTemplate
- KAI Scheduler: Queue, PodGroup
- KAITO: Workspace, RAGEngine
- NVIDIA NIM Operator: NIMService, NIMCache, NIMPipeline
- AMD GPU Operator: DeviceConfig
- Kubeflow training: PyTorchJob, TFJob, MPIJob, TrainJob

Detail views deliberately use the generic spec/status renderer - typed
renderers, topology, and diagnosis land with the deeper per-tool phases.
All status/spec accessors verified against upstream Go types; multi-
version tolerant (Kueue v1beta1/v1beta2, MPIJob v1/v2beta1, GIE dual
group) and nil-guarded throughout.

Collision handling: Volcano Job shares the jobs plural with batch/v1 -
core JobRenderer is apiVersion-gated and the CR falls through to
GenericRenderer (Crossplane pattern); Volcano/KAI Queues + PodGroups and
KAITO Workspaces disambiguate by group via GROUP_QUALIFIED_COLUMN_KEYS
and guarded status routing. Five dispatch tests pin the collisions.
@nadaverell nadaverell force-pushed the feature/gpu-ecosystem-breadth branch from 077c6fc to 6ceb11d Compare June 7, 2026 19:18
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