k8s-csi-s3/pkg/mounter/goofys.go

87 lines
1.9 KiB
Go
Raw Normal View History

package mounter
import (
"fmt"
"os"
"path"
2021-07-16 13:12:57 +00:00
"strings"
"context"
"github.com/ctrox/csi-s3/pkg/s3"
goofysApi "github.com/kahing/goofys/api"
)
const (
goofysCmd = "goofys"
defaultRegion = "us-east-1"
)
// Implements Mounter
type goofysMounter struct {
meta *s3.FSMeta
endpoint string
region string
accessKeyID string
secretAccessKey string
}
func newGoofysMounter(meta *s3.FSMeta, cfg *s3.Config) (Mounter, error) {
region := cfg.Region
// if endpoint is set we need a default region
if region == "" && cfg.Endpoint != "" {
region = defaultRegion
}
return &goofysMounter{
meta: meta,
endpoint: cfg.Endpoint,
region: region,
accessKeyID: cfg.AccessKeyID,
secretAccessKey: cfg.SecretAccessKey,
}, nil
}
func (goofys *goofysMounter) Stage(stageTarget string) error {
return nil
}
func (goofys *goofysMounter) Unstage(stageTarget string) error {
return nil
}
func (goofys *goofysMounter) Mount(source string, target string) error {
2021-07-16 13:12:57 +00:00
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{
MountPoint: target,
Endpoint: goofys.endpoint,
Region: goofys.region,
DirMode: 0755,
FileMode: 0644,
2021-07-16 13:12:57 +00:00
MountOptions: mountOptions,
}
os.Setenv("AWS_ACCESS_KEY_ID", goofys.accessKeyID)
os.Setenv("AWS_SECRET_ACCESS_KEY", goofys.secretAccessKey)
fullPath := fmt.Sprintf("%s:%s", goofys.meta.BucketName, path.Join(goofys.meta.Prefix, goofys.meta.FSPath))
_, _, err := goofysApi.Mount(context.Background(), fullPath, goofysCfg)
if err != nil {
return fmt.Errorf("Error mounting via goofys: %s", err)
}
return nil
}