type Interface … var ErrFull … var ErrAllocated … var ErrMismatchedNetwork … type ErrNotInRange … func (e *ErrNotInRange) Error() string { … } type PortAllocator … var _ … // New creates a PortAllocator over a net.PortRange, calling allocatorFactory to construct the backing store. func New(pr net.PortRange, allocatorFactory allocator.AllocatorWithOffsetFactory) (*PortAllocator, error) { … } // NewInMemory creates an in-memory allocator. func NewInMemory(pr net.PortRange) (*PortAllocator, error) { … } // NewFromSnapshot allocates a PortAllocator and initializes it from a snapshot. func NewFromSnapshot(snap *api.RangeAllocation) (*PortAllocator, error) { … } // Free returns the count of port left in the range. func (r *PortAllocator) Free() int { … } // Used returns the count of ports used in the range. func (r *PortAllocator) Used() int { … } // Allocate attempts to reserve the provided port. ErrNotInRange or // ErrAllocated will be returned if the port is not valid for this range // or has already been reserved. ErrFull will be returned if there // are no ports left. func (r *PortAllocator) Allocate(port int) error { … } // AllocateNext reserves one of the ports from the pool. ErrFull may // be returned if there are no ports left. func (r *PortAllocator) AllocateNext() (int, error) { … } // ForEach calls the provided function for each allocated port. func (r *PortAllocator) ForEach(fn func(int)) { … } // Release releases the port back to the pool. Releasing an // unallocated port or a port out of the range is a no-op and // returns no error. func (r *PortAllocator) Release(port int) error { … } // Has returns true if the provided port is already allocated and a call // to Allocate(port) would fail with ErrAllocated. func (r *PortAllocator) Has(port int) bool { … } // Snapshot saves the current state of the pool. func (r *PortAllocator) Snapshot(dst *api.RangeAllocation) error { … } // Restore restores the pool to the previously captured state. ErrMismatchedNetwork // is returned if the provided port range doesn't exactly match the previous range. func (r *PortAllocator) Restore(pr net.PortRange, data []byte) error { … } // contains returns true and the offset if the port is in the range, and false // and nil otherwise. func (r *PortAllocator) contains(port int) (bool, int) { … } // Destroy shuts down internal allocator. func (r *PortAllocator) Destroy() { … } // EnableMetrics enables metrics recording. func (r *PortAllocator) EnableMetrics() { … } // calculateRangeOffset estimates the offset used on the range for statically allocation based on // the following formula `min(max($min, rangeSize/$step), $max)`, described as ~never less than // $min or more than $max, with a graduated step function between them~. The function returns 0 // if any of the parameters is invalid. func calculateRangeOffset(pr net.PortRange) int { … }