mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-08 05:57:03 +09:00
nodeconf store
This commit is contained in:
parent
ed004a2ae0
commit
745f3d56fb
2 changed files with 145 additions and 0 deletions
62
nodeconf/nodeconfstore/nodeconfstore.go
Normal file
62
nodeconf/nodeconfstore/nodeconfstore.go
Normal file
|
@ -0,0 +1,62 @@
|
|||
package nodeconfstore
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/anytypeio/any-sync/app"
|
||||
"github.com/anytypeio/any-sync/nodeconf"
|
||||
"gopkg.in/yaml.v3"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func New() NodeConfStore {
|
||||
return new(nodeConfStore)
|
||||
}
|
||||
|
||||
type NodeConfStore interface {
|
||||
app.Component
|
||||
nodeconf.Store
|
||||
}
|
||||
|
||||
type nodeConfStore struct {
|
||||
path string
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
type configGetter interface {
|
||||
NodeConfStorePath() string
|
||||
}
|
||||
|
||||
func (n *nodeConfStore) Init(a *app.App) (err error) {
|
||||
n.path = a.MustComponent("config").(configGetter).NodeConfStorePath()
|
||||
return
|
||||
}
|
||||
|
||||
func (n *nodeConfStore) Name() (name string) {
|
||||
return nodeconf.CNameStore
|
||||
}
|
||||
|
||||
func (n *nodeConfStore) GetLast(ctx context.Context, netId string) (c nodeconf.Configuration, err error) {
|
||||
n.mu.Lock()
|
||||
defer n.mu.Unlock()
|
||||
path := filepath.Join(n.path, netId+".yml")
|
||||
data, err := os.ReadFile(path)
|
||||
if os.IsNotExist(err) {
|
||||
err = nodeconf.ErrConfigurationNotFound
|
||||
return
|
||||
}
|
||||
err = yaml.Unmarshal(data, &c)
|
||||
return
|
||||
}
|
||||
|
||||
func (n *nodeConfStore) SaveLast(ctx context.Context, c nodeconf.Configuration) (err error) {
|
||||
n.mu.Lock()
|
||||
defer n.mu.Unlock()
|
||||
path := filepath.Join(n.path, c.NetworkId+".yml")
|
||||
data, err := yaml.Marshal(c)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return os.WriteFile(path, data, 0755)
|
||||
}
|
83
nodeconf/nodeconfstore/nodeconfstore_test.go
Normal file
83
nodeconf/nodeconfstore/nodeconfstore_test.go
Normal file
|
@ -0,0 +1,83 @@
|
|||
package nodeconfstore
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/anytypeio/any-sync/app"
|
||||
"github.com/anytypeio/any-sync/nodeconf"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
var ctx = context.Background()
|
||||
|
||||
func TestNodeConfStore_GetLast(t *testing.T) {
|
||||
t.Run("not found", func(t *testing.T) {
|
||||
fx := newFixture(t)
|
||||
defer fx.finish(t)
|
||||
_, err := fx.GetLast(ctx, "123")
|
||||
assert.EqualError(t, err, nodeconf.ErrConfigurationNotFound.Error())
|
||||
})
|
||||
t.Run("success", func(t *testing.T) {
|
||||
fx := newFixture(t)
|
||||
defer fx.finish(t)
|
||||
c := nodeconf.Configuration{
|
||||
Id: "123",
|
||||
NetworkId: "456",
|
||||
Nodes: []nodeconf.Node{
|
||||
{
|
||||
PeerId: "peerId",
|
||||
Addresses: []string{"addr1", "addr2"},
|
||||
Types: []nodeconf.NodeType{nodeconf.NodeTypeTree, nodeconf.NodeTypeCoordinator},
|
||||
},
|
||||
},
|
||||
CreationTime: time.Now().Round(time.Second),
|
||||
}
|
||||
require.NoError(t, fx.SaveLast(ctx, c))
|
||||
res, err := fx.GetLast(ctx, "456")
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, c, res)
|
||||
})
|
||||
}
|
||||
|
||||
type fixture struct {
|
||||
NodeConfStore
|
||||
tmpPath string
|
||||
a *app.App
|
||||
}
|
||||
|
||||
func newFixture(t *testing.T) *fixture {
|
||||
fx := &fixture{
|
||||
NodeConfStore: New(),
|
||||
a: new(app.App),
|
||||
}
|
||||
var err error
|
||||
fx.tmpPath, err = os.MkdirTemp("", "")
|
||||
require.NoError(t, err)
|
||||
fx.a.Register(config{path: fx.tmpPath}).Register(fx.NodeConfStore)
|
||||
require.NoError(t, fx.a.Start(ctx))
|
||||
return fx
|
||||
}
|
||||
|
||||
func (fx *fixture) finish(t *testing.T) {
|
||||
defer os.RemoveAll(fx.tmpPath)
|
||||
require.NoError(t, fx.a.Close(ctx))
|
||||
}
|
||||
|
||||
type config struct {
|
||||
path string
|
||||
}
|
||||
|
||||
func (c config) NodeConfStorePath() string {
|
||||
return c.path
|
||||
}
|
||||
|
||||
func (c config) Init(a *app.App) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (c config) Name() (name string) {
|
||||
return "config"
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue