From aa7e53112b9690269c752c699221f02e7bce6667 Mon Sep 17 00:00:00 2001 From: jochen Date: Sat, 24 Oct 2026 18:43:22 +0200 Subject: [PATCH] Find a want's have by the have's own key: want.. against . (release 6, issue 1945) --- cmd/mesh-controller/haves.go | 10 +++++++--- cmd/mesh-controller/haves_test.go | 24 ++++++++++++++++-------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/cmd/mesh-controller/haves.go b/cmd/mesh-controller/haves.go index 1669d39e..2ccbfe7e 100644 --- a/cmd/mesh-controller/haves.go +++ b/cmd/mesh-controller/haves.go @@ -20,14 +20,18 @@ import ( func currentNodes(wants map[string]sdkdelivery.Want, haves map[string]sdkdelivery.Have) map[string]bool { out := map[string]bool{} for key, w := range wants { - node, _, err := sdkdelivery.ParseWantKey(key) + node, module, err := sdkdelivery.ParseWantKey(key) if err != nil { - continue // the node's own want: its composition is the node-engine's own + continue // the node's own want, or a fingerprint the assigner holds: not a module's want } if _, seen := out[node]; !seen { out[node] = true } - h, had := haves[key] + haveKey, err := sdkdelivery.HaveKey(node, module) // `.`, where a want's key is `want..` + if err != nil { + continue + } + h, had := haves[haveKey] switch { case w.Removed: if had && h.Phase != sdkdelivery.PhaseRemoved { diff --git a/cmd/mesh-controller/haves_test.go b/cmd/mesh-controller/haves_test.go index 19893d7e..6a33006b 100644 --- a/cmd/mesh-controller/haves_test.go +++ b/cmd/mesh-controller/haves_test.go @@ -20,6 +20,7 @@ func TestAMachineIsCurrentWhenItHasWhatIsWantedOfIt(t *testing.T) { have := func(f, composed string, phase sdkdelivery.Phase) sdkdelivery.Have { return sdkdelivery.Have{V: 1, FP: f, Composed: composed, Phase: phase, Health: sdkdelivery.HealthOK} } + // A want's key is `want..` and a have's is `.`: the same module, two buckets. key := func(node, module string) string { k, err := sdkdelivery.WantKey(node, module) if err != nil { @@ -27,6 +28,13 @@ func TestAMachineIsCurrentWhenItHasWhatIsWantedOfIt(t *testing.T) { } return k } + hkey := func(node, module string) string { + k, err := sdkdelivery.HaveKey(node, module) + if err != nil { + t.Fatal(err) + } + return k + } for _, c := range []struct { what string wants map[string]sdkdelivery.Want @@ -35,38 +43,38 @@ func TestAMachineIsCurrentWhenItHasWhatIsWantedOfIt(t *testing.T) { }{ {"everything had as wanted", map[string]sdkdelivery.Want{key("anchor", "web"): want(fp("a"), "d1")}, - map[string]sdkdelivery.Have{key("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, + map[string]sdkdelivery.Have{hkey("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, map[string]bool{"anchor": true}}, {"a module not had yet", map[string]sdkdelivery.Want{key("anchor", "web"): want(fp("a"), "d1")}, nil, map[string]bool{"anchor": false}}, {"an older fingerprint", map[string]sdkdelivery.Want{key("anchor", "web"): want(fp("b"), "d1")}, - map[string]sdkdelivery.Have{key("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, + map[string]sdkdelivery.Have{hkey("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, map[string]bool{"anchor": false}}, {"the same fingerprint, an older composition", map[string]sdkdelivery.Want{key("anchor", "web"): want(fp("a"), "d2")}, - map[string]sdkdelivery.Have{key("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, + map[string]sdkdelivery.Have{hkey("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, map[string]bool{"anchor": false}}, {"still applying", map[string]sdkdelivery.Want{key("anchor", "web"): want(fp("a"), "d1")}, - map[string]sdkdelivery.Have{key("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseApplying)}, + map[string]sdkdelivery.Have{hkey("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseApplying)}, map[string]bool{"anchor": false}}, {"held for a backup that failed", map[string]sdkdelivery.Want{key("anchor", "web"): want(fp("a"), "d1")}, - map[string]sdkdelivery.Have{key("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseHeld)}, + map[string]sdkdelivery.Have{hkey("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseHeld)}, map[string]bool{"anchor": false}}, {"a module wanted removed that is gone", map[string]sdkdelivery.Want{key("anchor", "web"): {V: 1, Removed: true}}, - map[string]sdkdelivery.Have{key("anchor", "web"): have("", "", sdkdelivery.PhaseRemoved)}, + map[string]sdkdelivery.Have{hkey("anchor", "web"): have("", "", sdkdelivery.PhaseRemoved)}, map[string]bool{"anchor": true}}, {"a module wanted removed that still runs", map[string]sdkdelivery.Want{key("anchor", "web"): {V: 1, Removed: true}}, - map[string]sdkdelivery.Have{key("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, + map[string]sdkdelivery.Have{hkey("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, map[string]bool{"anchor": false}}, {"one machine behind does not hold another back", map[string]sdkdelivery.Want{key("anchor", "web"): want(fp("a"), "d1"), key("laptop", "web"): want(fp("a"), "d1")}, - map[string]sdkdelivery.Have{key("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, + map[string]sdkdelivery.Have{hkey("anchor", "web"): have(fp("a"), "d1", sdkdelivery.PhaseRunning)}, map[string]bool{"anchor": true, "laptop": false}}, } { got := currentNodes(c.wants, c.haves)