2664 lines
72 KiB
JSON
2664 lines
72 KiB
JSON
{
|
|
"format": 1,
|
|
"seat": "node-engine",
|
|
"scope": "node",
|
|
"grain": "whole",
|
|
"domain": "Core",
|
|
"decision": "novox/hq ADR 0563",
|
|
"description": "The node seat every node's engine holds (novox/hq ADR 0563, ADR 0618 §3, §4): its hand acts on the operator's warrant, its read-only judgements, its compositions and what it reads of a manifest. Each verb is answered on this node's subject, mesh.seat.node-engine.tool.<verb>.<node>, and each event is published on mesh.seat.node-engine.event.<event>.<node>, the node's name its last token.",
|
|
"held-by-the-engine": true,
|
|
"verbs": [
|
|
{
|
|
"name": "hand-over",
|
|
"description": "Hand a directory this machine uses as found to the mesh (novox/hq ADR 0563 §3, §5): the engine judges the path as it does every hand-over (absolute, as it states it, used as found, reached through no link) and refuses in words, or asks the operator on their channel at the level approve, binding the owner, group and mode it will set. Nothing changes on the call: only the operator's yes hands it over. One ask is open per path; acts shows where it stands.",
|
|
"input": {
|
|
"properties": {
|
|
"path": {
|
|
"description": "the directory's absolute path, as the engine states it",
|
|
"type": "string"
|
|
},
|
|
"why": {
|
|
"description": "why it is asked, in words the operator reads",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"path"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"$ref": "#/defs/Asked"
|
|
}
|
|
},
|
|
{
|
|
"name": "access-act",
|
|
"description": "Ask the operator for the take act on a library whose root holds data outside its group (novox/hq ADR 0328 §7, ADR 0563 §3, §4), on the library's home engine: the access as declared and its root as last declared, judged and refused in words or asked at the level approve. Only the operator's yes sets the library's group, group write and setgid under its root. One ask is open per access.",
|
|
"input": {
|
|
"properties": {
|
|
"access": {
|
|
"description": "the access, library:<name>",
|
|
"type": "string"
|
|
},
|
|
"act": {
|
|
"description": "the act: take",
|
|
"type": "string"
|
|
},
|
|
"why": {
|
|
"description": "why it is asked, in words the operator reads",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"act",
|
|
"access"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"$ref": "#/defs/Asked"
|
|
}
|
|
},
|
|
{
|
|
"name": "judge-directories",
|
|
"description": "Which of this machine's declared directories the engine would refuse to make or keep, one line each (novox/hq ADR 0563 §2). Read-only: changes no owner or mode.",
|
|
"input": {
|
|
"properties": {},
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"$ref": "#/defs/Said"
|
|
}
|
|
},
|
|
{
|
|
"name": "setuid-search",
|
|
"description": "Throw away the engine's last search for setuid programs and start a full one (novox/hq ADR 0563 §2); until it completes root-free answers that the machine is not judged yet. Refused while one runs, and when one was started within the hour, naming when the next may start.",
|
|
"input": {
|
|
"properties": {
|
|
"why": {
|
|
"description": "why it is asked, in words",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"$ref": "#/defs/Said"
|
|
}
|
|
},
|
|
{
|
|
"name": "root-free",
|
|
"description": "Whether this machine is root-free (novox/hq ADR 0259 §8, ADR 0563 §6): free only on the engine's own verdict, at most fifteen minutes old, that the account agents run as cannot become root without a person, and the login shell's execute not served here. Anything else is no pass, and says why. Answered by this machine's engine alone.",
|
|
"input": {
|
|
"properties": {},
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"type": "object",
|
|
"properties": {
|
|
"machines": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/RootVerdict"
|
|
},
|
|
"description": "this machine's verdict"
|
|
}
|
|
},
|
|
"required": [
|
|
"machines"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "acts",
|
|
"description": "Every act this machine's engine was asked through this seat (novox/hq ADR 0563 §9): each hand-over, access act and setuid search, open, done or refused, with who asked, the ask and the operator's warrant. Read-only.",
|
|
"input": {
|
|
"properties": {
|
|
"id": {
|
|
"description": "one act, by its id",
|
|
"type": "string"
|
|
},
|
|
"limit": {
|
|
"description": "at most this many, newest",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"$ref": "#/defs/Acts"
|
|
}
|
|
},
|
|
{
|
|
"name": "packages",
|
|
"description": "The packages this machine's compositions declare, present or absent, each with the modules that declare it, as the engine keeps them in its key of `packages`; until the controller hands its lease away, beside the controller's mirror for this machine and their difference. With write, the key written again from what the engine composed.",
|
|
"optional": true,
|
|
"input": {
|
|
"properties": {
|
|
"write": {
|
|
"description": "\"true\": write this machine's key again from what the engine composed",
|
|
"enum": [
|
|
"true",
|
|
"false"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"type": "object",
|
|
"properties": {
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"source": {
|
|
"type": "string",
|
|
"description": "where the key is read: the engine's state packages"
|
|
},
|
|
"key": {
|
|
"type": "object",
|
|
"properties": {
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"packages": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"package": {
|
|
"type": "string",
|
|
"description": "the package"
|
|
},
|
|
"modules": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "the modules that declare it"
|
|
},
|
|
"absent": {
|
|
"type": "boolean",
|
|
"description": "declared absent"
|
|
}
|
|
},
|
|
"required": [
|
|
"package",
|
|
"modules",
|
|
"absent"
|
|
]
|
|
},
|
|
"description": "its packages sorted by name, absent after present"
|
|
}
|
|
},
|
|
"required": [
|
|
"node",
|
|
"packages"
|
|
],
|
|
"description": "the node's key as the bus holds it; absent when the engine wrote none"
|
|
},
|
|
"key_error": {
|
|
"type": "string",
|
|
"description": "why the key could not be read"
|
|
},
|
|
"wrote": {
|
|
"type": "boolean",
|
|
"description": "with write: the key was written again (false: it already held what the engine composed)"
|
|
},
|
|
"note": {
|
|
"type": "string",
|
|
"description": "a note, such as that no key is written yet"
|
|
}
|
|
},
|
|
"required": [
|
|
"node",
|
|
"source"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "composition",
|
|
"description": "One module's composition on this machine beside what runs of it, read-only: the composition its want's build has in the bucket composed-<node> (the latest revision, or the one whose digest is given, from the revisions the bucket keeps), the digest of each kept revision, what runs (applied, its have, or the kept declaration), its want and have (phase running, failed, held or waiting-yes, and the digest that waits for a yes), and the move's judgement with its words: why a record module waits for a yes. With diff, every resource added, removed or changed, a provider's received file naming the consumers that join or leave.",
|
|
"optional": true,
|
|
"input": {
|
|
"properties": {
|
|
"diff": {
|
|
"description": "\"true\": list the resources that differ from what runs",
|
|
"type": "string"
|
|
},
|
|
"digest": {
|
|
"description": "a composition's digest (sha256:…), to read that revision rather than the latest",
|
|
"type": "string"
|
|
},
|
|
"module": {
|
|
"description": "the module, as placed on this machine; node for the node's own",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"module"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"type": "object",
|
|
"properties": {
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"module": {
|
|
"type": "string",
|
|
"description": "the module"
|
|
},
|
|
"want": {
|
|
"type": "object",
|
|
"properties": {
|
|
"fp": {
|
|
"type": "string",
|
|
"description": "its build's fingerprint"
|
|
},
|
|
"composed": {
|
|
"type": "string",
|
|
"description": "the composition's digest it names"
|
|
},
|
|
"yes": {
|
|
"type": "string",
|
|
"description": "the digest a person said yes to"
|
|
},
|
|
"removed": {
|
|
"type": "boolean",
|
|
"description": "the module is removed"
|
|
},
|
|
"self": {
|
|
"type": "boolean",
|
|
"description": "the node composes the module itself (ADR 0547 §2)"
|
|
},
|
|
"backup": {
|
|
"type": "string",
|
|
"description": "the operator's answer to a failed backup, again or skip"
|
|
},
|
|
"words": {
|
|
"type": "string",
|
|
"description": "its words"
|
|
},
|
|
"revision": {
|
|
"type": "integer",
|
|
"description": "the revision of the want's key read last"
|
|
}
|
|
},
|
|
"required": [
|
|
"fp",
|
|
"revision"
|
|
],
|
|
"description": "the module's want as the agent holds it; absent when it holds none"
|
|
},
|
|
"attempt": {
|
|
"type": "object",
|
|
"properties": {
|
|
"fp": {
|
|
"type": "string",
|
|
"description": "the fingerprint tried"
|
|
},
|
|
"composed": {
|
|
"type": "string",
|
|
"description": "the digest tried"
|
|
},
|
|
"want_revision": {
|
|
"type": "integer",
|
|
"description": "the want's revision it was tried at"
|
|
},
|
|
"composition_revision": {
|
|
"type": "integer",
|
|
"description": "the composition's revision it was tried at"
|
|
},
|
|
"held": {
|
|
"type": "boolean",
|
|
"description": "held for a failed backup"
|
|
},
|
|
"answered_revision": {
|
|
"type": "integer",
|
|
"description": "the want's revision the hold took"
|
|
},
|
|
"transient": {
|
|
"type": "boolean",
|
|
"description": "it failed because the bus did not answer for a moment"
|
|
}
|
|
},
|
|
"required": [
|
|
"fp",
|
|
"want_revision",
|
|
"composition_revision"
|
|
],
|
|
"description": "the module's last apply that did not end running; absent when none"
|
|
},
|
|
"started": {
|
|
"type": "boolean",
|
|
"description": "the agent has looked at the module once since it started"
|
|
},
|
|
"have": {
|
|
"type": "object",
|
|
"properties": {
|
|
"fp": {
|
|
"type": "string",
|
|
"description": "fingerprint"
|
|
},
|
|
"composed": {
|
|
"type": "string",
|
|
"description": "digest"
|
|
},
|
|
"phase": {
|
|
"type": "string",
|
|
"description": "running, failed, held or waiting-yes"
|
|
},
|
|
"detail": {
|
|
"type": "string",
|
|
"description": "detail"
|
|
},
|
|
"judgement": {
|
|
"type": "string",
|
|
"description": "judgement"
|
|
},
|
|
"waits": {
|
|
"type": "string",
|
|
"description": "the digest that waits for a yes"
|
|
}
|
|
},
|
|
"required": [
|
|
"phase"
|
|
],
|
|
"description": "what the module's have key says now; absent when it says nothing"
|
|
},
|
|
"composition": {
|
|
"$ref": "#/defs/Revision"
|
|
},
|
|
"revisions": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/Revision"
|
|
},
|
|
"description": "the revisions of its key the bucket keeps, oldest first"
|
|
},
|
|
"runs": {
|
|
"type": "object",
|
|
"properties": {
|
|
"fp": {
|
|
"type": "string",
|
|
"description": "fingerprint"
|
|
},
|
|
"composed": {
|
|
"type": "string",
|
|
"description": "digest"
|
|
},
|
|
"phase": {
|
|
"type": "string",
|
|
"description": "phase"
|
|
},
|
|
"from": {
|
|
"type": "string",
|
|
"description": "applied, have or kept"
|
|
},
|
|
"resources": {
|
|
"type": "integer",
|
|
"description": "how many resources run"
|
|
}
|
|
},
|
|
"required": [
|
|
"from",
|
|
"resources"
|
|
],
|
|
"description": "what runs of the module; absent when nothing runs"
|
|
},
|
|
"judged": {
|
|
"type": "object",
|
|
"properties": {
|
|
"judgement": {
|
|
"type": "string",
|
|
"description": "the judgement"
|
|
},
|
|
"words": {
|
|
"type": "string",
|
|
"description": "its words"
|
|
},
|
|
"waits_for_yes": {
|
|
"type": "boolean",
|
|
"description": "the agent would wait for a person's yes before applying it"
|
|
}
|
|
},
|
|
"required": [
|
|
"judgement",
|
|
"words",
|
|
"waits_for_yes"
|
|
],
|
|
"description": "the move from what runs to the composition read"
|
|
},
|
|
"diff": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"description": "one resource added, removed or changed, as the engine's judge says it"
|
|
},
|
|
"description": "every resource that differs from what runs, when asked"
|
|
},
|
|
"own": {
|
|
"type": "object",
|
|
"properties": {
|
|
"provisioner_account": {
|
|
"type": "string",
|
|
"description": "the account the provisioner's client runs as, as the revision names it"
|
|
},
|
|
"runs_provisioner_account": {
|
|
"type": "string",
|
|
"description": "as what runs names it"
|
|
},
|
|
"adoption": {
|
|
"type": "object",
|
|
"description": "the revision's adoption; absent for a converged node"
|
|
},
|
|
"identities": {
|
|
"type": "integer",
|
|
"description": "identities the revision names"
|
|
},
|
|
"groups": {
|
|
"type": "integer",
|
|
"description": "groups"
|
|
},
|
|
"libraries": {
|
|
"type": "integer",
|
|
"description": "libraries"
|
|
},
|
|
"held": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"description": "each module the node's composer held in its last pass, with why"
|
|
}
|
|
},
|
|
"required": [
|
|
"provisioner_account"
|
|
],
|
|
"description": "of the node's own composition, its own fields beside what runs names"
|
|
}
|
|
},
|
|
"required": [
|
|
"node",
|
|
"module",
|
|
"started",
|
|
"composition",
|
|
"judged"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "compose",
|
|
"description": "Compose this machine's modules now and say how it went, so a composition that failed, or a module held, recovers without a restart: what the pass refused or held, each with why, and when the engine composes again on its own after a seat that did not answer (a deadline, no responders: retried with a growing wait; a refusal never). With module, that module's apply is also tried again. Changes only what a pass the engine makes on its own would change.",
|
|
"optional": true,
|
|
"input": {
|
|
"properties": {
|
|
"module": {
|
|
"description": "a module placed on this machine whose apply is also tried again (optional)",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"type": "object",
|
|
"properties": {
|
|
"retried": {
|
|
"type": "string",
|
|
"description": "the module whose apply was tried again"
|
|
},
|
|
"pass": {
|
|
"type": "object",
|
|
"properties": {
|
|
"at": {
|
|
"type": "string",
|
|
"description": "when the pass ended, RFC 3339"
|
|
},
|
|
"refused": {
|
|
"type": "string",
|
|
"description": "why the node composed none of its modules"
|
|
},
|
|
"held": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"description": "each module refused alone, with why"
|
|
},
|
|
"handed": {
|
|
"type": "integer",
|
|
"description": "how many compositions the pass handed the agent that differ from before"
|
|
},
|
|
"again": {
|
|
"type": "string",
|
|
"description": "when the node composes again on its own, RFC 3339"
|
|
},
|
|
"earlier": {
|
|
"type": "boolean",
|
|
"description": "the answer is the last pass, made moments ago"
|
|
}
|
|
},
|
|
"required": [
|
|
"at",
|
|
"handed"
|
|
],
|
|
"description": "how the pass went"
|
|
}
|
|
},
|
|
"required": [
|
|
"pass"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "compose-candidate",
|
|
"description": "Compose a check's candidate on this machine in shadow, with its own sealed values and the indexer's manifest verdicts, and say per module placed here whether it composes (with its digest and whether the candidate changes it), is refused by the candidate or is held without it, each with why, and the verdict of the machine's own composition (novox/hq ADR 0593 §7). Read-only: applies nothing and writes nothing. Answered by this machine's engine alone, within the asker's bound.",
|
|
"optional": true,
|
|
"input": {
|
|
"properties": {
|
|
"candidate": {
|
|
"description": "the key of the indexer's candidate, <group>.<heads hash>",
|
|
"type": "string"
|
|
},
|
|
"input": {
|
|
"description": "also answer the composition input the candidate was composed from, for the sandbox path",
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"candidate"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"answer": {
|
|
"type": "object",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer",
|
|
"description": "the layout's version"
|
|
},
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"candidate": {
|
|
"type": "string",
|
|
"description": "the candidate's key"
|
|
},
|
|
"verdict": {
|
|
"type": "string",
|
|
"enum": [
|
|
"composed",
|
|
"refused",
|
|
"unready",
|
|
"not-judged"
|
|
],
|
|
"description": "the node's verdict (ADR 0593 §7, §9)"
|
|
},
|
|
"modules": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/Module"
|
|
},
|
|
"description": "every module placed on the node, sorted by name"
|
|
},
|
|
"own": {
|
|
"$ref": "#/defs/Module"
|
|
},
|
|
"refused": {
|
|
"type": "string",
|
|
"description": "why the node could not compose with the candidate at all"
|
|
},
|
|
"took": {
|
|
"type": "integer",
|
|
"description": "how long the engine took, in milliseconds"
|
|
},
|
|
"input": {
|
|
"type": "object",
|
|
"description": "when asked: the composition input it composed from"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"node",
|
|
"candidate",
|
|
"verdict",
|
|
"modules",
|
|
"own",
|
|
"took"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "manifest-reads",
|
|
"optional": true,
|
|
"description": "The reader capabilities this machine's engine states (manifest words, forms and seat names it reads, novox/hq ADR 0618 §3) and when it last stated them. An engine built before it said them states none, which a reader takes as the baseline. Read-only. Answered by this machine's engine alone.",
|
|
"input": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"answer": {
|
|
"type": "object",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer",
|
|
"description": "the layout's version"
|
|
},
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"manifest-reads": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"description": "the reader capabilities its engine states: the manifest words, forms and seat names it reads; empty for an engine built before it said them, read as the baseline"
|
|
},
|
|
"stated-at": {
|
|
"type": "string",
|
|
"description": "when the engine last stated them, RFC 3339"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"node",
|
|
"stated-at"
|
|
],
|
|
"description": "what this machine's engine reads of a manifest (ADR 0618 §3)"
|
|
}
|
|
},
|
|
{
|
|
"name": "seat-list",
|
|
"description": "The seat list this engine holds and what it waits for (novox/hq ADR 0636 §7): each seat's source (trunk or bootstrap) and digest, the seats held from the bootstrap alone, the definitions refused, the last error and whether the seat mesh-catalog has answered. Read-only.",
|
|
"callers": "the operator and the healers",
|
|
"input": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"answer": {
|
|
"$ref": "#/defs/SeatList"
|
|
}
|
|
},
|
|
{
|
|
"name": "seat-list-again",
|
|
"description": "Make this engine read the seat list from the seat mesh-catalog now (novox/hq ADR 0636 §7), the recovery of a list unread; it answers what it holds afterwards, and the error when the read failed. A read that changed nothing still ends the engine's wait.",
|
|
"callers": "the operator and the healers",
|
|
"input": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"answer": {
|
|
"$ref": "#/defs/SeatList"
|
|
}
|
|
}
|
|
],
|
|
"events": [
|
|
{
|
|
"name": "asked",
|
|
"by-caller": true,
|
|
"body": {
|
|
"$ref": "#/defs/ActSaid"
|
|
}
|
|
},
|
|
{
|
|
"name": "done",
|
|
"by-caller": true,
|
|
"body": {
|
|
"$ref": "#/defs/ActSaid"
|
|
}
|
|
},
|
|
{
|
|
"name": "refused",
|
|
"by-caller": true,
|
|
"body": {
|
|
"$ref": "#/defs/ActSaid"
|
|
}
|
|
},
|
|
{
|
|
"name": "manifest-reads-changed",
|
|
"by-caller": true,
|
|
"body": {
|
|
"$ref": "#/defs/ManifestReadsChanged"
|
|
}
|
|
}
|
|
],
|
|
"family": {
|
|
"name": "node-engine.events",
|
|
"max-age-days": 7
|
|
},
|
|
"states": [
|
|
{
|
|
"name": "have",
|
|
"template": "state",
|
|
"key-forms": [
|
|
{
|
|
"key": "<node>.<module>",
|
|
"value": {
|
|
"type": "object",
|
|
"description": "one module's state on a node: what the engine has built, composed and run",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer"
|
|
},
|
|
"fp": {
|
|
"type": "string",
|
|
"description": "the fingerprint held"
|
|
},
|
|
"composed": {
|
|
"type": "string",
|
|
"description": "the digest of the composition the node runs"
|
|
},
|
|
"build": {
|
|
"type": "string"
|
|
},
|
|
"phase": {
|
|
"type": "string",
|
|
"description": "how far it has come",
|
|
"enum": [
|
|
"backing-up",
|
|
"applying",
|
|
"checking",
|
|
"running",
|
|
"failed",
|
|
"removed",
|
|
"held",
|
|
"waiting-yes"
|
|
]
|
|
},
|
|
"health": {
|
|
"type": "string",
|
|
"description": "what the module's own check says",
|
|
"enum": [
|
|
"ok",
|
|
"failed",
|
|
"waits",
|
|
"unknown"
|
|
]
|
|
},
|
|
"detail": {
|
|
"type": "string"
|
|
},
|
|
"user-list": {
|
|
"$ref": "#/defs/UserListWritten"
|
|
},
|
|
"judgement": {
|
|
"type": "string",
|
|
"description": "in phase waiting-yes, the judgement of the move",
|
|
"enum": [
|
|
"recreates",
|
|
"moves-data",
|
|
"cannot-judge"
|
|
]
|
|
},
|
|
"waits": {
|
|
"type": "string",
|
|
"description": "in phase waiting-yes, the digest of the composition that waits"
|
|
},
|
|
"build-alone": {
|
|
"type": "boolean",
|
|
"description": "the move changes the build alone"
|
|
},
|
|
"kept": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "what the node keeps of the module as it runs"
|
|
},
|
|
"sealed": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "each value sealed to the node's key"
|
|
},
|
|
"sealed-at": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"description": "the sealed values by slot"
|
|
},
|
|
"pull-wait": {
|
|
"$ref": "#/defs/PullWait"
|
|
},
|
|
"handed": {
|
|
"$ref": "#/defs/AccountsHanded"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"phase",
|
|
"health"
|
|
]
|
|
},
|
|
"description": "one module on a node"
|
|
},
|
|
{
|
|
"key": "<node>.node",
|
|
"value": {
|
|
"type": "object",
|
|
"description": "a node's own record",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer"
|
|
},
|
|
"composed": {
|
|
"type": "string",
|
|
"description": "the digest of the node's own composition it runs"
|
|
},
|
|
"windows": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"busy": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"strays": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"filters": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"profile": {
|
|
"type": "object"
|
|
},
|
|
"record": {
|
|
"$ref": "#/defs/NodeRecord"
|
|
},
|
|
"sealed": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"sealed-at": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"candidates": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"$ref": "#/defs/CandidateAnswer"
|
|
},
|
|
"description": "the node's answer to each placement candidate naming it, by proposal id"
|
|
},
|
|
"composes": {
|
|
"type": "string",
|
|
"description": "own, or none (empty)"
|
|
},
|
|
"composes-why": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"v"
|
|
]
|
|
},
|
|
"description": "the node's own record"
|
|
}
|
|
],
|
|
"history": 20,
|
|
"description": "what each node has of each module, written by its engine"
|
|
},
|
|
{
|
|
"name": "composed",
|
|
"template": "state",
|
|
"key-forms": [
|
|
{
|
|
"key": "<node>.<module>.<fingerprint>",
|
|
"value": {
|
|
"type": "object",
|
|
"description": "one composition of a module on a node under a fingerprint",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer"
|
|
},
|
|
"node": {
|
|
"type": "string"
|
|
},
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"fp": {
|
|
"type": "string"
|
|
},
|
|
"data": {
|
|
"type": "boolean",
|
|
"description": "the module declares data"
|
|
},
|
|
"resources": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
},
|
|
"description": "the declaration resources, each saying its module"
|
|
},
|
|
"filled_files": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "the files the provisioner fills"
|
|
},
|
|
"plan": {
|
|
"type": "object",
|
|
"description": "the module's whole provisioning plan, catalogue.Plan, kept whole: it is the manifest layer's type"
|
|
},
|
|
"refused": {
|
|
"type": "string",
|
|
"description": "why the module cannot be composed at this fingerprint"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"node",
|
|
"module",
|
|
"fp",
|
|
"resources"
|
|
]
|
|
},
|
|
"description": "one composition"
|
|
},
|
|
{
|
|
"key": "<node>.node",
|
|
"value": {
|
|
"type": "object",
|
|
"description": "the node's own composition: its resources and parts",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer"
|
|
},
|
|
"node": {
|
|
"type": "string"
|
|
},
|
|
"data": {
|
|
"type": "boolean",
|
|
"description": "the module declares data"
|
|
},
|
|
"resources": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
},
|
|
"description": "the declaration resources, each saying its module"
|
|
},
|
|
"filled_files": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "the files the provisioner fills"
|
|
},
|
|
"own": {
|
|
"$ref": "#/defs/NodeOwn"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"node",
|
|
"resources"
|
|
]
|
|
},
|
|
"description": "the node's own composition"
|
|
}
|
|
],
|
|
"description": "the compositions of one node, kept in a bucket per node named composed-<node>"
|
|
},
|
|
{
|
|
"name": "data",
|
|
"template": "state",
|
|
"key-forms": [
|
|
{
|
|
"key": "<node>.<module>",
|
|
"value": {
|
|
"type": "object",
|
|
"description": "the data items a module has on a node",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer"
|
|
},
|
|
"node": {
|
|
"type": "string"
|
|
},
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"digest": {
|
|
"type": "string"
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/PlacedDataItem"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"node",
|
|
"module",
|
|
"digest",
|
|
"items"
|
|
]
|
|
},
|
|
"description": "a module's data on a node"
|
|
}
|
|
],
|
|
"description": "the data items of each module on each node"
|
|
},
|
|
{
|
|
"name": "packages",
|
|
"template": "state",
|
|
"key-forms": [
|
|
{
|
|
"key": "<node>",
|
|
"value": {
|
|
"type": "object",
|
|
"description": "the packages a node declares",
|
|
"properties": {
|
|
"node": {
|
|
"type": "string"
|
|
},
|
|
"packages": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"package": {
|
|
"type": "string"
|
|
},
|
|
"modules": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"absent": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"package",
|
|
"modules",
|
|
"absent"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"node",
|
|
"packages"
|
|
]
|
|
},
|
|
"description": "a node's declared packages"
|
|
}
|
|
],
|
|
"description": "the packages each node declares"
|
|
},
|
|
{
|
|
"name": "health",
|
|
"template": "state",
|
|
"key-forms": [
|
|
{
|
|
"key": "<node>",
|
|
"value": {
|
|
"type": "object",
|
|
"description": "a node's health as its engine reports it",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer"
|
|
},
|
|
"node": {
|
|
"type": "string"
|
|
},
|
|
"network": {
|
|
"$ref": "#/defs/NetworkHealth"
|
|
},
|
|
"peers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/PeerSeen"
|
|
}
|
|
},
|
|
"units": {
|
|
"$ref": "#/defs/UnitsHealth"
|
|
},
|
|
"relogin": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/NodeAccount"
|
|
}
|
|
},
|
|
"found": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/NodeDirectory"
|
|
}
|
|
},
|
|
"fallback": {
|
|
"$ref": "#/defs/LoginFallback"
|
|
},
|
|
"root": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/RootAccountVerdict"
|
|
}
|
|
},
|
|
"contract": {
|
|
"type": "integer"
|
|
},
|
|
"at": {
|
|
"type": "string",
|
|
"description": "when",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"node",
|
|
"at"
|
|
]
|
|
},
|
|
"description": "a node's health"
|
|
}
|
|
],
|
|
"description": "each node's health as its engine reports it"
|
|
},
|
|
{
|
|
"name": "findings",
|
|
"template": "state",
|
|
"writer": "holder",
|
|
"key-forms": [
|
|
{
|
|
"key": "<key>",
|
|
"value": {
|
|
"type": "object",
|
|
"description": "one thing an observer sees wrong now",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer",
|
|
"description": "layout version, 1"
|
|
},
|
|
"key": {
|
|
"type": "string",
|
|
"description": "scope.id.token"
|
|
},
|
|
"kind": {
|
|
"type": "string"
|
|
},
|
|
"subject": {
|
|
"$ref": "#/defs/FindingSubject"
|
|
},
|
|
"severity": {
|
|
"type": "string",
|
|
"enum": [
|
|
"urgent",
|
|
"warning"
|
|
]
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"description": "one line"
|
|
},
|
|
"headline": {
|
|
"type": "string"
|
|
},
|
|
"explanation": {
|
|
"type": "string"
|
|
},
|
|
"resolved": {
|
|
"type": "string"
|
|
},
|
|
"needs": {
|
|
"type": "string"
|
|
},
|
|
"actions": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/FindingAction"
|
|
}
|
|
},
|
|
"evidence": {
|
|
"type": "array",
|
|
"description": "newest first, at most 10",
|
|
"items": {
|
|
"$ref": "#/defs/FindingEvidence"
|
|
}
|
|
},
|
|
"source": {
|
|
"type": "string",
|
|
"description": "the row, probe or event that saw it"
|
|
},
|
|
"resolver": {
|
|
"type": "string",
|
|
"description": "self, operator, agent or healer:<name>"
|
|
},
|
|
"ref": {
|
|
"type": "string",
|
|
"description": "the key's last part when it is not the kind"
|
|
},
|
|
"observer": {
|
|
"type": "string",
|
|
"description": "the module that wrote it"
|
|
},
|
|
"run": {
|
|
"type": "string",
|
|
"description": "what of its own saw it last"
|
|
},
|
|
"at": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"key",
|
|
"kind",
|
|
"subject",
|
|
"severity",
|
|
"summary",
|
|
"source",
|
|
"observer",
|
|
"at"
|
|
]
|
|
},
|
|
"description": "one finding of the observer that wrote it"
|
|
}
|
|
],
|
|
"description": "the findings this node's engine raises about itself, one key per finding, in the layout of the seat mesh-conditions (its findings state): a key written raises the condition of the same key, a key deleted clears it (novox/hq ADR 0564 §2, ADR 0636 §1); today `machine.<node>.seat-list-unread`"
|
|
}
|
|
],
|
|
"defs": {
|
|
"Act": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"description": "the act's id"
|
|
},
|
|
"act": {
|
|
"type": "string",
|
|
"description": "the act: hand-over, access-act, judge-directories or setuid-search"
|
|
},
|
|
"subject": {
|
|
"type": "string",
|
|
"description": "the path of a hand-over, or the access of an access act"
|
|
},
|
|
"caller": {
|
|
"type": "string",
|
|
"description": "the caller as the runtime proved it"
|
|
},
|
|
"why": {
|
|
"type": "string",
|
|
"description": "why it was asked, in words"
|
|
},
|
|
"at": {
|
|
"type": "string",
|
|
"description": "when it was asked, RFC 3339"
|
|
},
|
|
"state": {
|
|
"type": "string",
|
|
"enum": [
|
|
"asked",
|
|
"done",
|
|
"refused",
|
|
"answered"
|
|
],
|
|
"description": "where it stands"
|
|
},
|
|
"said": {
|
|
"type": "string",
|
|
"description": "what the engine said of it: its outcome or why it was refused"
|
|
},
|
|
"ended": {
|
|
"type": "string",
|
|
"description": "when it ended, RFC 3339"
|
|
},
|
|
"ask": {
|
|
"type": "string",
|
|
"description": "the operator's ask of a hand-over or an access act"
|
|
},
|
|
"sets": {
|
|
"type": "string",
|
|
"description": "the owner, group and mode it sets, in words"
|
|
},
|
|
"disk": {
|
|
"type": "string",
|
|
"description": "what the engine read on disk when it judged"
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"description": "the directory the act changes"
|
|
},
|
|
"expires": {
|
|
"type": "string",
|
|
"description": "when the ask ends unanswered, RFC 3339"
|
|
},
|
|
"by": {
|
|
"type": "string",
|
|
"description": "who answered, as the operator's warrant names them"
|
|
},
|
|
"via": {
|
|
"type": "string",
|
|
"description": "the channel the warrant came on"
|
|
},
|
|
"proofs": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "the warrant's proofs"
|
|
},
|
|
"auto": {
|
|
"type": "boolean",
|
|
"description": "the engine asked it itself, on finding a library's root holding data outside its group (ADR 0563 §4)"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"act",
|
|
"caller",
|
|
"at",
|
|
"state"
|
|
],
|
|
"description": "one act asked through the seat, as acts reads it (ADR 0563 §9)"
|
|
},
|
|
"ActSaid": {
|
|
"type": "object",
|
|
"properties": {
|
|
"act": {
|
|
"type": "string",
|
|
"description": "the act"
|
|
},
|
|
"subject": {
|
|
"type": "string",
|
|
"description": "the path or the access"
|
|
},
|
|
"caller": {
|
|
"type": "string",
|
|
"description": "the caller as the runtime proved it"
|
|
},
|
|
"ask": {
|
|
"type": "string",
|
|
"description": "the operator's ask"
|
|
},
|
|
"state": {
|
|
"type": "string",
|
|
"enum": [
|
|
"asked",
|
|
"done",
|
|
"refused"
|
|
],
|
|
"description": "where the act stands"
|
|
},
|
|
"said": {
|
|
"type": "string",
|
|
"description": "what the engine said of it"
|
|
},
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node whose engine says it"
|
|
}
|
|
},
|
|
"required": [
|
|
"act",
|
|
"caller",
|
|
"state",
|
|
"node"
|
|
],
|
|
"description": "what the seat says of an act: the act, the path or access, the caller as the runtime proved it and the ask (ADR 0563 §1)"
|
|
},
|
|
"Acts": {
|
|
"type": "object",
|
|
"properties": {
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"acts": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/Act"
|
|
},
|
|
"description": "the acts, newest first"
|
|
}
|
|
},
|
|
"required": [
|
|
"node",
|
|
"acts"
|
|
],
|
|
"description": "the acts kept"
|
|
},
|
|
"Asked": {
|
|
"type": "object",
|
|
"properties": {
|
|
"asked": {
|
|
"type": "string",
|
|
"description": "the ask's id: acts shows where it stands"
|
|
},
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"says": {
|
|
"type": "string",
|
|
"description": "what happens next, in words"
|
|
}
|
|
},
|
|
"required": [
|
|
"asked",
|
|
"node",
|
|
"says"
|
|
],
|
|
"description": "the answer of an act the operator is asked"
|
|
},
|
|
"ManifestReadsChanged": {
|
|
"type": "object",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer",
|
|
"description": "the layout's version"
|
|
},
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"manifest-reads": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"description": "what its engine states it reads now"
|
|
},
|
|
"at": {
|
|
"type": "string",
|
|
"description": "when it says it, RFC 3339"
|
|
},
|
|
"why": {
|
|
"type": "string",
|
|
"enum": [
|
|
"started",
|
|
"returned"
|
|
],
|
|
"description": "started: the engine started or what it states changed; returned: its node returned after being away"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"node",
|
|
"at",
|
|
"why"
|
|
],
|
|
"description": "what a node-engine says when what it reads changed or its node returned (ADR 0618 §4)"
|
|
},
|
|
"Module": {
|
|
"type": "object",
|
|
"properties": {
|
|
"module": {
|
|
"type": "string",
|
|
"description": "the module, node for the node's own composition"
|
|
},
|
|
"fp": {
|
|
"type": "string",
|
|
"description": "the fingerprint it was composed at"
|
|
},
|
|
"state": {
|
|
"type": "string",
|
|
"enum": [
|
|
"composed",
|
|
"refused",
|
|
"held"
|
|
],
|
|
"description": "composed (digest set), refused by the candidate, or held without it too (words set)"
|
|
},
|
|
"digest": {
|
|
"type": "string",
|
|
"description": "the composition's digest when composed"
|
|
},
|
|
"changed": {
|
|
"type": "boolean",
|
|
"description": "the candidate changes it from the one composed without it"
|
|
},
|
|
"words": {
|
|
"type": "string",
|
|
"description": "why, for a refused or held one"
|
|
}
|
|
},
|
|
"required": [
|
|
"module",
|
|
"state"
|
|
],
|
|
"description": "one module's composition with the candidate"
|
|
},
|
|
"Revision": {
|
|
"type": "object",
|
|
"properties": {
|
|
"key": {
|
|
"type": "string",
|
|
"description": "the composition's key"
|
|
},
|
|
"revision": {
|
|
"type": "integer",
|
|
"description": "its revision"
|
|
},
|
|
"digest": {
|
|
"type": "string",
|
|
"description": "its digest"
|
|
},
|
|
"resources": {
|
|
"type": "integer",
|
|
"description": "how many resources it names"
|
|
},
|
|
"latest": {
|
|
"type": "boolean",
|
|
"description": "the latest revision"
|
|
},
|
|
"refused": {
|
|
"type": "string",
|
|
"description": "why it cannot be read or trusted"
|
|
}
|
|
},
|
|
"required": [
|
|
"key"
|
|
],
|
|
"description": "one revision of a composition key"
|
|
},
|
|
"RootVerdict": {
|
|
"type": "object",
|
|
"properties": {
|
|
"machine": {
|
|
"type": "string",
|
|
"description": "the machine"
|
|
},
|
|
"free": {
|
|
"type": "boolean",
|
|
"description": "the machine is root-free"
|
|
},
|
|
"why": {
|
|
"type": "string",
|
|
"description": "why, in words"
|
|
},
|
|
"judged": {
|
|
"type": "string",
|
|
"description": "when the engine judged it, RFC 3339"
|
|
}
|
|
},
|
|
"required": [
|
|
"machine",
|
|
"free",
|
|
"why",
|
|
"judged"
|
|
],
|
|
"description": "the engine's root-free verdict (ADR 0563 §6)"
|
|
},
|
|
"Said": {
|
|
"type": "object",
|
|
"properties": {
|
|
"node": {
|
|
"type": "string",
|
|
"description": "the node"
|
|
},
|
|
"said": {
|
|
"type": "string",
|
|
"description": "the engine's judgement or search, one line per directory or program"
|
|
}
|
|
},
|
|
"required": [
|
|
"node",
|
|
"said"
|
|
],
|
|
"description": "the answer of a read-only judgement"
|
|
},
|
|
"SeatListHeld": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seat": {
|
|
"type": "string"
|
|
},
|
|
"source": {
|
|
"type": "string",
|
|
"enum": [
|
|
"trunk",
|
|
"bootstrap"
|
|
]
|
|
},
|
|
"digest": {
|
|
"type": "string",
|
|
"description": "the digest of the definition held; empty for a bootstrapped one"
|
|
}
|
|
},
|
|
"required": [
|
|
"seat",
|
|
"source"
|
|
]
|
|
},
|
|
"SeatList": {
|
|
"type": "object",
|
|
"description": "what an engine holds of the seat list (novox/hq ADR 0636 §7)",
|
|
"properties": {
|
|
"status": {
|
|
"type": "object",
|
|
"properties": {
|
|
"heard": {
|
|
"type": "boolean",
|
|
"description": "the seat mesh-catalog has answered"
|
|
},
|
|
"held": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/SeatListHeld"
|
|
}
|
|
},
|
|
"waiting": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "the seats held from the bootstrap alone"
|
|
},
|
|
"refused": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"description": "a trunk definition that does not parse, by seat: the one held stands"
|
|
},
|
|
"last-error": {
|
|
"type": "string"
|
|
},
|
|
"revision": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"heard",
|
|
"held"
|
|
]
|
|
},
|
|
"health": {
|
|
"type": "string",
|
|
"description": "the one line the engine says of it; empty when nothing waits"
|
|
},
|
|
"error": {
|
|
"type": "string",
|
|
"description": "why the read failed, for seat-list-again"
|
|
}
|
|
},
|
|
"required": [
|
|
"status",
|
|
"health"
|
|
]
|
|
},
|
|
"FindingSubject": {
|
|
"type": "object",
|
|
"description": "what the condition is about",
|
|
"properties": {
|
|
"scope": {
|
|
"type": "string",
|
|
"description": "machine, plan, call, build, merge, provider, seat, bus, core, probe, mesh, delivery or module"
|
|
},
|
|
"id": {
|
|
"type": "string",
|
|
"description": "its id within the scope"
|
|
},
|
|
"machine": {
|
|
"type": "string",
|
|
"description": "the machine it concerns, when there is one"
|
|
},
|
|
"also": {
|
|
"type": "array",
|
|
"description": "the other machines it concerns",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"scope",
|
|
"id"
|
|
]
|
|
},
|
|
"FindingAction": {
|
|
"type": "object",
|
|
"description": "one answer the operator may give from a notification",
|
|
"properties": {
|
|
"label": {
|
|
"type": "string"
|
|
},
|
|
"verb": {
|
|
"type": "string",
|
|
"description": "the seat verb the operator channel calls"
|
|
},
|
|
"machine": {
|
|
"type": "string"
|
|
},
|
|
"arguments": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"level": {
|
|
"type": "string",
|
|
"enum": [
|
|
"acknowledge",
|
|
"approve"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"label",
|
|
"verb"
|
|
]
|
|
},
|
|
"FindingEvidence": {
|
|
"type": "object",
|
|
"description": "one observation, as it was said",
|
|
"properties": {
|
|
"at": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"said": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"at",
|
|
"said"
|
|
]
|
|
},
|
|
"UserListWritten": {
|
|
"type": "object",
|
|
"description": "the bus's user list as the engine of the bus node wrote it to the bus module's file",
|
|
"properties": {
|
|
"source": {
|
|
"type": "string",
|
|
"description": "the key the list was taken from"
|
|
},
|
|
"revision": {
|
|
"type": "integer"
|
|
},
|
|
"wanted": {
|
|
"type": "string",
|
|
"description": "the digest of the list the source holds, sha256:<hex>"
|
|
},
|
|
"digest": {
|
|
"type": "string",
|
|
"description": "the digest of the file on the machine after the write"
|
|
},
|
|
"users": {
|
|
"type": "integer"
|
|
},
|
|
"at": {
|
|
"type": "string",
|
|
"description": "when",
|
|
"format": "date-time"
|
|
},
|
|
"error": {
|
|
"type": "string",
|
|
"description": "why a write failed"
|
|
},
|
|
"follows": {
|
|
"type": "string",
|
|
"description": "which list the node follows now"
|
|
},
|
|
"key": {
|
|
"type": "string",
|
|
"description": "the bus node's sealing key, its public half"
|
|
},
|
|
"unwatched": {
|
|
"type": "string",
|
|
"description": "why the bus node does not watch the grants part's key now"
|
|
},
|
|
"handed": {
|
|
"$ref": "#/defs/AccountsHanded"
|
|
}
|
|
},
|
|
"required": [
|
|
"source",
|
|
"revision",
|
|
"wanted",
|
|
"users",
|
|
"at"
|
|
]
|
|
},
|
|
"AccountsHanded": {
|
|
"type": "object",
|
|
"description": "the hashes of the users of the list, sealed to the vault",
|
|
"properties": {
|
|
"from": {
|
|
"type": "string"
|
|
},
|
|
"to": {
|
|
"type": "string",
|
|
"description": "the fingerprint of the vault's key"
|
|
},
|
|
"users": {
|
|
"type": "integer"
|
|
},
|
|
"box": {
|
|
"$ref": "#/defs/SealedBox"
|
|
},
|
|
"at": {
|
|
"type": "string",
|
|
"description": "when",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"from",
|
|
"to",
|
|
"users",
|
|
"box",
|
|
"at"
|
|
]
|
|
},
|
|
"SealedBox": {
|
|
"type": "object",
|
|
"description": "a value sealed to a key",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer"
|
|
},
|
|
"eph": {
|
|
"type": "string"
|
|
},
|
|
"iv": {
|
|
"type": "string"
|
|
},
|
|
"tag": {
|
|
"type": "string"
|
|
},
|
|
"ct": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"eph",
|
|
"iv",
|
|
"tag",
|
|
"ct"
|
|
]
|
|
},
|
|
"PullWait": {
|
|
"type": "object",
|
|
"description": "the pull from a store a failed apply waits on",
|
|
"properties": {
|
|
"image": {
|
|
"type": "string"
|
|
},
|
|
"seat": {
|
|
"type": "string",
|
|
"description": "the seat the pull came through"
|
|
},
|
|
"holder": {
|
|
"type": "string",
|
|
"description": "that seat's holder, whose settling the apply waits for"
|
|
},
|
|
"began": {
|
|
"type": "string",
|
|
"description": "when the pull began",
|
|
"format": "date-time"
|
|
},
|
|
"retried": {
|
|
"type": "string",
|
|
"description": "what triggered the last try again, in words"
|
|
},
|
|
"retried-at": {
|
|
"type": "string",
|
|
"description": "when the apply was last tried again",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"image",
|
|
"holder",
|
|
"began"
|
|
]
|
|
},
|
|
"NodeRecord": {
|
|
"type": "object",
|
|
"description": "what the machine observes of itself, for every node and composing part to read",
|
|
"properties": {
|
|
"v": {
|
|
"type": "integer"
|
|
},
|
|
"node": {
|
|
"type": "string"
|
|
},
|
|
"tunnel-key": {
|
|
"type": "string"
|
|
},
|
|
"capabilities": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"sealing-key": {
|
|
"type": "string"
|
|
},
|
|
"serving-key": {
|
|
"type": "string"
|
|
},
|
|
"certificate": {
|
|
"type": "string"
|
|
},
|
|
"outward-links": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"networks": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/AttachedNetwork"
|
|
}
|
|
},
|
|
"networks-said": {
|
|
"type": "boolean"
|
|
},
|
|
"contract": {
|
|
"type": "integer"
|
|
},
|
|
"authority": {
|
|
"type": "string"
|
|
},
|
|
"trusts": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"manifest-reads": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"v",
|
|
"node"
|
|
]
|
|
},
|
|
"AttachedNetwork": {
|
|
"type": "object",
|
|
"description": "a network attached to a link",
|
|
"properties": {
|
|
"link": {
|
|
"type": "string"
|
|
},
|
|
"network": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"link",
|
|
"network"
|
|
]
|
|
},
|
|
"CandidateAnswer": {
|
|
"type": "object",
|
|
"description": "the node's answer to one placement candidate naming it",
|
|
"properties": {
|
|
"proposal": {
|
|
"type": "string"
|
|
},
|
|
"revision": {
|
|
"type": "integer"
|
|
},
|
|
"verdict": {
|
|
"type": "string",
|
|
"description": "same, differs or refused",
|
|
"enum": [
|
|
"same",
|
|
"differs",
|
|
"refused"
|
|
]
|
|
},
|
|
"same": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "modules whose composition is the one running"
|
|
},
|
|
"differs": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/CandidateDiffers"
|
|
}
|
|
},
|
|
"added": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/CandidateAdded"
|
|
}
|
|
},
|
|
"removed": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "modules the candidate removes"
|
|
},
|
|
"refusals": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/CandidateRefusal"
|
|
}
|
|
},
|
|
"held": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/CandidateRefusal"
|
|
}
|
|
},
|
|
"refused": {
|
|
"type": "string",
|
|
"description": "why the node cannot compose with the candidate at all"
|
|
},
|
|
"returns": {
|
|
"type": "string"
|
|
},
|
|
"note": {
|
|
"type": "string"
|
|
},
|
|
"values_differ": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"proposal",
|
|
"revision",
|
|
"verdict"
|
|
]
|
|
},
|
|
"CandidateDiffers": {
|
|
"type": "object",
|
|
"description": "a module whose composition with the candidate differs from the one running",
|
|
"properties": {
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"composed": {
|
|
"type": "string"
|
|
},
|
|
"running": {
|
|
"type": "string"
|
|
},
|
|
"resource": {
|
|
"type": "string"
|
|
},
|
|
"why": {
|
|
"type": "string"
|
|
},
|
|
"bodies": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/CandidateBodies"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"module",
|
|
"why"
|
|
]
|
|
},
|
|
"CandidateBodies": {
|
|
"type": "object",
|
|
"description": "the bodies of one resource that differ",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"why": {
|
|
"type": "string"
|
|
},
|
|
"paths": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"composed": {
|
|
"type": "string"
|
|
},
|
|
"running": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"why"
|
|
]
|
|
},
|
|
"CandidateAdded": {
|
|
"type": "object",
|
|
"description": "a module the candidate adds",
|
|
"properties": {
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"composed": {
|
|
"type": "string"
|
|
},
|
|
"unissued": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"module"
|
|
]
|
|
},
|
|
"CandidateRefusal": {
|
|
"type": "object",
|
|
"description": "a module refused or held with the candidate",
|
|
"properties": {
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"why": {
|
|
"type": "string"
|
|
},
|
|
"today": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"module",
|
|
"why"
|
|
]
|
|
},
|
|
"NodeOwn": {
|
|
"type": "object",
|
|
"description": "what a node's own composition carries beside its resources",
|
|
"properties": {
|
|
"adoption": {
|
|
"$ref": "#/defs/Adoption"
|
|
},
|
|
"identities": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/DeclaredIdentity"
|
|
}
|
|
},
|
|
"groups": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/DeclaredGroup"
|
|
}
|
|
},
|
|
"libraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/DeclaredLibrary"
|
|
}
|
|
},
|
|
"provisioner_account": {
|
|
"type": "string",
|
|
"description": "the account the provisioner's client runs as on the node"
|
|
}
|
|
}
|
|
},
|
|
"Adoption": {
|
|
"type": "object",
|
|
"description": "the node is adopted and which of its modules are taken",
|
|
"properties": {
|
|
"taken": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "the modules taken"
|
|
},
|
|
"untaken": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"description": "by module, the resources left untaken"
|
|
}
|
|
},
|
|
"required": [
|
|
"taken"
|
|
]
|
|
},
|
|
"DeclaredIdentity": {
|
|
"type": "object",
|
|
"description": "the identity of a module assigned to the node",
|
|
"properties": {
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"uid": {
|
|
"type": "integer"
|
|
},
|
|
"gid": {
|
|
"type": "integer"
|
|
},
|
|
"groups": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"runner": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"module",
|
|
"name",
|
|
"uid",
|
|
"gid"
|
|
]
|
|
},
|
|
"DeclaredGroup": {
|
|
"type": "object",
|
|
"description": "a group",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"gid": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"name",
|
|
"gid"
|
|
]
|
|
},
|
|
"DeclaredLibrary": {
|
|
"type": "object",
|
|
"description": "a library the node is reached by",
|
|
"properties": {
|
|
"library": {
|
|
"type": "string"
|
|
},
|
|
"root": {
|
|
"type": "string"
|
|
},
|
|
"group": {
|
|
"type": "string"
|
|
},
|
|
"gid": {
|
|
"type": "integer"
|
|
},
|
|
"home": {
|
|
"type": "boolean"
|
|
},
|
|
"taken": {
|
|
"type": "boolean"
|
|
},
|
|
"paths": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"runner": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"library",
|
|
"root",
|
|
"group",
|
|
"gid",
|
|
"home"
|
|
]
|
|
},
|
|
"PlacedDataItem": {
|
|
"type": "object",
|
|
"description": "one data item a module declares, as placed on a node",
|
|
"properties": {
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"item": {
|
|
"type": "string"
|
|
},
|
|
"class": {
|
|
"type": "string"
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"description": "the item's place on the node"
|
|
},
|
|
"covered_by": {
|
|
"type": "string",
|
|
"description": "the path whose snapshot keeps it, empty when it is not backed up"
|
|
},
|
|
"protection": {
|
|
"type": "string",
|
|
"description": "backup, redundancy, both or none"
|
|
},
|
|
"measure": {
|
|
"type": "string",
|
|
"description": "walk, dataset or shallow"
|
|
}
|
|
},
|
|
"required": [
|
|
"module",
|
|
"item",
|
|
"class",
|
|
"path"
|
|
]
|
|
},
|
|
"NetworkHealth": {
|
|
"type": "object",
|
|
"description": "the node's network",
|
|
"properties": {
|
|
"state": {
|
|
"type": "string",
|
|
"description": "running, degraded or unknown"
|
|
},
|
|
"since": {
|
|
"type": "string",
|
|
"description": "since when",
|
|
"format": "date-time"
|
|
},
|
|
"parts": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/NetworkPart"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"state",
|
|
"since",
|
|
"parts"
|
|
]
|
|
},
|
|
"NetworkPart": {
|
|
"type": "object",
|
|
"description": "one part of the node's network",
|
|
"properties": {
|
|
"part": {
|
|
"type": "string"
|
|
},
|
|
"state": {
|
|
"type": "string"
|
|
},
|
|
"reason": {
|
|
"type": "string"
|
|
},
|
|
"said": {
|
|
"type": "string"
|
|
},
|
|
"writer": {
|
|
"type": "string"
|
|
},
|
|
"owner": {
|
|
"type": "string"
|
|
},
|
|
"toward": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"targets": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"since": {
|
|
"type": "string",
|
|
"description": "since when",
|
|
"format": "date-time"
|
|
},
|
|
"streak": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"required": [
|
|
"part",
|
|
"state",
|
|
"since"
|
|
]
|
|
},
|
|
"UnitsHealth": {
|
|
"type": "object",
|
|
"description": "the node's units",
|
|
"properties": {
|
|
"state": {
|
|
"type": "string"
|
|
},
|
|
"failed": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/defs/FailedUnit"
|
|
}
|
|
},
|
|
"unread": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"away": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"state",
|
|
"failed"
|
|
]
|
|
},
|
|
"FailedUnit": {
|
|
"type": "object",
|
|
"description": "a unit that failed",
|
|
"properties": {
|
|
"unit": {
|
|
"type": "string"
|
|
},
|
|
"scope": {
|
|
"type": "string"
|
|
},
|
|
"load": {
|
|
"type": "string"
|
|
},
|
|
"result": {
|
|
"type": "string"
|
|
},
|
|
"resource": {
|
|
"type": "string"
|
|
},
|
|
"since": {
|
|
"type": "string",
|
|
"description": "since when",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"unit",
|
|
"scope",
|
|
"since"
|
|
]
|
|
},
|
|
"PeerSeen": {
|
|
"type": "object",
|
|
"description": "a tunnel peer and whether it is seen",
|
|
"properties": {
|
|
"key": {
|
|
"type": "string"
|
|
},
|
|
"addresses": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"seen": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"key",
|
|
"seen"
|
|
]
|
|
},
|
|
"NodeAccount": {
|
|
"type": "object",
|
|
"description": "an account the node needs to log in again",
|
|
"properties": {
|
|
"account": {
|
|
"type": "string"
|
|
},
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"resource": {
|
|
"type": "string"
|
|
},
|
|
"reason": {
|
|
"type": "string"
|
|
},
|
|
"since": {
|
|
"type": "string",
|
|
"description": "since when",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"account",
|
|
"reason",
|
|
"since"
|
|
]
|
|
},
|
|
"NodeDirectory": {
|
|
"type": "object",
|
|
"description": "a directory found where the node expected none",
|
|
"properties": {
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"resource": {
|
|
"type": "string"
|
|
},
|
|
"path": {
|
|
"type": "string"
|
|
},
|
|
"reason": {
|
|
"type": "string"
|
|
},
|
|
"since": {
|
|
"type": "string",
|
|
"description": "since when",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"module",
|
|
"resource",
|
|
"path",
|
|
"reason",
|
|
"since"
|
|
]
|
|
},
|
|
"LoginFallback": {
|
|
"type": "object",
|
|
"description": "a login that fell back to another node",
|
|
"properties": {
|
|
"node": {
|
|
"type": "string"
|
|
},
|
|
"from": {
|
|
"type": "string"
|
|
},
|
|
"why": {
|
|
"type": "string"
|
|
},
|
|
"at": {
|
|
"type": "string",
|
|
"description": "when",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"node",
|
|
"from",
|
|
"why",
|
|
"at"
|
|
]
|
|
},
|
|
"RootAccountVerdict": {
|
|
"type": "object",
|
|
"description": "the engine's verdict of whether an account's resource is root-free, as the node's health lists it",
|
|
"properties": {
|
|
"account": {
|
|
"type": "string"
|
|
},
|
|
"module": {
|
|
"type": "string"
|
|
},
|
|
"resource": {
|
|
"type": "string"
|
|
},
|
|
"state": {
|
|
"type": "string"
|
|
},
|
|
"reason": {
|
|
"type": "string"
|
|
},
|
|
"since": {
|
|
"type": "string",
|
|
"description": "since when",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"required": [
|
|
"account",
|
|
"module",
|
|
"resource",
|
|
"state",
|
|
"since"
|
|
]
|
|
}
|
|
}
|
|
}
|