|
@@ -10,7 +10,6 @@ import (
|
|
|
"github.com/gravitl/netmaker/logger"
|
|
|
"github.com/gravitl/netmaker/logic"
|
|
|
"github.com/gravitl/netmaker/models"
|
|
|
- "github.com/gravitl/netmaker/mq"
|
|
|
"github.com/gravitl/netmaker/servercfg"
|
|
|
)
|
|
|
|
|
@@ -21,7 +20,18 @@ type NodeServiceServer struct {
|
|
|
|
|
|
// NodeServiceServer.ReadNode - reads node and responds with gRPC
|
|
|
func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
|
|
|
- var node, err = getNewOrLegacyNode(req.Data)
|
|
|
+ // convert string id (from proto) to mongoDB ObjectId
|
|
|
+ var err error
|
|
|
+ var node models.Node
|
|
|
+ var macAndNetwork = make([]string, 2)
|
|
|
+ if strings.Contains(req.Data, "###") {
|
|
|
+ macAndNetwork = strings.Split(req.Data, "###")
|
|
|
+ if len(macAndNetwork) != 2 {
|
|
|
+ return nil, errors.New("could not read node, invalid node id given")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ node, err = logic.GetNodeByIDorMacAddress(req.Data, macAndNetwork[0], macAndNetwork[1])
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
@@ -86,23 +96,13 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- // notify other nodes on network of new peer
|
|
|
- if err := mq.NewPeer(node); err != nil {
|
|
|
- logger.Log(0, "failed to inform peers of new node "+err.Error())
|
|
|
- }
|
|
|
-
|
|
|
- err = runServerPeerUpdate(node.Network, true)
|
|
|
- if err != nil {
|
|
|
- logger.Log(1, "internal error when setting peers after node,", node.ID, "was created (gRPC)")
|
|
|
- }
|
|
|
- logger.Log(0, "new node,", node.Name, ", added on network,"+node.Network)
|
|
|
|
|
|
return response, nil
|
|
|
}
|
|
|
|
|
|
// NodeServiceServer.UpdateNode updates a node and responds over gRPC
|
|
|
func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
|
|
|
-
|
|
|
+ // Get the node data from the request
|
|
|
var newnode models.Node
|
|
|
if err := json.Unmarshal([]byte(req.GetData()), &newnode); err != nil {
|
|
|
return nil, err
|
|
@@ -117,7 +117,6 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object)
|
|
|
newnode.PostDown = node.PostDown
|
|
|
newnode.PostUp = node.PostUp
|
|
|
}
|
|
|
- var shouldPeersUpdate = logic.ShouldPeersUpdate(&node, &newnode)
|
|
|
|
|
|
err = logic.UpdateNode(&node, &newnode)
|
|
|
if err != nil {
|
|
@@ -131,10 +130,6 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object)
|
|
|
if errN != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- err = runServerPeerUpdate(newnode.Network, shouldPeersUpdate)
|
|
|
- if err != nil {
|
|
|
- logger.Log(1, "could not update peers on gRPC after node,", newnode.ID, "updated (gRPC), \nerror:", err.Error())
|
|
|
- }
|
|
|
return &nodepb.Object{
|
|
|
Data: string(nodeData),
|
|
|
Type: nodepb.NODE_TYPE,
|
|
@@ -143,25 +138,16 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object)
|
|
|
|
|
|
// NodeServiceServer.DeleteNode - deletes a node and responds over gRPC
|
|
|
func (s *NodeServiceServer) DeleteNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
|
|
|
-
|
|
|
- var node, err = getNewOrLegacyNode(req.Data)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
+ nodeID := req.GetData()
|
|
|
+ var nodeInfo = strings.Split(nodeID, "###")
|
|
|
+ if len(nodeInfo) != 2 {
|
|
|
+ return nil, errors.New("node not found")
|
|
|
}
|
|
|
-
|
|
|
- err = logic.DeleteNodeByID(&node, true)
|
|
|
+ var node, err = logic.GetNode(nodeInfo[0], nodeInfo[1])
|
|
|
+ err = logic.DeleteNodeByMacAddress(&node, true)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- // notify other nodes on network of deleted peer
|
|
|
- if err := mq.NewPeer(node); err != nil {
|
|
|
- logger.Log(0, "failed to inform peers of deleted node "+err.Error())
|
|
|
- }
|
|
|
-
|
|
|
- err = runServerPeerUpdate(node.Network, true)
|
|
|
- if err != nil {
|
|
|
- logger.Log(1, "internal error when setting peers after deleting node:", node.ID, "over gRPC")
|
|
|
- }
|
|
|
|
|
|
return &nodepb.Object{
|
|
|
Data: "success",
|
|
@@ -171,39 +157,49 @@ func (s *NodeServiceServer) DeleteNode(ctx context.Context, req *nodepb.Object)
|
|
|
|
|
|
// NodeServiceServer.GetPeers - fetches peers over gRPC
|
|
|
func (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
|
|
|
+ macAndNetwork := strings.Split(req.Data, "###")
|
|
|
+ if len(macAndNetwork) == 2 {
|
|
|
+ // TODO: Make constant and new variable for isServer
|
|
|
+ node, err := logic.GetNode(macAndNetwork[0], macAndNetwork[1])
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ if node.IsServer == "yes" && logic.IsLeader(&node) {
|
|
|
+ logic.SetNetworkServerPeers(&node)
|
|
|
+ }
|
|
|
+ excludeIsRelayed := node.IsRelay != "yes"
|
|
|
+ var relayedNode string
|
|
|
+ if node.IsRelayed == "yes" {
|
|
|
+ relayedNode = node.Address
|
|
|
+ }
|
|
|
+ peers, err := logic.GetPeersList(macAndNetwork[1], excludeIsRelayed, relayedNode)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
|
|
|
- var node, err = getNewOrLegacyNode(req.Data)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- excludeIsRelayed := node.IsRelay != "yes"
|
|
|
- var relayedNode string
|
|
|
- if node.IsRelayed == "yes" {
|
|
|
- relayedNode = node.Address
|
|
|
- }
|
|
|
- peers, err := logic.GetPeersList(node.Network, excludeIsRelayed, relayedNode)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
+ peersData, err := json.Marshal(&peers)
|
|
|
+ logger.Log(3, node.Address, "checked in successfully")
|
|
|
+ return &nodepb.Object{
|
|
|
+ Data: string(peersData),
|
|
|
+ Type: nodepb.NODE_TYPE,
|
|
|
+ }, err
|
|
|
}
|
|
|
-
|
|
|
- peersData, err := json.Marshal(&peers)
|
|
|
- logger.Log(3, node.Address, "checked in successfully")
|
|
|
return &nodepb.Object{
|
|
|
- Data: string(peersData),
|
|
|
+ Data: "",
|
|
|
Type: nodepb.NODE_TYPE,
|
|
|
- }, err
|
|
|
+ }, errors.New("could not fetch peers, invalid node id")
|
|
|
}
|
|
|
|
|
|
// NodeServiceServer.GetExtPeers - returns ext peers for a gateway node
|
|
|
func (s *NodeServiceServer) GetExtPeers(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
|
|
|
-
|
|
|
- var node, err = getNewOrLegacyNode(req.Data)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
+ // Initiate a NodeItem type to write decoded data to
|
|
|
+ //data := &models.PeersResponse{}
|
|
|
+ // collection.Find returns a cursor for our (empty) query
|
|
|
+ macAndNetwork := strings.Split(req.Data, "###")
|
|
|
+ if len(macAndNetwork) != 2 {
|
|
|
+ return nil, errors.New("did not receive valid node id when fetching ext peers")
|
|
|
}
|
|
|
-
|
|
|
- peers, err := logic.GetExtPeersList(&node)
|
|
|
+ peers, err := logic.GetExtPeersList(macAndNetwork[0], macAndNetwork[1])
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
@@ -230,27 +226,3 @@ func (s *NodeServiceServer) GetExtPeers(ctx context.Context, req *nodepb.Object)
|
|
|
Type: nodepb.EXT_PEER,
|
|
|
}, nil
|
|
|
}
|
|
|
-
|
|
|
-// == private methods ==
|
|
|
-
|
|
|
-func getNewOrLegacyNode(data string) (models.Node, error) {
|
|
|
- var reqNode, node models.Node
|
|
|
- var err error
|
|
|
-
|
|
|
- if err = json.Unmarshal([]byte(data), &reqNode); err != nil {
|
|
|
- oldID := strings.Split(data, "###") // handle legacy client IDs
|
|
|
- if len(oldID) == 2 {
|
|
|
- if node, err = logic.GetNodeByIDorMacAddress(reqNode.ID, oldID[0], oldID[1]); err != nil {
|
|
|
- return models.Node{}, err
|
|
|
- }
|
|
|
- } else {
|
|
|
- return models.Node{}, err
|
|
|
- }
|
|
|
- } else {
|
|
|
- node, err = logic.GetNodeByIDorMacAddress(reqNode.ID, reqNode.MacAddress, reqNode.Network)
|
|
|
- if err != nil {
|
|
|
- return models.Node{}, err
|
|
|
- }
|
|
|
- }
|
|
|
- return node, nil
|
|
|
-}
|