Files
weave-scope/render/selectors.go
2015-09-03 16:18:54 +00:00

90 lines
2.4 KiB
Go

package render
import (
"github.com/weaveworks/scope/report"
)
// TopologySelector selects a single topology from a report.
// NB it is also a Renderer!
type TopologySelector func(r report.Report) RenderableNodes
// Render implements Renderer
func (t TopologySelector) Render(r report.Report) RenderableNodes {
return t(r)
}
// EdgeMetadata implements Renderer
func (t TopologySelector) EdgeMetadata(rpt report.Report, srcID, dstID string) report.EdgeMetadata {
var (
nodes = t(rpt)
metadata = report.EdgeMetadata{}
)
for src, node := range nodes {
for dst, edgeMeta := range node.Edges {
if src == srcID && dst == dstID {
return edgeMeta
}
}
}
return metadata
}
// MakeRenderableNodes converts a topology to a set of RenderableNodes
func MakeRenderableNodes(t report.Topology) RenderableNodes {
result := RenderableNodes{}
for id, nmd := range t.Nodes {
rn := NewRenderableNode(id).WithNode(nmd)
rn.Origins = report.MakeIDList(id)
if hostNodeID, ok := nmd.Metadata[report.HostNodeID]; ok {
rn.Origins = rn.Origins.Add(hostNodeID)
}
result[id] = rn
}
// Push EdgeMetadata to both ends of the edges
for srcID, srcNode := range result {
for dstID, emd := range srcNode.Edges {
srcNode.EdgeMetadata = srcNode.EdgeMetadata.Flatten(emd)
dstNode := result[dstID]
dstNode.EdgeMetadata = dstNode.EdgeMetadata.Flatten(emd)
result[dstID] = dstNode
}
result[srcID] = srcNode
}
return result
}
var (
// SelectEndpoint selects the endpoint topology.
SelectEndpoint = TopologySelector(func(r report.Report) RenderableNodes {
return MakeRenderableNodes(r.Endpoint)
})
// SelectProcess selects the process topology.
SelectProcess = TopologySelector(func(r report.Report) RenderableNodes {
return MakeRenderableNodes(r.Process)
})
// SelectContainer selects the container topology.
SelectContainer = TopologySelector(func(r report.Report) RenderableNodes {
return MakeRenderableNodes(r.Container)
})
// SelectContainerImage selects the container image topology.
SelectContainerImage = TopologySelector(func(r report.Report) RenderableNodes {
return MakeRenderableNodes(r.ContainerImage)
})
// SelectAddress selects the address topology.
SelectAddress = TopologySelector(func(r report.Report) RenderableNodes {
return MakeRenderableNodes(r.Address)
})
// SelectHost selects the address topology.
SelectHost = TopologySelector(func(r report.Report) RenderableNodes {
return MakeRenderableNodes(r.Host)
})
)