relay.go 3.3 KB

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