mesh/delivery closed: a newer head of the same pull request
mesh/check failed: ace: novox/mesh-catalog#505: checks/placement/go.mod names mesh-sdk 91413de33516, which is neither on mesh-sdk's trunk nor the grou…
67 lines
2.4 KiB
Go
67 lines
2.4 KiB
Go
package link
|
|
|
|
import (
|
|
"encoding/json"
|
|
"sort"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/catalogue"
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
// The node's record (novox/hq ADR 0555 §3, issue 1126): what the machine observes of itself, written in its own have key
|
|
// `<node>.node` (delivery.HaveNode.Record) with its facts, so every node and the parts that compose read it from the bus
|
|
// and hear its change as the key's. Each value is the one the controller took from this node's enrolment and reports
|
|
// until now (its profile's present capabilities and networks, its outward links, its health statement's contract, and
|
|
// the public halves of the keys it enrolled with), read here from the same sources, never from the controller.
|
|
|
|
// RecordKeys are the public halves the node holds and the certificate the mesh issued for its internal name, as read
|
|
// from its state directory at the time of a pass: the certificate arrives after enrolment, a rekey changes the tunnel key.
|
|
type RecordKeys struct {
|
|
TunnelKey string
|
|
SealingKey string
|
|
ServingKey string
|
|
Certificate string
|
|
// Authority is the mesh's own certificate as this machine last applied it (public).
|
|
Authority string
|
|
}
|
|
|
|
// recordOf is the node's record from one facts report and its keys; nil for a report that carries no profile (one that
|
|
// says nothing of the machine, such as a rekey), so the record last written stands.
|
|
func recordOf(node string, r Report, keys RecordKeys) *delivery.NodeRecord {
|
|
if r.Profile == nil {
|
|
return nil
|
|
}
|
|
var p struct {
|
|
Capabilities []struct {
|
|
Name string `json:"name"`
|
|
Present bool `json:"present"`
|
|
} `json:"capabilities"`
|
|
Machine *struct {
|
|
Networks []catalogue.AttachedNetwork `json:"networks"`
|
|
} `json:"machine"`
|
|
}
|
|
raw, err := json.Marshal(r.Profile)
|
|
if err != nil || json.Unmarshal(raw, &p) != nil {
|
|
return nil
|
|
}
|
|
rec := &delivery.NodeRecord{V: delivery.Version, Node: node, TunnelKey: keys.TunnelKey, SealingKey: keys.SealingKey,
|
|
ServingKey: keys.ServingKey, Certificate: keys.Certificate, Authority: keys.Authority}
|
|
for _, c := range p.Capabilities {
|
|
if c.Present && c.Name != "" {
|
|
rec.Capabilities = append(rec.Capabilities, c.Name)
|
|
}
|
|
}
|
|
sort.Strings(rec.Capabilities)
|
|
if p.Machine != nil {
|
|
rec.NetworksSaid = true
|
|
rec.Networks = p.Machine.Networks
|
|
}
|
|
if len(r.Outward) > 0 {
|
|
rec.OutwardLinks = append([]string(nil), r.Outward...)
|
|
}
|
|
if r.Health != nil {
|
|
rec.Contract = r.Health.Contract
|
|
}
|
|
return rec
|
|
}
|