Skip to content

Commit 76f2ffa

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

File tree

7 files changed

+63
-12
lines changed

7 files changed

+63
-12
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)

deploy/kubernetes/images/alpha/image.yaml

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ metadata:
44
name: imagetag-gcepd-driver-alpha-win
55
imageTag:
66
name: gke.gcr.io/gcp-compute-persistent-disk-csi-driver-win
7-
newName: gcr.io/gke-release-staging/gcp-compute-persistent-disk-csi-driver
8-
newTag: "v1.0.1-gke.9"
7+
#newName: gcr.io/gke-release-staging/gcp-compute-persistent-disk-csi-driver
8+
#newTag: "v1.0.1-gke.9"
9+
newName: gcr.io/jinxu-gke-multi-cloud-dev/gce-pd-windows-1909
10+
newTag: v5
911
---
1012

1113
apiVersion: builtin

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

+2-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)
@@ -412,7 +412,7 @@ func (ns *GCENodeServer) NodeGetVolumeStats(ctx context.Context, req *csi.NodeGe
412412
}, nil
413413
}
414414

415-
available, capacity, used, inodesFree, inodes, inodesUsed, err := ns.VolumeStatter.StatFS(req.VolumePath)
415+
available, capacity, used, inodesFree, inodes, inodesUsed, err := getStatFS(ns.VolumeStatter, req.VolumePath)
416416
if err != nil {
417417
return nil, status.Errorf(codes.Internal, "failed to get fs info on path %s: %v", req.VolumePath, err)
418418
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"google.golang.org/grpc/status"
2424
"k8s.io/utils/mount"
2525
"sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common"
26+
mountmanager "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager"
2627
)
2728

2829
func getDevicePath(ns *GCENodeServer, volumeID, partition string) (string, error) {
@@ -64,3 +65,7 @@ func cleanupPublishPath(path string, m *mount.SafeFormatAndMount) error {
6465
func cleanupStagePath(path string, m *mount.SafeFormatAndMount) error {
6566
return cleanupPublishPath(path, m)
6667
}
68+
69+
func getStatFS(s mountmanager.Statter, volumePath string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
70+
return s.StatFS(volumePath)
71+
}

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

+6
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ 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"
24+
mountmanager "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager"
2325
)
2426

2527
func formatAndMount(source, target, fstype string, options []string, m *mount.SafeFormatAndMount) error {
@@ -86,3 +88,7 @@ func getDevicePath(ns *GCENodeServer, volumeID, partition string) (string, error
8688
}
8789
return proxy.GetDevicePath(deviceName, partition, volumeKey.Name)
8890
}
91+
92+
func getStatFS(s mountmanager.Statter, volumePath string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
93+
return s.StatFS(volumePath)
94+
}

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

+40-5
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,30 @@ 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
29+
}
30+
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
2539
}
2640

27-
func NewStatter() realStatter {
28-
return realStatter{}
41+
func getStatFS(s Statter, volumeId, volumePath string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
42+
return s.StatFS(volumeId)
2943
}
3044

3145
// IsBlock checks if the given path is a block device
@@ -34,9 +48,30 @@ func (realStatter) IsBlockDevice(fullPath string) (bool, error) {
3448
}
3549

3650
//TODO (jinxu): implement StatFS to get metrics
37-
func (realStatter) StatFS(path string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
51+
func (r realStatter) StatFS(path string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
3852
zero := int64(0)
39-
return zero, zero, zero, zero, zero, zero, fmt.Errorf("Not implemented")
53+
//return zero, zero, zero, zero, zero, zero, fmt.Errorf("Not implemented")
54+
55+
idRequest := &volumeapi.VolumeIDFromMountRequest{
56+
Mount: path,
57+
}
58+
idResponse, err := r.VolumeClient.GetVolumeIDFromMount(context.Background(), idRequest)
59+
if err != nil {
60+
return zero, zero, zero, zero, zero, zero, err
61+
}
62+
volumeId := idResponse.GetVolumeId()
63+
64+
request := &volumeapi.VolumeStatsRequest{
65+
VolumeId: volumeId,
66+
}
67+
response, err := r.VolumeClient.VolumeStats(context.Background(), request)
68+
if err != nil {
69+
return zero, zero, zero, zero, zero, zero, err
70+
}
71+
capacity = response.GetVolumeSize()
72+
used = response.GetVolumeUsedSize()
73+
available = capacity - used
74+
return available, capacity, used, zero, zero, zero, nil
4075
}
4176

4277
type fakeStatter struct{}

0 commit comments

Comments
 (0)