Add mount options support
This commit is contained in:
parent
0433ead376
commit
d78d476d6d
6 changed files with 36 additions and 4 deletions
|
@ -22,6 +22,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"path"
|
"path"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ctrox/csi-s3/pkg/mounter"
|
"github.com/ctrox/csi-s3/pkg/mounter"
|
||||||
|
@ -50,6 +51,20 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
|
||||||
volumeID := sanitizeVolumeID(req.GetName())
|
volumeID := sanitizeVolumeID(req.GetName())
|
||||||
bucketName := volumeID
|
bucketName := volumeID
|
||||||
prefix := ""
|
prefix := ""
|
||||||
|
mountOptions := make([]string, 0)
|
||||||
|
mountOptStr := params[mounter.OptionsKey]
|
||||||
|
if mountOptStr != "" {
|
||||||
|
re, _ := regexp.Compile(`([^\s"]+|"([^"\\]+|\\")*")+`)
|
||||||
|
re2, _ := regexp.Compile(`"([^"\\]+|\\")*"`)
|
||||||
|
re3, _ := regexp.Compile(`\\(.)`)
|
||||||
|
for _, opt := range re.FindAll([]byte(mountOptStr), -1) {
|
||||||
|
// Unquote options
|
||||||
|
opt = re2.ReplaceAllFunc(opt, func(q []byte) []byte {
|
||||||
|
return re3.ReplaceAll(q[1 : len(q)-1], []byte("$1"))
|
||||||
|
})
|
||||||
|
mountOptions = append(mountOptions, string(opt))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// check if bucket name is overridden
|
// check if bucket name is overridden
|
||||||
if nameOverride, ok := params[mounter.BucketKey]; ok {
|
if nameOverride, ok := params[mounter.BucketKey]; ok {
|
||||||
|
@ -77,6 +92,7 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
|
||||||
BucketName: bucketName,
|
BucketName: bucketName,
|
||||||
Prefix: prefix,
|
Prefix: prefix,
|
||||||
Mounter: mounterType,
|
Mounter: mounterType,
|
||||||
|
MountOptions: mountOptions,
|
||||||
CapacityBytes: capacityBytes,
|
CapacityBytes: capacityBytes,
|
||||||
FSPath: defaultFsPath,
|
FSPath: defaultFsPath,
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
@ -49,15 +50,27 @@ func (goofys *goofysMounter) Unstage(stageTarget string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (goofys *goofysMounter) Mount(source string, target string) error {
|
func (goofys *goofysMounter) Mount(source string, target string) error {
|
||||||
|
mountOptions := make(map[string]string)
|
||||||
|
for _, opt := range goofys.meta.MountOptions {
|
||||||
|
s := 0
|
||||||
|
if len(opt) >= 2 && opt[0] == '-' && opt[1] == byte('-') {
|
||||||
|
s = 2
|
||||||
|
}
|
||||||
|
p := strings.Index(opt, "=")
|
||||||
|
if p > 0 {
|
||||||
|
mountOptions[string(opt[s : p])] = string(opt[p : ])
|
||||||
|
} else {
|
||||||
|
mountOptions[string(opt[s : ])] = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mountOptions["allow_other"] = ""
|
||||||
goofysCfg := &goofysApi.Config{
|
goofysCfg := &goofysApi.Config{
|
||||||
MountPoint: target,
|
MountPoint: target,
|
||||||
Endpoint: goofys.endpoint,
|
Endpoint: goofys.endpoint,
|
||||||
Region: goofys.region,
|
Region: goofys.region,
|
||||||
DirMode: 0755,
|
DirMode: 0755,
|
||||||
FileMode: 0644,
|
FileMode: 0644,
|
||||||
MountOptions: map[string]string{
|
MountOptions: mountOptions,
|
||||||
"allow_other": "",
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
os.Setenv("AWS_ACCESS_KEY_ID", goofys.accessKeyID)
|
os.Setenv("AWS_ACCESS_KEY_ID", goofys.accessKeyID)
|
||||||
|
|
|
@ -31,6 +31,7 @@ const (
|
||||||
rcloneMounterType = "rclone"
|
rcloneMounterType = "rclone"
|
||||||
TypeKey = "mounter"
|
TypeKey = "mounter"
|
||||||
BucketKey = "bucket"
|
BucketKey = "bucket"
|
||||||
|
OptionsKey = "options"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New returns a new mounter depending on the mounterType parameter
|
// New returns a new mounter depending on the mounterType parameter
|
||||||
|
|
|
@ -50,9 +50,9 @@ func (rclone *rcloneMounter) Mount(source string, target string) error {
|
||||||
fmt.Sprintf("--s3-region=%s", rclone.region),
|
fmt.Sprintf("--s3-region=%s", rclone.region),
|
||||||
fmt.Sprintf("--s3-endpoint=%s", rclone.url),
|
fmt.Sprintf("--s3-endpoint=%s", rclone.url),
|
||||||
"--allow-other",
|
"--allow-other",
|
||||||
// TODO: make this configurable
|
|
||||||
"--vfs-cache-mode=writes",
|
"--vfs-cache-mode=writes",
|
||||||
}
|
}
|
||||||
|
args = append(args, rclone.meta.MountOptions...)
|
||||||
os.Setenv("AWS_ACCESS_KEY_ID", rclone.accessKeyID)
|
os.Setenv("AWS_ACCESS_KEY_ID", rclone.accessKeyID)
|
||||||
os.Setenv("AWS_SECRET_ACCESS_KEY", rclone.secretAccessKey)
|
os.Setenv("AWS_SECRET_ACCESS_KEY", rclone.secretAccessKey)
|
||||||
return fuseMount(target, rcloneCmd, args)
|
return fuseMount(target, rcloneCmd, args)
|
||||||
|
|
|
@ -50,6 +50,7 @@ func (s3fs *s3fsMounter) Mount(source string, target string) error {
|
||||||
"-o", "allow_other",
|
"-o", "allow_other",
|
||||||
"-o", "mp_umask=000",
|
"-o", "mp_umask=000",
|
||||||
}
|
}
|
||||||
|
args = append(args, s3fs.meta.MountOptions...)
|
||||||
return fuseMount(target, s3fsCmd, args)
|
return fuseMount(target, s3fsCmd, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ type FSMeta struct {
|
||||||
BucketName string `json:"Name"`
|
BucketName string `json:"Name"`
|
||||||
Prefix string `json:"Prefix"`
|
Prefix string `json:"Prefix"`
|
||||||
Mounter string `json:"Mounter"`
|
Mounter string `json:"Mounter"`
|
||||||
|
MountOptions []string `json:"MountOptions"`
|
||||||
FSPath string `json:"FSPath"`
|
FSPath string `json:"FSPath"`
|
||||||
CapacityBytes int64 `json:"CapacityBytes"`
|
CapacityBytes int64 `json:"CapacityBytes"`
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue