Remove LeafMap - have a generic function which converts a Topology to a RenderableNodes.

This commit is contained in:
Tom Wilkie
2015-09-01 12:38:51 +00:00
parent fa05e9bb9e
commit 21675f3000
12 changed files with 413 additions and 463 deletions

View File

@@ -13,67 +13,42 @@ type RenderableNode struct {
LabelMinor string `json:"label_minor,omitempty"` // e.g. "hostname", human-readable, optional
Rank string `json:"rank"` // to help the layout engine
Pseudo bool `json:"pseudo,omitempty"` // sort-of a placeholder node, for rendering purposes
Adjacency report.IDList `json:"adjacency,omitempty"` // Node IDs (in the same topology domain)
Origins report.IDList `json:"origins,omitempty"` // Core node IDs that contributed information
report.EdgeMetadata `json:"metadata"` // Numeric sums
report.NodeMetadata `json:"-"` // merged NodeMetadata of the nodes used to build this
}
// RenderableNodes is a set of RenderableNodes
type RenderableNodes map[string]RenderableNode
// Merge merges two sets of RenderableNodes
func (rns RenderableNodes) Merge(other RenderableNodes) {
for key, value := range other {
if existing, ok := rns[key]; ok {
existing.Merge(value)
rns[key] = existing
} else {
rns[key] = value
}
}
}
// Merge merges in another RenderableNode
func (rn *RenderableNode) Merge(other RenderableNode) {
if rn.LabelMajor == "" {
rn.LabelMajor = other.LabelMajor
}
if rn.LabelMinor == "" {
rn.LabelMinor = other.LabelMinor
}
if rn.Rank == "" {
rn.Rank = other.Rank
}
if rn.Pseudo != other.Pseudo {
panic(rn.ID)
}
rn.Adjacency = rn.Adjacency.Merge(other.Adjacency)
rn.Origins = rn.Origins.Merge(other.Origins)
rn.EdgeMetadata = rn.EdgeMetadata.Merge(other.EdgeMetadata)
rn.NodeMetadata = rn.NodeMetadata.Merge(other.NodeMetadata)
report.NodeMetadata
}
// NewRenderableNode makes a new RenderableNode
func NewRenderableNode(id, major, minor, rank string, nmd report.NodeMetadata) RenderableNode {
func NewRenderableNode(id string) RenderableNode {
return RenderableNode{
ID: id,
LabelMajor: "",
LabelMinor: "",
Rank: "",
Pseudo: false,
Origins: report.MakeIDList(),
EdgeMetadata: report.EdgeMetadata{},
NodeMetadata: report.MakeNodeMetadata(),
}
}
// NewRenderableNodeWith makes a new RenderableNode with some fields filled in
func NewRenderableNodeWith(id, major, minor, rank string, rn RenderableNode) RenderableNode {
return RenderableNode{
ID: id,
LabelMajor: major,
LabelMinor: minor,
Rank: rank,
Pseudo: false,
EdgeMetadata: report.EdgeMetadata{},
NodeMetadata: nmd.Copy(),
Origins: rn.Origins.Copy(),
EdgeMetadata: rn.EdgeMetadata.Copy(),
NodeMetadata: rn.NodeMetadata.Copy(),
}
}
func newDerivedNode(id string, node RenderableNode) RenderableNode {
// NewDerivedNode create a renderable node based on node, but with a new ID
func NewDerivedNode(id string, node RenderableNode) RenderableNode {
return RenderableNode{
ID: id,
LabelMajor: "",
@@ -82,19 +57,7 @@ func newDerivedNode(id string, node RenderableNode) RenderableNode {
Pseudo: node.Pseudo,
Origins: node.Origins.Copy(),
EdgeMetadata: node.EdgeMetadata.Copy(),
NodeMetadata: report.MakeNodeMetadata(),
}
}
func newPseudoNode(id, major, minor string) RenderableNode {
return RenderableNode{
ID: id,
LabelMajor: major,
LabelMinor: minor,
Rank: "",
Pseudo: true,
EdgeMetadata: report.EdgeMetadata{},
NodeMetadata: report.MakeNodeMetadata(),
NodeMetadata: node.NodeMetadata.Copy(),
}
}
@@ -107,6 +70,73 @@ func newDerivedPseudoNode(id, major string, node RenderableNode) RenderableNode
Pseudo: true,
Origins: node.Origins.Copy(),
EdgeMetadata: node.EdgeMetadata.Copy(),
NodeMetadata: report.MakeNodeMetadata(),
NodeMetadata: node.NodeMetadata.Copy(),
}
}
// WithNode creates a new RenderableNode bases on rn, with n
func (rn RenderableNode) WithNode(n report.NodeMetadata) RenderableNode {
result := rn.Copy()
result.NodeMetadata = n
return result
}
// Merge merges rn with other and returns a new RenderableNode
func (rn RenderableNode) Merge(other RenderableNode) RenderableNode {
result := rn.Copy()
if result.LabelMajor == "" {
result.LabelMajor = other.LabelMajor
}
if result.LabelMinor == "" {
result.LabelMinor = other.LabelMinor
}
if result.Rank == "" {
result.Rank = other.Rank
}
if result.Pseudo != other.Pseudo {
panic(result.ID)
}
result.Origins = rn.Origins.Merge(other.Origins)
result.EdgeMetadata = rn.EdgeMetadata.Merge(other.EdgeMetadata)
result.NodeMetadata = rn.NodeMetadata.Merge(other.NodeMetadata)
return result
}
// Copy makes a deep copy of rn
func (rn RenderableNode) Copy() RenderableNode {
return RenderableNode{
ID: rn.ID,
LabelMajor: rn.LabelMajor,
LabelMinor: rn.LabelMinor,
Rank: rn.Rank,
Pseudo: rn.Pseudo,
Origins: rn.Origins.Copy(),
EdgeMetadata: rn.EdgeMetadata.Copy(),
NodeMetadata: rn.NodeMetadata.Copy(),
}
}
// RenderableNodes is a set of RenderableNodes
type RenderableNodes map[string]RenderableNode
// Merge merges two sets of RenderableNodes, returning a new set.
func (rns RenderableNodes) Merge(other RenderableNodes) RenderableNodes {
result := RenderableNodes{}
for key, value := range rns {
result[key] = value
}
for key, value := range other {
existing, ok := result[key]
if ok {
value = value.Merge(existing)
}
result[key] = value
}
return result
}