diff --git a/cmd/mesh-controller/first_build_ask_integration_test.go b/cmd/mesh-controller/first_build_ask_integration_test.go index 7b6eb93c..b8ee5ce1 100644 --- a/cmd/mesh-controller/first_build_ask_integration_test.go +++ b/cmd/mesh-controller/first_build_ask_integration_test.go @@ -11,15 +11,18 @@ import ( "git.novox.be/novox/mesh-sdk/go/asks" "github.com/novox/mesh-controller/internal/broker" "github.com/novox/mesh-controller/internal/catalogue" + "github.com/novox/mesh-controller/internal/identity" "github.com/novox/mesh-controller/internal/link" ) // aForgeAndABuildSeat gives a test what a real ask of a build needs: the forge holding the git seat, assigned to anchor, so -// the clone URL composes; the build seat's queue on a real bus; and the environment of the serving controller, which is +// the clone URL composes; the identity store; the build seat's queue on a real bus; and the environment of the serving controller, which is // never the controller's terminal (a verb's, in effect: startedAtTheTerminal is false). func aForgeAndABuildSeat(t *testing.T, open *stores) *broker.JetStream { t.Helper() js, _ := aBuildQueue(t) + // The ask signs what it sends with the controller's identity, as the serving controller does. + identity.ForTest(t) forge, err := catalogue.ParseManifest([]byte(`{"module":"gitea","version":"1", "claims":[{"name":"git","scope":"mesh"}],"provides":[{"name":"git","scope":"mesh"}], "serves":{"git":{"scheme":"http","port":3000}}}`)) diff --git a/cmd/mesh-controller/not_asked_id_test.go b/cmd/mesh-controller/not_asked_id_test.go new file mode 100644 index 00000000..557589f4 --- /dev/null +++ b/cmd/mesh-controller/not_asked_id_test.go @@ -0,0 +1,24 @@ +package main + +import ( + "testing" + + "github.com/novox/mesh-controller/internal/chain" +) + +// 1146: a merge's ask that failed is kept under an id the bus takes as a key, for a module at the repository's root +// (".") as for one in a folder. +func TestTheIdOfABuildNotAskedIsAKeyTheBusTakes(t *testing.T) { + for dir, want := range map[string]string{ + ".": "not-asked-0177ea7a", + "modules/mesh-delivery-view": "not-asked-0177ea7a-modules-mesh-delivery-view", + } { + id := notAskedID("0177ea7a00000000", dir) + if id != want { + t.Errorf("notAskedID(%q) = %q, want %q", dir, id, want) + } + if !chain.ValidKey("req." + id) { + t.Errorf("notAskedID(%q) = %q: the bus takes no key req.%s", dir, id, id) + } + } +} diff --git a/cmd/mesh-controller/upgrades.go b/cmd/mesh-controller/upgrades.go index 95be4d23..fc8cf122 100644 --- a/cmd/mesh-controller/upgrades.go +++ b/cmd/mesh-controller/upgrades.go @@ -424,7 +424,7 @@ func askBuilds(ctx context.Context, inv *inventory.Inventory, m link.SourceMoved request := inventory.BuildRequest{ID: id, Repository: source.Repository, Seat: source.Seat, Path: path, Ref: m.Base, Commit: m.Commit, For: "merge"} if err != nil { - request.ID = fmt.Sprintf("not-asked-%s-%s", short(m.Commit), strings.ReplaceAll(dir, "/", "-")) + request.ID = notAskedID(m.Commit, dir) request.NotAsked = err.Error() recordBuildRequest(ctx, inv, request) fmt.Printf(" %s is a new module in %s/%s and could not be built: %v — a hand `build` of it "+ @@ -439,6 +439,15 @@ func askBuilds(ctx context.Context, inv *inventory.Inventory, m link.SourceMoved return asked } +// notAskedID is the id a merge's build that could not be asked is kept under: a key the bus takes, so a module at the +// repository's root (".") is kept as one in a folder is. +func notAskedID(commit, dir string) string { + if dir == "." || dir == "" { + return "not-asked-" + short(commit) + } + return fmt.Sprintf("not-asked-%s-%s", short(commit), strings.ReplaceAll(strings.Trim(dir, "/"), "/", "-")) +} + // actingOnMerges keeps one merge acted on at a time (novox/hq issue 266). var actingOnMerges sync.Mutex