-
Notifications
You must be signed in to change notification settings - Fork 50
/
plugin.go
96 lines (81 loc) · 2.65 KB
/
plugin.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
/*
Copyright 2017 Caicloud authors. All rights reserved.
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 plugin
import (
"github.com/caicloud/clientset/informers"
lbapi "github.com/caicloud/clientset/pkg/apis/loadbalance/v1alpha2"
"github.com/caicloud/loadbalancer-controller/pkg/config"
"github.com/zoumo/golib/register"
)
// Interface defines a pluggable proxy interface
type Interface interface {
Init(config.Configuration, informers.SharedInformerFactory)
Run(stopCh <-chan struct{})
OnSync(*lbapi.LoadBalancer)
}
// Registry ...
type Registry struct {
register *register.Register
}
// NewRegistry ...
func NewRegistry() *Registry {
return &Registry{
register: register.New(nil),
}
}
// Register registers a Interface into registry by name.
// Register does not allow user to override an existing Interface.
// This is expected to happen during app startup
func (p *Registry) Register(name string, plugin Interface) {
p.register.Register(name, plugin)
}
// Get returns a registered Interface, or nil if not
func (p *Registry) Get(name string) (Interface, bool) {
v, found := p.register.Get(name)
if !found {
return nil, false
}
return v.(Interface), true
}
// Contains checks if the plugin's name is already registered
func (p *Registry) Contains(name string) bool {
return p.register.Contains(name)
}
// AllInterfaces returns all registered plugins' names
func (p *Registry) AllInterfaces() []string {
return p.register.Keys()
}
// InitAll calls all registered plugins OnSync function
func (p *Registry) InitAll(c config.Configuration, sif informers.SharedInformerFactory) {
p.register.Range(func(k string, value interface{}) bool {
plugin := value.(Interface)
plugin.Init(c, sif)
return true
})
}
// RunAll calls all registered plugins' Run function
func (p *Registry) RunAll(stopCh <-chan struct{}) {
p.register.Range(func(k string, value interface{}) bool {
plugin := value.(Interface)
go plugin.Run(stopCh)
return true
})
}
// SyncAll calls all registered plugins OnSync function
func (p *Registry) SyncAll(lb *lbapi.LoadBalancer) {
p.register.Range(func(k string, value interface{}) bool {
plugin := value.(Interface)
go plugin.OnSync(lb)
return true
})
}