b91c3147e7
Network locks are now needed only when accessing client map. node map access is serialied with the node mutex.
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
// Package handler implements network RPC handler
|
|
package handler
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/micro/go-micro/errors"
|
|
"github.com/micro/go-micro/network"
|
|
pbNet "github.com/micro/go-micro/network/proto"
|
|
pbRtr "github.com/micro/go-micro/router/proto"
|
|
)
|
|
|
|
// Network implements network handler
|
|
type Network struct {
|
|
Network network.Network
|
|
}
|
|
|
|
// ListPeers returns a list of all the nodes the node has a direct link with
|
|
func (n *Network) ListPeers(ctx context.Context, req *pbNet.PeerRequest, resp *pbNet.PeerResponse) error {
|
|
depth := uint(req.Depth)
|
|
if depth <= 0 || depth > network.MaxDepth {
|
|
depth = network.MaxDepth
|
|
}
|
|
|
|
// get peers encoded into protobuf
|
|
peers := network.PeersToProto(n.Network, depth)
|
|
|
|
resp.Peers = peers
|
|
|
|
return nil
|
|
}
|
|
|
|
// ListRoutes returns a list of routing table routes
|
|
func (n *Network) ListRoutes(ctx context.Context, req *pbRtr.Request, resp *pbRtr.ListResponse) error {
|
|
routes, err := n.Network.Options().Router.Table().List()
|
|
if err != nil {
|
|
return errors.InternalServerError("go.micro.network", "failed to list routes: %s", err)
|
|
}
|
|
|
|
var respRoutes []*pbRtr.Route
|
|
for _, route := range routes {
|
|
respRoute := &pbRtr.Route{
|
|
Service: route.Service,
|
|
Address: route.Address,
|
|
Gateway: route.Gateway,
|
|
Network: route.Network,
|
|
Router: route.Router,
|
|
Link: route.Link,
|
|
Metric: int64(route.Metric),
|
|
}
|
|
respRoutes = append(respRoutes, respRoute)
|
|
}
|
|
|
|
resp.Routes = respRoutes
|
|
|
|
return nil
|
|
}
|