diff --git a/cmd/s3driver/main.go b/cmd/s3driver/main.go index f071b10..805804d 100644 --- a/cmd/s3driver/main.go +++ b/cmd/s3driver/main.go @@ -35,6 +35,7 @@ var ( 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)") ) @@ -46,6 +47,7 @@ func main() { SecretAccessKey: *secretAccessKey, Endpoint: *s3endpoint, Region: *region, + Mounter: *mounter, EncryptionKey: *encryptionKey, } diff --git a/deploy/kubernetes/csi-s3-driver.yaml b/deploy/kubernetes/csi-s3-driver.yaml index 931a831..3dba016 100644 --- a/deploy/kubernetes/csi-s3-driver.yaml +++ b/deploy/kubernetes/csi-s3-driver.yaml @@ -83,6 +83,7 @@ spec: - "--secret-access-key=$(SECRET_ACCESS_KEY)" - "--s3-endpoint=$(S3_ENDPOINT)" - "--region=$(REGION)" + - "--mounter=$(MOUNTER)" - "--encryption-key=$(ENCRYPTION_KEY)" - "--v=4" env: @@ -112,6 +113,11 @@ spec: secretKeyRef: name: csi-s3-secret key: region + - name: MOUNTER + valueFrom: + secretKeyRef: + name: csi-s3-secret + key: mounter - name: ENCRYPTION_KEY valueFrom: secretKeyRef: diff --git a/deploy/kubernetes/provisioner.yaml b/deploy/kubernetes/provisioner.yaml index 11f9e97..99cfebc 100644 --- a/deploy/kubernetes/provisioner.yaml +++ b/deploy/kubernetes/provisioner.yaml @@ -87,6 +87,7 @@ spec: - "--secret-access-key=$(SECRET_ACCESS_KEY)" - "--s3-endpoint=$(S3_ENDPOINT)" - "--region=$(REGION)" + - "--mounter=$(MOUNTER)" - "--encryption-key=$(ENCRYPTION_KEY)" - "--v=4" env: @@ -116,6 +117,11 @@ spec: secretKeyRef: name: csi-s3-secret key: region + - name: MOUNTER + valueFrom: + secretKeyRef: + name: csi-s3-secret + key: mounter - name: ENCRYPTION_KEY valueFrom: secretKeyRef: diff --git a/deploy/kubernetes/secret.yaml b/deploy/kubernetes/secret.yaml index b0119fa..7342f52 100644 --- a/deploy/kubernetes/secret.yaml +++ b/deploy/kubernetes/secret.yaml @@ -6,7 +6,11 @@ stringData: accessKeyID: secretAccessKey: endpoint: - # If not on S3, just set it to "" + # If not on S3, set it to "" region: + # specify which mounter to use + # can be set to s3fs, goofys or s3ql + mounter: # Currently only for s3ql - # encryptionKey: + # If not using s3ql, set it to "" + encryptionKey: diff --git a/deploy/kubernetes/storageclass.yaml b/deploy/kubernetes/storageclass.yaml index a6dfd9b..dfe708d 100644 --- a/deploy/kubernetes/storageclass.yaml +++ b/deploy/kubernetes/storageclass.yaml @@ -4,8 +4,3 @@ apiVersion: storage.k8s.io/v1 metadata: name: csi-s3 provisioner: ch.ctrox.csi.s3-driver -parameters: - # specify which mounter to use - # can be set to s3fs, goofys or s3ql - # s3fs is the default - # mounter: s3ql diff --git a/pkg/s3/controllerserver.go b/pkg/s3/controllerserver.go index 1d3b859..f186bf1 100644 --- a/pkg/s3/controllerserver.go +++ b/pkg/s3/controllerserver.go @@ -60,11 +60,8 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol return nil, err } } - mounterType := cs.s3.cfg.Mounter - if mounterType == "" { - mounterType = req.GetParameters()[mounterKey] - } - mounter, err := newMounter(mounterType, volumeID, cs.s3.cfg) + + mounter, err := newMounter(volumeID, cs.s3.cfg) if err != nil { return nil, err } diff --git a/pkg/s3/mounter.go b/pkg/s3/mounter.go index 55d148a..aaaefd9 100644 --- a/pkg/s3/mounter.go +++ b/pkg/s3/mounter.go @@ -7,19 +7,18 @@ import "fmt" type Mounter interface { Format() error Mount(targetPath string) error + Unmount(targetPath string) error } const ( - mounterKey = "mounter" s3fsMounterType = "s3fs" goofysMounterType = "goofys" s3qlMounterType = "s3ql" ) // newMounter returns a new mounter depending on the mounterType parameter -func newMounter(mounterType string, bucket string, cfg *Config) (Mounter, error) { - switch mounterType { - case "": +func newMounter(bucket string, cfg *Config) (Mounter, error) { + switch cfg.Mounter { case s3fsMounterType: return newS3fsMounter(bucket, cfg) @@ -30,5 +29,5 @@ func newMounter(mounterType string, bucket string, cfg *Config) (Mounter, error) return newS3qlMounter(bucket, cfg) } - return nil, fmt.Errorf("Error mounting bucket %s, invalid mounter specified: %s", bucket, mounterType) + return nil, fmt.Errorf("Error mounting bucket %s, invalid mounter specified: %s", bucket, cfg.Mounter) } diff --git a/pkg/s3/mounter_goofys.go b/pkg/s3/mounter_goofys.go index 2a1b8c2..c3a0066 100644 --- a/pkg/s3/mounter_goofys.go +++ b/pkg/s3/mounter_goofys.go @@ -7,6 +7,7 @@ import ( "context" goofysApi "github.com/kahing/goofys/api" + "k8s.io/kubernetes/pkg/util/mount" ) const defaultRegion = "us-east-1" @@ -61,3 +62,7 @@ func (goofys *goofysMounter) Mount(targetPath string) error { } return nil } + +func (goofys *goofysMounter) Unmount(targetPath string) error { + return mount.New("").Unmount(targetPath) +} diff --git a/pkg/s3/mounter_s3fs.go b/pkg/s3/mounter_s3fs.go index 812f644..325e91d 100644 --- a/pkg/s3/mounter_s3fs.go +++ b/pkg/s3/mounter_s3fs.go @@ -4,6 +4,8 @@ import ( "fmt" "os" "os/exec" + + "k8s.io/kubernetes/pkg/util/mount" ) // Implements Mounter @@ -49,6 +51,10 @@ func (s3fs *s3fsMounter) Mount(targetPath string) error { return nil } +func (s3fs *s3fsMounter) Unmount(targetPath string) error { + return mount.New("").Unmount(targetPath) +} + 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 4995478..0932da3 100644 --- a/pkg/s3/mounter_s3ql.go +++ b/pkg/s3/mounter_s3ql.go @@ -26,8 +26,9 @@ type s3qlMounter struct { } const ( - s3qlCmdMkfs = "mkfs.s3ql" - s3qlCmdMount = "mount.s3ql" + s3qlCmdMkfs = "mkfs.s3ql" + s3qlCmdMount = "mount.s3ql" + s3qlCmdUnmount = "umount.s3ql" ) func newS3qlMounter(bucket string, cfg *Config) (Mounter, error) { @@ -78,6 +79,13 @@ func (s3ql *s3qlMounter) Mount(targetPath string) error { return s3qlCmd(s3qlCmdMount, append(args, s3ql.options...), nil) } +func (s3ql *s3qlMounter) Unmount(targetPath string) error { + args := []string{ + targetPath, + } + return s3qlCmd(s3qlCmdUnmount, append(args, s3ql.options...), nil) +} + func s3qlCmd(s3qlCmd string, args []string, stdin io.Reader) error { cmd := exec.Command(s3qlCmd, args...) if stdin != nil { diff --git a/pkg/s3/nodeserver.go b/pkg/s3/nodeserver.go index 446190a..a974db4 100644 --- a/pkg/s3/nodeserver.go +++ b/pkg/s3/nodeserver.go @@ -78,11 +78,7 @@ 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) - mounterType := ns.s3.cfg.Mounter - if mounterType == "" { - mounterType = attrib[mounterKey] - } - mounter, err := newMounter(mounterType, volumeID, ns.s3.cfg) + mounter, err := newMounter(volumeID, ns.s3.cfg) if err != nil { return nil, err } @@ -105,7 +101,11 @@ func (ns *nodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeUnpu return nil, status.Error(codes.InvalidArgument, "Target path missing in request") } - err := mount.New("").Unmount(req.GetTargetPath()) + mounter, err := newMounter(req.GetVolumeId(), ns.s3.cfg) + if err != nil { + return nil, err + } + mounter.Unmount(req.GetTargetPath()) if err != nil { return nil, status.Error(codes.Internal, err.Error()) }