Skip to content

Commit f60f299

Browse files
committed
Add VolumeStats for Windows
add support for getting volume stats for windows
1 parent e266c21 commit f60f299

File tree

5 files changed

+44
-11
lines changed

5 files changed

+44
-11
lines changed

cmd/gce-pd-csi-driver/main.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,10 @@ func handle() {
9696
klog.Fatalf("Failed to get safe mounter: %v", err)
9797
}
9898
deviceUtils := mountmanager.NewDeviceUtils()
99-
statter := mountmanager.NewStatter()
99+
statter, err := mountmanager.NewStatter()
100+
if err != nil {
101+
klog.Fatalf("Failed to set up Statter: %v", err)
102+
}
100103
meta, err := metadataservice.NewMetadataService()
101104
if err != nil {
102105
klog.Fatalf("Failed to set up metadata service: %v", err)

pkg/gce-pd-csi-driver/node.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ func (ns *GCENodeServer) NodeGetVolumeStats(ctx context.Context, req *csi.NodeGe
385385
return nil, status.Error(codes.InvalidArgument, "NodeGetVolumeStats volume path was empty")
386386
}
387387

388-
_, err := os.Stat(req.VolumePath)
388+
_, err := os.Lstat(req.VolumePath)
389389
if err != nil {
390390
if os.IsNotExist(err) {
391391
return nil, status.Errorf(codes.NotFound, "path %s does not exist", req.VolumePath)
@@ -411,7 +411,6 @@ func (ns *GCENodeServer) NodeGetVolumeStats(ctx context.Context, req *csi.NodeGe
411411
},
412412
}, nil
413413
}
414-
415414
available, capacity, used, inodesFree, inodes, inodesUsed, err := ns.VolumeStatter.StatFS(req.VolumePath)
416415
if err != nil {
417416
return nil, status.Errorf(codes.Internal, "failed to get fs info on path %s: %v", req.VolumePath, err)

pkg/gce-pd-csi-driver/utils_windows.go

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package gceGCEDriver
1717

1818
import (
1919
"fmt"
20+
2021
"k8s.io/utils/mount"
2122
"sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common"
2223
mounter "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager"

pkg/mount-manager/statter_linux.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ var _ Statter = realStatter{}
2525
type realStatter struct {
2626
}
2727

28-
func NewStatter() realStatter {
29-
return realStatter{}
28+
func NewStatter() (realStatter, error) {
29+
return realStatter{}, nil
3030
}
3131

3232
// IsBlock checks if the given path is a block device

pkg/mount-manager/statter_windows.go

+36-6
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,57 @@ limitations under the License.
1616
package mountmanager
1717

1818
import (
19-
"fmt"
19+
"context"
20+
21+
volumeapi "github.com/kubernetes-csi/csi-proxy/client/api/volume/v1beta1"
22+
volumeclient "github.com/kubernetes-csi/csi-proxy/client/groups/volume/v1beta1"
2023
)
2124

2225
var _ Statter = realStatter{}
2326

2427
type realStatter struct {
28+
VolumeClient *volumeclient.Client
2529
}
2630

27-
func NewStatter() realStatter {
28-
return realStatter{}
31+
func NewStatter() (realStatter, error) {
32+
volumeClient, err := volumeclient.NewClient()
33+
if err != nil {
34+
return realStatter{}, err
35+
}
36+
return realStatter{
37+
VolumeClient: volumeClient,
38+
}, nil
2939
}
3040

3141
// IsBlock checks if the given path is a block device
3242
func (realStatter) IsBlockDevice(fullPath string) (bool, error) {
3343
return false, nil
3444
}
3545

36-
//TODO (jinxu): implement StatFS to get metrics
37-
func (realStatter) StatFS(path string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
46+
// StatFS returns volume usage information
47+
func (r realStatter) StatFS(path string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
3848
zero := int64(0)
39-
return zero, zero, zero, zero, zero, zero, fmt.Errorf("Not implemented")
49+
50+
idRequest := &volumeapi.VolumeIDFromMountRequest{
51+
Mount: path,
52+
}
53+
idResponse, err := r.VolumeClient.GetVolumeIDFromMount(context.Background(), idRequest)
54+
if err != nil {
55+
return zero, zero, zero, zero, zero, zero, err
56+
}
57+
volumeId := idResponse.GetVolumeId()
58+
59+
request := &volumeapi.VolumeStatsRequest{
60+
VolumeId: volumeId,
61+
}
62+
response, err := r.VolumeClient.VolumeStats(context.Background(), request)
63+
if err != nil {
64+
return zero, zero, zero, zero, zero, zero, err
65+
}
66+
capacity = response.GetVolumeSize()
67+
used = response.GetVolumeUsedSize()
68+
available = capacity - used
69+
return available, capacity, used, zero, zero, zero, nil
4070
}
4171

4272
type fakeStatter struct{}

0 commit comments

Comments
 (0)