Files
weave-scope/render/host.go
Bryan Boreham dc14bd04df Exit joinResults.result() if context cancelled
These can be long-running operations, and if the client retries we get
the cancelled one running in parallel with the retry, slowing both down
and making it likely the next one will time out too.
2021-04-22 10:53:06 +00:00

61 lines
1.8 KiB
Go

package render
import (
"context"
"github.com/weaveworks/scope/report"
)
// HostRenderer is a Renderer which produces a renderable host
// graph from the host topology.
//
// not memoised
var HostRenderer = MakeReduce(
CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ProcessRenderer},
CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ContainerRenderer},
CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ContainerImageRenderer},
CustomRenderer{RenderFunc: nodes2Hosts, Renderer: PodRenderer},
MapEndpoints(endpoint2Host, report.Host),
)
// nodes2Hosts maps any Nodes to host Nodes.
//
// If this function is given a node without a hostname
// (including other pseudo nodes), it will drop the node.
//
// Otherwise, this function will produce nodes with the correct ID
// format for a host, 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 host graph to get that info.
func nodes2Hosts(ctx context.Context, nodes Nodes) Nodes {
ret := newJoinResults(nil)
for _, n := range nodes.Nodes {
if n.Topology == Pseudo {
continue // Don't propagate pseudo nodes - we do this in endpoints2Hosts
}
isImage := n.Topology == report.ContainerImage
hostIDs, _ := n.Parents.Lookup(report.Host)
for _, id := range hostIDs {
if isImage {
// We need to treat image nodes specially because they
// aggregate adjacencies of containers across multiple
// hosts, and hence mapping these adjacencies to host
// adjacencies would produce edges that aren't present
// in reality.
ret.addUnmappedChild(n, id, report.Host)
} else {
ret.addChild(n, id, report.Host)
}
}
}
return ret.result(ctx, nodes)
}
func endpoint2Host(n report.Node) string {
if hostNodeID, ok := n.Latest.Lookup(report.HostNodeID); ok {
return hostNodeID
}
return ""
}