The cross-node bed is green: push the provider node after adding the remote consumer

A provision secret is minted as a side-effect of composing the CONSUMER's plan, and the
provider's grant list is a pure read of secrets already issued from it. So a cross-node
consumer's grant exists only after its node is pushed, and the provider's provisioner mints
the vhost only when the provider node is composed again. Push anchor once more after node2,
and the bed passes: amqp-ping on node2 reaches mesh-broker on anchor over the overlay, its
binding names anchor.internal, and its vhost is minted. Proves both halves of issue 055.

https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
This commit is contained in:
2026-09-17 01:34:22 +02:00
parent 155800bc9a
commit b6bf31d4e6
@@ -155,6 +155,12 @@ test("a consumer on a joined node opens the adopted broker on the control-node o
await install("amqp-ping", NODE); await install("amqp-ping", NODE);
await mesh(`push ${NODE}`, 900_000); await mesh(`push ${NODE}`, 900_000);
// The consumer minted its grant against anchor's broker only when node2 was composed
// (a provision secret is a side-effect of composing the CONSUMER). anchor's provisioner
// learns of a cross-node consumer only when anchor is composed again, so push it once more to
// mint the vhost. Adding a cross-node consumer means pushing the provider node too (issue 055).
await mesh(`push anchor`, 600_000);
// amqp-ping's container comes up and stays up (a broker it could not reach would crash-loop it). // amqp-ping's container comes up and stays up (a broker it could not reach would crash-loop it).
const psName = async () => (await on(NODE, `docker ps -a --format '{{.Names}}\t{{.Status}}'`)).out; const psName = async () => (await on(NODE, `docker ps -a --format '{{.Names}}\t{{.Status}}'`)).out;
const deadline = Date.now() + 600_000; const deadline = Date.now() + 600_000;