Adding new peers up to given depth. Outline of node gaph Update

This commit is contained in:
Milos Gajdos 2019-09-09 18:47:10 +01:00
parent a6668ae057
commit f0a1031e97
No known key found for this signature in database
GPG Key ID: 8B31058CC55DFD4F
5 changed files with 207 additions and 85 deletions

View File

@ -27,6 +27,8 @@ var (
ControlChannel = "control" ControlChannel = "control"
// DefaultLink is default network link // DefaultLink is default network link
DefaultLink = "network" DefaultLink = "network"
// MaxDepth defines max depth of neighbourhood topology
MaxDepth = 3
) )
var ( var (
@ -85,6 +87,69 @@ func (n *node) Neighbourhood() []Node {
return nodes return nodes
} }
// getNeighbours collects node neighbours up to given depth into pbNeighbours
// NOTE: this method is not thread safe, so make sure you serialize access to it
// NOTE: we should be able to read-Lock this, even though it's recursive
// TODO: we should rework this so it returns pbNeighbours along with error
func (n *node) getNeighbours(pbNeighbours *pbNet.Neighbour, depth int) error {
if pbNeighbours == nil {
return errors.New("neighbours not initialized")
}
// return if have either reached the depth or have no more neighbours
if depth == 0 || len(n.neighbours) == 0 {
return nil
}
// decrement the depth
depth--
var neighbours []*pbNet.Neighbour
for _, neighbour := range n.neighbours {
// node
node := &pbNet.Node{
Id: neighbour.id,
Address: neighbour.address,
}
// create new neighbour
pbNodeNeighbour := &pbNet.Neighbour{
Node: node,
Neighbours: make([]*pbNet.Neighbour, 0),
}
// get neighbours of the neighbour
// NOTE: this is [not] a recursive call
if err := neighbour.getNeighbours(pbNodeNeighbour, depth); err != nil {
return err
}
// add current neighbour to explored neighbours
neighbours = append(neighbours, pbNodeNeighbour)
}
// add neighbours to the parent topology
pbNeighbours.Neighbours = neighbours
return nil
}
// updateNeighbour updates node neighbour up to given depth
func (n *node) updateNeighbour(neighbour *pbNet.Neighbour, depth int) error {
if neighbour == nil {
return errors.New("neighbour not initialized")
}
// return if have either reached the depth or have no more neighbours
if depth == 0 {
return nil
}
// decrement the depth
depth--
// TODO: implement this
return nil
}
// network implements Network interface // network implements Network interface
type network struct { type network struct {
// node is network node // node is network node
@ -363,18 +428,18 @@ func (n *network) processNetChan(client transport.Client, listener tunnel.Listen
if n.neighbours[pbNetNeighbour.Node.Id].lastSeen.Before(now) { if n.neighbours[pbNetNeighbour.Node.Id].lastSeen.Before(now) {
n.neighbours[pbNetNeighbour.Node.Id].lastSeen = now n.neighbours[pbNetNeighbour.Node.Id].lastSeen = now
} }
// update/store the neighbour node neighbours // update/store the node neighbour neighbours up to TopologyDepth
// NOTE: * we do NOT update lastSeen time for the neighbours of the neighbour // NOTE: * we do NOT update lastSeen time for the neighbours of the neighbour
// * even though we are NOT interested in neighbours of neighbours here // * even though we are NOT interested in neighbours over TopologyDepth
// we still allocate the map of neighbours for each of them // we still allocate the map of neighbours for each of them
for _, pbNeighbour := range pbNetNeighbour.Neighbours { //for _, pbNeighbour := range pbNetNeighbour.Neighbours {
neighbourNode := &node{ // neighbourNode := &node{
id: pbNeighbour.Id, // id: pbNeighbour.Node.Id,
address: pbNeighbour.Address, // address: pbNeighbour.Node.Address,
neighbours: make(map[string]*node), // neighbours: make(map[string]*node),
} // }
n.neighbours[pbNetNeighbour.Node.Id].neighbours[pbNeighbour.Id] = neighbourNode // n.neighbours[pbNetNeighbour.Node.Id].neighbours[pbNeighbour.Node.Id] = neighbourNode
} //}
n.Unlock() n.Unlock()
// send a solicit message when discovering a new node // send a solicit message when discovering a new node
// NOTE: we need to send the solicit message here after the Lock is released as sendMsg locks, too // NOTE: we need to send the solicit message here after the Lock is released as sendMsg locks, too
@ -431,20 +496,22 @@ func (n *network) sendMsg(msgType string, channel string) error {
} }
case "neighbour": case "neighbour":
n.RLock() n.RLock()
nodes := make([]*pbNet.Node, len(n.neighbours)) node := &pbNet.Node{
i := 0 Id: n.node.id,
for id := range n.neighbours { Address: n.node.address,
nodes[i] = &pbNet.Node{
Id: id,
Address: n.neighbours[id].address,
}
i++
} }
n.RUnlock() nodeNeighbour := &pbNet.Neighbour{
protoMsg = &pbNet.Neighbour{
Node: node, Node: node,
Neighbours: nodes, Neighbours: make([]*pbNet.Neighbour, 0),
} }
// get all the neighbours down to MaxNeighbourDepth
if err := n.node.getNeighbours(nodeNeighbour, MaxDepth); err != nil {
log.Debugf("Network unable to retrieve node neighbours: %s", err)
return err
}
// set protoMsg for serialization
protoMsg = nodeNeighbour
n.RUnlock()
default: default:
return ErrMsgUnknown return ErrMsgUnknown
} }
@ -461,9 +528,10 @@ func (n *network) sendMsg(msgType string, channel string) error {
Body: body, Body: body,
} }
// check if the channel client is initialized
n.RLock() n.RLock()
client, ok := n.tunClient[channel] client, ok := n.tunClient[channel]
if !ok { if !ok || client == nil {
n.RUnlock() n.RUnlock()
return ErrClientNotFound return ErrClientNotFound
} }

View File

@ -100,7 +100,7 @@ func (n *Network) Neighbourhood(ctx context.Context, req *pbNet.NeighbourhoodReq
} }
// creaate neighbourhood answer // creaate neighbourhood answer
neighbourhood := &pbNet.Neighbour{ neighbourhood := &pbNet.Neighbourhood{
Node: node, Node: node,
Neighbours: neighbours, Neighbours: neighbours,
} }

View File

@ -35,9 +35,9 @@ var _ server.Option
// Client API for Network service // Client API for Network service
type NetworkService interface { type NetworkService interface {
ListRoutes(ctx context.Context, in *proto1.Request, opts ...client.CallOption) (*proto1.ListResponse, error)
ListNodes(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error) ListNodes(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error)
Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, opts ...client.CallOption) (*NeighbourhoodResponse, error) Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, opts ...client.CallOption) (*NeighbourhoodResponse, error)
ListRoutes(ctx context.Context, in *proto1.Request, opts ...client.CallOption) (*proto1.ListResponse, error)
} }
type networkService struct { type networkService struct {
@ -58,16 +58,6 @@ func NewNetworkService(name string, c client.Client) NetworkService {
} }
} }
func (c *networkService) ListRoutes(ctx context.Context, in *proto1.Request, opts ...client.CallOption) (*proto1.ListResponse, error) {
req := c.c.NewRequest(c.name, "Network.ListRoutes", in)
out := new(proto1.ListResponse)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *networkService) ListNodes(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error) { func (c *networkService) ListNodes(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error) {
req := c.c.NewRequest(c.name, "Network.ListNodes", in) req := c.c.NewRequest(c.name, "Network.ListNodes", in)
out := new(ListResponse) out := new(ListResponse)
@ -88,19 +78,29 @@ func (c *networkService) Neighbourhood(ctx context.Context, in *NeighbourhoodReq
return out, nil return out, nil
} }
func (c *networkService) ListRoutes(ctx context.Context, in *proto1.Request, opts ...client.CallOption) (*proto1.ListResponse, error) {
req := c.c.NewRequest(c.name, "Network.ListRoutes", in)
out := new(proto1.ListResponse)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for Network service // Server API for Network service
type NetworkHandler interface { type NetworkHandler interface {
ListRoutes(context.Context, *proto1.Request, *proto1.ListResponse) error
ListNodes(context.Context, *ListRequest, *ListResponse) error ListNodes(context.Context, *ListRequest, *ListResponse) error
Neighbourhood(context.Context, *NeighbourhoodRequest, *NeighbourhoodResponse) error Neighbourhood(context.Context, *NeighbourhoodRequest, *NeighbourhoodResponse) error
ListRoutes(context.Context, *proto1.Request, *proto1.ListResponse) error
} }
func RegisterNetworkHandler(s server.Server, hdlr NetworkHandler, opts ...server.HandlerOption) error { func RegisterNetworkHandler(s server.Server, hdlr NetworkHandler, opts ...server.HandlerOption) error {
type network interface { type network interface {
ListRoutes(ctx context.Context, in *proto1.Request, out *proto1.ListResponse) error
ListNodes(ctx context.Context, in *ListRequest, out *ListResponse) error ListNodes(ctx context.Context, in *ListRequest, out *ListResponse) error
Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, out *NeighbourhoodResponse) error Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, out *NeighbourhoodResponse) error
ListRoutes(ctx context.Context, in *proto1.Request, out *proto1.ListResponse) error
} }
type Network struct { type Network struct {
network network
@ -113,10 +113,6 @@ type networkHandler struct {
NetworkHandler NetworkHandler
} }
func (h *networkHandler) ListRoutes(ctx context.Context, in *proto1.Request, out *proto1.ListResponse) error {
return h.NetworkHandler.ListRoutes(ctx, in, out)
}
func (h *networkHandler) ListNodes(ctx context.Context, in *ListRequest, out *ListResponse) error { func (h *networkHandler) ListNodes(ctx context.Context, in *ListRequest, out *ListResponse) error {
return h.NetworkHandler.ListNodes(ctx, in, out) return h.NetworkHandler.ListNodes(ctx, in, out)
} }
@ -124,3 +120,7 @@ func (h *networkHandler) ListNodes(ctx context.Context, in *ListRequest, out *Li
func (h *networkHandler) Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, out *NeighbourhoodResponse) error { func (h *networkHandler) Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, out *NeighbourhoodResponse) error {
return h.NetworkHandler.Neighbourhood(ctx, in, out) return h.NetworkHandler.Neighbourhood(ctx, in, out)
} }
func (h *networkHandler) ListRoutes(ctx context.Context, in *proto1.Request, out *proto1.ListResponse) error {
return h.NetworkHandler.ListRoutes(ctx, in, out)
}

View File

@ -133,12 +133,12 @@ func (m *NeighbourhoodRequest) GetId() string {
return "" return ""
} }
// NeighbourhoodResponse contains node neighbourhood hierarchy // NeighbourhoodResponse returns node neighbourhood
type NeighbourhoodResponse struct { type NeighbourhoodResponse struct {
Neighbourhood *Neighbour `protobuf:"bytes,1,opt,name=neighbourhood,proto3" json:"neighbourhood,omitempty"` Neighbourhoodi *Neighbourhood `protobuf:"bytes,1,opt,name=neighbourhoodi,proto3" json:"neighbourhoodi,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *NeighbourhoodResponse) Reset() { *m = NeighbourhoodResponse{} } func (m *NeighbourhoodResponse) Reset() { *m = NeighbourhoodResponse{} }
@ -166,9 +166,56 @@ func (m *NeighbourhoodResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_NeighbourhoodResponse proto.InternalMessageInfo var xxx_messageInfo_NeighbourhoodResponse proto.InternalMessageInfo
func (m *NeighbourhoodResponse) GetNeighbourhood() *Neighbour { func (m *NeighbourhoodResponse) GetNeighbourhoodi() *Neighbourhood {
if m != nil { if m != nil {
return m.Neighbourhood return m.Neighbourhoodi
}
return nil
}
type Neighbourhood struct {
Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
Neighbours []*Node `protobuf:"bytes,2,rep,name=neighbours,proto3" json:"neighbours,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Neighbourhood) Reset() { *m = Neighbourhood{} }
func (m *Neighbourhood) String() string { return proto.CompactTextString(m) }
func (*Neighbourhood) ProtoMessage() {}
func (*Neighbourhood) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{4}
}
func (m *Neighbourhood) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Neighbourhood.Unmarshal(m, b)
}
func (m *Neighbourhood) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Neighbourhood.Marshal(b, m, deterministic)
}
func (m *Neighbourhood) XXX_Merge(src proto.Message) {
xxx_messageInfo_Neighbourhood.Merge(m, src)
}
func (m *Neighbourhood) XXX_Size() int {
return xxx_messageInfo_Neighbourhood.Size(m)
}
func (m *Neighbourhood) XXX_DiscardUnknown() {
xxx_messageInfo_Neighbourhood.DiscardUnknown(m)
}
var xxx_messageInfo_Neighbourhood proto.InternalMessageInfo
func (m *Neighbourhood) GetNode() *Node {
if m != nil {
return m.Node
}
return nil
}
func (m *Neighbourhood) GetNeighbours() []*Node {
if m != nil {
return m.Neighbours
} }
return nil return nil
} }
@ -188,7 +235,7 @@ func (m *Node) Reset() { *m = Node{} }
func (m *Node) String() string { return proto.CompactTextString(m) } func (m *Node) String() string { return proto.CompactTextString(m) }
func (*Node) ProtoMessage() {} func (*Node) ProtoMessage() {}
func (*Node) Descriptor() ([]byte, []int) { func (*Node) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{4} return fileDescriptor_8571034d60397816, []int{5}
} }
func (m *Node) XXX_Unmarshal(b []byte) error { func (m *Node) XXX_Unmarshal(b []byte) error {
@ -236,7 +283,7 @@ func (m *Connect) Reset() { *m = Connect{} }
func (m *Connect) String() string { return proto.CompactTextString(m) } func (m *Connect) String() string { return proto.CompactTextString(m) }
func (*Connect) ProtoMessage() {} func (*Connect) ProtoMessage() {}
func (*Connect) Descriptor() ([]byte, []int) { func (*Connect) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{5} return fileDescriptor_8571034d60397816, []int{6}
} }
func (m *Connect) XXX_Unmarshal(b []byte) error { func (m *Connect) XXX_Unmarshal(b []byte) error {
@ -277,7 +324,7 @@ func (m *Close) Reset() { *m = Close{} }
func (m *Close) String() string { return proto.CompactTextString(m) } func (m *Close) String() string { return proto.CompactTextString(m) }
func (*Close) ProtoMessage() {} func (*Close) ProtoMessage() {}
func (*Close) Descriptor() ([]byte, []int) { func (*Close) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{6} return fileDescriptor_8571034d60397816, []int{7}
} }
func (m *Close) XXX_Unmarshal(b []byte) error { func (m *Close) XXX_Unmarshal(b []byte) error {
@ -318,7 +365,7 @@ func (m *Solicit) Reset() { *m = Solicit{} }
func (m *Solicit) String() string { return proto.CompactTextString(m) } func (m *Solicit) String() string { return proto.CompactTextString(m) }
func (*Solicit) ProtoMessage() {} func (*Solicit) ProtoMessage() {}
func (*Solicit) Descriptor() ([]byte, []int) { func (*Solicit) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{7} return fileDescriptor_8571034d60397816, []int{8}
} }
func (m *Solicit) XXX_Unmarshal(b []byte) error { func (m *Solicit) XXX_Unmarshal(b []byte) error {
@ -351,17 +398,17 @@ type Neighbour struct {
// network node // network node
Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
// neighbours // neighbours
Neighbours []*Node `protobuf:"bytes,3,rep,name=neighbours,proto3" json:"neighbours,omitempty"` Neighbours []*Neighbour `protobuf:"bytes,2,rep,name=neighbours,proto3" json:"neighbours,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *Neighbour) Reset() { *m = Neighbour{} } func (m *Neighbour) Reset() { *m = Neighbour{} }
func (m *Neighbour) String() string { return proto.CompactTextString(m) } func (m *Neighbour) String() string { return proto.CompactTextString(m) }
func (*Neighbour) ProtoMessage() {} func (*Neighbour) ProtoMessage() {}
func (*Neighbour) Descriptor() ([]byte, []int) { func (*Neighbour) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{8} return fileDescriptor_8571034d60397816, []int{9}
} }
func (m *Neighbour) XXX_Unmarshal(b []byte) error { func (m *Neighbour) XXX_Unmarshal(b []byte) error {
@ -389,7 +436,7 @@ func (m *Neighbour) GetNode() *Node {
return nil return nil
} }
func (m *Neighbour) GetNeighbours() []*Node { func (m *Neighbour) GetNeighbours() []*Neighbour {
if m != nil { if m != nil {
return m.Neighbours return m.Neighbours
} }
@ -401,6 +448,7 @@ func init() {
proto.RegisterType((*ListResponse)(nil), "go.micro.network.ListResponse") proto.RegisterType((*ListResponse)(nil), "go.micro.network.ListResponse")
proto.RegisterType((*NeighbourhoodRequest)(nil), "go.micro.network.NeighbourhoodRequest") proto.RegisterType((*NeighbourhoodRequest)(nil), "go.micro.network.NeighbourhoodRequest")
proto.RegisterType((*NeighbourhoodResponse)(nil), "go.micro.network.NeighbourhoodResponse") proto.RegisterType((*NeighbourhoodResponse)(nil), "go.micro.network.NeighbourhoodResponse")
proto.RegisterType((*Neighbourhood)(nil), "go.micro.network.Neighbourhood")
proto.RegisterType((*Node)(nil), "go.micro.network.Node") proto.RegisterType((*Node)(nil), "go.micro.network.Node")
proto.RegisterType((*Connect)(nil), "go.micro.network.Connect") proto.RegisterType((*Connect)(nil), "go.micro.network.Connect")
proto.RegisterType((*Close)(nil), "go.micro.network.Close") proto.RegisterType((*Close)(nil), "go.micro.network.Close")
@ -411,28 +459,29 @@ func init() {
func init() { proto.RegisterFile("network.proto", fileDescriptor_8571034d60397816) } func init() { proto.RegisterFile("network.proto", fileDescriptor_8571034d60397816) }
var fileDescriptor_8571034d60397816 = []byte{ var fileDescriptor_8571034d60397816 = []byte{
// 360 bytes of a gzipped FileDescriptorProto // 372 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x41, 0x4f, 0xf2, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x5d, 0x4f, 0xea, 0x40,
0x10, 0xfd, 0x28, 0xf0, 0x35, 0x0c, 0x1f, 0x5f, 0xcc, 0x46, 0x4d, 0x53, 0x83, 0x21, 0x7b, 0x40, 0x10, 0xbd, 0xf4, 0xc2, 0x6d, 0x18, 0x2e, 0xc4, 0x6c, 0xd4, 0x34, 0x18, 0x94, 0xec, 0x03, 0x12,
0x62, 0xb4, 0x18, 0x08, 0x9e, 0xbc, 0x18, 0x0e, 0x5e, 0x08, 0x87, 0x7a, 0xf3, 0x66, 0xbb, 0x9b, 0xa3, 0xc5, 0x40, 0xf0, 0x45, 0xdf, 0x78, 0xe0, 0x85, 0xf0, 0x80, 0x7f, 0x40, 0xdb, 0x6e, 0xca,
0xb2, 0x11, 0x3a, 0xb8, 0xbb, 0x8d, 0x7f, 0xc0, 0x1f, 0x6e, 0xba, 0x5d, 0xb0, 0x80, 0x60, 0xb8, 0x46, 0xe8, 0xe0, 0xee, 0x36, 0xfe, 0x01, 0x7f, 0xb8, 0xd9, 0x76, 0xc1, 0x52, 0xbe, 0xd2, 0xb7,
0x75, 0xe6, 0xbd, 0x37, 0x6f, 0xa7, 0xfb, 0x16, 0x5a, 0x29, 0xd7, 0x1f, 0x28, 0xdf, 0x82, 0xa5, 0xee, 0xcc, 0x99, 0x73, 0x66, 0xa6, 0x67, 0xa0, 0x1e, 0x31, 0xf5, 0x85, 0xe2, 0xc3, 0x5d, 0x09,
0x44, 0x8d, 0xe4, 0x24, 0xc1, 0x60, 0x21, 0x62, 0x89, 0x81, 0xed, 0xfb, 0xc3, 0x44, 0xe8, 0x59, 0x54, 0x48, 0xce, 0x42, 0x74, 0x97, 0xdc, 0x17, 0xe8, 0x9a, 0x78, 0x73, 0x10, 0x72, 0x35, 0x8f,
0x16, 0x05, 0x31, 0x2e, 0xfa, 0x06, 0xe9, 0x27, 0x78, 0x5b, 0x7c, 0x48, 0xcc, 0x34, 0x97, 0x7d, 0x3d, 0xd7, 0xc7, 0x65, 0x2f, 0xc9, 0xf4, 0x42, 0x7c, 0x48, 0x3f, 0x04, 0xc6, 0x8a, 0x89, 0x5e,
0xa3, 0xb4, 0x45, 0x31, 0x86, 0xb6, 0xa0, 0x39, 0x11, 0x4a, 0x87, 0xfc, 0x3d, 0xe3, 0x4a, 0xd3, 0x52, 0x69, 0x1e, 0x29, 0x0d, 0xad, 0x43, 0x6d, 0xc2, 0xa5, 0x9a, 0xb1, 0xcf, 0x98, 0x49, 0x45,
0x07, 0xf8, 0x57, 0x94, 0x6a, 0x89, 0xa9, 0xe2, 0xe4, 0x06, 0xea, 0x29, 0x32, 0xae, 0xbc, 0x4a, 0x5f, 0xe0, 0x7f, 0xfa, 0x94, 0x2b, 0x8c, 0x24, 0x23, 0xf7, 0x50, 0x89, 0x30, 0x60, 0xd2, 0x29,
0xa7, 0xda, 0x6b, 0x0e, 0xce, 0x83, 0x6d, 0xd7, 0x60, 0x8a, 0x8c, 0x87, 0x05, 0x89, 0x76, 0xe1, 0xb5, 0xff, 0x76, 0x6b, 0xfd, 0x4b, 0x37, 0xaf, 0xea, 0x4e, 0x31, 0x60, 0xb3, 0x14, 0x44, 0x3b,
0x74, 0xca, 0x45, 0x32, 0x8b, 0x30, 0x93, 0x33, 0x44, 0x66, 0xa7, 0x92, 0xff, 0xe0, 0x08, 0xe6, 0x70, 0x3e, 0x65, 0x3c, 0x9c, 0x7b, 0x18, 0x8b, 0x39, 0x62, 0x60, 0x58, 0x49, 0x03, 0x2c, 0x1e,
0x55, 0x3a, 0x95, 0x5e, 0x23, 0x74, 0x04, 0xa3, 0x2f, 0x70, 0xb6, 0xc5, 0xb3, 0x76, 0x8f, 0xf9, 0x38, 0xa5, 0x76, 0xa9, 0x5b, 0x9d, 0x59, 0x3c, 0xa0, 0x6f, 0x70, 0x91, 0xc3, 0x19, 0xb9, 0x31,
0x96, 0x25, 0xc0, 0x68, 0x9a, 0x83, 0x8b, 0x1f, 0x6c, 0x57, 0xb4, 0x70, 0x53, 0x41, 0xef, 0xa0, 0x34, 0xa2, 0x6c, 0x82, 0x27, 0x45, 0xb5, 0xfe, 0xcd, 0x1e, 0xdd, 0x2d, 0x82, 0x5c, 0x19, 0x95,
0x96, 0x1f, 0x69, 0xdb, 0x93, 0x78, 0xe0, 0xbe, 0x32, 0x26, 0xb9, 0x52, 0x9e, 0x63, 0x9a, 0xab, 0x50, 0xdf, 0x02, 0x90, 0x3b, 0x28, 0xeb, 0x1e, 0x0d, 0xdf, 0xa1, 0x39, 0x12, 0x0c, 0x79, 0x02,
0x92, 0x8e, 0xc0, 0x1d, 0x63, 0x9a, 0xf2, 0x58, 0x93, 0x6b, 0xa8, 0xe5, 0x9b, 0x58, 0xdb, 0x7d, 0xd8, 0xd0, 0x49, 0xc7, 0x3a, 0x3a, 0x79, 0x06, 0x49, 0x1f, 0xa1, 0xac, 0x63, 0xf9, 0x71, 0x89,
0xdb, 0x1a, 0x0e, 0x1d, 0x42, 0x7d, 0x3c, 0x47, 0xc5, 0x8f, 0x12, 0x8d, 0xc0, 0x7d, 0xc6, 0xb9, 0x03, 0xf6, 0x7b, 0x10, 0x08, 0x26, 0x35, 0x99, 0x0e, 0xae, 0x9f, 0x74, 0x08, 0xf6, 0x08, 0xa3,
0x88, 0xc5, 0x71, 0x5e, 0x08, 0x8d, 0xf5, 0xc2, 0xc7, 0x08, 0xc9, 0x3d, 0xc0, 0xfa, 0xf7, 0x28, 0x88, 0xf9, 0xaa, 0x48, 0x83, 0x74, 0x00, 0x95, 0xd1, 0x02, 0x25, 0x2b, 0x54, 0x34, 0x04, 0xfb,
0xaf, 0x7a, 0xf0, 0x12, 0x4b, 0xcc, 0xc1, 0xa7, 0x03, 0xee, 0xb4, 0x00, 0xc9, 0x13, 0x80, 0xc9, 0x15, 0x17, 0xdc, 0xe7, 0xc5, 0xb4, 0x14, 0x54, 0x37, 0x9b, 0x2c, 0xb4, 0xc5, 0xe7, 0x3d, 0x5b,
0x44, 0x1e, 0x1b, 0x45, 0xbc, 0x6f, 0xb5, 0x0d, 0x92, 0xbd, 0x65, 0xbf, 0xbd, 0x83, 0x94, 0xa3, 0xbc, 0x3a, 0xf2, 0x1f, 0xb3, 0xab, 0xec, 0x7f, 0x5b, 0x60, 0x4f, 0x53, 0x04, 0x99, 0x40, 0x55,
0x44, 0xff, 0x90, 0x09, 0x34, 0xf2, 0x4e, 0x6e, 0xa6, 0x48, 0x7b, 0xf7, 0x14, 0xa5, 0x20, 0xfa, 0x7b, 0x52, 0x53, 0x4b, 0xd2, 0xda, 0x65, 0xc8, 0xf8, 0xb7, 0x79, 0x7d, 0x28, 0x9d, 0x1a, 0x8c,
0x97, 0xfb, 0xe0, 0xf5, 0xb4, 0x08, 0x5a, 0x1b, 0x21, 0x22, 0xdd, 0x03, 0x29, 0x29, 0xa5, 0xd1, 0xfe, 0x21, 0x5e, 0xde, 0x19, 0x9d, 0x53, 0xde, 0x32, 0xd4, 0xb7, 0x27, 0x71, 0x1b, 0x8d, 0x31,
0xbf, 0xfa, 0x95, 0xb7, 0xf2, 0x88, 0xfe, 0x9a, 0x47, 0x32, 0xfc, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x40, 0xa2, 0xaa, 0x0f, 0x4d, 0x12, 0xe7, 0xb7, 0xd0, 0x9c, 0xde, 0x9a, 0xb2, 0xb5, 0x93, 0xd9,
0x59, 0xcf, 0xab, 0xb5, 0x7c, 0x03, 0x00, 0x00, 0x6e, 0xd6, 0xfb, 0x97, 0x1c, 0xe9, 0xe0, 0x27, 0x00, 0x00, 0xff, 0xff, 0x63, 0xe7, 0xb4, 0xb0,
0xfc, 0x03, 0x00, 0x00,
} }

View File

@ -6,9 +6,9 @@ import "github.com/micro/go-micro/router/proto/router.proto";
// Network service is usesd to gain visibility into networks // Network service is usesd to gain visibility into networks
service Network { service Network {
rpc ListRoutes(go.micro.router.Request) returns (go.micro.router.ListResponse) {};
rpc ListNodes(ListRequest) returns (ListResponse) {}; rpc ListNodes(ListRequest) returns (ListResponse) {};
rpc Neighbourhood(NeighbourhoodRequest) returns (NeighbourhoodResponse) {}; rpc Neighbourhood(NeighbourhoodRequest) returns (NeighbourhoodResponse) {};
rpc ListRoutes(go.micro.router.Request) returns (go.micro.router.ListResponse) {};
} }
// Empty request // Empty request
@ -24,9 +24,14 @@ message NeighbourhoodRequest {
string id = 1; string id = 1;
} }
// NeighbourhoodResponse contains node neighbourhood hierarchy // NeighbourhoodResponse returns node neighbourhood
message NeighbourhoodResponse { message NeighbourhoodResponse {
Neighbour neighbourhood = 1; Neighbourhood neighbourhoodi = 1;
}
message Neighbourhood {
Node node = 1;
repeated Node neighbours = 2;
} }
// Node is network node // Node is network node
@ -60,5 +65,5 @@ message Neighbour {
// network node // network node
Node node = 1; Node node = 1;
// neighbours // neighbours
repeated Node neighbours = 3; repeated Neighbour neighbours = 2;
} }