mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-16 03:49:52 +00:00
Merge pull request #2362 from weaveworks/mike/k8s-ns-in-container-view
When k8s present, allow filtering of containers by namespace (take 2)
This commit is contained in:
@@ -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{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user