Merge pull request #1386 from weaveworks/1340-k8s-filter-namespace

Filter by Kubernetes Namespaces
This commit is contained in:
Paul Bellamy
2016-05-03 13:48:22 +01:00
10 changed files with 204 additions and 176 deletions

View File

@@ -238,8 +238,8 @@ var (
render.OutgoingInternetID: theOutgoingInternetNode,
}
unmanagedServerID = render.MakePseudoNodeID(render.UnmanagedID, fixture.ServerHostID)
unmanagedServerNode = pseudo(unmanagedServerID, render.OutgoingInternetID).WithChildren(report.MakeNodeSet(
UnmanagedServerID = render.MakePseudoNodeID(render.UnmanagedID, fixture.ServerHostID)
unmanagedServerNode = pseudo(UnmanagedServerID, render.OutgoingInternetID).WithChildren(report.MakeNodeSet(
uncontainedServerNode,
RenderedEndpoints[fixture.NonContainerNodeID],
RenderedProcesses[fixture.NonContainerProcessNodeID],
@@ -262,7 +262,7 @@ var (
RenderedContainers[fixture.ServerContainerNodeID],
)),
unmanagedServerID: unmanagedServerNode,
UnmanagedServerID: unmanagedServerNode,
render.IncomingInternetID: theIncomingInternetNode(fixture.ServerPodNodeID),
render.OutgoingInternetID: theOutgoingInternetNode,
}
@@ -282,7 +282,7 @@ var (
RenderedPods[fixture.ServerPodNodeID],
)),
unmanagedServerID: unmanagedServerNode,
UnmanagedServerID: unmanagedServerNode,
render.IncomingInternetID: theIncomingInternetNode(fixture.ServiceNodeID),
render.OutgoingInternetID: theOutgoingInternetNode,
}

View File

@@ -275,6 +275,14 @@ 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
}
}
var systemContainerNames = map[string]struct{}{
"weavescope": {},
"weavedns": {},

View File

@@ -16,37 +16,40 @@ const (
// PodRenderer is a Renderer which produces a renderable kubernetes
// graph by merging the container graph and the pods topology.
var PodRenderer = MakeFilter(
func(n report.Node) bool {
// Drop deleted or empty pods
state, ok := n.Latest.Lookup(kubernetes.PodState)
return HasChildren(report.Container)(n) && (!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,
)),
var PodRenderer = ApplyDecorators(
MakeFilter(
func(n report.Node) bool {
state, ok := n.Latest.Lookup(kubernetes.PodState)
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,
)),
),
SelectPod,
),
SelectPod,
),
)
// PodServiceRenderer is a Renderer which produces a renderable kubernetes services
// graph by merging the pods graph and the services topology.
var PodServiceRenderer = FilterEmpty(report.Pod,
MakeReduce(
MakeMap(
MapPod2Service,
PodRenderer,
var PodServiceRenderer = ApplyDecorators(
FilterEmpty(report.Pod,
MakeReduce(
MakeMap(
MapPod2Service,
PodRenderer,
),
SelectService,
),
SelectService,
),
)
@@ -117,13 +120,13 @@ func MapPod2Service(pod report.Node, _ report.Networks) report.Nodes {
if !ok {
return report.Nodes{}
}
ids, ok := pod.Latest.Lookup(kubernetes.ServiceIDs)
serviceIDs, ok := pod.Sets.Lookup(kubernetes.ServiceIDs)
if !ok {
return report.Nodes{}
}
result := report.Nodes{}
for _, serviceID := range strings.Fields(ids) {
for _, serviceID := range serviceIDs {
serviceName := strings.TrimPrefix(serviceID, namespace+"/")
id := report.MakeServiceNodeID(namespace, serviceName)
node := NewDerivedNode(id, pod).WithTopology(report.Service)

View File

@@ -7,14 +7,13 @@ import (
"github.com/weaveworks/scope/probe/kubernetes"
"github.com/weaveworks/scope/render"
"github.com/weaveworks/scope/render/expected"
"github.com/weaveworks/scope/report"
"github.com/weaveworks/scope/test"
"github.com/weaveworks/scope/test/fixture"
"github.com/weaveworks/scope/test/reflect"
)
func TestPodRenderer(t *testing.T) {
have := Prune(render.PodRenderer.Render(fixture.Report, render.FilterNoop))
have := Prune(render.PodRenderer.Render(fixture.Report, nil))
want := Prune(expected.RenderedPods)
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
@@ -26,7 +25,7 @@ func TestPodFilterRenderer(t *testing.T) {
// 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: "pod:kube-system/foo",
kubernetes.PodID: "kube-system/foo",
kubernetes.Namespace: "kube-system",
kubernetes.PodName: "foo",
})
@@ -43,7 +42,7 @@ func TestPodFilterRenderer(t *testing.T) {
}
func TestPodServiceRenderer(t *testing.T) {
have := Prune(render.PodServiceRenderer.Render(fixture.Report, render.FilterNoop))
have := Prune(render.PodServiceRenderer.Render(fixture.Report, nil))
want := Prune(expected.RenderedPodServices)
if !reflect.DeepEqual(want, have) {
t.Error(test.Diff(want, have))
@@ -54,25 +53,12 @@ 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()
input.Pod.Nodes[fixture.ClientPodNodeID] = input.Pod.Nodes[fixture.ClientPodNodeID].WithLatests(map[string]string{
kubernetes.PodID: "pod: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.PodServiceRenderer.Render(input, render.FilterApplication))
have := Prune(render.PodServiceRenderer.Render(input, render.FilterSystem))
want := Prune(expected.RenderedPodServices.Copy())
wantNode := want[fixture.ServiceNodeID]
wantNode.Adjacency = nil
wantNode.Children = report.MakeNodeSet(
expected.RenderedEndpoints[fixture.Server80NodeID],
expected.RenderedProcesses[fixture.ServerProcessNodeID],
expected.RenderedContainers[fixture.ServerContainerNodeID],
expected.RenderedPods[fixture.ServerPodNodeID],
)
want[fixture.ServiceNodeID] = wantNode
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))
}