Skip to content

Commit 39e5f5c

Browse files
authored
Update existing storageclasses mountOptions (#107)
*Update storageclasses for S3FS and rclone Signed-off-by: Mayank Sachan <[email protected]>
1 parent eb31ece commit 39e5f5c

File tree

5 files changed

+92
-62
lines changed

5 files changed

+92
-62
lines changed

controllers/ibmobjectcsi_controller.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ type IBMObjectCSIReconciler struct {
7979
//+kubebuilder:rbac:groups="",resources=nodes,verbs=get;list;watch
8080
//+kubebuilder:rbac:groups=apps,resources=deployments;daemonsets;statefulsets,verbs=get;list;watch;update;create;delete
8181
//+kubebuilder:rbac:groups="",resources=serviceaccounts,verbs=create;delete;get;watch;list
82-
//+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=clusterroles;clusterrolebindings,verbs=create;delete;get;watch;list;update
82+
//+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=clusterroles;clusterrolebindings,verbs=create;delete;get;watch;list;update;patch
8383
//+kubebuilder:rbac:groups=storage.k8s.io,resources=storageclasses,verbs=get;list;watch
8484
//+kubebuilder:rbac:groups=apps,resourceNames=ibm-object-csi-operator,resources=deployments/finalizers,verbs=update
8585
//+kubebuilder:rbac:groups=storage.k8s.io,resources=csidrivers,verbs=create;delete;get;watch;list
8686
//+kubebuilder:rbac:groups=storage.k8s.io,resources=csinodes,verbs=get;list;watch
8787
//+kubebuilder:rbac:groups=security.openshift.io,resourceNames=anyuid;privileged,resources=securitycontextconstraints,verbs=use
8888
//+kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=create;list;watch;delete
8989
//+kubebuilder:rbac:groups=objectdriver.csi.ibm.com,resources=*,verbs=*
90-
//+kubebuilder:rbac:groups=storage.k8s.io,resources=storageclasses,verbs=create;get;list;watch;delete;update
90+
//+kubebuilder:rbac:groups=storage.k8s.io,resources=storageclasses,verbs=create;get;list;watch;delete;update;patch
9191
//+kubebuilder:rbac:groups=config.openshift.io,resources=infrastructures,verbs=get;list
9292

9393
// Reconcile is part of the main kubernetes reconciliation loop which aims to
@@ -593,11 +593,23 @@ func (r *IBMObjectCSIReconciler) getStorageClasses(instance *crutils.IBMObjectCS
593593

594594
for _, sc := range cosSCs {
595595
for _, rp := range reclaimPolicys {
596-
k8sSc := instance.GenerateRcloneSC(rp, s3Provider, requiredRegion, cosEP, sc)
597-
k8sSCs = append(k8sSCs, k8sSc)
598-
599-
k8sSc = instance.GenerateS3fsSC(rp, s3Provider, requiredRegion, cosEP, sc)
600-
k8sSCs = append(k8sSCs, k8sSc)
596+
rcloneK8sSc := instance.GenerateRcloneSC(crutils.SCInputParams{
597+
ReclaimPolicy: rp,
598+
S3Provider: s3Provider,
599+
Region: requiredRegion,
600+
COSEndpoint: cosEP,
601+
COSStorageClass: sc,
602+
})
603+
k8sSCs = append(k8sSCs, rcloneK8sSc)
604+
605+
s3fsK8sSc := instance.GenerateS3fsSC(crutils.SCInputParams{
606+
ReclaimPolicy: rp,
607+
S3Provider: s3Provider,
608+
Region: requiredRegion,
609+
COSEndpoint: cosEP,
610+
COSStorageClass: sc,
611+
})
612+
k8sSCs = append(k8sSCs, s3fsK8sSc)
601613
}
602614
}
603615
return k8sSCs
@@ -664,6 +676,7 @@ func (r *IBMObjectCSIReconciler) SetupWithManager(mgr ctrl.Manager) error {
664676
Owns(&appsv1.Deployment{}).
665677
Owns(&appsv1.DaemonSet{}).
666678
Owns(&corev1.ServiceAccount{}).
679+
Owns(&storagev1.StorageClass{}).
667680
Watches(&corev1.ConfigMap{}, &handler.EnqueueRequestForObject{}, builder.WithPredicates(configMapPredicate())).
668681
Complete(r)
669682
}

controllers/internal/crutils/common.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,12 @@ func GetImagePullSecrets(imagePullSecrets []string) []corev1.LocalObjectReferenc
2323
}
2424
return secrets
2525
}
26+
27+
type SCInputParams struct {
28+
ReclaimPolicy corev1.PersistentVolumeReclaimPolicy
29+
S3Provider string
30+
Region string
31+
COSEndpoint string
32+
COSStorageClass string
33+
IsCrossRegional bool
34+
}

controllers/internal/crutils/static_resource_generator.go

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -225,22 +225,28 @@ func (c *IBMObjectCSI) GenerateSCCForNodeClusterRoleBinding() *rbacv1.ClusterRol
225225
}
226226

227227
// Generates3fsSC ...
228-
func (c *IBMObjectCSI) GenerateS3fsSC(reclaimPolicy corev1.PersistentVolumeReclaimPolicy, s3Provider string,
229-
region string, cosEndpoint string, cosStorageClass string) *storagev1.StorageClass {
228+
func (c *IBMObjectCSI) GenerateS3fsSC(scInputParams SCInputParams) *storagev1.StorageClass {
230229
var storageClassName, locationConstraint string
231-
232-
if reclaimPolicy == corev1.PersistentVolumeReclaimRetain {
233-
// "ibm-object-storage-standard-s3fs-retain"
234-
storageClassName = fmt.Sprintf("%s-%s-s3fs-%s", constants.StorageClassPrefix, cosStorageClass, constants.RetainPolicyTag)
230+
if scInputParams.S3Provider == constants.S3ProviderIBM {
231+
locationConstraint = fmt.Sprintf("%s-%s", scInputParams.Region, scInputParams.COSStorageClass)
235232
} else {
236-
// "ibm-object-storage-standard-s3fs"
237-
storageClassName = fmt.Sprintf("%s-%s-s3fs", constants.StorageClassPrefix, cosStorageClass)
233+
locationConstraint = scInputParams.Region
238234
}
239235

240-
if s3Provider == constants.S3ProviderIBM {
241-
locationConstraint = fmt.Sprintf("%s-%s", region, cosStorageClass)
242-
} else {
243-
locationConstraint = region
236+
// "ibm-object-storage-standard-s3fs"
237+
storageClassName = fmt.Sprintf("%s-%s-s3fs", constants.StorageClassPrefix, scInputParams.COSStorageClass)
238+
if scInputParams.ReclaimPolicy == corev1.PersistentVolumeReclaimRetain {
239+
storageClassName = fmt.Sprintf("%s-%s", storageClassName, constants.RetainPolicyTag) // "ibm-object-storage-standard-s3fs-retain"
240+
}
241+
242+
mountOptions := []string{
243+
"multipart_size=52",
244+
"multireq_max=20",
245+
"max_dirty_data=5120",
246+
"parallel_count=20",
247+
"max_stat_cache_size=100000",
248+
"retries=5",
249+
"kernel_cache",
244250
}
245251

246252
return &storagev1.StorageClass{
@@ -249,19 +255,12 @@ func (c *IBMObjectCSI) GenerateS3fsSC(reclaimPolicy corev1.PersistentVolumeRecla
249255
Labels: constants.CommonCSIResourceLabels,
250256
},
251257
Provisioner: constants.DriverName,
252-
ReclaimPolicy: &reclaimPolicy,
253-
MountOptions: []string{
254-
"multipart_size=62",
255-
"max_dirty_data=51200",
256-
"parallel_count=8",
257-
"max_stat_cache_size=100000",
258-
"retries=5",
259-
"kernel_cache",
260-
},
258+
ReclaimPolicy: &scInputParams.ReclaimPolicy,
259+
MountOptions: mountOptions,
261260
Parameters: map[string]string{
262261
"mounter": "s3fs",
263262
"client": "awss3",
264-
"cosEndpoint": cosEndpoint,
263+
"cosEndpoint": scInputParams.COSEndpoint,
265264
"locationConstraint": locationConstraint,
266265
"csi.storage.k8s.io/node-publish-secret-name": "${pvc.annotations['cos.csi.driver/secret']}",
267266
"csi.storage.k8s.io/node-publish-secret-namespace": "${pvc.namespace}",
@@ -270,22 +269,19 @@ func (c *IBMObjectCSI) GenerateS3fsSC(reclaimPolicy corev1.PersistentVolumeRecla
270269
}
271270

272271
// GenerateRcloneSC ...
273-
func (c *IBMObjectCSI) GenerateRcloneSC(reclaimPolicy corev1.PersistentVolumeReclaimPolicy, s3Provider string,
274-
region string, cosEndpoint string, cosStorageClass string) *storagev1.StorageClass {
272+
func (c *IBMObjectCSI) GenerateRcloneSC(scInputParams SCInputParams) *storagev1.StorageClass {
275273
var storageClassName, locationConstraint string
276274

277-
if reclaimPolicy == corev1.PersistentVolumeReclaimRetain {
278-
// "ibm-object-storage-standard-rclone-retain"
279-
storageClassName = fmt.Sprintf("%s-%s-rclone-%s", constants.StorageClassPrefix, cosStorageClass, constants.RetainPolicyTag)
280-
} else {
281-
// "ibm-object-storage-standard-rclone"
282-
storageClassName = fmt.Sprintf("%s-%s-rclone", constants.StorageClassPrefix, cosStorageClass)
275+
// "ibm-object-storage-standard-rclone"
276+
storageClassName = fmt.Sprintf("%s-%s-rclone", constants.StorageClassPrefix, scInputParams.COSStorageClass)
277+
if scInputParams.ReclaimPolicy == corev1.PersistentVolumeReclaimRetain {
278+
storageClassName = fmt.Sprintf("%s-%s", storageClassName, constants.RetainPolicyTag) // "ibm-object-storage-standard-rclone-retain"
283279
}
284280

285-
if s3Provider == constants.S3ProviderIBM {
286-
locationConstraint = fmt.Sprintf("%s-%s", region, cosStorageClass)
281+
if scInputParams.S3Provider == constants.S3ProviderIBM {
282+
locationConstraint = fmt.Sprintf("%s-%s", scInputParams.Region, scInputParams.COSStorageClass)
287283
} else {
288-
locationConstraint = region
284+
locationConstraint = scInputParams.Region
289285
}
290286

291287
return &storagev1.StorageClass{
@@ -294,22 +290,21 @@ func (c *IBMObjectCSI) GenerateRcloneSC(reclaimPolicy corev1.PersistentVolumeRec
294290
Labels: constants.CommonCSIResourceLabels,
295291
},
296292
Provisioner: constants.DriverName,
297-
ReclaimPolicy: &reclaimPolicy,
293+
ReclaimPolicy: &scInputParams.ReclaimPolicy,
298294
MountOptions: []string{
299295
"acl=private",
300296
"bucket_acl=private",
301-
"upload_cutoff=256Mi",
302-
"chunk_size=64Mi",
303-
"max_upload_parts=64",
304-
"upload_concurrency=20",
305-
"copy_cutoff=1Gi",
306-
"memory_pool_flush_time=30s",
297+
"upload_cutoff=100Mi",
298+
"chunk_size=16Mi",
299+
"max_upload_parts=1000",
300+
"upload_concurrency=8",
301+
"multi_thread_streams=8",
307302
"disable_checksum=true",
308303
},
309304
Parameters: map[string]string{
310305
"mounter": "rclone",
311306
"client": "awss3",
312-
"cosEndpoint": cosEndpoint,
307+
"cosEndpoint": scInputParams.COSEndpoint,
313308
"locationConstraint": locationConstraint,
314309
"csi.storage.k8s.io/node-publish-secret-name": "${pvc.annotations['cos.csi.driver/secret']}",
315310
"csi.storage.k8s.io/node-publish-secret-namespace": "${pvc.namespace}",

controllers/util/common/common.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type ControllerHelper struct {
3232
client.Client
3333
Log logr.Logger
3434
Region string
35-
CosEP string
35+
CosEP string // Regional COS Endpoint
3636
IaaSProvider string
3737
S3Provider string // IBM COS / AWS S3 / Wasabi
3838
S3ProviderRegion string
@@ -111,18 +111,29 @@ func (ch *ControllerHelper) ReconcileClusterRoleBinding(clusterRoleBindings []*r
111111
func (ch *ControllerHelper) ReconcileStorageClasses(storageclasses []*storagev1.StorageClass) error {
112112
logger := ch.Log.WithValues("Resource Type", "StorageClasses")
113113
for _, sc := range storageclasses {
114-
_, err := ch.getStorageClass(sc)
115-
if err != nil && k8sErr.IsNotFound(err) {
116-
logger.Info("Creating a new StorageClass", "Name", sc.GetName())
117-
err = ch.Create(context.TODO(), sc)
114+
k8sSC, err := ch.getStorageClass(sc)
115+
if err != nil {
116+
if k8sErr.IsNotFound(err) {
117+
logger.Info("Creating a new StorageClass", "Name", sc.GetName())
118+
err = ch.Create(context.TODO(), sc)
119+
if err != nil {
120+
return err
121+
}
122+
} else {
123+
logger.Error(err, "Failed to get StorageClass", "Name", sc.GetName())
124+
return err
125+
}
126+
} else {
127+
patch := client.MergeFrom(k8sSC.DeepCopy())
128+
//Apply SC MountOptions related changes only to existing storageclasses, if applicable
129+
k8sSC.MountOptions = sc.MountOptions
130+
err = ch.Patch(context.TODO(), k8sSC, patch)
118131
if err != nil {
132+
logger.Error(err, "Failed to patch StorageClass", "Name", k8sSC.GetName())
119133
return err
120134
}
121-
} else if err != nil {
122-
logger.Error(err, "Failed to get StorageClass", "Name", sc.GetName())
123-
return err
135+
logger.Info("Reconciled StorageClass", "Name", sc.GetName())
124136
}
125-
ch.Log.Info("Skip reconcile: StorageClass already exists", "Name", sc.GetName())
126137
}
127138
return nil
128139
}
@@ -169,7 +180,7 @@ func (ch *ControllerHelper) DeleteClusterRoles(clusterRoles []*rbacv1.ClusterRol
169180
func (ch *ControllerHelper) ReconcileClusterRole(clusterRoles []*rbacv1.ClusterRole) error {
170181
logger := ch.Log.WithValues("Resource Type", "ClusterRole")
171182
for _, cr := range clusterRoles {
172-
_, err := ch.getClusterRole(cr)
183+
k8sCR, err := ch.getClusterRole(cr)
173184
if err != nil && k8sErr.IsNotFound(err) {
174185
logger.Info("Creating a new ClusterRole", "Name", cr.GetName())
175186
err = ch.Create(context.TODO(), cr)
@@ -180,9 +191,11 @@ func (ch *ControllerHelper) ReconcileClusterRole(clusterRoles []*rbacv1.ClusterR
180191
logger.Error(err, "Failed to get ClusterRole", "Name", cr.GetName())
181192
return err
182193
} else {
183-
err = ch.Update(context.TODO(), cr)
194+
patch := client.MergeFrom(k8sCR.DeepCopy())
195+
k8sCR.Rules = cr.Rules
196+
err = ch.Patch(context.TODO(), k8sCR, patch)
184197
if err != nil {
185-
logger.Error(err, "Failed to update ClusterRole", "Name", cr.GetName())
198+
logger.Error(err, "Failed to patch ClusterRole", "Name", k8sCR.GetName())
186199
return err
187200
}
188201
}

version/version.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package version
33

44
var (
55
// Version ...
6-
Version = "1.0.12"
6+
Version = "1.0.13"
77
// DriverVersion ...
8-
DriverVersion = "1.0.12"
8+
DriverVersion = "1.0.13"
99
)

0 commit comments

Comments
 (0)