-
Notifications
You must be signed in to change notification settings - Fork 4
/
ipams.go
84 lines (67 loc) · 2.23 KB
/
ipams.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
package drvregistry
import (
"errors"
"strings"
"sync"
"github.com/docker/docker/libnetwork/ipamapi"
"github.com/docker/docker/libnetwork/types"
)
type ipamDriver struct {
driver ipamapi.Ipam
capability *ipamapi.Capability
}
// IPAMs is a registry of IPAM drivers. The zero value is an empty IPAM driver
// registry, ready to use.
type IPAMs struct {
mu sync.Mutex
drivers map[string]ipamDriver
}
var _ ipamapi.Registerer = (*IPAMs)(nil)
// IPAM returns the actual IPAM driver instance and its capability which registered with the passed name.
func (ir *IPAMs) IPAM(name string) (ipamapi.Ipam, *ipamapi.Capability) {
ir.mu.Lock()
defer ir.mu.Unlock()
d := ir.drivers[name]
return d.driver, d.capability
}
// RegisterIpamDriverWithCapabilities registers the IPAM driver discovered with specified capabilities.
func (ir *IPAMs) RegisterIpamDriverWithCapabilities(name string, driver ipamapi.Ipam, caps *ipamapi.Capability) error {
if strings.TrimSpace(name) == "" {
return errors.New("ipam driver name string cannot be empty")
}
ir.mu.Lock()
defer ir.mu.Unlock()
dd, ok := ir.drivers[name]
if ok && dd.driver.IsBuiltIn() {
return types.ForbiddenErrorf("ipam driver %q already registered", name)
}
if ir.drivers == nil {
ir.drivers = make(map[string]ipamDriver)
}
ir.drivers[name] = ipamDriver{driver: driver, capability: caps}
return nil
}
// RegisterIpamDriver registers the IPAM driver discovered with default capabilities.
func (ir *IPAMs) RegisterIpamDriver(name string, driver ipamapi.Ipam) error {
return ir.RegisterIpamDriverWithCapabilities(name, driver, &ipamapi.Capability{})
}
// IPAMWalkFunc defines the IPAM driver table walker function signature.
type IPAMWalkFunc func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool
// WalkIPAMs walks the IPAM drivers registered in the registry and invokes the passed walk function and each one of them.
func (ir *IPAMs) WalkIPAMs(ifn IPAMWalkFunc) {
type ipamVal struct {
name string
data ipamDriver
}
ir.mu.Lock()
ivl := make([]ipamVal, 0, len(ir.drivers))
for k, v := range ir.drivers {
ivl = append(ivl, ipamVal{name: k, data: v})
}
ir.mu.Unlock()
for _, iv := range ivl {
if ifn(iv.name, iv.data.driver, iv.data.capability) {
break
}
}
}