forked from kiali/kiali
-
Notifications
You must be signed in to change notification settings - Fork 0
/
filters.go
70 lines (63 loc) · 2.03 KB
/
filters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package kubernetes
import (
core_v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/labels"
)
// FilterPodsForService returns a subpart of pod list filtered according service selector
func FilterPodsForService(s *core_v1.Service, allPods []core_v1.Pod) []core_v1.Pod {
if s == nil || allPods == nil {
return nil
}
serviceSelector := labels.Set(s.Spec.Selector).AsSelector()
pods := FilterPodsForSelector(serviceSelector, allPods)
return pods
}
func FilterPodsForSelector(selector labels.Selector, allPods []core_v1.Pod) []core_v1.Pod {
var pods []core_v1.Pod
for _, pod := range allPods {
if selector.Matches(labels.Set(pod.ObjectMeta.Labels)) {
pods = append(pods, pod)
}
}
return pods
}
// FilterPodsForEndpoints performs a second pass was selector may return too many data
// This case happens when a "nil" selector (such as one of default/kubernetes service) is used
func FilterPodsForEndpoints(endpoints *core_v1.Endpoints, unfiltered []core_v1.Pod) []core_v1.Pod {
endpointPods := make(map[string]bool)
for _, subset := range endpoints.Subsets {
for _, address := range subset.Addresses {
if address.TargetRef != nil && address.TargetRef.Kind == "Pod" {
endpointPods[address.TargetRef.Name] = true
}
}
}
var pods []core_v1.Pod
for _, pod := range unfiltered {
if _, ok := endpointPods[pod.Name]; ok {
pods = append(pods, pod)
}
}
return pods
}
func FilterPodsForController(controllerName string, controllerType string, allPods []core_v1.Pod) []core_v1.Pod {
var pods []core_v1.Pod
for _, pod := range allPods {
for _, ref := range pod.OwnerReferences {
if ref.Controller != nil && *ref.Controller && ref.Name == controllerName && ref.Kind == controllerType {
pods = append(pods, pod)
break
}
}
}
return pods
}
func FilterServicesForSelector(selector labels.Selector, allServices []core_v1.Service) []core_v1.Service {
var services []core_v1.Service
for _, svc := range allServices {
if selector.Matches(labels.Set(svc.Spec.Selector)) {
services = append(services, svc)
}
}
return services
}