From a670d7fb4dd6f0694a3233ff370d8922842fbb45 Mon Sep 17 00:00:00 2001
From: Cyrill Troxler <cyrilltroxler@gmail.com>
Date: Sun, 10 Mar 2019 12:19:02 +0100
Subject: [PATCH] Supply credentials using volume secrets instead of cli config

---
 cmd/s3driver/main.go           | 21 ++----------
 go.mod                         |  2 ++
 go.sum                         | 10 ++++++
 pkg/s3/controllerserver.go     | 31 ++++++++++++------
 pkg/s3/identityserver.go       |  3 +-
 pkg/s3/mounter.go              |  5 ++-
 pkg/s3/mounter_goofys.go       |  4 ---
 pkg/s3/mounter_rclone.go       |  4 ---
 pkg/s3/mounter_s3backer.go     | 11 ++-----
 pkg/s3/mounter_s3fs.go         |  4 ---
 pkg/s3/mounter_s3ql.go         |  4 ---
 pkg/s3/nodeserver.go           | 43 +++++++++---------------
 pkg/s3/s3-client.go            | 12 +++++++
 pkg/s3/s3-driver.go            | 16 ++-------
 pkg/s3/s3-driver_suite_test.go | 60 ++++++++++++++--------------------
 pkg/s3/util.go                 | 20 +++++-------
 test/secret.yaml               | 30 +++++++++++++++++
 test/test.sh                   |  2 +-
 18 files changed, 136 insertions(+), 146 deletions(-)
 create mode 100644 test/secret.yaml

diff --git a/cmd/s3driver/main.go b/cmd/s3driver/main.go
index a57ac78..0426990 100644
--- a/cmd/s3driver/main.go
+++ b/cmd/s3driver/main.go
@@ -29,29 +29,14 @@ func init() {
 }
 
 var (
-	endpoint        = flag.String("endpoint", "unix://tmp/csi.sock", "CSI endpoint")
-	nodeID          = flag.String("nodeid", "", "node id")
-	accessKeyID     = flag.String("access-key-id", "", "S3 Access Key ID to use")
-	secretAccessKey = flag.String("secret-access-key", "", "S3 Secret Access Key to use")
-	s3endpoint      = flag.String("s3-endpoint", "", "S3 Endpoint URL to use")
-	region          = flag.String("region", "", "S3 Region to use")
-	mounter         = flag.String("mounter", "s3fs", "Specify which Mounter to use")
-	encryptionKey   = flag.String("encryption-key", "", "Encryption key for file system (only used with s3ql)")
+	endpoint = flag.String("endpoint", "unix://tmp/csi.sock", "CSI endpoint")
+	nodeID   = flag.String("nodeid", "", "node id")
 )
 
 func main() {
 	flag.Parse()
 
-	cfg := &s3.Config{
-		AccessKeyID:     *accessKeyID,
-		SecretAccessKey: *secretAccessKey,
-		Endpoint:        *s3endpoint,
-		Region:          *region,
-		Mounter:         *mounter,
-		EncryptionKey:   *encryptionKey,
-	}
-
-	driver, err := s3.NewS3(*nodeID, *endpoint, cfg)
+	driver, err := s3.NewS3(*nodeID, *endpoint)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/go.mod b/go.mod
index 0283831..6fe64b0 100644
--- a/go.mod
+++ b/go.mod
@@ -42,3 +42,5 @@ require (
 	k8s.io/kubernetes v1.13.4
 	k8s.io/utils v0.0.0-20180703210027-ab9069044f32 // indirect
 )
+
+replace github.com/kubernetes-csi/csi-test => github.com/ctrox/csi-test v1.1.1-0.20190310103436-e50382dcb47f
diff --git a/go.sum b/go.sum
index 38372b6..74789b9 100644
--- a/go.sum
+++ b/go.sum
@@ -4,6 +4,14 @@ github.com/aws/aws-sdk-go v1.14.27 h1:fRVME5X3sxZnctdCcabNTWZq7ZGrpVgUAYk4OA5EG0
 github.com/aws/aws-sdk-go v1.14.27/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k=
 github.com/container-storage-interface/spec v1.0.0 h1:3DyXuJgf9MU6kyULESegQUmozsSxhpyrrv9u5bfwA3E=
 github.com/container-storage-interface/spec v1.0.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4=
+github.com/ctrox/csi-test v1.1.0 h1:YwOvPrlZw6/qgG+G8EQMkMniPt2HJmTOYVBiawgfiQ8=
+github.com/ctrox/csi-test v1.1.0/go.mod h1:Sdb3sQ5DaEikqpKZNzj+abr8x/OCMXB0KTaxIAXP1RI=
+github.com/ctrox/csi-test v1.1.1-0.20190310103436-e50382dcb47f h1:FLD1xv7Vwv7+JZizABfim+tR8Ctj68B2mnS529kHBPg=
+github.com/ctrox/csi-test v1.1.1-0.20190310103436-e50382dcb47f/go.mod h1:Sdb3sQ5DaEikqpKZNzj+abr8x/OCMXB0KTaxIAXP1RI=
+github.com/ctrox/csi-test v1.1.2-0.20190310094942-e965dacfef26 h1:KbZ3qIvoWP0CD7ZnUULipd5QGg0gmNLCfxikgAYnKwQ=
+github.com/ctrox/csi-test v1.1.2-0.20190310094942-e965dacfef26/go.mod h1:Sdb3sQ5DaEikqpKZNzj+abr8x/OCMXB0KTaxIAXP1RI=
+github.com/ctrox/csi-test v1.1.2-0.20190310103005-3f3cc7817699 h1:bQ82DNERrJuin7/+sRCoeBz7FV8/HNS6LpIe48XUWCo=
+github.com/ctrox/csi-test v1.1.2-0.20190310103005-3f3cc7817699/go.mod h1:Sdb3sQ5DaEikqpKZNzj+abr8x/OCMXB0KTaxIAXP1RI=
 github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/go-ini/ini v1.38.1 h1:hbtfM8emWUVo9GnXSloXYyFbXxZ+tG6sbepSStoe1FY=
@@ -30,6 +38,8 @@ github.com/kahing/goofys v0.19.0 h1:jcuffrnpvZq+LjXtRODo0pvNOglw32ClzBZ1XLShFnk=
 github.com/kahing/goofys v0.19.0/go.mod h1:erC9E45nY5m8v6FE+tYIGRVjIC2N8viMlJrgrsXB2Q4=
 github.com/kubernetes-csi/csi-test v1.1.0 h1:a7CfGqhGDs0h7AZt1f6LTIUzBazcRf6eBdTUBXB4xE4=
 github.com/kubernetes-csi/csi-test v1.1.0/go.mod h1:YxJ4UiuPWIhMBkxUKY5c267DyA0uDZ/MtAimhx/2TA0=
+github.com/kubernetes-csi/csi-test v1.1.1 h1:L4RPre34ICeoQW7ez4X5t0PnFKaKs8K5q0c1XOrvXEM=
+github.com/kubernetes-csi/csi-test v1.1.1/go.mod h1:YxJ4UiuPWIhMBkxUKY5c267DyA0uDZ/MtAimhx/2TA0=
 github.com/kubernetes-csi/drivers v0.0.0-20181207022357-c1e71bdcce6e h1:BkkRJIF329ps8digiMWthYzDPl9KB8PwkDwvVWDwM4A=
 github.com/kubernetes-csi/drivers v0.0.0-20181207022357-c1e71bdcce6e/go.mod h1:V6rHbbSLCZGaQoIZ8MkyDtoXtcKXZM0F7N3bkloDCOY=
 github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=
diff --git a/pkg/s3/controllerserver.go b/pkg/s3/controllerserver.go
index dca3b2f..49e8f7b 100644
--- a/pkg/s3/controllerserver.go
+++ b/pkg/s3/controllerserver.go
@@ -29,12 +29,11 @@ import (
 	"google.golang.org/grpc/status"
 
 	"github.com/container-storage-interface/spec/lib/go/csi"
-	"github.com/kubernetes-csi/drivers/pkg/csi-common"
+	csicommon "github.com/kubernetes-csi/drivers/pkg/csi-common"
 )
 
 type controllerServer struct {
 	*csicommon.DefaultControllerServer
-	*s3
 }
 
 func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) {
@@ -59,13 +58,17 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
 
 	glog.V(4).Infof("Got a request to create volume %s", volumeID)
 
-	exists, err := cs.s3.client.bucketExists(volumeID)
+	s3, err := newS3ClientFromSecrets(req.GetSecrets())
+	if err != nil {
+		return nil, fmt.Errorf("failed to initialize S3 client: %s", err)
+	}
+	exists, err := s3.bucketExists(volumeID)
 	if err != nil {
 		return nil, fmt.Errorf("failed to check if bucket %s exists: %v", volumeID, err)
 	}
 	if exists {
 		var b *bucket
-		b, err = cs.s3.client.getBucket(volumeID)
+		b, err = s3.getBucket(volumeID)
 		if err != nil {
 			return nil, fmt.Errorf("failed to get bucket metadata of bucket %s: %v", volumeID, err)
 		}
@@ -74,10 +77,10 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
 			return nil, status.Error(codes.AlreadyExists, fmt.Sprintf("Volume with the same name: %s but with smaller size already exist", volumeID))
 		}
 	} else {
-		if err = cs.s3.client.createBucket(volumeID); err != nil {
+		if err = s3.createBucket(volumeID); err != nil {
 			return nil, fmt.Errorf("failed to create volume %s: %v", volumeID, err)
 		}
-		if err = cs.s3.client.createPrefix(volumeID, fsPrefix); err != nil {
+		if err = s3.createPrefix(volumeID, fsPrefix); err != nil {
 			return nil, fmt.Errorf("failed to create prefix %s: %v", fsPrefix, err)
 		}
 	}
@@ -87,7 +90,7 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
 		CapacityBytes: capacityBytes,
 		FSPath:        fsPrefix,
 	}
-	if err := cs.s3.client.setBucket(b); err != nil {
+	if err := s3.setBucket(b); err != nil {
 		return nil, fmt.Errorf("Error setting bucket metadata: %v", err)
 	}
 
@@ -118,12 +121,16 @@ func (cs *controllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol
 	}
 	glog.V(4).Infof("Deleting volume %s", volumeID)
 
-	exists, err := cs.s3.client.bucketExists(volumeID)
+	s3, err := newS3ClientFromSecrets(req.GetSecrets())
+	if err != nil {
+		return nil, fmt.Errorf("failed to initialize S3 client: %s", err)
+	}
+	exists, err := s3.bucketExists(volumeID)
 	if err != nil {
 		return nil, err
 	}
 	if exists {
-		if err := cs.s3.client.removeBucket(volumeID); err != nil {
+		if err := s3.removeBucket(volumeID); err != nil {
 			glog.V(3).Infof("Failed to remove volume: %v", err)
 			return nil, err
 		}
@@ -144,7 +151,11 @@ func (cs *controllerServer) ValidateVolumeCapabilities(ctx context.Context, req
 		return nil, status.Error(codes.InvalidArgument, "Volume capabilities missing in request")
 	}
 
-	exists, err := cs.s3.client.bucketExists(req.GetVolumeId())
+	s3, err := newS3ClientFromSecrets(req.GetSecrets())
+	if err != nil {
+		return nil, fmt.Errorf("failed to initialize S3 client: %s", err)
+	}
+	exists, err := s3.bucketExists(req.GetVolumeId())
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/s3/identityserver.go b/pkg/s3/identityserver.go
index 9e46faf..6e04fa8 100644
--- a/pkg/s3/identityserver.go
+++ b/pkg/s3/identityserver.go
@@ -17,10 +17,9 @@ limitations under the License.
 package s3
 
 import (
-	"github.com/kubernetes-csi/drivers/pkg/csi-common"
+	csicommon "github.com/kubernetes-csi/drivers/pkg/csi-common"
 )
 
 type identityServer struct {
 	*csicommon.DefaultIdentityServer
-	*s3
 }
diff --git a/pkg/s3/mounter.go b/pkg/s3/mounter.go
index 6bddc39..df17c7a 100644
--- a/pkg/s3/mounter.go
+++ b/pkg/s3/mounter.go
@@ -15,7 +15,6 @@ type Mounter interface {
 	Stage(stagePath string) error
 	Unstage(stagePath string) error
 	Mount(source string, target string) error
-	Unmount(target string) error
 }
 
 const (
@@ -67,12 +66,12 @@ func fuseMount(path string, command string, args []string) error {
 	return waitForMount(path, 10*time.Second)
 }
 
-func fuseUnmount(path string, command string) error {
+func fuseUnmount(path string) error {
 	if err := mount.New("").Unmount(path); err != nil {
 		return err
 	}
 	// as fuse quits immediately, we will try to wait until the process is done
-	process, err := findFuseMountProcess(path, command)
+	process, err := findFuseMountProcess(path)
 	if err != nil {
 		glog.Errorf("Error getting PID of fuse mount: %s", err)
 		return nil
diff --git a/pkg/s3/mounter_goofys.go b/pkg/s3/mounter_goofys.go
index 6e93bb0..98a176b 100644
--- a/pkg/s3/mounter_goofys.go
+++ b/pkg/s3/mounter_goofys.go
@@ -69,7 +69,3 @@ func (goofys *goofysMounter) Mount(source string, target string) error {
 	}
 	return nil
 }
-
-func (goofys *goofysMounter) Unmount(targetPath string) error {
-	return fuseUnmount(targetPath, goofysCmd)
-}
diff --git a/pkg/s3/mounter_rclone.go b/pkg/s3/mounter_rclone.go
index 60d1203..abc2d32 100644
--- a/pkg/s3/mounter_rclone.go
+++ b/pkg/s3/mounter_rclone.go
@@ -54,7 +54,3 @@ func (rclone *rcloneMounter) Mount(source string, target string) error {
 	os.Setenv("AWS_SECRET_ACCESS_KEY", rclone.secretAccessKey)
 	return fuseMount(target, rcloneCmd, args)
 }
-
-func (rclone *rcloneMounter) Unmount(target string) error {
-	return fuseUnmount(target, rcloneCmd)
-}
diff --git a/pkg/s3/mounter_s3backer.go b/pkg/s3/mounter_s3backer.go
index 204df6d..118263c 100644
--- a/pkg/s3/mounter_s3backer.go
+++ b/pkg/s3/mounter_s3backer.go
@@ -71,14 +71,14 @@ func (s3backer *s3backerMounter) Stage(stageTarget string) error {
 	// ensure 'file' device is formatted
 	err := formatFs(s3backerFsType, path.Join(stageTarget, s3backerDevice))
 	if err != nil {
-		fuseUnmount(stageTarget, s3backerCmd)
+		fuseUnmount(stageTarget)
 	}
 	return err
 }
 
 func (s3backer *s3backerMounter) Unstage(stageTarget string) error {
 	// Unmount the s3backer fuse mount
-	return fuseUnmount(stageTarget, s3backerCmd)
+	return fuseUnmount(stageTarget)
 }
 
 func (s3backer *s3backerMounter) Mount(source string, target string) error {
@@ -87,17 +87,12 @@ func (s3backer *s3backerMounter) Mount(source string, target string) error {
 	err := mount.New("").Mount(device, target, s3backerFsType, []string{})
 	if err != nil {
 		// cleanup fuse mount
-		fuseUnmount(target, s3backerCmd)
+		fuseUnmount(target)
 		return err
 	}
 	return nil
 }
 
-func (s3backer *s3backerMounter) Unmount(targetPath string) error {
-	// Unmount the filesystem first
-	return mount.New("").Unmount(targetPath)
-}
-
 func (s3backer *s3backerMounter) mountInit(path string) error {
 	args := []string{
 		fmt.Sprintf("--blockSize=%s", s3backerBlockSize),
diff --git a/pkg/s3/mounter_s3fs.go b/pkg/s3/mounter_s3fs.go
index e332557..772d6c0 100644
--- a/pkg/s3/mounter_s3fs.go
+++ b/pkg/s3/mounter_s3fs.go
@@ -51,10 +51,6 @@ func (s3fs *s3fsMounter) Mount(source string, target string) error {
 	return fuseMount(target, s3fsCmd, args)
 }
 
-func (s3fs *s3fsMounter) Unmount(target string) error {
-	return fuseUnmount(target, s3fsCmd)
-}
-
 func writes3fsPass(pwFileContent string) error {
 	pwFileName := fmt.Sprintf("%s/.passwd-s3fs", os.Getenv("HOME"))
 	pwFile, err := os.OpenFile(pwFileName, os.O_RDWR|os.O_CREATE, 0600)
diff --git a/pkg/s3/mounter_s3ql.go b/pkg/s3/mounter_s3ql.go
index 1f90481..d32c47d 100644
--- a/pkg/s3/mounter_s3ql.go
+++ b/pkg/s3/mounter_s3ql.go
@@ -93,10 +93,6 @@ func (s3ql *s3qlMounter) Mount(source string, target string) error {
 	return fuseMount(target, s3qlCmdMount, append(args, s3ql.options...))
 }
 
-func (s3ql *s3qlMounter) Unmount(target string) error {
-	return fuseUnmount(target, s3qlCmdMount)
-}
-
 func (s3ql *s3qlMounter) writeConfig() error {
 	s3qlIni := ini.Empty()
 	section, err := s3qlIni.NewSection("s3ql")
diff --git a/pkg/s3/nodeserver.go b/pkg/s3/nodeserver.go
index 36fbd4d..36f985f 100644
--- a/pkg/s3/nodeserver.go
+++ b/pkg/s3/nodeserver.go
@@ -17,6 +17,7 @@ limitations under the License.
 package s3
 
 import (
+	"fmt"
 	"os"
 
 	"github.com/golang/glog"
@@ -27,12 +28,11 @@ import (
 	"google.golang.org/grpc/status"
 	"k8s.io/kubernetes/pkg/util/mount"
 
-	"github.com/kubernetes-csi/drivers/pkg/csi-common"
+	csicommon "github.com/kubernetes-csi/drivers/pkg/csi-common"
 )
 
 type nodeServer struct {
 	*csicommon.DefaultNodeServer
-	*s3
 }
 
 func (ns *nodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublishVolumeRequest) (*csi.NodePublishVolumeResponse, error) {
@@ -76,12 +76,16 @@ func (ns *nodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublis
 	glog.V(4).Infof("target %v\ndevice %v\nreadonly %v\nvolumeId %v\nattributes %v\nmountflags %v\n",
 		targetPath, deviceID, readOnly, volumeID, attrib, mountFlags)
 
-	b, err := ns.s3.client.getBucket(volumeID)
+	s3, err := newS3ClientFromSecrets(req.GetSecrets())
+	if err != nil {
+		return nil, fmt.Errorf("failed to initialize S3 client: %s", err)
+	}
+	b, err := s3.getBucket(volumeID)
 	if err != nil {
 		return nil, err
 	}
 
-	mounter, err := newMounter(b, ns.s3.cfg)
+	mounter, err := newMounter(b, s3.cfg)
 	if err != nil {
 		return nil, err
 	}
@@ -106,15 +110,7 @@ func (ns *nodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeUnpu
 		return nil, status.Error(codes.InvalidArgument, "Target path missing in request")
 	}
 
-	b, err := ns.s3.client.getBucket(volumeID)
-	if err != nil {
-		return nil, err
-	}
-	mounter, err := newMounter(b, ns.s3.cfg)
-	if err != nil {
-		return nil, err
-	}
-	if err := mounter.Unmount(targetPath); err != nil {
+	if err := fuseUnmount(targetPath); err != nil {
 		return nil, status.Error(codes.Internal, err.Error())
 	}
 	glog.V(4).Infof("s3: bucket %s has been unmounted.", volumeID)
@@ -146,12 +142,15 @@ func (ns *nodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStageVol
 	if !notMnt {
 		return &csi.NodeStageVolumeResponse{}, nil
 	}
-	b, err := ns.s3.client.getBucket(volumeID)
+	s3, err := newS3ClientFromSecrets(req.GetSecrets())
+	if err != nil {
+		return nil, fmt.Errorf("failed to initialize S3 client: %s", err)
+	}
+	b, err := s3.getBucket(volumeID)
 	if err != nil {
 		return nil, err
 	}
-
-	mounter, err := newMounter(b, ns.s3.cfg)
+	mounter, err := newMounter(b, s3.cfg)
 	if err != nil {
 		return nil, err
 	}
@@ -174,18 +173,6 @@ func (ns *nodeServer) NodeUnstageVolume(ctx context.Context, req *csi.NodeUnstag
 		return nil, status.Error(codes.InvalidArgument, "Target path missing in request")
 	}
 
-	b, err := ns.s3.client.getBucket(volumeID)
-	if err != nil {
-		return nil, err
-	}
-	mounter, err := newMounter(b, ns.s3.cfg)
-	if err != nil {
-		return nil, err
-	}
-	if err := mounter.Unstage(stagingTargetPath); err != nil {
-		return nil, err
-	}
-
 	return &csi.NodeUnstageVolumeResponse{}, nil
 }
 
diff --git a/pkg/s3/s3-client.go b/pkg/s3/s3-client.go
index 8591caf..2c3ef59 100644
--- a/pkg/s3/s3-client.go
+++ b/pkg/s3/s3-client.go
@@ -49,6 +49,18 @@ func newS3Client(cfg *Config) (*s3Client, error) {
 	return client, nil
 }
 
+func newS3ClientFromSecrets(secrets map[string]string) (*s3Client, error) {
+	return newS3Client(&Config{
+		AccessKeyID:     secrets["accessKeyID"],
+		SecretAccessKey: secrets["secretAccessKey"],
+		Region:          secrets["region"],
+		Endpoint:        secrets["endpoint"],
+		EncryptionKey:   secrets["encryptionKey"],
+		// Mounter is set in the volume preferences, not secrets
+		Mounter: "",
+	})
+}
+
 func (client *s3Client) bucketExists(bucketName string) (bool, error) {
 	return client.minio.BucketExists(bucketName)
 }
diff --git a/pkg/s3/s3-driver.go b/pkg/s3/s3-driver.go
index 522562e..5431829 100644
--- a/pkg/s3/s3-driver.go
+++ b/pkg/s3/s3-driver.go
@@ -20,14 +20,12 @@ import (
 	"github.com/container-storage-interface/spec/lib/go/csi"
 	"github.com/golang/glog"
 
-	"github.com/kubernetes-csi/drivers/pkg/csi-common"
+	csicommon "github.com/kubernetes-csi/drivers/pkg/csi-common"
 )
 
 type s3 struct {
 	driver   *csicommon.CSIDriver
-	client   *s3Client
 	endpoint string
-	cfg      *Config
 
 	ids *identityServer
 	ns  *nodeServer
@@ -47,22 +45,15 @@ var (
 )
 
 // NewS3 initializes the driver
-func NewS3(nodeID string, endpoint string, cfg *Config) (*s3, error) {
+func NewS3(nodeID string, endpoint string) (*s3, error) {
 	driver := csicommon.NewCSIDriver(driverName, vendorVersion, nodeID)
 	if driver == nil {
 		glog.Fatalln("Failed to initialize CSI Driver.")
 	}
 
-	client, err := newS3Client(cfg)
-	if err != nil {
-		glog.V(3).Infof("Failed to create s3 client: %v", err)
-		return nil, err
-	}
 	s3Driver := &s3{
 		endpoint: endpoint,
 		driver:   driver,
-		client:   client,
-		cfg:      cfg,
 	}
 	return s3Driver, nil
 }
@@ -70,21 +61,18 @@ func NewS3(nodeID string, endpoint string, cfg *Config) (*s3, error) {
 func (s3 *s3) newIdentityServer(d *csicommon.CSIDriver) *identityServer {
 	return &identityServer{
 		DefaultIdentityServer: csicommon.NewDefaultIdentityServer(d),
-		s3:                    s3,
 	}
 }
 
 func (s3 *s3) newControllerServer(d *csicommon.CSIDriver) *controllerServer {
 	return &controllerServer{
 		DefaultControllerServer: csicommon.NewDefaultControllerServer(d),
-		s3:                      s3,
 	}
 }
 
 func (s3 *s3) newNodeServer(d *csicommon.CSIDriver) *nodeServer {
 	return &nodeServer{
 		DefaultNodeServer: csicommon.NewDefaultNodeServer(d),
-		s3:                s3,
 	}
 }
 
diff --git a/pkg/s3/s3-driver_suite_test.go b/pkg/s3/s3-driver_suite_test.go
index 8fbe0f7..aa6d809 100644
--- a/pkg/s3/s3-driver_suite_test.go
+++ b/pkg/s3/s3-driver_suite_test.go
@@ -24,16 +24,10 @@ var _ = Describe("S3Driver", func() {
 	Context("goofys", func() {
 		socket := "/tmp/csi-goofys.sock"
 		csiEndpoint := "unix://" + socket
-		cfg := &s3.Config{
-			AccessKeyID:     "FJDSJ",
-			SecretAccessKey: "DSG643HGDS",
-			Endpoint:        "http://127.0.0.1:9000",
-			Mounter:         "goofys",
-		}
 		if err := os.Remove(socket); err != nil && !os.IsNotExist(err) {
 			Expect(err).NotTo(HaveOccurred())
 		}
-		driver, err := s3.NewS3("test-node", csiEndpoint, cfg)
+		driver, err := s3.NewS3("test-node", csiEndpoint)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -44,6 +38,10 @@ var _ = Describe("S3Driver", func() {
 				TargetPath:  mntDir,
 				StagingPath: stagingDir,
 				Address:     csiEndpoint,
+				SecretsFile: "../../test/secret.yaml",
+				TestVolumeParameters: map[string]string{
+					"mounter": "goofys",
+				},
 			}
 			sanity.GinkgoTest(sanityCfg)
 		})
@@ -52,16 +50,10 @@ var _ = Describe("S3Driver", func() {
 	Context("s3fs", func() {
 		socket := "/tmp/csi-s3fs.sock"
 		csiEndpoint := "unix://" + socket
-		cfg := &s3.Config{
-			AccessKeyID:     "FJDSJ",
-			SecretAccessKey: "DSG643HGDS",
-			Endpoint:        "http://127.0.0.1:9000",
-			Mounter:         "s3fs",
-		}
 		if err := os.Remove(socket); err != nil && !os.IsNotExist(err) {
 			Expect(err).NotTo(HaveOccurred())
 		}
-		driver, err := s3.NewS3("test-node", csiEndpoint, cfg)
+		driver, err := s3.NewS3("test-node", csiEndpoint)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -72,6 +64,10 @@ var _ = Describe("S3Driver", func() {
 				TargetPath:  mntDir,
 				StagingPath: stagingDir,
 				Address:     csiEndpoint,
+				SecretsFile: "../../test/secret.yaml",
+				TestVolumeParameters: map[string]string{
+					"mounter": "s3fs",
+				},
 			}
 			sanity.GinkgoTest(sanityCfg)
 		})
@@ -81,16 +77,10 @@ var _ = Describe("S3Driver", func() {
 		socket := "/tmp/csi-s3ql.sock"
 		csiEndpoint := "unix://" + socket
 
-		cfg := &s3.Config{
-			AccessKeyID:     "FJDSJ",
-			SecretAccessKey: "DSG643HGDS",
-			Endpoint:        "http://127.0.0.1:9000",
-			Mounter:         "s3ql",
-		}
 		if err := os.Remove(socket); err != nil && !os.IsNotExist(err) {
 			Expect(err).NotTo(HaveOccurred())
 		}
-		driver, err := s3.NewS3("test-node", csiEndpoint, cfg)
+		driver, err := s3.NewS3("test-node", csiEndpoint)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -103,6 +93,10 @@ var _ = Describe("S3Driver", func() {
 				TargetPath:  mntDir,
 				StagingPath: stagingDir,
 				Address:     csiEndpoint,
+				SecretsFile: "../../test/secret.yaml",
+				TestVolumeParameters: map[string]string{
+					"mounter": "s3ql",
+				},
 			}
 			sanity.GinkgoTest(sanityCfg)
 		})
@@ -112,18 +106,12 @@ var _ = Describe("S3Driver", func() {
 		socket := "/tmp/csi-s3backer.sock"
 		csiEndpoint := "unix://" + socket
 
-		cfg := &s3.Config{
-			AccessKeyID:     "FJDSJ",
-			SecretAccessKey: "DSG643HGDS",
-			Endpoint:        "http://127.0.0.1:9000",
-			Mounter:         "s3backer",
-		}
 		if err := os.Remove(socket); err != nil && !os.IsNotExist(err) {
 			Expect(err).NotTo(HaveOccurred())
 		}
 		// Clear loop device so we cover the creation of it
 		os.Remove(s3.S3backerLoopDevice)
-		driver, err := s3.NewS3("test-node", csiEndpoint, cfg)
+		driver, err := s3.NewS3("test-node", csiEndpoint)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -134,6 +122,10 @@ var _ = Describe("S3Driver", func() {
 				TargetPath:  mntDir,
 				StagingPath: stagingDir,
 				Address:     csiEndpoint,
+				SecretsFile: "../../test/secret.yaml",
+				TestVolumeParameters: map[string]string{
+					"mounter": "s3backer",
+				},
 			}
 			sanity.GinkgoTest(sanityCfg)
 		})
@@ -143,16 +135,10 @@ var _ = Describe("S3Driver", func() {
 		socket := "/tmp/csi-rclone.sock"
 		csiEndpoint := "unix://" + socket
 
-		cfg := &s3.Config{
-			AccessKeyID:     "FJDSJ",
-			SecretAccessKey: "DSG643HGDS",
-			Endpoint:        "http://127.0.0.1:9000",
-			Mounter:         "rclone",
-		}
 		if err := os.Remove(socket); err != nil && !os.IsNotExist(err) {
 			Expect(err).NotTo(HaveOccurred())
 		}
-		driver, err := s3.NewS3("test-node", csiEndpoint, cfg)
+		driver, err := s3.NewS3("test-node", csiEndpoint)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -163,6 +149,10 @@ var _ = Describe("S3Driver", func() {
 				TargetPath:  mntDir,
 				StagingPath: stagingDir,
 				Address:     csiEndpoint,
+				SecretsFile: "../../test/secret.yaml",
+				TestVolumeParameters: map[string]string{
+					"mounter": "rclone",
+				},
 			}
 			sanity.GinkgoTest(sanityCfg)
 		})
diff --git a/pkg/s3/util.go b/pkg/s3/util.go
index e0bc29f..da95a7c 100644
--- a/pkg/s3/util.go
+++ b/pkg/s3/util.go
@@ -60,22 +60,20 @@ func waitForMount(path string, timeout time.Duration) error {
 	}
 }
 
-func findFuseMountProcess(path string, name string) (*os.Process, error) {
+func findFuseMountProcess(path string) (*os.Process, error) {
 	processes, err := ps.Processes()
 	if err != nil {
 		return nil, err
 	}
 	for _, p := range processes {
-		if strings.Contains(p.Executable(), name) {
-			cmdLine, err := getCmdLine(p.Pid())
-			if err != nil {
-				glog.Errorf("Unable to get cmdline of PID %v: %s", p.Pid(), err)
-				continue
-			}
-			if strings.Contains(cmdLine, path) {
-				glog.Infof("Found matching pid %v on path %s", p.Pid(), path)
-				return os.FindProcess(p.Pid())
-			}
+		cmdLine, err := getCmdLine(p.Pid())
+		if err != nil {
+			glog.Errorf("Unable to get cmdline of PID %v: %s", p.Pid(), err)
+			continue
+		}
+		if strings.Contains(cmdLine, path) {
+			glog.Infof("Found matching pid %v on path %s", p.Pid(), path)
+			return os.FindProcess(p.Pid())
 		}
 	}
 	return nil, nil
diff --git a/test/secret.yaml b/test/secret.yaml
new file mode 100644
index 0000000..1f08c2f
--- /dev/null
+++ b/test/secret.yaml
@@ -0,0 +1,30 @@
+CreateVolumeSecret:
+  accessKeyID: FJDSJ
+  secretAccessKey: DSG643HGDS
+  endpoint: http://127.0.0.1:9000
+  region: ""
+  encryptionKey: ""
+DeleteVolumeSecret:
+  accessKeyID: FJDSJ
+  secretAccessKey: DSG643HGDS
+  endpoint: http://127.0.0.1:9000
+  region: ""
+  encryptionKey: ""
+NodeStageVolumeSecret:
+  accessKeyID: FJDSJ
+  secretAccessKey: DSG643HGDS
+  endpoint: http://127.0.0.1:9000
+  region: ""
+  encryptionKey: ""
+NodePublishVolumeSecret:
+  accessKeyID: FJDSJ
+  secretAccessKey: DSG643HGDS
+  endpoint: http://127.0.0.1:9000
+  region: ""
+  encryptionKey: ""
+ControllerValidateVolumeCapabilitiesSecret:
+  accessKeyID: FJDSJ
+  secretAccessKey: DSG643HGDS
+  endpoint: http://127.0.0.1:9000
+  region: ""
+  encryptionKey: ""
\ No newline at end of file
diff --git a/test/test.sh b/test/test.sh
index c5af8b6..0e8b809 100755
--- a/test/test.sh
+++ b/test/test.sh
@@ -5,4 +5,4 @@ export MINIO_SECRET_KEY=DSG643HGDS
 mkdir -p /tmp/minio
 minio server --quiet /tmp/minio &>/dev/null &
 sleep 5
-go test github.com/ctrox/csi-s3/pkg/s3 -cover
+go test github.com/ctrox/csi-s3/pkg/s3 -cover -coverprofile=coverage.out
\ No newline at end of file