/
syncer.go
97 lines (84 loc) · 2.29 KB
/
syncer.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
package vollocal
import (
"fmt"
"os"
"time"
"code.cloudfoundry.org/clock"
"code.cloudfoundry.org/lager/v3"
"code.cloudfoundry.org/volman"
"github.com/tedsuo/ifrit"
)
type Syncer struct {
logger lager.Logger
registry volman.PluginRegistry
scanInterval time.Duration
clock clock.Clock
discoverer []volman.Discoverer
}
func NewSyncer(logger lager.Logger, registry volman.PluginRegistry, discoverer []volman.Discoverer, scanInterval time.Duration, clock clock.Clock) *Syncer {
return &Syncer{
logger: logger,
registry: registry,
scanInterval: scanInterval,
clock: clock,
discoverer: discoverer,
}
}
func NewSyncerWithShims(logger lager.Logger, registry volman.PluginRegistry, discoverer []volman.Discoverer, scanInterval time.Duration, clock clock.Clock) *Syncer {
return &Syncer{
logger: logger,
registry: registry,
scanInterval: scanInterval,
clock: clock,
discoverer: discoverer,
}
}
func (p *Syncer) Runner() ifrit.Runner {
return p
}
func (p *Syncer) Run(signals <-chan os.Signal, ready chan<- struct{}) error {
logger := p.logger.Session("sync-plugin")
logger.Info("start")
defer logger.Info("end")
logger.Info("running-discovery")
allPlugins, err := discoverAllplugins(logger, p.discoverer)
if err != nil {
return err
}
p.registry.Set(allPlugins)
timer := p.clock.NewTimer(p.scanInterval)
defer timer.Stop()
close(ready)
for {
select {
case <-timer.C():
go func() {
logger.Info("running-re-discovery")
allPlugins, err := discoverAllplugins(logger, p.discoverer)
if err != nil {
logger.Error("failed-discover", err)
}
p.registry.Set(allPlugins)
timer.Reset(p.scanInterval)
}()
case signal := <-signals:
logger.Info("signalled", lager.Data{"signal": signal.String()})
return nil
}
}
}
func discoverAllplugins(logger lager.Logger, discoverers []volman.Discoverer) (map[string]volman.Plugin, error) {
allPlugins := map[string]volman.Plugin{}
for _, discoverer := range discoverers {
plugins, err := discoverer.Discover(logger)
logger.Debug(fmt.Sprintf("plugins found: %#v", plugins))
if err != nil {
logger.Error("failed-discover", err)
return map[string]volman.Plugin{}, err
}
for k, v := range plugins {
allPlugins[k] = v
}
}
return allPlugins, nil
}