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