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