From 17d24547aa3ea9efd347107b16434ec5cb3628df Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 1 Dec 2022 16:30:41 +0100 Subject: [PATCH] WIP debug client --- util/cmd/debug/api/client/service.go | 43 +++++++++++++ util/cmd/debug/api/node/service.go | 32 ++++++++++ util/cmd/debug/api/service.go | 64 ++++++++++++++++--- util/cmd/debug/debug.go | 10 ++- .../debug/{client => drpcclient}/service.go | 27 ++++++-- util/cmd/debug/peers/peers.go | 59 +++++++++++++++++ util/cmd/debug/stdin/service.go | 29 ++++++--- 7 files changed, 239 insertions(+), 25 deletions(-) create mode 100644 util/cmd/debug/api/client/service.go create mode 100644 util/cmd/debug/api/node/service.go rename util/cmd/debug/{client => drpcclient}/service.go (65%) create mode 100644 util/cmd/debug/peers/peers.go diff --git a/util/cmd/debug/api/client/service.go b/util/cmd/debug/api/client/service.go new file mode 100644 index 00000000..70593ae2 --- /dev/null +++ b/util/cmd/debug/api/client/service.go @@ -0,0 +1,43 @@ +package client + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/api/apiproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/drpcclient" +) + +const CName = "api.client" + +var log = logger.NewNamed(CName) + +type Service interface { + CreateSpace(ctx context.Context, ip string, request *apiproto.CreateSpaceRequest) (resp *apiproto.CreateSpaceResponse, err error) + app.Component +} + +type service struct { + client drpcclient.Service +} + +func New() Service { + return &service{} +} + +func (s *service) Init(a *app.App) (err error) { + s.client = a.MustComponent(drpcclient.CName).(drpcclient.Service) + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) CreateSpace(ctx context.Context, ip string, request *apiproto.CreateSpaceRequest) (resp *apiproto.CreateSpaceResponse, err error) { + cl, err := s.client.GetClient(ctx, ip) + if err != nil { + return + } + return cl.CreateSpace(ctx, request) +} diff --git a/util/cmd/debug/api/node/service.go b/util/cmd/debug/api/node/service.go new file mode 100644 index 00000000..900b45f9 --- /dev/null +++ b/util/cmd/debug/api/node/service.go @@ -0,0 +1,32 @@ +package node + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/drpcclient" +) + +const CName = "api.node" + +var log = logger.NewNamed(CName) + +type Service interface { + app.Component +} + +type service struct { + client drpcclient.Service +} + +func New() Service { + return &service{} +} + +func (s *service) Init(a *app.App) (err error) { + s.client = a.MustComponent(drpcclient.CName).(drpcclient.Service) + return nil +} + +func (s *service) Name() (name string) { + return CName +} diff --git a/util/cmd/debug/api/service.go b/util/cmd/debug/api/service.go index 4c55aa83..a2c9d302 100644 --- a/util/cmd/debug/api/service.go +++ b/util/cmd/debug/api/service.go @@ -2,31 +2,47 @@ package api import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/api/apiproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/client" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/api/client" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/api/node" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/peers" ) const CName = "debug.api" var log = logger.NewNamed(CName) +var ( + ErrNoSuchCommand = errors.New("no such command") + ErrIncorrectPeerType = errors.New("incorrect peer type") + ErrIncorrectParamsCount = errors.New("incorrect params count") +) + +type Command struct { + Cmd func(server peers.Peer, params []string) (string, error) +} + type Service interface { - CreateSpace(ctx context.Context, ip string, request *apiproto.CreateSpaceRequest) (resp *apiproto.CreateSpaceResponse, err error) app.Component + Call(server peers.Peer, cmdName string, params []string) (string, error) } type service struct { - client client.Service + clientCommands map[string]Command + nodeCommands map[string]Command } func New() Service { - return &service{} + return &service{clientCommands: map[string]Command{}, nodeCommands: map[string]Command{}} } func (s *service) Init(a *app.App) (err error) { - s.client = a.MustComponent(client.CName).(client.Service) + s.registerClientCommands(a.MustComponent(client.CName).(client.Service)) + s.registerNodeCommands(a.MustComponent(node.CName).(node.Service)) + return nil } @@ -34,10 +50,40 @@ func (s *service) Name() (name string) { return CName } -func (s *service) CreateSpace(ctx context.Context, ip string, request *apiproto.CreateSpaceRequest) (resp *apiproto.CreateSpaceResponse, err error) { - cl, err := s.client.Get(ctx, ip) - if err != nil { +func (s *service) Call(server peers.Peer, cmdName string, params []string) (res string, err error) { + var ( + cmd Command + commands map[string]Command + ) + + switch server.PeerType { + case peers.PeerTypeClient: + commands = s.clientCommands + case peers.PeerTypeNode: + commands = s.nodeCommands + } + cmd, ok := commands[cmdName] + if !ok { + err = ErrNoSuchCommand return } - return cl.CreateSpace(ctx, request) + return cmd.Cmd(server, params) +} + +func (s *service) registerClientCommands(client client.Service) { + s.clientCommands["create-space"] = Command{Cmd: func(server peers.Peer, params []string) (res string, err error) { + if len(params) != 0 { + err = ErrIncorrectParamsCount + return + } + resp, err := client.CreateSpace(context.Background(), server.Address, &apiproto.CreateSpaceRequest{}) + if err != nil { + return + } + res = resp.Id + return + }} +} + +func (s *service) registerNodeCommands(node node.Service) { } diff --git a/util/cmd/debug/debug.go b/util/cmd/debug/debug.go index 1910ca79..5b273d33 100644 --- a/util/cmd/debug/debug.go +++ b/util/cmd/debug/debug.go @@ -7,7 +7,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/api" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/client" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/api/client" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/api/node" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/drpcclient" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/peers" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/stdin" "go.uber.org/zap" "net/http" @@ -71,7 +74,10 @@ func main() { } func Bootstrap(a *app.App) { - a.Register(client.New()). + a.Register(drpcclient.New()). + Register(peers.New()). + Register(client.New()). + Register(node.New()). Register(api.New()). Register(stdin.New()) } diff --git a/util/cmd/debug/client/service.go b/util/cmd/debug/drpcclient/service.go similarity index 65% rename from util/cmd/debug/client/service.go rename to util/cmd/debug/drpcclient/service.go index 2c2993ec..2d4fb4bf 100644 --- a/util/cmd/debug/client/service.go +++ b/util/cmd/debug/drpcclient/service.go @@ -1,4 +1,4 @@ -package client +package drpcclient import ( "context" @@ -12,11 +12,12 @@ import ( ) type Service interface { - Get(ctx context.Context, ip string) (apiproto.DRPCClientApiClient, error) + GetClient(ctx context.Context, ip string) (apiproto.DRPCClientApiClient, error) + GetNode(ctx context.Context, ip string) (apiproto.DRPCClientApiClient, error) app.ComponentRunnable } -const CName = "debug.client" +const CName = "debug.drpcclient" var log = logger.NewNamed(CName) @@ -53,7 +54,7 @@ func (s *service) Run(ctx context.Context) (err error) { return nil } -func (s *service) Get(ctx context.Context, ip string) (apiproto.DRPCClientApiClient, error) { +func (s *service) GetClient(ctx context.Context, ip string) (apiproto.DRPCClientApiClient, error) { v, err := s.cache.Get(ctx, ip) if err != nil { return nil, err @@ -65,7 +66,23 @@ func (s *service) Get(ctx context.Context, ip string) (apiproto.DRPCClientApiCli return apiproto.NewDRPCClientApiClient(conn), nil } s.cache.Remove(ip) - return s.Get(ctx, ip) + return s.GetClient(ctx, ip) +} + +func (s *service) GetNode(ctx context.Context, ip string) (apiproto.DRPCClientApiClient, error) { + v, err := s.cache.Get(ctx, ip) + if err != nil { + return nil, err + } + conn := v.(*drpcconn.Conn) + select { + case <-conn.Closed(): + default: + panic("should return node") + return apiproto.NewDRPCClientApiClient(conn), nil + } + s.cache.Remove(ip) + return s.GetClient(ctx, ip) } func (s *service) Close(ctx context.Context) (err error) { diff --git a/util/cmd/debug/peers/peers.go b/util/cmd/debug/peers/peers.go new file mode 100644 index 00000000..9b0053c8 --- /dev/null +++ b/util/cmd/debug/peers/peers.go @@ -0,0 +1,59 @@ +package peers + +import ( + "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" +) + +type PeerType int + +const ( + PeerTypeClient PeerType = iota + PeerTypeNode +) + +const CName = "debug.peers" + +var ErrNoSuchPeer = errors.New("no such peer") + +type Service interface { + app.Component + Get(alias string) (Peer, error) +} + +type Peer struct { + PeerType PeerType + Address string +} + +type service struct { + peerMap map[string]Peer +} + +func New() Service { + return &service{peerMap: map[string]Peer{}} +} + +func (s *service) Init(a *app.App) (err error) { + s.peerMap["client1"] = Peer{ + PeerType: PeerTypeClient, + Address: "127.0.0.1:8090", + } + s.peerMap["client2"] = Peer{ + PeerType: PeerTypeClient, + Address: "127.0.0.1:8091", + } + return +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Get(alias string) (Peer, error) { + peer, ok := s.peerMap[alias] + if !ok { + return Peer{}, ErrNoSuchPeer + } + return peer, nil +} diff --git a/util/cmd/debug/stdin/service.go b/util/cmd/debug/stdin/service.go index a7c3e653..716829b2 100644 --- a/util/cmd/debug/stdin/service.go +++ b/util/cmd/debug/stdin/service.go @@ -3,11 +3,12 @@ package stdin import ( "bufio" "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/client/api/apiproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/api" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/debug/peers" "os" + "strings" ) const CName = "debug.stdin" @@ -19,7 +20,8 @@ type Service interface { } type service struct { - api api.Service + api api.Service + peers peers.Service } func New() Service { @@ -28,6 +30,7 @@ func New() Service { func (s *service) Init(a *app.App) (err error) { s.api = a.MustComponent(api.CName).(api.Service) + s.peers = a.MustComponent(peers.CName).(peers.Service) return } @@ -45,21 +48,29 @@ func (s *service) Close(ctx context.Context) (err error) { } func (s *service) readStdin() { - // create new reader from stdin reader := bufio.NewReader(os.Stdin) - // start infinite loop to continuously listen to input for { - // read by one line (enter pressed) str, err := reader.ReadString('\n') - // check for errors if err != nil { - // close channel just to inform others log.Errorf("Error in read string: %s", err) return } - log.Debug(str) + // trimming newline + str = str[:len(str)-1] - res, err := s.api.CreateSpace(context.Background(), "127.0.0.1:8090", &apiproto.CreateSpaceRequest{}) + log.Debug(str) + split := strings.Split(str, " ") + if len(split) < 2 { + log.Error("incorrect number of arguments") + continue + } + + peer, err := s.peers.Get(split[0]) + if err != nil { + log.Error("no such peer") + continue + } + res, err := s.api.Call(peer, split[1], split[2:]) if err != nil { log.Errorf("Error in performing request: %s", err) return