...
1
16
17 package helper
18
19 import (
20 appsv1 "k8s.io/api/apps/v1"
21 v1 "k8s.io/api/core/v1"
22 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23 "k8s.io/apimachinery/pkg/labels"
24 "k8s.io/apimachinery/pkg/runtime/schema"
25 appslisters "k8s.io/client-go/listers/apps/v1"
26 corelisters "k8s.io/client-go/listers/core/v1"
27 )
28
29 var (
30 rcKind = v1.SchemeGroupVersion.WithKind("ReplicationController")
31 rsKind = appsv1.SchemeGroupVersion.WithKind("ReplicaSet")
32 ssKind = appsv1.SchemeGroupVersion.WithKind("StatefulSet")
33 )
34
35
36
37 func DefaultSelector(
38 pod *v1.Pod,
39 sl corelisters.ServiceLister,
40 cl corelisters.ReplicationControllerLister,
41 rsl appslisters.ReplicaSetLister,
42 ssl appslisters.StatefulSetLister,
43 ) labels.Selector {
44 labelSet := make(labels.Set)
45
46
47
48 if services, err := GetPodServices(sl, pod); err == nil {
49 for _, service := range services {
50 labelSet = labels.Merge(labelSet, service.Spec.Selector)
51 }
52 }
53 selector := labelSet.AsSelector()
54
55 owner := metav1.GetControllerOfNoCopy(pod)
56 if owner == nil {
57 return selector
58 }
59
60 gv, err := schema.ParseGroupVersion(owner.APIVersion)
61 if err != nil {
62 return selector
63 }
64
65 gvk := gv.WithKind(owner.Kind)
66 switch gvk {
67 case rcKind:
68 if rc, err := cl.ReplicationControllers(pod.Namespace).Get(owner.Name); err == nil {
69 labelSet = labels.Merge(labelSet, rc.Spec.Selector)
70 selector = labelSet.AsSelector()
71 }
72 case rsKind:
73 if rs, err := rsl.ReplicaSets(pod.Namespace).Get(owner.Name); err == nil {
74 if other, err := metav1.LabelSelectorAsSelector(rs.Spec.Selector); err == nil {
75 if r, ok := other.Requirements(); ok {
76 selector = selector.Add(r...)
77 }
78 }
79 }
80 case ssKind:
81 if ss, err := ssl.StatefulSets(pod.Namespace).Get(owner.Name); err == nil {
82 if other, err := metav1.LabelSelectorAsSelector(ss.Spec.Selector); err == nil {
83 if r, ok := other.Requirements(); ok {
84 selector = selector.Add(r...)
85 }
86 }
87 }
88 default:
89
90 }
91
92 return selector
93 }
94
95
96 func GetPodServices(sl corelisters.ServiceLister, pod *v1.Pod) ([]*v1.Service, error) {
97 allServices, err := sl.Services(pod.Namespace).List(labels.Everything())
98 if err != nil {
99 return nil, err
100 }
101
102 var services []*v1.Service
103 for i := range allServices {
104 service := allServices[i]
105 if service.Spec.Selector == nil {
106
107 continue
108 }
109 selector := labels.Set(service.Spec.Selector).AsSelectorPreValidated()
110 if selector.Matches(labels.Set(pod.Labels)) {
111 services = append(services, service)
112 }
113 }
114
115 return services, nil
116 }
117
View as plain text