network_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. package controller
  2. import (
  3. "context"
  4. "os"
  5. "testing"
  6. "github.com/google/uuid"
  7. "github.com/gravitl/netmaker/database"
  8. "github.com/gravitl/netmaker/logger"
  9. "github.com/gravitl/netmaker/logic"
  10. "github.com/gravitl/netmaker/models"
  11. "github.com/stretchr/testify/assert"
  12. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  13. )
  14. type NetworkValidationTestCase struct {
  15. testname string
  16. network models.Network
  17. errMessage string
  18. }
  19. var netHost models.Host
  20. func TestMain(m *testing.M) {
  21. database.InitializeDatabase()
  22. defer database.CloseDB()
  23. logic.CreateAdmin(&models.User{
  24. UserName: "admin",
  25. Password: "password",
  26. IsAdmin: true,
  27. Networks: []string{},
  28. Groups: []string{},
  29. })
  30. peerUpdate := make(chan *models.Node)
  31. go logic.ManageZombies(context.Background(), peerUpdate)
  32. go func() {
  33. for update := range peerUpdate {
  34. //do nothing
  35. logger.Log(3, "received node update", update.Action)
  36. }
  37. }()
  38. }
  39. func TestCreateNetwork(t *testing.T) {
  40. deleteAllNetworks()
  41. var network models.Network
  42. network.NetID = "skynet"
  43. network.AddressRange = "10.0.0.1/24"
  44. // if tests break - check here (removed displayname)
  45. //network.DisplayName = "mynetwork"
  46. _, err := logic.CreateNetwork(network)
  47. assert.Nil(t, err)
  48. }
  49. func TestGetNetwork(t *testing.T) {
  50. createNet()
  51. t.Run("GetExistingNetwork", func(t *testing.T) {
  52. network, err := logic.GetNetwork("skynet")
  53. assert.Nil(t, err)
  54. assert.Equal(t, "skynet", network.NetID)
  55. })
  56. t.Run("GetNonExistantNetwork", func(t *testing.T) {
  57. network, err := logic.GetNetwork("doesnotexist")
  58. assert.EqualError(t, err, "no result found")
  59. assert.Equal(t, "", network.NetID)
  60. })
  61. }
  62. func TestDeleteNetwork(t *testing.T) {
  63. createNet()
  64. //create nodes
  65. t.Run("NetworkwithNodes", func(t *testing.T) {
  66. })
  67. t.Run("DeleteExistingNetwork", func(t *testing.T) {
  68. err := logic.DeleteNetwork("skynet")
  69. assert.Nil(t, err)
  70. })
  71. t.Run("NonExistantNetwork", func(t *testing.T) {
  72. err := logic.DeleteNetwork("skynet")
  73. assert.Nil(t, err)
  74. })
  75. }
  76. func TestCreateKey(t *testing.T) {
  77. createNet()
  78. keys, _ := logic.GetKeys("skynet")
  79. for _, key := range keys {
  80. logic.DeleteKey(key.Name, "skynet")
  81. }
  82. var accesskey models.AccessKey
  83. var network models.Network
  84. network.NetID = "skynet"
  85. t.Run("NameTooLong", func(t *testing.T) {
  86. network, err := logic.GetNetwork("skynet")
  87. assert.Nil(t, err)
  88. accesskey.Name = "ThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfailThisisareallylongkeynamethatwillfail"
  89. _, err = logic.CreateAccessKey(accesskey, network)
  90. assert.NotNil(t, err)
  91. assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'max' tag")
  92. })
  93. t.Run("BlankName", func(t *testing.T) {
  94. network, err := logic.GetNetwork("skynet")
  95. assert.Nil(t, err)
  96. accesskey.Name = ""
  97. key, err := logic.CreateAccessKey(accesskey, network)
  98. assert.Nil(t, err)
  99. assert.NotEqual(t, "", key.Name)
  100. })
  101. t.Run("InvalidValue", func(t *testing.T) {
  102. network, err := logic.GetNetwork("skynet")
  103. assert.Nil(t, err)
  104. accesskey.Value = "bad-value"
  105. _, err = logic.CreateAccessKey(accesskey, network)
  106. assert.NotNil(t, err)
  107. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'alphanum' tag")
  108. })
  109. t.Run("BlankValue", func(t *testing.T) {
  110. network, err := logic.GetNetwork("skynet")
  111. assert.Nil(t, err)
  112. accesskey.Name = "mykey"
  113. accesskey.Value = ""
  114. key, err := logic.CreateAccessKey(accesskey, network)
  115. assert.Nil(t, err)
  116. assert.NotEqual(t, "", key.Value)
  117. assert.Equal(t, accesskey.Name, key.Name)
  118. })
  119. t.Run("ValueTooLong", func(t *testing.T) {
  120. network, err := logic.GetNetwork("skynet")
  121. assert.Nil(t, err)
  122. accesskey.Name = "keyname"
  123. accesskey.Value = "AccessKeyValuethatistoolong"
  124. _, err = logic.CreateAccessKey(accesskey, network)
  125. assert.NotNil(t, err)
  126. assert.Contains(t, err.Error(), "Field validation for 'Value' failed on the 'max' tag")
  127. })
  128. t.Run("BlankUses", func(t *testing.T) {
  129. network, err := logic.GetNetwork("skynet")
  130. assert.Nil(t, err)
  131. accesskey.Uses = 0
  132. accesskey.Value = ""
  133. key, err := logic.CreateAccessKey(accesskey, network)
  134. assert.Nil(t, err)
  135. assert.Equal(t, 1, key.Uses)
  136. })
  137. t.Run("DuplicateKey", func(t *testing.T) {
  138. network, err := logic.GetNetwork("skynet")
  139. assert.Nil(t, err)
  140. accesskey.Name = "mykey"
  141. _, err = logic.CreateAccessKey(accesskey, network)
  142. assert.NotNil(t, err)
  143. assert.EqualError(t, err, "duplicate AccessKey Name")
  144. })
  145. }
  146. func TestGetKeys(t *testing.T) {
  147. deleteAllNetworks()
  148. createNet()
  149. network, err := logic.GetNetwork("skynet")
  150. assert.Nil(t, err)
  151. var key models.AccessKey
  152. key.Name = "mykey"
  153. _, err = logic.CreateAccessKey(key, network)
  154. assert.Nil(t, err)
  155. t.Run("KeyExists", func(t *testing.T) {
  156. keys, err := logic.GetKeys(network.NetID)
  157. assert.Nil(t, err)
  158. assert.NotEqual(t, models.AccessKey{}, keys)
  159. })
  160. t.Run("NonExistantKey", func(t *testing.T) {
  161. err := logic.DeleteKey("mykey", "skynet")
  162. assert.Nil(t, err)
  163. keys, err := logic.GetKeys(network.NetID)
  164. assert.Nil(t, err)
  165. assert.Equal(t, []models.AccessKey(nil), keys)
  166. })
  167. }
  168. func TestDeleteKey(t *testing.T) {
  169. createNet()
  170. network, err := logic.GetNetwork("skynet")
  171. assert.Nil(t, err)
  172. var key models.AccessKey
  173. key.Name = "mykey"
  174. _, err = logic.CreateAccessKey(key, network)
  175. assert.Nil(t, err)
  176. t.Run("ExistingKey", func(t *testing.T) {
  177. err := logic.DeleteKey("mykey", "skynet")
  178. assert.Nil(t, err)
  179. })
  180. t.Run("NonExistantKey", func(t *testing.T) {
  181. err := logic.DeleteKey("mykey", "skynet")
  182. assert.NotNil(t, err)
  183. assert.Equal(t, "key mykey does not exist", err.Error())
  184. })
  185. }
  186. func TestSecurityCheck(t *testing.T) {
  187. //these seem to work but not sure it the tests are really testing the functionality
  188. os.Setenv("MASTER_KEY", "secretkey")
  189. t.Run("NoNetwork", func(t *testing.T) {
  190. networks, username, err := logic.UserPermissions(false, "", "Bearer secretkey")
  191. assert.Nil(t, err)
  192. t.Log(networks, username)
  193. })
  194. t.Run("WithNetwork", func(t *testing.T) {
  195. networks, username, err := logic.UserPermissions(false, "skynet", "Bearer secretkey")
  196. assert.Nil(t, err)
  197. t.Log(networks, username)
  198. })
  199. t.Run("BadNet", func(t *testing.T) {
  200. t.Skip()
  201. networks, username, err := logic.UserPermissions(false, "badnet", "Bearer secretkey")
  202. assert.NotNil(t, err)
  203. t.Log(err)
  204. t.Log(networks, username)
  205. })
  206. t.Run("BadToken", func(t *testing.T) {
  207. networks, username, err := logic.UserPermissions(false, "skynet", "Bearer badkey")
  208. assert.NotNil(t, err)
  209. t.Log(err)
  210. t.Log(networks, username)
  211. })
  212. }
  213. func TestValidateNetwork(t *testing.T) {
  214. //t.Skip()
  215. //This functions is not called by anyone
  216. //it panics as validation function 'display_name_valid' is not defined
  217. //yes := true
  218. //no := false
  219. //deleteNet(t)
  220. //DeleteNetworks
  221. cases := []NetworkValidationTestCase{
  222. {
  223. testname: "InvalidAddress",
  224. network: models.Network{
  225. NetID: "skynet",
  226. AddressRange: "10.0.0.256",
  227. },
  228. errMessage: "Field validation for 'AddressRange' failed on the 'cidrv4' tag",
  229. },
  230. {
  231. testname: "InvalidAddress6",
  232. network: models.Network{
  233. NetID: "skynet1",
  234. AddressRange6: "2607::ffff/130",
  235. },
  236. errMessage: "Field validation for 'AddressRange6' failed on the 'cidrv6' tag",
  237. },
  238. {
  239. testname: "InvalidNetID",
  240. network: models.Network{
  241. NetID: "with spaces",
  242. },
  243. errMessage: "Field validation for 'NetID' failed on the 'netid_valid' tag",
  244. },
  245. {
  246. testname: "NetIDTooLong",
  247. network: models.Network{
  248. NetID: "LongNetIDName",
  249. },
  250. errMessage: "Field validation for 'NetID' failed on the 'max' tag",
  251. },
  252. {
  253. testname: "ListenPortTooLow",
  254. network: models.Network{
  255. NetID: "skynet",
  256. DefaultListenPort: 1023,
  257. },
  258. errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
  259. },
  260. {
  261. testname: "ListenPortTooHigh",
  262. network: models.Network{
  263. NetID: "skynet",
  264. DefaultListenPort: 65536,
  265. },
  266. errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
  267. },
  268. {
  269. testname: "KeepAliveTooBig",
  270. network: models.Network{
  271. NetID: "skynet",
  272. DefaultKeepalive: 1010,
  273. },
  274. errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
  275. },
  276. }
  277. for _, tc := range cases {
  278. t.Run(tc.testname, func(t *testing.T) {
  279. t.Log(tc.testname)
  280. network := models.Network(tc.network)
  281. network.SetDefaults()
  282. err := logic.ValidateNetwork(&network, false)
  283. assert.NotNil(t, err)
  284. assert.Contains(t, err.Error(), tc.errMessage) // test passes if err.Error() contains the expected errMessage.
  285. })
  286. }
  287. }
  288. func TestIpv6Network(t *testing.T) {
  289. //these seem to work but not sure it the tests are really testing the functionality
  290. os.Setenv("MASTER_KEY", "secretkey")
  291. deleteAllNetworks()
  292. createNet()
  293. createNetDualStack()
  294. network, err := logic.GetNetwork("skynet6")
  295. t.Run("Test Network Create IPv6", func(t *testing.T) {
  296. assert.Nil(t, err)
  297. assert.Equal(t, network.AddressRange6, "fde6:be04:fa5e:d076::/64")
  298. })
  299. node1 := createNodeWithParams("skynet6", "")
  300. createNetHost()
  301. nodeErr := logic.AssociateNodeToHost(node1, &netHost)
  302. t.Run("Test node on network IPv6", func(t *testing.T) {
  303. assert.Nil(t, nodeErr)
  304. assert.Equal(t, "fde6:be04:fa5e:d076::1", node1.Address6.IP.String())
  305. })
  306. }
  307. func deleteAllNetworks() {
  308. deleteAllNodes()
  309. nets, _ := logic.GetNetworks()
  310. for _, net := range nets {
  311. logic.DeleteNetwork(net.NetID)
  312. }
  313. }
  314. func createNet() {
  315. var network models.Network
  316. network.NetID = "skynet"
  317. network.AddressRange = "10.0.0.1/24"
  318. _, err := logic.GetNetwork("skynet")
  319. if err != nil {
  320. logic.CreateNetwork(network)
  321. }
  322. }
  323. func createNetDualStack() {
  324. var network models.Network
  325. network.NetID = "skynet6"
  326. network.AddressRange = "10.1.2.0/24"
  327. network.AddressRange6 = "fde6:be04:fa5e:d076::/64"
  328. network.IsIPv4 = "yes"
  329. network.IsIPv6 = "yes"
  330. _, err := logic.GetNetwork("skynet6")
  331. if err != nil {
  332. logic.CreateNetwork(network)
  333. }
  334. }
  335. func createNetHost() {
  336. k, _ := wgtypes.ParseKey("DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=")
  337. netHost = models.Host{
  338. ID: uuid.New(),
  339. PublicKey: k.PublicKey(),
  340. HostPass: "password",
  341. OS: "linux",
  342. Name: "nethost",
  343. }
  344. _ = logic.CreateHost(&netHost)
  345. }