ipams.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package drvregistry
  2. import (
  3. "errors"
  4. "strings"
  5. "sync"
  6. "github.com/docker/docker/libnetwork/ipamapi"
  7. "github.com/docker/docker/libnetwork/types"
  8. )
  9. type ipamDriver struct {
  10. driver ipamapi.Ipam
  11. capability *ipamapi.Capability
  12. }
  13. // IPAMs is a registry of IPAM drivers. The zero value is an empty IPAM driver
  14. // registry, ready to use.
  15. type IPAMs struct {
  16. mu sync.Mutex
  17. drivers map[string]ipamDriver
  18. }
  19. var _ ipamapi.Registerer = (*IPAMs)(nil)
  20. // IPAM returns the actual IPAM driver instance and its capability which registered with the passed name.
  21. func (ir *IPAMs) IPAM(name string) (ipamapi.Ipam, *ipamapi.Capability) {
  22. ir.mu.Lock()
  23. defer ir.mu.Unlock()
  24. d := ir.drivers[name]
  25. return d.driver, d.capability
  26. }
  27. // RegisterIpamDriverWithCapabilities registers the IPAM driver discovered with specified capabilities.
  28. func (ir *IPAMs) RegisterIpamDriverWithCapabilities(name string, driver ipamapi.Ipam, caps *ipamapi.Capability) error {
  29. if strings.TrimSpace(name) == "" {
  30. return errors.New("ipam driver name string cannot be empty")
  31. }
  32. ir.mu.Lock()
  33. defer ir.mu.Unlock()
  34. dd, ok := ir.drivers[name]
  35. if ok && dd.driver.IsBuiltIn() {
  36. return types.ForbiddenErrorf("ipam driver %q already registered", name)
  37. }
  38. if ir.drivers == nil {
  39. ir.drivers = make(map[string]ipamDriver)
  40. }
  41. ir.drivers[name] = ipamDriver{driver: driver, capability: caps}
  42. return nil
  43. }
  44. // RegisterIpamDriver registers the IPAM driver discovered with default capabilities.
  45. func (ir *IPAMs) RegisterIpamDriver(name string, driver ipamapi.Ipam) error {
  46. return ir.RegisterIpamDriverWithCapabilities(name, driver, &ipamapi.Capability{})
  47. }
  48. // IPAMWalkFunc defines the IPAM driver table walker function signature.
  49. type IPAMWalkFunc func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool
  50. // WalkIPAMs walks the IPAM drivers registered in the registry and invokes the passed walk function and each one of them.
  51. func (ir *IPAMs) WalkIPAMs(ifn IPAMWalkFunc) {
  52. type ipamVal struct {
  53. name string
  54. data ipamDriver
  55. }
  56. ir.mu.Lock()
  57. ivl := make([]ipamVal, 0, len(ir.drivers))
  58. for k, v := range ir.drivers {
  59. ivl = append(ivl, ipamVal{name: k, data: v})
  60. }
  61. ir.mu.Unlock()
  62. for _, iv := range ivl {
  63. if ifn(iv.name, iv.data.driver, iv.data.capability) {
  64. break
  65. }
  66. }
  67. }