@@ -10,9 +10,9 @@ two surveys:
1010 (` internal/controller/ ` , ` pkg/ ` ).
1111
1212If a client we listed in ` PLAN.md ` calls something that is not on this list,
13- the list is wrong — please add it. Out-of-scope endpoints (backup shipping,
14- schedules, S3 / EBS, SPDK, NVMe-oF, OpenFlex, Exos) MUST return
15- ` 501 Not Implemented ` with a clear message rather than silently 404.
13+ the list is wrong — please add it. Out-of-scope endpoints (cross-cluster
14+ backup shipping, schedules, S3 / EBS, SPDK, NVMe-oF, OpenFlex, Exos) MUST
15+ return ` 501 Not Implemented ` with a clear message rather than silently 404.
1616
1717## Status legend
1818
@@ -21,20 +21,32 @@ schedules, S3 / EBS, SPDK, NVMe-oF, OpenFlex, Exos) MUST return
2121- ⬜ not yet implemented
2222- ⛔ explicitly out of scope (return 501)
2323
24+ Last sync against handler list: 2026-05-09 (Phase 8.5 close).
25+
2426---
2527
2628## Controller-level
2729
2830| Endpoint | Method | Status | Notes |
2931| ---| ---| ---| ---|
30- | ` /v1/controller/version ` | GET | ✅ | Phase 1; pinned by ` pkg/rest/server_test.go ` |
32+ | ` /v1/controller/version ` | GET | ✅ | ` pkg/rest/server_test.go ` |
3133| ` /v1/controller/config ` | GET | ⬜ | |
32- | ` /v1/controller/properties ` | GET | ⬜ | |
33- | ` /v1/controller/properties ` | POST/DELETE | ⬜ | |
34- | ` /v1/controller/properties/{key} ` | DELETE | ⬜ | |
35- | ` /v1/controller/properties/info ` | GET | ⬜ | piraeus uses for prop discovery |
34+ | ` /v1/controller/properties ` | GET | ✅ | KV-store-backed ( ` ControllerProps ` instance) |
35+ | ` /v1/controller/properties ` | POST | ✅ | ` override_props ` payload |
36+ | ` /v1/controller/properties/{key} ` | DELETE | ⬜ | use POST with empty value as workaround |
37+ | ` /v1/controller/properties/info ` | GET | 🟡 | empty list — autocomplete catalogue ports later |
3638| ` /v1/controller/properties/info/all ` | GET | ⬜ | |
3739| ` /v1/healthz ` | GET | ✅ | blockstor-only readiness probe |
40+ | ` /v1/stats ` | GET | ✅ | cluster-wide counters |
41+
42+ ## Encryption (cluster passphrase + per-RD)
43+
44+ | Endpoint | Method | Status |
45+ | ---| ---| ---|
46+ | ` /v1/encryption/passphrase ` | POST | ✅ (seed) |
47+ | ` /v1/encryption/passphrase ` | PATCH | ✅ (unlock) |
48+ | ` /v1/encryption/passphrase ` | PUT | ✅ (rotate) |
49+ | ` /v1/resource-definitions/{rd}/encryption-passphrase ` | POST | ✅ |
3850
3951## Nodes
4052
@@ -45,17 +57,20 @@ schedules, S3 / EBS, SPDK, NVMe-oF, OpenFlex, Exos) MUST return
4557| ` /v1/nodes/{node} ` | GET | ✅ |
4658| ` /v1/nodes/{node} ` | PUT (modify) | ✅ |
4759| ` /v1/nodes/{node} ` | DELETE | ✅ |
48- | ` /v1/nodes/{node}/lost ` | DELETE | ⬜ |
49- | ` /v1/nodes/{node}/restore ` | PUT | ⬜ |
50- | ` /v1/nodes/{node}/evacuate ` | PUT | ⬜ |
51- | ` /v1/nodes/{node}/net-interfaces ` | GET / POST | ⬜ |
52- | ` /v1/nodes/{node}/net-interfaces/{nif} ` | GET / PUT / DELETE | ⬜ |
60+ | ` /v1/nodes/{node}/lost ` | POST | ✅ |
61+ | ` /v1/nodes/{node}/restore ` | POST | ✅ |
62+ | ` /v1/nodes/{node}/evacuate ` | POST | ✅ |
63+ | ` /v1/nodes/{node}/net-interfaces ` | GET | ⬜ |
64+ | ` /v1/nodes/{node}/net-interfaces ` | POST | ✅ |
65+ | ` /v1/nodes/{node}/net-interfaces/{nif} ` | GET | ⬜ |
66+ | ` /v1/nodes/{node}/net-interfaces/{nif} ` | PUT | ✅ |
67+ | ` /v1/nodes/{node}/net-interfaces/{nif} ` | DELETE | ✅ |
5368| ` /v1/nodes/{node}/storage-pools ` | GET | ✅ |
54- | ` /v1/nodes/{node}/storage-pools ` | POST | ⬜ |
5569| ` /v1/nodes/{node}/storage-pools/{pool} ` | GET | ✅ |
56- | ` /v1/nodes/{node}/storage-pools/{pool} ` | PUT / DELETE | ⬜ |
57- | ` /v1/physical-storage ` | GET | ⬜ |
58- | ` /v1/physical-storage/{node} ` | GET / POST | ⬜ |
70+ | ` /v1/nodes/{node}/storage-pools ` | POST / PUT / DELETE | ⬜ (StoragePools owned by satellite Hello today) |
71+ | ` /v1/nodes/{node}/physical-storage ` | GET | 🟡 (always ` [] ` ; cozystack provisions via Talos extensions) |
72+ | ` /v1/physical-storage ` | GET | 🟡 (always ` [] ` ) |
73+ | ` /v1/physical-storage/{node} ` | POST | 🟡 (501 with rationale) |
5974
6075## Resource definitions
6176
@@ -66,57 +81,49 @@ schedules, S3 / EBS, SPDK, NVMe-oF, OpenFlex, Exos) MUST return
6681| ` /v1/resource-definitions/{rd} ` | GET | ✅ |
6782| ` /v1/resource-definitions/{rd} ` | PUT | ✅ |
6883| ` /v1/resource-definitions/{rd} ` | DELETE | ✅ |
69- | ` /v1/resource-definitions/{rd}/volume-definitions ` | GET | ✅ |
70- | ` /v1/resource-definitions/{rd}/volume-definitions ` | POST | ✅ |
71- | ` /v1/resource-definitions/{rd}/volume-definitions/{vn} ` | GET | ✅ |
72- | ` /v1/resource-definitions/{rd}/volume-definitions/{vn} ` | PUT | ✅ |
73- | ` /v1/resource-definitions/{rd}/volume-definitions/{vn} ` | DELETE | ✅ |
74- | ` /v1/resource-definitions/{rd}/clone ` | POST | ⬜ |
84+ | ` /v1/resource-definitions/{rd}/volume-definitions ` | GET / POST | ✅ |
85+ | ` /v1/resource-definitions/{rd}/volume-definitions/{vn} ` | GET / PUT / DELETE | ✅ |
86+ | ` /v1/resource-definitions/{rd}/clone ` | POST | 🟡 (delegates to snapshot-restore-resource) |
7587| ` /v1/resource-definitions/{rd}/clone/{target} ` | GET (status) | ⬜ |
7688| ` /v1/resource-definitions/{rd}/sync-status ` | GET | ⬜ |
77- | ` /v1/resource-definitions/{rd}/snapshot-restore-resource/{snap} ` | POST | ⬜ |
89+ | ` /v1/resource-definitions/{rd}/snapshot-restore-resource ` | POST | ✅ |
7890| ` /v1/resource-definitions/{rd}/snapshot-restore-volume-definition/{snap} ` | POST | ⬜ |
7991| ` /v1/resource-definitions/{rd}/snapshot-rollback/{snap} ` | POST | ⬜ |
80- | ` /v1/resource-definitions/{rd}/snapshots ` | GET | ✅ |
81- | ` /v1/resource-definitions/{rd}/snapshots ` | POST | ✅ |
82- | ` /v1/resource-definitions/{rd}/snapshots/{snap} ` | GET | ✅ |
83- | ` /v1/resource-definitions/{rd}/snapshots/{snap} ` | DELETE | ✅ |
92+ | ` /v1/resource-definitions/{rd}/snapshots ` | GET / POST | ✅ |
93+ | ` /v1/resource-definitions/{rd}/snapshots/{snap} ` | GET / DELETE | ✅ |
94+ | ` /v1/resource-definitions/{rd}/adjust ` | POST | ✅ |
95+ | ` /v1/resource-definitions/{rd}/advise ` | GET | ✅ |
96+ | ` /v1/resource-definitions/{rd}/encryption-passphrase ` | POST | ✅ |
8497
8598## Resources
8699
87100| Endpoint | Method | Status |
88101| ---| ---| ---|
102+ | ` /v1/resource-definitions/{rd}/resources ` | GET | ✅ |
89103| ` /v1/resource-definitions/{rd}/resources ` | POST | ✅ |
90- | ` /v1/resource-definitions/{rd}/resources ` | GET | ⬜ (use /v1/view/resources) |
104+ | ` /v1/resource-definitions/{rd}/resources/{node} ` | GET | ✅ |
91105| ` /v1/resource-definitions/{rd}/resources/{node} ` | DELETE | ✅ |
92- | ` /v1/resource-definitions/{rd}/resources/{node} ` | GET / PUT | ⬜ |
93- | ` /v1/resource-definitions/{rd}/resources/{node}/volumes ` | GET | ⬜ |
94- | ` /v1/resource-definitions/{rd}/resources/{node}/volumes/{vn} ` | GET / PUT | ⬜ |
95- | ` /v1/resource-definitions/{rd}/resources/{node}/migrate-disk/{from} ` | PUT | ⬜ |
96- | ` /v1/resource-definitions/{rd}/resources/{node}/migrate-disk/{from}/{pool} ` | PUT | ⬜ |
97- | ` /v1/resource-definitions/{rd}/resources/{node}/toggle-disk/diskful ` | PUT | ⬜ |
98- | ` /v1/resource-definitions/{rd}/resources/{node}/toggle-disk/diskful/{pool} ` | PUT | ⬜ |
99- | ` /v1/resource-definitions/{rd}/resources/{node}/toggle-disk/diskless ` | PUT | ⬜ |
100- | ` /v1/resource-definitions/{rd}/resources/{node}/toggle-disk/diskless/{pool} ` | PUT | ⬜ |
106+ | ` /v1/resource-definitions/{rd}/resources/{node} ` | PUT | ⬜ |
107+ | ` /v1/resource-definitions/{rd}/resources/{node}/volumes ` | GET / PUT | ⬜ |
108+ | ` /v1/resource-definitions/{rd}/resources/{node}/migrate-disk/... ` | PUT | ⬜ |
109+ | ` /v1/resource-definitions/{rd}/resources/{node}/toggle-disk/... ` | PUT | ⬜ (auto-diskful covers the common case) |
101110| ` /v1/resource-definitions/{rd}/resources/{node}/make-available ` | POST | ⬜ |
102- | ` /v1/resource-definitions/{rd}/resources/{node}/activate ` | POST | ⬜ |
103- | ` /v1/resource-definitions/{rd}/resources/{node}/deactivate ` | POST | ⬜ |
111+ | ` /v1/resource-definitions/{rd}/resources/{node}/activate ` | POST | ✅ |
112+ | ` /v1/resource-definitions/{rd}/resources/{node}/deactivate ` | POST | ✅ |
113+ | ` /v1/resource-definitions/{rd}/resources/{node}/adjust ` | POST | ✅ |
104114| ` /v1/resource-definitions/{rd}/autoplace ` | POST | ✅ |
105115
106116## Resource groups
107117
108118| Endpoint | Method | Status |
109119| ---| ---| ---|
110- | ` /v1/resource-groups ` | GET | ✅ |
111- | ` /v1/resource-groups ` | POST | ✅ |
112- | ` /v1/resource-groups/{rg} ` | GET | ✅ |
113- | ` /v1/resource-groups/{rg} ` | PUT | ✅ |
114- | ` /v1/resource-groups/{rg} ` | DELETE | ✅ |
120+ | ` /v1/resource-groups ` | GET / POST | ✅ |
121+ | ` /v1/resource-groups/{rg} ` | GET / PUT / DELETE | ✅ |
115122| ` /v1/resource-groups/{rg}/spawn ` | POST | ✅ |
116123| ` /v1/resource-groups/{rg}/adjust ` | PUT | ⬜ |
117124| ` /v1/resource-groups/adjustall ` | PUT | ⬜ |
118- | ` /v1/resource-groups/{rg}/query-size-info ` | POST | ⬜ |
119- | ` /v1/resource-groups/{rg}/query-max-volume-size ` | POST | ⬜ |
125+ | ` /v1/resource-groups/{rg}/query-size-info ` | POST | ✅ |
126+ | ` /v1/resource-groups/{rg}/query-max-volume-size ` | POST | ⬜ (use query-size-info) |
120127| ` /v1/resource-groups/{rg}/volume-groups ` | GET / POST | ⬜ |
121128| ` /v1/resource-groups/{rg}/volume-groups/{vn} ` | GET / PUT / DELETE | ⬜ |
122129
@@ -134,7 +141,9 @@ schedules, S3 / EBS, SPDK, NVMe-oF, OpenFlex, Exos) MUST return
134141| ` /v1/view/resources ` | GET | ✅ |
135142| ` /v1/view/snapshots ` | GET | ✅ |
136143| ` /v1/view/storage-pools ` | GET | ✅ |
137- | ` /v1/query-max-volume-size ` | POST | ⬜ |
144+ | ` /v1/view/advise/resources ` | GET | ✅ |
145+ | ` /v1/query-all-size-info ` | POST | ✅ |
146+ | ` /v1/query-max-volume-size ` | POST | ⬜ (use query-all-size-info) |
138147
139148## KeyValueStore (used by linstor-csi for its own bookkeeping)
140149
@@ -149,16 +158,40 @@ schedules, S3 / EBS, SPDK, NVMe-oF, OpenFlex, Exos) MUST return
149158
150159| Endpoint | Method | Status |
151160| ---| ---| ---|
152- | ` /v1/node-connections ` | GET | ⬜ |
153- | ` /v1/node-connections/{a}/{b} ` | GET / PUT | ⬜ |
161+ | ` /v1/node-connections ` | GET | 🟡 (empty list) |
162+ | ` /v1/node-connections/{a}/{b} ` | GET | 🟡 (empty list) |
163+ | ` /v1/node-connections/{a}/{b} ` | PUT | ⬜ |
154164| ` /v1/resource-definitions/{rd}/resource-connections ` | GET | ⬜ |
155165| ` /v1/resource-definitions/{rd}/resource-connections/{a}/{b} ` | GET / PUT | ⬜ |
156166
157- ## Encryption (LUKS — in scope but not MVP)
167+ ## Multi-snapshot actions
168+
169+ | Endpoint | Method | Status |
170+ | ---| ---| ---|
171+ | ` /v1/actions/snapshot/multi ` | POST | 🟡 (501) |
172+
173+ ## DRBD proxy (cozystack uses flat L2; included for ` linstor drbd-proxy * ` )
174+
175+ | Endpoint | Method | Status |
176+ | ---| ---| ---|
177+ | ` /v1/resource-definitions/{rd}/drbd-proxy ` | PUT | 🟡 (501) |
178+ | ` /v1/resource-definitions/{rd}/drbd-proxy/enable/{a}/{b} ` | POST | 🟡 (501) |
179+ | ` /v1/resource-definitions/{rd}/drbd-proxy/disable/{a}/{b} ` | POST | 🟡 (501) |
180+
181+ ## External files (cozystack handles via Talos extensions)
182+
183+ | Endpoint | Method | Status |
184+ | ---| ---| ---|
185+ | ` /v1/files ` | GET | 🟡 (empty list) |
186+ | ` /v1/files/{path...} ` | GET | 🟡 (404 with rationale) |
187+
188+ ## Error reports / SOS
158189
159190| Endpoint | Method | Status |
160191| ---| ---| ---|
161- | ` /v1/encryption/passphrase ` | POST / PUT / PATCH | ⬜ |
192+ | ` /v1/error-reports ` | GET | 🟡 (empty list) |
193+ | ` /v1/error-reports/{id} ` | GET | 🟡 (404) |
194+ | ` /v1/sos-report ` | GET | ⬜ (Phase 7 follow-up) |
162195
163196## Out of scope — return 501
164197
@@ -167,17 +200,11 @@ like the upstream `ApiCallRc` so golinstor decodes it cleanly.
167200
168201| Endpoint group | Why |
169202| ---| ---|
170- | ` /v1/remotes/... ` , ` /v1/remotes/{r}/backups/... ` | cross-cluster shipping; out of scope |
171- | ` /v1/schedules/... ` | cron-driven backups; out of scope |
172- | ` /v1/view/backup/queue ` , ` /v1/view/schedules-by-resource ` | shipping observability |
173- | ` /v1/stats/... ` | nice-to-have, deferred to Phase 7 |
174- | ` /v1/controller/backup/db ` | controller DB backup; CRDs are the DB now |
175- | ` /v1/sos-report ` , ` /v1/sos-report/download ` | deferred to Phase 7 |
176- | ` /v1/error-reports[*/...] ` | deferred to Phase 7 |
177- | ` /v1/files[/{name}/check/{node}] ` | external files; deferred to Phase 6 |
178- | ` /v1/resource-definitions/{r}/files/{name} ` | external files; deferred to Phase 6 |
179- | ` /v1/resource-definitions/{r}/drbd-proxy[/...] ` | DRBD proxy; deferred to Phase 6 |
180- | ` /v1/events/drbd/promotion ` , ` /v1/events/nodes ` | SSE event streams; consider in Phase 4 |
203+ | ` /v1/remotes/... ` , ` /v1/remotes/{r}/backups/... ` | cross-cluster shipping; 🟡 GET returns ` [] ` , mutations ⛔ 501 |
204+ | ` /v1/schedules/... ` | cron-driven backups; ⛔ |
205+ | ` /v1/view/backup/queue ` , ` /v1/view/schedules-by-resource ` | shipping observability; ⛔ |
206+ | ` /v1/controller/backup/db ` | controller DB backup; CRDs are the DB now; ⛔ |
207+ | ` /v1/events/drbd/promotion ` , ` /v1/events/nodes ` | SSE event streams; deferred (consumers use kube-watch on Resource CRDs) |
181208
182209---
183210
@@ -187,8 +214,7 @@ Every endpoint in this file gets, in order:
187214
1882151 . A row in this table moved from ⬜ to 🟡, and then to ✅, as work lands.
1892162 . A test in ` pkg/rest/<group>_test.go ` that fixes the contract: happy path,
190- unhappy paths (not found, conflict, validation), and the JSON shape (per
191- the per-endpoint TDD policy in ` PLAN.md ` ).
217+ unhappy paths (not found, conflict, validation), and the JSON shape.
1922183 . Implementation in ` pkg/rest/<group>.go ` until the tests go green.
1932194 . A contract-diff entry against the Java oracle once that suite is wired
194220 (Phase 5).
0 commit comments