* feat: cloud Mount() per HIP-0106
Adds pkg/vfs.Mount(*zip.App, cloud.Deps) error so the unified Hanzo
Cloud binary can blank-import and register VFS alongside every
other Hanzo subsystem.
VFS has no public HTTP surface today — it's an S3-backed virtual
block filesystem driven through FUSE/CLI/sidecar. Mount() exposes
liveness/readiness probes plus a minimal block-CRUD HTTP API so
co-resident subsystems can talk to VFS without falling back to the
CLI:
- GET /v1/vfs/health — always 200
- GET /v1/vfs/readyz — 200 only when an instance is
attached via vfs.SetInstance
- PUT /v1/vfs/blocks — payload upload
- GET /v1/vfs/blocks/:id — payload download
- DELETE /v1/vfs/blocks/:id — backend delete
- GET /v1/vfs/stats — cache/backend counters
cmd/vfsd is a HIP-0106 thin shim that wires backend + age keys from
env (VFSD_BACKEND, VFSD_AGE_KEY) and listens on cloud.Config.ListenAddr.
The existing cmd/vfs CLI (put/get/stats/mount) is untouched.
init() registers with cloud.Register("vfs", 20, …). schema/vfs.zap
adds the minimal Health + Block ZAP interface; full multi-block
File surface lands in follow-up PRs.
Tests:
- pkg/vfs: TestMount_HealthReadyz + TestMount_PutGetRoundtrip green
- existing TestRoundTrip + TestStats unchanged
* refactor: collapse pkg/vfs/ → root for clean import path
Subsystem code lives in package vfs at repo root. Importers now use
`github.com/hanzoai/vfs` (no /pkg/vfs/ nesting). Standalone shim moved
to cmd/vfs/ where applicable.
Per Hanzo Go-stdlib pattern: repo IS the package.
* refactor: flatten import path — github.com/hanzoai/cloud (drop /pkg/cloud)
71 lines
2.3 KiB
Plaintext
71 lines
2.3 KiB
Plaintext
# Hanzo VFS — ZAP Schema
|
|
#
|
|
# Server: vfs (Go) embedded via pkg/vfs.Mount(app, deps) per HIP-0106.
|
|
#
|
|
# This schema captures the minimum public surface needed for the
|
|
# Mount() contract: liveness/readiness + single-block CRUD over ZAP.
|
|
# The HTTP surface in pkg/vfs/mount.go stays the source of truth for
|
|
# /v1/vfs/* until the typed handlers land via zapc generate. Multi-
|
|
# block File API + FUSE mount lifecycle stay outside the ZAP surface;
|
|
# they're CLI/sidecar concerns documented in pkg/vfs/CLAUDE.md.
|
|
#
|
|
# Code generation:
|
|
# zapc generate schema/vfs.zap --lang go --out ./gen/zap/
|
|
|
|
# ── Health ────────────────────────────────────────────────────────────────
|
|
|
|
struct HealthRequest
|
|
|
|
struct HealthResponse
|
|
status Text
|
|
service Text
|
|
version Text
|
|
|
|
struct ReadyResponse
|
|
status Text
|
|
service Text
|
|
version Text
|
|
reason Text
|
|
|
|
# ── Blocks ────────────────────────────────────────────────────────────────
|
|
|
|
struct PutBlockRequest
|
|
payload Bytes
|
|
|
|
struct PutBlockResponse
|
|
id Text
|
|
|
|
struct GetBlockRequest
|
|
id Text
|
|
|
|
struct GetBlockResponse
|
|
payload Bytes
|
|
|
|
struct DeleteBlockRequest
|
|
id Text
|
|
|
|
struct DeleteBlockResponse
|
|
ok Bool
|
|
|
|
# ── Stats ────────────────────────────────────────────────────────────────
|
|
|
|
struct StatsRequest
|
|
|
|
struct StatsResponse
|
|
backend Text
|
|
cacheBlocks Int32
|
|
cacheBytes Int64
|
|
cacheMax Int64
|
|
|
|
# ── Service interface ────────────────────────────────────────────────────
|
|
|
|
interface VFSService
|
|
health (request HealthRequest) -> (response HealthResponse)
|
|
ready (request HealthRequest) -> (response ReadyResponse)
|
|
|
|
putBlock (request PutBlockRequest) -> (response PutBlockResponse)
|
|
getBlock (request GetBlockRequest) -> (response GetBlockResponse)
|
|
deleteBlock (request DeleteBlockRequest) -> (response DeleteBlockResponse)
|
|
|
|
stats (request StatsRequest) -> (response StatsResponse)
|