Skip to content

Commit

Permalink
Merge pull request #1438 from weaveworks/1430-filter-kube-system-cont…
Browse files Browse the repository at this point in the history
…ainers

Filter out docker containers for pods in the kube-system namespace
  • Loading branch information
paulbellamy committed May 6, 2016
2 parents 77be686 + b5cadf3 commit 90f2f7f
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 64 deletions.
13 changes: 3 additions & 10 deletions render/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,9 @@ var ContainerRenderer = MakeFilter(
return !ok || state != docker.StateDeleted
},
MakeReduce(
MakeFilter(
func(n report.Node) bool {
// Drop unconnected pseudo nodes (could appear due to filtering)
_, isConnected := n.Latest.Lookup(IsConnected)
return n.Topology != Pseudo || isConnected
},
MakeMap(
MapProcess2Container,
ProcessRenderer,
),
MakeMap(
MapProcess2Container,
ProcessRenderer,
),

// This mapper brings in short lived connections by joining with container IPs.
Expand Down
22 changes: 4 additions & 18 deletions render/filters.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func (f *Filter) render(rpt report.Report, dct Decorator) (report.Nodes, int) {
inDegrees := map[string]int{}
filtered := 0
for id, node := range f.Renderer.Render(rpt, dct) {
if f.FilterFunc(node) {
if node.Topology == Pseudo || f.FilterFunc(node) {
output[id] = node
inDegrees[id] = 0
} else {
Expand Down Expand Up @@ -150,17 +150,6 @@ func Complement(f FilterFunc) FilterFunc {
return func(node report.Node) bool { return !f(node) }
}

// FilterPseudo produces a renderer that removes pseudo nodes from the given
// renderer
func FilterPseudo(r Renderer) Renderer {
return MakeFilter(
func(node report.Node) bool {
return node.Topology != Pseudo
},
r,
)
}

// FilterUnconnected produces a renderer that filters unconnected nodes
// from the given renderer
func FilterUnconnected(r Renderer) Renderer {
Expand Down Expand Up @@ -228,7 +217,7 @@ func IsApplication(n report.Node) bool {
if roleLabel == "system" {
return false
}
namespace, _ := n.Latest.Lookup(kubernetes.Namespace)
namespace, _ := n.Latest.Lookup(docker.LabelPrefix + "io.kubernetes.pod.namespace")
if namespace == "kube-system" {
return false
}
Expand Down Expand Up @@ -262,9 +251,6 @@ func FilterEmpty(topology string, r Renderer) Renderer {
// topology.
func HasChildren(topology string) FilterFunc {
return func(n report.Node) bool {
if n.Topology == Pseudo {
return true
}
count := 0
n.Children.ForEach(func(child report.Node) {
if child.Topology == topology {
Expand All @@ -278,8 +264,8 @@ func HasChildren(topology string) FilterFunc {
// IsNamespace checks if the node is a pod/service in the specified namespace
func IsNamespace(namespace string) FilterFunc {
return func(n report.Node) bool {
gotNamespace, ok := n.Latest.Lookup(kubernetes.Namespace)
return !ok || namespace == gotNamespace
gotNamespace, _ := n.Latest.Lookup(kubernetes.Namespace)
return namespace == gotNamespace
}
}

Expand Down
15 changes: 0 additions & 15 deletions render/filters_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,18 +124,3 @@ func TestFilterUnconnectedSelf(t *testing.T) {
}
}
}

func TestFilterPseudo(t *testing.T) {
// Test pseudonodes are removed
{
nodes := report.Nodes{
"foo": report.MakeNode("foo"),
"bar": report.MakeNode("bar").WithTopology(render.Pseudo),
}
renderer := mockRenderer{Nodes: nodes}
have := renderer.Render(report.MakeReport(), render.FilterPseudo)
if _, ok := have["bar"]; ok {
t.Error("expected pseudonode to be removed")
}
}
}
13 changes: 3 additions & 10 deletions render/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,9 @@ var PodRenderer = ConditionalRenderer(renderKubernetesTopologies,
return (!ok || state != kubernetes.StateDeleted)
},
MakeReduce(
MakeFilter(
func(n report.Node) bool {
// Drop unconnected pseudo nodes (could appear due to filtering)
_, isConnected := n.Latest.Lookup(IsConnected)
return n.Topology != Pseudo || isConnected
},
ColorConnected(MakeMap(
MapContainer2Pod,
ContainerWithImageNameRenderer,
)),
MakeMap(
MapContainer2Pod,
ContainerWithImageNameRenderer,
),
SelectPod,
),
Expand Down
20 changes: 9 additions & 11 deletions render/pod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package render_test
import (
"testing"

"github.com/weaveworks/scope/probe/docker"
"github.com/weaveworks/scope/probe/kubernetes"
"github.com/weaveworks/scope/render"
"github.com/weaveworks/scope/render/expected"
Expand All @@ -20,22 +19,20 @@ func TestPodRenderer(t *testing.T) {
}
}

func filterNonKubeSystem(renderer render.Renderer) render.Renderer {
return render.MakeFilter(render.Complement(render.IsNamespace("kube-system")), renderer)
}

func TestPodFilterRenderer(t *testing.T) {
// tag on containers or pod namespace in the topology and ensure
// it is filtered out correctly.
input := fixture.Report.Copy()
input.Pod.Nodes[fixture.ClientPodNodeID] = input.Pod.Nodes[fixture.ClientPodNodeID].WithLatests(map[string]string{
kubernetes.PodID: "kube-system/foo",
kubernetes.Namespace: "kube-system",
kubernetes.PodName: "foo",
})
input.Container.Nodes[fixture.ClientContainerNodeID] = input.Container.Nodes[fixture.ClientContainerNodeID].WithLatests(map[string]string{
docker.LabelPrefix + "io.kubernetes.pod.name": "kube-system/foo",
})
have := Prune(render.PodRenderer.Render(input, render.FilterApplication))
have := Prune(render.PodRenderer.Render(input, filterNonKubeSystem))
want := Prune(expected.RenderedPods.Copy())
delete(want, fixture.ClientPodNodeID)
delete(want, fixture.ClientContainerNodeID)
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
}
Expand All @@ -53,12 +50,13 @@ func TestPodServiceFilterRenderer(t *testing.T) {
// tag on containers or pod namespace in the topology and ensure
// it is filtered out correctly.
input := fixture.Report.Copy()
have := Prune(render.PodServiceRenderer.Render(input, render.FilterSystem))
input.Service.Nodes[fixture.ServiceNodeID] = input.Service.Nodes[fixture.ServiceNodeID].WithLatests(map[string]string{
kubernetes.Namespace: "kube-system",
})
have := Prune(render.PodServiceRenderer.Render(input, filterNonKubeSystem))
want := Prune(expected.RenderedPodServices.Copy())
delete(want, fixture.ServiceNodeID)
delete(want, expected.UnmanagedServerID)
delete(want, render.IncomingInternetID)
delete(want, render.OutgoingInternetID)
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
}
Expand Down

0 comments on commit 90f2f7f

Please sign in to comment.