diff --git a/cmd/haproxy-lb/main.go b/cmd/haproxy-lb/main.go index 2da9db1..2da4a4b 100644 --- a/cmd/haproxy-lb/main.go +++ b/cmd/haproxy-lb/main.go @@ -23,6 +23,11 @@ var ( log logr.Logger ) +func fatal(err error, msg string) { + log.Error(err, msg) + os.Exit(1) +} + func main() { klog.InitFlags(nil) flag.StringVar(&configFile, "config", "haproxy-lb.yaml", "haproxy-lb config file") @@ -31,7 +36,7 @@ func main() { log.Info("starting haproxy-lb", "version", version) cfg, err := config.ParseFile(configFile) if err != nil { - klog.Fatalf("init failed: %s", err) + fatal(err, "init failed") } var c cluster.Cluster @@ -42,23 +47,25 @@ func main() { log.Info("creating cluster", "mode", "etcd") c = etcd.NewCluster(klogr.New().WithName("etcd")) } + log.Info("starting api server", "address", cfg.Server.Listen, "tls", cfg.Server.TLS != nil) srv, err := api.NewServer(cfg, log.WithName("api")) if err != nil { - klog.Fatalf("init failed: %s", err) + fatal(err, "init failed") } + log.Info("starting vip-controller") callbacks, err := controller.NewLBController(cfg, srv, log.WithName("vip-controller")) if err != nil { - klog.Fatalf("init failed: %s", err) + fatal(err, "init failed") } err = c.SetCallbacks(callbacks) if err != nil { - klog.Fatalf("init failed: %s", err) + fatal(err, "init failed") } go func() { err = c.Start(cfg) if err != nil { - klog.Fatalf("init failed: %s", err) + fatal(err, "init failed") } }() go func() { diff --git a/pkg/api/server.go b/pkg/api/server.go index 86d6220..30f4c3f 100644 --- a/pkg/api/server.go +++ b/pkg/api/server.go @@ -121,7 +121,6 @@ func (s *Server) UpdateDB(db *db.DB) error { } func (s *Server) start() { - <-s.init s.srv = &http.Server{ Handler: s.mux, TLSConfig: s.tlsConfig, @@ -129,6 +128,7 @@ func (s *Server) start() { WriteTimeout: 10 * time.Second, } go func() { + <-s.init err := s.srv.Serve(s.listen) if err != nil { s.log.Error(err, "") diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 387e2db..1ca96ec 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -25,7 +25,7 @@ type CallbackContext interface { logr.Logger KV ID() string - Fatal(error, string) + Fatal(error) } type Callbacks struct { diff --git a/pkg/controller/vip.go b/pkg/controller/vip.go index 16ad754..293f604 100644 --- a/pkg/controller/vip.go +++ b/pkg/controller/vip.go @@ -29,7 +29,8 @@ func NewLBController(cfg *config.Config, srv *api.Server, log logr.Logger) (call db := db.New(cc) err := srv.UpdateDB(db) if err != nil { - cc.Fatal(err, "error initialising api server as leader") + cc.Error(err, "error initialising api server as leader") + cc.Fatal(err) return } t := time.NewTicker(time.Second * 10) @@ -79,7 +80,8 @@ func NewLBController(cfg *config.Config, srv *api.Server, log logr.Logger) (call db := db.New(cc) err := srv.UpdateDB(db) if err != nil { - cc.Fatal(err, "error initialising api server as leader") + cc.Error(err, "error initialising api server as follower") + cc.Fatal(err) return } t := time.NewTicker(time.Second * 10) diff --git a/pkg/etcd/cluster.go b/pkg/etcd/cluster.go index 7e5dc04..b1d9645 100644 --- a/pkg/etcd/cluster.go +++ b/pkg/etcd/cluster.go @@ -30,6 +30,7 @@ type Cluster struct { keyID string session bool cancelSession func() + fatal error } func NewCluster(log logr.Logger) cluster.Cluster { diff --git a/pkg/etcd/etcd.go b/pkg/etcd/etcd.go index 47fa885..6b19c50 100644 --- a/pkg/etcd/etcd.go +++ b/pkg/etcd/etcd.go @@ -155,10 +155,10 @@ func (c *Cluster) Start(etcdcfg *config.Config) error { } s.Close() close(c.done) - return nil + return c.fatal } } - return nil + return c.fatal } func (c *Cluster) leaderID(r *clientv3.GetResponse, err error) string { @@ -197,8 +197,8 @@ func (c *Cluster) Stepdown() { } } -func (c *Cluster) Fatal(err error, msg string) { - c.Error(err, "a fatal error occurred", "message", msg) +func (c *Cluster) Fatal(err error) { + c.fatal = err c.Stop() } diff --git a/pkg/raft/cluster.go b/pkg/raft/cluster.go index f99f13d..3df7eb5 100644 --- a/pkg/raft/cluster.go +++ b/pkg/raft/cluster.go @@ -19,7 +19,8 @@ type Cluster struct { done chan struct{} callbacks cluster.Callbacks - id string + id string + fatal error } func NewCluster(log logr.Logger) cluster.Cluster { diff --git a/pkg/raft/raft.go b/pkg/raft/raft.go index 58470a5..9ab2aa7 100644 --- a/pkg/raft/raft.go +++ b/pkg/raft/raft.go @@ -160,10 +160,10 @@ func (c *Cluster) Start(raftcfg *config.Config) error { c.callbacks.Cleanup(ctx, c) } close(c.done) - return nil + return c.fatal } } - return nil + return c.fatal } func (c *Cluster) leader(ctx context.Context) { @@ -187,8 +187,8 @@ func (c *Cluster) Stepdown() { } } -func (c *Cluster) Fatal(err error, msg string) { - c.Error(err, "a fatal error occurred", "message", msg) +func (c *Cluster) Fatal(err error) { + c.fatal = err c.Stop() }