Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter out docker containers for pods in the kube-system namespace #1438

Merged
merged 2 commits into from
May 6, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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