-
Notifications
You must be signed in to change notification settings - Fork 1
/
process.go
executable file
·122 lines (102 loc) · 2.85 KB
/
process.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
package main
import (
k8sconfig "github.com/akkeris/service-watcher-f5/k8sconfig"
services "github.com/akkeris/service-watcher-f5/services"
utils "github.com/akkeris/service-watcher-f5/utils"
"encoding/json"
"fmt"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1"
api "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/kubernetes"
"time"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/clientcmd"
"github.com/stackimpact/stackimpact-go"
"os"
)
func main() {
utils.Variableinit()
utils.Startclient()
utils.InitBlacklist()
if os.Getenv("PROFILE") == "true" {
fmt.Println("Starting profiler...")
_ = stackimpact.Start(stackimpact.Options{
AgentKey: os.Getenv("STACKIMPACT"),
AppName: "Service Watcher",
AppEnvironment: os.Getenv("CLUSTER"),
})
}
k8sconfig.CreateConfig()
config, err := clientcmd.BuildConfigFromFlags("", "./config")
if err != nil {
panic(err.Error())
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
utils.Client = clientset.CoreV1().RESTClient()
listWatch := cache.NewListWatchFromClient(
utils.Client, "services", "",
fields.Everything())
listWatch.ListFunc = func(options api.ListOptions) (runtime.Object, error) {
return utils.Client.Get().Namespace("none").Resource("services").Do().Get()
}
listWatch.WatchFunc = func(options api.ListOptions) (watch.Interface, error) {
return clientset.CoreV1().Services(api.NamespaceAll).Watch(v1.ListOptions{})
}
_, controller := cache.NewInformer(
listWatch, &corev1.Service{},
time.Second*0, cache.ResourceEventHandlerFuncs{
AddFunc: printEventAdd,
DeleteFunc: printEventDelete,
},
)
fmt.Println("Watching for changes in Services....")
controller.Run(wait.NeverStop)
}
func printEventAdd(obj interface{}) {
_, isService := obj.(*corev1.Service)
if isService {
created := obj.(*corev1.Service).ObjectMeta.CreationTimestamp.Unix()
now := v1.Now().Unix()
diff := now - created
if diff < 300 && !Blacklisted(obj.(*corev1.Service).ObjectMeta.Namespace) {
fmt.Println("ADD")
var jsn []byte
var err error
jsn, err = json.Marshal(obj)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(jsn))
services.ProcessServiceAdd(obj)
}
}
}
func Blacklisted(namespace string) bool {
return utils.Blacklist[namespace]
}
func printEventDelete(obj interface{}) {
fmt.Println("DELETE")
_, isService := obj.(*corev1.Service)
if isService {
if !Blacklisted(obj.(*corev1.Service).ObjectMeta.Namespace) {
var jsn []byte
var err error
jsn, err = json.Marshal(obj)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(jsn))
services.ProcessServiceDelete(obj)
}
}
}