Found by asking what merging this would do to the mesh that is actually running — the only place the question could have been asked, because the tests were green and both buses were self-consistent. Moving the build outcome to the role means a catalogue built from the current manifests listens for the role's name. The catalogue *already running* listens for the module's, because that is what it was told when it was installed. The two do not meet, so merging as it stood would have stopped the live mesh's module graph being updated — silently, since a binding that matches nothing is not an error. A rename on a live bus needs the publisher and the subscriber to change together, and a deployment cannot promise which arrives first. So the old bus announces under both names and the order stops mattering. The module's own name retires with the bus, in step 5's list; nothing has ever run on the bus being built, so there is no legacy name there and this doubling has no counterpart.
37 lines
1.7 KiB
Go
37 lines
1.7 KiB
Go
package link
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// **The old bus announces a build under both names, and that is not belt-and-braces.**
|
|
//
|
|
// A build's outcome belongs to the role now, so a catalogue built from the current manifests listens
|
|
// for the role's name — and a catalogue already running listens for the module's, because that is what
|
|
// it was told when it was installed. A rename on a live bus needs publisher and subscriber to change
|
|
// together, which a deployment cannot promise: one arrives first, and in that window the module graph
|
|
// silently stops being updated.
|
|
//
|
|
// Caught by asking what merging this would do to the mesh that is actually running, which is the only
|
|
// place the question could have been asked — the tests were green and both buses were self-consistent.
|
|
func TestTheOldBusAnnouncesABuildUnderBothNames(t *testing.T) {
|
|
// The routing key a catalogue installed before the change is bound to.
|
|
if KeyModuleBuilt != "module.builder.built" {
|
|
t.Fatalf("the module's own name is %q; a catalogue already running is bound to the old one",
|
|
KeyModuleBuilt)
|
|
}
|
|
// And the local name a catalogue built from the current manifests declares, which the old bus's
|
|
// client turns into `module.<role>.built`.
|
|
if KeyRoleBuilt != "built" {
|
|
t.Fatalf("the role's event is %q, and a holder emits its verbs bare", KeyRoleBuilt)
|
|
}
|
|
if TheBuildMachine != "mesh-build-machine" {
|
|
t.Fatalf("the role is %q", TheBuildMachine)
|
|
}
|
|
// The two must differ, or one publish would serve both and this doubling would be pointless.
|
|
if strings.HasSuffix(KeyModuleBuilt, "."+TheBuildMachine+"."+KeyRoleBuilt) {
|
|
t.Fatal("the two names are the same, so nothing was renamed and this is dead weight")
|
|
}
|
|
}
|