network_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  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. initialize()
  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. initialize()
  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. initialize()
  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. initialize()
  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 = "ThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfail"
  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. initialize()
  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. initialize()
  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. initialize()
  171. os.Setenv("MASTER_KEY", "secretkey")
  172. t.Run("NoNetwork", func(t *testing.T) {
  173. networks, username, err := logic.UserPermissions(false, "", "Bearer secretkey")
  174. assert.Nil(t, err)
  175. t.Log(networks, username)
  176. })
  177. t.Run("WithNetwork", func(t *testing.T) {
  178. networks, username, err := logic.UserPermissions(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. networks, username, err := logic.UserPermissions(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. networks, username, err := logic.UserPermissions(false, "skynet", "Bearer badkey")
  191. assert.NotNil(t, err)
  192. t.Log(err)
  193. t.Log(networks, username)
  194. })
  195. }
  196. func TestValidateNetwork(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. initialize()
  201. //yes := true
  202. //no := false
  203. //deleteNet(t)
  204. //DeleteNetworks
  205. cases := []NetworkValidationTestCase{
  206. {
  207. testname: "InvalidAddress",
  208. network: models.Network{
  209. NetID: "skynet",
  210. AddressRange: "10.0.0.256",
  211. },
  212. errMessage: "Field validation for 'AddressRange' failed on the 'cidrv4' tag",
  213. },
  214. {
  215. testname: "InvalidAddress6",
  216. network: models.Network{
  217. NetID: "skynet1",
  218. AddressRange6: "2607::ffff/130",
  219. },
  220. errMessage: "Field validation for 'AddressRange6' failed on the 'cidrv6' tag",
  221. },
  222. {
  223. testname: "InvalidNetID",
  224. network: models.Network{
  225. NetID: "with spaces",
  226. },
  227. errMessage: "Field validation for 'NetID' failed on the 'netid_valid' tag",
  228. },
  229. {
  230. testname: "NetIDTooLong",
  231. network: models.Network{
  232. NetID: "LongNetIDName",
  233. },
  234. errMessage: "Field validation for 'NetID' failed on the 'max' tag",
  235. },
  236. {
  237. testname: "ListenPortTooLow",
  238. network: models.Network{
  239. NetID: "skynet",
  240. DefaultListenPort: 1023,
  241. },
  242. errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
  243. },
  244. {
  245. testname: "ListenPortTooHigh",
  246. network: models.Network{
  247. NetID: "skynet",
  248. DefaultListenPort: 65536,
  249. },
  250. errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
  251. },
  252. {
  253. testname: "KeepAliveTooBig",
  254. network: models.Network{
  255. NetID: "skynet",
  256. DefaultKeepalive: 1010,
  257. },
  258. errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
  259. },
  260. {
  261. testname: "InvalidLocalRange",
  262. network: models.Network{
  263. NetID: "skynet",
  264. LocalRange: "192.168.0.1",
  265. },
  266. errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
  267. },
  268. }
  269. for _, tc := range cases {
  270. t.Run(tc.testname, func(t *testing.T) {
  271. t.Log(tc.testname)
  272. network := models.Network(tc.network)
  273. network.SetDefaults()
  274. err := logic.ValidateNetwork(&network, false)
  275. assert.NotNil(t, err)
  276. assert.Contains(t, err.Error(), tc.errMessage) // test passes if err.Error() contains the expected errMessage.
  277. })
  278. }
  279. }
  280. func TestIpv6Network(t *testing.T) {
  281. //these seem to work but not sure it the tests are really testing the functionality
  282. initialize()
  283. os.Setenv("MASTER_KEY", "secretkey")
  284. deleteAllNetworks()
  285. createNet()
  286. createNetDualStack()
  287. network, err := logic.GetNetwork("skynet6")
  288. t.Run("Test Network Create IPv6", func(t *testing.T) {
  289. assert.Nil(t, err)
  290. assert.Equal(t, network.AddressRange6, "fde6:be04:fa5e:d076::/64")
  291. })
  292. 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"}
  293. nodeErr := logic.CreateNode(&node1)
  294. t.Run("Test node on network IPv6", func(t *testing.T) {
  295. assert.Nil(t, nodeErr)
  296. assert.Equal(t, "fde6:be04:fa5e:d076::1", node1.Address6)
  297. })
  298. }
  299. func deleteAllNetworks() {
  300. deleteAllNodes()
  301. nets, _ := logic.GetNetworks()
  302. for _, net := range nets {
  303. logic.DeleteNetwork(net.NetID)
  304. }
  305. }
  306. func initialize() {
  307. database.InitializeDatabase()
  308. createAdminUser()
  309. }
  310. func createAdminUser() {
  311. logic.CreateAdmin(models.User{
  312. UserName: "admin",
  313. Password: "password",
  314. IsAdmin: true,
  315. Networks: []string{},
  316. Groups: []string{},
  317. })
  318. }
  319. func createNet() {
  320. var network models.Network
  321. network.NetID = "skynet"
  322. network.AddressRange = "10.0.0.1/24"
  323. _, err := logic.GetNetwork("skynet")
  324. if err != nil {
  325. logic.CreateNetwork(network)
  326. }
  327. }
  328. func createNetDualStack() {
  329. var network models.Network
  330. network.NetID = "skynet6"
  331. network.AddressRange = "10.1.2.0/24"
  332. network.AddressRange6 = "fde6:be04:fa5e:d076::/64"
  333. network.IsIPv4 = "yes"
  334. network.IsIPv6 = "yes"
  335. _, err := logic.GetNetwork("skynet6")
  336. if err != nil {
  337. logic.CreateNetwork(network)
  338. }
  339. }