networkHttpController_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. package controller
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/gravitl/netmaker/models"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. type NetworkValidationTestCase struct {
  9. testname string
  10. network models.Network
  11. errMessage string
  12. }
  13. func deleteNet() {
  14. _, err := GetNetwork("skynet")
  15. if err == nil {
  16. _, _ = DeleteNetwork("skynet")
  17. }
  18. }
  19. func createNet() {
  20. var network models.Network
  21. network.NetID = "skynet"
  22. network.AddressRange = "10.0.0.1/24"
  23. network.DisplayName = "mynetwork"
  24. _, err := GetNetwork("skynet")
  25. if err != nil {
  26. CreateNetwork(network)
  27. }
  28. }
  29. func getNet() models.Network {
  30. network, _ := GetNetwork("skynet")
  31. return network
  32. }
  33. func TestGetNetworks(t *testing.T) {
  34. //calls functions.ListNetworks --- nothing to be done
  35. }
  36. func TestCreateNetwork(t *testing.T) {
  37. deleteNet()
  38. var network models.Network
  39. network.NetID = "skynet"
  40. network.AddressRange = "10.0.0.1/24"
  41. network.DisplayName = "mynetwork"
  42. err := CreateNetwork(network)
  43. assert.Nil(t, err)
  44. }
  45. func TestGetDeleteNetwork(t *testing.T) {
  46. createNet()
  47. //create nodes
  48. t.Run("NetworkwithNodes", func(t *testing.T) {
  49. })
  50. t.Run("GetExistingNetwork", func(t *testing.T) {
  51. network, err := GetNetwork("skynet")
  52. assert.Nil(t, err)
  53. assert.Equal(t, "skynet", network.NetID)
  54. })
  55. t.Run("DeleteExistingNetwork", func(t *testing.T) {
  56. result, err := DeleteNetwork("skynet")
  57. assert.Nil(t, err)
  58. assert.Equal(t, int64(1), result.DeletedCount)
  59. t.Log(result.DeletedCount)
  60. })
  61. t.Run("GetNonExistantNetwork", func(t *testing.T) {
  62. network, err := GetNetwork("skynet")
  63. assert.NotNil(t, err)
  64. assert.Equal(t, "mongo: no documents in result", err.Error())
  65. assert.Equal(t, "", network.NetID)
  66. })
  67. t.Run("NonExistantNetwork", func(t *testing.T) {
  68. result, err := DeleteNetwork("skynet")
  69. assert.Nil(t, err)
  70. assert.Equal(t, int64(0), result.DeletedCount)
  71. t.Log(result.DeletedCount)
  72. })
  73. }
  74. func TestGetNetwork(t *testing.T) {
  75. createNet()
  76. t.Run("NoNetwork", func(t *testing.T) {
  77. network, err := GetNetwork("badnet")
  78. assert.NotNil(t, err)
  79. assert.Equal(t, "mongo: no documents in result", err.Error())
  80. assert.Equal(t, models.Network{}, network)
  81. })
  82. t.Run("Valid", func(t *testing.T) {
  83. network, err := GetNetwork("skynet")
  84. assert.Nil(t, err)
  85. assert.Equal(t, "skynet", network.NetID)
  86. })
  87. }
  88. func TestUpdateNetwork(t *testing.T) {
  89. createNet()
  90. network := getNet()
  91. t.Run("NetID", func(t *testing.T) {
  92. var networkupdate models.NetworkUpdate
  93. networkupdate.NetID = "wirecat"
  94. _, err := UpdateNetwork(networkupdate, network)
  95. assert.NotNil(t, err)
  96. assert.Equal(t, "NetID is not editable", err.Error())
  97. })
  98. t.Run("LocalRange", func(t *testing.T) {
  99. var networkupdate models.NetworkUpdate
  100. //NetID needs to be set as it will be in updateNetwork
  101. networkupdate.NetID = "skynet"
  102. networkupdate.LocalRange = "192.168.0.1/24"
  103. update, err := UpdateNetwork(networkupdate, network)
  104. assert.Nil(t, err)
  105. t.Log(err, update)
  106. })
  107. }
  108. func TestKeyUpdate(t *testing.T) {
  109. createNet()
  110. existing, err := GetNetwork("skynet")
  111. assert.Nil(t, err)
  112. time.Sleep(time.Second * 1)
  113. network, err := KeyUpdate("skynet")
  114. assert.Nil(t, err)
  115. network, err = GetNetwork("skynet")
  116. assert.Nil(t, err)
  117. assert.Greater(t, network.KeyUpdateTimeStamp, existing.KeyUpdateTimeStamp)
  118. }
  119. func TestCreateKey(t *testing.T) {
  120. createNet()
  121. var accesskey models.AccessKey
  122. var network models.Network
  123. network.NetID = "skynet"
  124. t.Run("InvalidName", func(t *testing.T) {
  125. network, err := GetNetwork("skynet")
  126. assert.Nil(t, err)
  127. accesskey.Name = "bad-name"
  128. _, err = CreateAccessKey(accesskey, network)
  129. assert.NotNil(t, err)
  130. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'alphanum' tag")
  131. })
  132. t.Run("NameTooLong", func(t *testing.T) {
  133. network, err := GetNetwork("skynet")
  134. assert.Nil(t, err)
  135. accesskey.Name = "Thisisareallylongkeynamethatwillfail"
  136. _, err = CreateAccessKey(accesskey, network)
  137. assert.NotNil(t, err)
  138. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'max' tag")
  139. })
  140. t.Run("BlankName", func(t *testing.T) {
  141. network, err := GetNetwork("skynet")
  142. assert.Nil(t, err)
  143. accesskey.Name = ""
  144. key, err := CreateAccessKey(accesskey, network)
  145. assert.Nil(t, err)
  146. assert.NotEqual(t, "", key.Name)
  147. })
  148. t.Run("InvalidValue", func(t *testing.T) {
  149. network, err := GetNetwork("skynet")
  150. assert.Nil(t, err)
  151. accesskey.Value = "bad-value"
  152. _, err = CreateAccessKey(accesskey, network)
  153. assert.NotNil(t, err)
  154. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'alphanum' tag")
  155. })
  156. t.Run("BlankValue", func(t *testing.T) {
  157. network, err := GetNetwork("skynet")
  158. assert.Nil(t, err)
  159. accesskey.Name = "mykey"
  160. accesskey.Value = ""
  161. key, err := CreateAccessKey(accesskey, network)
  162. assert.Nil(t, err)
  163. assert.NotEqual(t, "", key.Value)
  164. assert.Equal(t, accesskey.Name, key.Name)
  165. })
  166. t.Run("ValueTooLong", func(t *testing.T) {
  167. network, err := GetNetwork("skynet")
  168. assert.Nil(t, err)
  169. accesskey.Name = "keyname"
  170. accesskey.Value = "AccessKeyValuethatistoolong"
  171. _, err = CreateAccessKey(accesskey, network)
  172. assert.NotNil(t, err)
  173. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'max' tag")
  174. })
  175. t.Run("BlankUses", func(t *testing.T) {
  176. network, err := GetNetwork("skynet")
  177. assert.Nil(t, err)
  178. accesskey.Uses = 0
  179. accesskey.Value = ""
  180. key, err := CreateAccessKey(accesskey, network)
  181. assert.Nil(t, err)
  182. assert.Equal(t, 1, key.Uses)
  183. })
  184. t.Run("DuplicateKey", func(t *testing.T) {
  185. network, err := GetNetwork("skynet")
  186. assert.Nil(t, err)
  187. accesskey.Name = "mykey"
  188. _, err = CreateAccessKey(accesskey, network)
  189. assert.NotNil(t, err)
  190. assert.Equal(t, "Duplicate AccessKey Name", err.Error())
  191. })
  192. }
  193. func TestGetKeys(t *testing.T) {
  194. deleteNet()
  195. createNet()
  196. network, err := GetNetwork("skynet")
  197. assert.Nil(t, err)
  198. var key models.AccessKey
  199. key.Name = "mykey"
  200. _, err = CreateAccessKey(key, network)
  201. assert.Nil(t, err)
  202. t.Run("KeyExists", func(t *testing.T) {
  203. keys, err := GetKeys(network.NetID)
  204. assert.Nil(t, err)
  205. assert.NotEqual(t, models.AccessKey{}, keys)
  206. })
  207. t.Run("NonExistantKey", func(t *testing.T) {
  208. err := DeleteKey("mykey", "skynet")
  209. assert.Nil(t, err)
  210. keys, err := GetKeys(network.NetID)
  211. assert.Nil(t, err)
  212. assert.Equal(t, []models.AccessKey(nil), keys)
  213. })
  214. }
  215. func TestDeleteKey(t *testing.T) {
  216. createNet()
  217. network, err := GetNetwork("skynet")
  218. assert.Nil(t, err)
  219. var key models.AccessKey
  220. key.Name = "mykey"
  221. _, err = CreateAccessKey(key, network)
  222. assert.Nil(t, err)
  223. t.Run("ExistingKey", func(t *testing.T) {
  224. err := DeleteKey("mykey", "skynet")
  225. assert.Nil(t, err)
  226. })
  227. t.Run("NonExistantKey", func(t *testing.T) {
  228. err := DeleteKey("mykey", "skynet")
  229. assert.NotNil(t, err)
  230. assert.Equal(t, "key mykey does not exist", err.Error())
  231. })
  232. }
  233. func TestSecurityCheck(t *testing.T) {
  234. t.Run("NoNetwork", func(t *testing.T) {
  235. err := SecurityCheck("", "Bearer secretkey")
  236. assert.Nil(t, err)
  237. })
  238. t.Run("WithNetwork", func(t *testing.T) {
  239. err := SecurityCheck("skynet", "Bearer secretkey")
  240. assert.Nil(t, err)
  241. })
  242. t.Run("BadNet", func(t *testing.T) {
  243. err := SecurityCheck("badnet", "Bearer secretkey")
  244. assert.NotNil(t, err)
  245. t.Log(err)
  246. })
  247. t.Run("BadToken", func(t *testing.T) {
  248. err := SecurityCheck("skynet", "Bearer badkey")
  249. assert.NotNil(t, err)
  250. t.Log(err)
  251. })
  252. }
  253. func TestValidateNetworkUpdate(t *testing.T) {
  254. //yes := true
  255. //no := false
  256. deleteNet()
  257. //DeleteNetworks
  258. cases := []NetworkValidationTestCase{
  259. NetworkValidationTestCase{
  260. testname: "InvalidAddress",
  261. network: models.Network{
  262. AddressRange: "10.0.0.256",
  263. },
  264. errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag",
  265. },
  266. NetworkValidationTestCase{
  267. testname: "InvalidAddress6",
  268. network: models.Network{
  269. AddressRange6: "2607::ag",
  270. },
  271. errMessage: "Field validation for 'AddressRange6' failed on the 'cidr' tag",
  272. },
  273. NetworkValidationTestCase{
  274. testname: "BadDisplayName",
  275. network: models.Network{
  276. DisplayName: "skynet*",
  277. },
  278. errMessage: "Field validation for 'DisplayName' failed on the 'alphanum' tag",
  279. },
  280. NetworkValidationTestCase{
  281. testname: "DisplayNameTooLong",
  282. network: models.Network{
  283. DisplayName: "Thisisareallylongdisplaynamethatistoolong",
  284. },
  285. errMessage: "Field validation for 'DisplayName' failed on the 'max' tag",
  286. },
  287. NetworkValidationTestCase{
  288. testname: "DisplayNameTooShort",
  289. network: models.Network{
  290. DisplayName: "1",
  291. },
  292. errMessage: "Field validation for 'DisplayName' failed on the 'min' tag",
  293. },
  294. NetworkValidationTestCase{
  295. testname: "InvalidNetID",
  296. network: models.Network{
  297. NetID: "contains spaces",
  298. },
  299. errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag",
  300. },
  301. NetworkValidationTestCase{
  302. testname: "NetIDTooLong",
  303. network: models.Network{
  304. NetID: "LongNetIDName",
  305. },
  306. errMessage: "Field validation for 'NetID' failed on the 'max' tag",
  307. },
  308. NetworkValidationTestCase{
  309. testname: "ListenPortTooLow",
  310. network: models.Network{
  311. DefaultListenPort: 1023,
  312. },
  313. errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
  314. },
  315. NetworkValidationTestCase{
  316. testname: "ListenPortTooHigh",
  317. network: models.Network{
  318. DefaultListenPort: 65536,
  319. },
  320. errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
  321. },
  322. NetworkValidationTestCase{
  323. testname: "KeepAliveTooBig",
  324. network: models.Network{
  325. DefaultKeepalive: 1010,
  326. },
  327. errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
  328. },
  329. NetworkValidationTestCase{
  330. testname: "InvalidLocalRange",
  331. network: models.Network{
  332. LocalRange: "192.168.0.1",
  333. },
  334. errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
  335. },
  336. NetworkValidationTestCase{
  337. testname: "CheckInIntervalTooBig",
  338. network: models.Network{
  339. DefaultCheckInInterval: 100001,
  340. },
  341. errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'max' tag",
  342. },
  343. NetworkValidationTestCase{
  344. testname: "CheckInIntervalTooSmall",
  345. network: models.Network{
  346. DefaultCheckInInterval: 1,
  347. },
  348. errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'min' tag",
  349. },
  350. }
  351. for _, tc := range cases {
  352. t.Run(tc.testname, func(t *testing.T) {
  353. network := models.NetworkUpdate(tc.network)
  354. err := ValidateNetworkUpdate(network)
  355. assert.NotNil(t, err)
  356. assert.Contains(t, err.Error(), tc.errMessage)
  357. })
  358. }
  359. }
  360. func TestValidateNetworkCreate(t *testing.T) {
  361. yes := true
  362. no := false
  363. deleteNet()
  364. //DeleteNetworks
  365. cases := []NetworkValidationTestCase{
  366. NetworkValidationTestCase{
  367. testname: "InvalidAddress",
  368. network: models.Network{
  369. AddressRange: "10.0.0.256",
  370. NetID: "skynet",
  371. IsDualStack: &no,
  372. },
  373. errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag",
  374. },
  375. NetworkValidationTestCase{
  376. testname: "BadDisplayName",
  377. network: models.Network{
  378. AddressRange: "10.0.0.1/24",
  379. NetID: "skynet",
  380. DisplayName: "skynet*",
  381. IsDualStack: &no,
  382. },
  383. errMessage: "Field validation for 'DisplayName' failed on the 'alphanum' tag",
  384. },
  385. NetworkValidationTestCase{
  386. testname: "DisplayNameTooLong",
  387. network: models.Network{
  388. AddressRange: "10.0.0.1/24",
  389. NetID: "skynet",
  390. DisplayName: "Thisisareallylongdisplaynamethatistoolong",
  391. IsDualStack: &no,
  392. },
  393. errMessage: "Field validation for 'DisplayName' failed on the 'max' tag",
  394. },
  395. NetworkValidationTestCase{
  396. testname: "DisplayNameTooShort",
  397. network: models.Network{
  398. AddressRange: "10.0.0.1/24",
  399. NetID: "skynet",
  400. DisplayName: "1",
  401. IsDualStack: &no,
  402. },
  403. errMessage: "Field validation for 'DisplayName' failed on the 'min' tag",
  404. },
  405. NetworkValidationTestCase{
  406. testname: "NetIDMissing",
  407. network: models.Network{
  408. AddressRange: "10.0.0.1/24",
  409. IsDualStack: &no,
  410. },
  411. errMessage: "Field validation for 'NetID' failed on the 'required' tag",
  412. },
  413. NetworkValidationTestCase{
  414. testname: "InvalidNetID",
  415. network: models.Network{
  416. AddressRange: "10.0.0.1/24",
  417. NetID: "contains spaces",
  418. IsDualStack: &no,
  419. },
  420. errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag",
  421. },
  422. NetworkValidationTestCase{
  423. testname: "NetIDTooShort",
  424. network: models.Network{
  425. AddressRange: "10.0.0.1/24",
  426. NetID: "",
  427. IsDualStack: &no,
  428. },
  429. errMessage: "Field validation for 'NetID' failed on the 'required' tag",
  430. },
  431. NetworkValidationTestCase{
  432. testname: "NetIDTooLong",
  433. network: models.Network{
  434. AddressRange: "10.0.0.1/24",
  435. NetID: "LongNetIDName",
  436. IsDualStack: &no,
  437. },
  438. errMessage: "Field validation for 'NetID' failed on the 'max' tag",
  439. },
  440. NetworkValidationTestCase{
  441. testname: "ListenPortTooLow",
  442. network: models.Network{
  443. AddressRange: "10.0.0.1/24",
  444. NetID: "skynet",
  445. DefaultListenPort: 1023,
  446. IsDualStack: &no,
  447. },
  448. errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
  449. },
  450. NetworkValidationTestCase{
  451. testname: "ListenPortTooHigh",
  452. network: models.Network{
  453. AddressRange: "10.0.0.1/24",
  454. NetID: "skynet",
  455. DefaultListenPort: 65536,
  456. IsDualStack: &no,
  457. },
  458. errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
  459. },
  460. NetworkValidationTestCase{
  461. testname: "KeepAliveTooBig",
  462. network: models.Network{
  463. AddressRange: "10.0.0.1/24",
  464. NetID: "skynet",
  465. DefaultKeepalive: 1010,
  466. IsDualStack: &no,
  467. },
  468. errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
  469. },
  470. NetworkValidationTestCase{
  471. testname: "InvalidLocalRange",
  472. network: models.Network{
  473. AddressRange: "10.0.0.1/24",
  474. NetID: "skynet",
  475. LocalRange: "192.168.0.1",
  476. IsDualStack: &no,
  477. },
  478. errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
  479. },
  480. NetworkValidationTestCase{
  481. testname: "DualStackWithoutIPv6",
  482. network: models.Network{
  483. AddressRange: "10.0.0.1/24",
  484. NetID: "skynet",
  485. IsDualStack: &yes,
  486. },
  487. errMessage: "Field validation for 'AddressRange6' failed on the 'addressrange6_valid' tag",
  488. },
  489. NetworkValidationTestCase{
  490. testname: "CheckInIntervalTooBig",
  491. network: models.Network{
  492. AddressRange: "10.0.0.1/24",
  493. NetID: "skynet",
  494. IsDualStack: &no,
  495. DefaultCheckInInterval: 100001,
  496. },
  497. errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'max' tag",
  498. },
  499. NetworkValidationTestCase{
  500. testname: "CheckInIntervalTooSmall",
  501. network: models.Network{
  502. AddressRange: "10.0.0.1/24",
  503. NetID: "skynet",
  504. IsDualStack: &no,
  505. DefaultCheckInInterval: 1,
  506. },
  507. errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'min' tag",
  508. },
  509. }
  510. for _, tc := range cases {
  511. t.Run(tc.testname, func(t *testing.T) {
  512. err := ValidateNetworkCreate(tc.network)
  513. assert.NotNil(t, err)
  514. assert.Contains(t, err.Error(), tc.errMessage)
  515. })
  516. }
  517. t.Run("DuplicateNetID", func(t *testing.T) {
  518. var net1, net2 models.Network
  519. net1.NetID = "skynet"
  520. net1.AddressRange = "10.0.0.1/24"
  521. net1.DisplayName = "mynetwork"
  522. net2.NetID = "skynet"
  523. net2.AddressRange = "10.0.1.1/24"
  524. net2.IsDualStack = &no
  525. err := CreateNetwork(net1)
  526. assert.Nil(t, err)
  527. err = ValidateNetworkCreate(net2)
  528. assert.NotNil(t, err)
  529. assert.Contains(t, err.Error(), "Field validation for 'NetID' failed on the 'netid_valid' tag")
  530. })
  531. t.Run("DuplicateDisplayName", func(t *testing.T) {
  532. var network models.Network
  533. network.NetID = "wirecat"
  534. network.AddressRange = "10.0.100.1/24"
  535. network.IsDualStack = &no
  536. network.DisplayName = "mynetwork"
  537. err := ValidateNetworkCreate(network)
  538. assert.NotNil(t, err)
  539. assert.Contains(t, err.Error(), "Field validation for 'DisplayName' failed on the 'displayname_unique' tag")
  540. })
  541. }