From 7508df7e5bdc4a600ebc0508a19260a142950e4a Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Wed, 19 Aug 2015 14:24:21 +0000 Subject: [PATCH] Add NodeMetadata.Counters with appropriate merge semantics --- app/api_topology_test.go | 3 +++ render/mapping.go | 22 ++++++---------------- report/merge.go | 3 +++ report/topology.go | 5 +++++ 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app/api_topology_test.go b/app/api_topology_test.go index 0cc249faf..5f74babad 100644 --- a/app/api_topology_test.go +++ b/app/api_topology_test.go @@ -22,6 +22,9 @@ func fixNodeMetadatas(nodes render.RenderableNodes) render.RenderableNodes { if node.NodeMetadata.Metadata == nil { node.NodeMetadata.Metadata = map[string]string{} } + if node.NodeMetadata.Counters == nil { + node.NodeMetadata.Counters = map[string]int{} + } result[id] = node } return result diff --git a/render/mapping.go b/render/mapping.go index faec5173e..7c76fedaa 100644 --- a/render/mapping.go +++ b/render/mapping.go @@ -20,8 +20,8 @@ const ( TheInternetID = "theinternet" TheInternetMajor = "The Internet" - containersPrefix = "container-" - processesPrefix = "process-" + containersKey = "containers" + processesKey = "processes" ) // LeafMapFunc is anything which can take an arbitrary NodeMetadata, which is @@ -252,20 +252,10 @@ func MapProcess2Name(n RenderableNode) (RenderableNode, bool) { node := newDerivedNode(name, n) node.LabelMajor = name node.Rank = name - node.NodeMetadata.Metadata[processesPrefix+n.ID] = "" + node.NodeMetadata.Counters[processesKey] = 1 return node, true } -func countPrefix(prefix string, n RenderableNode) int { - count := 0 - for key := range n.NodeMetadata.Metadata { - if strings.HasPrefix(key, prefix) { - count++ - } - } - return count -} - // MapCountProcessName maps 1:1 process name nodes, counting // the number of processes grouped together and putting // that info in the minor label. @@ -274,7 +264,7 @@ func MapCountProcessName(n RenderableNode) (RenderableNode, bool) { return n, true } - processes := countPrefix(processesPrefix, n) + processes := n.NodeMetadata.Counters[processesKey] if processes == 1 { n.LabelMinor = "1 process" } else { @@ -309,7 +299,7 @@ func MapContainer2ContainerImage(n RenderableNode) (RenderableNode, bool) { // Add container- key to NMD, which will later be counted to produce the minor label result := newDerivedNode(id, n) - result.NodeMetadata.Metadata[containersPrefix+n.ID] = "" + result.NodeMetadata.Counters[containersKey] = 1 return result, true } @@ -349,7 +339,7 @@ func MapCountContainers(n RenderableNode) (RenderableNode, bool) { return n, true } - containers := countPrefix(containersPrefix, n) + containers := n.NodeMetadata.Counters[containersKey] if containers == 1 { n.LabelMinor = "1 container" } else { diff --git a/report/merge.go b/report/merge.go index 406abe6ce..223ffa433 100644 --- a/report/merge.go +++ b/report/merge.go @@ -48,6 +48,9 @@ func (nm NodeMetadata) Merge(other NodeMetadata) NodeMetadata { for k, v := range other.Metadata { nm.Metadata[k] = v // other takes precedence } + for k, v := range other.Counters { + nm.Counters[k] = nm.Counters[k] + v + } return nm } diff --git a/report/topology.go b/report/topology.go index 2ca9b3e0a..8ad4b1393 100644 --- a/report/topology.go +++ b/report/topology.go @@ -42,6 +42,7 @@ type EdgeMetadata struct { // about a given node in a given topology. type NodeMetadata struct { Metadata map[string]string + Counters map[string]int } // MakeNodeMetadata creates a new NodeMetadata with no initial metadata. @@ -53,6 +54,7 @@ func MakeNodeMetadata() NodeMetadata { func MakeNodeMetadataWith(m map[string]string) NodeMetadata { return NodeMetadata{ Metadata: m, + Counters: map[string]int{}, } } @@ -62,6 +64,9 @@ func (nm NodeMetadata) Copy() NodeMetadata { for k, v := range nm.Metadata { cp.Metadata[k] = v } + for k, v := range nm.Counters { + cp.Counters[k] = v + } return cp }