From c7f94d8a7487813dca15b2208967ee0b4457723e Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 13 Jul 2017 16:28:02 +0100 Subject: [PATCH 1/4] join with original renderer in ConnectionJoin This guarantees that the output won't contain bare nodes containing just an id and topology, as produced by ipToNode. Previously this was ensured by calling convention, now it's ensured by construction. --- render/container.go | 18 ++++++++---------- render/pod.go | 3 +-- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/render/container.go b/render/container.go index 679158225..b7e5c367a 100644 --- a/render/container.go +++ b/render/container.go @@ -36,12 +36,7 @@ var ContainerRenderer = MakeFilter( MapProcess2Container, ColorConnectedProcessRenderer, ), - - // This mapper brings in connections by joining with container - // IPs. ConnectionJoin(MapContainer2IP, SelectContainer), - - SelectContainer, ), ) @@ -68,12 +63,15 @@ func ConnectionJoin(toIPs func(report.Node) []string, r Renderer) Renderer { return result } - return MakeMap( - ipToNode, - MakeReduce( - MakeMap(nodeToIP, r), - mapEndpoint2IP, + return MakeReduce( + MakeMap( + ipToNode, + MakeReduce( + MakeMap(nodeToIP, r), + mapEndpoint2IP, + ), ), + r, ) } diff --git a/render/pod.go b/render/pod.go index 127aaaf98..726a8e5ee 100644 --- a/render/pod.go +++ b/render/pod.go @@ -48,8 +48,7 @@ var PodRenderer = ConditionalRenderer(renderKubernetesTopologies, ), ), ), - selectPodsWithDeployments{}, - ConnectionJoin(MapPod2IP, SelectPod), + ConnectionJoin(MapPod2IP, selectPodsWithDeployments{}), ), ), ) From 4a77e9bfac460bb36a524c1f079795475e44fe6a Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 13 Jul 2017 16:35:52 +0100 Subject: [PATCH 2/4] don't bother tracking the orignal node topology We always join with the original renderer and hence all the nodes produced by ipToNode will get their other data, including topology, via that route. --- render/container.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/render/container.go b/render/container.go index b7e5c367a..d621ed3e0 100644 --- a/render/container.go +++ b/render/container.go @@ -43,7 +43,6 @@ var ContainerRenderer = MakeFilter( var mapEndpoint2IP = MakeMap(endpoint2IP, SelectEndpoint) const originalNodeID = "original_node_id" -const originalNodeTopology = "original_node_topology" // ConnectionJoin joins the given renderer with connections from the // endpoints topology, using the toIPs function to extract IPs from @@ -55,8 +54,7 @@ func ConnectionJoin(toIPs func(report.Node) []string, r Renderer) Renderer { result[ip] = NewDerivedNode(ip, n). WithTopology(IP). WithLatests(map[string]string{ - originalNodeID: n.ID, - originalNodeTopology: n.Topology, + originalNodeID: n.ID, }). WithCounters(map[string]int{IP: 1}) } @@ -94,15 +92,8 @@ func ipToNode(n report.Node, _ report.Networks) report.Nodes { if !ok { return report.Nodes{} } - topology, ok := n.Latest.Lookup(originalNodeTopology) - if !ok { - return report.Nodes{} - } - return report.Nodes{ - id: NewDerivedNode(id, n). - WithTopology(topology), - } + return report.Nodes{id: NewDerivedNode(id, n)} } // endpoint2IP maps endpoint nodes to their IP address, for joining From bd9fafff4206d43ba4180ef7cfe961e378c2804d Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 13 Jul 2017 17:00:14 +0100 Subject: [PATCH 3/4] don't create *derived* nodes in nodeToIP IP nodes are children of the "proper" topology nodes, not the other way round. The former relationship is established in ipToNode. --- render/container.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/render/container.go b/render/container.go index d621ed3e0..2630b62c3 100644 --- a/render/container.go +++ b/render/container.go @@ -51,7 +51,7 @@ func ConnectionJoin(toIPs func(report.Node) []string, r Renderer) Renderer { nodeToIP := func(n report.Node, _ report.Networks) report.Nodes { result := report.Nodes{} for _, ip := range toIPs(n) { - result[ip] = NewDerivedNode(ip, n). + result[ip] = report.MakeNode(ip). WithTopology(IP). WithLatests(map[string]string{ originalNodeID: n.ID, From ac9f7dfad15592ce2ed55a1f1c4a20c10b1bc12e Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 13 Jul 2017 17:10:43 +0100 Subject: [PATCH 4/4] simplify node propagation in ipToNode --- render/container.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/render/container.go b/render/container.go index 2630b62c3..83eec193c 100644 --- a/render/container.go +++ b/render/container.go @@ -2,7 +2,6 @@ package render import ( "regexp" - "strings" "github.com/weaveworks/scope/probe/docker" "github.com/weaveworks/scope/report" @@ -74,17 +73,15 @@ func ConnectionJoin(toIPs func(report.Node) []string, r Renderer) Renderer { } func ipToNode(n report.Node, _ report.Networks) report.Nodes { + // propagate non-IP nodes + if n.Topology != IP { + return report.Nodes{n.ID: n} + } // If an IP is shared between multiple nodes, we can't reliably // attribute an connection based on its IP if count, _ := n.Counters.Lookup(IP); count > 1 { return report.Nodes{} } - - // Propagate the internet and service pseudo nodes - if strings.HasSuffix(n.ID, TheInternetID) || strings.HasPrefix(n.ID, ServiceNodeIDPrefix) { - return report.Nodes{n.ID: n} - } - // If this node is not of the original type, exclude it. This // excludes all the nodes we've dragged in from endpoint that we // failed to join to a node.