vipman/cmd/vipman/main.go
2020-11-15 18:39:16 +01:00

112 lines
2.4 KiB
Go

package main
import (
"flag"
"os"
"os/signal"
"syscall"
"git.giftfish.de/ston1th/vipman/pkg/cluster"
"git.giftfish.de/ston1th/vipman/pkg/config"
"git.giftfish.de/ston1th/vipman/pkg/controller"
"git.giftfish.de/ston1th/vipman/pkg/etcd"
"git.giftfish.de/ston1th/vipman/pkg/raft"
"github.com/go-logr/logr"
"k8s.io/klog/v2"
"k8s.io/klog/v2/klogr"
)
var (
configFile string
version string
log logr.Logger
)
func main() {
klog.InitFlags(nil)
flag.StringVar(&configFile, "config", "vipman.yaml", "vipman config file")
flag.Parse()
log = klogr.New().WithName("main")
log.Info("starting vipman", "version", version)
cfg, err := config.ParseFile(configFile)
if err != nil {
klog.Fatalf("init failed: %s", err)
}
var c cluster.Cluster
if cfg.Cluster.Raft != nil {
log.Info("creating cluster", "mode", "raft")
c = raft.NewCluster(klogr.New().WithName("raft"))
} else if cfg.Cluster.Etcd != nil {
log.Info("creating cluster", "mode", "etcd")
c = etcd.NewCluster(klogr.New().WithName("etcd"))
}
callbacks, err := controller.NewVIPController(cfg)
if err != nil {
klog.Fatalf("init failed: %s", err)
}
err = c.SetCallbacks(callbacks)
if err != nil {
klog.Fatalf("init failed: %s", err)
}
go func() {
err = c.Start(cfg)
if err != nil {
klog.Fatalf("init 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
log.Info("stopping vipman")
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")
if s == nil {
s = []byte{0}
} else {
s[0] = s[0] + 1
}
kv.Set("state", s)
s = kv.Get("state")
klog.Infof("[%s] l state: %d", cfg.LocalPeer.ID, s[0])
select {
case <-ctx.Done():
klog.Infof("[%s] leading canceled", cfg.LocalPeer.ID)
return
case <-ticker.C:
}
}
},
Follower: func(ctx context.Context, kv cluster.KV) {
ticker := time.NewTicker(time.Second * 2)
for {
s := kv.Get("state")
if s != nil {
klog.Infof("[%s] f state: %d", cfg.LocalPeer.ID, s[0])
}
select {
case <-ctx.Done():
klog.Infof("[%s] following canceled", cfg.LocalPeer.ID)
return
case <-ticker.C:
}
}
},
})
*/