non_unique cs3 index: final implementation

This commit is contained in:
A.Unger
2020-10-14 18:03:52 +02:00
committed by Ilja Neumann
parent 0ddd3d765b
commit 5be1cb1fd1
2 changed files with 143 additions and 65 deletions
+118 -22
View File
@@ -14,6 +14,7 @@ import (
"path"
"fmt"
"context"
"path/filepath"
"strings"
"github.com/cs3org/reva/pkg/token/manager/jwt"
)
@@ -32,9 +33,7 @@ type NonUnique struct {
cs3conf *Config
}
// NewNonUniqueIndex instantiates a new UniqueIndex instance. Init() should be
// called afterward to ensure correct on-disk structure.
//
// NewNonUniqueIndex instantiates a new NonUniqueIndex instance.
// /var/tmp/ocis-accounts/index.cs3/Pets/Bro*
// ├── Brown/
// │ └── rebef-123 -> /var/tmp/testfiles-395764020/pets/rebef-123
@@ -95,17 +94,42 @@ func (idx *NonUnique) Init() error {
return nil
}
func (idx NonUnique) Lookup(v string) ([]string, error) {
panic("implement me")
func (idx *NonUnique) Lookup(v string) ([]string, error) {
var matches = make([]string, 0)
ctx, err := idx.getAuthenticatedContext(context.Background())
if err != nil {
return nil, err
}
res, err := idx.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{
Ref: &provider.Reference{
Spec: &provider.Reference_Path{Path: path.Join("/meta", idx.indexRootDir, v)},
},
})
if err != nil {
return nil, err
}
for _, info := range res.Infos {
matches = append(matches, path.Base(info.Path))
}
return matches, nil
}
func (idx NonUnique) Add(id, v string) (string, error) {
newName := singleJoiningSlash(idx.cs3conf.DataURL, path.Join(idx.cs3conf.DataPrefix, idx.indexRootDir, v))
if err := idx.makeDirIfNotExists(context.TODO(), newName); err != nil {
func (idx *NonUnique) Add(id, v string) (string, error) {
ctx, err := idx.getAuthenticatedContext(context.Background())
if err != nil {
return "", err
}
if err := idx.createSymlink(id, path.Join(newName, id)); err != nil {
newName := path.Join(idx.indexRootDir, v)
if err := idx.makeDirIfNotExists(ctx, newName); err != nil {
return "", err
}
if err := idx.createSymlink(id, singleJoiningSlash(idx.cs3conf.DataURL, path.Join(idx.cs3conf.DataPrefix, newName, id))); err != nil {
if os.IsExist(err) {
return "", &idxerrs.AlreadyExistsErr{idx.typeName, idx.indexBy, v}
}
@@ -116,28 +140,91 @@ func (idx NonUnique) Add(id, v string) (string, error) {
return newName, nil
}
func (idx NonUnique) Remove(id string, v string) error {
panic("implement me")
func (idx *NonUnique) Remove(id string, v string) error {
ctx, err := idx.getAuthenticatedContext(context.Background())
if err != nil {
return err
}
deletePath := path.Join("/meta", idx.indexRootDir, v, id)
resp, err := idx.storageProvider.Delete(ctx, &provider.DeleteRequest{
Ref: &provider.Reference{
Spec: &provider.Reference_Path{Path: deletePath},
},
})
if err != nil {
return err
}
if resp.Status.Code == v1beta11.Code_CODE_NOT_FOUND {
return &idxerrs.NotFoundErr{idx.typeName, idx.indexBy, v}
}
return nil
}
func (idx NonUnique) Update(id, oldV, newV string) error {
panic("implement me")
func (idx *NonUnique) Update(id, oldV, newV string) error {
if err := idx.Remove(id, oldV); err != nil {
return err
}
if _, err := idx.Add(id, newV); err != nil {
return err
}
return nil
}
func (idx NonUnique) Search(pattern string) ([]string, error) {
panic("implement me")
func (idx *NonUnique) Search(pattern string) ([]string, error) {
ctx, err := idx.getAuthenticatedContext(context.Background())
if err != nil {
return nil, err
}
foldersMatched := make([]string, 0)
matches := make([]string, 0)
res, err := idx.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{
Ref: &provider.Reference{
Spec: &provider.Reference_Path{Path: path.Join("/meta", idx.indexRootDir)},
},
})
for _, i := range res.Infos {
if found, err := filepath.Match(pattern, path.Base(i.Path)); found {
if err != nil {
return nil, err
}
foldersMatched = append(foldersMatched, i.Path)
}
}
for i := range foldersMatched {
res, _ := idx.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{
Ref: &provider.Reference{
Spec: &provider.Reference_Path{Path: foldersMatched[i]},
},
})
for _, info := range res.Infos {
matches = append(matches, path.Base(info.Path))
}
}
return matches, nil
}
func (idx NonUnique) IndexBy() string {
panic("implement me")
func (idx *NonUnique) IndexBy() string {
return idx.indexBy
}
func (idx NonUnique) TypeName() string {
panic("implement me")
func (idx *NonUnique) TypeName() string {
return idx.typeName
}
func (idx NonUnique) FilesDir() string {
panic("implement me")
func (idx *NonUnique) FilesDir() string {
return idx.filesDir
}
func (idx *NonUnique) authenticate(ctx context.Context) (token string, err error) {
@@ -222,3 +309,12 @@ func (idx *NonUnique) resolveSymlink(name string) (string, error) {
}
return string(b), err
}
func (idx *NonUnique) getAuthenticatedContext(ctx context.Context) (context.Context, error) {
t, err := idx.authenticate(ctx)
if err != nil {
return nil, err
}
ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t)
return ctx, nil
}
@@ -3,13 +3,13 @@ package cs3
import (
. "github.com/owncloud/ocis/accounts/pkg/indexer/test"
"github.com/stretchr/testify/assert"
"os"
"testing"
"os"
)
func TestCS3NonUniqueIndex_FakeSymlink(t *testing.T) {
dataDir := WriteIndexTestDataCS3(t, TestData, "Id")
sut := NewUniqueIndex("User", "Name", "/meta", "index.cs3", &Config{
sut := NewNonUniqueIndex("User", "Name", "/meta", "index.cs3", &Config{
ProviderAddr: "0.0.0.0:9215",
DataURL: "http://localhost:9216",
DataPrefix: "data",
@@ -24,47 +24,29 @@ func TestCS3NonUniqueIndex_FakeSymlink(t *testing.T) {
res, err := sut.Add("abcdefg-123", "mikey")
assert.NoError(t, err)
t.Log(res)
//
//resLookup, err := sut.Lookup("mikey")
//assert.NoError(t, err)
//t.Log(resLookup)
//
//err = sut.Update("abcdefg-123", "mikey", "mickeyX")
//assert.NoError(t, err)
//
//_, err = sut.Search("mi*")
//assert.NoError(t, err)
//
//err = sut.Remove("", "mikey")
//assert.NoError(t, err)
_, err = sut.Add("abcdefg-234", "mikey")
assert.NoError(t, err)
t.Log(res)
_, err = sut.Add("soasdioahsfash", "milo")
assert.NoError(t, err)
t.Log(res)
_, err = sut.Add("asdasdsa", "jonas")
assert.NoError(t, err)
t.Log(res)
lookupRes, err := sut.Lookup("mikey")
assert.NoError(t, err)
t.Log(lookupRes)
searchRes, err := sut.Search("mi*")
assert.NoError(t, err)
t.Log(searchRes)
err = sut.Update("abcdefg-234", "mikey", "jonas")
assert.NoError(t, err)
_ = os.RemoveAll(dataDir)
}
//func TestCS3UniqueIndexSearch(t *testing.T) {
// dataDir := WriteIndexTestDataCS3(t, TestData, "Id")
// sut := NewUniqueIndex("User", "UserName", "/meta", "index.cs3", &Config{
// ProviderAddr: "0.0.0.0:9215",
// DataURL: "http://localhost:9216",
// DataPrefix: "data",
// JWTSecret: "Pive-Fumkiu4",
// ServiceUserName: "",
// ServiceUserUUID: "",
// })
//
// err := sut.Init()
// assert.NoError(t, err)
//
// _, err = sut.Add("hijklmn-456", "mikey")
// assert.NoError(t, err)
//
// _, err = sut.Add("ewf4ofk-555", "jacky")
// assert.NoError(t, err)
//
// res, err := sut.Search("*y")
// assert.NoError(t, err)
// t.Log(res)
//
// _ = os.RemoveAll(dataDir)
//
//}