Add HTTPFS implementation ()

This commit is contained in:
Antonio Navarro Perez 2021-11-23 13:05:49 +01:00 committed by GitHub
parent 1d769673ca
commit 47198b3bc6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 549 additions and 44 deletions

View file

@ -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
View 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
View 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
View 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)
}