network_test.go 11 KB

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