Skip to content

Commit 54a0736

Browse files
committed
Add a fake statter for sanity testing
1 parent e58a333 commit 54a0736

File tree

10 files changed

+96
-27
lines changed

10 files changed

+96
-27
lines changed

cmd/main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,13 @@ func handle() {
6969

7070
mounter := mountmanager.NewSafeMounter()
7171
deviceUtils := mountmanager.NewDeviceUtils()
72-
72+
statter := mountmanager.NewStatter()
7373
ms, err := metadataservice.NewMetadataService()
7474
if err != nil {
7575
klog.Fatalf("Failed to set up metadata service: %v", err)
7676
}
7777

78-
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, ms, driverName, vendorVersion)
78+
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, ms, statter, driverName, vendorVersion)
7979
if err != nil {
8080
klog.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
8181
}

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func GetGCEDriver() *GCEDriver {
4646
}
4747

4848
func (gceDriver *GCEDriver) SetupGCEDriver(cloudProvider gce.GCECompute, mounter *mount.SafeFormatAndMount,
49-
deviceUtils mountmanager.DeviceUtils, meta metadataservice.MetadataService, name, vendorVersion string) error {
49+
deviceUtils mountmanager.DeviceUtils, meta metadataservice.MetadataService, statter mountmanager.Statter, name, vendorVersion string) error {
5050
if name == "" {
5151
return fmt.Errorf("Driver name missing")
5252
}
@@ -78,7 +78,7 @@ func (gceDriver *GCEDriver) SetupGCEDriver(cloudProvider gce.GCECompute, mounter
7878

7979
// Set up RPC Servers
8080
gceDriver.ids = NewIdentityServer(gceDriver)
81-
gceDriver.ns = NewNodeServer(gceDriver, mounter, deviceUtils, meta)
81+
gceDriver.ns = NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
8282
gceDriver.cs = NewControllerServer(gceDriver, cloudProvider, meta)
8383

8484
return nil
@@ -134,13 +134,14 @@ func NewIdentityServer(gceDriver *GCEDriver) *GCEIdentityServer {
134134
}
135135
}
136136

137-
func NewNodeServer(gceDriver *GCEDriver, mounter *mount.SafeFormatAndMount, deviceUtils mountmanager.DeviceUtils, meta metadataservice.MetadataService) *GCENodeServer {
137+
func NewNodeServer(gceDriver *GCEDriver, mounter *mount.SafeFormatAndMount, deviceUtils mountmanager.DeviceUtils, meta metadataservice.MetadataService, statter mountmanager.Statter) *GCENodeServer {
138138
return &GCENodeServer{
139139
Driver: gceDriver,
140140
Mounter: mounter,
141141
DeviceUtils: deviceUtils,
142142
MetadataService: meta,
143143
volumeLocks: common.NewVolumeLocks(),
144+
VolumeStatter: statter,
144145
}
145146
}
146147

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func initBlockingGCEDriver(t *testing.T, cloudDisks []*gce.CloudDisk, readyToExe
4444
func initGCEDriverWithCloudProvider(t *testing.T, cloudProvider gce.GCECompute) *GCEDriver {
4545
vendorVersion := "test-vendor"
4646
gceDriver := GetGCEDriver()
47-
err := gceDriver.SetupGCEDriver(cloudProvider, nil, nil, metadataservice.NewFakeService(), driver, vendorVersion)
47+
err := gceDriver.SetupGCEDriver(cloudProvider, nil, nil, metadataservice.NewFakeService(), nil, driver, vendorVersion)
4848
if err != nil {
4949
t.Fatalf("Failed to setup GCE Driver: %v", err)
5050
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
func TestGetPluginInfo(t *testing.T) {
2727
vendorVersion := "test-vendor"
2828
gceDriver := GetGCEDriver()
29-
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), driver, vendorVersion)
29+
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, vendorVersion)
3030
if err != nil {
3131
t.Fatalf("Failed to setup GCE Driver: %v", err)
3232
}
@@ -48,7 +48,7 @@ func TestGetPluginInfo(t *testing.T) {
4848

4949
func TestGetPluginCapabilities(t *testing.T) {
5050
gceDriver := GetGCEDriver()
51-
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), driver, "test-vendor")
51+
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, "test-vendor")
5252
if err != nil {
5353
t.Fatalf("Failed to setup GCE Driver: %v", err)
5454
}
@@ -80,7 +80,7 @@ func TestGetPluginCapabilities(t *testing.T) {
8080

8181
func TestProbe(t *testing.T) {
8282
gceDriver := GetGCEDriver()
83-
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), driver, "test-vendor")
83+
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, "test-vendor")
8484
if err != nil {
8585
t.Fatalf("Failed to setup GCE Driver: %v", err)
8686
}

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

+15-14
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
"context"
2424

25-
"golang.org/x/sys/unix"
2625
"google.golang.org/grpc/codes"
2726
"google.golang.org/grpc/status"
2827

@@ -41,6 +40,7 @@ type GCENodeServer struct {
4140
Driver *GCEDriver
4241
Mounter *mount.SafeFormatAndMount
4342
DeviceUtils mountmanager.DeviceUtils
43+
VolumeStatter mountmanager.Statter
4444
MetadataService metadataservice.MetadataService
4545

4646
// A map storing all volumes with ongoing operations so that additional operations
@@ -368,32 +368,33 @@ func (ns *GCENodeServer) NodeGetInfo(ctx context.Context, req *csi.NodeGetInfoRe
368368
}
369369

370370
func (ns *GCENodeServer) NodeGetVolumeStats(ctx context.Context, req *csi.NodeGetVolumeStatsRequest) (*csi.NodeGetVolumeStatsResponse, error) {
371+
if len(req.VolumeId) == 0 {
372+
return nil, status.Error(codes.InvalidArgument, "NodeGetVolumeStats volume ID was empty")
373+
}
371374
if len(req.VolumePath) == 0 {
372375
return nil, status.Error(codes.InvalidArgument, "NodeGetVolumeStats volume path was empty")
373376
}
374-
statfs := &unix.Statfs_t{}
375-
err := unix.Statfs(req.VolumePath, statfs)
377+
378+
exists, err := ns.Mounter.Interface.ExistsPath(req.VolumePath)
376379
if err != nil {
377-
return nil, status.Errorf(codes.Internal, "failed to get fs info on path %s: %v", req.VolumePath, err)
380+
return nil, status.Errorf(codes.Internal, "unknown error when stat on %s: %v", req.VolumePath, err)
381+
}
382+
if !exists {
383+
return nil, status.Errorf(codes.NotFound, "path %s does not exist", req.VolumePath)
378384
}
379385

380-
// Available is blocks available * fragment size
381-
available := int64(statfs.Bavail) * int64(statfs.Bsize)
382-
// Capacity is total block count * fragment size
383-
capacity := int64(statfs.Blocks) * int64(statfs.Bsize)
384-
// Usage is block being used * fragment size (aka block size).
385-
usage := (int64(statfs.Blocks) - int64(statfs.Bfree)) * int64(statfs.Bsize)
386-
inodes := int64(statfs.Files)
387-
inodesFree := int64(statfs.Ffree)
388-
inodesUsed := inodes - inodesFree
386+
available, capacity, used, inodesFree, inodes, inodesUsed, err := ns.VolumeStatter.StatFS(req.VolumePath)
387+
if err != nil {
388+
return nil, status.Errorf(codes.Internal, "failed to get fs info on path %s: %v", req.VolumePath, err)
389+
}
389390

390391
return &csi.NodeGetVolumeStatsResponse{
391392
Usage: []*csi.VolumeUsage{
392393
{
393394
Unit: csi.VolumeUsage_BYTES,
394395
Available: available,
395396
Total: capacity,
396-
Used: usage,
397+
Used: used,
397398
},
398399
{
399400
Unit: csi.VolumeUsage_INODES,

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func getTestGCEDriverWithCustomMounter(t *testing.T, mounter *mount.SafeFormatAn
4444

4545
func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, deviceUtils mountmanager.DeviceUtils, metaService metadataservice.MetadataService) *GCEDriver {
4646
gceDriver := GetGCEDriver()
47-
err := gceDriver.SetupGCEDriver(nil, mounter, deviceUtils, metaService, driver, "test-vendor")
47+
err := gceDriver.SetupGCEDriver(nil, mounter, deviceUtils, metaService, nil, driver, "test-vendor")
4848
if err != nil {
4949
t.Fatalf("Failed to setup GCE Driver: %v", err)
5050
}
@@ -53,7 +53,7 @@ func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, dev
5353

5454
func getTestBlockingGCEDriver(t *testing.T, readyToExecute chan chan struct{}) *GCEDriver {
5555
gceDriver := GetGCEDriver()
56-
err := gceDriver.SetupGCEDriver(nil, mountmanager.NewFakeSafeBlockingMounter(readyToExecute), mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService(), driver, "test-vendor")
56+
err := gceDriver.SetupGCEDriver(nil, mountmanager.NewFakeSafeBlockingMounter(readyToExecute), mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService(), nil, driver, "test-vendor")
5757
if err != nil {
5858
t.Fatalf("Failed to setup GCE Driver: %v", err)
5959
}

pkg/mount-manager/fake-safe-mounter.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ package mountmanager
1717
import "k8s.io/kubernetes/pkg/util/mount"
1818

1919
var (
20-
fakeMounter = &mount.FakeMounter{MountPoints: []mount.MountPoint{}, Log: []mount.FakeAction{}}
20+
fakeMounter = &mount.FakeMounter{MountPoints: []mount.MountPoint{}, Log: []mount.FakeAction{}, Filesystem: map[string]mount.FileType{}}
2121
fakeExec = mount.NewFakeExec(execCallback)
2222
)
2323

pkg/mount-manager/statter.go

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
Copyright 2019 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
Unless required by applicable law or agreed to in writing, software
9+
distributed under the License is distributed on an "AS IS" BASIS,
10+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
See the License for the specific language governing permissions and
12+
limitations under the License.
13+
*/
14+
15+
package mountmanager
16+
17+
import (
18+
"fmt"
19+
20+
"golang.org/x/sys/unix"
21+
)
22+
23+
type Statter interface {
24+
StatFS(path string) (int64, int64, int64, int64, int64, int64, error)
25+
}
26+
27+
var _ Statter = realStatter{}
28+
29+
type realStatter struct {
30+
}
31+
32+
func NewStatter() realStatter {
33+
return realStatter{}
34+
}
35+
36+
func (realStatter) StatFS(path string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
37+
statfs := &unix.Statfs_t{}
38+
err = unix.Statfs(path, statfs)
39+
if err != nil {
40+
err = fmt.Errorf("failed to get fs info on path %s: %v", path, err)
41+
return
42+
}
43+
44+
// Available is blocks available * fragment size
45+
available = int64(statfs.Bavail) * int64(statfs.Bsize)
46+
// Capacity is total block count * fragment size
47+
capacity = int64(statfs.Blocks) * int64(statfs.Bsize)
48+
// Usage is block being used * fragment size (aka block size).
49+
used = (int64(statfs.Blocks) - int64(statfs.Bfree)) * int64(statfs.Bsize)
50+
inodes = int64(statfs.Files)
51+
inodesFree = int64(statfs.Ffree)
52+
inodesUsed = inodes - inodesFree
53+
return
54+
}
55+
56+
type fakeStatter struct{}
57+
58+
func NewFakeStatter() fakeStatter {
59+
return fakeStatter{}
60+
}
61+
62+
func (fakeStatter) StatFS(path string) (available, capacity, used, inodesFree, inodes, inodesUsed int64, err error) {
63+
// Assume the file exists and give some dummy values back
64+
return 1, 1, 1, 1, 1, 1, nil
65+
}

test/sanity/sanity_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func TestSanity(t *testing.T) {
5353
deviceUtils := mountmanager.NewFakeDeviceUtils()
5454

5555
//Initialize GCE Driver
56-
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, metadataservice.NewFakeService(), driverName, vendorVersion)
56+
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, metadataservice.NewFakeService(), mountmanager.NewFakeStatter(), driverName, vendorVersion)
5757
if err != nil {
5858
t.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
5959
}

vendor/k8s.io/kubernetes/pkg/util/mount/fake.go

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)