finish basic fs commands, stub out file on server side

This commit is contained in:
Barak Michener 2018-03-31 15:11:02 -07:00
parent 8a91fdcb4e
commit a4f53875bc
5 changed files with 294 additions and 19 deletions

View file

@ -1,7 +1,10 @@
package kubelwagen
import (
"time"
"github.com/hanwen/go-fuse/fuse"
"github.com/hanwen/go-fuse/fuse/nodefs"
"github.com/hanwen/go-fuse/fuse/pathfs"
"github.com/sirupsen/logrus"
)
@ -46,6 +49,9 @@ func (fs *WsFs) getResponse(r *Request) (Response, bool) {
response: c,
}
resp, ok := <-c
if !ok {
logrus.Errorln("Response to request channel closed")
}
return resp, ok
}
@ -56,7 +62,6 @@ func (fs *WsFs) OpenDir(name string, context *fuse.Context) ([]fuse.DirEntry, fu
}
resp, ok := fs.getResponse(&r)
if !ok {
logrus.Errorln("Response to request channel closed")
return fs.FileSystem.OpenDir(name, context)
}
return resp.Dirents, resp.Code
@ -69,7 +74,6 @@ func (fs *WsFs) GetAttr(name string, context *fuse.Context) (*fuse.Attr, fuse.St
}
resp, ok := fs.getResponse(&r)
if !ok {
logrus.Errorln("Response to request channel closed")
return fs.FileSystem.GetAttr(name, context)
}
return resp.Stat, resp.Code
@ -82,9 +86,207 @@ func (fs *WsFs) StatFs(name string) *fuse.StatfsOut {
}
resp, ok := fs.getResponse(&r)
if !ok {
logrus.Errorln("Response to request channel closed")
return fs.FileSystem.StatFs(name)
}
return resp.Statfs
}
func (fs *WsFs) GetXAttr(name string, attr string, context *fuse.Context) ([]byte, fuse.Status) {
return nil, fuse.ENOATTR
}
func (fs *WsFs) SetXAttr(name string, attr string, data []byte, flags int, context *fuse.Context) fuse.Status {
return fuse.ENOSYS
}
func (fs *WsFs) ListXAttr(name string, context *fuse.Context) ([]string, fuse.Status) {
return nil, fuse.ENOSYS
}
func (fs *WsFs) RemoveXAttr(name string, attr string, context *fuse.Context) fuse.Status {
return fuse.ENOSYS
}
func (fs *WsFs) Readlink(name string, context *fuse.Context) (string, fuse.Status) {
r := Request{
Method: MethodReadLink,
Path: name,
}
resp, ok := fs.getResponse(&r)
if !ok {
return "", fuse.ENOSYS
}
return resp.LinkStr, resp.Code
}
func (fs *WsFs) Mknod(name string, mode uint32, dev uint32, context *fuse.Context) fuse.Status {
r := Request{
Method: MethodMknod,
Path: name,
Mode: mode,
Dev: int32(dev),
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Mkdir(name string, mode uint32, context *fuse.Context) fuse.Status {
r := Request{
Method: MethodMkdir,
Path: name,
Mode: mode,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Unlink(name string, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodUnlink,
Path: name,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Rmdir(name string, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodRmdir,
Path: name,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Symlink(value string, linkName string, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodSymlink,
Path: linkName,
NewPath: value,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Rename(oldName string, newName string, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodRename,
Path: oldName,
NewPath: newName,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Link(oldName string, newName string, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodLink,
Path: oldName,
NewPath: newName,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Chmod(name string, mode uint32, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodChmod,
Path: name,
Mode: mode,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Chown(name string, uid uint32, gid uint32, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodChown,
Path: name,
UID: uid,
GID: gid,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Truncate(name string, offset uint64, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodChown,
Path: name,
Offset: offset,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Access(name string, mode uint32, context *fuse.Context) (code fuse.Status) {
r := Request{
Method: MethodAccess,
Path: name,
Mode: mode,
}
resp, ok := fs.getResponse(&r)
if !ok {
return fuse.ENOSYS
}
return resp.Code
}
func (fs *WsFs) Utimens(name string, Atime *time.Time, Mtime *time.Time, context *fuse.Context) (code fuse.Status) {
return fuse.ENOSYS
}
func (fs *WsFs) Open(name string, flags uint32, context *fuse.Context) (file nodefs.File, code fuse.Status) {
r := Request{
Method: MethodOpen,
Flags: flags,
}
resp, ok := fs.getResponse(&r)
if !ok {
return nil, fuse.ENOSYS
}
return newWsFsFile(*resp.FileHandle, fs), resp.Code
}
func (fs *WsFs) Create(name string, flags uint32, mode uint32, context *fuse.Context) (file nodefs.File, code fuse.Status) {
r := Request{
Method: MethodCreate,
Flags: flags,
Mode: mode,
}
resp, ok := fs.getResponse(&r)
if !ok {
return nil, fuse.ENOSYS
}
return newWsFsFile(*resp.FileHandle, fs), resp.Code
}