nodeGrpcController.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package controller
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "log"
  7. "strings"
  8. "github.com/gravitl/netmaker/functions"
  9. nodepb "github.com/gravitl/netmaker/grpc"
  10. "github.com/gravitl/netmaker/models"
  11. )
  12. type NodeServiceServer struct {
  13. nodepb.UnimplementedNodeServiceServer
  14. }
  15. func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
  16. // convert string id (from proto) to mongoDB ObjectId
  17. macAndNetwork := strings.Split(req.Data, "###")
  18. if len(macAndNetwork) != 2 {
  19. return nil, errors.New("could not read node, invalid node id given")
  20. }
  21. node, err := GetNode(macAndNetwork[0], macAndNetwork[1])
  22. // TODO: Make constant and new variable for isServer
  23. if node.Name == "netmaker" {
  24. SetNetworkServerPeers(macAndNetwork[1])
  25. }
  26. if err != nil {
  27. log.Println("could not get node "+macAndNetwork[0]+" "+macAndNetwork[1], err)
  28. return nil, err
  29. }
  30. node.SetLastCheckIn()
  31. // Cast to ReadNodeRes type
  32. nodeData, err := json.Marshal(&node)
  33. if err != nil {
  34. return nil, err
  35. }
  36. node.Update(&node)
  37. response := &nodepb.Object{
  38. Data: string(nodeData),
  39. Type: nodepb.NODE_TYPE,
  40. }
  41. return response, nil
  42. }
  43. func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
  44. // Get the protobuf node type from the protobuf request type
  45. // Essentially doing req.Node to access the struct with a nil check
  46. var node models.Node
  47. data := req.GetData()
  48. if err := json.Unmarshal([]byte(data), &node); err != nil {
  49. return nil, err
  50. }
  51. //Check to see if key is valid
  52. //TODO: Triple inefficient!!! This is the third call to the DB we make for networks
  53. validKey := functions.IsKeyValid(node.Network, node.AccessKey)
  54. network, err := functions.GetParentNetwork(node.Network)
  55. if err != nil {
  56. return nil, err
  57. }
  58. if !validKey {
  59. //Check to see if network will allow manual sign up
  60. //may want to switch this up with the valid key check and avoid a DB call that way.
  61. if network.AllowManualSignUp == "yes" {
  62. node.IsPending = "yes"
  63. } else {
  64. return nil, errors.New("invalid key, and network does not allow no-key signups")
  65. }
  66. }
  67. node, err = CreateNode(node, node.Network)
  68. if err != nil {
  69. log.Println("could not create node on network " + node.Network + " (gRPC controller)")
  70. return nil, err
  71. }
  72. nodeData, err := json.Marshal(&node)
  73. // return the node in a CreateNodeRes type
  74. response := &nodepb.Object{
  75. Data: string(nodeData),
  76. Type: nodepb.NODE_TYPE,
  77. }
  78. err = SetNetworkNodesLastModified(node.Network)
  79. if err != nil {
  80. return nil, err
  81. }
  82. return response, nil
  83. }
  84. func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
  85. // Get the node data from the request
  86. var newnode models.Node
  87. if err := json.Unmarshal([]byte(req.GetData()), &newnode); err != nil {
  88. return nil, err
  89. }
  90. macaddress := newnode.MacAddress
  91. networkName := newnode.Network
  92. node, err := functions.GetNodeByMacAddress(networkName, macaddress)
  93. if err != nil {
  94. return nil, err
  95. }
  96. err = node.Update(&newnode)
  97. if err != nil {
  98. return nil, err
  99. }
  100. nodeData, err := json.Marshal(&node)
  101. return &nodepb.Object{
  102. Data: string(nodeData),
  103. Type: nodepb.NODE_TYPE,
  104. }, nil
  105. }
  106. func (s *NodeServiceServer) DeleteNode(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
  107. nodeID := req.GetData()
  108. err := DeleteNode(nodeID, true)
  109. if err != nil {
  110. log.Println("Error deleting node (gRPC controller).")
  111. return nil, err
  112. }
  113. return &nodepb.Object{
  114. Data: "success",
  115. Type: nodepb.STRING_TYPE,
  116. }, nil
  117. }
  118. func (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
  119. macAndNetwork := strings.Split(req.Data, "###")
  120. if len(macAndNetwork) == 2 {
  121. peers, err := GetPeersList(macAndNetwork[1])
  122. if err != nil {
  123. return nil, err
  124. }
  125. peersData, err := json.Marshal(&peers)
  126. return &nodepb.Object{
  127. Data: string(peersData),
  128. Type: nodepb.NODE_TYPE,
  129. }, err
  130. }
  131. return &nodepb.Object{
  132. Data: "",
  133. Type: nodepb.NODE_TYPE,
  134. }, errors.New("could not fetch peers, invalid node id")
  135. }
  136. /**
  137. * Return Ext Peers (clients).NodeCheckIn
  138. * When a gateway node checks in, it pulls these peers to add to peers list in addition to normal network peers.
  139. */
  140. func (s *NodeServiceServer) GetExtPeers(ctx context.Context, req *nodepb.Object) (*nodepb.Object, error) {
  141. // Initiate a NodeItem type to write decoded data to
  142. //data := &models.PeersResponse{}
  143. // collection.Find returns a cursor for our (empty) query
  144. macAndNetwork := strings.Split(req.Data, "###")
  145. if len(macAndNetwork) != 2 {
  146. return nil, errors.New("did not receive valid node id when fetching ext peers")
  147. }
  148. peers, err := GetExtPeersList(macAndNetwork[0], macAndNetwork[1])
  149. if err != nil {
  150. return nil, err
  151. }
  152. // cursor.Next() returns a boolean, if false there are no more items and loop will break
  153. var extPeers []models.Node
  154. for i := 0; i < len(peers); i++ {
  155. extPeers = append(extPeers, models.Node{
  156. Address: peers[i].Address,
  157. Address6: peers[i].Address6,
  158. Endpoint: peers[i].Endpoint,
  159. PublicKey: peers[i].PublicKey,
  160. PersistentKeepalive: peers[i].KeepAlive,
  161. ListenPort: peers[i].ListenPort,
  162. LocalAddress: peers[i].LocalAddress,
  163. })
  164. }
  165. extData, err := json.Marshal(&extPeers)
  166. if err != nil {
  167. return nil, err
  168. }
  169. return &nodepb.Object{
  170. Data: string(extData),
  171. Type: nodepb.EXT_PEER,
  172. }, nil
  173. }