dns_test.go 13 KB

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