diff --git a/render/container.go b/render/container.go index 82f054f28..53162c2ef 100644 --- a/render/container.go +++ b/render/container.go @@ -255,10 +255,10 @@ func MapContainer2IP(m report.Node) []string { // format for a container, but without any Major or Minor labels. // It does not have enough info to do that, and the resulting graph // must be merged with a container graph to get that info. -func MapProcess2Container(n report.Node) report.Nodes { +func MapProcess2Container(n report.Node) report.Node { // Propagate pseudo nodes if n.Topology == Pseudo { - return report.Nodes{n.ID: n} + return n } // Otherwise, if the process is not in a container, group it into @@ -275,7 +275,7 @@ func MapProcess2Container(n report.Node) report.Nodes { id = MakePseudoNodeID(UncontainedID, hostID) node = NewDerivedPseudoNode(id, n) } - return report.Nodes{id: node} + return node } // MapContainer2ContainerImage maps container Nodes to container @@ -290,17 +290,17 @@ func MapProcess2Container(n report.Node) report.Nodes { // format for a container image, but without any Major or Minor // labels. It does not have enough info to do that, and the resulting // graph must be merged with a container image graph to get that info. -func MapContainer2ContainerImage(n report.Node) report.Nodes { +func MapContainer2ContainerImage(n report.Node) report.Node { // Propagate all pseudo nodes if n.Topology == Pseudo { - return report.Nodes{n.ID: n} + return n } // Otherwise, if some some reason the container doesn't have a image_id // (maybe slightly out of sync reports), just drop it imageID, ok := n.Latest.Lookup(docker.ImageID) if !ok { - return report.Nodes{} + return report.Node{} } // Add container id key to the counters, which will later be @@ -308,50 +308,50 @@ func MapContainer2ContainerImage(n report.Node) report.Nodes { id := report.MakeContainerImageNodeID(imageID) result := NewDerivedNode(id, n).WithTopology(report.ContainerImage) result.Counters = result.Counters.Add(n.Topology, 1) - return report.Nodes{id: result} + return result } // MapContainerImage2Name ignores image versions -func MapContainerImage2Name(n report.Node) report.Nodes { +func MapContainerImage2Name(n report.Node) report.Node { // Propagate all pseudo nodes if n.Topology == Pseudo { - return report.Nodes{n.ID: n} + return n } imageName, ok := n.Latest.Lookup(docker.ImageName) if !ok { - return report.Nodes{} + return report.Node{} } imageNameWithoutVersion := docker.ImageNameWithoutVersion(imageName) n.ID = report.MakeContainerImageNodeID(imageNameWithoutVersion) - return report.Nodes{n.ID: n} + return n } var containerHostnameTopology = MakeGroupNodeTopology(report.Container, docker.ContainerHostname) // MapContainer2Hostname maps container Nodes to 'hostname' renderabled nodes.. -func MapContainer2Hostname(n report.Node) report.Nodes { +func MapContainer2Hostname(n report.Node) report.Node { // Propagate all pseudo nodes if n.Topology == Pseudo { - return report.Nodes{n.ID: n} + return n } // Otherwise, if some some reason the container doesn't have a hostname // (maybe slightly out of sync reports), just drop it id, ok := n.Latest.Lookup(docker.ContainerHostname) if !ok { - return report.Nodes{} + return report.Node{} } node := NewDerivedNode(id, n).WithTopology(containerHostnameTopology) node.Counters = node.Counters.Add(n.Topology, 1) - return report.Nodes{id: node} + return node } // MapToEmpty removes all the attributes, children, etc, of a node. Useful when // we just want to count the presence of nodes. -func MapToEmpty(n report.Node) report.Nodes { - return report.Nodes{n.ID: report.MakeNode(n.ID).WithTopology(n.Topology)} +func MapToEmpty(n report.Node) report.Node { + return report.MakeNode(n.ID).WithTopology(n.Topology) } diff --git a/render/container_test.go b/render/container_test.go index f1ce74a1d..f9565b997 100644 --- a/render/container_test.go +++ b/render/container_test.go @@ -43,7 +43,7 @@ type testcase struct { } func testMap(t *testing.T, f render.MapFunc, input testcase) { - if have := f(input.n); input.ok != (len(have) > 0) { + if have := f(input.n); input.ok != (have.ID != "") { name := input.name if name == "" { name = fmt.Sprintf("%v", input.n) diff --git a/render/render.go b/render/render.go index ff4e57924..9e944ad8e 100644 --- a/render/render.go +++ b/render/render.go @@ -5,10 +5,10 @@ import ( ) // MapFunc is anything which can take an arbitrary Node and -// return a set of other Nodes. +// return another Node. // -// If the output is empty, the node shall be omitted from the rendered topology. -type MapFunc func(report.Node) report.Nodes +// If the output ID is blank, the node shall be omitted from the rendered topology. +type MapFunc func(report.Node) report.Node // Renderer is something that can render a report to a set of Nodes. type Renderer interface { @@ -107,7 +107,8 @@ func (m Map) Render(rpt report.Report) Nodes { // Rewrite all the nodes according to the map function for _, inRenderable := range input.Nodes { - for _, outRenderable := range m.MapFunc(inRenderable) { + outRenderable := m.MapFunc(inRenderable) + if outRenderable.ID != "" { if existing, ok := output[outRenderable.ID]; ok { outRenderable = outRenderable.Merge(existing) } diff --git a/render/render_test.go b/render/render_test.go index f2c9a86fc..faf24e419 100644 --- a/render/render_test.go +++ b/render/render_test.go @@ -36,8 +36,8 @@ func TestReduceRender(t *testing.T) { func TestMapRender1(t *testing.T) { // 1. Check when we return false, the node gets filtered out mapper := render.Map{ - MapFunc: func(nodes report.Node) report.Nodes { - return report.Nodes{} + MapFunc: func(nodes report.Node) report.Node { + return report.Node{} }, Renderer: mockRenderer{Nodes: report.Nodes{ "foo": report.MakeNode("foo"), @@ -53,10 +53,8 @@ func TestMapRender1(t *testing.T) { func TestMapRender2(t *testing.T) { // 2. Check we can remap two nodes into one mapper := render.Map{ - MapFunc: func(nodes report.Node) report.Nodes { - return report.Nodes{ - "bar": report.MakeNode("bar"), - } + MapFunc: func(nodes report.Node) report.Node { + return report.MakeNode("bar") }, Renderer: mockRenderer{Nodes: report.Nodes{ "foo": report.MakeNode("foo"), @@ -75,9 +73,9 @@ func TestMapRender2(t *testing.T) { func TestMapRender3(t *testing.T) { // 3. Check we can remap adjacencies mapper := render.Map{ - MapFunc: func(nodes report.Node) report.Nodes { + MapFunc: func(nodes report.Node) report.Node { id := "_" + nodes.ID - return report.Nodes{id: report.MakeNode(id)} + return report.MakeNode(id) }, Renderer: mockRenderer{Nodes: report.Nodes{ "foo": report.MakeNode("foo").WithAdjacent("baz"), diff --git a/render/weave.go b/render/weave.go index 34551e217..a26b4df67 100644 --- a/render/weave.go +++ b/render/weave.go @@ -14,10 +14,10 @@ var WeaveRenderer = MakeMap( ) // MapWeaveIdentity maps an overlay topology node to a weave topology node. -func MapWeaveIdentity(m report.Node) report.Nodes { +func MapWeaveIdentity(m report.Node) report.Node { peerPrefix, _ := report.ParseOverlayNodeID(m.ID) if peerPrefix != report.WeaveOverlayPeerPrefix { - return nil + return report.Node{} } var ( @@ -33,5 +33,5 @@ func MapWeaveIdentity(m report.Node) report.Nodes { node = NewDerivedPseudoNode(id, m) } - return report.Nodes{node.ID: node} + return node }