API 与 CLI

dozycat 控制平面 HTTP API 的端点参考,以及与之同源、经过对等测试的 dozycat CLI 子命令。

概览

dozycat 是 dozycat 的集中式控制平面:API、Web UI 和 CLI 共用同一套服务方法。CLI 是 HTTP API 之上的薄壳——配置 --api URL(或环境变量 DOZYFS_API)即驱动远端 API;否则直接对本地 SQLite 注册表(--db)操作。无论哪种后端,调用的都是同一组方法,因此 API、UI、CLI 在能力上永不漂移。仓库里有对等测试(parity test)断言每个服务操作都至少有一条 HTTP 路由可达。

提示:API 返回 JSON(Content-Type: application/json; charset=utf-8),并带 Access-Control-Allow-Origin: *。健康检查在 GET /api/health,返回 {"status":"ok"} 与可用操作列表。

关于 cat / volume / route / node 等概念,参见 核心概念;关于稳定路由与冷热轮换,参见 生命周期

端点参考

所有路径都以 /api 为前缀。下面按资源分组。

status(状态)

方法路径操作说明
GET/api/statusstatus控制平面汇总快照(节点、cat、卷计数等)
GET/api/healthhealth存活探针,返回 ok 与操作列表

volumes(卷)

方法路径操作说明
GET/api/volumeslist_volumes列出所有卷
POST/api/volumescreate_volume创建一个卷(需 volume_idtenant_idgcs_prefix
GET/api/volumes/{volume_id}get_volume查看单个卷
POST/api/volumes/{volume_id}/activateactivate把卷激活到指定 cat_id + node_id
POST/api/volumes/{volume_id}/scheduleschedule容量感知调度:自动挑选空闲 ready 节点(或校验给定节点)后激活

routes(稳定路由)

方法路径操作说明
GET/api/routeslist_routes列出所有稳定路由(含 public_url
GET/api/routes/{stable_name}resolve_routexxxxx.dozyfs 解析到当前绑定(节点 + epoch)
POST/api/routes/{stable_name}/publicset_public_url设置路由对外的 https 公共地址

nodes(节点)

方法路径操作说明
GET/api/nodeslist_nodes列出所有裸机节点
POST/api/nodesregister_node注册/更新节点及其 cat-agent 端点(需 node_idaddressagent_url
GET/api/nodes/{node_id}get_node查看单个节点

cats(微虚拟机)

方法路径操作说明
GET/api/catslist_cats列出所有 cat 及其 state / desired_state
GET/api/cats/{cat_id}get_cat查看单个 cat
POST/api/cats/{cat_id}/idleidle将 cat 降到某档闲置层(tier:hot/warm/cold/deep-cold)
POST/api/cats/{cat_id}/desiredset_desired声明期望状态(running/cold/off)
POST/api/cats/{cat_id}/reconcilereconcile朝期望状态推进一步
POST/api/cats/{cat_id}/lifecyclelifecycle规划/执行某个生命周期动作(pause、snapshot、drain 等)

reconcile(协调)

方法路径操作说明
POST/api/reconcilereconcile_all对整个机群各 cat 协调一次

events(事件)

方法路径操作说明
GET/api/events?limit=Nlist_events列出最近的控制平面事件
POST/api/eventsrecord_event记录一条事件(需 event_type

heatmap / warmup(热度图 / 预热)

方法路径操作说明
POST/api/heatmapheatmap从访问日志计算热门目录(带衰减 decay
POST/api/warmupwarmup按热度规划或执行(execute)JuiceFS 预热

tokens(作用域访问令牌)

方法路径操作说明
POST/api/tokensissue_token签发令牌(明文密钥仅在此返回一次)
GET/api/tokenslist_tokens列出令牌元数据(绝不泄露密钥)
POST/api/tokens/verifyverify_token针对某 op/cat/volume 校验令牌
POST/api/tokens/{token_id}/revokerevoke_token按 id 吊销令牌

等价的 CLI 子命令

CLI 程序名为 dozycat。每个 HTTP 资源都有对应子命令组:

资源CLI
volumesdozycat registry create-volume | activate | schedule | idle | status | list-volumes | get-volume
routesdozycat route get | ls | set-url
mountsdozycat mount add | ls | get | rm(自带 S3/GCS 桶,FUSE)
nodesdozycat node register | ls | get
catsdozycat cat set-desired | reconcile | reconcile-all | ls | get
eventsdozycat registry record-event | list-events
heatmap / warmupdozycat heatmap <log>dozycat warmup <log> --mountpoint …
lifecycledozycat lifecycle <action> --cat-id … --state …
tokensdozycat token issue | ls | verify | revoke
注意:除非配置了 --api/DOZYFS_API,多数子命令都需要一个后端——传 --db 指向本地 SQLite 注册表。lifecycle 在无后端时只能打印计划--execute 会把计划下发给该 cat 所在节点的 cat-agent(有 --db 时本地执行)。

作用域访问令牌

令牌密钥形如 dzt_…,每个令牌带 TTL(过期时间)作用域。作用域是三条独立的轴:

  • ops —— 允许的操作(如 lifecycleidle
  • cats —— 允许的 cat id
  • volumes —— 允许的卷 id

任一轴省略即默认为 ["*"](不限制)。校验返回 valid 与具体 reasonokunknownop_not_in_scopecat_not_in_scopevolume_not_in_scopeexpiredrevoked

仅一次:明文密钥只在 issue 时返回一次。listverify 都不会再吐出密钥,服务端只存 sha256 哈希。务必在签发时妥善保存。

示例

创建卷

curl -sS -X POST http://127.0.0.1:8080/api/volumes \
  -H 'Content-Type: application/json' \
  -d '{"volume_id":"vol-acme","tenant_id":"acme","gcs_prefix":"gs://acme-fs/","quota_gb":50}'

# CLI 等价(远端 API):
export DOZYFS_API=http://127.0.0.1:8080
dozycat registry create-volume --volume-id vol-acme \
  --tenant-id acme --gcs-prefix gs://acme-fs/ --quota-gb 50

列出 cat

curl -sS http://127.0.0.1:8080/api/cats

# CLI 等价:
dozycat cat ls --api http://127.0.0.1:8080

签发作用域令牌

curl -sS -X POST http://127.0.0.1:8080/api/tokens \
  -H 'Content-Type: application/json' \
  -d '{"scope":{"ops":["lifecycle"],"cats":["cat-A"]},"ttl_seconds":3600,"label":"ci"}'
# -> {"token":"dzt_…","token_id":"…","expires_at":…}

# CLI 等价:
dozycat token issue --scope-ops lifecycle --scope-cats cat-A --ttl 3600 --label ci

生命周期动作

# 仅打印某个动作的计划命令(不执行):
dozycat lifecycle pause --cat-id cat-A --state running

# 下发到该 cat 所在节点的 cat-agent 执行:
dozycat lifecycle pause --cat-id cat-A --state running \
  --api http://127.0.0.1:8080 --execute

# HTTP 等价:
curl -sS -X POST http://127.0.0.1:8080/api/cats/cat-A/lifecycle \
  -H 'Content-Type: application/json' \
  -d '{"state":"running","action":"pause","execute":true}'

错误与状态码

  • 400 —— 缺少必填字段、JSON 非法或参数值有误。响应体形如 {"error":"missing required field(s): …"}
  • 404 —— 路径无匹配路由,或资源(如卷/节点)不存在。
  • 405 —— 路径存在但方法不被允许。
  • 200 —— 成功,响应体为操作结果对象。

CLI 把 API 错误统一转成 error: api <code>: <message> 并以退出码 2 返回。

运行控制平面

# 启动 API + Web UI(也直接挂载静态 UI):
python -m dozycat.api --db /var/lib/dozyfs/registry.db --host 0.0.0.0 --port 8080

完整源码见 github.com/dozycat/dozyfsdozycat/api.pydozycat/cli.py