@@ -30,6 +30,7 @@ import (
30
30
31
31
"k8s.io/apimachinery/pkg/util/wait"
32
32
"k8s.io/klog/v2"
33
+ "k8s.io/kubernetes/pkg/volume"
33
34
"k8s.io/kubernetes/pkg/volume/util"
34
35
"k8s.io/utils/mount"
35
36
@@ -252,8 +253,69 @@ func (d *Driver) NodeGetInfo(ctx context.Context, req *csi.NodeGetInfoRequest) (
252
253
}
253
254
254
255
// NodeGetVolumeStats get volume stats
255
- func (d * Driver ) NodeGetVolumeStats (ctx context.Context , in * csi.NodeGetVolumeStatsRequest ) (* csi.NodeGetVolumeStatsResponse , error ) {
256
- return nil , status .Error (codes .Unimplemented , "" )
256
+ func (d * Driver ) NodeGetVolumeStats (ctx context.Context , req * csi.NodeGetVolumeStatsRequest ) (* csi.NodeGetVolumeStatsResponse , error ) {
257
+ if len (req .VolumeId ) == 0 {
258
+ return nil , status .Error (codes .InvalidArgument , "NodeGetVolumeStats volume ID was empty" )
259
+ }
260
+ if len (req .VolumePath ) == 0 {
261
+ return nil , status .Error (codes .InvalidArgument , "NodeGetVolumeStats volume path was empty" )
262
+ }
263
+
264
+ _ , err := os .Stat (req .VolumePath )
265
+ if err != nil {
266
+ if os .IsNotExist (err ) {
267
+ return nil , status .Errorf (codes .NotFound , "path %s does not exist" , req .VolumePath )
268
+ }
269
+ return nil , status .Errorf (codes .Internal , "failed to stat file %s: %v" , req .VolumePath , err )
270
+ }
271
+
272
+ volumeMetrics , err := volume .NewMetricsStatFS (req .VolumePath ).GetMetrics ()
273
+ if err != nil {
274
+ return nil , status .Errorf (codes .Internal , "failed to get metrics: %v" , err )
275
+ }
276
+
277
+ available , ok := volumeMetrics .Available .AsInt64 ()
278
+ if ! ok {
279
+ return nil , status .Errorf (codes .Internal , "failed to transform volume available size(%v)" , volumeMetrics .Available )
280
+ }
281
+ capacity , ok := volumeMetrics .Capacity .AsInt64 ()
282
+ if ! ok {
283
+ return nil , status .Errorf (codes .Internal , "failed to transform volume capacity size(%v)" , volumeMetrics .Capacity )
284
+ }
285
+ used , ok := volumeMetrics .Used .AsInt64 ()
286
+ if ! ok {
287
+ return nil , status .Errorf (codes .Internal , "failed to transform volume used size(%v)" , volumeMetrics .Used )
288
+ }
289
+
290
+ inodesFree , ok := volumeMetrics .InodesFree .AsInt64 ()
291
+ if ! ok {
292
+ return nil , status .Errorf (codes .Internal , "failed to transform disk inodes free(%v)" , volumeMetrics .InodesFree )
293
+ }
294
+ inodes , ok := volumeMetrics .Inodes .AsInt64 ()
295
+ if ! ok {
296
+ return nil , status .Errorf (codes .Internal , "failed to transform disk inodes(%v)" , volumeMetrics .Inodes )
297
+ }
298
+ inodesUsed , ok := volumeMetrics .InodesUsed .AsInt64 ()
299
+ if ! ok {
300
+ return nil , status .Errorf (codes .Internal , "failed to transform disk inodes used(%v)" , volumeMetrics .InodesUsed )
301
+ }
302
+
303
+ return & csi.NodeGetVolumeStatsResponse {
304
+ Usage : []* csi.VolumeUsage {
305
+ {
306
+ Unit : csi .VolumeUsage_BYTES ,
307
+ Available : available ,
308
+ Total : capacity ,
309
+ Used : used ,
310
+ },
311
+ {
312
+ Unit : csi .VolumeUsage_INODES ,
313
+ Available : inodesFree ,
314
+ Total : inodes ,
315
+ Used : inodesUsed ,
316
+ },
317
+ },
318
+ }, nil
257
319
}
258
320
259
321
// NodeExpandVolume node expand volume
0 commit comments