Repository navigation
Release 0.15.0
XMC Release 0.15.0
Release Version Determination: Minor bump (
0.14.0->0.15.0).
Rationale: Promotes Pause Scheduling (pause_scheduling_enabled: true) to enabled out-of-the-box by default across Cluster Toolkit and Helm deployments (backed by Spanner schema migration013_pause_scheduling), adds Work Units table sorting and status filtering in the Web UI, fixes JobSet reconcilerSTOPPEDstatus persistence and ROD gateway routing, expands Nightly Playwright UI E2E coverage across Metrics Dashboards, ROD, and the Admin Panel, and advances behind-the-flag capabilities for Components (CMS authentication/authorization, Workload Identity,kstatusconditions, and014_component_intent_sourcemigration).
🌟 1. Public Changes (Available Out-of-the-Box)
🚀 Major Highlights & Promoted Capabilities
- [Promoted to Default] Pause Scheduling (
pause_scheduling_enabled: true): Cluster-wide workload scheduling pause and resume is now enabled out-of-the-box by default indeploy/ctk_v2/xmanager-cloud.yaml(deploy/ctk_v2/xmc-deployment-template.yaml) anddeploy/helm/values.yaml(featureFlags.pause_scheduling_enabled: true) (#1283).- Operator & User Experience: Administrators can pause and resume workload scheduling directly from the Admin Panel (
/admin) or Health Service API during cluster maintenance while researchers continue submitting experiments without disruption. While paused, the Experiments List page (/experiments) displays a global scheduling-paused banner (#1217) and the Actuator records a clearSCHEDULING_PAUSEDsystem status message on buffered work units (#1258). - Spanner Persistence & Broadcast Resilience: Added the Spanner
PauseStateandPausedTasksschema (013_pause_scheduling) and storage repositories (#1046, #1085, #1116), hardened Health Service and the Actuator broadcast listener against Redis pub/sub outages and transient Spanner read errors (#1205, #1289), and documented the end-to-end architecture and operational flows (#1264).
- Operator & User Experience: Administrators can pause and resume workload scheduling directly from the Admin Panel (
- [Action Required / Database Migrations] Spanner ESS Schema Migrations (
013&014): This release adds Spanner ESS migrations013_pause_scheduling(PauseStateandPausedTaskstables, #1085) and014_component_intent_source(request_sourcecolumn onComponentIntents, #1232). When upgrading an existing deployment, ensure Spanner migrations are applied (executed automatically by default duringdev_env.py gke-deployandgke-upgrade).
✨ New Features & Improvements
- Work Units Table Sorting & Status Filtering in Web UI: Users can now sort the Work Units table on the Experiment Details page (
/experiments/:id) by Work Unit ID, Status, Created time, and Completed time (#1251), and filter work units by status directly from the Work Units filters menu (#1252).
🐛 User-Facing Bug Fixes & Stability
- Work Units Table Reload on Experiment Navigation: Fixed an issue in the Web UI where navigating directly between different experiment detail routes did not reload the Work Units table for the newly selected experiment ID (#1260).
- ROD
batchGetSecondaryDataGateway Route Matching: Fixed the Envoy GatewayHTTPRoutefor the Resource Overview Dashboard (rod) to match the AIP-136 custom verb/v1/clusterqueues:batchGetSecondaryData, ensuring queue velocity and predictability metrics resolve reliably through the gateway (#1212). - JobSet Reconciler
STOPPEDState Ordering & Batcher Fault Isolation: Fixed the JobSet reconciler to flush and persist theSTOPPEDstatus in Spanner before releasing theJobSetprotection finalizer (#1189), added bounded backoff retries for failed batcher flushes (#1200), isolated permanent per-work-unit batcher errors via typedWorkUnitNotFoundErrorso missing work units never block status updates for sibling work units (#1201, #1202), and mapped SpannerNotFound/AlreadyExistserrors to canonicalgrpcerrsentinels (#1250).
🚀 2. Production-Ready Features Behind Feature Flags (Safe to Enable)
The following capabilities are fully developed, verified, and safe to be enabled. Their default enablement is temporarily postponed solely to align with managed solution milestones or external BYOD prerequisites.
🔹 [Flag: enable_metrics & dashboard_service_deployment_enabled] Metrics Pipeline & Dashboard Service
- How to enable:
- Metrics Ingestion: Set
enable_metrics: trueindeploy/ctk_v2/xmc-deployment-template.yaml(ormetrics.enabled: trueindeploy/helm/values.yaml). - Dashboard Service: Set
dashboard_service_deployment_enabled: trueindeploy/ctk_v2/xmc-deployment-template.yaml(ordashboardServiceDeployment.enabled: trueindeploy/helm/values.yaml). (Note: Dashboard Service requires BYOD storage devices—see the deployment README—and also requiresenable_metrics/metrics.enabledto be enabled for workload metrics data to be generated).
- Metrics Ingestion: Set
- What's New:
- Nightly Playwright UI E2E Verification for Metrics Dashboards: Added automated Playwright browser verification (
metrics_dashboard_ui_verify.py) to the Nightly E2E suite, asserting that dashboards created bymetrics_dashboard_jobandxdash_dashboardrender cleanly on/dashboardsand/dashboards/:idwith hydrated chart cards and zero runtime or HTTP errors (#1256). - Backend-Neutral Dashboard Storage Logic & Sentinel Error Mapping: Extracted dashboard chart plot construction and validation into backend-neutral storage packages (
internal/storage/data) (#1196) and mapped SpannerNotFound/AlreadyExistserrors inGetChartandDeleteChartto canonicalgrpcerrstatus codes (#1250).
- Nightly Playwright UI E2E Verification for Metrics Dashboards: Added automated Playwright browser verification (
🧪 3. In-Development / Experimental Features Behind Flags
Warning
The following capabilities are under active ongoing development, experimental, and may not yet be functional. They are available for early preview and evaluation by enabling their deployment flags in deploy/ctk_v2/xmc-deployment-template.yaml (or deploy/ctk_v2/xmanager-cloud.yaml) and Helm values.yaml.
🔹 [Flag: enable_components] Components
- How to enable: Set
enable_components: trueindeploy/ctk_v2/xmc-deployment-template.yaml(orcomponentsDeployment.enabled: trueindeploy/helm/values.yaml). - What's New:
- CMS Authentication, Mutating RPC Authorization & Request-Source Ownership: Enforced gRPC authentication and mutating RPC authorization on the Component Management Service (CMS) in ESS (#1219), configured per-RPC bearer token credentials and GKE Workload Identity bindings for
xmc-bridge(#1247), and recorded the authenticated request source as the owner of sourced component intents (014_component_intent_source, #1232). controller-runtimeBridge Architecture, Leader Election & Configurable Concurrency: Migratedxmc-bridgeto acontroller-runtimecontroller running as a single leader-elected writer (#1224, #1225), made reconcile timeout and concurrency configurable via CLI flags and Helm values (#1272), and tracked CMS sync and deactivation rechecks in memory (#1229).kstatusConditions, Finalizer Ordering & CRD Lifecycle Retention: Emitted standardkstatusReconcilingandStalledconditions alongside decoupledSyncedandReadyconditions onComponentCustom Resources (#1227, #1228), attached the CMS cleanup finalizer before executing any side effects (#1226), preserved theComponentCRD across Helm uninstalls and feature-flag flips (#1223), and added KinD E2E lifecycle tests covering blocked deactivation and finalizer cleanup (#1151, #1276).- Unified Idempotent Intent Planning & Structured
ErrorInfoRejections: Consolidated component intent writes into a single shared plan with idempotent application and a Spanner no-op fast path (#1152, #1155, #1231), and attached structuredgoogle.rpc.ErrorInforeasons to missing-dependency, cycle, and active-dependents rejections (#1230).
- CMS Authentication, Mutating RPC Authorization & Request-Source Ownership: Enforced gRPC authentication and mutating RPC authorization on the Component Management Service (CMS) in ESS (#1219), configured per-RPC bearer token credentials and GKE Workload Identity bindings for
⚙️ 4. Operational, Infrastructure & Engineering Velocity
Changes relevant to cluster operators, CI/CD, and internal architecture that do not alter the end-user interface.
- Real Upstream JobSet & Kueue Controllers in KinD E2E: Installed real upstream Kubernetes
JobSetandKueueCRDs and controllers in the KinD E2E harness, adding end-to-end verification forJobSetschema actuation,COMPLETEDandFAILEDpod terminal state transitions, and Day-2 work-unit stop, restart, and Kueue preemption flows (#1207, #1208, #1268, #1269, #1270). - Nightly MultiKueue Addon & Playwright UI E2E Suites (ROD, Admin Panel, Dashboards): Added a MultiKueue worker addon (
deploy/addons/multikueue) and nightly E2E verification (#1182), added Playwright UI E2E verifiers for the Resource Observability Dashboard (/resources, #1204), Admin Panel (/admin, #1280), and Metrics Dashboards (/dashboards, #1256), consolidated the nightly workflows, and splittools/nightly_testsintoverification/andexamples_verification/(#1206, #1253, #1261, #1266, #1286). - PostgreSQL Schema Foundation & Backend-Neutral Domain Extraction: Added canonical PostgreSQL schema files (
ess-schema.sql,xid-schema.sql) and baseline migrations (013_baseline,014_component_intent_source) (#1259, #1279), and extracted backend-neutral domain orchestration out of Spanner storage packages intointernal/experiment,internal/workunit,internal/storage/data, andcmd/rod_data_provider(#1187, #1195, #1196, #1218, #1222, #1249, #1281, #1282, #1285). - Completion of Pure OSS Bazel & Import Path Normalization: Removed
compat.bzl,internal/compat/status,third_party/xmanager_cloudproto prefixes, customprotocgenrules, andgo_default_librarytarget suffixes across all Go packages, protobuf definitions, Python SDKs, and Angular UI imports (app/*andapp/protos) (#1166, #1167, #1168, #1169, #1175, #1176, #1190, #1197, #1198, #1199, #1209, #1210, #1213, #1214, #1215, #1221, #1262). - Actuator Builder Decomposition, Affected-Test Runner & CI Governance: Decomposed Actuator
jobset.gointo dedicated container, network, coordinator, policy, and CRUD lifecycle builders (#1128, #1129, #1130), addedtools/run_affected_tests.pywith Bazelrdepstest-scope resolution for local pre-commit and CI backend test execution (#1161, #1162, #1163, #1164), prepared E2E checks for merge-queue gating and refined incremental PR re-approval for code owners (#1192, #1265, #1290), and updated the CTK Spanner schema applier to locate the workspace root viaMODULE.bazel(#1271).