more work done

This commit is contained in:
ston1th 2021-03-06 16:51:36 +01:00
commit 6fda229a8e
23 changed files with 384 additions and 177 deletions

View file

@ -4,18 +4,21 @@ import (
"context"
"fmt"
"net"
"strings"
"sync"
"git.giftfish.de/ston1th/haproxy-lb/pkg/cluster"
"git.giftfish.de/ston1th/haproxy-lb/pkg/db"
"github.com/mikioh/ipaddr"
)
type Alloc struct {
kv cluster.KV
sync.Mutex
db *db.DB
pool []*net.IPNet
gateway *net.IPNet
}
func NewAlloc(kv cluster.KV, cidrs []string, gateway string) (*Alloc, error) {
func NewAlloc(db *db.DB, cidrs []string, gateway string) (*Alloc, error) {
pool, err := parseRange(cidrs)
if err != nil {
return nil, err
@ -24,26 +27,27 @@ func NewAlloc(kv cluster.KV, cidrs []string, gateway string) (*Alloc, error) {
if err != nil {
return nil, err
}
return &Alloc{kv, pool, gw}, nil
return &Alloc{db: db, pool: pool, gateway: gw}, nil
}
func (a *Alloc) UpdateDB(db *db.DB) {
a.Lock()
a.db = db
a.Unlock()
}
func (a *Alloc) AllocIP(ctx context.Context, name string) (addr string, err error) {
a.Lock()
defer a.Unlock()
for _, cidr := range a.pool {
c := ipaddr.NewCursor([]ipaddr.Prefix{*ipaddr.NewPrefix(a.gateway)})
c := ipaddr.NewCursor([]ipaddr.Prefix{*ipaddr.NewPrefix(cidr)})
for pos := c.First(); pos != nil; pos = c.Next() {
ip := pos.IP.String()
v, _ := a.kv.Get(ip)
vs := string(v)
if v == "" {
err = a.kv.Set(ip, []byte(name))
if !a.db.IPExists(ip) {
err = a.db.SetIP(ip, name)
if err != nil {
return
}
err = a.kv.Set(name, []byte(ip))
if err != nil {
a.kv.Delete(ip)
return
}
var gw *net.IPNet
*gw = *a.gateway
gw.IP = pos.IP
@ -52,28 +56,21 @@ func (a *Alloc) AllocIP(ctx context.Context, name string) (addr string, err erro
}
}
}
err = fmt.Errorf("no available IPs in pool")
err = fmt.Errorf("no more IPs available in pool")
return
}
func (a *Alloc) FreeIP(ctx context.Context, name string) (err error) {
a.Lock()
defer a.Unlock()
if name == "" {
return
}
v, err := a.kv.Get(name)
ip, err := a.db.GetName(name)
if err != nil {
return
}
vs := string(v)
err = a.kv.Delete(vs)
if err != nil {
return
}
err = a.kv.Delete(name)
if err != nil {
a.kv.Set(vs, []byte(name))
}
return
return a.db.DeleteIP(ip, name)
}
func parseRange(cidrs []string) (nets []*net.IPNet, err error) {