diff --git a/controllers/operator/nmstate_controller.go b/controllers/operator/nmstate_controller.go index 390392c69..b11752ac6 100644 --- a/controllers/operator/nmstate_controller.go +++ b/controllers/operator/nmstate_controller.go @@ -25,6 +25,7 @@ import ( "slices" "sort" "strings" + "time" "github.com/go-logr/logr" "github.com/pkg/errors" @@ -53,6 +54,12 @@ import ( const ( nmstateOperatorFieldOwner = client.FieldOwner("nmstate-operator") + + // The periodic resync interval. + // We will re-run the reconciliation logic, even if the NMState + // configuration hasn't changed. This ensures that externally + // modified resources (e.g. namespace annotations) are restored. + ResyncPeriod = 5 * time.Minute ) // NMStateReconciler reconciles a NMState object @@ -141,7 +148,7 @@ func (r *NMStateReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct } r.Log.Info("Reconcile complete.") - return ctrl.Result{}, nil + return ctrl.Result{RequeueAfter: ResyncPeriod}, nil } func (r *NMStateReconciler) SetupWithManager(mgr ctrl.Manager) error { diff --git a/controllers/operator/nmstate_controller_test.go b/controllers/operator/nmstate_controller_test.go index d3685a6b2..9f8346a06 100644 --- a/controllers/operator/nmstate_controller_test.go +++ b/controllers/operator/nmstate_controller_test.go @@ -218,10 +218,10 @@ var _ = Describe("NMState controller reconcile", func() { BeforeEach(func() { request.Name = existingNMStateName }) - It("should return a Result", func() { + It("should return a Result with RequeueAfter", func() { result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) }) Context("when one of manifest directory is empty", func() { @@ -272,7 +272,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should not add default NodeSelector to handler daemonset", func() { ds := &appsv1.DaemonSet{} @@ -313,7 +313,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should add Tolerations to handler daemonset", func() { ds := &appsv1.DaemonSet{} @@ -342,7 +342,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should add InfraNodeSelector to webhook deployment", func() { deployment := &appsv1.Deployment{} @@ -384,7 +384,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should add InfraTolerations to webhook deployment", func() { deployment := &appsv1.Deployment{} @@ -427,7 +427,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should add DNS probe host to handler daemonset", func() { ds := &appsv1.DaemonSet{} @@ -449,7 +449,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should apply network policies", func() { netpols := &networkingv1.NetworkPolicyList{} @@ -475,7 +475,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should add verbose arguments to handler daemonset container args", func() { ds := &appsv1.DaemonSet{} @@ -503,7 +503,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should not add verbose arguments to handler daemonset container args", func() { ds := &appsv1.DaemonSet{} @@ -530,7 +530,7 @@ var _ = Describe("NMState controller reconcile", func() { request.Name = existingNMStateName result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) It("should not add verbose arguments to handler daemonset container args", func() { ds := &appsv1.DaemonSet{} @@ -589,7 +589,7 @@ var _ = Describe("NMState controller reconcile", func() { result, err := reconciler.Reconcile(context.Background(), request) Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(ctrl.Result{})) + Expect(result).To(Equal(ctrl.Result{RequeueAfter: ResyncPeriod})) }) Context("On single node cluster", func() {