more work done
This commit is contained in:
parent
09fe1cd163
commit
6fda229a8e
23 changed files with 384 additions and 177 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue