remove filtering of unconnected pseudo nodes from ordinary filters

It's now done via a special filter, once, after all other filters have
been applied.

Some tests need updating since they were relying on ordinary filters
doing that filtering.
This commit is contained in:
Matthias Radestock
2017-11-22 21:23:19 +00:00
parent 9dca7627b6
commit 1416fe928f
4 changed files with 21 additions and 24 deletions

View File

@@ -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) {

View File

@@ -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}
}

View File

@@ -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")
}

View File

@@ -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