/
service.go
148 lines (127 loc) · 3.67 KB
/
service.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package service
import (
"context"
coreV1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/informers"
serviceV1 "k8s.io/client-go/informers/core/v1"
"k8s.io/client-go/kubernetes"
)
type (
//service interface
Service interface {
//create service
Create(ctx context.Context, namespace string, service *coreV1.Service) error
//delete service
Delete(ctx context.Context, namespace string, name string) error
//list service
List(ctx context.Context, namespace string, selector labels.Selector) ([]*coreV1.Service, error)
//get service
Get(ctx context.Context, namespace string, name string) (*coreV1.Service, error)
//watch event handler
WatchEvent(ctx context.Context, handler ServiceHandlerFuncs)
}
//service object
serviceImpl struct {
clientset *kubernetes.Clientset
informer serviceV1.ServiceInformer
factory informers.SharedInformerFactory
}
// ServiceHandlerFuncs
ServiceHandlerFuncs struct {
AddFunc func(obj *coreV1.Service)
UpdateFunc func(oldObj, newObj *coreV1.Service)
DeleteFunc func(obj *coreV1.Service)
}
)
//new service
func NewService(clientset *kubernetes.Clientset, factory informers.SharedInformerFactory) Service {
//new service
p := &serviceImpl{
clientset: clientset,
informer: factory.Core().V1().Services(),
factory: factory,
}
return p
}
//create service
func (p *serviceImpl) Create(ctx context.Context, namespace string, service *coreV1.Service) error {
_, err := p.clientset.CoreV1().Services(namespace).Create(ctx, service, metav1.CreateOptions{})
if err != nil {
return err
}
return nil
}
//delete service
func (p *serviceImpl) Delete(ctx context.Context, namespace string, name string) error {
err := p.clientset.CoreV1().Services(namespace).Delete(ctx, name, metav1.DeleteOptions{})
if err != nil {
return err
}
return nil
}
//list service
func (p *serviceImpl) List(ctx context.Context, namespace string, selector labels.Selector) (list []*coreV1.Service, err error) {
list, err = p.informer.Lister().Services(namespace).List(selector)
if err != nil || len(list) <= 0 {
service, err := p.clientset.CoreV1().Services(namespace).List(ctx, metav1.ListOptions{LabelSelector: selector.String()})
if err != nil {
return nil, err
}
for i := range service.Items {
list = append(list, &service.Items[i])
}
}
return list, nil
}
//get service
func (p *serviceImpl) Get(ctx context.Context, namespace string, name string) (*coreV1.Service, error) {
service, err := p.informer.Lister().Services(namespace).Get(name)
if err != nil {
service, err = p.clientset.CoreV1().Services(namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
return nil, err
}
}
return service, nil
}
//watch event
func (p *serviceImpl) WatchEvent(ctx context.Context, handler ServiceHandlerFuncs) {
//add event handler
p.informer.Informer().AddEventHandler(handler)
//start
p.factory.Start(ctx.Done())
//wait sync
p.factory.WaitForCacheSync(ctx.Done())
}
// OnAdd calls AddFunc if it's not nil.
func (j ServiceHandlerFuncs) OnAdd(obj interface{}) {
if j.AddFunc != nil {
if event, ok := obj.(*coreV1.Service); ok {
j.AddFunc(event)
}
}
}
// OnUpdate calls UpdateFunc if it's not nil.
func (j ServiceHandlerFuncs) OnUpdate(oldObj, newObj interface{}) {
if j.UpdateFunc != nil {
old, ok := oldObj.(*coreV1.Service)
if !ok {
return
}
new, ok := newObj.(*coreV1.Service)
if !ok {
return
}
j.UpdateFunc(old, new)
}
}
// OnDelete calls DeleteFunc if it's not nil.
func (j ServiceHandlerFuncs) OnDelete(obj interface{}) {
if j.DeleteFunc != nil {
if event, ok := obj.(*coreV1.Service); ok {
j.DeleteFunc(event)
}
}
}