mirror of
https://github.com/paralus/paralus.git
synced 2026-05-06 16:36:46 +00:00
52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
package leaderelection
|
|
|
|
import (
|
|
"context"
|
|
|
|
log "github.com/RafayLabs/rcloud-base/pkg/log"
|
|
le "k8s.io/client-go/tools/leaderelection"
|
|
rl "k8s.io/client-go/tools/leaderelection/resourcelock"
|
|
)
|
|
|
|
var (
|
|
_log = log.GetLogger()
|
|
)
|
|
|
|
// Run runs leader election and calls onStarted when runner becomes leader
|
|
func Run(lock rl.Interface, onStarted func(stop <-chan struct{}), stop <-chan struct{}) error {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
_log.Infow("starting leader election", "for", lock.Describe(), "id", lock.Identity())
|
|
elector, err := le.NewLeaderElector(le.LeaderElectionConfig{
|
|
Lock: lock,
|
|
ReleaseOnCancel: true,
|
|
LeaseDuration: LeaseDuration,
|
|
RenewDeadline: RenewDeadline,
|
|
RetryPeriod: RetryPeriod,
|
|
Callbacks: le.LeaderCallbacks{
|
|
OnStartedLeading: func(_ context.Context) {
|
|
_log.Infow("started leading", "for", lock.Describe(), "id", lock.Identity())
|
|
onStarted(stop)
|
|
},
|
|
OnStoppedLeading: func() {
|
|
_log.Infow("stopped leading", "for", lock.Describe(), "id", lock.Identity())
|
|
},
|
|
OnNewLeader: func(identity string) {
|
|
_log.Infow("new leader", "for", lock.Describe(), "id", identity)
|
|
},
|
|
},
|
|
})
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
go elector.Run(ctx)
|
|
_log.Infow("started leader election", "for", lock.Describe(), "id", lock.Identity())
|
|
|
|
<-stop
|
|
|
|
return nil
|
|
|
|
}
|