@intentius/terragucci 0.4.2 → 0.4.4
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/README.md +1 -0
- package/dist/audit.schema.json +34 -0
- package/dist/changes.schema.json +33 -0
- package/dist/dora.schema.json +104 -0
- package/dist/estate.schema.json +250 -0
- package/dist/history.schema.json +49 -0
- package/dist/inventory.schema.json +38 -0
- package/dist/notify.schema.json +66 -0
- package/dist/report-index.schema.json +67 -0
- package/dist/report.schema.json +137 -2
- package/dist/run.schema.json +88 -0
- package/dist/state-versions.schema.json +42 -0
- package/dist/terragucci.mjs +639 -393
- package/dist/terragucci.mjs.map +4 -4
- package/dist/types.d.ts +150 -9
- package/package.json +3 -2
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/terragucci/schemas/report-index/v1/report-index.schema.json",
|
|
4
|
+
"title": "terragucci.report-index/v1",
|
|
5
|
+
"description": "A reports bucket's index.json: one row per run, newest first. Within v1 fields are only added, and an existing field never changes meaning.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["schema", "reports"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema": { "const": "terragucci.report-index/v1" },
|
|
10
|
+
"reports": {
|
|
11
|
+
"type": "array",
|
|
12
|
+
"description": "Newest first: up to 500 rows, then the newest row of each project, stage and wave beyond them.",
|
|
13
|
+
"items": { "$ref": "#/$defs/row" }
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"$defs": {
|
|
17
|
+
"totals": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"required": ["create", "update", "replace", "delete"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"create": { "type": "integer" },
|
|
22
|
+
"update": { "type": "integer" },
|
|
23
|
+
"replace": { "type": "integer" },
|
|
24
|
+
"delete": { "type": "integer" }
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"row": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"required": ["project", "commit", "stage", "finished", "path", "roots", "groups", "totals", "refused", "destroys"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"project": { "type": "string", "description": "<host>/<path> of the repo." },
|
|
32
|
+
"commit": { "type": "string" },
|
|
33
|
+
"stage": { "enum": ["tf-plan", "tf-apply", "tf-drift"] },
|
|
34
|
+
"wave": { "type": "integer", "description": "The wave of a tf-apply run." },
|
|
35
|
+
"share": { "type": "integer", "description": "The share of a tf-apply wave split across jobs." },
|
|
36
|
+
"finished": { "type": "string", "description": "When the run finished, ISO 8601." },
|
|
37
|
+
"path": { "type": "string", "description": "The run's directory, relative to this index: <yyyy>/<mm>/<commit>/<stage>[-wave-N[-share-S]] in a project's index, prefixed with the project in the top index." },
|
|
38
|
+
"roots": { "type": "integer" },
|
|
39
|
+
"groups": { "type": "integer" },
|
|
40
|
+
"totals": { "$ref": "#/$defs/totals" },
|
|
41
|
+
"refused": { "type": "integer", "description": "Roots that refused to plan." },
|
|
42
|
+
"failed": { "type": "integer", "description": "Roots that failed to plan or apply. Absent on rows written before it was kept." },
|
|
43
|
+
"changed": { "type": "integer", "description": "Roots with at least one change; on a tf-drift row, the roots that drifted." },
|
|
44
|
+
"approval": { "enum": ["waiting", "approved", "not-required"], "description": "A tf-apply wave's gate." },
|
|
45
|
+
"waiting_since": { "type": "string", "description": "When a waiting wave began waiting for an approval of its digest." },
|
|
46
|
+
"applied": { "type": "string", "description": "When a tf-apply wave finished applying." },
|
|
47
|
+
"overridden": { "type": "integer", "description": "Roots the policy denied that a recorded override let through. Absent when none." },
|
|
48
|
+
"wave_digests": { "type": "array", "items": { "type": "string" }, "description": "A tf-plan row: each wave's set digest and review digest, the digests an apply of the same plans binds. Absent when no wave has one." },
|
|
49
|
+
"drifted_roots": { "type": "array", "items": { "type": "string" }, "description": "A tf-drift row: the roots that drifted, at most 50. Absent when none drifted." },
|
|
50
|
+
"drift_since": { "type": "string", "description": "A tf-drift row that found drift: when the project's open drift was first found, by this run or an earlier one." },
|
|
51
|
+
"drift_cleared": {
|
|
52
|
+
"type": "object",
|
|
53
|
+
"description": "A tf-drift row that found none after a row that found some: when that drift was first found, and its roots.",
|
|
54
|
+
"required": ["since", "roots"],
|
|
55
|
+
"properties": { "since": { "type": "string" }, "roots": { "type": "array", "items": { "type": "string" } } }
|
|
56
|
+
},
|
|
57
|
+
"destroys": { "type": "array", "items": { "type": "string" }, "description": "Destroys and replacements as `<root>: <address>`, at most 50." },
|
|
58
|
+
"destroys_total": { "type": "integer", "description": "How many destroys and replacements there are, when there are more than the row lists." },
|
|
59
|
+
"commit_url": { "type": "string" },
|
|
60
|
+
"pull_request": { "type": "string" },
|
|
61
|
+
"pull_request_url": { "type": "string" },
|
|
62
|
+
"job_url": { "type": "string" },
|
|
63
|
+
"trace_url": { "type": "string" }
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
package/dist/report.schema.json
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"base": { "type": "string" },
|
|
18
18
|
"stage": { "enum": ["tf-plan", "tf-apply", "tf-drift"] },
|
|
19
19
|
"wave": { "type": "integer" },
|
|
20
|
+
"share": { "type": "integer", "minimum": 1, "description": "On a tf-apply wave split across jobs (waves.jobs), the share this report applied; waves[0].roots are its roots (minor 20)." },
|
|
20
21
|
"binary": { "type": "string" },
|
|
21
22
|
"runtime": { "type": "string" },
|
|
22
23
|
"started": { "type": "string" },
|
|
@@ -70,6 +71,16 @@
|
|
|
70
71
|
"required": ["path", "status", "plan_digest", "counts", "plan", "changes", "highlights", "fold", "why"],
|
|
71
72
|
"properties": {
|
|
72
73
|
"path": { "type": "string" },
|
|
74
|
+
"binary": {
|
|
75
|
+
"description": "The binary the root ran, its version, and where the root pinned that version when it did (minor 18).",
|
|
76
|
+
"type": "object",
|
|
77
|
+
"required": ["name"],
|
|
78
|
+
"properties": {
|
|
79
|
+
"name": { "type": "string" },
|
|
80
|
+
"version": { "type": "string" },
|
|
81
|
+
"pin": { "type": "string" }
|
|
82
|
+
}
|
|
83
|
+
},
|
|
73
84
|
"terragrunt": {
|
|
74
85
|
"description": "Set when the root is a Terragrunt unit (minor 1).",
|
|
75
86
|
"type": "object",
|
|
@@ -169,6 +180,68 @@
|
|
|
169
180
|
}
|
|
170
181
|
}
|
|
171
182
|
}
|
|
183
|
+
},
|
|
184
|
+
"resources": {
|
|
185
|
+
"description": "On a tf-apply wave, a root that applied or had nothing to apply: every managed resource it holds afterwards, from the plan's planned values. Never a value (minor 14).",
|
|
186
|
+
"type": "array",
|
|
187
|
+
"items": { "$ref": "#/$defs/resource" }
|
|
188
|
+
},
|
|
189
|
+
"applied_changes": {
|
|
190
|
+
"description": "On a tf-apply wave, a root that applied: what the apply did to each resource, and the top-level attributes an update or a replacement changed, by name. Never a value (minor 15).",
|
|
191
|
+
"type": "array",
|
|
192
|
+
"items": {
|
|
193
|
+
"type": "object",
|
|
194
|
+
"required": ["address", "type", "actions", "attributes"],
|
|
195
|
+
"properties": {
|
|
196
|
+
"address": { "type": "string" },
|
|
197
|
+
"type": { "type": "string" },
|
|
198
|
+
"actions": { "type": "array", "items": { "enum": ["create", "update", "replace", "delete", "import", "move", "forget"] } },
|
|
199
|
+
"attributes": { "type": "array", "items": { "type": "string" } },
|
|
200
|
+
"previous_address": { "type": "string" }
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"state": {
|
|
205
|
+
"description": "On a tf-apply wave, a root that applied or had nothing to apply: the state version its backend holds afterwards, read from the object's metadata, never its contents (minor 20).",
|
|
206
|
+
"type": "object",
|
|
207
|
+
"required": ["backend", "versioning"],
|
|
208
|
+
"properties": {
|
|
209
|
+
"backend": { "type": "string" },
|
|
210
|
+
"location": { "type": "string" },
|
|
211
|
+
"version_id": { "type": "string" },
|
|
212
|
+
"versioning": { "enum": ["on", "off", "unknown"] },
|
|
213
|
+
"note": { "type": "string" }
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
"steps": {
|
|
217
|
+
"description": "The steps that ran for the root, in the order they ran (minor 17). failed: the root failed; approval: an on_failure: approve step failed, so the root's wave waits for an approval.",
|
|
218
|
+
"type": "array",
|
|
219
|
+
"items": {
|
|
220
|
+
"type": "object",
|
|
221
|
+
"required": ["name", "when", "status", "exit", "seconds"],
|
|
222
|
+
"properties": {
|
|
223
|
+
"name": { "type": "string" },
|
|
224
|
+
"when": { "enum": ["before-init", "after-init", "before-plan", "after-plan", "before-apply", "after-apply", "before-drift", "after-drift"] },
|
|
225
|
+
"status": { "enum": ["passed", "failed", "approval"] },
|
|
226
|
+
"exit": { "type": ["integer", "null"] },
|
|
227
|
+
"seconds": { "type": "number" }
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
"reads": {
|
|
232
|
+
"description": "The roots whose state the root reads through terraform_remote_state, and which outputs it planned on: planned, the upstream's plan in this run, with the outputs known only once it applies under unknown; applied, its state as it stands (minor 21).",
|
|
233
|
+
"type": "array",
|
|
234
|
+
"items": {
|
|
235
|
+
"type": "object",
|
|
236
|
+
"required": ["upstream", "data", "outputs"],
|
|
237
|
+
"properties": {
|
|
238
|
+
"upstream": { "type": "string" },
|
|
239
|
+
"data": { "type": "string" },
|
|
240
|
+
"outputs": { "enum": ["planned", "applied"] },
|
|
241
|
+
"unknown": { "type": "array", "items": { "type": "string" } },
|
|
242
|
+
"why": { "type": "string" }
|
|
243
|
+
}
|
|
244
|
+
}
|
|
172
245
|
}
|
|
173
246
|
}
|
|
174
247
|
}
|
|
@@ -201,7 +274,38 @@
|
|
|
201
274
|
"by": { "type": "string" },
|
|
202
275
|
"roots": { "type": "array", "items": { "type": "string" } }
|
|
203
276
|
}
|
|
204
|
-
}
|
|
277
|
+
},
|
|
278
|
+
"review": {
|
|
279
|
+
"type": "object",
|
|
280
|
+
"description": "A waiting tf-apply wave under approval: pr-review: the pull request whose approving review of its head would approve the wave, and the page to review it on (minor 13).",
|
|
281
|
+
"required": ["pull_request", "url"],
|
|
282
|
+
"properties": {
|
|
283
|
+
"pull_request": { "type": "integer" },
|
|
284
|
+
"url": { "type": "string" }
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
"held_by_steps": {
|
|
288
|
+
"type": "array",
|
|
289
|
+
"items": { "type": "string" },
|
|
290
|
+
"description": "The roots whose on_failure: approve step failed: the gate holds the wave whatever the gate policy says, when it changes anything (minor 17)."
|
|
291
|
+
},
|
|
292
|
+
"cost": {
|
|
293
|
+
"type": "object",
|
|
294
|
+
"description": "The wave's monthly cost, when cost is on (minor 19): the sums over its roots estimated, and with cost.approve_above at base whether the change is over it, so the wave waits for an approval whatever the gate.",
|
|
295
|
+
"required": ["currency", "monthly_delta", "monthly_total", "past_monthly_total"],
|
|
296
|
+
"properties": {
|
|
297
|
+
"currency": { "type": "string" },
|
|
298
|
+
"monthly_delta": { "type": ["number", "null"] },
|
|
299
|
+
"monthly_total": { "type": ["number", "null"] },
|
|
300
|
+
"past_monthly_total": { "type": ["number", "null"] },
|
|
301
|
+
"unestimated": { "type": "array", "items": { "type": "string" } },
|
|
302
|
+
"approve_above": { "type": "number" },
|
|
303
|
+
"over": { "type": "boolean" }
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
"state": { "enum": ["planned", "waiting", "applying", "applied", "refused", "failed"], "description": "Where the wave stands (minor 21): a tf-plan wave is planned; a tf-apply wave waiting, applying, applied, refused or failed." },
|
|
307
|
+
"reads": { "type": "array", "items": { "type": "integer" }, "description": "The waves whose roots' state its roots read (minor 21)." },
|
|
308
|
+
"replans_after": { "type": "array", "items": { "type": "integer" }, "description": "A tf-plan wave whose plans read outputs known only once these waves apply: it plans again after they apply and waits for an approval of that plan; its review digest is null (minor 21)." }
|
|
205
309
|
}
|
|
206
310
|
}
|
|
207
311
|
},
|
|
@@ -249,8 +353,30 @@
|
|
|
249
353
|
"overriders": { "type": "array", "items": { "type": "string" }, "description": "Who may override a denial, from policy.override at base (minor 10)." }
|
|
250
354
|
}
|
|
251
355
|
},
|
|
356
|
+
"blast": {
|
|
357
|
+
"description": "A tf-plan run's blast radius (minor 22): the roots whose plan changes a resource or an output, and every root of the repo that reads their state through terraform_remote_state, followed through, nearest first. Absent when no root's plan changes anything, on a Terragrunt repo, and on other stages.",
|
|
358
|
+
"type": "object",
|
|
359
|
+
"required": ["roots", "downstream"],
|
|
360
|
+
"properties": {
|
|
361
|
+
"roots": { "type": "array", "items": { "type": "string" } },
|
|
362
|
+
"downstream": {
|
|
363
|
+
"type": "array",
|
|
364
|
+
"items": {
|
|
365
|
+
"type": "object",
|
|
366
|
+
"required": ["root", "reads", "depth", "planned"],
|
|
367
|
+
"properties": {
|
|
368
|
+
"root": { "type": "string" },
|
|
369
|
+
"reads": { "type": "array", "items": { "type": "string" }, "description": "The roots in the radius whose state it reads." },
|
|
370
|
+
"depth": { "type": "integer", "minimum": 1, "description": "1 when it reads a changed root's state itself, 2 when it reads such a reader's, and so on." },
|
|
371
|
+
"wave": { "type": "integer", "description": "The apply wave it is in." },
|
|
372
|
+
"planned": { "type": "boolean", "description": "Whether this run planned it." }
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
},
|
|
252
378
|
"cost": {
|
|
253
|
-
"description": "The cost estimate of a tf-plan run, when cost is on (minor 12): each root's monthly cost from the estimator, and the sums over the roots estimated.",
|
|
379
|
+
"description": "The cost estimate of a tf-plan run, or of a tf-apply wave's plans (minor 19), when cost is on (minor 12): each root's monthly cost from the estimator, and the sums over the roots estimated.",
|
|
254
380
|
"type": "object",
|
|
255
381
|
"required": ["estimator", "currency", "monthly_delta", "monthly_total", "past_monthly_total", "roots"],
|
|
256
382
|
"properties": {
|
|
@@ -379,6 +505,15 @@
|
|
|
379
505
|
}
|
|
380
506
|
},
|
|
381
507
|
"$defs": {
|
|
508
|
+
"resource": {
|
|
509
|
+
"type": "object",
|
|
510
|
+
"required": ["address", "type", "provider"],
|
|
511
|
+
"properties": {
|
|
512
|
+
"address": { "type": "string" },
|
|
513
|
+
"type": { "type": "string" },
|
|
514
|
+
"provider": { "type": "string", "description": "The provider's source address, such as registry.opentofu.org/hashicorp/aws." }
|
|
515
|
+
}
|
|
516
|
+
},
|
|
382
517
|
"timingDetail": { "enum": ["resources", "aggregate", "none"] },
|
|
383
518
|
"timingSource": { "description": "binary: terragucci timed each run of the binary; terragrunt: from Terragrunt's run report (minor 3).", "enum": ["binary", "terragrunt"] },
|
|
384
519
|
"rootTimings": {
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/terragucci/schemas/run/v1/run.schema.json",
|
|
4
|
+
"title": "terragucci.run/v1",
|
|
5
|
+
"description": "run.json under <prefix>/<project>/runs/<commit>/: the apply of one commit, every wave of it, the roots in each and the roots whose state each reads, and where each wave stands at its gate. Each tf-apply wave job rewrites its own row when it starts applying and when it ends. Within v1 fields are only added, and an existing field never changes meaning.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["schema", "project", "commit", "updated", "roots", "waves"],
|
|
8
|
+
"$defs": {
|
|
9
|
+
"state": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"required": ["key"],
|
|
12
|
+
"properties": {
|
|
13
|
+
"bucket": { "type": "string" },
|
|
14
|
+
"key": { "type": "string" }
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"properties": {
|
|
19
|
+
"schema": { "const": "terragucci.run/v1" },
|
|
20
|
+
"project": { "type": "string" },
|
|
21
|
+
"commit": { "type": "string" },
|
|
22
|
+
"updated": { "type": "string", "description": "When a wave job last wrote it." },
|
|
23
|
+
"roots": {
|
|
24
|
+
"type": "array",
|
|
25
|
+
"description": "Each root, its wave, and the roots whose state it reads through terraform_remote_state. Empty for a Terragrunt repo.",
|
|
26
|
+
"items": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"required": ["root", "wave", "reads"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"root": { "type": "string" },
|
|
31
|
+
"wave": { "type": "integer" },
|
|
32
|
+
"reads": { "type": "array", "items": { "type": "string" } },
|
|
33
|
+
"state": { "$ref": "#/$defs/state", "description": "The state its backend block names, which a root of another project may read." },
|
|
34
|
+
"external": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"description": "Its terraform_remote_state reads of a state no root of the project holds: the block's label and the state it names. The estate page matches them to other projects' roots.",
|
|
37
|
+
"items": {
|
|
38
|
+
"type": "object",
|
|
39
|
+
"required": ["data", "key"],
|
|
40
|
+
"properties": {
|
|
41
|
+
"data": { "type": "string" },
|
|
42
|
+
"bucket": { "type": "string" },
|
|
43
|
+
"key": { "type": "string" }
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"waves": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"items": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"required": ["number", "roots", "reads", "state", "gate"],
|
|
55
|
+
"properties": {
|
|
56
|
+
"number": { "type": "integer" },
|
|
57
|
+
"roots": { "type": "array", "items": { "type": "string" } },
|
|
58
|
+
"reads": { "type": "array", "items": { "type": "integer" }, "description": "The waves whose roots' state its roots read." },
|
|
59
|
+
"state": { "enum": ["not-started", "planned", "waiting", "applying", "applied", "refused", "failed"] },
|
|
60
|
+
"gate": { "type": "string", "description": "Its gate on the ledger, wave-<n>." },
|
|
61
|
+
"policy": { "type": "string", "description": "The gate policy it ran under: always, on-destroy or never." },
|
|
62
|
+
"approval": { "enum": ["not-requested", "waiting", "approved", "not-required"] },
|
|
63
|
+
"digest": { "type": ["string", "null"], "description": "The set digest its gate decided on." },
|
|
64
|
+
"command": { "type": "string", "description": "The command that approves it, while it waits." },
|
|
65
|
+
"report": { "type": "string", "description": "Its report's directory, relative to the project's index.json." },
|
|
66
|
+
"shares": { "type": "integer", "description": "A wave split across jobs: how many share jobs apply it." },
|
|
67
|
+
"shares_applied": { "type": "array", "items": { "type": "integer" }, "description": "The shares that applied; the wave is applied once every share has." },
|
|
68
|
+
"changed": { "type": "array", "items": { "type": "string" }, "description": "The roots whose plan in this wave changes a resource or an output: where the run's blast radius starts." },
|
|
69
|
+
"spans": {
|
|
70
|
+
"type": "array",
|
|
71
|
+
"description": "The wave's time, oldest first: each plan, each wait at its gate (no end while it waits) and each apply (no end while it applies). At most 24.",
|
|
72
|
+
"items": {
|
|
73
|
+
"type": "object",
|
|
74
|
+
"required": ["phase", "start"],
|
|
75
|
+
"properties": {
|
|
76
|
+
"phase": { "enum": ["plan", "gate", "apply"] },
|
|
77
|
+
"start": { "type": "string" },
|
|
78
|
+
"end": { "type": "string" },
|
|
79
|
+
"share": { "type": "integer", "description": "The share of a wave split across jobs that planned or applied." }
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"updated": { "type": "string" }
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/terragucci/schemas/state-versions/v1/state-versions.schema.json",
|
|
4
|
+
"title": "terragucci.state-versions/v1",
|
|
5
|
+
"description": "states.json in a project's directory of a reports prefix: for each root, where its state is, whether its backend keeps versions, and the version ids its tf-apply waves left, newest first. Version ids, never a state's contents. Within v1 fields are only added, and an existing field never changes meaning.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["schema", "roots"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema": { "const": "terragucci.state-versions/v1" },
|
|
10
|
+
"roots": {
|
|
11
|
+
"type": "array",
|
|
12
|
+
"description": "By root path.",
|
|
13
|
+
"items": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"required": ["root", "backend", "versioning", "checked", "versions"],
|
|
16
|
+
"properties": {
|
|
17
|
+
"root": { "type": "string" },
|
|
18
|
+
"backend": { "type": "string", "description": "The backend the root initialised: s3, local, gcs and so on." },
|
|
19
|
+
"location": { "type": "string", "description": "s3://<bucket>/<key>, or the local file's path in the root." },
|
|
20
|
+
"versioning": { "enum": ["on", "off", "unknown"], "description": "As the newest apply found it." },
|
|
21
|
+
"note": { "type": "string", "description": "Why the version could not be read, or what off means for this backend." },
|
|
22
|
+
"checked": { "type": "string", "description": "When the newest apply that recorded the root finished." },
|
|
23
|
+
"versions": {
|
|
24
|
+
"type": "array",
|
|
25
|
+
"description": "Newest first, at most 20.",
|
|
26
|
+
"items": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"required": ["version_id", "commit", "finished", "path"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"version_id": { "type": "string" },
|
|
31
|
+
"commit": { "type": "string" },
|
|
32
|
+
"finished": { "type": "string", "description": "When the wave that recorded the version finished." },
|
|
33
|
+
"wave": { "type": "integer" },
|
|
34
|
+
"path": { "type": "string", "description": "The wave's run directory, relative to the project's index.json." }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|