From 23156304afa172d412523888dd409d1941ea8c99 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Thu, 5 May 2016 18:34:07 +0100 Subject: [PATCH 1/2] Filter out docker containers for pods in the kube-system namespace --- render/filters.go | 6 +++--- render/pod_test.go | 20 +++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/render/filters.go b/render/filters.go index 0d075ce32..41b6299b8 100644 --- a/render/filters.go +++ b/render/filters.go @@ -228,7 +228,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 } @@ -278,8 +278,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 } } diff --git a/render/pod_test.go b/render/pod_test.go index f091f8c22..396d1b15a 100644 --- a/render/pod_test.go +++ b/render/pod_test.go @@ -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" @@ -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)) } @@ -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)) } From b5cadf3a4190b57c167371f5d72fb827929944aa Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Fri, 6 May 2016 13:14:48 +0100 Subject: [PATCH 2/2] Make all filters drop unconnected pseudo nodes by default, and don't apply filter funcs to pseudo nodes. --- render/container.go | 13 +++---------- render/filters.go | 16 +--------------- render/filters_test.go | 15 --------------- render/pod.go | 13 +++---------- 4 files changed, 7 insertions(+), 50 deletions(-) diff --git a/render/container.go b/render/container.go index 9c11945c4..2cc8b1d1c 100644 --- a/render/container.go +++ b/render/container.go @@ -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. diff --git a/render/filters.go b/render/filters.go index 41b6299b8..7addf13d9 100644 --- a/render/filters.go +++ b/render/filters.go @@ -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 { @@ -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 { @@ -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 { diff --git a/render/filters_test.go b/render/filters_test.go index 15885025d..7f6d86472 100644 --- a/render/filters_test.go +++ b/render/filters_test.go @@ -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") - } - } -} diff --git a/render/pod.go b/render/pod.go index f93741b17..7d3cf0948 100644 --- a/render/pod.go +++ b/render/pod.go @@ -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, ),