A bus account kind ledger, named ledger.<node>.<module> and held in the tool runner's ledgers (issue 1966 S6)
ADR 0597 §9 and the lead's Q1 path: one ledger credential per module assignment, minted by the vault like every kind; the grants part's copy of buscompose gains the same kind alike (D5b).
This commit is contained in:
@@ -31,7 +31,8 @@ type ClaimedSeat struct {
|
|||||||
// WantedAccount is one key of the grants part's state `accounts`: an account the mesh needs, without its password.
|
// WantedAccount is one key of the grants part's state `accounts`: an account the mesh needs, without its password.
|
||||||
type WantedAccount struct {
|
type WantedAccount struct {
|
||||||
User string `json:"user"`
|
User string `json:"user"`
|
||||||
// Kind is KindModule (KindNodeTools for the runtime, named as a module is), KindProcess or KindProvisioner.
|
// Kind is KindModule (KindNodeTools for the runtime, named as a module is), KindProcess, KindProvisioner or
|
||||||
|
// KindLedger.
|
||||||
Kind Kind `json:"kind"`
|
Kind Kind `json:"kind"`
|
||||||
Node string `json:"node"`
|
Node string `json:"node"`
|
||||||
Module string `json:"module"`
|
Module string `json:"module"`
|
||||||
@@ -46,8 +47,12 @@ type WantedAccount struct {
|
|||||||
At time.Time `json:"at"`
|
At time.Time `json:"at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LedgersSecret is the tool runner's own secret holding its machine's ledger accounts, a map of module to credential
|
||||||
|
// (ADR 0597 §9).
|
||||||
|
const LedgersSecret = "ledgers"
|
||||||
|
|
||||||
// mintedKinds are the kinds of account the vault mints (ADR 0561 §1).
|
// mintedKinds are the kinds of account the vault mints (ADR 0561 §1).
|
||||||
var mintedKinds = []Kind{KindModule, KindNodeTools, KindProcess, KindProvisioner}
|
var mintedKinds = []Kind{KindModule, KindNodeTools, KindProcess, KindProvisioner, KindLedger}
|
||||||
|
|
||||||
// principal is the account as the composer names it.
|
// principal is the account as the composer names it.
|
||||||
func (w WantedAccount) principal() Principal {
|
func (w WantedAccount) principal() Principal {
|
||||||
@@ -93,9 +98,12 @@ func (w WantedAccount) Same(o WantedAccount) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// OwnSecret is the module's own secret the account is held in: `broker`, `broker-<process id>` or `provisioner-broker`
|
// OwnSecret is the module's own secret the account is held in: `broker`, `broker-<process id>` or `provisioner-broker`
|
||||||
// (the controller's names, ADR 0436 §2, ADR 0349 §11).
|
// (the controller's names, ADR 0436 §2, ADR 0349 §11); a ledger account in the tool runner's `ledgers`, which keeps every
|
||||||
|
// ledger account of its machine, by module (ADR 0597 §9).
|
||||||
func (w WantedAccount) OwnSecret() string {
|
func (w WantedAccount) OwnSecret() string {
|
||||||
switch w.Kind {
|
switch w.Kind {
|
||||||
|
case KindLedger:
|
||||||
|
return LedgersSecret
|
||||||
case KindProcess:
|
case KindProcess:
|
||||||
return "broker-" + w.Process
|
return "broker-" + w.Process
|
||||||
case KindProvisioner:
|
case KindProvisioner:
|
||||||
|
|||||||
@@ -18,4 +18,12 @@ func TestTheBusNamesAgree(t *testing.T) {
|
|||||||
if LogStreamName("mesh-delivery-builder", "build-log") == "" || LogSubject("mesh-delivery-builder", "build-log") == "" {
|
if LogStreamName("mesh-delivery-builder", "build-log") == "" || LogSubject("mesh-delivery-builder", "build-log") == "" {
|
||||||
t.Fatal("a log has no stream or subject")
|
t.Fatal("a log has no stream or subject")
|
||||||
}
|
}
|
||||||
|
// 1966/AC23: a wanted account of kind ledger for m on a names the user ledger.a.m and the own secret ledgers.
|
||||||
|
ledger := WantedAccount{User: "ledger.a.m", Kind: KindLedger, Node: "a", Module: "m", URL: "nats://10.0.0.1:4222"}
|
||||||
|
if got := (Principal{Kind: KindLedger, Node: "a", Module: "m"}).Username(); got != "ledger.a.m" {
|
||||||
|
t.Fatalf("a ledger account is named %q", got)
|
||||||
|
}
|
||||||
|
if err := ledger.Valid(); err != nil || ledger.OwnSecret() != "ledgers" {
|
||||||
|
t.Fatalf("a wanted ledger account: %v, held in %q", err, ledger.OwnSecret())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ const (
|
|||||||
// exactly what its bus says — never root, never the operator account, and never able to answer a tool
|
// exactly what its bus says — never root, never the operator account, and never able to answer a tool
|
||||||
// call or a seat's verb (§3). One per process and machine.
|
// call or a seat's verb (§3). One per process and machine.
|
||||||
KindProcess Kind = "process"
|
KindProcess Kind = "process"
|
||||||
|
// KindLedger is one module assignment's ledger credential (novox/hq ADR 0597 §9, design 25 § 12.4): held by that
|
||||||
|
// machine's tool runner, never by the module's own code, and the only account that publishes on that module's ledger
|
||||||
|
// histories and snapshots. One per module assignment, whose module asks for a ledger in `requires`.
|
||||||
|
KindLedger Kind = "ledger"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Seat is a role on the bus as a principal relates to it: the subjects it accepts, and those it
|
// Seat is a role on the bus as a principal relates to it: the subjects it accepts, and those it
|
||||||
@@ -272,6 +276,10 @@ func (p Principal) Username() string {
|
|||||||
return p.Login
|
return p.Login
|
||||||
}
|
}
|
||||||
return "node." + p.Node
|
return "node." + p.Node
|
||||||
|
case KindLedger:
|
||||||
|
// `ledger.<machine>.<module>`: never `<node>.<module>`, which is the module's own account or the tool runner's,
|
||||||
|
// so the module's code never holds it.
|
||||||
|
return "ledger." + p.Node + "." + p.Module
|
||||||
case KindProvisioner:
|
case KindProvisioner:
|
||||||
// Named for the machine, as a node is: one client per machine, whichever module runs it, and never
|
// Named for the machine, as a node is: one client per machine, whichever module runs it, and never
|
||||||
// `<node>.<module>`, which is the module's own account or the tool runner's.
|
// `<node>.<module>`, which is the module's own account or the tool runner's.
|
||||||
|
|||||||
Reference in New Issue
Block a user