Skip to content

Commit ee26586

Browse files
Merge pull request #32 from IBM/bha-cpumemlimits
configure resource reqs and limits via configMap
2 parents fd55fe7 + 9ae5274 commit ee26586

File tree

6 files changed

+126
-6
lines changed

6 files changed

+126
-6
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
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/constants/constants.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ const (
6060
HealthPortName = "healthz"
6161
HealthPortNumber = 9808
6262

63-
DriverPrefix = "ibm-object-csi"
64-
6563
CSIController = "controller"
6664
CSINode = "node"
6765
CSIControllerServiceAccount = "controller-sa"
@@ -73,6 +71,10 @@ const (
7371
CSINodeSCCClusterRole = "node-scc-clusterrole"
7472
CSINodeSCCClusterRoleBinding = "node-scc-clusterrolebinding"
7573

74+
ResourceReqLimitsConfigMap = "cos-csi-driver-configmap"
75+
ObjectCSIDriverOperatorDeployNS = "ibm-object-csi-operator"
76+
ObjectCSIDriver = "ibm-object-csi"
77+
7678
StorageClassPrefix = "ibm-object-storage-"
7779
StorageClassSuffix = "-sc"
7880

@@ -94,5 +96,5 @@ var CommonCSIResourceLabels = map[string]string{
9496

9597
// GetResourceName returns the name of a resource for a CSI driver
9698
func GetResourceName(name string) string {
97-
return fmt.Sprintf("%s-%s", DriverPrefix, name)
99+
return fmt.Sprintf("%s-%s", ObjectCSIDriver, name)
98100
}

controllers/ibmobjectcsi_controller.go

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,13 @@ import (
4242
"k8s.io/apimachinery/pkg/types"
4343
"k8s.io/client-go/tools/record"
4444
ctrl "sigs.k8s.io/controller-runtime"
45+
"sigs.k8s.io/controller-runtime/pkg/builder"
4546
"sigs.k8s.io/controller-runtime/pkg/client"
4647
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
48+
"sigs.k8s.io/controller-runtime/pkg/event"
49+
"sigs.k8s.io/controller-runtime/pkg/handler"
4750
logf "sigs.k8s.io/controller-runtime/pkg/log"
51+
"sigs.k8s.io/controller-runtime/pkg/predicate"
4852
"sigs.k8s.io/controller-runtime/pkg/reconcile"
4953
)
5054

@@ -64,7 +68,7 @@ type IBMObjectCSIReconciler struct {
6468
//+kubebuilder:rbac:groups=objectdriver.csi.ibm.com,resources=ibmobjectcsis/status,verbs=get;update;patch
6569
//+kubebuilder:rbac:groups=objectdriver.csi.ibm.com,resources=ibmobjectcsis/finalizers,verbs=update
6670
//+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
6872
//+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch
6973
//+kubebuilder:rbac:groups="",resources=persistentvolumeclaims,verbs=get;list;watch;update;patch
7074
//+kubebuilder:rbac:groups="",resources=persistentvolumeclaims/status,verbs=get;update;patch
@@ -99,6 +103,13 @@ func (r *IBMObjectCSIReconciler) Reconcile(ctx context.Context, req ctrl.Request
99103
reqLogger.Info("Reconciling IBMObjectCSI")
100104
r.ControllerHelper.Log = csiLog
101105

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+
102113
// Fetch the CSIDriver instance
103114
instance := crutils.New(&objectdriverv1alpha1.IBMObjectCSI{})
104115
err := r.Get(ctx, req.NamespacedName, instance.Unwrap())
@@ -175,6 +186,66 @@ func (r *IBMObjectCSIReconciler) Reconcile(ctx context.Context, req ctrl.Request
175186
return reconcile.Result{}, nil
176187
}
177188

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

@@ -507,5 +578,35 @@ func (r *IBMObjectCSIReconciler) SetupWithManager(mgr ctrl.Manager) error {
507578
Owns(&appsv1.Deployment{}).
508579
Owns(&appsv1.DaemonSet{}).
509580
Owns(&corev1.ServiceAccount{}).
581+
Watches(&corev1.ConfigMap{}, &handler.EnqueueRequestForObject{}, builder.WithPredicates(configMapPredicate())).
510582
Complete(r)
511583
}
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+
}

controllers/ibmobjectcsi_controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ var (
185185
csiDriver = &storagev1.CSIDriver{
186186
ObjectMeta: metav1.ObjectMeta{
187187
Name: constants.DriverName,
188-
Labels: map[string]string{"app.kubernetes.io/name": constants.DriverPrefix},
188+
Labels: map[string]string{"app.kubernetes.io/name": constants.ObjectCSIDriver},
189189
},
190190
Spec: storagev1.CSIDriverSpec{
191191
AttachRequired: util.False(),

controllers/internal/crutils/static_resource_generator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func (c *IBMObjectCSI) GenerateCSIDriver() *storagev1.CSIDriver {
1818
ObjectMeta: metav1.ObjectMeta{
1919
Name: constants.DriverName,
2020
Labels: map[string]string{
21-
"app.kubernetes.io/name": constants.DriverPrefix,
21+
"app.kubernetes.io/name": constants.ObjectCSIDriver,
2222
"app.kubernetes.io/part-of": constants.CSIDriverName,
2323
"app.kubernetes.io/managed-by": constants.CSIOperatorName,
2424
},

0 commit comments

Comments
 (0)