Documentation ¶
Overview ¶
Package ipam is a ip address management library for ip's and prefixes (networks).
It uses either memory or postgresql database to store the ip's and prefixes. You can also bring you own Storage implementation as you need.
Example usage:
import ( "fmt" goipam "github.com/cicdteam/go-ipam" ) func main() { // create a ipamer with in memory storage ipam := goipam.New() prefix, err := ipam.NewPrefix("192.168.0.0/24") if err != nil { panic(err) } ip, err := ipam.AcquireIP(prefix) if err != nil { panic(err) } fmt.Printf("got IP: %s", ip.IP) err = ipam.ReleaseIP(ip) if err != nil { panic(err) } fmt.Printf("IP: %s released.", ip.IP) }
Index ¶
- Constants
- Variables
- func PrefixesOverlapping(existingPrefixes []string, newPrefixes []string) error
- type AlreadyAllocatedError
- type IP
- type Ipamer
- type MongoConfig
- type NoIPAvailableError
- type NotFoundError
- type OptimisticLockError
- type Prefix
- type Prefixes
- type SSLMode
- type Storage
- func NewConfigmap(cmName string, cacheInternally bool) Storage
- func NewEtcd(ip, port string, cert, key []byte, insecureskip bool) Storage
- func NewMemory() Storage
- func NewMongo(ctx context.Context, config MongoConfig) (Storage, error)
- func NewPostgresStorage(host, port, user, password, dbname string, sslmode SSLMode) (Storage, error)
- func NewRedis(ip, port string) Storage
- type Usage
Constants ¶
const ( // SSLModeAllow I don't care about security // but I will pay the overhead of encryption if the server insists on it SSLModeAllow = SSLMode("allow") // SSLModeDisable I don't care about security // and I don't want to pay the overhead of encryption. SSLModeDisable = SSLMode("disable") // SSLModePrefer I don't care about encryption // but I wish to pay the overhead of encryption if the server supports it. SSLModePrefer = SSLMode("prefer") // SSLModeRequire I want my data to be encrypted and I accept the overhead. // I trust that the network will make sure I always connect to the server I want. SSLModeRequire = SSLMode("require") // SSLModeVerifyCA I want my data encrypted and I accept the overhead. // I want to be sure that I connect to a server that I trust. SSLModeVerifyCA = SSLMode("verify-ca") // SSLModeVerifyFull I want my data encrypted and I accept the overhead. // I want to be sure that I connect to a server I trust, and that it's the one I specify. SSLModeVerifyFull = SSLMode("verify-full") )
Variables ¶
var ( // ErrNotFound is returned if prefix or cidr was not found ErrNotFound NotFoundError // ErrNoIPAvailable is returned if no IP is available anymore ErrNoIPAvailable NoIPAvailableError // ErrAlreadyAllocated is returned if the requested address is not available ErrAlreadyAllocated AlreadyAllocatedError // ErrOptimisticLockError is returned if insert or update conflicts with the existing data ErrOptimisticLockError OptimisticLockError )
Functions ¶
func PrefixesOverlapping ¶
PrefixesOverlapping will check if one ore more prefix of newPrefixes is overlapping with one of existingPrefixes
Types ¶
type AlreadyAllocatedError ¶
type AlreadyAllocatedError struct { }
AlreadyAllocatedError is raised if the given address is already in use
func (AlreadyAllocatedError) Error ¶
func (o AlreadyAllocatedError) Error() string
type Ipamer ¶
type Ipamer interface { // NewPrefix create a new Prefix from a string notation. NewPrefix(ctx context.Context, cidr string) (*Prefix, error) // DeletePrefix delete a Prefix from a string notation. // If the Prefix is not found an NotFoundError is returned. DeletePrefix(ctx context.Context, cidr string) (*Prefix, error) // AcquireChildPrefix will return a Prefix with a smaller length from the given Prefix. AcquireChildPrefix(ctx context.Context, parentCidr string, length uint8) (*Prefix, error) // AcquireSpecificChildPrefix will return a Prefix with a smaller length from the given Prefix. AcquireSpecificChildPrefix(ctx context.Context, parentCidr, childCidr string) (*Prefix, error) // ReleaseChildPrefix will mark this child Prefix as available again. ReleaseChildPrefix(ctx context.Context, child *Prefix) error // PrefixFrom will return a known Prefix. PrefixFrom(ctx context.Context, cidr string) *Prefix // AcquireSpecificIP will acquire given IP and mark this IP as used, if already in use, return nil. // If specificIP is empty, the next free IP is returned. // If there is no free IP an NoIPAvailableError is returned. AcquireSpecificIP(ctx context.Context, prefixCidr, specificIP string) (*IP, error) // AcquireIP will return the next unused IP from this Prefix. AcquireIP(ctx context.Context, prefixCidr string) (*IP, error) // ReleaseIP will release the given IP for later usage and returns the updated Prefix. // If the IP is not found an NotFoundError is returned. ReleaseIP(ctx context.Context, ip *IP) (*Prefix, error) // ReleaseIPFromPrefix will release the given IP for later usage. // If the Prefix or the IP is not found an NotFoundError is returned. ReleaseIPFromPrefix(ctx context.Context, prefixCidr, ip string) error // Dump all stored prefixes as json formatted string Dump(ctx context.Context) (string, error) // Load a previously created json formatted dump, deletes all prefixes before loading Load(ctx context.Context, dump string) error // ReadAllPrefixCidrs retrieves all existing Prefix CIDRs from the underlying storage ReadAllPrefixCidrs(ctx context.Context) ([]string, error) }
Ipamer can be used to do IPAM stuff.
func New ¶
func New() Ipamer
New returns a Ipamer with in memory storage for networks, prefixes and ips.
func NewWithStorage ¶
NewWithStorage allows you to create a Ipamer instance with your Storage implementation. The Storage interface must be implemented.
type MongoConfig ¶
type MongoConfig struct { DatabaseName string CollectionName string MongoClientOptions *options.ClientOptions }
type NoIPAvailableError ¶
type NoIPAvailableError struct { }
NoIPAvailableError indicates that the acquire-operation could not be executed because the specified prefix has no free IP anymore.
func (NoIPAvailableError) Error ¶
func (o NoIPAvailableError) Error() string
type NotFoundError ¶
type NotFoundError struct { }
NotFoundError is raised if the given Prefix or Cidr was not found
func (NotFoundError) Error ¶
func (o NotFoundError) Error() string
type OptimisticLockError ¶
type OptimisticLockError struct { }
OptimisticLockError indicates that the operation could not be executed because the dataset to update has changed in the meantime. clients can decide to read the current dataset and retry the operation.
func (OptimisticLockError) Error ¶
func (o OptimisticLockError) Error() string
type Prefix ¶
type Prefix struct { Cidr string // The Cidr of this prefix ParentCidr string // if this prefix is a child this is a pointer back // contains filtered or unexported fields }
Prefix is a expression of a ip with length and forms a classless network.
type SSLMode ¶
type SSLMode string
SSLMode specifies how to configure ssl encryption to the database
type Storage ¶
type Storage interface { Name() string CreatePrefix(ctx context.Context, prefix Prefix) (Prefix, error) ReadPrefix(ctx context.Context, prefix string) (Prefix, error) DeleteAllPrefixes(ctx context.Context) error ReadAllPrefixes(ctx context.Context) (Prefixes, error) ReadAllPrefixCidrs(ctx context.Context) ([]string, error) UpdatePrefix(ctx context.Context, prefix Prefix) (Prefix, error) DeletePrefix(ctx context.Context, prefix Prefix) (Prefix, error) }
Storage is a interface to store ipam objects.
func NewConfigmap ¶
NewConfigmap create a redis storage for ipam
type Usage ¶
type Usage struct { // AvailableIPs the number of available IPs if this is not a parent prefix // No more than 2^31 available IPs are reported AvailableIPs uint64 // AcquiredIPs the number of acquired IPs if this is not a parent prefix AcquiredIPs uint64 // AvailableSmallestPrefixes is the count of available Prefixes with 2 countable Bits // No more than 2^31 available Prefixes are reported AvailableSmallestPrefixes uint64 // AvailablePrefixes is a list of prefixes which are available AvailablePrefixes []string // AcquiredPrefixes the number of acquired prefixes if this is a parent prefix AcquiredPrefixes uint64 }
Usage of ips and child Prefixes of a Prefix