node_test.go 8.5 KB

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