mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 10:11:03 +00:00
90 lines
2.4 KiB
Go
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)
|
|
})
|
|
)
|