node_test.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package controller
  2. import (
  3. "testing"
  4. "github.com/gravitl/netmaker/database"
  5. "github.com/gravitl/netmaker/logic"
  6. nodeacls "github.com/gravitl/netmaker/logic/acls/node-acls"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestCreateEgressGateway(t *testing.T) {
  11. var gateway models.EgressGatewayRequest
  12. gateway.Interface = "eth0"
  13. gateway.Ranges = []string{"10.100.100.0/24"}
  14. gateway.NetID = "skynet"
  15. database.InitializeDatabase()
  16. deleteAllNetworks()
  17. createNet()
  18. t.Run("NoNodes", func(t *testing.T) {
  19. node, err := logic.CreateEgressGateway(gateway)
  20. assert.Equal(t, models.Node{}, node)
  21. assert.EqualError(t, err, "could not find any records")
  22. })
  23. t.Run("Non-linux node", func(t *testing.T) {
  24. createnode := models.Node{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.1", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet", OS: "freebsd"}
  25. err := logic.CreateNode(&createnode)
  26. assert.Nil(t, err)
  27. gateway.NodeID = createnode.ID
  28. node, err := logic.CreateEgressGateway(gateway)
  29. assert.Equal(t, models.Node{}, node)
  30. assert.EqualError(t, err, "freebsd is unsupported for egress gateways")
  31. })
  32. t.Run("Success", func(t *testing.T) {
  33. deleteAllNodes()
  34. testnode := createTestNode()
  35. gateway.NodeID = testnode.ID
  36. node, err := logic.CreateEgressGateway(gateway)
  37. t.Log(node)
  38. assert.Nil(t, err)
  39. assert.Equal(t, "yes", node.IsEgressGateway)
  40. assert.Equal(t, gateway.Ranges, node.EgressGatewayRanges)
  41. })
  42. }
  43. func TestDeleteEgressGateway(t *testing.T) {
  44. var gateway models.EgressGatewayRequest
  45. database.InitializeDatabase()
  46. deleteAllNetworks()
  47. createNet()
  48. testnode := createTestNode()
  49. gateway.Interface = "eth0"
  50. gateway.Ranges = []string{"10.100.100.0/24"}
  51. gateway.NetID = "skynet"
  52. gateway.NodeID = testnode.ID
  53. t.Run("Success", func(t *testing.T) {
  54. node, err := logic.CreateEgressGateway(gateway)
  55. assert.Nil(t, err)
  56. assert.Equal(t, "yes", node.IsEgressGateway)
  57. assert.Equal(t, []string{"10.100.100.0/24"}, node.EgressGatewayRanges)
  58. node, err = logic.DeleteEgressGateway(gateway.NetID, gateway.NodeID)
  59. assert.Nil(t, err)
  60. assert.Equal(t, "no", node.IsEgressGateway)
  61. assert.Equal(t, []string([]string{}), node.EgressGatewayRanges)
  62. assert.Equal(t, "", node.PostUp)
  63. assert.Equal(t, "", node.PostDown)
  64. })
  65. t.Run("NotGateway", func(t *testing.T) {
  66. node, err := logic.DeleteEgressGateway(gateway.NetID, gateway.NodeID)
  67. assert.Nil(t, err)
  68. assert.Equal(t, "no", node.IsEgressGateway)
  69. assert.Equal(t, []string([]string{}), node.EgressGatewayRanges)
  70. assert.Equal(t, "", node.PostUp)
  71. assert.Equal(t, "", node.PostDown)
  72. })
  73. t.Run("BadNode", func(t *testing.T) {
  74. node, err := logic.DeleteEgressGateway(gateway.NetID, "01:02:03")
  75. assert.EqualError(t, err, "no result found")
  76. assert.Equal(t, models.Node{}, node)
  77. deleteAllNodes()
  78. })
  79. }
  80. func TestGetNetworkNodes(t *testing.T) {
  81. database.InitializeDatabase()
  82. deleteAllNetworks()
  83. createNet()
  84. t.Run("BadNet", func(t *testing.T) {
  85. node, err := logic.GetNetworkNodes("badnet")
  86. assert.Nil(t, err)
  87. assert.Nil(t, node)
  88. })
  89. t.Run("NoNodes", func(t *testing.T) {
  90. node, err := logic.GetNetworkNodes("skynet")
  91. assert.Nil(t, err)
  92. assert.Nil(t, node)
  93. })
  94. t.Run("Success", func(t *testing.T) {
  95. createTestNode()
  96. node, err := logic.GetNetworkNodes("skynet")
  97. assert.Nil(t, err)
  98. assert.NotEqual(t, []models.Node(nil), node)
  99. })
  100. }
  101. func TestUncordonNode(t *testing.T) {
  102. database.InitializeDatabase()
  103. deleteAllNetworks()
  104. createNet()
  105. node := createTestNode()
  106. t.Run("BadID", func(t *testing.T) {
  107. resp, err := logic.UncordonNode("blahblah")
  108. assert.Equal(t, models.Node{}, resp)
  109. assert.EqualError(t, err, "no result found")
  110. })
  111. t.Run("Success", func(t *testing.T) {
  112. resp, err := logic.UncordonNode(node.ID)
  113. assert.Nil(t, err)
  114. assert.Equal(t, "no", resp.IsPending)
  115. })
  116. }
  117. func TestValidateEgressGateway(t *testing.T) {
  118. var gateway models.EgressGatewayRequest
  119. t.Run("EmptyRange", func(t *testing.T) {
  120. gateway.Interface = "eth0"
  121. gateway.Ranges = []string{}
  122. err := logic.ValidateEgressGateway(gateway)
  123. assert.EqualError(t, err, "IP Ranges Cannot Be Empty")
  124. })
  125. t.Run("EmptyInterface", func(t *testing.T) {
  126. gateway.Interface = ""
  127. err := logic.ValidateEgressGateway(gateway)
  128. assert.NotNil(t, err)
  129. assert.Equal(t, "interface cannot be empty", err.Error())
  130. })
  131. t.Run("Success", func(t *testing.T) {
  132. gateway.Interface = "eth0"
  133. gateway.Ranges = []string{"10.100.100.0/24"}
  134. err := logic.ValidateEgressGateway(gateway)
  135. assert.Nil(t, err)
  136. })
  137. }
  138. func TestNodeACLs(t *testing.T) {
  139. deleteAllNodes()
  140. node1 := models.Node{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.50", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet", OS: "linux"}
  141. node2 := models.Node{PublicKey: "DM5qhLAE20FG7BbfBCger+Ac9D2NDOwCtY1rbYDXf14=", Name: "testnode", Endpoint: "10.0.0.100", MacAddress: "01:02:03:04:05:07", Password: "password", Network: "skynet", OS: "linux"}
  142. logic.CreateNode(&node1)
  143. logic.CreateNode(&node2)
  144. t.Run("acls not present", func(t *testing.T) {
  145. currentACL, err := nodeacls.CreateNetworkACL(nodeacls.NetworkID(node1.Network))
  146. assert.Nil(t, err)
  147. assert.Nil(t, currentACL[nodeacls.NodeID(node1.ID)])
  148. assert.Nil(t, currentACL[nodeacls.NodeID(node2.ID)])
  149. node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID))
  150. assert.NotNil(t, err)
  151. assert.Nil(t, node1ACL)
  152. assert.EqualError(t, err, "no node ACL present for node "+node1.ID)
  153. })
  154. t.Run("node acls exists after creates", func(t *testing.T) {
  155. node1ACL, err := nodeacls.CreateNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID), nodeacls.Allowed)
  156. assert.Nil(t, err)
  157. assert.NotNil(t, node1ACL)
  158. assert.Equal(t, node1ACL[nodeacls.NodeID(node2.ID)], nodeacls.NotPresent)
  159. node2ACL, err := nodeacls.CreateNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node2.ID), nodeacls.Allowed)
  160. assert.Nil(t, err)
  161. assert.NotNil(t, node2ACL)
  162. assert.Equal(t, nodeacls.Allowed, node2ACL[nodeacls.NodeID(node1.ID)])
  163. })
  164. t.Run("node acls correct after fetch", func(t *testing.T) {
  165. node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID))
  166. assert.Nil(t, err)
  167. assert.Equal(t, nodeacls.Allowed, node1ACL[nodeacls.NodeID(node2.ID)])
  168. })
  169. t.Run("node acls correct after modify", func(t *testing.T) {
  170. currentACL, err := nodeacls.CreateNetworkACL(nodeacls.NetworkID(node1.Network))
  171. assert.Nil(t, err)
  172. assert.NotNil(t, currentACL)
  173. node1ACL, err := nodeacls.CreateNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID), nodeacls.Allowed)
  174. assert.Nil(t, err)
  175. node2ACL, err := nodeacls.CreateNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node2.ID), nodeacls.Allowed)
  176. assert.Nil(t, err)
  177. assert.NotNil(t, node1ACL)
  178. assert.NotNil(t, node2ACL)
  179. currentACL, err = nodeacls.FetchCurrentACL(nodeacls.NetworkID(node1.Network))
  180. assert.Nil(t, err)
  181. currentACL.ChangeNodesAccess(nodeacls.NodeID(node1.ID), nodeacls.NodeID(node2.ID), nodeacls.NotAllowed)
  182. assert.Equal(t, nodeacls.NotAllowed, currentACL[nodeacls.NodeID(node1.ID)][nodeacls.NodeID(node2.ID)])
  183. assert.Equal(t, nodeacls.NotAllowed, currentACL[nodeacls.NodeID(node2.ID)][nodeacls.NodeID(node1.ID)])
  184. })
  185. t.Run("node acls removed", func(t *testing.T) {
  186. retNetworkACL, err := nodeacls.RemoveNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID))
  187. assert.Nil(t, err)
  188. assert.NotNil(t, retNetworkACL)
  189. assert.Equal(t, nodeacls.NotPresent, retNetworkACL[nodeacls.NodeID(node2.ID)][nodeacls.NodeID(node1.ID)])
  190. })
  191. deleteAllNodes()
  192. }
  193. func deleteAllNodes() {
  194. database.DeleteAllRecords(database.NODES_TABLE_NAME)
  195. }
  196. func createTestNode() *models.Node {
  197. createnode := models.Node{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.1", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet", OS: "linux"}
  198. logic.CreateNode(&createnode)
  199. return &createnode
  200. }