nodeGrpcController.go 5.7 KB

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