| // Package ipamapi specifies the contract the IPAM service (built-in or remote) needs to satisfy. | |
| package ipamapi | |
| import ( | |
| "net" | |
| "net/netip" | |
| "github.com/docker/docker/libnetwork/types" | |
| ) | |
| // IPAM plugin types | |
| const ( | |
| // PluginEndpointType represents the Endpoint Type used by Plugin system | |
| PluginEndpointType = "IpamDriver" | |
| // RequestAddressType represents the Address Type used when requesting an address | |
| RequestAddressType = "RequestAddressType" | |
| ) | |
| // Registerer provides a callback interface for registering IPAM instances into libnetwork. | |
| type Registerer interface { | |
| // RegisterIpamDriver provides a way for drivers to dynamically register with libnetwork | |
| RegisterIpamDriver(name string, driver Ipam) error | |
| // RegisterIpamDriverWithCapabilities provides a way for drivers to dynamically register with libnetwork and specify capabilities | |
| RegisterIpamDriverWithCapabilities(name string, driver Ipam, capability *Capability) error | |
| } | |
| // Well-known errors returned by IPAM | |
| var ( | |
| ErrInvalidAddressSpace = types.InvalidParameterErrorf("invalid address space") | |
| ErrInvalidPool = types.InvalidParameterErrorf("invalid address pool") | |
| ErrInvalidSubPool = types.InvalidParameterErrorf("invalid address subpool") | |
| ErrNoAvailableIPs = types.UnavailableErrorf("no available addresses on this pool") | |
| ErrNoIPReturned = types.UnavailableErrorf("no address returned") | |
| ErrIPAlreadyAllocated = types.ForbiddenErrorf("Address already in use") | |
| ErrIPOutOfRange = types.InvalidParameterErrorf("requested address is out of range") | |
| ErrPoolOverlap = types.ForbiddenErrorf("Pool overlaps with other one on this address space") | |
| ErrBadPool = types.InvalidParameterErrorf("address space does not contain specified address pool") | |
| ErrNoMoreSubnets = types.InvalidParameterErrorf("all predefined address pools have been fully subnetted") | |
| ) | |
| // Ipam represents the interface the IPAM service plugins must implement | |
| // in order to allow injection/modification of IPAM database. | |
| type Ipam interface { | |
| // GetDefaultAddressSpaces returns the default local and global address spaces for this ipam | |
| GetDefaultAddressSpaces() (string, string, error) | |
| // RequestPool allocate an address pool either statically or dynamically | |
| // based on req. | |
| RequestPool(req PoolRequest) (AllocatedPool, error) | |
| // ReleasePool releases the address pool identified by the passed id | |
| ReleasePool(poolID string) error | |
| // RequestAddress request an address from the specified pool ID. Input options or required IP can be passed. | |
| RequestAddress(string, net.IP, map[string]string) (*net.IPNet, map[string]string, error) | |
| // ReleaseAddress releases the address from the specified pool ID. | |
| ReleaseAddress(string, net.IP) error | |
| // IsBuiltIn returns true if it is a built-in driver. | |
| IsBuiltIn() bool | |
| } | |
| type PoolRequest struct { | |
| // AddressSpace is a mandatory field which denotes which block of pools | |
| // should be used to make the allocation. This value is opaque, and only | |
| // the IPAM driver can interpret it. Each driver might support a different | |
| // set of AddressSpace. | |
| AddressSpace string | |
| // Pool is a prefix in CIDR notation. It's non-mandatory. When specified | |
| // the Pool will be statically allocated. The Pool is used for dynamic | |
| // address allocation -- except when SubPool is specified. | |
| Pool string | |
| // SubPool is a subnet from Pool, in CIDR notation too. It's non-mandatory. | |
| // When specified, it represents the subnet where addresses will be | |
| // dynamically allocated. It can't be specified if Pool isn't specified. | |
| SubPool string | |
| // Options is a map of opaque k/v passed to the driver. It's non-mandatory. | |
| // Drivers are free to ignore it. | |
| Options map[string]string | |
| // Exclude is a list of prefixes the requester wish to not be dynamically | |
| // allocated (ie. when Pool isn't specified). It's up to the IPAM driver to | |
| // take it into account, or totally ignore it. It's required to be sorted. | |
| Exclude []netip.Prefix | |
| // V6 indicates which address family should be used to dynamically allocate | |
| // a prefix (ie. when Pool isn't specified). | |
| V6 bool | |
| } | |
| type AllocatedPool struct { | |
| // PoolID represents the ID of the allocated pool. Its value is opaque and | |
| // shouldn't be interpreted by anything but the IPAM driver that generated | |
| // it. | |
| PoolID string | |
| // Pool is the allocated prefix. | |
| Pool netip.Prefix | |
| // Meta represents a list of extra IP addresses automatically reserved | |
| // during the pool allocation. These are generally keyed by well-known | |
| // strings defined in the netlabel package. | |
| Meta map[string]string | |
| } | |
| // Capability represents the requirements and capabilities of the IPAM driver | |
| type Capability struct { | |
| // Whether on address request, libnetwork must | |
| // specify the endpoint MAC address | |
| RequiresMACAddress bool | |
| // Whether of daemon start, libnetwork must replay the pool | |
| // request and the address request for current local networks | |
| RequiresRequestReplay bool | |
| } |