@namewta/speculo 1.0.17 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/template/workflows/ops/D-project-deploy/D-project-deploy.md +11 -9
- package/template/workflows/ops/H-host-manage/H-host-manage.md +11 -10
- package/template/workflows/ops/I-initialize/I-initialize.md +7 -7
- package/template/workflows/ops/INDEX.md +20 -16
- package/template/workflows/ops/README.md +27 -9
- package/template/workflows/ops/S-server-connect/S-server-connect.md +28 -0
- package/template/workflows/ops/V-inventory-view/V-inventory-view.md +30 -0
- package/template/workflows/ops/common/CAPABILITIES.md +22 -15
- package/template/workflows/ops/common/WORKSPACE-USAGE.md +78 -0
- package/template/workflows/ops/common/examples/task-host.example.json +64 -0
- package/template/workflows/ops/common/rules/activation-and-memory.md +5 -3
- package/template/workflows/ops/common/rules/inventory-and-records.md +55 -0
- package/template/workflows/ops/common/rules/research-and-decisions.md +18 -0
- package/template/workflows/ops/common/rules/server-onboarding.md +21 -0
- package/template/workflows/ops/common/rules/workspace-and-authorization.md +39 -0
- package/template/workflows/ops/common/schemas/fleet-view.schema.json +487 -0
- package/template/workflows/ops/common/schemas/server-check.schema.json +95 -0
- package/template/workflows/ops/common/schemas/task-request.schema.json +138 -0
- package/template/workflows/ops/common/templates/FLEET.html +61 -0
- package/template/workflows/ops/common/tests/test_ops_workspace.mjs +246 -0
- package/template/workflows/ops/common/tools/ops.mjs +5 -3
- package/template/workflows/ops/common/tools/opslib/fleet.mjs +155 -0
- package/template/workflows/ops/common/tools/opslib/server_checks.mjs +149 -0
- package/template/workflows/ops/common/tools/opslib/tasks.mjs +313 -0
- package/template/workflows/ops/common/tools/opslib/workspace.mjs +107 -0
- package/template/workflows/ops/common/tools/opslib/workspace_cli.mjs +80 -0
- package/template/workflows/ops/common/tools/validate-ops.mjs +11 -8
- package/template/workflows/ops/manifest.json +43 -7
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# 集中记录、数据持久化与离线视图
|
|
2
|
+
|
|
3
|
+
本文件拥有 V 的输出与读取范围。资源事实仍由 status.json v3 与原 Run/Release 执行器维护,不建立第二份可编辑 CMDB。
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
state_root/
|
|
7
|
+
status.json # 唯一资源登记事实源;仅原执行网关写入
|
|
8
|
+
FLEET.md # V 生成的简单阅读入口,最后原子更新
|
|
9
|
+
records/
|
|
10
|
+
tasks/task-id/
|
|
11
|
+
PLAN.md # 已展示的任务计划,受限文件
|
|
12
|
+
task.json # 冻结规格/输入摘要;不是授权
|
|
13
|
+
specs/step-id.json
|
|
14
|
+
summary.json # 无自由文本/命令/凭据的视图投影输入
|
|
15
|
+
authorization.json # 原始明确任务确认,只读审计,不导出看板
|
|
16
|
+
started.json # 禁止自动重放的持久标记
|
|
17
|
+
progress.json
|
|
18
|
+
result.json # 不可覆盖终态/恢复说明
|
|
19
|
+
servers/host-id/checks/
|
|
20
|
+
check-id.json # 不可覆盖检查证据
|
|
21
|
+
latest.json # check_id + 内容摘要
|
|
22
|
+
views/view-id/
|
|
23
|
+
inventory.json # schema_version=1 的白名单投影
|
|
24
|
+
FLEET.md
|
|
25
|
+
index.html # 离线单文件;无需 Web 服务
|
|
26
|
+
manifest.json # 每个文件的字节 SHA256 回执
|
|
27
|
+
hosts/host-id/runs/run-id/ # 保留原计划/批准/日志位置
|
|
28
|
+
releases/run-id/ # 保留跨主机/项目证据
|
|
29
|
+
hosts/host-id/deployments/dep-id/ # 保留双边文档/真实配置镜像
|
|
30
|
+
private/credentials.json # 受限账本;V 不读取
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 生成和持久化标准
|
|
34
|
+
|
|
35
|
+
`fleet` 只读取状态、每台服务器最新完整检查、任务 summary 与必要的进度/结果白名单字段,以及 status.releases 的原 Run 索引。不读取 private、env、server-files、outbox、原 task.json/规格/授权文本。缺失任务提交标记显示 incomplete;有 started/running 而未验证终态显示 needs-inspection,不武断判断进程已中断;坏 JSON、摘要不符或链接跳转拒绝生成,不悄悄丢掉损坏记录。
|
|
36
|
+
|
|
37
|
+
投影有 schema_version、artifact、generated_at、controller_id、source_revision、source_digest、stale_hours 和 servers/projects/deployments/bindings/releases/tasks。数据字段的机器可读合同是 common/schemas/fleet-view.schema.json;输出模板是 common/templates/FLEET.html。版本或字段语义改变时升级投影 schema,不改 status v3 以迎合 UI。
|
|
38
|
+
|
|
39
|
+
Server 映射 Host.host_id;deployment 使用 server_id 作为展示字段,保留 project_id、环境、实例、计划与已验证版本。Host.host_services 单列,不伪造 Deployment。Binding 的 external provider 显示外部依赖,不猜其服务器身份。内部 IP、路径、项目名仍可能敏感,所有产物保持受限权限;白名单不是允许把秘密写进 display_name/版本/路径的理由。
|
|
40
|
+
|
|
41
|
+
同一个 data + 模板字节必须产生相同 HTML/MD;view_id 包含内容与渲染结果摘要。先写不可变快照及 manifest,读回校验,再确认资源修订未变、没有 catalog 锁,最后只更新一个 FLEET.md 入口。中断保留旧入口与不完整快照供检查,不覆盖旧批次。HTML 从内嵌 JSON 读取,不 fetch 本地/外部文件;所有动态文本通过 textContent,禁止 innerHTML/eval、外部 CDN、远端 URL 和 mutation 按钮;内联脚本/样式使用内容摘要 CSP。
|
|
42
|
+
|
|
43
|
+
只读浏览可重复执行,无需再确认部署授权。生成失败保留原执行事实,不因为看板失败而重跑 apply。多个相同 ID 的工作空间不能靠文件复制自动接管:state_root 与控制端身份必须一致。
|
|
44
|
+
|
|
45
|
+
## 时间和状态
|
|
46
|
+
|
|
47
|
+
registered 只说明入账;SSH 公钥认证通过只证明该次登录;base-ready 不代表 Compose-ready;Compose-ready 不代表 APP 健康。checklist 保留必需/可选项、状态和 checked_at,默认超过 24 小时显示 stale。身份、连接或 known_hosts 内容变化、缺失时显示 unknown。历史 pass 项仍可回看,但不得使用过期结果作为当前验收。
|
|
48
|
+
|
|
49
|
+
Node/Docker/Compose、根目录存在、磁盘/内存有自动只读检查。最小权限、时间同步、防火墙、外部依赖和备份恢复默认 unknown,需按项目要求取得真实证据;V 不将它们补写为 pass。没有探测不等于正常。现有 inventory 不验证根目录可写,也不证明备份可恢复。
|
|
50
|
+
|
|
51
|
+
## 兼容与迁移
|
|
52
|
+
|
|
53
|
+
不搬迁原 hosts/*/runs、releases、private、配置镜像或远端目录。现有 runtime-contract 的 opaque_default=preserve-byte-for-byte 继续保护 records,刷新静态 Work 不删除状态。FLEET-DEPLOYMENTS.md 仍由原双边交付生成器维护,V 只拥有 FLEET.md 和 records/views。
|
|
54
|
+
|
|
55
|
+
新增执行器模块/JSON schema 会改变 engine_digest,因此尚未执行的旧计划需要重新生成批准;unknown/运行中现场先 inspect-run,不直接重新部署。旧审批、账本与回执不复用、不篡改。卸载静态扩展也不删除 records 或业务数据。
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# GitHub 调研与采用边界
|
|
2
|
+
|
|
3
|
+
调研使用 GitHub 仓库搜索及固定提交原文,未安装第三方 Skill、未执行其脚本、未复制外部实现。以下材料用于方法选择,不构成部署授权或对第三方“生产可用”宣传的背书。
|
|
4
|
+
|
|
5
|
+
| 来源 | 实际读取内容 | 本次采用 | 不直接采用 |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| [Ansible inventory](https://github.com/ansible/ansible-documentation/blob/7c56be6c083a7f76842be01d16522e7e6309d9c8/docs/docsite/rst/inventory_guide/intro_inventory.rst) | managed nodes、inventory、按模式选择目标;what/where/when 分组 | 独立资源清单、显式目标选择、控制端与被管节点区分;保留 Project/Deployment 关系 | 不新引入 Ansible 运行依赖,不用 all/隐式分组扩展当前任务 |
|
|
8
|
+
| [Linux administration Skill](https://github.com/BagelHole/DevOps-Security-Agent-Skills/blob/0365f57a079b1332f95cf26e31dd2d5332a8399f/infrastructure/servers/linux-administration/SKILL.md) | 包管理、系统信息、文件系统和资源诊断 | 将检查清单按系统/资源/运行环境组织,固定版本且先诊断 | 不照搬 apt upgrade、格式化文件系统、广域清理或随意安装 |
|
|
9
|
+
| [SSH configuration Skill](https://github.com/BagelHole/DevOps-Security-Agent-Skills/blob/0365f57a079b1332f95cf26e31dd2d5332a8399f/infrastructure/servers/ssh-configuration/SKILL.md) | key/agent、指纹、客户端配置、公钥分发、轮换先验证新 key | 密钥/agent 优先、公钥认证单独验收、保留旧通道、接入失败明确阻塞 | 不默认无口令私钥,不自动清 agent,不照搬 sshd 算法清单/关闭密码登录,不隐式添加 ProxyJump 能力 |
|
|
10
|
+
| [Speculo 基线执行器](https://github.com/NAMEWTA/Speculo/tree/60389759ede9f8c4f14b2f7e70da614dfe574ece/template/workflows/ops/common/tools/opslib) | planner、execution、transport、agent、CLI 与 schema | 复用摘要批准、受限写集、身份验证、失败停止、双边回执 | 不重写已有安全底座,不移动历史 Run,不用可视化替代真实验收 |
|
|
11
|
+
|
|
12
|
+
## 设计取舍
|
|
13
|
+
|
|
14
|
+
一次授权的对象是有限任务与精确规格,不是“此后所有运维”。本次任务 runner 增加编译前/后的目标与修改集检查,保留原逐 Run 审批文件,但不要求每步由用户再次对话确认。它不是签名授权系统,也不是防御拥有控制端写权限的恶意管理员的沙箱。
|
|
15
|
+
|
|
16
|
+
离线 HTML 选择原生 HTML/CSS/JavaScript,无前端构建或网络依赖。读模型从 status 与受限证据白名单生成,而非引入第二套数据库。schema v3 不变、新投影 v1、新记录集中 records;这是兼容性重构,不是对既有历史证据的搬家。已有明文历史/真实 env 不自动清理。
|
|
17
|
+
|
|
18
|
+
第一版不宣称支持云资源发现、JumpHost 参数、首次密码自动登录、远程命令按钮、实时监控、数据库自动恢复或全量 CIS 合规评估。这些都需要独立适配与验收,不通过文档暗示已经实现。
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# S:服务器接入与 SSH 公钥认证
|
|
2
|
+
|
|
3
|
+
本文件只在新增/修复服务器接入时读取。Server 是目标机器,不是发起操作的控制端;host_id 保持既有内部身份。
|
|
4
|
+
|
|
5
|
+
## 接入顺序
|
|
6
|
+
|
|
7
|
+
确认用户已经提供的 server_id、地址/端口、远端账号、专用 host.root、可信主机指纹、控制端 SSH 客户端与认证来源;不重复索取已有输入,不把别名相似当作同一服务器。首次指纹必须经云控制台/控制台/既有可信渠道核对,ssh-keyscan 只能收集候选值,不能完成信任。
|
|
8
|
+
|
|
9
|
+
优先复用受限私钥与 ssh-agent。免密登录指无需重复输入服务器账号密码,不等于私钥必须无口令;不得默认 ssh-keygen -N "",不得复制私钥到服务器、项目或看板,也不把密码放在 JSON/argv/日志。只登记 identity_file 的本地受限路径;使用 agent 时不能自动清空用户已有 agent。
|
|
10
|
+
|
|
11
|
+
已有可信登录通道时,仅在原明确授权范围内分发指定公钥,保持旧登录通道,核验新会话成功后才讨论轮换撤销。公钥分发/sshd 修改不是 task-run 的隐式能力;当前执行器不提供首次密码登录或 authorized_keys 写入适配。缺少已验证 key/agent 时,给出待用户在可信交互终端/云控制台完成的最小公钥分发步骤与精确目标,记录“接入阻塞”,不要宣称自动完成,也不要绕过 ops 的写入网关用 sshpass 或任意 shell 写服务器。禁止为方便部署自动关闭密码登录、改 SSH 端口或重启 sshd;这些需要专用可恢复方案。
|
|
12
|
+
|
|
13
|
+
信任和公钥认证具备后,用 USAGE 中的 discovery/probe 读取身份;Linux SSH 缺 Node 时走原 bootstrap-node 的固定 Volta/Node、已审核 tar SHA256 与独立 ack。复用已有 Node,不改 shell profile。随后 enroll(或 register + probe --host)把真实身份与盘点持久化;identity=discover 不可用于 apply。
|
|
14
|
+
|
|
15
|
+
最后运行 `server-check --server ID --profile base`。只有成功验证严格主机密钥、公钥认证和实际机器身份后,才写“接入检查通过”;未通过项与证据文件必须列出。需要 Docker 的项目再走 H 的 compose profile,不能把 base-ready 等同完整部署基线。
|
|
16
|
+
|
|
17
|
+
## 基础环境清单
|
|
18
|
+
|
|
19
|
+
清单固定包括登记、SSH 公钥、机器身份、Linux、Node、根目录、磁盘、内存、Docker、Compose、Docker data-root、最小权限、时间同步、防火墙、外部依赖、备份恢复。后五项没有自动证据时保持 unknown;不抄一套 Linux 加固命令盲目关闭端口/清缓存/升级全机。
|
|
20
|
+
|
|
21
|
+
完成输出:status.hosts 的明确资源、原 hosts/ID/inventory 盘点、records/servers/ID/checks 的检查回执、剩余缺口和下一 Work。执行 V 刷新本地列表,使用户直接从 FLEET.md 进入对应服务器及项目视图。连接失效/指纹改变先停止,不自动替换 known_hosts 或注册另一台机器为同一身份。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 层级路由与一次任务授权
|
|
2
|
+
|
|
3
|
+
本文件拥有范围选择和任务级授权规则。执行能力、路径保护、单计划批准和双边回执仍由 README、原 spec/plan schema 及执行器负责。
|
|
4
|
+
|
|
5
|
+
## 范围必须显式
|
|
6
|
+
|
|
7
|
+
| 用户目的 | scope / Work | 必需输入 | 明确不做 |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| 准备发起操作的本机 | controller / I | 控制端 ID、绝对 state 根 | 不默认把本机登记为服务器 |
|
|
10
|
+
| 接入一台服务器 | access / S | 一个 server_id、可信连接与身份 | 不部署项目、不自动信任主机密钥 |
|
|
11
|
+
| 配置系统环境、Docker、Nginx | server / H | 一个已登记 server_id | 不从 cwd 推断 project |
|
|
12
|
+
| 安装 APP 或共享服务 | project / D | 一个 project_id、明确 server_ids、真实需求 | 不猜服务器、不把主机级入口伪装成 APP |
|
|
13
|
+
| 看服务器/项目清单 | inventory / V | 已初始化 state 根 | 不联网、不部署、不授予后续操作权限 |
|
|
14
|
+
|
|
15
|
+
服务本身是用户交付项目(如公共 MySQL)时走 D;为整个服务器提供基础入口的 Nginx/WireGuard 走 H。项目包含服务反向代理配置不自动拥有整台机器的系统修改权限。用户已给出的目标直接使用,不重复询问;名称无法唯一解析时只阻塞该目标,先完成无歧义只读分析。
|
|
16
|
+
|
|
17
|
+
## 确认任务后,展示 Plan Mode 然后执行
|
|
18
|
+
|
|
19
|
+
用户明确说“按计划实施/重构并执行/部署到指定服务器”属于实施请求;只说“分析/给计划/看看”不构成执行授权。入口先写清目标、服务器与项目、前置检查、固定来源、持久化、依赖顺序、网络与账号影响、备份恢复、健康检查、完成条件、保留/删除边界,再开始执行;不在每步重复询问“是否继续”。
|
|
20
|
+
|
|
21
|
+
任务文件不是授权来源。`task-plan` 保存详细 PLAN.md 与冻结的 H/D specs,返回 task_digest;入口已展示计划且存在明确实施请求时,用 `task-authorize` 记录该原始请求的真实确认语句/来源和确认者,再直接 `task-run`。不要求用户手动执行这三个命令,不伪造用户逐一看过未来 Run digest。
|
|
22
|
+
|
|
23
|
+
H 入口选择一台明确服务器;一个 server 任务可以串行多个 H 步骤,并显式列出包括文档/依赖影响在内的所有获准服务器,不允许变成 D 部署。
|
|
24
|
+
|
|
25
|
+
任务授权固定一个 Controller、显式服务器、一个主项目(server scope 无主项目)、已声明的影响/依赖项目、1–20 个有序规格、最长 24 小时有效期、执行器摘要、连接/known_hosts 内容、凭据账本、input_paths 文件树。输入每文件 ≤16 MiB、总计 ≤256 MiB/10000 文件;大构件使用经审阅的固定摘要下载适配,不内嵌大二进制。H 影响已有服务时把相关项目和 acknowledged_consumers 全部写清。
|
|
26
|
+
|
|
27
|
+
运行器针对每个冻结规格在执行前重新编译实际现场计划,检查声明范围、依赖消费者、编译器完整修改集、源码摘要,再写入 `approved_by=task:<task_id>` 的关联批准;之后调用原 apply。H 为 D 准备环境产生的受控状态变化可在同一任务中继续;无法提前明确的新规格、额外服务器/项目或现场不确定性不能自动扩展。通用自定义命令仍是已审核可执行代码,不是系统调用沙箱;尤其须审核下载来源、安装器、命令引用文件和实际持久化参数。
|
|
28
|
+
|
|
29
|
+
`allow_policy_changes`、`allow_public_ingress`、`allow_destructive` 必须显式声明。迁移、退役、purge-quarantine 还需独立的 `I-APPROVE-THIS-EXACT-DESTRUCTIVE-TASK` 范围确认;它可以包含在原任务授权中,但不能从普通部署请求推断。业务数据删除仍不是默认能力。
|
|
30
|
+
|
|
31
|
+
## 停止与恢复
|
|
32
|
+
|
|
33
|
+
首次任务执行要求资源修订未在准备后发生变化;每步开始前复核身份、连接、输入、凭据、执行器和有效期。计划过期/漂移、未知目标、缺权限、真实输入缺失或锁冲突只阻塞受影响动作,不以“要再确认一下”为由重复打断已授权正常步骤。
|
|
34
|
+
|
|
35
|
+
一旦出现 failed、partial、unknown 或 docs_pending,停止后续步骤并保留 progress、Run 引用、原计划/日志/双边回执。任何 started.json 都禁止 task-run 自动重放,包括已完成任务。不能用新的 task_id 包装同一未知操作以绕过恢复。先 inspect-run,遵循 recovery.md;需要修复或重新部署时形成新的明确规格与任务边界。
|
|
36
|
+
|
|
37
|
+
正常完成必须以原 apply 返回 completed 且双边回执成立为准,再生成 V 的本地视图。V 失败记为“执行结果已保存、视图生成失败”,不能重跑业务。文档或索引不会自动变成永久知识;知识写入仍走原 owner/gateway 并获得独立同意。
|
|
38
|
+
|
|
39
|
+
当前任务编排只接入 H/D;I 初始化和 S 的首次信任建立/固定 Node bootstrap 保留原网关,不用任务授权掩盖缺失的 SSH 登录条件。
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "urn:speculo:ops:fleet-view:v1",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"schema_version": {
|
|
7
|
+
"const": 1
|
|
8
|
+
},
|
|
9
|
+
"artifact": {
|
|
10
|
+
"const": "ops-fleet-view"
|
|
11
|
+
},
|
|
12
|
+
"generated_at": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"format": "date-time"
|
|
15
|
+
},
|
|
16
|
+
"controller_id": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
19
|
+
"maxLength": 80
|
|
20
|
+
},
|
|
21
|
+
"source_revision": {
|
|
22
|
+
"type": "integer",
|
|
23
|
+
"minimum": 0
|
|
24
|
+
},
|
|
25
|
+
"source_digest": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
28
|
+
},
|
|
29
|
+
"stale_hours": {
|
|
30
|
+
"type": "number",
|
|
31
|
+
"exclusiveMinimum": 0,
|
|
32
|
+
"maximum": 8760
|
|
33
|
+
},
|
|
34
|
+
"notice": {
|
|
35
|
+
"type": "string"
|
|
36
|
+
},
|
|
37
|
+
"servers": {
|
|
38
|
+
"type": "array",
|
|
39
|
+
"items": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"properties": {
|
|
42
|
+
"server_id": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
45
|
+
"maxLength": 80
|
|
46
|
+
},
|
|
47
|
+
"name": {
|
|
48
|
+
"type": "string"
|
|
49
|
+
},
|
|
50
|
+
"platform": {
|
|
51
|
+
"type": "string"
|
|
52
|
+
},
|
|
53
|
+
"transport": {
|
|
54
|
+
"enum": [
|
|
55
|
+
"local",
|
|
56
|
+
"ssh"
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
"address": {
|
|
60
|
+
"type": "string"
|
|
61
|
+
},
|
|
62
|
+
"port": {
|
|
63
|
+
"type": [
|
|
64
|
+
"integer",
|
|
65
|
+
"null"
|
|
66
|
+
],
|
|
67
|
+
"minimum": 1,
|
|
68
|
+
"maximum": 65535
|
|
69
|
+
},
|
|
70
|
+
"root": {
|
|
71
|
+
"type": "string"
|
|
72
|
+
},
|
|
73
|
+
"readiness": {
|
|
74
|
+
"enum": [
|
|
75
|
+
"unknown",
|
|
76
|
+
"stale",
|
|
77
|
+
"blocked",
|
|
78
|
+
"ready"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"profile": {
|
|
82
|
+
"enum": [
|
|
83
|
+
null,
|
|
84
|
+
"base",
|
|
85
|
+
"compose",
|
|
86
|
+
"native"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"checked_at": {
|
|
90
|
+
"type": [
|
|
91
|
+
"string",
|
|
92
|
+
"null"
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
"checks": {
|
|
96
|
+
"type": "array",
|
|
97
|
+
"items": {
|
|
98
|
+
"type": "object",
|
|
99
|
+
"properties": {
|
|
100
|
+
"id": {
|
|
101
|
+
"type": "string"
|
|
102
|
+
},
|
|
103
|
+
"status": {
|
|
104
|
+
"enum": [
|
|
105
|
+
"pass",
|
|
106
|
+
"fail",
|
|
107
|
+
"warn",
|
|
108
|
+
"unknown",
|
|
109
|
+
"not-applicable"
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
"required": {
|
|
113
|
+
"type": "boolean"
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
"required": [
|
|
117
|
+
"id",
|
|
118
|
+
"status",
|
|
119
|
+
"required"
|
|
120
|
+
],
|
|
121
|
+
"additionalProperties": false
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"project_ids": {
|
|
125
|
+
"type": "array",
|
|
126
|
+
"items": {
|
|
127
|
+
"type": "string",
|
|
128
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
129
|
+
"maxLength": 80
|
|
130
|
+
},
|
|
131
|
+
"uniqueItems": true
|
|
132
|
+
},
|
|
133
|
+
"deployment_ids": {
|
|
134
|
+
"type": "array",
|
|
135
|
+
"items": {
|
|
136
|
+
"type": "string",
|
|
137
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
138
|
+
"maxLength": 80
|
|
139
|
+
},
|
|
140
|
+
"uniqueItems": true
|
|
141
|
+
},
|
|
142
|
+
"host_services": {
|
|
143
|
+
"type": "array",
|
|
144
|
+
"items": {
|
|
145
|
+
"type": "object",
|
|
146
|
+
"properties": {
|
|
147
|
+
"service_id": {
|
|
148
|
+
"type": "string",
|
|
149
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
150
|
+
"maxLength": 80
|
|
151
|
+
},
|
|
152
|
+
"kind": {
|
|
153
|
+
"type": "string"
|
|
154
|
+
},
|
|
155
|
+
"unit": {
|
|
156
|
+
"type": "string"
|
|
157
|
+
},
|
|
158
|
+
"port": {
|
|
159
|
+
"type": [
|
|
160
|
+
"integer",
|
|
161
|
+
"null"
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
"required": [
|
|
166
|
+
"service_id",
|
|
167
|
+
"kind",
|
|
168
|
+
"unit",
|
|
169
|
+
"port"
|
|
170
|
+
],
|
|
171
|
+
"additionalProperties": false
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
"required": [
|
|
176
|
+
"server_id",
|
|
177
|
+
"name",
|
|
178
|
+
"platform",
|
|
179
|
+
"transport",
|
|
180
|
+
"address",
|
|
181
|
+
"port",
|
|
182
|
+
"root",
|
|
183
|
+
"readiness",
|
|
184
|
+
"profile",
|
|
185
|
+
"checked_at",
|
|
186
|
+
"checks",
|
|
187
|
+
"project_ids",
|
|
188
|
+
"deployment_ids",
|
|
189
|
+
"host_services"
|
|
190
|
+
],
|
|
191
|
+
"additionalProperties": false
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
"projects": {
|
|
195
|
+
"type": "array",
|
|
196
|
+
"items": {
|
|
197
|
+
"type": "object",
|
|
198
|
+
"properties": {
|
|
199
|
+
"project_id": {
|
|
200
|
+
"type": "string",
|
|
201
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
202
|
+
"maxLength": 80
|
|
203
|
+
},
|
|
204
|
+
"kind": {
|
|
205
|
+
"type": "string"
|
|
206
|
+
},
|
|
207
|
+
"service_type": {
|
|
208
|
+
"type": "string"
|
|
209
|
+
},
|
|
210
|
+
"server_ids": {
|
|
211
|
+
"type": "array",
|
|
212
|
+
"items": {
|
|
213
|
+
"type": "string",
|
|
214
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
215
|
+
"maxLength": 80
|
|
216
|
+
},
|
|
217
|
+
"uniqueItems": true
|
|
218
|
+
},
|
|
219
|
+
"deployment_ids": {
|
|
220
|
+
"type": "array",
|
|
221
|
+
"items": {
|
|
222
|
+
"type": "string",
|
|
223
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
224
|
+
"maxLength": 80
|
|
225
|
+
},
|
|
226
|
+
"uniqueItems": true
|
|
227
|
+
},
|
|
228
|
+
"name": {
|
|
229
|
+
"type": "string"
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"required": [
|
|
233
|
+
"project_id",
|
|
234
|
+
"name",
|
|
235
|
+
"kind",
|
|
236
|
+
"service_type",
|
|
237
|
+
"server_ids",
|
|
238
|
+
"deployment_ids"
|
|
239
|
+
],
|
|
240
|
+
"additionalProperties": false
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"deployments": {
|
|
244
|
+
"type": "array",
|
|
245
|
+
"items": {
|
|
246
|
+
"type": "object",
|
|
247
|
+
"properties": {
|
|
248
|
+
"deployment_id": {
|
|
249
|
+
"type": "string",
|
|
250
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
251
|
+
"maxLength": 80
|
|
252
|
+
},
|
|
253
|
+
"project_id": {
|
|
254
|
+
"type": "string",
|
|
255
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
256
|
+
"maxLength": 80
|
|
257
|
+
},
|
|
258
|
+
"server_id": {
|
|
259
|
+
"type": "string",
|
|
260
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
261
|
+
"maxLength": 80
|
|
262
|
+
},
|
|
263
|
+
"environment": {
|
|
264
|
+
"type": "string"
|
|
265
|
+
},
|
|
266
|
+
"instance": {
|
|
267
|
+
"type": "string"
|
|
268
|
+
},
|
|
269
|
+
"method": {
|
|
270
|
+
"type": "string"
|
|
271
|
+
},
|
|
272
|
+
"root": {
|
|
273
|
+
"type": "string"
|
|
274
|
+
},
|
|
275
|
+
"status": {
|
|
276
|
+
"type": "string"
|
|
277
|
+
},
|
|
278
|
+
"desired_version": {
|
|
279
|
+
"type": "string"
|
|
280
|
+
},
|
|
281
|
+
"observed_version": {
|
|
282
|
+
"type": [
|
|
283
|
+
"string",
|
|
284
|
+
"null"
|
|
285
|
+
]
|
|
286
|
+
},
|
|
287
|
+
"updated_at": {
|
|
288
|
+
"type": [
|
|
289
|
+
"string",
|
|
290
|
+
"null"
|
|
291
|
+
]
|
|
292
|
+
},
|
|
293
|
+
"run_id": {
|
|
294
|
+
"type": [
|
|
295
|
+
"string",
|
|
296
|
+
"null"
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
"required": [
|
|
301
|
+
"deployment_id",
|
|
302
|
+
"project_id",
|
|
303
|
+
"server_id",
|
|
304
|
+
"environment",
|
|
305
|
+
"instance",
|
|
306
|
+
"method",
|
|
307
|
+
"root",
|
|
308
|
+
"status",
|
|
309
|
+
"desired_version",
|
|
310
|
+
"observed_version",
|
|
311
|
+
"updated_at",
|
|
312
|
+
"run_id"
|
|
313
|
+
],
|
|
314
|
+
"additionalProperties": false
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
"bindings": {
|
|
318
|
+
"type": "array",
|
|
319
|
+
"items": {
|
|
320
|
+
"type": "object",
|
|
321
|
+
"properties": {
|
|
322
|
+
"binding_id": {
|
|
323
|
+
"type": "string",
|
|
324
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
325
|
+
"maxLength": 80
|
|
326
|
+
},
|
|
327
|
+
"consumer_deployment_id": {
|
|
328
|
+
"type": "string",
|
|
329
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
330
|
+
"maxLength": 80
|
|
331
|
+
},
|
|
332
|
+
"provider_deployment_id": {
|
|
333
|
+
"type": [
|
|
334
|
+
"string",
|
|
335
|
+
"null"
|
|
336
|
+
]
|
|
337
|
+
},
|
|
338
|
+
"mode": {
|
|
339
|
+
"type": "string"
|
|
340
|
+
},
|
|
341
|
+
"status": {
|
|
342
|
+
"type": "string"
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
"required": [
|
|
346
|
+
"binding_id",
|
|
347
|
+
"consumer_deployment_id",
|
|
348
|
+
"provider_deployment_id",
|
|
349
|
+
"mode",
|
|
350
|
+
"status"
|
|
351
|
+
],
|
|
352
|
+
"additionalProperties": false
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
"releases": {
|
|
356
|
+
"type": "array",
|
|
357
|
+
"items": {
|
|
358
|
+
"type": "object",
|
|
359
|
+
"properties": {
|
|
360
|
+
"run_id": {
|
|
361
|
+
"type": "string",
|
|
362
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
363
|
+
"maxLength": 80
|
|
364
|
+
},
|
|
365
|
+
"worker": {
|
|
366
|
+
"type": "string"
|
|
367
|
+
},
|
|
368
|
+
"status": {
|
|
369
|
+
"type": "string"
|
|
370
|
+
},
|
|
371
|
+
"server_ids": {
|
|
372
|
+
"type": "array",
|
|
373
|
+
"items": {
|
|
374
|
+
"type": "string",
|
|
375
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
376
|
+
"maxLength": 80
|
|
377
|
+
},
|
|
378
|
+
"uniqueItems": true
|
|
379
|
+
},
|
|
380
|
+
"deployment_ids": {
|
|
381
|
+
"type": "array",
|
|
382
|
+
"items": {
|
|
383
|
+
"type": "string",
|
|
384
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
385
|
+
"maxLength": 80
|
|
386
|
+
},
|
|
387
|
+
"uniqueItems": true
|
|
388
|
+
},
|
|
389
|
+
"updated_at": {
|
|
390
|
+
"type": [
|
|
391
|
+
"string",
|
|
392
|
+
"null"
|
|
393
|
+
]
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
"required": [
|
|
397
|
+
"run_id",
|
|
398
|
+
"worker",
|
|
399
|
+
"status",
|
|
400
|
+
"server_ids",
|
|
401
|
+
"deployment_ids",
|
|
402
|
+
"updated_at"
|
|
403
|
+
],
|
|
404
|
+
"additionalProperties": false
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
"tasks": {
|
|
408
|
+
"type": "array",
|
|
409
|
+
"items": {
|
|
410
|
+
"type": "object",
|
|
411
|
+
"properties": {
|
|
412
|
+
"task_id": {
|
|
413
|
+
"type": "string",
|
|
414
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
415
|
+
"maxLength": 80
|
|
416
|
+
},
|
|
417
|
+
"scope": {
|
|
418
|
+
"type": "string"
|
|
419
|
+
},
|
|
420
|
+
"server_ids": {
|
|
421
|
+
"type": "array",
|
|
422
|
+
"items": {
|
|
423
|
+
"type": "string",
|
|
424
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
425
|
+
"maxLength": 80
|
|
426
|
+
},
|
|
427
|
+
"uniqueItems": true
|
|
428
|
+
},
|
|
429
|
+
"project_ids": {
|
|
430
|
+
"type": "array",
|
|
431
|
+
"items": {
|
|
432
|
+
"type": "string",
|
|
433
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
434
|
+
"maxLength": 80
|
|
435
|
+
},
|
|
436
|
+
"uniqueItems": true
|
|
437
|
+
},
|
|
438
|
+
"status": {
|
|
439
|
+
"type": "string"
|
|
440
|
+
},
|
|
441
|
+
"updated_at": {
|
|
442
|
+
"type": [
|
|
443
|
+
"string",
|
|
444
|
+
"null"
|
|
445
|
+
]
|
|
446
|
+
},
|
|
447
|
+
"run_ids": {
|
|
448
|
+
"type": "array",
|
|
449
|
+
"items": {
|
|
450
|
+
"type": "string",
|
|
451
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
452
|
+
"maxLength": 80
|
|
453
|
+
},
|
|
454
|
+
"uniqueItems": true
|
|
455
|
+
}
|
|
456
|
+
},
|
|
457
|
+
"required": [
|
|
458
|
+
"task_id",
|
|
459
|
+
"scope",
|
|
460
|
+
"server_ids",
|
|
461
|
+
"project_ids",
|
|
462
|
+
"status",
|
|
463
|
+
"updated_at",
|
|
464
|
+
"run_ids"
|
|
465
|
+
],
|
|
466
|
+
"additionalProperties": false
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
},
|
|
470
|
+
"required": [
|
|
471
|
+
"schema_version",
|
|
472
|
+
"artifact",
|
|
473
|
+
"generated_at",
|
|
474
|
+
"controller_id",
|
|
475
|
+
"source_revision",
|
|
476
|
+
"source_digest",
|
|
477
|
+
"stale_hours",
|
|
478
|
+
"notice",
|
|
479
|
+
"servers",
|
|
480
|
+
"projects",
|
|
481
|
+
"deployments",
|
|
482
|
+
"bindings",
|
|
483
|
+
"releases",
|
|
484
|
+
"tasks"
|
|
485
|
+
],
|
|
486
|
+
"additionalProperties": false
|
|
487
|
+
}
|