github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/libnetwork/drvregistry/ipams.go (about) 1 package drvregistry 2 3 import ( 4 "errors" 5 "strings" 6 "sync" 7 8 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/ipamapi" 9 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/types" 10 ) 11 12 type ipamDriver struct { 13 driver ipamapi.Ipam 14 capability *ipamapi.Capability 15 } 16 17 // IPAMs is a registry of IPAM drivers. The zero value is an empty IPAM driver 18 // registry, ready to use. 19 type IPAMs struct { 20 mu sync.Mutex 21 drivers map[string]ipamDriver 22 } 23 24 var _ ipamapi.Registerer = (*IPAMs)(nil) 25 26 // IPAM returns the actual IPAM driver instance and its capability which registered with the passed name. 27 func (ir *IPAMs) IPAM(name string) (ipamapi.Ipam, *ipamapi.Capability) { 28 ir.mu.Lock() 29 defer ir.mu.Unlock() 30 31 d := ir.drivers[name] 32 return d.driver, d.capability 33 } 34 35 // RegisterIpamDriverWithCapabilities registers the IPAM driver discovered with specified capabilities. 36 func (ir *IPAMs) RegisterIpamDriverWithCapabilities(name string, driver ipamapi.Ipam, caps *ipamapi.Capability) error { 37 if strings.TrimSpace(name) == "" { 38 return errors.New("ipam driver name string cannot be empty") 39 } 40 41 ir.mu.Lock() 42 defer ir.mu.Unlock() 43 44 dd, ok := ir.drivers[name] 45 if ok && dd.driver.IsBuiltIn() { 46 return types.ForbiddenErrorf("ipam driver %q already registered", name) 47 } 48 49 if ir.drivers == nil { 50 ir.drivers = make(map[string]ipamDriver) 51 } 52 ir.drivers[name] = ipamDriver{driver: driver, capability: caps} 53 54 return nil 55 } 56 57 // RegisterIpamDriver registers the IPAM driver discovered with default capabilities. 58 func (ir *IPAMs) RegisterIpamDriver(name string, driver ipamapi.Ipam) error { 59 return ir.RegisterIpamDriverWithCapabilities(name, driver, &ipamapi.Capability{}) 60 } 61 62 // IPAMWalkFunc defines the IPAM driver table walker function signature. 63 type IPAMWalkFunc func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool 64 65 // WalkIPAMs walks the IPAM drivers registered in the registry and invokes the passed walk function and each one of them. 66 func (ir *IPAMs) WalkIPAMs(ifn IPAMWalkFunc) { 67 type ipamVal struct { 68 name string 69 data ipamDriver 70 } 71 72 ir.mu.Lock() 73 ivl := make([]ipamVal, 0, len(ir.drivers)) 74 for k, v := range ir.drivers { 75 ivl = append(ivl, ipamVal{name: k, data: v}) 76 } 77 ir.mu.Unlock() 78 79 for _, iv := range ivl { 80 if ifn(iv.name, iv.data.driver, iv.data.capability) { 81 break 82 } 83 } 84 }