forked from kubermatic/kubermatic
-
Notifications
You must be signed in to change notification settings - Fork 0
/
settings.go
90 lines (74 loc) · 2.62 KB
/
settings.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
/*
Copyright 2020 The Kubermatic Kubernetes Platform contributors.
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.
*/
package kubernetes
import (
"reflect"
v1 "github.com/kubermatic/kubermatic/api/pkg/crd/kubermatic/v1"
"github.com/kubermatic/kubermatic/api/pkg/log"
"github.com/kubermatic/kubermatic/api/pkg/provider"
"code.cloudfoundry.org/go-pubsub"
"k8s.io/apimachinery/pkg/watch"
)
// SettingsWatcher watches settings and notifies its subscribers about any changes.
type SettingsWatcher struct {
provider provider.SettingsProvider
watcher watch.Interface
publisher *pubsub.PubSub
}
// SettingsWatcher returns a new resource watcher.
func NewSettingsWatcher(provider provider.SettingsProvider) (*SettingsWatcher, error) {
watcher, err := provider.WatchGlobalSettings()
if err != nil {
return nil, err
}
w := &SettingsWatcher{
provider: provider,
watcher: watcher,
publisher: pubsub.New(),
}
go w.run()
return w, nil
}
// run and publish information about settings updates. Watch will restart itself if any error occur.
func (watcher *SettingsWatcher) run() {
defer func() {
log.Logger.Debug("restarting settings watcher")
watcher.watcher.Stop()
watcher.watcher = nil
watcher.run()
}()
if watcher.watcher == nil {
var err error
if watcher.watcher, err = watcher.provider.WatchGlobalSettings(); err != nil {
log.Logger.Debug("could not recreate settings watcher")
return
}
}
for event := range watcher.watcher.ResultChan() {
settings, ok := event.Object.(*v1.KubermaticSetting)
if !ok {
log.Logger.Debugf("expected settings got %s", reflect.TypeOf(event.Object))
}
if settings != nil && settings.Name == v1.GlobalSettingsName {
if event.Type == watch.Added || event.Type == watch.Modified {
watcher.publisher.Publish(settings, pubsub.LinearTreeTraverser([]uint64{}))
} else if event.Type == watch.Deleted {
watcher.publisher.Publish(nil, pubsub.LinearTreeTraverser([]uint64{}))
}
}
}
}
// Subscribe allows to register subscription handler which will be invoked on each settings change.
func (watcher *SettingsWatcher) Subscribe(subscription pubsub.Subscription) {
watcher.publisher.Subscribe(subscription)
}