dns_test.go 14 KB

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