Files
paralus/pkg/leaderelection/election.go
nirav-rafay c66bdc25cd restructure rcloud-base as a single base controller (#37)
* restructure rcloud-base as a single base controller
* updated master.rest
* moved sentry from internal to pkg as it is used by relay
* removing unused rpc and it's dependencies
* Fix usermgmt tests
* Don't redefine variables in rest file
Co-authored-by: Abin Simon <abin.simon@rafay.co>
2022-03-03 17:59:06 +05:30

52 lines
1.3 KiB
Go

package leaderelection
import (
"context"
log "github.com/RafaySystems/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
}