@@ -61,13 +61,16 @@ type cephFSProvisioner struct {
61
61
identity string
62
62
// Namespace secrets will be created in. If empty, secrets will be created in each PVC's namespace.
63
63
secretNamespace string
64
+ // enable PVC quota
65
+ enableQuota bool
64
66
}
65
67
66
- func newCephFSProvisioner (client kubernetes.Interface , id string , secretNamespace string ) controller.Provisioner {
68
+ func newCephFSProvisioner (client kubernetes.Interface , id string , secretNamespace string , enableQuota bool ) controller.Provisioner {
67
69
return & cephFSProvisioner {
68
70
client : client ,
69
71
identity : id ,
70
72
secretNamespace : secretNamespace ,
73
+ enableQuota : enableQuota ,
71
74
}
72
75
}
73
76
@@ -129,7 +132,13 @@ func (p *cephFSProvisioner) Provision(options controller.VolumeOptions) (*v1.Per
129
132
}
130
133
// provision share
131
134
// create cmd
132
- cmd := exec .Command (provisionCmd , "-n" , share , "-u" , user )
135
+ args := []string {"-n" , share , "-u" , user }
136
+ if p .enableQuota {
137
+ capacity := options .PVC .Spec .Resources .Requests [v1 .ResourceName (v1 .ResourceStorage )]
138
+ requestBytes := strconv .FormatInt (capacity .Value (), 10 )
139
+ args = append (args , "-s" , requestBytes )
140
+ }
141
+ cmd := exec .Command (provisionCmd , args ... )
133
142
// set env
134
143
cmd .Env = []string {
135
144
"CEPH_CLUSTER_NAME=" + cluster ,
@@ -186,7 +195,10 @@ func (p *cephFSProvisioner) Provision(options controller.VolumeOptions) (*v1.Per
186
195
Spec : v1.PersistentVolumeSpec {
187
196
PersistentVolumeReclaimPolicy : options .PersistentVolumeReclaimPolicy ,
188
197
AccessModes : options .PVC .Spec .AccessModes ,
189
- Capacity : v1.ResourceList { //FIXME: kernel cephfs doesn't enforce quota, capacity is not meaningless here.
198
+ Capacity : v1.ResourceList {
199
+ // Quotas are supported by the userspace client(ceph-fuse, libcephfs), or kernel client >= 4.17 but only on mimic clusters.
200
+ // In other cases capacity is meaningless here.
201
+ // If quota is enabled, provisioner will set ceph.quota.max_bytes on volume path.
190
202
v1 .ResourceName (v1 .ResourceStorage ): options .PVC .Spec .Resources .Requests [v1 .ResourceName (v1 .ResourceStorage )],
191
203
},
192
204
PersistentVolumeSource : v1.PersistentVolumeSource {
@@ -337,6 +349,7 @@ var (
337
349
kubeconfig = flag .String ("kubeconfig" , "" , "Absolute path to the kubeconfig" )
338
350
id = flag .String ("id" , "" , "Unique provisioner identity" )
339
351
secretNamespace = flag .String ("secret-namespace" , "" , "Namespace secrets will be created in (default: '', created in each PVC's namespace)" )
352
+ enableQuota = flag .Bool ("enable-quota" , false , "Enable PVC quota" )
340
353
)
341
354
342
355
func main () {
@@ -387,7 +400,7 @@ func main() {
387
400
// Create the provisioner: it implements the Provisioner interface expected by
388
401
// the controller
389
402
glog .Infof ("Creating CephFS provisioner %s with identity: %s, secret namespace: %s" , prName , prID , * secretNamespace )
390
- cephFSProvisioner := newCephFSProvisioner (clientset , prID , * secretNamespace )
403
+ cephFSProvisioner := newCephFSProvisioner (clientset , prID , * secretNamespace , * enableQuota )
391
404
392
405
// Start the provision controller which will dynamically provision cephFS
393
406
// PVs
0 commit comments