github.com/moby/docker@v26.1.3+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  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  }