9.9 KiB
API Server Backend Enhancement — Task Tracker
Status Legend
- Completed
- Pending
- [>] In Progress (blocked)
P0-1: Handle Cluster Config Push
-
#1 P0-1a: Add HostConfig + Cluster fields to models
models/clusters.go— AddedHeartbeatInterval,Vcpus,InactiveHeartbeatCounttoClusterInfomodels/hosts.go— This task changedHostStateStr(0)from"OK"to"UNKNOWN"; commitd7afd72e("fix front end issues") later reverted that branch, soHostStateStr(0)currently returns"OK"againmodels/clusters_test.go— New: verifies new fields serialize + existing fields unchangedmodels/hosts_test.go— New: verifiesHostStateStrfor zero, flags, non-flag, combined- All 15 tests passing
-
#2 P0-1b: Add pure Go conversion functions + TDD tests
backend/convert_pure.go— AddedrawHostConfigData+rawHostConfigToModel(),rawClusterData+rawClusterToModel()backend/convert_test.go— 8 new table-driven tests: zero-value ints, empty strings, normal values, worker/config-sourced field isolationTODO(dispatchwindow)comment added per plan specDisptWindowguard test added to catch accidental future CGO layer changes- All 26 backend tests passing
-
#3 P0-1c: Add CGO conversion layer in convert.go
backend/convert.go— AddedcHostConfigToModel(),cClusterConfHostConfigs(),cClusterConfToClusterInfo()cResdefToModelintentionally skipped —xce_resdef_tdoesn't exist in C codebase andResourceInfohas no store/consumer (YAGNI); existingcResourceToModel→ResourceDefinitionInfoalready handles config pushcClusterConfResourcesalready existed — no change needed- CGO compilation verified passing
- All unit tests still passing
-
#4 P0-1d: Implement handlers with partial merge + TDD
backend/notification.go— AddedOnClusterUpdated(cluster *models.ClusterInfo)andOnHostConfigUpdated(host *models.HostInfo)toNotificationHandlerinterfacebackend/handler.go— Implemented partial-mergeOnClusterUpdated(preserves Version, Status, ControllerName, NumServers, Resources, HostTypes, HostModels, ClusterAdmins),OnHostConfigUpdated(preserves HostStatus, CPUFactor, NumCPUs, NumCores, NumThreads, MaxMem, MaxSwap, MaxTmp, NumDisk, NumRun, NumSSusp, NumUSusp, NumDone, Topology, SchedStop), fixedOnHostUpdated(preserves HostModel, HostType, MaxSlot, DisptWindow via two-valueGet())backend/handler_test.go— 6 new tests: new host, partial merge for each of OnHostConfigUpdated, OnClusterUpdated, OnHostUpdated- All backend tests passing (32 total)
-
#5 P0-1e: Expand handleConfigPush (unblocked)
backend/clib.go— ExpandhandleConfigPush()to callcClusterConfHostConfigs()andcClusterConfToClusterInfo()- Call
gHandler.OnHostConfigUpdated()per host config,gHandler.OnClusterUpdated()for cluster settings
P0-2: Host Control via Backend
-
#6 P0-2a: C-side plumbing for host control
schema/controller.capnp— AddedHostControlstruct +hostctrlmsg @21include/typemap.h— Addedxce_hostctrl_t* hostctrlmsg;to body union (after @20 clrpreasonmsg, matching capnp ordinal)include/client.h— Addedxcecli_hostctrl()declarationinclude/xceapi.h— Addedxce_hostctrl()declarationinclude/request.h— Addedxce_hostctrl_req()declarationlib/client.c— Implementedxcecli_hostctrl()lib/xceapi.c— Implementedxce_hostctrl()withcbuf_get()wait (a later, unrelated repo-wide change converted this tocbuf_timedget()with a 10s deadline)lib/request.c— Implementedxce_hostctrl_req()(validates HOST_OPEN/HOST_CLOSE only, rejects HOST_TAG/UNTAG)lib/helper.c— AddedRequest_body_hostctrlmsgcase toxce_request_body()+xce_request_msg_name()controller/cluster.c— AddedOPCode_hostcontrolcase →do_hostcontrol_op()controller/worker.c— Implementeddo_hostcontrol_op()callingworker_ctrl(); fixed pre-existinggoto cleanbug that leaked write lock + reference countcontroller/include/cluster.h— Declareddo_hostcontrol_op()lib/testsuite/test_request.c— 8 TDD validation tests (null ep/ctrl/hostname, empty hostname, HOST_DO_NONE no-op, HOST_TAG/UNTAG reject, negative action)- Regenerated capnp via
ninja -C build
-
#7 P0-2b: Implement Go-side ControlHost + fix allFlag race
backend/clib.go— ReplacedControlHost()stub with realxcecli_hostctrl()call; followsControlQueuepattern exactlybackend/control_host_test.go— New: stub signature + errNoCGO test (guarded//go:build !cgo)controllers/hosts.go— Removedvar allFlag boolfrom package scope;preCheckHostControlRequestnow returns(bool, error);ControlHostuseshostActionMapwith explicit!existsguard (mirrorsControlQueuepattern)controllers/queues.go—preCheckQueueControlRequestnow returns(bool, error);ControlQueuereceives allFlag locallycontrollers/host_control_test.go— 5 new tests: allFlag true/false, concurrent no-race (50 goroutines), invalid action, comment-too-longcontrollers/queue_control_test.go— 5 new tests: same coverage for queues- All tests passing (
make test)
-
#8 P0-2c: Register routes + RBAC for host control/select
router/routers.go—POST /xce/v1/hosts/control→ RBAChost:control(cluster_admin)router/routers.go—POST /xce/v1/hosts/select→ RBAChost:view(all authenticated)config/rbac.yaml—host:controlandhost:viewaction entries already presentcontrollers/rbac_check_test.go— 3 new TDD tests:TestRBAC_HostControl_ClusterAdminOnly,TestRBAC_HostView_BasicUserHasAccess,TestRBAC_HostControl_DomainTypeIsAll- All tests passing (
controllerspackage)
-
#9 P0-2d: Update stub.go with new function stubs
backend/stub.go— AddedStartHeartbeat(_ context.Context){},SetHeartbeatInterval(_ int){},EvalSelectForHost(_, _ string) error(returnserrNoCGO),Cleanup(){}, added"context"to imports (SetHeartbeatIntervalwas later pulled out ofstub.go/clib.goentirely into the shared, no-build-tagbackend/heartbeat.go)backend/stub_funcs_test.go— 4 TDD tests:TestStartHeartbeat_StubNoOp,TestSetHeartbeatInterval_StubNoOp(3 edge values),TestEvalSelectForHost_StubErrNoCGO,TestCleanup_StubNoOp- All backend tests passing
P1-1: Handle Resource Value Push
- #10 P1-1: Handle resource value push (OPCode_notify)
backend/clib.go— Added 8 CGO val union helpers (xce_val_which,xce_val_i32,i64,u32,u64,fval,str,bool)backend/clib.go— AddedOPCode_notifycase at top-level switch ingo_push_handler()(NOT insidehandlePush())backend/clib.go— AddedhandleNotifyData()forNotifyData_data_schedUpdateResvalsbackend/convert.go— AddedcResvalToDistribution()— switches onValue_u_*constants, all 7 cases separatebackend/convert_pure.go— AddedrawResvalDatastruct +rawResvalToDistribution()pure-Go versionbackend/convert_test.go— 10 TDD tests covering all 7 value types, nil val, unknown discriminant, boolean false- All 42 backend tests passing (
CGO_ENABLED=0 go test ./backend/ -v)
P1-2: Host Resource Requirement Select
Moved to
src/docs/p1-2-host-select.mdfor deeper investigation. Open questions: PEG tooling availability,eval_selectinput contract, CGO error propagation.
P1-3: Heartbeat Keep-Alive
- #13 P1-3: Heartbeat keep-alive implementation
backend/clib.go— AddedheartbeatIntervalSecs int32(default 30),SetHeartbeatInterval(),StartHeartbeat(ctx context.Context)goroutine with ticker (within the same P1-3 commits,heartbeatIntervalSecs/SetHeartbeatInterval()/the tick loop were extracted into the shared, no-build-tagbackend/heartbeat.gofor CGO-free testability;clib.gonow passes an inline closure torunHeartbeatrather than a namedheartbeatFnvar)backend/handler.go—OnClusterUpdatedcallsSetHeartbeatInterval(cluster.HeartbeatInterval)after store update (zero-preserve: skips if interval==0)cmd/main.go— Callsbackend.StartHeartbeat(ctx)afterbackend.RegisterToBackend(...)backend/handler_test.go— Tests for heartbeat interval update, zero-preserve, timer leak, test drain, store consistency- Commits:
ffc5b20(goroutine),0a3de8b(leak/drain/consistency fixes)
Final
-
#14 Build and test verification
make testinsrc/frontend/passes — all backend, controllers, store, utils, xcecli tests greenninja -C buildfor C components passes — required meson reconfigure + CGO val_helpers.h fix- RBAC verification —
host:control(cluster_admin) andhost:view(all authenticated) confirmed in routes + rbac.yaml - Input safety — comment limit 512 chars; select expression limit 4094 chars (1024 reduction deferred to P1-2b)
- CGO fix applied: extracted
staticval helpers fromclib.gopreamble intoval_helpers.hshared header;convert.gonow includes it; added explicitfloat64()cast forC.doublereturn
-
#15 Integration test suite — plan doc
apiserver-backend-integration-test-plan.mdwas later removed fromsrc/docs/in an unrelated cleanup commit; see the test files below for current coveragebackend/integration_test.go— §1 (config push), §3 (resource values), §4 (heartbeat), §5 (cross-feature): 17 testscontrollers/integration_test.go— §2 (host control), §6 (RBAC), §8 (input safety): 17 tests + 1 skip (§8.1 pending P1-2b)store/concurrency_test.go— §7 (thread safety): 3 concurrent-access tests- All use
//go:build !cgo; run withCGO_ENABLED=0 go test ./backend/... ./controllers/... ./store/... - Commit:
86a65d6