Skip to content

Commit 86338d7

Browse files
committed
configure resource reqs and limits via configMap
1 parent 7ea5a7a commit 86338d7

File tree

3 files changed

+117
-1
lines changed

3 files changed

+117
-1
lines changed

config/rbac/role.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ rules:
1212
- create
1313
- delete
1414
- get
15+
- list
16+
- update
17+
- watch
1518
- apiGroups:
1619
- ""
1720
resources:
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: cos-csi-driver-configmap
5+
namespace: ibm-object-csi-operator-system
6+
data:
7+
ReconcileStorageClasses: "true"
8+
#Resource Requests per container
9+
CSINodeCPURequest: "40m" #container:ibm-object-csi-node, resource-type: cpu-request
10+
CSINodeMemoryRequest: "40Mi" #container:ibm-object-csi-node, resource-type: memory-request
11+
12+
#Resource Limits per container
13+
CSINodeCPULimit: "4" #container:ibm-object-csi-node, resource-type: cpu-limit
14+
CSINodeMemoryLimit: "800Mi" #container:ibm-object-csi-node, resource-type: memory-limit

controllers/ibmobjectcsi_controller.go

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,20 @@ import (
3737
rbacv1 "k8s.io/api/rbac/v1"
3838
storagev1 "k8s.io/api/storage/v1"
3939
"k8s.io/apimachinery/pkg/api/errors"
40+
//"k8s.io/apimachinery/pkg/api/resource"
41+
//metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4042
"k8s.io/apimachinery/pkg/runtime"
4143
"k8s.io/apimachinery/pkg/runtime/schema"
4244
"k8s.io/apimachinery/pkg/types"
4345
"k8s.io/client-go/tools/record"
4446
ctrl "sigs.k8s.io/controller-runtime"
47+
"sigs.k8s.io/controller-runtime/pkg/builder"
4548
"sigs.k8s.io/controller-runtime/pkg/client"
4649
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
50+
"sigs.k8s.io/controller-runtime/pkg/event"
51+
"sigs.k8s.io/controller-runtime/pkg/handler"
4752
logf "sigs.k8s.io/controller-runtime/pkg/log"
53+
"sigs.k8s.io/controller-runtime/pkg/predicate"
4854
"sigs.k8s.io/controller-runtime/pkg/reconcile"
4955
)
5056

@@ -64,7 +70,7 @@ type IBMObjectCSIReconciler struct {
6470
//+kubebuilder:rbac:groups=objectdriver.csi.ibm.com,resources=ibmobjectcsis/status,verbs=get;update;patch
6571
//+kubebuilder:rbac:groups=objectdriver.csi.ibm.com,resources=ibmobjectcsis/finalizers,verbs=update
6672
//+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
6874
//+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch
6975
//+kubebuilder:rbac:groups="",resources=persistentvolumeclaims,verbs=get;list;watch;update;patch
7076
//+kubebuilder:rbac:groups="",resources=persistentvolumeclaims/status,verbs=get;update;patch
@@ -99,6 +105,13 @@ func (r *IBMObjectCSIReconciler) Reconcile(ctx context.Context, req ctrl.Request
99105
reqLogger.Info("Reconciling IBMObjectCSI")
100106
r.ControllerHelper.Log = csiLog
101107

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+
102115
// Fetch the CSIDriver instance
103116
instance := crutils.New(&objectdriverv1alpha1.IBMObjectCSI{})
104117
err := r.Get(ctx, req.NamespacedName, instance.Unwrap())
@@ -175,6 +188,62 @@ func (r *IBMObjectCSIReconciler) Reconcile(ctx context.Context, req ctrl.Request
175188
return reconcile.Result{}, nil
176189
}
177190

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+
178247
func (r *IBMObjectCSIReconciler) updateStatus(instance *crutils.IBMObjectCSI, originalStatus objectdriverv1alpha1.IBMObjectCSIStatus) error {
179248
logger := csiLog.WithName("updateStatus")
180249

@@ -507,5 +576,35 @@ func (r *IBMObjectCSIReconciler) SetupWithManager(mgr ctrl.Manager) error {
507576
Owns(&appsv1.Deployment{}).
508577
Owns(&appsv1.DaemonSet{}).
509578
Owns(&corev1.ServiceAccount{}).
579+
Watches(&corev1.ConfigMap{}, &handler.EnqueueRequestForObject{}, builder.WithPredicates(configMapPredicate())).
510580
Complete(r)
511581
}
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

Comments
 (0)