diff --git a/cmd/controller/leader_election.go b/cmd/controller/leader_election.go new file mode 100644 index 0000000000..c43d2df3ea --- /dev/null +++ b/cmd/controller/leader_election.go @@ -0,0 +1,61 @@ +package main + +import ( + "context" + "github.com/go-logr/logr" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/leaderelection" + "k8s.io/client-go/tools/leaderelection/resourcelock" + "k8s.io/klog/v2" + "os" + "time" +) + +var ( + client *clientset.Clientset +) + +func getNewLock(lockname, podname, namespace string) *resourcelock.LeaseLock { + return &resourcelock.LeaseLock{ + LeaseMeta: metav1.ObjectMeta{ + Name: lockname, + Namespace: namespace, + }, + Client: client.CoordinationV1(), + LockConfig: resourcelock.ResourceLockConfig{ + Identity: podname, + }, + } +} + +func runLeaderElection(ctx context.Context, lock *resourcelock.LeaseLock, podname string, ctrlOpts Options, log logr.Logger) { + // Start the leader election for running kapp-controller + log.Info("Waiting for leader election") + leaderelection.RunOrDie(ctx, leaderelection.LeaderElectionConfig{ + Lock: lock, + ReleaseOnCancel: true, + LeaseDuration: 15 * time.Second, + RenewDeadline: 10 * time.Second, + RetryPeriod: 2 * time.Second, + Callbacks: leaderelection.LeaderCallbacks{ + OnStartedLeading: func(c context.Context) { + err := Run(ctrlOpts, log.WithName("controller")) + if err != nil { + klog.Errorf("Error while running as leader: %v", err) + } + }, + OnStoppedLeading: func() { + klog.Fatalf("no longer the leader, staying inactive.") + os.Exit(0) + }, + OnNewLeader: func(identity string) { + //Notify when a new leader is elected + if identity == podname { + return + } + klog.InfoS("new leader elected", "id", identity) + }, + }, + }) +} diff --git a/cmd/controller/main.go b/cmd/controller/main.go index 07aa82d2b6..a11fb53577 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -6,12 +6,8 @@ package main import ( "context" "flag" - "github.com/go-logr/logr" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" - "k8s.io/client-go/tools/leaderelection" - "k8s.io/client-go/tools/leaderelection/resourcelock" "k8s.io/klog/v2" "os" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -22,54 +18,6 @@ import ( // Version of kapp-controller is set via ldflags at build-time from the most recent git tag; see hack/build.sh var Version = "develop" -var ( - client *clientset.Clientset -) - -func getNewLock(lockname, podname, namespace string) *resourcelock.LeaseLock { - return &resourcelock.LeaseLock{ - LeaseMeta: metav1.ObjectMeta{ - Name: lockname, - Namespace: namespace, - }, - Client: client.CoordinationV1(), - LockConfig: resourcelock.ResourceLockConfig{ - Identity: podname, - }, - } -} - -func runLeaderElection(ctx context.Context, lock *resourcelock.LeaseLock, podname string, ctrlOpts Options, log logr.Logger) { - // Start the leader election for running kapp-controller - log.Info("Waiting for leader election") - leaderelection.RunOrDie(ctx, leaderelection.LeaderElectionConfig{ - Lock: lock, - ReleaseOnCancel: true, - LeaseDuration: 15 * time.Second, - RenewDeadline: 10 * time.Second, - RetryPeriod: 2 * time.Second, - Callbacks: leaderelection.LeaderCallbacks{ - OnStartedLeading: func(c context.Context) { - err := Run(ctrlOpts, log.WithName("controller")) - if err != nil { - klog.Errorf("Error while running as leader: %v", err) - } - }, - OnStoppedLeading: func() { - klog.Fatalf("no longer the leader, staying inactive.") - os.Exit(0) - }, - OnNewLeader: func(identity string) { - //Notify when a new leader is elected - if identity == podname { - return - } - klog.InfoS("new leader elected", "id", identity) - }, - }, - }) -} - func main() { ctrlOpts := Options{} var sidecarexec bool