mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 02:00:43 +00:00
Merge pull request #512 from weaveworks/483-filter-unconnected-pseudo-nodes
Remove pseudo nodes that are made unconnected by filtering.
This commit is contained in:
@@ -178,10 +178,12 @@ type Filter struct {
|
||||
// Render implements Renderer
|
||||
func (f Filter) Render(rpt report.Report) RenderableNodes {
|
||||
output := RenderableNodes{}
|
||||
inDegrees := map[string]int{}
|
||||
for id, node := range f.Renderer.Render(rpt) {
|
||||
if f.FilterFunc(node) {
|
||||
output[id] = node
|
||||
}
|
||||
inDegrees[id] = 0
|
||||
}
|
||||
|
||||
// Deleted nodes also need to be cut as destinations in adjacency lists.
|
||||
@@ -190,11 +192,24 @@ func (f Filter) Render(rpt report.Report) RenderableNodes {
|
||||
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.Pseudo || len(node.Adjacency) > 0 {
|
||||
continue
|
||||
}
|
||||
delete(output, id)
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
|
||||
@@ -212,4 +212,65 @@ func TestFilterRender2(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterUnconnectedPesudoNodes(t *testing.T) {
|
||||
// Test pseudo nodes that are made unconnected by filtering
|
||||
// are also removed.
|
||||
{
|
||||
nodes := render.RenderableNodes{
|
||||
"foo": {ID: "foo", Node: report.MakeNode().WithAdjacent("bar")},
|
||||
"bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("baz")},
|
||||
"baz": {ID: "baz", Node: report.MakeNode(), Pseudo: true},
|
||||
}
|
||||
renderer := render.Filter{
|
||||
FilterFunc: func(node render.RenderableNode) bool {
|
||||
return true
|
||||
},
|
||||
Renderer: mockRenderer{RenderableNodes: nodes},
|
||||
}
|
||||
want := nodes.Prune()
|
||||
have := renderer.Render(report.MakeReport()).Prune()
|
||||
if !reflect.DeepEqual(want, have) {
|
||||
t.Error(test.Diff(want, have))
|
||||
}
|
||||
}
|
||||
{
|
||||
renderer := render.Filter{
|
||||
FilterFunc: func(node render.RenderableNode) bool {
|
||||
return node.ID != "bar"
|
||||
},
|
||||
Renderer: mockRenderer{RenderableNodes: render.RenderableNodes{
|
||||
"foo": {ID: "foo", Node: report.MakeNode().WithAdjacent("bar")},
|
||||
"bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("baz")},
|
||||
"baz": {ID: "baz", Node: report.MakeNode(), Pseudo: true},
|
||||
}},
|
||||
}
|
||||
want := render.RenderableNodes{
|
||||
"foo": {ID: "foo", Origins: report.IDList{}, Node: report.MakeNode()},
|
||||
}
|
||||
have := renderer.Render(report.MakeReport()).Prune()
|
||||
if !reflect.DeepEqual(want, have) {
|
||||
t.Error(test.Diff(want, have))
|
||||
}
|
||||
}
|
||||
{
|
||||
renderer := render.Filter{
|
||||
FilterFunc: func(node render.RenderableNode) bool {
|
||||
return node.ID != "bar"
|
||||
},
|
||||
Renderer: mockRenderer{RenderableNodes: render.RenderableNodes{
|
||||
"foo": {ID: "foo", Node: report.MakeNode()},
|
||||
"bar": {ID: "bar", Node: report.MakeNode().WithAdjacent("foo")},
|
||||
"baz": {ID: "baz", Node: report.MakeNode().WithAdjacent("bar"), Pseudo: true},
|
||||
}},
|
||||
}
|
||||
want := render.RenderableNodes{
|
||||
"foo": {ID: "foo", Origins: report.IDList{}, Node: report.MakeNode()},
|
||||
}
|
||||
have := renderer.Render(report.MakeReport()).Prune()
|
||||
if !reflect.DeepEqual(want, have) {
|
||||
t.Error(test.Diff(want, have))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func newu64(value uint64) *uint64 { return &value }
|
||||
|
||||
Reference in New Issue
Block a user