From f60f299386487b1422b701aee915f51c4264d799 Mon Sep 17 00:00:00 2001 From: Jing Xu Date: Thu, 8 Oct 2020 17:30:12 -0700 Subject: [PATCH] Add VolumeStats for Windows add support for getting volume stats for windows --- cmd/gce-pd-csi-driver/main.go | 5 ++- pkg/gce-pd-csi-driver/node.go | 3 +- pkg/gce-pd-csi-driver/utils_windows.go | 1 + pkg/mount-manager/statter_linux.go | 4 +-- pkg/mount-manager/statter_windows.go | 42 ++++++++++++++++++++++---- 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/cmd/gce-pd-csi-driver/main.go b/cmd/gce-pd-csi-driver/main.go index 02bd71a02..5ca735641 100644 --- a/cmd/gce-pd-csi-driver/main.go +++ b/cmd/gce-pd-csi-driver/main.go @@ -96,7 +96,10 @@ func handle() { klog.Fatalf("Failed to get safe mounter: %v", err) } deviceUtils := mountmanager.NewDeviceUtils() - statter := mountmanager.NewStatter() + statter, err := mountmanager.NewStatter() + if err != nil { + klog.Fatalf("Failed to set up Statter: %v", err) + } meta, err := metadataservice.NewMetadataService() if err != nil { klog.Fatalf("Failed to set up metadata service: %v", err) diff --git a/pkg/gce-pd-csi-driver/node.go b/pkg/gce-pd-csi-driver/node.go index 13df0e84e..b5ce9938e 100644 --- a/pkg/gce-pd-csi-driver/node.go +++ b/pkg/gce-pd-csi-driver/node.go @@ -385,7 +385,7 @@ func (ns *GCENodeServer) NodeGetVolumeStats(ctx context.Context, req *csi.NodeGe return nil, status.Error(codes.InvalidArgument, "NodeGetVolumeStats volume path was empty") } - _, err := os.Stat(req.VolumePath) + _, err := os.Lstat(req.VolumePath) if err != nil { if os.IsNotExist(err) { 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 }, }, nil } - available, capacity, used, inodesFree, inodes, inodesUsed, err := ns.VolumeStatter.StatFS(req.VolumePath) if err != nil { return nil, status.Errorf(codes.Internal, "failed to get fs info on path %s: %v", req.VolumePath, err) diff --git a/pkg/gce-pd-csi-driver/utils_windows.go b/pkg/gce-pd-csi-driver/utils_windows.go index 961f984bd..cfcd0c833 100644 --- a/pkg/gce-pd-csi-driver/utils_windows.go +++ b/pkg/gce-pd-csi-driver/utils_windows.go @@ -17,6 +17,7 @@ package gceGCEDriver import ( "fmt" + "k8s.io/utils/mount" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" mounter "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager" diff --git a/pkg/mount-manager/statter_linux.go b/pkg/mount-manager/statter_linux.go index 1b1d4fe03..3de01f6ec 100644 --- a/pkg/mount-manager/statter_linux.go +++ b/pkg/mount-manager/statter_linux.go @@ -25,8 +25,8 @@ var _ Statter = realStatter{} type realStatter struct { } -func NewStatter() realStatter { - return realStatter{} +func NewStatter() (realStatter, error) { + return realStatter{}, nil } // IsBlock checks if the given path is a block device diff --git a/pkg/mount-manager/statter_windows.go b/pkg/mount-manager/statter_windows.go index 3a8de3013..6674fb366 100644 --- a/pkg/mount-manager/statter_windows.go +++ b/pkg/mount-manager/statter_windows.go @@ -16,16 +16,26 @@ limitations under the License. package mountmanager import ( - "fmt" + "context" + + volumeapi "github.com/kubernetes-csi/csi-proxy/client/api/volume/v1beta1" + volumeclient "github.com/kubernetes-csi/csi-proxy/client/groups/volume/v1beta1" ) var _ Statter = realStatter{} type realStatter struct { + VolumeClient *volumeclient.Client } -func NewStatter() realStatter { - return realStatter{} +func NewStatter() (realStatter, error) { + volumeClient, err := volumeclient.NewClient() + if err != nil { + return realStatter{}, err + } + return realStatter{ + VolumeClient: volumeClient, + }, nil } // IsBlock checks if the given path is a block device @@ -33,10 +43,30 @@ func (realStatter) IsBlockDevice(fullPath string) (bool, error) { return false, nil } -//TODO (jinxu): implement StatFS to get metrics -func (realStatter) StatFS(path string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) { +// StatFS returns volume usage information +func (r realStatter) StatFS(path string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) { zero := int64(0) - return zero, zero, zero, zero, zero, zero, fmt.Errorf("Not implemented") + + idRequest := &volumeapi.VolumeIDFromMountRequest{ + Mount: path, + } + idResponse, err := r.VolumeClient.GetVolumeIDFromMount(context.Background(), idRequest) + if err != nil { + return zero, zero, zero, zero, zero, zero, err + } + volumeId := idResponse.GetVolumeId() + + request := &volumeapi.VolumeStatsRequest{ + VolumeId: volumeId, + } + response, err := r.VolumeClient.VolumeStats(context.Background(), request) + if err != nil { + return zero, zero, zero, zero, zero, zero, err + } + capacity = response.GetVolumeSize() + used = response.GetVolumeUsedSize() + available = capacity - used + return available, capacity, used, zero, zero, zero, nil } type fakeStatter struct{}