Add HTTPFS implementation (#93)
This commit is contained in:
parent
1d769673ca
commit
47198b3bc6
18 changed files with 549 additions and 44 deletions
46
fs/fs.go
46
fs/fs.go
|
@ -1,6 +1,9 @@
|
|||
package fs
|
||||
|
||||
import (
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/distribyted/distribyted/iio"
|
||||
)
|
||||
|
||||
|
@ -21,3 +24,46 @@ type Filesystem interface {
|
|||
// directory entries.
|
||||
ReadDir(path string) (map[string]File, error)
|
||||
}
|
||||
|
||||
type fileInfo struct {
|
||||
name string
|
||||
size int64
|
||||
isDir bool
|
||||
}
|
||||
|
||||
func NewFileInfo(name string, size int64, isDir bool) *fileInfo {
|
||||
return &fileInfo{
|
||||
name: name,
|
||||
size: size,
|
||||
isDir: isDir,
|
||||
}
|
||||
}
|
||||
|
||||
func (fi *fileInfo) Name() string {
|
||||
return fi.name
|
||||
}
|
||||
|
||||
func (fi *fileInfo) Size() int64 {
|
||||
return fi.size
|
||||
}
|
||||
|
||||
func (fi *fileInfo) Mode() os.FileMode {
|
||||
if fi.isDir {
|
||||
return 0555 | os.ModeDir
|
||||
}
|
||||
|
||||
return 0555
|
||||
}
|
||||
|
||||
func (fi *fileInfo) ModTime() time.Time {
|
||||
// TODO fix it
|
||||
return time.Now()
|
||||
}
|
||||
|
||||
func (fi *fileInfo) IsDir() bool {
|
||||
return fi.isDir
|
||||
}
|
||||
|
||||
func (fi *fileInfo) Sys() interface{} {
|
||||
return nil
|
||||
}
|
||||
|
|
24
fs/fs_test.go
Normal file
24
fs/fs_test.go
Normal file
|
@ -0,0 +1,24 @@
|
|||
package fs
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestFileinfo(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
require := require.New(t)
|
||||
|
||||
fi := NewFileInfo("name", 42, false)
|
||||
|
||||
require.Equal(fi.IsDir(), false)
|
||||
require.Equal(fi.Name(), "name")
|
||||
require.Equal(fi.Size(), int64(42))
|
||||
require.NotNil(fi.ModTime())
|
||||
require.Equal(fi.Mode(), fs.FileMode(0555))
|
||||
require.Equal(fi.Sys(), nil)
|
||||
|
||||
}
|
49
fs/memory.go
Normal file
49
fs/memory.go
Normal file
|
@ -0,0 +1,49 @@
|
|||
package fs
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
)
|
||||
|
||||
var _ Filesystem = &Memory{}
|
||||
|
||||
type Memory struct {
|
||||
Storage *storage
|
||||
}
|
||||
|
||||
func NewMemory() *Memory {
|
||||
return &Memory{
|
||||
Storage: newStorage(nil),
|
||||
}
|
||||
}
|
||||
|
||||
func (fs *Memory) Open(filename string) (File, error) {
|
||||
return fs.Storage.Get(filename)
|
||||
}
|
||||
|
||||
func (fs *Memory) ReadDir(path string) (map[string]File, error) {
|
||||
return fs.Storage.Children(path), nil
|
||||
}
|
||||
|
||||
var _ File = &MemoryFile{}
|
||||
|
||||
type MemoryFile struct {
|
||||
*bytes.Reader
|
||||
}
|
||||
|
||||
func NewMemoryFile(data []byte) *MemoryFile {
|
||||
return &MemoryFile{
|
||||
Reader: bytes.NewReader(data),
|
||||
}
|
||||
}
|
||||
|
||||
func (d *MemoryFile) Size() int64 {
|
||||
return int64(d.Reader.Len())
|
||||
}
|
||||
|
||||
func (d *MemoryFile) IsDir() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (d *MemoryFile) Close() (err error) {
|
||||
return
|
||||
}
|
39
fs/memory_test.go
Normal file
39
fs/memory_test.go
Normal file
|
@ -0,0 +1,39 @@
|
|||
package fs
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestMemory(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
require := require.New(t)
|
||||
|
||||
mem := NewMemory()
|
||||
|
||||
mem.Storage.Add(NewMemoryFile([]byte("Hello")), "/dir/here")
|
||||
|
||||
fss := map[string]Filesystem{
|
||||
"/test": mem,
|
||||
}
|
||||
|
||||
c, err := NewContainerFs(fss)
|
||||
require.NoError(err)
|
||||
|
||||
f, err := c.Open("/test/dir/here")
|
||||
require.NoError(err)
|
||||
require.NotNil(f)
|
||||
require.Equal(int64(5), f.Size())
|
||||
require.NoError(f.Close())
|
||||
|
||||
files, err := c.ReadDir("/")
|
||||
require.NoError(err)
|
||||
require.Len(files, 1)
|
||||
|
||||
files, err = c.ReadDir("/test")
|
||||
require.NoError(err)
|
||||
require.Len(files, 1)
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue