MapFunc is now Node->Node

Save time creating a map for the results which contains at most one entry
This commit is contained in:
Bryan Boreham
2018-04-09 11:53:20 +00:00
parent ced27b298c
commit e3539a8d92
5 changed files with 32 additions and 33 deletions

View File

@@ -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)
}

View File

@@ -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)

View File

@@ -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)
}

View File

@@ -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"),

View File

@@ -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
}