diff --git a/app/api_topologies.go b/app/api_topologies.go index ecc44fc85..4d0a38e2f 100644 --- a/app/api_topologies.go +++ b/app/api_topologies.go @@ -75,27 +75,35 @@ func updateFilters(rpt report.Report, topologies []APITopologyDesc) []APITopolog } } } - var ns []string + if len(namespaces) == 0 { + // We only want to apply k8s filters when we have k8s-related nodes, + // so if we don't then return early + return topologies + } + ns := []string{} for namespace := range namespaces { ns = append(ns, namespace) } sort.Strings(ns) + topologies = append([]APITopologyDesc{}, topologies...) // Make a copy so we can make changes safely for i, t := range topologies { - if t.id == podsID || t.id == servicesID || t.id == deploymentsID || t.id == replicaSetsID { - topologies[i] = updateTopologyFilters(t, []APITopologyOptionGroup{ - kubernetesFilters(ns...), unmanagedFilter, + if t.id == containersID || t.id == containersByImageID || t.id == containersByHostnameID || t.id == podsID || t.id == servicesID || t.id == deploymentsID || t.id == replicaSetsID { + topologies[i] = mergeTopologyFilters(t, []APITopologyOptionGroup{ + kubernetesFilters(ns...), }) } } return topologies } -// updateTopologyFilters recursively sets the options on a topology description -func updateTopologyFilters(t APITopologyDesc, options []APITopologyOptionGroup) APITopologyDesc { - t.Options = options +// mergeTopologyFilters recursively merges in new options on a topology description +func mergeTopologyFilters(t APITopologyDesc, options []APITopologyOptionGroup) APITopologyDesc { + t.Options = append(append([]APITopologyOptionGroup{}, t.Options...), options...) + newSubTopologies := make([]APITopologyDesc, len(t.SubTopologies)) for i, sub := range t.SubTopologies { - t.SubTopologies[i] = updateTopologyFilters(sub, options) + newSubTopologies[i] = mergeTopologyFilters(sub, options) } + t.SubTopologies = newSubTopologies return t } @@ -200,6 +208,7 @@ func MakeRegistry() *Registry { renderer: render.PodRenderer, Name: "Pods", Rank: 3, + Options: []APITopologyOptionGroup{unmanagedFilter}, HideIfEmpty: true, }, APITopologyDesc{ @@ -207,6 +216,7 @@ func MakeRegistry() *Registry { parent: podsID, renderer: render.ReplicaSetRenderer, Name: "replica sets", + Options: []APITopologyOptionGroup{unmanagedFilter}, HideIfEmpty: true, }, APITopologyDesc{ @@ -214,6 +224,7 @@ func MakeRegistry() *Registry { parent: podsID, renderer: render.DeploymentRenderer, Name: "deployments", + Options: []APITopologyOptionGroup{unmanagedFilter}, HideIfEmpty: true, }, APITopologyDesc{ @@ -221,6 +232,7 @@ func MakeRegistry() *Registry { parent: podsID, renderer: render.PodServiceRenderer, Name: "services", + Options: []APITopologyOptionGroup{unmanagedFilter}, HideIfEmpty: true, }, APITopologyDesc{ diff --git a/render/filters.go b/render/filters.go index 28a0fb483..fc5425d46 100644 --- a/render/filters.go +++ b/render/filters.go @@ -10,6 +10,10 @@ import ( "github.com/weaveworks/scope/report" ) +const ( + k8sNamespaceLabel = "io.kubernetes.pod.namespace" +) + // PreciousNodeRenderer ensures a node is never filtered out by decorators type PreciousNodeRenderer struct { PreciousNodeID string @@ -281,7 +285,7 @@ func IsApplication(n report.Node) bool { if roleLabel == "system" { return false } - namespace, _ := n.Latest.Lookup(docker.LabelPrefix + "io.kubernetes.pod.namespace") + namespace, _ := n.Latest.Lookup(docker.LabelPrefix + k8sNamespaceLabel) if namespace == "kube-system" { return false } @@ -320,7 +324,14 @@ func IsNotPseudo(n report.Node) bool { // 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, _ := n.Latest.Lookup(kubernetes.Namespace) + tryKeys := []string{kubernetes.Namespace, docker.LabelPrefix + k8sNamespaceLabel} + gotNamespace := "" + for _, key := range tryKeys { + if value, ok := n.Latest.Lookup(key); ok { + gotNamespace = value + break + } + } return namespace == gotNamespace } }