github.com/rawahars/moby@v24.0.4+incompatible/libnetwork/drvregistry/networks.go (about) 1 package drvregistry 2 3 import ( 4 "errors" 5 "strings" 6 "sync" 7 8 "github.com/docker/docker/libnetwork/driverapi" 9 ) 10 11 // DriverWalkFunc defines the network driver table walker function signature. 12 type DriverWalkFunc func(name string, driver driverapi.Driver, capability driverapi.Capability) bool 13 14 // DriverNotifyFunc defines the notify function signature when a new network driver gets registered. 15 type DriverNotifyFunc func(name string, driver driverapi.Driver, capability driverapi.Capability) error 16 17 type driverData struct { 18 driver driverapi.Driver 19 capability driverapi.Capability 20 } 21 22 // Networks is a registry of network drivers. The zero value is an empty network 23 // driver registry, ready to use. 24 type Networks struct { 25 // Notify is called whenever a network driver is registered. 26 Notify DriverNotifyFunc 27 28 mu sync.Mutex 29 drivers map[string]driverData 30 } 31 32 var _ driverapi.Registerer = (*Networks)(nil) 33 34 // WalkDrivers walks the network drivers registered in the registry and invokes the passed walk function and each one of them. 35 func (nr *Networks) WalkDrivers(dfn DriverWalkFunc) { 36 type driverVal struct { 37 name string 38 data driverData 39 } 40 41 nr.mu.Lock() 42 dvl := make([]driverVal, 0, len(nr.drivers)) 43 for k, v := range nr.drivers { 44 dvl = append(dvl, driverVal{name: k, data: v}) 45 } 46 nr.mu.Unlock() 47 48 for _, dv := range dvl { 49 if dfn(dv.name, dv.data.driver, dv.data.capability) { 50 break 51 } 52 } 53 } 54 55 // Driver returns the network driver instance registered under name, and its capability. 56 func (nr *Networks) Driver(name string) (driverapi.Driver, driverapi.Capability) { 57 nr.mu.Lock() 58 defer nr.mu.Unlock() 59 60 d := nr.drivers[name] 61 return d.driver, d.capability 62 } 63 64 // RegisterDriver registers the network driver with nr. 65 func (nr *Networks) RegisterDriver(ntype string, driver driverapi.Driver, capability driverapi.Capability) error { 66 if strings.TrimSpace(ntype) == "" { 67 return errors.New("network type string cannot be empty") 68 } 69 70 nr.mu.Lock() 71 dd, ok := nr.drivers[ntype] 72 nr.mu.Unlock() 73 74 if ok && dd.driver.IsBuiltIn() { 75 return driverapi.ErrActiveRegistration(ntype) 76 } 77 78 if nr.Notify != nil { 79 if err := nr.Notify(ntype, driver, capability); err != nil { 80 return err 81 } 82 } 83 84 nr.mu.Lock() 85 defer nr.mu.Unlock() 86 87 if nr.drivers == nil { 88 nr.drivers = make(map[string]driverData) 89 } 90 nr.drivers[ntype] = driverData{driver: driver, capability: capability} 91 92 return nil 93 }