-
Notifications
You must be signed in to change notification settings - Fork 116
/
volume_driver_registry.go
82 lines (71 loc) · 1.78 KB
/
volume_driver_registry.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
package volume
import "sync"
type volumeDriverRegistry struct {
nameToInitFunc map[string]func(map[string]string) (VolumeDriver, error)
nameToVolumeDriver map[string]VolumeDriver
lock *sync.RWMutex
isShutdown bool
}
func newVolumeDriverRegistry(nameToInitFunc map[string]func(map[string]string) (VolumeDriver, error)) *volumeDriverRegistry {
return &volumeDriverRegistry{
nameToInitFunc,
make(map[string]VolumeDriver),
&sync.RWMutex{},
false,
}
}
func (v *volumeDriverRegistry) Get(name string) (VolumeDriver, error) {
v.lock.RLock()
defer v.lock.RUnlock()
if v.isShutdown {
return nil, ErrAlreadyShutdown
}
volumeDriver, ok := v.nameToVolumeDriver[name]
if !ok {
return nil, ErrDriverNotFound
}
return volumeDriver, nil
}
func (v *volumeDriverRegistry) Add(name string, init func(map[string]string) (VolumeDriver, error)) error {
v.lock.Lock()
defer v.lock.Unlock()
v.nameToInitFunc[name] = init
return nil
}
func (v *volumeDriverRegistry) Remove(name string) {
v.lock.Lock()
defer v.lock.Unlock()
delete(v.nameToInitFunc, name)
delete(v.nameToVolumeDriver, name)
}
func (v *volumeDriverRegistry) Register(name string, params map[string]string) error {
initFunc, ok := v.nameToInitFunc[name]
if !ok {
return ErrNotSupported
}
v.lock.Lock()
defer v.lock.Unlock()
if v.isShutdown {
return ErrAlreadyShutdown
}
if _, ok := v.nameToVolumeDriver[name]; ok {
return ErrExist
}
volumeDriver, err := initFunc(params)
if err != nil {
return err
}
v.nameToVolumeDriver[name] = volumeDriver
return nil
}
func (v *volumeDriverRegistry) Shutdown() error {
v.lock.Lock()
if v.isShutdown {
return ErrAlreadyShutdown
}
for _, volumeDriver := range v.nameToVolumeDriver {
volumeDriver.Shutdown()
}
v.isShutdown = true
return nil
}