diff --git a/k8s/charts/seaweedfs/templates/filer-statefulset.yaml b/k8s/charts/seaweedfs/templates/filer-statefulset.yaml index 5f2092be2..df299a145 100644 --- a/k8s/charts/seaweedfs/templates/filer-statefulset.yaml +++ b/k8s/charts/seaweedfs/templates/filer-statefulset.yaml @@ -33,6 +33,13 @@ spec: helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/component: filer + {{ with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + {{ with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} spec: restartPolicy: {{ default .Values.global.restartPolicy .Values.filer.restartPolicy }} {{- if .Values.filer.affinity }} diff --git a/k8s/charts/seaweedfs/templates/master-statefulset.yaml b/k8s/charts/seaweedfs/templates/master-statefulset.yaml index 1da629dc6..0efde8f4b 100644 --- a/k8s/charts/seaweedfs/templates/master-statefulset.yaml +++ b/k8s/charts/seaweedfs/templates/master-statefulset.yaml @@ -32,6 +32,13 @@ spec: helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/component: master + {{ with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + {{ with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} spec: restartPolicy: {{ default .Values.global.restartPolicy .Values.master.restartPolicy }} {{- if .Values.master.affinity }} diff --git a/k8s/charts/seaweedfs/templates/s3-deployment.yaml b/k8s/charts/seaweedfs/templates/s3-deployment.yaml index 3cf3008df..2a343b573 100644 --- a/k8s/charts/seaweedfs/templates/s3-deployment.yaml +++ b/k8s/charts/seaweedfs/templates/s3-deployment.yaml @@ -24,6 +24,13 @@ spec: helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/component: s3 + {{ with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + {{ with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} spec: restartPolicy: {{ default .Values.global.restartPolicy .Values.s3.restartPolicy }} {{- if .Values.s3.tolerations }} diff --git a/k8s/charts/seaweedfs/templates/volume-statefulset.yaml b/k8s/charts/seaweedfs/templates/volume-statefulset.yaml index 9f851fee0..616a233dd 100644 --- a/k8s/charts/seaweedfs/templates/volume-statefulset.yaml +++ b/k8s/charts/seaweedfs/templates/volume-statefulset.yaml @@ -26,6 +26,13 @@ spec: helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/component: volume + {{ with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + {{ with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} spec: {{- if .Values.volume.affinity }} affinity: diff --git a/k8s/charts/seaweedfs/values.yaml b/k8s/charts/seaweedfs/values.yaml index 99799f3a0..2884621c1 100644 --- a/k8s/charts/seaweedfs/values.yaml +++ b/k8s/charts/seaweedfs/values.yaml @@ -654,3 +654,8 @@ certificates: # you will need to store your provided certificates in the secret read by the different services: # seaweedfs-master-cert, seaweedfs-filer-cert, etc. Can see any statefulset definition to see secret names enabled: false + +# Labels to be added to all the created pods +podLabels: {} +# Annotations to be added to all the created pods +podAnnotations: {} diff --git a/weed/command/filer.go b/weed/command/filer.go index 7e636974f..fe0beb5b8 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -169,7 +169,7 @@ func runFiler(cmd *Command, args []string) bool { go stats_collect.StartMetricsServer(*f.bindIp, *f.metricsHttpPort) - filerAddress := util.JoinHostPort(*f.ip, *f.port) + filerAddress := pb.NewServerAddress(*f.ip, *f.port, *f.portGrpc).String() startDelay := time.Duration(2) if *filerStartS3 { filerS3Options.filer = &filerAddress diff --git a/weed/server/webdav_server.go b/weed/server/webdav_server.go index 189378dcd..945c68279 100644 --- a/weed/server/webdav_server.go +++ b/weed/server/webdav_server.go @@ -63,6 +63,10 @@ func NewWebDavServer(option *WebDavOption) (ws *WebDavServer, err error) { if option.FilerRootPath == "/" { option.FilerRootPath = "" } + // filer.path non "/" option means we are accessing filer's sub-folders + if option.FilerRootPath != "" { + fs = NewWrappedFs(fs, path.Clean(option.FilerRootPath)) + } ws = &WebDavServer{ option: option, @@ -204,8 +208,6 @@ func (fs *WebDavFileSystem) Mkdir(ctx context.Context, fullDirPath string, perm } func (fs *WebDavFileSystem) OpenFile(ctx context.Context, fullFilePath string, flag int, perm os.FileMode) (webdav.File, error) { - // Add filer.path - fullFilePath = fs.option.FilerRootPath + fullFilePath glog.V(2).Infof("WebDavFileSystem.OpenFile %v %x", fullFilePath, flag) var err error @@ -377,8 +379,6 @@ func (fs *WebDavFileSystem) stat(ctx context.Context, fullFilePath string) (os.F } func (fs *WebDavFileSystem) Stat(ctx context.Context, name string) (os.FileInfo, error) { - // Add filer.path - name = fs.option.FilerRootPath + name glog.V(2).Infof("WebDavFileSystem.Stat %v", name) return fs.stat(ctx, name) diff --git a/weed/server/wrapped_webdav_fs.go b/weed/server/wrapped_webdav_fs.go new file mode 100644 index 000000000..93e2b3122 --- /dev/null +++ b/weed/server/wrapped_webdav_fs.go @@ -0,0 +1,97 @@ +package weed_server + +import ( + "context" + "golang.org/x/net/webdav" + "io/fs" + "os" + "strings" +) + +type wrappedFs struct { + subFolder string + webdav.FileSystem +} + +// NewWrappedFs returns a webdav.FileSystem identical to fs, except it +// provides access to a sub-folder of fs that is denominated by subFolder. +// It transparently handles renaming paths and filenames so that the outer part of the wrapped filesystem +// does not leak out. +func NewWrappedFs(fs webdav.FileSystem, subFolder string) webdav.FileSystem { + return wrappedFs{ + subFolder: subFolder, + FileSystem: fs, + } +} + +func (w wrappedFs) Mkdir(ctx context.Context, name string, perm os.FileMode) error { + name = w.subFolder + name + return w.FileSystem.Mkdir(ctx, name, perm) +} + +func (w wrappedFs) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (webdav.File, error) { + name = w.subFolder + name + file, err := w.FileSystem.OpenFile(ctx, name, flag, perm) + file = wrappedFile{ + File: file, + subFolder: &w.subFolder, + } + + return file, err +} + +func (w wrappedFs) RemoveAll(ctx context.Context, name string) error { + name = w.subFolder + name + return w.FileSystem.RemoveAll(ctx, name) +} + +func (w wrappedFs) Rename(ctx context.Context, oldName, newName string) error { + oldName = w.subFolder + oldName + newName = w.subFolder + newName + return w.FileSystem.Rename(ctx, oldName, newName) +} + +func (w wrappedFs) Stat(ctx context.Context, name string) (os.FileInfo, error) { + name = w.subFolder + name + info, err := w.FileSystem.Stat(ctx, name) + info = wrappedFileInfo{ + subFolder: &w.subFolder, + FileInfo: info, + } + return info, err +} + +type wrappedFile struct { + webdav.File + subFolder *string +} + +func (w wrappedFile) Readdir(count int) ([]fs.FileInfo, error) { + infos, err := w.File.Readdir(count) + for i, info := range infos { + infos[i] = wrappedFileInfo{ + subFolder: w.subFolder, + FileInfo: info, + } + } + return infos, err +} + +func (w wrappedFile) Stat() (fs.FileInfo, error) { + info, err := w.File.Stat() + info = wrappedFileInfo{ + subFolder: w.subFolder, + FileInfo: info, + } + return info, err +} + +type wrappedFileInfo struct { + subFolder *string + fs.FileInfo +} + +func (w wrappedFileInfo) Name() string { + name := w.FileInfo.Name() + return strings.TrimPrefix(name, *w.subFolder) +}