relay.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package logic
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "time"
  7. "github.com/gravitl/netmaker/database"
  8. "github.com/gravitl/netmaker/logger"
  9. "github.com/gravitl/netmaker/models"
  10. )
  11. // CreateRelay - creates a relay
  12. func CreateRelay(relay models.RelayRequest) ([]models.Node, models.Node, error) {
  13. var returnnodes []models.Node
  14. node, err := GetNodeByID(relay.NodeID)
  15. if err != nil {
  16. return returnnodes, models.Node{}, err
  17. }
  18. host, err := GetHost(node.ID.String())
  19. if err != nil {
  20. return returnnodes, models.Node{}, err
  21. }
  22. if host.OS != "linux" {
  23. return returnnodes, models.Node{}, fmt.Errorf("only linux machines can be relay nodes")
  24. }
  25. err = ValidateRelay(relay)
  26. if err != nil {
  27. return returnnodes, models.Node{}, err
  28. }
  29. node.IsRelay = true
  30. node.RelayAddrs = relay.RelayAddrs
  31. node.SetLastModified()
  32. nodeData, err := json.Marshal(&node)
  33. if err != nil {
  34. return returnnodes, node, err
  35. }
  36. if err = database.Insert(node.ID.String(), string(nodeData), database.NODES_TABLE_NAME); err != nil {
  37. return returnnodes, models.Node{}, err
  38. }
  39. returnnodes, err = SetRelayedNodes(true, node.Network, node.RelayAddrs)
  40. if err != nil {
  41. return returnnodes, node, err
  42. }
  43. return returnnodes, node, nil
  44. }
  45. // SetRelayedNodes- set relayed nodes
  46. func SetRelayedNodes(setRelayed bool, networkName string, addrs []string) ([]models.Node, error) {
  47. var returnnodes []models.Node
  48. networkNodes, err := GetNetworkNodes(networkName)
  49. if err != nil {
  50. return returnnodes, err
  51. }
  52. for _, node := range networkNodes {
  53. for _, addr := range addrs {
  54. if addr == node.Address.IP.String() || addr == node.Address6.IP.String() {
  55. if setRelayed {
  56. node.IsRelayed = true
  57. } else {
  58. node.IsRelayed = false
  59. }
  60. data, err := json.Marshal(&node)
  61. if err != nil {
  62. return returnnodes, err
  63. }
  64. database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
  65. returnnodes = append(returnnodes, node)
  66. }
  67. }
  68. }
  69. return returnnodes, nil
  70. }
  71. func GetRelayedNodes(relayNode *models.Node) ([]models.Node, error) {
  72. var returnnodes []models.Node
  73. networkNodes, err := GetNetworkNodes(relayNode.Network)
  74. if err != nil {
  75. return returnnodes, err
  76. }
  77. for _, node := range networkNodes {
  78. for _, addr := range relayNode.RelayAddrs {
  79. if addr == node.Address.IP.String() || addr == node.Address6.IP.String() {
  80. returnnodes = append(returnnodes, node)
  81. }
  82. }
  83. }
  84. return returnnodes, nil
  85. }
  86. // ValidateRelay - checks if relay is valid
  87. func ValidateRelay(relay models.RelayRequest) error {
  88. var err error
  89. //isIp := functions.IsIpCIDR(gateway.RangeString)
  90. empty := len(relay.RelayAddrs) == 0
  91. if empty {
  92. err = errors.New("IP Ranges Cannot Be Empty")
  93. }
  94. return err
  95. }
  96. // UpdateRelay - updates a relay
  97. func UpdateRelay(network string, oldAddrs []string, newAddrs []string) []models.Node {
  98. var returnnodes []models.Node
  99. time.Sleep(time.Second / 4)
  100. _, err := SetRelayedNodes(false, network, oldAddrs)
  101. if err != nil {
  102. logger.Log(1, err.Error())
  103. }
  104. returnnodes, err = SetRelayedNodes(true, network, newAddrs)
  105. if err != nil {
  106. logger.Log(1, err.Error())
  107. }
  108. return returnnodes
  109. }
  110. // DeleteRelay - deletes a relay
  111. func DeleteRelay(network, nodeid string) ([]models.Node, models.Node, error) {
  112. var returnnodes []models.Node
  113. node, err := GetNodeByID(nodeid)
  114. if err != nil {
  115. return returnnodes, models.Node{}, err
  116. }
  117. returnnodes, err = SetRelayedNodes(false, node.Network, node.RelayAddrs)
  118. if err != nil {
  119. return returnnodes, node, err
  120. }
  121. node.IsRelay = false
  122. node.RelayAddrs = []string{}
  123. node.SetLastModified()
  124. data, err := json.Marshal(&node)
  125. if err != nil {
  126. return returnnodes, models.Node{}, err
  127. }
  128. if err = database.Insert(nodeid, string(data), database.NODES_TABLE_NAME); err != nil {
  129. return returnnodes, models.Node{}, err
  130. }
  131. return returnnodes, node, nil
  132. }