Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion mino/minows/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ func NewController() node.Initializer {

const flagListen = "listen"
const flagPublic = "public"
const flagInstance = "instance"

func (c controller) SetCommands(builder node.Builder) {
builder.SetStartFlags(
Expand All @@ -39,6 +40,12 @@ func (c controller) SetCommands(builder node.Builder) {
Required: false,
Value: "",
},
cli.IntFlag{
Name: flagInstance,
Usage: "Set the instance number (default 0)",
Required: false,
Value: 0,
},
)

cmd := builder.SetCommand("list")
Expand Down Expand Up @@ -68,7 +75,9 @@ func (c controller) OnStart(flags cli.Flags, inj node.Injector) error {
}
}

m, err := NewMinows(listen, public, &db)
i := flags.Int(flagInstance)

m, err := NewMinows(listen, public, db, i)
if err != nil {
return xerrors.Errorf("could not start mino: %v", err)
}
Expand Down
6 changes: 4 additions & 2 deletions mino/minows/controller_test.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package minows

import (
"testing"
"time"

"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"go.dedis.ch/dela/cli"
"go.dedis.ch/dela/cli/node"
"go.dedis.ch/dela/testing/fake"
"testing"
"time"
)

func TestController_OnStart(t *testing.T) {
Expand Down Expand Up @@ -83,6 +84,7 @@ func setUp(t *testing.T, listen string, public string) (
flags := new(mockFlags)
flags.On("String", "listen").Return(listen)
flags.On("String", "public").Return(public)
flags.On("Int", "instance").Return(0)
inj := node.NewInjector()
inj.Inject(fake.NewInMemoryDB())

Expand Down
4 changes: 2 additions & 2 deletions mino/minows/key/mod.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ func NewStorage(db kv.DB) *Storage {

// LoadOrCreate loads the private key from Storage or
// creates a new one if none exists.
func (s *Storage) LoadOrCreate() (crypto.PrivKey, error) {
key := []byte("private_key")
func (s *Storage) LoadOrCreate(index string) (crypto.PrivKey, error) {
key := []byte("private_key:" + index)
var buffer []byte
err := s.db.Update(func(tx kv.WritableTx) error {
bucket, err := tx.GetBucketOrCreate(s.bucket)
Expand Down
19 changes: 15 additions & 4 deletions mino/minows/mod.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package minows

import (
"regexp"
"strconv"
"strings"

"github.com/libp2p/go-libp2p/core/peer"
Expand Down Expand Up @@ -35,6 +36,7 @@ type Minows struct {
factory addressFactory

privkey crypto.PrivKey
db kv.DB
}

// NewMinows creates a new Minows instance that starts listening.
Expand All @@ -45,13 +47,14 @@ type Minows struct {
// `public` can be nil and will be determined
// by the listening address and the port the host has bound to.
// key: private key representing this mino instance's identity
func NewMinows(listen, public ma.Multiaddr, db *kv.DB) (
func NewMinows(listen, public ma.Multiaddr, db kv.DB, instance int) (
mino.Mino,
error,
) {
// Load or generate a unique private key for the mino instance.
storage := key.NewStorage(*db)
privk, err := storage.LoadOrCreate()
storage := key.NewStorage(db)

privk, err := storage.LoadOrCreate(strconv.Itoa(instance))
if err != nil {
return nil, xerrors.Errorf("could not load or generate key: %v", err)
}
Expand All @@ -77,6 +80,7 @@ func NewMinows(listen, public ma.Multiaddr, db *kv.DB) (
rpcs: make(map[string]any),
factory: addressFactory{},
privkey: privk,
db: db,
}, nil
}

Expand All @@ -100,6 +104,8 @@ func (m *Minows) WithSegment(segment string) mino.Mino {
host: m.host,
rpcs: make(map[string]any),
factory: addressFactory{},
privkey: m.privkey,
db: m.db,
}
}

Expand Down Expand Up @@ -139,7 +145,12 @@ func (m *Minows) CreateRPC(name string, h mino.Handler, f serde.Factory) (mino.R
}

func (m *Minows) Stop() error {
return m.host.Close()
err := m.host.Close()
if err != nil {
return err
}
err = m.db.Close()
return err
}

func (m *Minows) GetPeerID() string {
Expand Down
27 changes: 14 additions & 13 deletions mino/minows/mod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func TestNewMinows(t *testing.T) {
db, err := kv.New(filepath.Join(t.TempDir(), "minows.db"))
require.NoError(t, err)

m, err := NewMinows(listen, public, &db)
m, err := NewMinows(listen, public, db, 0)
require.NoError(t, err)
require.NotNil(t, m)
require.IsType(t, &Minows{}, m)
Expand All @@ -51,7 +51,7 @@ func TestNewMinows_OptionalPublic(t *testing.T) {
db, err := kv.New(filepath.Join(t.TempDir(), "minows.db"))
require.NoError(t, err)

m, err := NewMinows(tt, nil, &db)
m, err := NewMinows(tt, nil, db, 0)
require.NoError(t, err)
require.NotNil(t, m)
require.IsType(t, &Minows{}, m)
Expand All @@ -77,7 +77,7 @@ func Test_minows_GetAddressFactory(t *testing.T) {
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
m, stop := mustCreateMinows(t, tt.m.listen, tt.m.public)
m, stop := mustCreateMinows(t, tt.m.listen, tt.m.public, 0)
defer stop()

factory := m.GetAddressFactory()
Expand Down Expand Up @@ -113,9 +113,10 @@ func Test_minows_GetAddress(t *testing.T) {
require.NoError(t, err)

m, err := NewMinows(mustCreateMultiaddress(t, tt.m.listen),
mustCreateMultiaddress(t, tt.m.public), &db)
mustCreateMultiaddress(t, tt.m.public), db, 0)
require.NoError(t, err)
defer require.NoError(t, m.(*Minows).Stop())

want := mustCreateAddress(t, tt.want.location, m.(*Minows).GetPeerID())

got := m.GetAddress()
Expand All @@ -131,7 +132,7 @@ func Test_minows_GetAddress_Random(t *testing.T) {
db, err := kv.New(filepath.Join(t.TempDir(), "minows.db"))
require.NoError(t, err)

m, err := NewMinows(listen, nil, &db)
m, err := NewMinows(listen, nil, db, 0)
require.NoError(t, err)
defer require.NoError(t, m.(*Minows).Stop())

Expand All @@ -144,7 +145,7 @@ func Test_minows_GetAddress_Random(t *testing.T) {
func Test_minows_WithSegment_Empty(t *testing.T) {
const listen = "/ip4/0.0.0.0/tcp/7452"
const ws = "/ip4/127.0.0.1/tcp/7452/ws"
m, stop := mustCreateMinows(t, listen, ws)
m, stop := mustCreateMinows(t, listen, ws, 0)
defer stop()

got := m.WithSegment("")
Expand All @@ -154,7 +155,7 @@ func Test_minows_WithSegment_Empty(t *testing.T) {
func Test_minows_WithSegment(t *testing.T) {
const listen = "/ip4/0.0.0.0/tcp/7452"
const ws = "/ip4/127.0.0.1/tcp/7452/ws"
m, stop := mustCreateMinows(t, listen, ws)
m, stop := mustCreateMinows(t, listen, ws, 0)
defer stop()

got := m.WithSegment("test")
Expand All @@ -168,7 +169,7 @@ func Test_minows_WithSegment(t *testing.T) {
func Test_minows_CreateRPC_InvalidName(t *testing.T) {
const listen = "/ip4/0.0.0.0/tcp/7452"
const ws = "/ip4/127.0.0.1/tcp/7452/ws"
m, stop := mustCreateMinows(t, listen, ws)
m, stop := mustCreateMinows(t, listen, ws, 0)
defer stop()

_, err := m.CreateRPC("invalid name", nil, nil)
Expand All @@ -178,7 +179,7 @@ func Test_minows_CreateRPC_InvalidName(t *testing.T) {
func Test_minows_CreateRPC_AlreadyExists(t *testing.T) {
const listen = "/ip4/0.0.0.0/tcp/7452"
const ws = "/ip4/127.0.0.1/tcp/7452/ws"
m, stop := mustCreateMinows(t, listen, ws)
m, stop := mustCreateMinows(t, listen, ws, 0)
defer stop()

_, err := m.CreateRPC("test", nil, nil)
Expand All @@ -190,7 +191,7 @@ func Test_minows_CreateRPC_AlreadyExists(t *testing.T) {
func Test_minows_CreateRPC_InvalidSegment(t *testing.T) {
const listen = "/ip4/0.0.0.0/tcp/7452"
const ws = "/ip4/127.0.0.1/tcp/7452/ws"
m, stop := mustCreateMinows(t, listen, ws)
m, stop := mustCreateMinows(t, listen, ws, 0)
defer stop()
m = m.WithSegment("invalid segment").(*Minows)

Expand All @@ -201,7 +202,7 @@ func Test_minows_CreateRPC_InvalidSegment(t *testing.T) {
func Test_minows_CreateRPC(t *testing.T) {
const listen = "/ip4/0.0.0.0/tcp/7452"
const ws = "/ip4/127.0.0.1/tcp/7452/ws"
m, stop := mustCreateMinows(t, listen, ws)
m, stop := mustCreateMinows(t, listen, ws, 0)
defer stop()

r1, err := m.CreateRPC("test", nil, nil)
Expand All @@ -220,7 +221,7 @@ func Test_minows_CreateRPC(t *testing.T) {
require.NotNil(t, r4)
}

func mustCreateMinows(t *testing.T, listen string, public string) (
func mustCreateMinows(t *testing.T, listen string, public string, instance int) (
*Minows,
func(),
) {
Expand All @@ -230,7 +231,7 @@ func mustCreateMinows(t *testing.T, listen string, public string) (

lis := mustCreateMultiaddress(t, listen)
pub := mustCreateMultiaddress(t, public)
m, err := NewMinows(lis, pub, &db)
m, err := NewMinows(lis, pub, db, instance)
require.NoError(t, err)
ws := m.(*Minows)
stop := func() { require.NoError(t, ws.Stop()) }
Expand Down
34 changes: 17 additions & 17 deletions mino/minows/rpc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ import (
func Test_rpc_Call(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

const addrPlayer = "/ip4/127.0.0.1/tcp/6002/ws"
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer)
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer, 1)
defer stop()
mustCreateRPC(t, player, handler)

Expand All @@ -44,7 +44,7 @@ func Test_rpc_Call(t *testing.T) {
func Test_rpc_Call_ToSelf(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

Expand All @@ -68,7 +68,7 @@ func Test_rpc_Call_ToSelf(t *testing.T) {
func Test_rpc_Call_NoPlayers(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

Expand All @@ -84,12 +84,12 @@ func Test_rpc_Call_NoPlayers(t *testing.T) {
func Test_rpc_Call_WrongAddressType(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

const addrPlayer = "/ip4/127.0.0.1/tcp/6002/ws"
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer)
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer, 1)
defer stop()
mustCreateRPC(t, player, handler)

Expand All @@ -105,12 +105,12 @@ func Test_rpc_Call_WrongAddressType(t *testing.T) {
func Test_rpc_Call_DiffNamespace(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

const addrPlayer = "/ip4/127.0.0.1/tcp/6002/ws"
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer)
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer, 1)
defer stop()
mustCreateRPC(t, player.WithSegment("segment"), handler)

Expand All @@ -133,12 +133,12 @@ func Test_rpc_Call_DiffNamespace(t *testing.T) {
func Test_rpc_Call_ContextCancelled(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

const addrPlayer = "/ip4/127.0.0.1/tcp/6002/ws"
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer)
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer, 1)
defer stop()
mustCreateRPC(t, player, handler)

Expand All @@ -156,12 +156,12 @@ func Test_rpc_Call_ContextCancelled(t *testing.T) {
func Test_rpc_Stream(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

const addrPlayer = "/ip4/127.0.0.1/tcp/6002/ws"
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer)
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer, 1)
defer stop()
mustCreateRPC(t, player, handler)

Expand All @@ -178,7 +178,7 @@ func Test_rpc_Stream(t *testing.T) {
func Test_rpc_Stream_ToSelf(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

Expand All @@ -195,7 +195,7 @@ func Test_rpc_Stream_ToSelf(t *testing.T) {
func Test_rpc_Stream_NoPlayers(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

Expand All @@ -210,7 +210,7 @@ func Test_rpc_Stream_NoPlayers(t *testing.T) {
func Test_rpc_Stream_WrongAddressType(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)

Expand All @@ -225,11 +225,11 @@ func Test_rpc_Stream_WrongAddressType(t *testing.T) {
func Test_rpc_Stream_ContextCancelled(t *testing.T) {
handler := &echoHandler{}
const addrInitiator = "/ip4/127.0.0.1/tcp/6001/ws"
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator)
initiator, stop := mustCreateMinows(t, addrInitiator, addrInitiator, 0)
defer stop()
r := mustCreateRPC(t, initiator, handler)
const addrPlayer = "/ip4/127.0.0.1/tcp/6002/ws"
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer)
player, stop := mustCreateMinows(t, addrPlayer, addrPlayer, 1)
defer stop()
mustCreateRPC(t, player, handler)

Expand Down
Loading
Loading