diff --git a/render/container_test.go b/render/container_test.go index cc0dd4148..ca9f51dfa 100644 --- a/render/container_test.go +++ b/render/container_test.go @@ -16,8 +16,14 @@ import ( ) var ( - filterApplication = render.AnyFilterFunc(render.IsPseudoTopology, render.IsApplication) - filterSystem = render.AnyFilterFunc(render.IsPseudoTopology, render.IsSystem) + filterApplication = render.Transformers([]render.Transformer{ + render.AnyFilterFunc(render.IsPseudoTopology, render.IsApplication), + render.FilterUnconnectedPseudo, + }) + filterSystem = render.Transformers([]render.Transformer{ + render.AnyFilterFunc(render.IsPseudoTopology, render.IsSystem), + render.FilterUnconnectedPseudo, + }) ) func TestMapProcess2Container(t *testing.T) { diff --git a/render/filters.go b/render/filters.go index 5ffe6dc3d..8dba85ecd 100644 --- a/render/filters.go +++ b/render/filters.go @@ -63,12 +63,10 @@ func Complement(f FilterFunc) FilterFunc { // Transform applies the filter to all nodes func (f FilterFunc) Transform(nodes Nodes) Nodes { output := report.Nodes{} - inDegrees := map[string]int{} filtered := nodes.Filtered for id, node := range nodes.Nodes { if f(node) { output[id] = node - inDegrees[id] = 0 } else { filtered++ } @@ -80,25 +78,12 @@ func (f FilterFunc) Transform(nodes Nodes) Nodes { for _, dstID := range node.Adjacency { if _, ok := output[dstID]; ok { newAdjacency = newAdjacency.Add(dstID) - inDegrees[dstID]++ } } node.Adjacency = newAdjacency output[id] = node } - // Remove unconnected pseudo nodes, see #483. - for id, inDegree := range inDegrees { - if inDegree > 0 { - continue - } - node := output[id] - if node.Topology != Pseudo || len(node.Adjacency) > 0 { - continue - } - delete(output, id) - filtered++ - } return Nodes{Nodes: output, Filtered: filtered} } diff --git a/render/filters_test.go b/render/filters_test.go index 8def19720..b31dfc1fb 100644 --- a/render/filters_test.go +++ b/render/filters_test.go @@ -9,9 +9,12 @@ import ( "github.com/weaveworks/scope/test/reflect" ) -func isNotBar(node report.Node) bool { - return node.ID != "bar" -} +var filterBar = render.Transformers([]render.Transformer{ + render.FilterFunc(func(node report.Node) bool { + return node.ID != "bar" + }), + render.FilterUnconnectedPseudo, +}) func TestFilterRender(t *testing.T) { renderer := mockRenderer{Nodes: report.Nodes{ @@ -36,7 +39,7 @@ func TestFilterRender2(t *testing.T) { "bar": report.MakeNode("bar").WithAdjacent("foo"), "baz": report.MakeNode("baz"), }} - have := render.Render(report.MakeReport(), renderer, render.FilterFunc(isNotBar)).Nodes + have := render.Render(report.MakeReport(), renderer, filterBar).Nodes if have["foo"].Adjacency.Contains("bar") { t.Error("adjacencies for removed nodes should have been removed") } @@ -64,7 +67,7 @@ func TestFilterUnconnectedPseudoNodes(t *testing.T) { "bar": report.MakeNode("bar").WithAdjacent("baz"), "baz": report.MakeNode("baz").WithTopology(render.Pseudo), }} - have := render.Render(report.MakeReport(), renderer, render.FilterFunc(isNotBar)).Nodes + have := render.Render(report.MakeReport(), renderer, filterBar).Nodes if _, ok := have["baz"]; ok { t.Error("expected the unconnected pseudonode baz to have been removed") } @@ -75,7 +78,7 @@ func TestFilterUnconnectedPseudoNodes(t *testing.T) { "bar": report.MakeNode("bar").WithAdjacent("foo"), "baz": report.MakeNode("baz").WithTopology(render.Pseudo).WithAdjacent("bar"), }} - have := render.Render(report.MakeReport(), renderer, render.FilterFunc(isNotBar)).Nodes + have := render.Render(report.MakeReport(), renderer, filterBar).Nodes if _, ok := have["baz"]; ok { t.Error("expected the unconnected pseudonode baz to have been removed") } diff --git a/render/pod_test.go b/render/pod_test.go index 01c598341..d707110d3 100644 --- a/render/pod_test.go +++ b/render/pod_test.go @@ -20,7 +20,10 @@ func TestPodRenderer(t *testing.T) { } } -var filterNonKubeSystem = render.Complement(render.IsNamespace("kube-system")) +var filterNonKubeSystem = render.Transformers([]render.Transformer{ + render.Complement(render.IsNamespace("kube-system")), + render.FilterUnconnectedPseudo, +}) func TestPodFilterRenderer(t *testing.T) { // tag on containers or pod namespace in the topology and ensure