network_test.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. package controller
  2. import (
  3. "os"
  4. "testing"
  5. "github.com/gravitl/netmaker/database"
  6. "github.com/gravitl/netmaker/logic"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. type NetworkValidationTestCase struct {
  11. testname string
  12. network models.Network
  13. errMessage string
  14. }
  15. func TestCreateNetwork(t *testing.T) {
  16. database.InitializeDatabase()
  17. deleteAllNetworks()
  18. var network models.Network
  19. network.NetID = "skynet"
  20. network.AddressRange = "10.0.0.1/24"
  21. // if tests break - check here (removed displayname)
  22. //network.DisplayName = "mynetwork"
  23. _, err := logic.CreateNetwork(network)
  24. assert.Nil(t, err)
  25. }
  26. func TestGetNetwork(t *testing.T) {
  27. database.InitializeDatabase()
  28. createNet()
  29. t.Run("GetExistingNetwork", func(t *testing.T) {
  30. network, err := logic.GetNetwork("skynet")
  31. assert.Nil(t, err)
  32. assert.Equal(t, "skynet", network.NetID)
  33. })
  34. t.Run("GetNonExistantNetwork", func(t *testing.T) {
  35. network, err := logic.GetNetwork("doesnotexist")
  36. assert.EqualError(t, err, "no result found")
  37. assert.Equal(t, "", network.NetID)
  38. })
  39. }
  40. func TestDeleteNetwork(t *testing.T) {
  41. database.InitializeDatabase()
  42. createNet()
  43. //create nodes
  44. t.Run("NetworkwithNodes", func(t *testing.T) {
  45. })
  46. t.Run("DeleteExistingNetwork", func(t *testing.T) {
  47. err := logic.DeleteNetwork("skynet")
  48. assert.Nil(t, err)
  49. })
  50. t.Run("NonExistantNetwork", func(t *testing.T) {
  51. err := logic.DeleteNetwork("skynet")
  52. assert.Nil(t, err)
  53. })
  54. }
  55. func TestCreateKey(t *testing.T) {
  56. database.InitializeDatabase()
  57. createNet()
  58. keys, _ := logic.GetKeys("skynet")
  59. for _, key := range keys {
  60. logic.DeleteKey(key.Name, "skynet")
  61. }
  62. var accesskey models.AccessKey
  63. var network models.Network
  64. network.NetID = "skynet"
  65. t.Run("NameTooLong", func(t *testing.T) {
  66. network, err := logic.GetNetwork("skynet")
  67. assert.Nil(t, err)
  68. accesskey.Name = "Thisisareallylongkeynamethatwillfail"
  69. _, err = logic.CreateAccessKey(accesskey, network)
  70. assert.NotNil(t, err)
  71. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'max' tag")
  72. })
  73. t.Run("BlankName", func(t *testing.T) {
  74. network, err := logic.GetNetwork("skynet")
  75. assert.Nil(t, err)
  76. accesskey.Name = ""
  77. key, err := logic.CreateAccessKey(accesskey, network)
  78. assert.Nil(t, err)
  79. assert.NotEqual(t, "", key.Name)
  80. })
  81. t.Run("InvalidValue", func(t *testing.T) {
  82. network, err := logic.GetNetwork("skynet")
  83. assert.Nil(t, err)
  84. accesskey.Value = "bad-value"
  85. _, err = logic.CreateAccessKey(accesskey, network)
  86. assert.NotNil(t, err)
  87. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'alphanum' tag")
  88. })
  89. t.Run("BlankValue", func(t *testing.T) {
  90. network, err := logic.GetNetwork("skynet")
  91. assert.Nil(t, err)
  92. accesskey.Name = "mykey"
  93. accesskey.Value = ""
  94. key, err := logic.CreateAccessKey(accesskey, network)
  95. assert.Nil(t, err)
  96. assert.NotEqual(t, "", key.Value)
  97. assert.Equal(t, accesskey.Name, key.Name)
  98. })
  99. t.Run("ValueTooLong", func(t *testing.T) {
  100. network, err := logic.GetNetwork("skynet")
  101. assert.Nil(t, err)
  102. accesskey.Name = "keyname"
  103. accesskey.Value = "AccessKeyValuethatistoolong"
  104. _, err = logic.CreateAccessKey(accesskey, network)
  105. assert.NotNil(t, err)
  106. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'max' tag")
  107. })
  108. t.Run("BlankUses", func(t *testing.T) {
  109. network, err := logic.GetNetwork("skynet")
  110. assert.Nil(t, err)
  111. accesskey.Uses = 0
  112. accesskey.Value = ""
  113. key, err := logic.CreateAccessKey(accesskey, network)
  114. assert.Nil(t, err)
  115. assert.Equal(t, 1, key.Uses)
  116. })
  117. t.Run("DuplicateKey", func(t *testing.T) {
  118. network, err := logic.GetNetwork("skynet")
  119. assert.Nil(t, err)
  120. accesskey.Name = "mykey"
  121. _, err = logic.CreateAccessKey(accesskey, network)
  122. assert.NotNil(t, err)
  123. assert.EqualError(t, err, "duplicate AccessKey Name")
  124. })
  125. }
  126. func TestGetKeys(t *testing.T) {
  127. database.InitializeDatabase()
  128. deleteAllNetworks()
  129. createNet()
  130. network, err := logic.GetNetwork("skynet")
  131. assert.Nil(t, err)
  132. var key models.AccessKey
  133. key.Name = "mykey"
  134. _, err = logic.CreateAccessKey(key, network)
  135. assert.Nil(t, err)
  136. t.Run("KeyExists", func(t *testing.T) {
  137. keys, err := logic.GetKeys(network.NetID)
  138. assert.Nil(t, err)
  139. assert.NotEqual(t, models.AccessKey{}, keys)
  140. })
  141. t.Run("NonExistantKey", func(t *testing.T) {
  142. err := logic.DeleteKey("mykey", "skynet")
  143. assert.Nil(t, err)
  144. keys, err := logic.GetKeys(network.NetID)
  145. assert.Nil(t, err)
  146. assert.Equal(t, []models.AccessKey(nil), keys)
  147. })
  148. }
  149. func TestDeleteKey(t *testing.T) {
  150. database.InitializeDatabase()
  151. createNet()
  152. network, err := logic.GetNetwork("skynet")
  153. assert.Nil(t, err)
  154. var key models.AccessKey
  155. key.Name = "mykey"
  156. _, err = logic.CreateAccessKey(key, network)
  157. assert.Nil(t, err)
  158. t.Run("ExistingKey", func(t *testing.T) {
  159. err := logic.DeleteKey("mykey", "skynet")
  160. assert.Nil(t, err)
  161. })
  162. t.Run("NonExistantKey", func(t *testing.T) {
  163. err := logic.DeleteKey("mykey", "skynet")
  164. assert.NotNil(t, err)
  165. assert.Equal(t, "key mykey does not exist", err.Error())
  166. })
  167. }
  168. func TestSecurityCheck(t *testing.T) {
  169. //these seem to work but not sure it the tests are really testing the functionality
  170. database.InitializeDatabase()
  171. os.Setenv("MASTER_KEY", "secretkey")
  172. t.Run("NoNetwork", func(t *testing.T) {
  173. err, networks, username := SecurityCheck(false, "", "Bearer secretkey")
  174. assert.Nil(t, err)
  175. t.Log(networks, username)
  176. })
  177. t.Run("WithNetwork", func(t *testing.T) {
  178. err, networks, username := SecurityCheck(false, "skynet", "Bearer secretkey")
  179. assert.Nil(t, err)
  180. t.Log(networks, username)
  181. })
  182. t.Run("BadNet", func(t *testing.T) {
  183. t.Skip()
  184. err, networks, username := SecurityCheck(false, "badnet", "Bearer secretkey")
  185. assert.NotNil(t, err)
  186. t.Log(err)
  187. t.Log(networks, username)
  188. })
  189. t.Run("BadToken", func(t *testing.T) {
  190. err, networks, username := SecurityCheck(false, "skynet", "Bearer badkey")
  191. assert.NotNil(t, err)
  192. t.Log(err)
  193. t.Log(networks, username)
  194. })
  195. }
  196. func TestValidateNetworkUpdate(t *testing.T) {
  197. t.Skip()
  198. //This functions is not called by anyone
  199. //it panics as validation function 'display_name_valid' is not defined
  200. database.InitializeDatabase()
  201. //yes := true
  202. //no := false
  203. //deleteNet(t)
  204. //DeleteNetworks
  205. cases := []NetworkValidationTestCase{
  206. {
  207. testname: "InvalidAddress",
  208. network: models.Network{
  209. AddressRange: "10.0.0.256",
  210. },
  211. errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag",
  212. },
  213. {
  214. testname: "InvalidAddress6",
  215. network: models.Network{
  216. AddressRange6: "2607::ag",
  217. },
  218. errMessage: "Field validation for 'AddressRange6' failed on the 'cidr' tag",
  219. },
  220. {
  221. testname: "InvalidNetID",
  222. network: models.Network{
  223. NetID: "contains spaces",
  224. },
  225. errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag",
  226. },
  227. {
  228. testname: "NetIDTooLong",
  229. network: models.Network{
  230. NetID: "LongNetIDName",
  231. },
  232. errMessage: "Field validation for 'NetID' failed on the 'max' tag",
  233. },
  234. {
  235. testname: "ListenPortTooLow",
  236. network: models.Network{
  237. DefaultListenPort: 1023,
  238. },
  239. errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
  240. },
  241. {
  242. testname: "ListenPortTooHigh",
  243. network: models.Network{
  244. DefaultListenPort: 65536,
  245. },
  246. errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
  247. },
  248. {
  249. testname: "KeepAliveTooBig",
  250. network: models.Network{
  251. DefaultKeepalive: 1010,
  252. },
  253. errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
  254. },
  255. {
  256. testname: "InvalidLocalRange",
  257. network: models.Network{
  258. LocalRange: "192.168.0.1",
  259. },
  260. errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
  261. },
  262. }
  263. for _, tc := range cases {
  264. t.Run(tc.testname, func(t *testing.T) {
  265. network := models.Network(tc.network)
  266. err := logic.ValidateNetworkUpdate(network)
  267. assert.NotNil(t, err)
  268. assert.Contains(t, err.Error(), tc.errMessage)
  269. })
  270. }
  271. }
  272. func TestIpv6Network(t *testing.T) {
  273. //these seem to work but not sure it the tests are really testing the functionality
  274. database.InitializeDatabase()
  275. os.Setenv("MASTER_KEY", "secretkey")
  276. deleteAllNetworks()
  277. createNet()
  278. createNetDualStack()
  279. network, err := logic.GetNetwork("skynet6")
  280. t.Run("Test Network Create IPv6", func(t *testing.T) {
  281. assert.Nil(t, err)
  282. assert.Equal(t, network.AddressRange6, "fde6:be04:fa5e:d076::/64")
  283. })
  284. node1 := models.Node{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.50", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet6", OS: "linux"}
  285. nodeErr := logic.CreateNode(&node1)
  286. t.Run("Test node on network IPv6", func(t *testing.T) {
  287. assert.Nil(t, nodeErr)
  288. assert.Equal(t, "fde6:be04:fa5e:d076::", node1.Address6)
  289. })
  290. }
  291. func deleteAllNetworks() {
  292. deleteAllNodes()
  293. nets, _ := logic.GetNetworks()
  294. for _, net := range nets {
  295. logic.DeleteNetwork(net.NetID)
  296. }
  297. }
  298. func createNet() {
  299. var network models.Network
  300. network.NetID = "skynet"
  301. network.AddressRange = "10.0.0.1/24"
  302. _, err := logic.GetNetwork("skynet")
  303. if err != nil {
  304. logic.CreateNetwork(network)
  305. }
  306. }
  307. func createNetDualStack() {
  308. var network models.Network
  309. network.NetID = "skynet6"
  310. network.AddressRange = "10.1.2.0/24"
  311. network.AddressRange6 = "fde6:be04:fa5e:d076::/64"
  312. network.IsIPv4 = "yes"
  313. network.IsIPv6 = "yes"
  314. _, err := logic.GetNetwork("skynet6")
  315. if err != nil {
  316. logic.CreateNetwork(network)
  317. }
  318. }