dotcloud/docker

View on GitHub
libnetwork/ipamapi/contract.go

Summary

Maintainability
A
0 mins
Test Coverage
// 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
}