mesh-recovery A-133: the manifest follows the validator
Its tool check stands on its own runtime beside the process's unit check, its template states are its own by requires alone (not listed again in the process's bus, which keeps its account), and digests takes the state template's fixed cap (A-135). Builds: design 47 G §657, §567, §554, A-133, A-135 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
This commit is contained in:
@@ -31,18 +31,25 @@ type manifest struct {
|
||||
Type string `json:"type"`
|
||||
Serves []string `json:"serves"`
|
||||
Bus struct {
|
||||
State []string `json:"state"`
|
||||
Invokes []string `json:"invokes"`
|
||||
} `json:"bus"`
|
||||
Health struct {
|
||||
Tool string `json:"tool"`
|
||||
Kind string `json:"kind"`
|
||||
} `json:"health"`
|
||||
} `json:"resources"`
|
||||
RuntimeHealth struct {
|
||||
Kind string `json:"kind"`
|
||||
Tool string `json:"tool"`
|
||||
} `json:"runtime-health"`
|
||||
Requires []json.RawMessage `json:"requires"`
|
||||
}
|
||||
|
||||
// The manifest says what the module is (design 47 G §554, §656, §657, §633, §564, §567): it claims the seat once for the
|
||||
// mesh serving every verb of the seat's definition, its process answers each of them itself (A-115: `serves` beside its
|
||||
// `bus`), its health check names a tool it serves, its data item is `points`, its settings carry the design's defaults,
|
||||
// and what the process invokes the module declares.
|
||||
// `bus`), its health check is its tool beside the process's own check and its template states are its own by `requires`
|
||||
// alone, the digests state taking the template's fixed cap (A-133, A-135), its data item is `points`, its settings carry
|
||||
// the design's defaults, and what the process invokes the module declares.
|
||||
func TestTheManifestSaysWhatTheModuleIs(t *testing.T) {
|
||||
raw, err := os.ReadFile("../../module.json")
|
||||
if err != nil {
|
||||
@@ -79,8 +86,11 @@ func TestTheManifestSaysWhatTheModuleIs(t *testing.T) {
|
||||
if !slices.Equal(r.Serves, want) {
|
||||
t.Errorf("the process serves %v, want %v", r.Serves, want)
|
||||
}
|
||||
if !slices.Contains(m.Tools, r.Health.Tool) || r.Health.Tool != "recovery_kept_points" {
|
||||
t.Errorf("the health check names %q, a tool of %v", r.Health.Tool, m.Tools)
|
||||
if r.Health.Kind != "unit" {
|
||||
t.Errorf("the process's own check is %q, want unit", r.Health.Kind)
|
||||
}
|
||||
if len(r.Bus.State) != 0 {
|
||||
t.Errorf("the process's bus lists the states %v again, which are the module's own by its requires", r.Bus.State)
|
||||
}
|
||||
for _, inv := range r.Bus.Invokes {
|
||||
if !slices.Contains(m.Invokes, inv) {
|
||||
@@ -88,6 +98,18 @@ func TestTheManifestSaysWhatTheModuleIs(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if m.RuntimeHealth.Kind != "tool" || m.RuntimeHealth.Tool != "recovery_kept_points" || !slices.Contains(m.Tools, m.RuntimeHealth.Tool) {
|
||||
t.Errorf("the tool check is %+v, want recovery_kept_points, a tool of %v", m.RuntimeHealth, m.Tools)
|
||||
}
|
||||
for _, raw := range m.Requires {
|
||||
var q struct {
|
||||
Name string `json:"name"`
|
||||
Options map[string]any `json:"options"`
|
||||
}
|
||||
if json.Unmarshal(raw, &q) == nil && q.Name == "digests" && len(q.Options) != 0 {
|
||||
t.Errorf("digests gives the options %v beside the template state's fixed cap", q.Options)
|
||||
}
|
||||
}
|
||||
for _, c := range []string{"node-backup.item-started", "node-backup.item-ended", "mesh-broker.snapshot-restored"} {
|
||||
if !slices.Contains(m.Consumes, c) {
|
||||
t.Errorf("does not consume %s", c)
|
||||
|
||||
@@ -60,10 +60,7 @@
|
||||
{
|
||||
"name": "digests",
|
||||
"storage": "key-value",
|
||||
"template": "state",
|
||||
"options": {
|
||||
"max-mib": 4
|
||||
}
|
||||
"template": "state"
|
||||
},
|
||||
{
|
||||
"name": "findings",
|
||||
@@ -219,10 +216,6 @@
|
||||
"seat:mesh-recovery.expire-points"
|
||||
],
|
||||
"bus": {
|
||||
"state": [
|
||||
"digests",
|
||||
"findings"
|
||||
],
|
||||
"invokes": [
|
||||
"seat:mesh-catalog.entry",
|
||||
"seat:mesh-module-assigner.assignments",
|
||||
@@ -233,15 +226,18 @@
|
||||
]
|
||||
},
|
||||
"health": {
|
||||
"kind": "tool",
|
||||
"tool": "recovery_kept_points",
|
||||
"interval": "60s",
|
||||
"timeout": "10s",
|
||||
"looks": 2,
|
||||
"grace": "180s"
|
||||
"kind": "unit"
|
||||
}
|
||||
}
|
||||
],
|
||||
"runtime-health": {
|
||||
"kind": "tool",
|
||||
"tool": "recovery_kept_points",
|
||||
"interval": "60s",
|
||||
"timeout": "10s",
|
||||
"looks": 2,
|
||||
"grace": "180s"
|
||||
},
|
||||
"build": {
|
||||
"artifacts": [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user