From 22402c34f7b047afd635b760171dcb658887f4ff Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Thu, 7 Apr 2016 12:01:23 +0100 Subject: [PATCH] Ensure k8s views are correctly hidden. - Filter unconnected psuedo nodes from the Pods view - Don't report these filtered nodes in stats - Fix typo in logic for hiding views --- client/app/scripts/utils/topology-utils.js | 2 +- render/filters.go | 24 ++++++++++++++++++---- render/topologies.go | 17 +++++++++------ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/client/app/scripts/utils/topology-utils.js b/client/app/scripts/utils/topology-utils.js index 5987af9bc..0d4036feb 100644 --- a/client/app/scripts/utils/topology-utils.js +++ b/client/app/scripts/utils/topology-utils.js @@ -55,6 +55,6 @@ export function setTopologyUrlsById(topologyUrlsById, topologies) { } export function filterHiddenTopologies(topologies) { - return topologies.filter(t => (!t.hidden_if_empty || t.stats.node_count > 0 || + return topologies.filter(t => (!t.hide_if_empty || t.stats.node_count > 0 || t.stats.filtered_nodes > 0)); } diff --git a/render/filters.go b/render/filters.go index 07745abe4..0d3077455 100644 --- a/render/filters.go +++ b/render/filters.go @@ -58,12 +58,26 @@ func ColorConnected(r Renderer) Renderer { // Filter removes nodes from a view based on a predicate. type Filter struct { Renderer - FilterFunc func(report.Node) bool + FilterFunc func(report.Node) bool + ReportFiltered bool // false means we don't report stats for how many are filtered } // MakeFilter makes a new Filter. func MakeFilter(f func(report.Node) bool, r Renderer) Renderer { - return Memoise(&Filter{r, f}) + return Memoise(&Filter{ + Renderer: r, + FilterFunc: f, + ReportFiltered: true, + }) +} + +// MakeSilentFilter makes a new Filter which does not report how many nodes it filters in Stats. +func MakeSilentFilter(f func(report.Node) bool, r Renderer) Renderer { + return Memoise(&Filter{ + Renderer: r, + FilterFunc: f, + ReportFiltered: false, + }) } // Render implements Renderer @@ -115,9 +129,11 @@ func (f *Filter) render(rpt report.Report) (report.Nodes, int) { // Stats implements Renderer func (f Filter) Stats(rpt report.Report) Stats { - _, filtered := f.render(rpt) var upstream = f.Renderer.Stats(rpt) - upstream.FilteredNodes += filtered + if f.ReportFiltered { + _, filtered := f.render(rpt) + upstream.FilteredNodes += filtered + } return upstream } diff --git a/render/topologies.go b/render/topologies.go index b7656bda4..103920852 100644 --- a/render/topologies.go +++ b/render/topologies.go @@ -69,11 +69,10 @@ var ProcessNameRenderer = MakeMap( // but we need to be careful to ensure we only include each edge once, by only // including the ProcessRenderer once. var ContainerRenderer = MakeReduce( - MakeFilter( + MakeSilentFilter( func(n report.Node) bool { - _, inContainer := n.Latest.Lookup(docker.ContainerID) _, isConnected := n.Latest.Lookup(IsConnected) - return inContainer || isConnected + return n.Topology != Pseudo || isConnected }, MakeMap( MapProcess2Container, @@ -224,9 +223,15 @@ var HostRenderer = MakeReduce( // PodRenderer is a Renderer which produces a renderable kubernetes // graph by merging the container graph and the pods topology. var PodRenderer = MakeReduce( - MakeMap( - MapContainer2Pod, - ContainerRenderer, + MakeSilentFilter( + func(n report.Node) bool { + _, isConnected := n.Latest.Lookup(IsConnected) + return n.Topology != Pseudo || isConnected + }, + MakeMap( + MapContainer2Pod, + ColorConnected(ContainerRenderer), + ), ), SelectPod, )