This repository has been archived by the owner on Jun 24, 2020. It is now read-only.
/
watcher.go
65 lines (54 loc) · 2.22 KB
/
watcher.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
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Watcher is a higher level abstraction to Kubernetes informers. You can
provide functions which should be called on add, update, or delete.
Also, the update function will be called periodically because.. well
Kubernetes decides that there's an update even when there's nothing new
*/
package watcher
import (
"time"
"github.com/golang/glog"
apiV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/informers"
"k8s.io/client-go/informers/core/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
)
// Watcher is basically a wrapper around a Kubernetes informer that will let
// you watch secrets.
type Watcher struct {
stop chan struct{}
}
func tweakListOptions(o *apiV1.ListOptions) {
glog.Infof("Tweaking list options %+v", o)
}
// Watch calls addFunc, updateFunc, and deleteFunc, when a Secret is created,
// updated, or deleted respectively. updateFunc also will get called
// periodically with defaultResync time between calls.
func (watcher *Watcher) Watch(klient kubernetes.Interface, namespace string, defaultResync time.Duration,
addFunc func(interface{}), updateFunc func(interface{}, interface{}), deleteFunc func(interface{})) {
// should only have one informer factory. If we ever have more than one watcher then we need to reuse
informer := v1.New(informers.NewSharedInformerFactory(klient, defaultResync), namespace, tweakListOptions).Secrets().Informer()
informer.AddEventHandler(
cache.ResourceEventHandlerFuncs{
AddFunc: addFunc,
UpdateFunc: updateFunc,
DeleteFunc: deleteFunc,
})
watcher.stop = make(chan struct{})
informer.Run(watcher.stop)
}
// Stop stops watching for secrets
func (watcher *Watcher) Stop() {
close(watcher.stop)
}