dnsHttpController_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. package controller
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "testing"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestGetAllDNS(t *testing.T) {
  12. database.InitializeDatabase()
  13. deleteAllDNS(t)
  14. deleteAllNetworks()
  15. createNet()
  16. t.Run("NoEntries", func(t *testing.T) {
  17. entries, err := GetAllDNS()
  18. assert.Nil(t, err)
  19. assert.Equal(t, []models.DNSEntry(nil), entries)
  20. })
  21. t.Run("OneEntry", func(t *testing.T) {
  22. entry := models.DNSEntry{"10.0.0.3", "newhost", "skynet"}
  23. CreateDNS(entry)
  24. entries, err := GetAllDNS()
  25. assert.Nil(t, err)
  26. assert.Equal(t, 1, len(entries))
  27. })
  28. t.Run("MultipleEntry", func(t *testing.T) {
  29. entry := models.DNSEntry{"10.0.0.7", "anotherhost", "skynet"}
  30. CreateDNS(entry)
  31. entries, err := GetAllDNS()
  32. assert.Nil(t, err)
  33. assert.Equal(t, 2, len(entries))
  34. })
  35. }
  36. func TestGetNodeDNS(t *testing.T) {
  37. database.InitializeDatabase()
  38. deleteAllDNS(t)
  39. deleteAllNetworks()
  40. createNet()
  41. t.Run("NoNodes", func(t *testing.T) {
  42. dns, err := GetNodeDNS("skynet")
  43. assert.EqualError(t, err, "could not find any records")
  44. assert.Equal(t, []models.DNSEntry(nil), dns)
  45. })
  46. t.Run("NodeExists", func(t *testing.T) {
  47. createTestNode()
  48. dns, err := GetNodeDNS("skynet")
  49. assert.Nil(t, err)
  50. assert.Equal(t, "10.0.0.1", dns[0].Address)
  51. })
  52. t.Run("MultipleNodes", func(t *testing.T) {
  53. createnode := models.Node{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Endpoint: "10.100.100.3", MacAddress: "01:02:03:04:05:07", Password: "password", Network: "skynet"}
  54. _, err := logic.CreateNode(createnode, "skynet")
  55. assert.Nil(t, err)
  56. dns, err := GetNodeDNS("skynet")
  57. assert.Nil(t, err)
  58. assert.Equal(t, 2, len(dns))
  59. })
  60. }
  61. func TestGetCustomDNS(t *testing.T) {
  62. database.InitializeDatabase()
  63. deleteAllDNS(t)
  64. deleteAllNetworks()
  65. t.Run("NoNetworks", func(t *testing.T) {
  66. dns, err := logic.GetCustomDNS("skynet")
  67. assert.EqualError(t, err, "could not find any records")
  68. assert.Equal(t, []models.DNSEntry(nil), dns)
  69. })
  70. t.Run("NoNodes", func(t *testing.T) {
  71. createNet()
  72. dns, err := logic.GetCustomDNS("skynet")
  73. assert.EqualError(t, err, "could not find any records")
  74. assert.Equal(t, []models.DNSEntry(nil), dns)
  75. })
  76. t.Run("NodeExists", func(t *testing.T) {
  77. createTestNode()
  78. dns, err := logic.GetCustomDNS("skynet")
  79. assert.EqualError(t, err, "could not find any records")
  80. assert.Equal(t, 0, len(dns))
  81. })
  82. t.Run("EntryExist", func(t *testing.T) {
  83. entry := models.DNSEntry{"10.0.0.3", "newhost", "skynet"}
  84. CreateDNS(entry)
  85. dns, err := logic.GetCustomDNS("skynet")
  86. assert.Nil(t, err)
  87. assert.Equal(t, 1, len(dns))
  88. })
  89. t.Run("MultipleEntries", func(t *testing.T) {
  90. entry := models.DNSEntry{"10.0.0.4", "host4", "skynet"}
  91. CreateDNS(entry)
  92. dns, err := logic.GetCustomDNS("skynet")
  93. assert.Nil(t, err)
  94. assert.Equal(t, 2, len(dns))
  95. })
  96. }
  97. func TestGetDNSEntryNum(t *testing.T) {
  98. database.InitializeDatabase()
  99. deleteAllDNS(t)
  100. deleteAllNetworks()
  101. createNet()
  102. t.Run("NoNodes", func(t *testing.T) {
  103. num, err := GetDNSEntryNum("myhost", "skynet")
  104. assert.Nil(t, err)
  105. assert.Equal(t, 0, num)
  106. })
  107. t.Run("NodeExists", func(t *testing.T) {
  108. entry := models.DNSEntry{"10.0.0.2", "newhost", "skynet"}
  109. _, err := CreateDNS(entry)
  110. assert.Nil(t, err)
  111. num, err := GetDNSEntryNum("newhost", "skynet")
  112. assert.Nil(t, err)
  113. assert.Equal(t, 1, num)
  114. })
  115. }
  116. func TestGetDNS(t *testing.T) {
  117. database.InitializeDatabase()
  118. deleteAllDNS(t)
  119. deleteAllNetworks()
  120. createNet()
  121. t.Run("NoEntries", func(t *testing.T) {
  122. dns, err := logic.GetDNS("skynet")
  123. assert.Nil(t, err)
  124. assert.Nil(t, dns)
  125. })
  126. t.Run("CustomDNSExists", func(t *testing.T) {
  127. entry := models.DNSEntry{"10.0.0.2", "newhost", "skynet"}
  128. _, err := CreateDNS(entry)
  129. assert.Nil(t, err)
  130. dns, err := logic.GetDNS("skynet")
  131. t.Log(dns)
  132. assert.Nil(t, err)
  133. assert.NotNil(t, dns)
  134. assert.Equal(t, "skynet", dns[0].Network)
  135. assert.Equal(t, 1, len(dns))
  136. })
  137. t.Run("NodeExists", func(t *testing.T) {
  138. deleteAllDNS(t)
  139. createTestNode()
  140. dns, err := logic.GetDNS("skynet")
  141. assert.Nil(t, err)
  142. assert.NotNil(t, dns)
  143. assert.Equal(t, "skynet", dns[0].Network)
  144. assert.Equal(t, 1, len(dns))
  145. })
  146. t.Run("NodeAndCustomDNS", func(t *testing.T) {
  147. entry := models.DNSEntry{"10.0.0.2", "newhost", "skynet"}
  148. _, err := CreateDNS(entry)
  149. dns, err := logic.GetDNS("skynet")
  150. t.Log(dns)
  151. assert.Nil(t, err)
  152. assert.NotNil(t, dns)
  153. assert.Equal(t, "skynet", dns[0].Network)
  154. assert.Equal(t, "skynet", dns[1].Network)
  155. assert.Equal(t, 2, len(dns))
  156. })
  157. }
  158. func TestCreateDNS(t *testing.T) {
  159. database.InitializeDatabase()
  160. deleteAllDNS(t)
  161. deleteAllNetworks()
  162. createNet()
  163. entry := models.DNSEntry{"10.0.0.2", "newhost", "skynet"}
  164. dns, err := CreateDNS(entry)
  165. assert.Nil(t, err)
  166. assert.Equal(t, "newhost", dns.Name)
  167. }
  168. func TestSetDNS(t *testing.T) {
  169. database.InitializeDatabase()
  170. deleteAllDNS(t)
  171. deleteAllNetworks()
  172. t.Run("NoNetworks", func(t *testing.T) {
  173. err := logic.SetDNS()
  174. assert.Nil(t, err)
  175. info, err := os.Stat("./config/dnsconfig/netmaker.hosts")
  176. assert.Nil(t, err)
  177. assert.False(t, info.IsDir())
  178. assert.Equal(t, int64(0), info.Size())
  179. })
  180. t.Run("NoEntries", func(t *testing.T) {
  181. createNet()
  182. err := logic.SetDNS()
  183. assert.Nil(t, err)
  184. info, err := os.Stat("./config/dnsconfig/netmaker.hosts")
  185. assert.Nil(t, err)
  186. assert.False(t, info.IsDir())
  187. assert.Equal(t, int64(0), info.Size())
  188. })
  189. t.Run("NodeExists", func(t *testing.T) {
  190. createTestNode()
  191. err := logic.SetDNS()
  192. assert.Nil(t, err)
  193. info, err := os.Stat("./config/dnsconfig/netmaker.hosts")
  194. assert.Nil(t, err)
  195. assert.False(t, info.IsDir())
  196. content, err := ioutil.ReadFile("./config/dnsconfig/netmaker.hosts")
  197. assert.Nil(t, err)
  198. assert.Contains(t, string(content), "testnode.skynet")
  199. })
  200. t.Run("EntryExists", func(t *testing.T) {
  201. entry := models.DNSEntry{"10.0.0.3", "newhost", "skynet"}
  202. CreateDNS(entry)
  203. err := logic.SetDNS()
  204. assert.Nil(t, err)
  205. info, err := os.Stat("./config/dnsconfig/netmaker.hosts")
  206. assert.Nil(t, err)
  207. assert.False(t, info.IsDir())
  208. content, err := ioutil.ReadFile("./config/dnsconfig/netmaker.hosts")
  209. assert.Nil(t, err)
  210. assert.Contains(t, string(content), "newhost.skynet")
  211. })
  212. }
  213. func TestGetDNSEntry(t *testing.T) {
  214. database.InitializeDatabase()
  215. deleteAllDNS(t)
  216. deleteAllNetworks()
  217. createNet()
  218. createTestNode()
  219. entry := models.DNSEntry{"10.0.0.2", "newhost", "skynet"}
  220. CreateDNS(entry)
  221. t.Run("wrong net", func(t *testing.T) {
  222. entry, err := GetDNSEntry("newhost", "w286 Toronto Street South, Uxbridge, ONirecat")
  223. assert.EqualError(t, err, "no result found")
  224. assert.Equal(t, models.DNSEntry{}, entry)
  225. })
  226. t.Run("wrong host", func(t *testing.T) {
  227. entry, err := GetDNSEntry("badhost", "skynet")
  228. assert.EqualError(t, err, "no result found")
  229. assert.Equal(t, models.DNSEntry{}, entry)
  230. })
  231. t.Run("good host", func(t *testing.T) {
  232. entry, err := GetDNSEntry("newhost", "skynet")
  233. assert.Nil(t, err)
  234. assert.Equal(t, "newhost", entry.Name)
  235. })
  236. t.Run("node", func(t *testing.T) {
  237. entry, err := GetDNSEntry("testnode", "skynet")
  238. assert.EqualError(t, err, "no result found")
  239. assert.Equal(t, models.DNSEntry{}, entry)
  240. })
  241. }
  242. func TestUpdateDNS(t *testing.T) {
  243. var newentry models.DNSEntry
  244. database.InitializeDatabase()
  245. deleteAllDNS(t)
  246. deleteAllNetworks()
  247. createNet()
  248. entry := models.DNSEntry{"10.0.0.2", "newhost", "skynet"}
  249. CreateDNS(entry)
  250. t.Run("change address", func(t *testing.T) {
  251. newentry.Address = "10.0.0.75"
  252. updated, err := UpdateDNS(newentry, entry)
  253. assert.Nil(t, err)
  254. assert.Equal(t, newentry.Address, updated.Address)
  255. })
  256. t.Run("change name", func(t *testing.T) {
  257. newentry.Name = "newname"
  258. updated, err := UpdateDNS(newentry, entry)
  259. assert.Nil(t, err)
  260. assert.Equal(t, newentry.Name, updated.Name)
  261. })
  262. t.Run("change network", func(t *testing.T) {
  263. newentry.Network = "wirecat"
  264. updated, err := UpdateDNS(newentry, entry)
  265. assert.Nil(t, err)
  266. assert.NotEqual(t, newentry.Network, updated.Network)
  267. })
  268. }
  269. func TestDeleteDNS(t *testing.T) {
  270. database.InitializeDatabase()
  271. deleteAllDNS(t)
  272. deleteAllNetworks()
  273. createNet()
  274. entry := models.DNSEntry{"10.0.0.2", "newhost", "skynet"}
  275. CreateDNS(entry)
  276. t.Run("EntryExists", func(t *testing.T) {
  277. err := DeleteDNS("newhost", "skynet")
  278. assert.Nil(t, err)
  279. })
  280. t.Run("NodeExists", func(t *testing.T) {
  281. err := DeleteDNS("myhost", "skynet")
  282. assert.Nil(t, err)
  283. })
  284. t.Run("NoEntries", func(t *testing.T) {
  285. err := DeleteDNS("myhost", "skynet")
  286. assert.Nil(t, err)
  287. })
  288. }
  289. func TestValidateDNSUpdate(t *testing.T) {
  290. database.InitializeDatabase()
  291. deleteAllDNS(t)
  292. deleteAllNetworks()
  293. createNet()
  294. entry := models.DNSEntry{"10.0.0.2", "myhost", "skynet"}
  295. t.Run("BadNetwork", func(t *testing.T) {
  296. change := models.DNSEntry{"10.0.0.2", "myhost", "badnet"}
  297. err := ValidateDNSUpdate(change, entry)
  298. assert.NotNil(t, err)
  299. assert.Contains(t, err.Error(), "Field validation for 'Network' failed on the 'network_exists' tag")
  300. })
  301. t.Run("EmptyNetwork", func(t *testing.T) {
  302. //this can't actually happen as change.Network is populated if is blank
  303. change := models.DNSEntry{"10.0.0.2", "myhost", ""}
  304. err := ValidateDNSUpdate(change, entry)
  305. assert.NotNil(t, err)
  306. assert.Contains(t, err.Error(), "Field validation for 'Network' failed on the 'network_exists' tag")
  307. })
  308. t.Run("EmptyAddress", func(t *testing.T) {
  309. //this can't actually happen as change.Address is populated if is blank
  310. change := models.DNSEntry{"", "myhost", "skynet"}
  311. err := ValidateDNSUpdate(change, entry)
  312. assert.NotNil(t, err)
  313. assert.Contains(t, err.Error(), "Field validation for 'Address' failed on the 'required' tag")
  314. })
  315. t.Run("BadAddress", func(t *testing.T) {
  316. change := models.DNSEntry{"10.0.256.1", "myhost", "skynet"}
  317. err := ValidateDNSUpdate(change, entry)
  318. assert.NotNil(t, err)
  319. assert.Contains(t, err.Error(), "Field validation for 'Address' failed on the 'ip' tag")
  320. })
  321. t.Run("EmptyName", func(t *testing.T) {
  322. //this can't actually happen as change.Name is populated if is blank
  323. change := models.DNSEntry{"10.0.0.2", "", "skynet"}
  324. err := ValidateDNSUpdate(change, entry)
  325. assert.NotNil(t, err)
  326. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'required' tag")
  327. })
  328. t.Run("NameTooLong", func(t *testing.T) {
  329. name := ""
  330. for i := 1; i < 194; i++ {
  331. name = name + "a"
  332. }
  333. change := models.DNSEntry{"10.0.0.2", name, "skynet"}
  334. err := ValidateDNSUpdate(change, entry)
  335. assert.NotNil(t, err)
  336. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'max' tag")
  337. })
  338. t.Run("NameUnique", func(t *testing.T) {
  339. change := models.DNSEntry{"10.0.0.2", "myhost", "wirecat"}
  340. CreateDNS(entry)
  341. CreateDNS(change)
  342. err := ValidateDNSUpdate(change, entry)
  343. assert.NotNil(t, err)
  344. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'name_unique' tag")
  345. //cleanup
  346. err = DeleteDNS("myhost", "wirecat")
  347. assert.Nil(t, err)
  348. })
  349. }
  350. func TestValidateDNSCreate(t *testing.T) {
  351. database.InitializeDatabase()
  352. _ = DeleteDNS("mynode", "skynet")
  353. t.Run("NoNetwork", func(t *testing.T) {
  354. entry := models.DNSEntry{"10.0.0.2", "myhost", "badnet"}
  355. err := ValidateDNSCreate(entry)
  356. assert.NotNil(t, err)
  357. assert.Contains(t, err.Error(), "Field validation for 'Network' failed on the 'network_exists' tag")
  358. })
  359. t.Run("EmptyAddress", func(t *testing.T) {
  360. entry := models.DNSEntry{"", "myhost", "skynet"}
  361. err := ValidateDNSCreate(entry)
  362. assert.NotNil(t, err)
  363. assert.Contains(t, err.Error(), "Field validation for 'Address' failed on the 'required' tag")
  364. })
  365. t.Run("BadAddress", func(t *testing.T) {
  366. entry := models.DNSEntry{"10.0.256.1", "myhost", "skynet"}
  367. err := ValidateDNSCreate(entry)
  368. assert.NotNil(t, err)
  369. assert.Contains(t, err.Error(), "Field validation for 'Address' failed on the 'ip' tag")
  370. })
  371. t.Run("EmptyName", func(t *testing.T) {
  372. entry := models.DNSEntry{"10.0.0.2", "", "skynet"}
  373. err := ValidateDNSCreate(entry)
  374. assert.NotNil(t, err)
  375. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'required' tag")
  376. })
  377. t.Run("NameTooLong", func(t *testing.T) {
  378. name := ""
  379. for i := 1; i < 194; i++ {
  380. name = name + "a"
  381. }
  382. entry := models.DNSEntry{"10.0.0.2", name, "skynet"}
  383. err := ValidateDNSCreate(entry)
  384. assert.NotNil(t, err)
  385. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'max' tag")
  386. })
  387. t.Run("NameUnique", func(t *testing.T) {
  388. entry := models.DNSEntry{"10.0.0.2", "myhost", "skynet"}
  389. _, _ = CreateDNS(entry)
  390. err := ValidateDNSCreate(entry)
  391. assert.NotNil(t, err)
  392. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'name_unique' tag")
  393. })
  394. }
  395. func deleteAllDNS(t *testing.T) {
  396. dns, err := GetAllDNS()
  397. assert.Nil(t, err)
  398. for _, record := range dns {
  399. err := DeleteDNS(record.Name, record.Network)
  400. assert.Nil(t, err)
  401. }
  402. }