Skip to content

Commit f5069ef

Browse files
authored
Merge pull request #78 from davidz627/feature/k8sMount
Use well tested Kubernetes Mount package utilities instead of copy pasting
2 parents c7b4035 + 06d721c commit f5069ef

File tree

84 files changed

+110848
-107293
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+110848
-107293
lines changed

Gopkg.lock

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

cmd/main.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,10 @@ func handle() {
5656
glog.Fatalf("Failed to get cloud provider: %v", err)
5757
}
5858

59-
mounter, err := mountmanager.CreateMounter()
60-
if err != nil {
61-
glog.Fatalf("Failed to get mounter: %v", err)
62-
}
59+
mounter := mountmanager.NewSafeMounter()
60+
deviceUtils := mountmanager.NewDeviceUtils()
6361

64-
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, *driverName, *nodeID, vendorVersion)
62+
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, *driverName, *nodeID, vendorVersion)
6563
if err != nil {
6664
glog.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
6765
}

deploy/setup-project.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ sed -i "/serviceAccount:${IAM_NAME}/d" "${PKGDIR}/deploy/iam.json"
3131
gcloud projects set-iam-policy "${PROJECT}" "${PKGDIR}/deploy/iam.json"
3232
rm -f "${PKGDIR}/deploy/iam.json"
3333
# Delete Service Account
34-
gcloud iam service-accounts delete "$IAM_NAME" --quiet || true
34+
gcloud iam service-accounts delete "${IAM_NAME}" --project "${PROJECT}" --quiet || true
3535

3636
# Create new Service Account and Keys
37-
gcloud iam service-accounts create "${GCEPD_SA_NAME}"
37+
gcloud iam service-accounts create "${GCEPD_SA_NAME}" --project "${PROJECT}"
3838
for role in ${BIND_ROLES}
3939
do
4040
gcloud projects add-iam-policy-binding "${PROJECT}" --member serviceAccount:"${IAM_NAME}" --role ${role}
4141
done
42-
gcloud iam service-accounts keys create "${SA_FILE}" --iam-account "${IAM_NAME}"
42+
gcloud iam service-accounts keys create "${SA_FILE}" --iam-account "${IAM_NAME}" --project "${PROJECT}"

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func TestCreateVolumeArguments(t *testing.T) {
147147
if err != nil {
148148
t.Fatalf("Failed to create fake cloud provider: %v", err)
149149
}
150-
err = gceDriver.SetupGCEDriver(fakeCloudProvider, nil, driver, node, "vendor-version")
150+
err = gceDriver.SetupGCEDriver(fakeCloudProvider, nil, nil, driver, node, "vendor-version")
151151
if err != nil {
152152
t.Fatalf("Failed to setup GCE Driver: %v", err)
153153
}

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

+8-5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/golang/glog"
2222
"google.golang.org/grpc/codes"
2323
"google.golang.org/grpc/status"
24+
"k8s.io/kubernetes/pkg/util/mount"
2425
gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider"
2526
mountmanager "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager"
2627
)
@@ -43,7 +44,8 @@ func GetGCEDriver() *GCEDriver {
4344
return &GCEDriver{}
4445
}
4546

46-
func (gceDriver *GCEDriver) SetupGCEDriver(cloudProvider gce.GCECompute, mounter mountmanager.Mounter, name, nodeID, vendorVersion string) error {
47+
func (gceDriver *GCEDriver) SetupGCEDriver(cloudProvider gce.GCECompute, mounter *mount.SafeFormatAndMount,
48+
deviceUtils mountmanager.DeviceUtils, name, nodeID, vendorVersion string) error {
4749
if name == "" {
4850
return fmt.Errorf("Driver name missing")
4951
}
@@ -73,7 +75,7 @@ func (gceDriver *GCEDriver) SetupGCEDriver(cloudProvider gce.GCECompute, mounter
7375

7476
// Set up RPC Servers
7577
gceDriver.ids = NewIdentityServer(gceDriver)
76-
gceDriver.ns = NewNodeServer(gceDriver, mounter)
78+
gceDriver.ns = NewNodeServer(gceDriver, mounter, deviceUtils)
7779
gceDriver.cs = NewControllerServer(gceDriver, cloudProvider)
7880

7981
return nil
@@ -129,10 +131,11 @@ func NewIdentityServer(gceDriver *GCEDriver) *GCEIdentityServer {
129131
}
130132
}
131133

132-
func NewNodeServer(gceDriver *GCEDriver, mounter mountmanager.Mounter) *GCENodeServer {
134+
func NewNodeServer(gceDriver *GCEDriver, mounter *mount.SafeFormatAndMount, deviceUtils mountmanager.DeviceUtils) *GCENodeServer {
133135
return &GCENodeServer{
134-
Driver: gceDriver,
135-
Mounter: mounter,
136+
Driver: gceDriver,
137+
Mounter: mounter,
138+
DeviceUtils: deviceUtils,
136139
}
137140
}
138141

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func initGCEDriver(t *testing.T) *GCEDriver {
2727
if err != nil {
2828
t.Fatalf("Failed to create fake cloud provider: %v", err)
2929
}
30-
err = gceDriver.SetupGCEDriver(fakeCloudProvider, nil, driver, node, vendorVersion)
30+
err = gceDriver.SetupGCEDriver(fakeCloudProvider, nil, nil, driver, node, vendorVersion)
3131
if err != nil {
3232
t.Fatalf("Failed to setup GCE Driver: %v", err)
3333
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
func TestGetPluginInfo(t *testing.T) {
2525
vendorVersion := "test-vendor"
2626
gceDriver := GetGCEDriver()
27-
err := gceDriver.SetupGCEDriver(nil, nil, driver, node, vendorVersion)
27+
err := gceDriver.SetupGCEDriver(nil, nil, nil, driver, node, vendorVersion)
2828
if err != nil {
2929
t.Fatalf("Failed to setup GCE Driver: %v", err)
3030
}
@@ -46,7 +46,7 @@ func TestGetPluginInfo(t *testing.T) {
4646

4747
func TestGetPluginCapabilities(t *testing.T) {
4848
gceDriver := GetGCEDriver()
49-
err := gceDriver.SetupGCEDriver(nil, nil, driver, node, "test-vendor")
49+
err := gceDriver.SetupGCEDriver(nil, nil, nil, driver, node, "test-vendor")
5050
if err != nil {
5151
t.Fatalf("Failed to setup GCE Driver: %v", err)
5252
}
@@ -67,7 +67,7 @@ func TestGetPluginCapabilities(t *testing.T) {
6767

6868
func TestProbe(t *testing.T) {
6969
gceDriver := GetGCEDriver()
70-
err := gceDriver.SetupGCEDriver(nil, nil, driver, node, "test-vendor")
70+
err := gceDriver.SetupGCEDriver(nil, nil, nil, driver, node, "test-vendor")
7171
if err != nil {
7272
t.Fatalf("Failed to setup GCE Driver: %v", err)
7373
}

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

+18-16
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ import (
2424
"golang.org/x/net/context"
2525
"google.golang.org/grpc/codes"
2626
"google.golang.org/grpc/status"
27+
"k8s.io/kubernetes/pkg/util/mount"
2728
mountmanager "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager"
2829
utils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/utils"
2930
)
3031

3132
type GCENodeServer struct {
32-
Driver *GCEDriver
33-
Mounter mountmanager.Mounter
33+
Driver *GCEDriver
34+
Mounter *mount.SafeFormatAndMount
35+
DeviceUtils mountmanager.DeviceUtils
3436
// TODO: Only lock mutually exclusive calls and make locking more fine grained
3537
mux sync.Mutex
3638
}
@@ -61,7 +63,7 @@ func (ns *GCENodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePub
6163
return nil, status.Error(codes.InvalidArgument, "NodePublishVolume Volume Capability must be provided")
6264
}
6365

64-
notMnt, err := ns.Mounter.IsLikelyNotMountPoint(targetPath)
66+
notMnt, err := ns.Mounter.Interface.IsLikelyNotMountPoint(targetPath)
6567
if err != nil && !os.IsNotExist(err) {
6668
glog.Errorf("cannot validate mount point: %s %v", targetPath, err)
6769
return nil, err
@@ -71,7 +73,7 @@ func (ns *GCENodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePub
7173
return nil, nil
7274
}
7375

74-
if err := ns.Mounter.MkdirAll(targetPath, 0750); err != nil {
76+
if err := ns.Mounter.Interface.MakeDir(targetPath); err != nil {
7577
glog.Errorf("mkdir failed on disk %s (%v)", targetPath, err)
7678
return nil, err
7779
}
@@ -82,19 +84,19 @@ func (ns *GCENodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePub
8284
options = append(options, "ro")
8385
}
8486

85-
err = ns.Mounter.DoMount(stagingTargetPath, targetPath, "ext4", options)
87+
err = ns.Mounter.Interface.Mount(stagingTargetPath, targetPath, "ext4", options)
8688
if err != nil {
87-
notMnt, mntErr := ns.Mounter.IsLikelyNotMountPoint(targetPath)
89+
notMnt, mntErr := ns.Mounter.Interface.IsLikelyNotMountPoint(targetPath)
8890
if mntErr != nil {
8991
glog.Errorf("IsLikelyNotMountPoint check failed: %v", mntErr)
9092
return nil, status.Error(codes.Internal, fmt.Sprintf("TODO: %v", err))
9193
}
9294
if !notMnt {
93-
if _, mntErr = ns.Mounter.UnmountVolume(targetPath); mntErr != nil {
95+
if mntErr = ns.Mounter.Interface.Unmount(targetPath); mntErr != nil {
9496
glog.Errorf("Failed to unmount: %v", mntErr)
9597
return nil, status.Error(codes.Internal, fmt.Sprintf("TODO: %v", err))
9698
}
97-
notMnt, mntErr := ns.Mounter.IsLikelyNotMountPoint(targetPath)
99+
notMnt, mntErr := ns.Mounter.Interface.IsLikelyNotMountPoint(targetPath)
98100
if mntErr != nil {
99101
glog.Errorf("IsLikelyNotMountPoint check failed: %v", mntErr)
100102
return nil, status.Error(codes.Internal, fmt.Sprintf("TODO: %v", err))
@@ -105,7 +107,7 @@ func (ns *GCENodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePub
105107
return nil, status.Error(codes.Internal, fmt.Sprintf("TODO: %v", err))
106108
}
107109
}
108-
ns.Mounter.Remove(targetPath)
110+
os.Remove(targetPath)
109111
glog.Errorf("Mount of disk %s failed: %v", targetPath, err)
110112
return nil, status.Error(codes.Internal, fmt.Sprintf("TODO: %v", err))
111113
}
@@ -130,9 +132,9 @@ func (ns *GCENodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeU
130132

131133
// TODO: Check volume still exists
132134

133-
output, err := ns.Mounter.UnmountVolume(targetPath)
135+
err := ns.Mounter.Interface.Unmount(targetPath)
134136
if err != nil {
135-
return nil, status.Error(codes.Internal, fmt.Sprintf("Unmount failed: %v\nUnmounting arguments: %s\nOutput: %s\n", err, targetPath, output))
137+
return nil, status.Error(codes.Internal, fmt.Sprintf("Unmount failed: %v\nUnmounting arguments: %s\n", err, targetPath))
136138
}
137139

138140
return &csi.NodeUnpublishVolumeResponse{}, nil
@@ -168,8 +170,8 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage
168170
// TODO: Get real partitions
169171
partition := ""
170172

171-
devicePaths := ns.Mounter.GetDiskByIdPaths(volumeName, partition)
172-
devicePath, err := ns.Mounter.VerifyDevicePath(devicePaths)
173+
devicePaths := ns.DeviceUtils.GetDiskByIdPaths(volumeName, partition)
174+
devicePath, err := ns.DeviceUtils.VerifyDevicePath(devicePaths)
173175

174176
if err != nil {
175177
return nil, status.Error(codes.Internal, fmt.Sprintf("Error verifying GCE PD (%q) is attached: %v", volumeName, err))
@@ -181,10 +183,10 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage
181183
glog.Infof("Successfully found attached GCE PD %q at device path %s.", volumeName, devicePath)
182184

183185
// Part 2: Check if mount already exists at targetpath
184-
notMnt, err := ns.Mounter.IsLikelyNotMountPoint(stagingTargetPath)
186+
notMnt, err := ns.Mounter.Interface.IsLikelyNotMountPoint(stagingTargetPath)
185187
if err != nil {
186188
if os.IsNotExist(err) {
187-
if err := ns.Mounter.MkdirAll(stagingTargetPath, 0750); err != nil {
189+
if err := ns.Mounter.Interface.MakeDir(stagingTargetPath); err != nil {
188190
return nil, status.Error(codes.Internal, fmt.Sprintf("Failed to create directory (%q): %v", stagingTargetPath, err))
189191
}
190192
notMnt = true
@@ -242,7 +244,7 @@ func (ns *GCENodeServer) NodeUnstageVolume(ctx context.Context, req *csi.NodeUns
242244
return nil, status.Error(codes.InvalidArgument, "NodeUnstageVolume Staging Target Path must be provided")
243245
}
244246

245-
_, err := ns.Mounter.UnmountVolume(stagingTargetPath)
247+
err := ns.Mounter.Interface.Unmount(stagingTargetPath)
246248
if err != nil {
247249
return nil, status.Error(codes.Internal, fmt.Sprintf("NodeUnstageVolume failed to unmount at path %s: %v", stagingTargetPath, err))
248250
}

0 commit comments

Comments
 (0)