From c6c5dc193bde63c423f8c301d8bdc533fd8ab186 Mon Sep 17 00:00:00 2001 From: Mark Lopez Date: Tue, 24 May 2022 13:04:29 -0500 Subject: [PATCH] Added flag to support listening to resource changes when not leader. --- .../Controller/ResourceControllerManager.cs | 8 ++++++-- src/KubeOps/Operator/OperatorSettings.cs | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/KubeOps/Operator/Controller/ResourceControllerManager.cs b/src/KubeOps/Operator/Controller/ResourceControllerManager.cs index b80c820a..3a9d1b05 100644 --- a/src/KubeOps/Operator/Controller/ResourceControllerManager.cs +++ b/src/KubeOps/Operator/Controller/ResourceControllerManager.cs @@ -11,16 +11,19 @@ internal class ResourceControllerManager : IHostedService { private readonly IControllerInstanceBuilder _controllerInstanceBuilder; private readonly ILeaderElection _leaderElection; + private readonly OperatorSettings _operatorSettings; private readonly List _controllerList; private IDisposable? _leadershipSubscription; public ResourceControllerManager( IControllerInstanceBuilder controllerInstanceBuilder, - ILeaderElection leaderElection) + ILeaderElection leaderElection, + OperatorSettings operatorSettings) { _controllerInstanceBuilder = controllerInstanceBuilder; _leaderElection = leaderElection; + _operatorSettings = operatorSettings; _controllerList = new List(); } @@ -54,7 +57,8 @@ private void LeadershipChanged(LeaderState state) foreach (var controller in _controllerList) { - if (state == LeaderState.Leader) + if (state == LeaderState.Leader + || !_operatorSettings.OnlyWatchEventsWhenLeader) { controller.StartAsync(); } diff --git a/src/KubeOps/Operator/OperatorSettings.cs b/src/KubeOps/Operator/OperatorSettings.cs index 0a1800bf..5f1cb570 100644 --- a/src/KubeOps/Operator/OperatorSettings.cs +++ b/src/KubeOps/Operator/OperatorSettings.cs @@ -94,6 +94,22 @@ public sealed class OperatorSettings /// public bool EnableLeaderElection { get; set; } = true; + /// + /// + /// If set to true, controllers will only watch for new events when in a leader state, + /// or if leadership is disabled. When false, this check is disabled, + /// controllers will always watch for resource changes regardless of leadership state. + /// + /// + /// If this is disabled, you should consider checking leadership state manually, + /// to prevent a "split brain" problem. + /// + /// + /// Defaults to true. + /// + /// + public bool OnlyWatchEventsWhenLeader { get; set; } = true; + /// /// The interval in seconds in which this particular instance of the operator /// will check for leader election.