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  }