|
@@ -0,0 +1,100 @@
|
|
|
+// Package ipam that specifies the contract the IPAM plugin need to satisfy,
|
|
|
+// decoupling IPAM interface and implementation.
|
|
|
+package ipam
|
|
|
+
|
|
|
+import (
|
|
|
+ "errors"
|
|
|
+ "net"
|
|
|
+)
|
|
|
+
|
|
|
+/**************
|
|
|
+ * IPAM Errors
|
|
|
+ **************/
|
|
|
+
|
|
|
+// ErrIpamNotAvailable is returned when the plugin prviding the IPAM service is not available
|
|
|
+var (
|
|
|
+ ErrInvalidIpamService = errors.New("Invalid IPAM Service")
|
|
|
+ ErrInvalidIpamConfigService = errors.New("Invalid IPAM Config Service")
|
|
|
+ ErrIpamNotAvailable = errors.New("IPAM Service not available")
|
|
|
+ ErrIpamInternalError = errors.New("IPAM Internal Error")
|
|
|
+ ErrInvalidAddressSpace = errors.New("Invalid Address Space")
|
|
|
+ ErrInvalidSubnet = errors.New("Invalid Subnet")
|
|
|
+ ErrInvalidRequest = errors.New("Invalid Request")
|
|
|
+ ErrSubnetNotFound = errors.New("Subnet not found")
|
|
|
+ ErrOverlapSubnet = errors.New("Subnet overlaps with existing subnet on this address space")
|
|
|
+ ErrNoAvailableSubnet = errors.New("No available subnet")
|
|
|
+ ErrNoAvailableIPs = errors.New("No available addresses on subnet")
|
|
|
+ ErrIPAlreadyAllocated = errors.New("Address already in use")
|
|
|
+ ErrIPOutOfRange = errors.New("Requested address is out of range")
|
|
|
+ ErrSubnetAlreadyRegistered = errors.New("Subnet already registered on this address space")
|
|
|
+ ErrBadSubnet = errors.New("Address space does not contain specified subnet")
|
|
|
+)
|
|
|
+
|
|
|
+// AddressSpace identifies a unique pool of network addresses
|
|
|
+type AddressSpace string
|
|
|
+
|
|
|
+/*******************************
|
|
|
+ * IPAM Configuration Interface
|
|
|
+ *******************************/
|
|
|
+
|
|
|
+// Config represents the interface the IPAM service plugins must implement
|
|
|
+// in order to allow injection/modification of IPAM database.
|
|
|
+// Common key is a addressspace
|
|
|
+type Config interface {
|
|
|
+ // AddSubnet adds a subnet to the specified address space
|
|
|
+ AddSubnet(AddressSpace, *SubnetInfo) error
|
|
|
+ // RemoveSubnet removes a subnet from the specified address space
|
|
|
+ RemoveSubnet(AddressSpace, *net.IPNet) error
|
|
|
+ // AddVendorInfo adds Vendor specific data
|
|
|
+ AddVendorInfo([]byte) error
|
|
|
+}
|
|
|
+
|
|
|
+// SubnetInfo contains the information subnet hosts need in order to communicate
|
|
|
+type SubnetInfo struct {
|
|
|
+ Subnet *net.IPNet
|
|
|
+ Gateway net.IP
|
|
|
+ OpaqueData []byte // Vendor specific
|
|
|
+}
|
|
|
+
|
|
|
+/*************************
|
|
|
+ * IPAM Service Interface
|
|
|
+ *************************/
|
|
|
+
|
|
|
+// IPAM defines the interface that needs to be implemented by IPAM service plugin
|
|
|
+// Common key is a unique address space identifier
|
|
|
+type IPAM interface {
|
|
|
+ // Request address from the specified address space
|
|
|
+ Request(AddressSpace, *AddressRequest) (*AddressResponse, error)
|
|
|
+ // Separate API for IPv6
|
|
|
+ RequestV6(AddressSpace, *AddressRequest) (*AddressResponse, error)
|
|
|
+ // Release the address from the specified address space
|
|
|
+ Release(AddressSpace, net.IP)
|
|
|
+}
|
|
|
+
|
|
|
+// AddressRequest encloses the information a client
|
|
|
+// needs to pass to IPAM when requesting an address
|
|
|
+type AddressRequest struct {
|
|
|
+ Subnet net.IPNet // Preferred subnet pool (Optional)
|
|
|
+ Address net.IP // Preferred address (Optional)
|
|
|
+ Endpoint string // For static IP mapping (Optional)
|
|
|
+ OpaqueData []byte // Vendor specific request data
|
|
|
+}
|
|
|
+
|
|
|
+// Validate runs syntactic validation on this AddressRequest object
|
|
|
+func (req *AddressRequest) Validate() error {
|
|
|
+ var byteArray []byte = req.Address
|
|
|
+
|
|
|
+ // Check preferred address
|
|
|
+ if byteArray != nil && (&req.Subnet == nil || !req.Subnet.Contains(req.Address)) {
|
|
|
+ return ErrInvalidRequest
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// AddressResponse represents the IPAM service's
|
|
|
+// response to an address request
|
|
|
+type AddressResponse struct {
|
|
|
+ Address net.IP
|
|
|
+ Subnet SubnetInfo
|
|
|
+}
|