You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

check_rep_count_test.go 3.8 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package event
  2. /*
  3. import (
  4. "testing"
  5. "github.com/samber/lo"
  6. . "github.com/smartystreets/goconvey/convey"
  7. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. "gitlink.org.cn/cloudream/common/utils/sort"
  9. "gitlink.org.cn/cloudream/storage/common/consts"
  10. "gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
  11. )
  12. func Test_chooseNewRepNodes(t *testing.T) {
  13. testcases := []struct {
  14. title string
  15. allNodes []model.Node
  16. curRepNodes []model.Node
  17. newCount int
  18. wantNodeIDs []cdssdk.NodeID
  19. }{
  20. {
  21. title: "优先选择不同地域的节点",
  22. allNodes: []model.Node{
  23. {
  24. NodeID: 1,
  25. LocationID: 1,
  26. State: consts.NodeStateNormal,
  27. },
  28. {
  29. NodeID: 2,
  30. LocationID: 1,
  31. State: consts.NodeStateNormal,
  32. },
  33. {
  34. NodeID: 3,
  35. LocationID: 2,
  36. State: consts.NodeStateNormal,
  37. },
  38. {
  39. NodeID: 4,
  40. LocationID: 3,
  41. State: consts.NodeStateNormal,
  42. },
  43. },
  44. curRepNodes: []model.Node{
  45. {
  46. NodeID: 1,
  47. LocationID: 1,
  48. },
  49. },
  50. newCount: 2,
  51. wantNodeIDs: []cdssdk.NodeID{3, 4},
  52. },
  53. {
  54. title: "就算节点数不足,也不能选择重复节点",
  55. allNodes: []model.Node{
  56. {
  57. NodeID: 1,
  58. LocationID: 1,
  59. State: consts.NodeStateNormal,
  60. },
  61. {
  62. NodeID: 2,
  63. LocationID: 1,
  64. State: consts.NodeStateNormal,
  65. },
  66. },
  67. curRepNodes: []model.Node{
  68. {
  69. NodeID: 1,
  70. LocationID: 1,
  71. },
  72. },
  73. newCount: 2,
  74. wantNodeIDs: []cdssdk.NodeID{2},
  75. },
  76. {
  77. title: "就算节点数不足,也不能选择状态unavailable的节点",
  78. allNodes: []model.Node{
  79. {
  80. NodeID: 1,
  81. LocationID: 1,
  82. State: consts.NodeStateUnavailable,
  83. },
  84. {
  85. NodeID: 2,
  86. LocationID: 1,
  87. State: consts.NodeStateNormal,
  88. },
  89. },
  90. curRepNodes: []model.Node{
  91. {
  92. NodeID: 3,
  93. LocationID: 1,
  94. },
  95. },
  96. newCount: 2,
  97. wantNodeIDs: []cdssdk.NodeID{2},
  98. },
  99. }
  100. for _, test := range testcases {
  101. Convey(test.title, t, func() {
  102. chooseNodes := chooseNewRepNodes(test.allNodes, test.curRepNodes, test.newCount)
  103. chooseNodeIDs := lo.Map(chooseNodes, func(node model.Node, index int) cdssdk.NodeID { return node.NodeID })
  104. sort.Sort(chooseNodeIDs, sort.Cmp[cdssdk.NodeID])
  105. So(chooseNodeIDs, ShouldResemble, test.wantNodeIDs)
  106. })
  107. }
  108. }
  109. func Test_chooseDeleteAvaiRepNodes(t *testing.T) {
  110. testcases := []struct {
  111. title string
  112. allNodes []model.Node
  113. curRepNodes []model.Node
  114. delCount int
  115. wantNodeLocationIDs []cdssdk.LocationID
  116. }{
  117. {
  118. title: "优先选择地域重复的节点",
  119. allNodes: []model.Node{},
  120. curRepNodes: []model.Node{
  121. {NodeID: 1, LocationID: 1}, {NodeID: 2, LocationID: 1},
  122. {NodeID: 3, LocationID: 2}, {NodeID: 4, LocationID: 2},
  123. {NodeID: 5, LocationID: 3}, {NodeID: 6, LocationID: 3}, {NodeID: 7, LocationID: 3},
  124. {NodeID: 8, LocationID: 4},
  125. },
  126. delCount: 4,
  127. wantNodeLocationIDs: []cdssdk.LocationID{1, 2, 3, 3},
  128. },
  129. {
  130. title: "节点不够删",
  131. allNodes: []model.Node{},
  132. curRepNodes: []model.Node{
  133. {NodeID: 1, LocationID: 1},
  134. },
  135. delCount: 2,
  136. wantNodeLocationIDs: []cdssdk.LocationID{1},
  137. },
  138. }
  139. for _, test := range testcases {
  140. Convey(test.title, t, func() {
  141. chooseNodes := chooseDeleteAvaiRepNodes(test.allNodes, test.curRepNodes, test.delCount)
  142. chooseNodeLocationIDs := lo.Map(chooseNodes, func(node model.Node, index int) cdssdk.LocationID { return node.LocationID })
  143. sort.Sort(chooseNodeLocationIDs, sort.Cmp[cdssdk.LocationID])
  144. So(chooseNodeLocationIDs, ShouldResemble, test.wantNodeLocationIDs)
  145. })
  146. }
  147. }
  148. */

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。