Skip to content

Commit e75cdd9

Browse files
kvapsclaude
andcommitted
docs(csi-api-surface): sync against Phase 7+8 handlers
The matrix was a Phase 1 snapshot. Resync against the live handler registration list (/v1/controller/properties, /v1/encryption/passphrase, /v1/nodes/{n}/{lost,restore,evacuate,net-interfaces}, /v1/.../adjust, /v1/.../advise, /v1/.../query-size-info, etc.) so the table reflects what's actually implemented. Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
1 parent aa11008 commit e75cdd9

1 file changed

Lines changed: 91 additions & 65 deletions

File tree

docs/csi-api-surface.md

Lines changed: 91 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ two surveys:
1010
(`internal/controller/`, `pkg/`).
1111

1212
If 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

188215
1. A row in this table moved from ⬜ to 🟡, and then to ✅, as work lands.
189216
2. 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.
192218
3. Implementation in `pkg/rest/<group>.go` until the tests go green.
193219
4. A contract-diff entry against the Java oracle once that suite is wired
194220
(Phase 5).

0 commit comments

Comments
 (0)