added raft over tls

This commit is contained in:
ston1th 2020-11-15 00:30:35 +01:00
commit 585baea183
16 changed files with 563 additions and 300 deletions

View file

@ -4,20 +4,45 @@ import (
"context"
"flag"
"os"
"os/exec"
"os/signal"
"path/filepath"
"syscall"
"time"
"git.giftfish.de/ston1th/vipman/pkg/cluster"
"git.giftfish.de/ston1th/vipman/pkg/config"
"git.giftfish.de/ston1th/vipman/pkg/raft"
"git.giftfish.de/ston1th/vipman/pkg/vip"
"k8s.io/klog"
"k8s.io/klog/klogr"
)
var (
configFile string
version string
)
func AddIPs(n *vip.Network, cidrs []string) error {
for _, cidr := range cidrs {
err := n.AddIP(cidr)
if err != nil {
klog.Infof("error adding ip %s to interface %s: %s", cidr, n.Interface(), err)
}
}
return nil
}
func DeleteIPs(n *vip.Network, cidrs []string) error {
for _, cidr := range cidrs {
err := n.DeleteIP(cidr)
if err != nil {
klog.Infof("error deleting ip %s from interface %s: %s", cidr, n.Interface(), err)
}
}
return nil
}
func main() {
klog.InitFlags(nil)
flag.StringVar(&configFile, "config", "vipman.yaml", "vipman config file")
@ -26,8 +51,95 @@ func main() {
if err != nil {
klog.Fatalf("Initialization failed: %s", err)
}
c, err := cluster.InitCluster(cluster.Callbacks{
Leader: func(ctx context.Context, kv *cluster.KV) {
n, err := vip.NewNetworkWithLabel(cfg.Interface, cfg.IPLabel)
if err != nil {
klog.Fatalf("Initialization failed: %s", err)
}
cc := cfg.Cluster.Raft
c, err := raft.NewCluster(cluster.Callbacks{
Leader: func(ctx context.Context, _ cluster.KV) {
t := time.NewTicker(time.Second * 10)
if cfg.LeaderHook != "" {
if !filepath.IsAbs(cfg.LeaderHook) {
klog.Infof("error running leaderHook %s: path is not absolute", cfg.LeaderHook)
} else {
go func() {
err := exec.CommandContext(ctx, cfg.LeaderHook).Run()
if err != nil {
klog.Infof("error running leaderHook %s: %s", cfg.LeaderHook, err)
}
}()
}
}
for {
klog.Infof("[%s] leading", cc.ID)
AddIPs(n, cfg.VirtualIPs)
select {
case <-ctx.Done():
t.Stop()
DeleteIPs(n, cfg.VirtualIPs)
klog.Infof("[%s] leading canceled", cc.ID)
return
case <-t.C:
}
}
},
Follower: func(ctx context.Context, _ cluster.KV) {
t := time.NewTicker(time.Second * 10)
if cfg.FollowerHook != "" {
if !filepath.IsAbs(cfg.FollowerHook) {
klog.Infof("error running followerHook %s: path is not absolute", cfg.FollowerHook)
} else {
go func() {
err := exec.CommandContext(ctx, cfg.FollowerHook).Run()
if err != nil {
klog.Infof("error running FollowerHook %s: %s", cfg.FollowerHook, err)
}
}()
}
}
for {
klog.Infof("[%s] following", cc.ID)
//DeleteIPs(n, cfg.VirtualIPs)
select {
case <-ctx.Done():
t.Stop()
klog.Infof("[%s] following canceled", cc.ID)
return
case <-t.C:
}
}
},
})
if err != nil {
klog.Fatalf("Initialization failed: %s", err)
}
log := klogr.New()
go func() {
err = c.Start(log, cfg)
if err != nil {
klog.Fatalf("Initialization failed: %s", err)
}
}()
go func() {
sig := make(chan os.Signal)
signal.Notify(sig, syscall.SIGHUP)
for {
<-sig
c.Stepdown()
}
}()
sigs := make(chan os.Signal)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
<-sigs
c.Stop()
DeleteIPs(n, cfg.VirtualIPs)
}
/*
c, err := raft.NewCluster(cluster.Callbacks{
Leader: func(ctx context.Context, kv cluster.KV) {
ticker := time.NewTicker(time.Second * 10)
for {
s := kv.Get("state")
@ -47,7 +159,7 @@ func main() {
}
}
},
Follower: func(ctx context.Context, kv *cluster.KV) {
Follower: func(ctx context.Context, kv cluster.KV) {
ticker := time.NewTicker(time.Second * 2)
for {
s := kv.Get("state")
@ -63,18 +175,4 @@ func main() {
}
},
})
if err != nil {
klog.Fatalf("Initialization failed: %s", err)
}
log := klogr.New()
go func() {
err = c.StartRaftCluster(log, cfg)
if err != nil {
klog.Fatalf("Initialization failed: %s", err)
}
}()
sigs := make(chan os.Signal)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
<-sigs
c.Stop()
}
*/