A carried peer is nameable, and the mesh answers for it (hq 112)
The tunnel the hub took over routes to machines the predecessor knows by name and the mesh knew only by address — taking the resolver in that state silences three machines at once. Now the operator states which machine a carried address is (overlay name <address> <name>), the statement rides tunnel_peer.named, and namesInTheMesh answers for named not-yet-enrolled peers — one reading, so the hosts fact, a container's hosts and the resolver cannot disagree. Enrolment verifies the word: a machine enrolling under a named peer's key with a different name is refused where the operator can read it, the stated name keeps the carried address, and an enrolled peer's name is the node's — naming it again refuses. The issue's rule holds: a name the predecessor answers for keeps resolving until the machine behind it is a node.
This commit is contained in:
@@ -69,6 +69,17 @@ func (i *Inventory) AssignAddress(ctx context.Context, node, cidr string) (strin
|
||||
if key != nil && p.PublicKey == *key {
|
||||
// The tunnel already routes to this key: the node keeps that address, and the peer
|
||||
// notices nothing when its machine enrols.
|
||||
//
|
||||
// **Unless the operator named it something else** (novox/hq issue 112). The name is
|
||||
// what the mesh has been answering for this address in the meantime; a machine
|
||||
// enrolling under a different one would silently split the two — the name resolving
|
||||
// here, the node known as that — so it is refused where the operator can read it.
|
||||
if p.Named != "" && p.Named != name {
|
||||
return "", fmt.Errorf(
|
||||
"the carried peer at %s was named %q, and %q is enrolling under its key — "+
|
||||
"enrol it as %q, or rename the peer first (`overlay name`)",
|
||||
p.Address, p.Named, name, p.Named)
|
||||
}
|
||||
return i.place(ctx, node, p.Address)
|
||||
}
|
||||
taken[p.Address] = true
|
||||
|
||||
Reference in New Issue
Block a user