Files

1414 lines
47 KiB
Go

// Code generated by seatgen from the seat definitions; DO NOT EDIT.
// Package nodeengine is the contract of the seat "node-engine", defined whole (seats/node-engine/seat.json): 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.
package nodeengine
import (
"bytes"
"encoding/json"
"errors"
"strings"
"time"
)
// Seat is the seat's name.
const Seat = "node-engine"
const (
VerbHandOver = "hand-over"
VerbAccessAct = "access-act"
VerbJudgeDirectories = "judge-directories"
VerbSetuidSearch = "setuid-search"
VerbRootFree = "root-free"
VerbActs = "acts"
VerbPackages = "packages"
VerbComposition = "composition"
VerbCompose = "compose"
VerbComposeCandidate = "compose-candidate"
VerbManifestReads = "manifest-reads"
VerbSeatList = "seat-list"
VerbSeatListAgain = "seat-list-again"
)
const (
EventAsked = "asked"
EventDone = "done"
EventRefused = "refused"
EventManifestReadsChanged = "manifest-reads-changed"
)
// Verbs is every verb the seat serves, in its definition's order: a new copy each call.
func Verbs() []string {
return []string{VerbHandOver, VerbAccessAct, VerbJudgeDirectories, VerbSetuidSearch, VerbRootFree, VerbActs, VerbPackages, VerbComposition, VerbCompose, VerbComposeCandidate, VerbManifestReads, VerbSeatList, VerbSeatListAgain}
}
// Events is every event published on the seat's subject: a new copy each call.
func Events() []string {
return []string{EventAsked, EventDone, EventRefused, EventManifestReadsChanged}
}
// Family is where the seat's events are kept: the shared events stream, filtered to the seat's subjects.
const (
Family = "node-engine.events"
FamilyMaxAgeDays = 7
)
// SubjectAsked is where asked is published for one caller.
func SubjectAsked(caller string) string { return "mesh.seat.node-engine.event.asked." + caller }
// SubjectDone is where done is published for one caller.
func SubjectDone(caller string) string { return "mesh.seat.node-engine.event.done." + caller }
// SubjectRefused is where refused is published for one caller.
func SubjectRefused(caller string) string { return "mesh.seat.node-engine.event.refused." + caller }
// SubjectManifestReadsChanged is where manifest-reads-changed is published for one caller.
func SubjectManifestReadsChanged(caller string) string {
return "mesh.seat.node-engine.event.manifest-reads-changed." + caller
}
const (
StateHave = "have"
StateComposed = "composed"
StateData = "data"
StatePackages = "packages"
StateHealth = "health"
StateFindings = "findings"
)
// HaveByNodeModuleKey is the key of one value of the state have under the form "<node>.<module>".
func HaveByNodeModuleKey(node, module string) string { return node + "." + module }
// ParseHaveByNodeModuleKey reads the parts of a key of the form "<node>.<module>", in the order of the form; the last result is false for a key of another form.
func ParseHaveByNodeModuleKey(key string) (string, string, bool) {
rest := key
v0, after0, found0 := strings.Cut(rest, ".")
if !found0 || v0 == "" {
return "", "", false
}
rest = after0
if rest == "" {
return "", "", false
}
v2 := rest
rest = ""
if rest != "" {
return "", "", false
}
return v0, v2, true
}
// DecodeHaveByNodeModuleValue reads one value of the state have under the form "<node>.<module>", refusing a field HaveByNodeModuleValue does not know and any text after the value.
func DecodeHaveByNodeModuleValue(raw []byte) (HaveByNodeModuleValue, error) {
var v HaveByNodeModuleValue
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&v); err != nil {
return v, err
}
if dec.More() {
return v, errors.New("text after the value")
}
return v, nil
}
// HaveByNodeNodeKey is the key of one value of the state have under the form "<node>.node".
func HaveByNodeNodeKey(node string) string { return node + ".node" }
// ParseHaveByNodeNodeKey reads the parts of a key of the form "<node>.node", in the order of the form; the last result is false for a key of another form.
func ParseHaveByNodeNodeKey(key string) (string, bool) {
rest := key
v0, after0, found0 := strings.Cut(rest, ".node")
if !found0 || v0 == "" {
return "", false
}
rest = after0
if rest != "" {
return "", false
}
return v0, true
}
// DecodeHaveByNodeNodeValue reads one value of the state have under the form "<node>.node", refusing a field HaveByNodeNodeValue does not know and any text after the value.
func DecodeHaveByNodeNodeValue(raw []byte) (HaveByNodeNodeValue, error) {
var v HaveByNodeNodeValue
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&v); err != nil {
return v, err
}
if dec.More() {
return v, errors.New("text after the value")
}
return v, nil
}
// ComposedByNodeModuleFingerprintKey is the key of one value of the state composed under the form "<node>.<module>.<fingerprint>".
func ComposedByNodeModuleFingerprintKey(node, module, fingerprint string) string {
return node + "." + module + "." + fingerprint
}
// ParseComposedByNodeModuleFingerprintKey reads the parts of a key of the form "<node>.<module>.<fingerprint>", in the order of the form; the last result is false for a key of another form.
func ParseComposedByNodeModuleFingerprintKey(key string) (string, string, string, bool) {
rest := key
v0, after0, found0 := strings.Cut(rest, ".")
if !found0 || v0 == "" {
return "", "", "", false
}
rest = after0
v2, after2, found2 := strings.Cut(rest, ".")
if !found2 || v2 == "" {
return "", "", "", false
}
rest = after2
if rest == "" {
return "", "", "", false
}
v4 := rest
rest = ""
if rest != "" {
return "", "", "", false
}
return v0, v2, v4, true
}
// DecodeComposedByNodeModuleFingerprintValue reads one value of the state composed under the form "<node>.<module>.<fingerprint>", refusing a field ComposedByNodeModuleFingerprintValue does not know and any text after the value.
func DecodeComposedByNodeModuleFingerprintValue(raw []byte) (ComposedByNodeModuleFingerprintValue, error) {
var v ComposedByNodeModuleFingerprintValue
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&v); err != nil {
return v, err
}
if dec.More() {
return v, errors.New("text after the value")
}
return v, nil
}
// ComposedByNodeNodeKey is the key of one value of the state composed under the form "<node>.node".
func ComposedByNodeNodeKey(node string) string { return node + ".node" }
// ParseComposedByNodeNodeKey reads the parts of a key of the form "<node>.node", in the order of the form; the last result is false for a key of another form.
func ParseComposedByNodeNodeKey(key string) (string, bool) {
rest := key
v0, after0, found0 := strings.Cut(rest, ".node")
if !found0 || v0 == "" {
return "", false
}
rest = after0
if rest != "" {
return "", false
}
return v0, true
}
// DecodeComposedByNodeNodeValue reads one value of the state composed under the form "<node>.node", refusing a field ComposedByNodeNodeValue does not know and any text after the value.
func DecodeComposedByNodeNodeValue(raw []byte) (ComposedByNodeNodeValue, error) {
var v ComposedByNodeNodeValue
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&v); err != nil {
return v, err
}
if dec.More() {
return v, errors.New("text after the value")
}
return v, nil
}
// DataByNodeModuleKey is the key of one value of the state data under the form "<node>.<module>".
func DataByNodeModuleKey(node, module string) string { return node + "." + module }
// ParseDataByNodeModuleKey reads the parts of a key of the form "<node>.<module>", in the order of the form; the last result is false for a key of another form.
func ParseDataByNodeModuleKey(key string) (string, string, bool) {
rest := key
v0, after0, found0 := strings.Cut(rest, ".")
if !found0 || v0 == "" {
return "", "", false
}
rest = after0
if rest == "" {
return "", "", false
}
v2 := rest
rest = ""
if rest != "" {
return "", "", false
}
return v0, v2, true
}
// DecodeDataByNodeModuleValue reads one value of the state data under the form "<node>.<module>", refusing a field DataByNodeModuleValue does not know and any text after the value.
func DecodeDataByNodeModuleValue(raw []byte) (DataByNodeModuleValue, error) {
var v DataByNodeModuleValue
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&v); err != nil {
return v, err
}
if dec.More() {
return v, errors.New("text after the value")
}
return v, nil
}
// PackagesByNodeKey is the key of one value of the state packages under the form "<node>".
func PackagesByNodeKey(node string) string { return node }
// ParsePackagesByNodeKey reads the parts of a key of the form "<node>", in the order of the form; the last result is false for a key of another form.
func ParsePackagesByNodeKey(key string) (string, bool) {
rest := key
if rest == "" {
return "", false
}
v0 := rest
rest = ""
if rest != "" {
return "", false
}
return v0, true
}
// DecodePackagesByNodeValue reads one value of the state packages under the form "<node>", refusing a field PackagesByNodeValue does not know and any text after the value.
func DecodePackagesByNodeValue(raw []byte) (PackagesByNodeValue, error) {
var v PackagesByNodeValue
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&v); err != nil {
return v, err
}
if dec.More() {
return v, errors.New("text after the value")
}
return v, nil
}
// HealthByNodeKey is the key of one value of the state health under the form "<node>".
func HealthByNodeKey(node string) string { return node }
// ParseHealthByNodeKey reads the parts of a key of the form "<node>", in the order of the form; the last result is false for a key of another form.
func ParseHealthByNodeKey(key string) (string, bool) {
rest := key
if rest == "" {
return "", false
}
v0 := rest
rest = ""
if rest != "" {
return "", false
}
return v0, true
}
// DecodeHealthByNodeValue reads one value of the state health under the form "<node>", refusing a field HealthByNodeValue does not know and any text after the value.
func DecodeHealthByNodeValue(raw []byte) (HealthByNodeValue, error) {
var v HealthByNodeValue
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&v); err != nil {
return v, err
}
if dec.More() {
return v, errors.New("text after the value")
}
return v, nil
}
// FindingsByKeyKey is the key of one value of the state findings under the form "<key>".
func FindingsByKeyKey(key string) string { return key }
// ParseFindingsByKeyKey reads the parts of a key of the form "<key>", in the order of the form; the last result is false for a key of another form.
func ParseFindingsByKeyKey(key string) (string, bool) {
rest := key
if rest == "" {
return "", false
}
v0 := rest
rest = ""
if rest != "" {
return "", false
}
return v0, true
}
// DecodeFindingsByKeyValue reads one value of the state findings under the form "<key>", refusing a field FindingsByKeyValue does not know and any text after the value.
func DecodeFindingsByKeyValue(raw []byte) (FindingsByKeyValue, error) {
var v FindingsByKeyValue
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&v); err != nil {
return v, err
}
if dec.More() {
return v, errors.New("text after the value")
}
return v, nil
}
// AccountsHanded is the hashes of the users of the list, sealed to the vault.
type AccountsHanded struct {
// when
At time.Time `json:"at"`
Box SealedBox `json:"box"`
From string `json:"from"`
// the fingerprint of the vault's key
To string `json:"to"`
Users int64 `json:"users"`
}
// Act is one act asked through the seat, as acts reads it (ADR 0563 §9).
type Act struct {
// the act: hand-over, access-act, judge-directories or setuid-search
Act string `json:"act"`
// the operator's ask of a hand-over or an access act
Ask string `json:"ask,omitempty"`
// when it was asked, RFC 3339
At string `json:"at"`
// the engine asked it itself, on finding a library's root holding data outside its group (ADR 0563 §4)
Auto bool `json:"auto,omitempty"`
// who answered, as the operator's warrant names them
By string `json:"by,omitempty"`
// the caller as the runtime proved it
Caller string `json:"caller"`
// what the engine read on disk when it judged
Disk string `json:"disk,omitempty"`
// when it ended, RFC 3339
Ended string `json:"ended,omitempty"`
// when the ask ends unanswered, RFC 3339
Expires string `json:"expires,omitempty"`
// the act's id
ID string `json:"id"`
// the directory the act changes
Path string `json:"path,omitempty"`
// the warrant's proofs
Proofs []string `json:"proofs,omitempty"`
// what the engine said of it: its outcome or why it was refused
Said string `json:"said,omitempty"`
// the owner, group and mode it sets, in words
Sets string `json:"sets,omitempty"`
// where it stands
State string `json:"state"`
// the path of a hand-over, or the access of an access act
Subject string `json:"subject,omitempty"`
// the channel the warrant came on
Via string `json:"via,omitempty"`
// why it was asked, in words
Why string `json:"why,omitempty"`
}
// The values of Act's state.
const (
ActStateAsked = "asked"
ActStateDone = "done"
ActStateRefused = "refused"
ActStateAnswered = "answered"
)
// ActSaid is 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).
type ActSaid struct {
// the act
Act string `json:"act"`
// the operator's ask
Ask string `json:"ask,omitempty"`
// the caller as the runtime proved it
Caller string `json:"caller"`
// the node whose engine says it
Node string `json:"node"`
// what the engine said of it
Said string `json:"said,omitempty"`
// where the act stands
State string `json:"state"`
// the path or the access
Subject string `json:"subject,omitempty"`
}
// The values of ActSaid's state.
const (
ActSaidStateAsked = "asked"
ActSaidStateDone = "done"
ActSaidStateRefused = "refused"
)
// Acts is the acts kept.
type Acts struct {
// the acts, newest first
Acts []Act `json:"acts"`
// the node
Node string `json:"node"`
}
// Adoption is the node is adopted and which of its modules are taken.
type Adoption struct {
// the modules taken
Taken []string `json:"taken"`
// by module, the resources left untaken
Untaken map[string][]string `json:"untaken,omitempty"`
}
// Asked is the answer of an act the operator is asked.
type Asked struct {
// the ask's id: acts shows where it stands
Asked string `json:"asked"`
// the node
Node string `json:"node"`
// what happens next, in words
Says string `json:"says"`
}
// AttachedNetwork is a network attached to a link.
type AttachedNetwork struct {
Link string `json:"link"`
Network string `json:"network"`
}
// CandidateAdded is a module the candidate adds.
type CandidateAdded struct {
Composed string `json:"composed,omitempty"`
Module string `json:"module"`
Unissued []string `json:"unissued,omitempty"`
}
// CandidateAnswer is the node's answer to one placement candidate naming it.
type CandidateAnswer struct {
Added []CandidateAdded `json:"added,omitempty"`
Differs []CandidateDiffers `json:"differs,omitempty"`
Held []CandidateRefusal `json:"held,omitempty"`
Note string `json:"note,omitempty"`
Proposal string `json:"proposal"`
Refusals []CandidateRefusal `json:"refusals,omitempty"`
// why the node cannot compose with the candidate at all
Refused string `json:"refused,omitempty"`
// modules the candidate removes
Removed []string `json:"removed,omitempty"`
Returns string `json:"returns,omitempty"`
Revision int64 `json:"revision"`
// modules whose composition is the one running
Same []string `json:"same,omitempty"`
ValuesDiffer int64 `json:"values_differ,omitempty"`
// same, differs or refused
Verdict string `json:"verdict"`
}
// The values of CandidateAnswer's verdict.
const (
CandidateAnswerVerdictSame = "same"
CandidateAnswerVerdictDiffers = "differs"
CandidateAnswerVerdictRefused = "refused"
)
// CandidateBodies is the bodies of one resource that differ.
type CandidateBodies struct {
Composed string `json:"composed,omitempty"`
ID string `json:"id"`
Paths []string `json:"paths,omitempty"`
Running string `json:"running,omitempty"`
Why string `json:"why"`
}
// CandidateDiffers is a module whose composition with the candidate differs from the one running.
type CandidateDiffers struct {
Bodies []CandidateBodies `json:"bodies,omitempty"`
Composed string `json:"composed,omitempty"`
Module string `json:"module"`
Resource string `json:"resource,omitempty"`
Running string `json:"running,omitempty"`
Why string `json:"why"`
}
// CandidateRefusal is a module refused or held with the candidate.
type CandidateRefusal struct {
Module string `json:"module"`
Today string `json:"today,omitempty"`
Why string `json:"why"`
}
// DeclaredGroup is a group.
type DeclaredGroup struct {
Gid int64 `json:"gid"`
Name string `json:"name"`
}
// DeclaredIdentity is the identity of a module assigned to the node.
type DeclaredIdentity struct {
Gid int64 `json:"gid"`
Groups []int64 `json:"groups,omitempty"`
Module string `json:"module"`
Name string `json:"name"`
Runner string `json:"runner,omitempty"`
Uid int64 `json:"uid"`
}
// DeclaredLibrary is a library the node is reached by.
type DeclaredLibrary struct {
Gid int64 `json:"gid"`
Group string `json:"group"`
Home bool `json:"home"`
Library string `json:"library"`
Paths []string `json:"paths,omitempty"`
Root string `json:"root"`
Runner string `json:"runner,omitempty"`
Taken bool `json:"taken,omitempty"`
}
// FailedUnit is a unit that failed.
type FailedUnit struct {
Load string `json:"load,omitempty"`
Resource string `json:"resource,omitempty"`
Result string `json:"result,omitempty"`
Scope string `json:"scope"`
// since when
Since time.Time `json:"since"`
Unit string `json:"unit"`
}
// FindingAction is one answer the operator may give from a notification.
type FindingAction struct {
Arguments map[string]string `json:"arguments,omitempty"`
Label string `json:"label"`
Level string `json:"level,omitempty"`
Machine string `json:"machine,omitempty"`
// the seat verb the operator channel calls
Verb string `json:"verb"`
}
// The values of FindingAction's level.
const (
FindingActionLevelAcknowledge = "acknowledge"
FindingActionLevelApprove = "approve"
)
// FindingEvidence is one observation, as it was said.
type FindingEvidence struct {
At time.Time `json:"at"`
Said string `json:"said"`
}
// FindingSubject is what the condition is about.
type FindingSubject struct {
// the other machines it concerns
Also []string `json:"also,omitempty"`
// its id within the scope
ID string `json:"id"`
// the machine it concerns, when there is one
Machine string `json:"machine,omitempty"`
// machine, plan, call, build, merge, provider, seat, bus, core, probe, mesh, delivery or module
Scope string `json:"scope"`
}
// LoginFallback is a login that fell back to another node.
type LoginFallback struct {
// when
At time.Time `json:"at"`
From string `json:"from"`
Node string `json:"node"`
Why string `json:"why"`
}
// ManifestReadsChanged is what a node-engine says when what it reads changed or its node returned (ADR 0618 §4).
type ManifestReadsChanged struct {
// when it says it, RFC 3339
At string `json:"at"`
// what its engine states it reads now
ManifestReads []string `json:"manifest-reads,omitempty"`
// the node
Node string `json:"node"`
// the layout's version
V int64 `json:"v"`
// started: the engine started or what it states changed; returned: its node returned after being away
Why string `json:"why"`
}
// The values of ManifestReadsChanged's why.
const (
ManifestReadsChangedWhyStarted = "started"
ManifestReadsChangedWhyReturned = "returned"
)
// Module is one module's composition with the candidate.
type Module struct {
// the candidate changes it from the one composed without it
Changed bool `json:"changed,omitempty"`
// the composition's digest when composed
Digest string `json:"digest,omitempty"`
// the fingerprint it was composed at
Fp string `json:"fp,omitempty"`
// the module, node for the node's own composition
Module string `json:"module"`
// composed (digest set), refused by the candidate, or held without it too (words set)
State string `json:"state"`
// why, for a refused or held one
Words string `json:"words,omitempty"`
}
// The values of Module's state.
const (
ModuleStateComposed = "composed"
ModuleStateRefused = "refused"
ModuleStateHeld = "held"
)
// NetworkHealth is the node's network.
type NetworkHealth struct {
Parts []NetworkPart `json:"parts"`
// since when
Since time.Time `json:"since"`
// running, degraded or unknown
State string `json:"state"`
}
// NetworkPart is one part of the node's network.
type NetworkPart struct {
Owner string `json:"owner,omitempty"`
Part string `json:"part"`
Reason string `json:"reason,omitempty"`
Said string `json:"said,omitempty"`
// since when
Since time.Time `json:"since"`
State string `json:"state"`
Streak int64 `json:"streak,omitempty"`
Targets []string `json:"targets,omitempty"`
Toward []string `json:"toward,omitempty"`
Writer string `json:"writer,omitempty"`
}
// NodeAccount is an account the node needs to log in again.
type NodeAccount struct {
Account string `json:"account"`
Module string `json:"module,omitempty"`
Reason string `json:"reason"`
Resource string `json:"resource,omitempty"`
// since when
Since time.Time `json:"since"`
}
// NodeDirectory is a directory found where the node expected none.
type NodeDirectory struct {
Module string `json:"module"`
Path string `json:"path"`
Reason string `json:"reason"`
Resource string `json:"resource"`
// since when
Since time.Time `json:"since"`
}
// NodeOwn is what a node's own composition carries beside its resources.
type NodeOwn struct {
Adoption *Adoption `json:"adoption,omitempty"`
Groups []DeclaredGroup `json:"groups,omitempty"`
Identities []DeclaredIdentity `json:"identities,omitempty"`
Libraries []DeclaredLibrary `json:"libraries,omitempty"`
// the account the provisioner's client runs as on the node
ProvisionerAccount string `json:"provisioner_account,omitempty"`
}
// NodeRecord is what the machine observes of itself, for every node and composing part to read.
type NodeRecord struct {
Authority string `json:"authority,omitempty"`
Capabilities []string `json:"capabilities,omitempty"`
Certificate string `json:"certificate,omitempty"`
Contract int64 `json:"contract,omitempty"`
ManifestReads []string `json:"manifest-reads,omitempty"`
Networks []AttachedNetwork `json:"networks,omitempty"`
NetworksSaid bool `json:"networks-said,omitempty"`
Node string `json:"node"`
OutwardLinks []string `json:"outward-links,omitempty"`
SealingKey string `json:"sealing-key,omitempty"`
ServingKey string `json:"serving-key,omitempty"`
Trusts []string `json:"trusts,omitempty"`
TunnelKey string `json:"tunnel-key,omitempty"`
V int64 `json:"v"`
}
// PeerSeen is a tunnel peer and whether it is seen.
type PeerSeen struct {
Addresses []string `json:"addresses,omitempty"`
Key string `json:"key"`
Seen bool `json:"seen"`
}
// PlacedDataItem is one data item a module declares, as placed on a node.
type PlacedDataItem struct {
Class string `json:"class"`
// the path whose snapshot keeps it, empty when it is not backed up
CoveredBy string `json:"covered_by,omitempty"`
Item string `json:"item"`
// walk, dataset or shallow
Measure string `json:"measure,omitempty"`
Module string `json:"module"`
// the item's place on the node
Path string `json:"path"`
// backup, redundancy, both or none
Protection string `json:"protection,omitempty"`
}
// PullWait is the pull from a store a failed apply waits on.
type PullWait struct {
// when the pull began
Began time.Time `json:"began"`
// that seat's holder, whose settling the apply waits for
Holder string `json:"holder"`
Image string `json:"image"`
// what triggered the last try again, in words
Retried string `json:"retried,omitempty"`
// when the apply was last tried again
RetriedAt *time.Time `json:"retried-at,omitempty"`
// the seat the pull came through
Seat string `json:"seat,omitempty"`
}
// Revision is one revision of a composition key.
type Revision struct {
// its digest
Digest string `json:"digest,omitempty"`
// the composition's key
Key string `json:"key"`
// the latest revision
Latest bool `json:"latest,omitempty"`
// why it cannot be read or trusted
Refused string `json:"refused,omitempty"`
// how many resources it names
Resources int64 `json:"resources,omitempty"`
// its revision
Revision int64 `json:"revision,omitempty"`
}
// RootAccountVerdict is the engine's verdict of whether an account's resource is root-free, as the node's health lists it.
type RootAccountVerdict struct {
Account string `json:"account"`
Module string `json:"module"`
Reason string `json:"reason,omitempty"`
Resource string `json:"resource"`
// since when
Since time.Time `json:"since"`
State string `json:"state"`
}
// RootVerdict is the engine's root-free verdict (ADR 0563 §6).
type RootVerdict struct {
// the machine is root-free
Free bool `json:"free"`
// when the engine judged it, RFC 3339
Judged string `json:"judged"`
// the machine
Machine string `json:"machine"`
// why, in words
Why string `json:"why"`
}
// Said is the answer of a read-only judgement.
type Said struct {
// the node
Node string `json:"node"`
// the engine's judgement or search, one line per directory or program
Said string `json:"said"`
}
// SealedBox is a value sealed to a key.
type SealedBox struct {
Ct string `json:"ct"`
Eph string `json:"eph"`
Iv string `json:"iv"`
Tag string `json:"tag"`
V int64 `json:"v"`
}
// SeatListStatus is a type of the contract.
type SeatListStatus struct {
// the seat mesh-catalog has answered
Heard bool `json:"heard"`
Held []SeatListHeld `json:"held"`
LastError string `json:"last-error,omitempty"`
// a trunk definition that does not parse, by seat: the one held stands
Refused map[string]string `json:"refused,omitempty"`
Revision int64 `json:"revision,omitempty"`
// the seats held from the bootstrap alone
Waiting []string `json:"waiting,omitempty"`
}
// SeatList is what an engine holds of the seat list (novox/hq ADR 0636 §7).
type SeatList struct {
// why the read failed, for seat-list-again
Error string `json:"error,omitempty"`
// the one line the engine says of it; empty when nothing waits
Health string `json:"health"`
Status SeatListStatus `json:"status"`
}
// SeatListHeld is a type of the contract.
type SeatListHeld struct {
// the digest of the definition held; empty for a bootstrapped one
Digest string `json:"digest,omitempty"`
Seat string `json:"seat"`
Source string `json:"source"`
}
// The values of SeatListHeld's source.
const (
SeatListHeldSourceTrunk = "trunk"
SeatListHeldSourceBootstrap = "bootstrap"
)
// UnitsHealth is the node's units.
type UnitsHealth struct {
Away []string `json:"away,omitempty"`
Failed []FailedUnit `json:"failed"`
State string `json:"state"`
Unread []string `json:"unread,omitempty"`
}
// UserListWritten is the bus's user list as the engine of the bus node wrote it to the bus module's file.
type UserListWritten struct {
// when
At time.Time `json:"at"`
// the digest of the file on the machine after the write
Digest string `json:"digest,omitempty"`
// why a write failed
Error string `json:"error,omitempty"`
// which list the node follows now
Follows string `json:"follows,omitempty"`
Handed *AccountsHanded `json:"handed,omitempty"`
// the bus node's sealing key, its public half
Key string `json:"key,omitempty"`
Revision int64 `json:"revision"`
// the key the list was taken from
Source string `json:"source"`
// why the bus node does not watch the grants part's key now
Unwatched string `json:"unwatched,omitempty"`
Users int64 `json:"users"`
// the digest of the list the source holds, sha256:<hex>
Wanted string `json:"wanted"`
}
// HandOverInput is what hand-over takes.
type HandOverInput struct {
// the directory's absolute path, as the engine states it
Path string `json:"path"`
// why it is asked, in words the operator reads
Why string `json:"why,omitempty"`
}
// HandOverAnswer is what hand-over answers.
type HandOverAnswer = Asked
// AccessActInput is what access-act takes.
type AccessActInput struct {
// the access, library:<name>
Access string `json:"access"`
// the act: take
Act string `json:"act"`
// why it is asked, in words the operator reads
Why string `json:"why,omitempty"`
}
// AccessActAnswer is what access-act answers.
type AccessActAnswer = Asked
// JudgeDirectoriesInput is what judge-directories takes.
type JudgeDirectoriesInput struct {
}
// JudgeDirectoriesAnswer is what judge-directories answers.
type JudgeDirectoriesAnswer = Said
// SetuidSearchInput is what setuid-search takes.
type SetuidSearchInput struct {
// why it is asked, in words
Why string `json:"why,omitempty"`
}
// SetuidSearchAnswer is what setuid-search answers.
type SetuidSearchAnswer = Said
// RootFreeInput is what root-free takes.
type RootFreeInput struct {
}
// RootFreeAnswer is what root-free answers.
type RootFreeAnswer struct {
// this machine's verdict
Machines []RootVerdict `json:"machines"`
}
// ActsInput is what acts takes.
type ActsInput struct {
// one act, by its id
ID string `json:"id,omitempty"`
// at most this many, newest
Limit string `json:"limit,omitempty"`
}
// ActsAnswer is what acts answers.
type ActsAnswer = Acts
// PackagesInput is what packages takes.
type PackagesInput struct {
// "true": write this machine's key again from what the engine composed
Write string `json:"write,omitempty"`
}
// The values of PackagesInput's write.
const (
PackagesInputWriteTrue = "true"
PackagesInputWriteFalse = "false"
)
// PackagesAnswerKeyPackagesItem is a type of the contract.
type PackagesAnswerKeyPackagesItem struct {
// declared absent
Absent bool `json:"absent"`
// the modules that declare it
Modules []string `json:"modules"`
// the package
Package string `json:"package"`
}
// PackagesAnswerKey is the node's key as the bus holds it; absent when the engine wrote none.
type PackagesAnswerKey struct {
// the node
Node string `json:"node"`
// its packages sorted by name, absent after present
Packages []PackagesAnswerKeyPackagesItem `json:"packages"`
}
// PackagesAnswer is what packages answers.
type PackagesAnswer struct {
// the node's key as the bus holds it; absent when the engine wrote none
Key *PackagesAnswerKey `json:"key,omitempty"`
// why the key could not be read
KeyError string `json:"key_error,omitempty"`
// the node
Node string `json:"node"`
// a note, such as that no key is written yet
Note string `json:"note,omitempty"`
// where the key is read: the engine's state packages
Source string `json:"source"`
// with write: the key was written again (false: it already held what the engine composed)
Wrote bool `json:"wrote,omitempty"`
}
// CompositionInput is what composition takes.
type CompositionInput struct {
// "true": list the resources that differ from what runs
Diff string `json:"diff,omitempty"`
// a composition's digest (sha256:…), to read that revision rather than the latest
Digest string `json:"digest,omitempty"`
// the module, as placed on this machine; node for the node's own
Module string `json:"module"`
}
// CompositionAnswerAttempt is the module's last apply that did not end running; absent when none.
type CompositionAnswerAttempt struct {
// the want's revision the hold took
AnsweredRevision int64 `json:"answered_revision,omitempty"`
// the digest tried
Composed string `json:"composed,omitempty"`
// the composition's revision it was tried at
CompositionRevision int64 `json:"composition_revision"`
// the fingerprint tried
Fp string `json:"fp"`
// held for a failed backup
Held bool `json:"held,omitempty"`
// it failed because the bus did not answer for a moment
Transient bool `json:"transient,omitempty"`
// the want's revision it was tried at
WantRevision int64 `json:"want_revision"`
}
// CompositionAnswerHave is what the module's have key says now; absent when it says nothing.
type CompositionAnswerHave struct {
// digest
Composed string `json:"composed,omitempty"`
// detail
Detail string `json:"detail,omitempty"`
// fingerprint
Fp string `json:"fp,omitempty"`
// judgement
Judgement string `json:"judgement,omitempty"`
// running, failed, held or waiting-yes
Phase string `json:"phase"`
// the digest that waits for a yes
Waits string `json:"waits,omitempty"`
}
// CompositionAnswerJudged is the move from what runs to the composition read.
type CompositionAnswerJudged struct {
// the judgement
Judgement string `json:"judgement"`
// the agent would wait for a person's yes before applying it
WaitsForYes bool `json:"waits_for_yes"`
// its words
Words string `json:"words"`
}
// CompositionAnswerOwn is of the node's own composition, its own fields beside what runs names.
type CompositionAnswerOwn struct {
// the revision's adoption; absent for a converged node
Adoption map[string]any `json:"adoption,omitempty"`
// groups
Groups int64 `json:"groups,omitempty"`
// each module the node's composer held in its last pass, with why
Held map[string]string `json:"held,omitempty"`
// identities the revision names
Identities int64 `json:"identities,omitempty"`
// libraries
Libraries int64 `json:"libraries,omitempty"`
// the account the provisioner's client runs as, as the revision names it
ProvisionerAccount string `json:"provisioner_account"`
// as what runs names it
RunsProvisionerAccount string `json:"runs_provisioner_account,omitempty"`
}
// CompositionAnswerRuns is what runs of the module; absent when nothing runs.
type CompositionAnswerRuns struct {
// digest
Composed string `json:"composed,omitempty"`
// fingerprint
Fp string `json:"fp,omitempty"`
// applied, have or kept
From string `json:"from"`
// phase
Phase string `json:"phase,omitempty"`
// how many resources run
Resources int64 `json:"resources"`
}
// CompositionAnswerWant is the module's want as the agent holds it; absent when it holds none.
type CompositionAnswerWant struct {
// the operator's answer to a failed backup, again or skip
Backup string `json:"backup,omitempty"`
// the composition's digest it names
Composed string `json:"composed,omitempty"`
// its build's fingerprint
Fp string `json:"fp"`
// the module is removed
Removed bool `json:"removed,omitempty"`
// the revision of the want's key read last
Revision int64 `json:"revision"`
// the node composes the module itself (ADR 0547 §2)
Self bool `json:"self,omitempty"`
// its words
Words string `json:"words,omitempty"`
// the digest a person said yes to
Yes string `json:"yes,omitempty"`
}
// CompositionAnswer is what composition answers.
type CompositionAnswer struct {
// the module's last apply that did not end running; absent when none
Attempt *CompositionAnswerAttempt `json:"attempt,omitempty"`
Composition Revision `json:"composition"`
// every resource that differs from what runs, when asked
Diff []map[string]any `json:"diff,omitempty"`
// what the module's have key says now; absent when it says nothing
Have *CompositionAnswerHave `json:"have,omitempty"`
// the move from what runs to the composition read
Judged CompositionAnswerJudged `json:"judged"`
// the module
Module string `json:"module"`
// the node
Node string `json:"node"`
// of the node's own composition, its own fields beside what runs names
Own *CompositionAnswerOwn `json:"own,omitempty"`
// the revisions of its key the bucket keeps, oldest first
Revisions []Revision `json:"revisions,omitempty"`
// what runs of the module; absent when nothing runs
Runs *CompositionAnswerRuns `json:"runs,omitempty"`
// the agent has looked at the module once since it started
Started bool `json:"started"`
// the module's want as the agent holds it; absent when it holds none
Want *CompositionAnswerWant `json:"want,omitempty"`
}
// ComposeInput is what compose takes.
type ComposeInput struct {
// a module placed on this machine whose apply is also tried again (optional)
Module string `json:"module,omitempty"`
}
// ComposeAnswerPass is how the pass went.
type ComposeAnswerPass struct {
// when the node composes again on its own, RFC 3339
Again string `json:"again,omitempty"`
// when the pass ended, RFC 3339
At string `json:"at"`
// the answer is the last pass, made moments ago
Earlier bool `json:"earlier,omitempty"`
// how many compositions the pass handed the agent that differ from before
Handed int64 `json:"handed"`
// each module refused alone, with why
Held map[string]string `json:"held,omitempty"`
// why the node composed none of its modules
Refused string `json:"refused,omitempty"`
}
// ComposeAnswer is what compose answers.
type ComposeAnswer struct {
// how the pass went
Pass ComposeAnswerPass `json:"pass"`
// the module whose apply was tried again
Retried string `json:"retried,omitempty"`
}
// ComposeCandidateInput is what compose-candidate takes.
type ComposeCandidateInput struct {
// the key of the indexer's candidate, <group>.<heads hash>
Candidate string `json:"candidate"`
// also answer the composition input the candidate was composed from, for the sandbox path
Input bool `json:"input,omitempty"`
}
// ComposeCandidateAnswer is what compose-candidate answers.
type ComposeCandidateAnswer struct {
// the candidate's key
Candidate string `json:"candidate"`
// when asked: the composition input it composed from
Input map[string]any `json:"input,omitempty"`
// every module placed on the node, sorted by name
Modules []Module `json:"modules"`
// the node
Node string `json:"node"`
Own Module `json:"own"`
// why the node could not compose with the candidate at all
Refused string `json:"refused,omitempty"`
// how long the engine took, in milliseconds
Took int64 `json:"took"`
// the layout's version
V int64 `json:"v"`
// the node's verdict (ADR 0593 §7, §9)
Verdict string `json:"verdict"`
}
// The values of ComposeCandidateAnswer's verdict.
const (
ComposeCandidateAnswerVerdictComposed = "composed"
ComposeCandidateAnswerVerdictRefused = "refused"
ComposeCandidateAnswerVerdictUnready = "unready"
ComposeCandidateAnswerVerdictNotJudged = "not-judged"
)
// ManifestReadsInput is what manifest-reads takes.
type ManifestReadsInput struct {
}
// ManifestReadsAnswer is what manifest-reads answers.
type ManifestReadsAnswer struct {
// 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
ManifestReads []string `json:"manifest-reads,omitempty"`
// the node
Node string `json:"node"`
// when the engine last stated them, RFC 3339
StatedAt string `json:"stated-at"`
// the layout's version
V int64 `json:"v"`
}
// SeatListInput is what seat-list takes.
type SeatListInput struct {
}
// SeatListAnswer is what seat-list answers.
type SeatListAnswer = SeatList
// SeatListAgainInput is what seat-list-again takes.
type SeatListAgainInput struct {
}
// SeatListAgainAnswer is what seat-list-again answers.
type SeatListAgainAnswer = SeatList
// AskedEvent is the body of the event asked.
type AskedEvent = ActSaid
// DoneEvent is the body of the event done.
type DoneEvent = ActSaid
// RefusedEvent is the body of the event refused.
type RefusedEvent = ActSaid
// ManifestReadsChangedEvent is the body of the event manifest-reads-changed.
type ManifestReadsChangedEvent = ManifestReadsChanged
// HaveByNodeModuleValue is one value of the state have under the key <node>.<module>.
type HaveByNodeModuleValue struct {
Build string `json:"build,omitempty"`
// the move changes the build alone
BuildAlone bool `json:"build-alone,omitempty"`
// the digest of the composition the node runs
Composed string `json:"composed,omitempty"`
Detail string `json:"detail,omitempty"`
// the fingerprint held
Fp string `json:"fp,omitempty"`
Handed *AccountsHanded `json:"handed,omitempty"`
// what the module's own check says
Health string `json:"health"`
// in phase waiting-yes, the judgement of the move
Judgement string `json:"judgement,omitempty"`
// what the node keeps of the module as it runs
Kept []string `json:"kept,omitempty"`
// how far it has come
Phase string `json:"phase"`
PullWait *PullWait `json:"pull-wait,omitempty"`
// each value sealed to the node's key
Sealed []string `json:"sealed,omitempty"`
// the sealed values by slot
SealedAt map[string]string `json:"sealed-at,omitempty"`
UserList *UserListWritten `json:"user-list,omitempty"`
V int64 `json:"v"`
// in phase waiting-yes, the digest of the composition that waits
Waits string `json:"waits,omitempty"`
}
// The values of HaveByNodeModuleValue's health.
const (
HaveByNodeModuleValueHealthOk = "ok"
HaveByNodeModuleValueHealthFailed = "failed"
HaveByNodeModuleValueHealthWaits = "waits"
HaveByNodeModuleValueHealthUnknown = "unknown"
)
// The values of HaveByNodeModuleValue's judgement.
const (
HaveByNodeModuleValueJudgementRecreates = "recreates"
HaveByNodeModuleValueJudgementMovesData = "moves-data"
HaveByNodeModuleValueJudgementCannotJudge = "cannot-judge"
)
// The values of HaveByNodeModuleValue's phase.
const (
HaveByNodeModuleValuePhaseBackingUp = "backing-up"
HaveByNodeModuleValuePhaseApplying = "applying"
HaveByNodeModuleValuePhaseChecking = "checking"
HaveByNodeModuleValuePhaseRunning = "running"
HaveByNodeModuleValuePhaseFailed = "failed"
HaveByNodeModuleValuePhaseRemoved = "removed"
HaveByNodeModuleValuePhaseHeld = "held"
HaveByNodeModuleValuePhaseWaitingYes = "waiting-yes"
)
// HaveByNodeNodeValue is one value of the state have under the key <node>.node.
type HaveByNodeNodeValue struct {
Busy []map[string]any `json:"busy,omitempty"`
// the node's answer to each placement candidate naming it, by proposal id
Candidates map[string]CandidateAnswer `json:"candidates,omitempty"`
// the digest of the node's own composition it runs
Composed string `json:"composed,omitempty"`
// own, or none (empty)
Composes string `json:"composes,omitempty"`
ComposesWhy string `json:"composes-why,omitempty"`
Filters []map[string]any `json:"filters,omitempty"`
Profile map[string]any `json:"profile,omitempty"`
Record *NodeRecord `json:"record,omitempty"`
Sealed []string `json:"sealed,omitempty"`
SealedAt map[string]string `json:"sealed-at,omitempty"`
Strays []map[string]any `json:"strays,omitempty"`
V int64 `json:"v"`
Windows []map[string]any `json:"windows,omitempty"`
}
// ComposedByNodeModuleFingerprintValue is one value of the state composed under the key <node>.<module>.<fingerprint>.
type ComposedByNodeModuleFingerprintValue struct {
// the module declares data
Data bool `json:"data,omitempty"`
// the files the provisioner fills
FilledFiles []string `json:"filled_files,omitempty"`
Fp string `json:"fp"`
Module string `json:"module"`
Node string `json:"node"`
// the module's whole provisioning plan, catalogue.Plan, kept whole: it is the manifest layer's type
Plan map[string]any `json:"plan,omitempty"`
// why the module cannot be composed at this fingerprint
Refused string `json:"refused,omitempty"`
// the declaration resources, each saying its module
Resources []map[string]any `json:"resources"`
V int64 `json:"v"`
}
// ComposedByNodeNodeValue is one value of the state composed under the key <node>.node.
type ComposedByNodeNodeValue struct {
// the module declares data
Data bool `json:"data,omitempty"`
// the files the provisioner fills
FilledFiles []string `json:"filled_files,omitempty"`
Node string `json:"node"`
Own *NodeOwn `json:"own,omitempty"`
// the declaration resources, each saying its module
Resources []map[string]any `json:"resources"`
V int64 `json:"v"`
}
// DataByNodeModuleValue is one value of the state data under the key <node>.<module>.
type DataByNodeModuleValue struct {
Digest string `json:"digest"`
Items []PlacedDataItem `json:"items"`
Module string `json:"module"`
Node string `json:"node"`
V int64 `json:"v"`
}
// PackagesByNodeValuePackagesItem is a type of the contract.
type PackagesByNodeValuePackagesItem struct {
Absent bool `json:"absent"`
Modules []string `json:"modules"`
Package string `json:"package"`
}
// PackagesByNodeValue is one value of the state packages under the key <node>.
type PackagesByNodeValue struct {
Node string `json:"node"`
Packages []PackagesByNodeValuePackagesItem `json:"packages"`
}
// HealthByNodeValue is one value of the state health under the key <node>.
type HealthByNodeValue struct {
// when
At time.Time `json:"at"`
Contract int64 `json:"contract,omitempty"`
Fallback *LoginFallback `json:"fallback,omitempty"`
Found []NodeDirectory `json:"found,omitempty"`
Network *NetworkHealth `json:"network,omitempty"`
Node string `json:"node"`
Peers []PeerSeen `json:"peers,omitempty"`
Relogin []NodeAccount `json:"relogin,omitempty"`
Root []RootAccountVerdict `json:"root,omitempty"`
Units *UnitsHealth `json:"units,omitempty"`
V int64 `json:"v"`
}
// FindingsByKeyValue is one value of the state findings under the key <key>.
type FindingsByKeyValue struct {
Actions []FindingAction `json:"actions,omitempty"`
At time.Time `json:"at"`
// newest first, at most 10
Evidence []FindingEvidence `json:"evidence,omitempty"`
Explanation string `json:"explanation,omitempty"`
Headline string `json:"headline,omitempty"`
// scope.id.token
Key string `json:"key"`
Kind string `json:"kind"`
Needs string `json:"needs,omitempty"`
// the module that wrote it
Observer string `json:"observer"`
// the key's last part when it is not the kind
Ref string `json:"ref,omitempty"`
Resolved string `json:"resolved,omitempty"`
// self, operator, agent or healer:<name>
Resolver string `json:"resolver,omitempty"`
// what of its own saw it last
Run string `json:"run,omitempty"`
Severity string `json:"severity"`
// the row, probe or event that saw it
Source string `json:"source"`
Subject FindingSubject `json:"subject"`
// one line
Summary string `json:"summary"`
// layout version, 1
V int64 `json:"v"`
}
// The values of FindingsByKeyValue's severity.
const (
FindingsByKeyValueSeverityUrgent = "urgent"
FindingsByKeyValueSeverityWarning = "warning"
)