@@ -42,9 +42,13 @@ import (
42
42
"k8s.io/apimachinery/pkg/types"
43
43
"k8s.io/client-go/tools/record"
44
44
ctrl "sigs.k8s.io/controller-runtime"
45
+ "sigs.k8s.io/controller-runtime/pkg/builder"
45
46
"sigs.k8s.io/controller-runtime/pkg/client"
46
47
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
48
+ "sigs.k8s.io/controller-runtime/pkg/event"
49
+ "sigs.k8s.io/controller-runtime/pkg/handler"
47
50
logf "sigs.k8s.io/controller-runtime/pkg/log"
51
+ "sigs.k8s.io/controller-runtime/pkg/predicate"
48
52
"sigs.k8s.io/controller-runtime/pkg/reconcile"
49
53
)
50
54
@@ -64,7 +68,7 @@ type IBMObjectCSIReconciler struct {
64
68
//+kubebuilder:rbac:groups=objectdriver.csi.ibm.com,resources=ibmobjectcsis/status,verbs=get;update;patch
65
69
//+kubebuilder:rbac:groups=objectdriver.csi.ibm.com,resources=ibmobjectcsis/finalizers,verbs=update
66
70
//+kubebuilder:rbac:groups="",resources=pods,verbs=get;delete;list;watch
67
- //+kubebuilder:rbac:groups="",resources=configmaps,verbs=get;create;delete
71
+ //+kubebuilder:rbac:groups="",resources=configmaps,verbs=get;create;delete;list;watch;update
68
72
//+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch
69
73
//+kubebuilder:rbac:groups="",resources=persistentvolumeclaims,verbs=get;list;watch;update;patch
70
74
//+kubebuilder:rbac:groups="",resources=persistentvolumeclaims/status,verbs=get;update;patch
@@ -99,6 +103,13 @@ func (r *IBMObjectCSIReconciler) Reconcile(ctx context.Context, req ctrl.Request
99
103
reqLogger .Info ("Reconciling IBMObjectCSI" )
100
104
r .ControllerHelper .Log = csiLog
101
105
106
+ // Check if the reconcile was triggered by the ConfigMap events
107
+ if req .Name == constants .ResourceReqLimitsConfigMap {
108
+ reqLogger .Info ("Reconcile triggered by ConfigMap event" )
109
+ // Handle the update of IBMObjectCSI
110
+ return r .handleConfigMapReconcile (ctx , req )
111
+ }
112
+
102
113
// Fetch the CSIDriver instance
103
114
instance := crutils .New (& objectdriverv1alpha1.IBMObjectCSI {})
104
115
err := r .Get (ctx , req .NamespacedName , instance .Unwrap ())
@@ -175,6 +186,66 @@ func (r *IBMObjectCSIReconciler) Reconcile(ctx context.Context, req ctrl.Request
175
186
return reconcile.Result {}, nil
176
187
}
177
188
189
+ // handleConfigMapReconcile handles reconciliation triggered by the ConfigMap event
190
+ func (r * IBMObjectCSIReconciler ) handleConfigMapReconcile (ctx context.Context , req ctrl.Request ) (reconcile.Result , error ) {
191
+ reqLogger := csiLog .WithValues ("Request.Namespace" , req .Namespace , "Request.Name" , req .Name )
192
+ reqLogger .Info ("Handling Reconcile IBMObjectCSI for ConfigMap event" )
193
+
194
+ // Fetch the ConfigMap instance
195
+ configMap := & corev1.ConfigMap {}
196
+ err := r .Get (ctx , req .NamespacedName , configMap )
197
+ if err != nil {
198
+ if errors .IsNotFound (err ) {
199
+ reqLogger .Info ("ConfigMap" , req .Name , "not found in namespace" , req .Namespace )
200
+ // what action should be taken when cm is not found?
201
+ } else {
202
+ reqLogger .Error (err , "Failed to get ConfigMap" , req .Name )
203
+ // Error reading the object - requeue the request.
204
+ return reconcile.Result {}, err
205
+ }
206
+ }
207
+
208
+ //get values from configMap
209
+ CSINodeCPURequest := configMap .Data ["CSINodeCPURequest" ]
210
+ CSINodeMemoryRequest := configMap .Data ["CSINodeMemoryRequest" ]
211
+ CSINodeCPULimit := configMap .Data ["CSINodeCPULimit" ]
212
+ CSINodeMemoryLimit := configMap .Data ["CSINodeMemoryLimit" ]
213
+
214
+ reqLogger .Info ("The resource requests and limits fetched from configmap" ,
215
+ "CSINodeCPURequest" , CSINodeCPURequest , "CSINodeMemoryRequest" , CSINodeMemoryRequest ,
216
+ "CSINodeCPULimit" , CSINodeCPULimit , "CSINodeMemoryLimit" , CSINodeMemoryLimit )
217
+
218
+ // Fetch the IBMObjectCSI instance
219
+ instance := & objectdriverv1alpha1.IBMObjectCSI {}
220
+
221
+ err = r .Get (ctx , types.NamespacedName {
222
+ Namespace : constants .ObjectCSIDriverOperatorDeployNS ,
223
+ Name : constants .ObjectCSIDriver },
224
+ instance )
225
+ if err != nil {
226
+ reqLogger .Error (err , "Failed to get IBMObjectCSI instance" )
227
+ return reconcile.Result {}, err
228
+ }
229
+ reqLogger .Info ("IBMObjectCSI CR fetched successfully" )
230
+
231
+ // Update the IBMObjectCSI instance with values from ConfigMap
232
+ instance .Spec .Node .Resources .Requests .CPU = CSINodeCPURequest
233
+ instance .Spec .Node .Resources .Requests .Memory = CSINodeMemoryRequest
234
+ instance .Spec .Node .Resources .Limits .CPU = CSINodeCPULimit
235
+ instance .Spec .Node .Resources .Limits .Memory = CSINodeMemoryLimit
236
+
237
+ // Update the instance in the Kubernetes API server
238
+ reqLogger .Info ("Updating IBMObjectCSI CR with resource requests and limits for Node pods" )
239
+ err = r .Update (ctx , instance )
240
+ if err != nil {
241
+ reqLogger .Error (err , "Failed to update IBMObjectCSI instance with ConfigMap values" )
242
+ return reconcile.Result {}, err
243
+ }
244
+ reqLogger .Info ("IBMObjectCSI CR is getting updated. Node pods will get restarted to reflect updated resource requests and limits" )
245
+
246
+ return reconcile.Result {}, nil
247
+ }
248
+
178
249
func (r * IBMObjectCSIReconciler ) updateStatus (instance * crutils.IBMObjectCSI , originalStatus objectdriverv1alpha1.IBMObjectCSIStatus ) error {
179
250
logger := csiLog .WithName ("updateStatus" )
180
251
@@ -507,5 +578,35 @@ func (r *IBMObjectCSIReconciler) SetupWithManager(mgr ctrl.Manager) error {
507
578
Owns (& appsv1.Deployment {}).
508
579
Owns (& appsv1.DaemonSet {}).
509
580
Owns (& corev1.ServiceAccount {}).
581
+ Watches (& corev1.ConfigMap {}, & handler.EnqueueRequestForObject {}, builder .WithPredicates (configMapPredicate ())).
510
582
Complete (r )
511
583
}
584
+
585
+ func configMapPredicate () predicate.Predicate {
586
+ logger := csiLog .WithName ("configMapPredicate" )
587
+ triggerReconcile := predicate.Funcs {
588
+ CreateFunc : func (e event.CreateEvent ) bool {
589
+ configmap := e .Object .(* corev1.ConfigMap )
590
+ if configmap .Name == constants .ResourceReqLimitsConfigMap {
591
+ logger .Info ("Create detected on the configmap" , "configmap" , configmap .Name )
592
+ return true
593
+ }
594
+ return false
595
+ },
596
+ UpdateFunc : func (e event.UpdateEvent ) bool {
597
+ configmap := e .ObjectNew .(* corev1.ConfigMap )
598
+ if configmap .Name == constants .ResourceReqLimitsConfigMap {
599
+ logger .Info ("Update detected on the configmap" , "configmap" , configmap .Name )
600
+ return true
601
+ }
602
+ return false
603
+ },
604
+ DeleteFunc : func (event.DeleteEvent ) bool {
605
+ return false
606
+ },
607
+ GenericFunc : func (event.GenericEvent ) bool {
608
+ return false
609
+ },
610
+ }
611
+ return triggerReconcile
612
+ }
0 commit comments