@@ -90,6 +90,8 @@ func (r *RuleReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager)
9090// +kubebuilder:rbac:groups=readiness.node.x-k8s.io,resources=nodereadinessrules,verbs=get;list;watch;create;update;patch;delete
9191// +kubebuilder:rbac:groups=readiness.node.x-k8s.io,resources=nodereadinessrules/status,verbs=get;update;patch
9292// +kubebuilder:rbac:groups=readiness.node.x-k8s.io,resources=nodereadinessrules/finalizers,verbs=update
93+ // +kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch;delete
94+ // +kubebuilder:rbac:groups="",resources=nodes,verbs=get;list;watch;create;update;patch;delete
9395
9496func (r * RuleReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
9597 log := ctrl .LoggerFrom (ctx )
@@ -179,6 +181,7 @@ func (r *RuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.
179181// 1. Deletes the taints associated with the rule.
180182// 2. Remove the rule from the cache.
181183// 3. Remove the finalizer from the rule.
184+ // 4. Sync the Taints ConfigMap
182185func (r * RuleReconciler ) reconcileDelete (ctx context.Context , rule * readinessv1alpha1.NodeReadinessRule ) (ctrl.Result , error ) {
183186 log := ctrl .LoggerFrom (ctx )
184187
@@ -202,6 +205,13 @@ func (r *RuleReconciler) reconcileDelete(ctx context.Context, rule *readinessv1a
202205 if err != nil {
203206 return ctrl.Result {}, err
204207 }
208+
209+ // Sync taints to ConfigMap for MutatingAdmissionPolicy
210+ if err := r .Controller .syncTaintsConfigMap (ctx ); err != nil {
211+ log .Error (err , "Failed to sync taints configmap" , "rule" , rule .Name )
212+ // Don't fail reconciliation for this - log and continue
213+ }
214+
205215 return ctrl.Result {}, nil
206216}
207217
@@ -690,6 +700,10 @@ func (r *RuleReadinessController) syncTaintsConfigMap(ctx context.Context) error
690700 // Extract unique taint keys with readiness.k8s.io/ prefix and NoSchedule effect
691701 taintKeysSet := make (map [string ]struct {})
692702 for _ , rule := range ruleList .Items {
703+ // Skip rules that are being deleted
704+ if ! rule .DeletionTimestamp .IsZero () {
705+ continue
706+ }
693707 if rule .Spec .Taint .Key != "" &&
694708 strings .HasPrefix (rule .Spec .Taint .Key , "readiness.k8s.io/" ) &&
695709 rule .Spec .Taint .Effect == corev1 .TaintEffectNoSchedule {
@@ -733,7 +747,7 @@ func (r *RuleReadinessController) syncTaintsConfigMap(ctx context.Context) error
733747 } else {
734748 // Update existing ConfigMap
735749 log .V (1 ).Info ("Updating readiness-taints ConfigMap" , "taintCount" , len (taintKeys ))
736- patch := client .MergeFrom (existingCM )
750+ patch := client .MergeFrom (existingCM . DeepCopy () )
737751 existingCM .Data = cm .Data
738752 if err := r .Patch (ctx , existingCM , patch ); err != nil {
739753 return fmt .Errorf ("failed to update configmap: %w" , err )
0 commit comments