dns_test.go 13 KB

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