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