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  }