test_models.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. from netaddr import IPNetwork, IPSet
  2. from django.core.exceptions import ValidationError
  3. from django.test import TestCase, override_settings
  4. from ipam.choices import IPAddressRoleChoices, PrefixStatusChoices
  5. from ipam.models import Aggregate, IPAddress, Prefix, RIR, VLAN, VLANGroup, VRF
  6. class TestAggregate(TestCase):
  7. def test_get_utilization(self):
  8. rir = RIR.objects.create(name='RIR 1', slug='rir-1')
  9. aggregate = Aggregate(prefix=IPNetwork('10.0.0.0/8'), rir=rir)
  10. aggregate.save()
  11. # 25% utilization
  12. Prefix.objects.bulk_create((
  13. Prefix(prefix=IPNetwork('10.0.0.0/12')),
  14. Prefix(prefix=IPNetwork('10.16.0.0/12')),
  15. Prefix(prefix=IPNetwork('10.32.0.0/12')),
  16. Prefix(prefix=IPNetwork('10.48.0.0/12')),
  17. ))
  18. self.assertEqual(aggregate.get_utilization(), 25)
  19. # 50% utilization
  20. Prefix.objects.bulk_create((
  21. Prefix(prefix=IPNetwork('10.64.0.0/10')),
  22. ))
  23. self.assertEqual(aggregate.get_utilization(), 50)
  24. # 100% utilization
  25. Prefix.objects.bulk_create((
  26. Prefix(prefix=IPNetwork('10.128.0.0/9')),
  27. ))
  28. self.assertEqual(aggregate.get_utilization(), 100)
  29. class TestPrefix(TestCase):
  30. def test_get_duplicates(self):
  31. prefixes = Prefix.objects.bulk_create((
  32. Prefix(prefix=IPNetwork('192.0.2.0/24')),
  33. Prefix(prefix=IPNetwork('192.0.2.0/24')),
  34. Prefix(prefix=IPNetwork('192.0.2.0/24')),
  35. ))
  36. duplicate_prefix_pks = [p.pk for p in prefixes[0].get_duplicates()]
  37. self.assertSetEqual(set(duplicate_prefix_pks), {prefixes[1].pk, prefixes[2].pk})
  38. def test_get_child_prefixes(self):
  39. vrfs = VRF.objects.bulk_create((
  40. VRF(name='VRF 1'),
  41. VRF(name='VRF 2'),
  42. VRF(name='VRF 3'),
  43. ))
  44. prefixes = Prefix.objects.bulk_create((
  45. Prefix(prefix=IPNetwork('10.0.0.0/16'), status=PrefixStatusChoices.STATUS_CONTAINER),
  46. Prefix(prefix=IPNetwork('10.0.0.0/24'), vrf=None),
  47. Prefix(prefix=IPNetwork('10.0.1.0/24'), vrf=vrfs[0]),
  48. Prefix(prefix=IPNetwork('10.0.2.0/24'), vrf=vrfs[1]),
  49. Prefix(prefix=IPNetwork('10.0.3.0/24'), vrf=vrfs[2]),
  50. ))
  51. child_prefix_pks = {p.pk for p in prefixes[0].get_child_prefixes()}
  52. # Global container should return all children
  53. self.assertSetEqual(child_prefix_pks, {prefixes[1].pk, prefixes[2].pk, prefixes[3].pk, prefixes[4].pk})
  54. prefixes[0].vrf = vrfs[0]
  55. prefixes[0].save()
  56. child_prefix_pks = {p.pk for p in prefixes[0].get_child_prefixes()}
  57. # VRF container is limited to its own VRF
  58. self.assertSetEqual(child_prefix_pks, {prefixes[2].pk})
  59. def test_get_child_ips(self):
  60. vrfs = VRF.objects.bulk_create((
  61. VRF(name='VRF 1'),
  62. VRF(name='VRF 2'),
  63. VRF(name='VRF 3'),
  64. ))
  65. parent_prefix = Prefix.objects.create(
  66. prefix=IPNetwork('10.0.0.0/16'), status=PrefixStatusChoices.STATUS_CONTAINER
  67. )
  68. ips = IPAddress.objects.bulk_create((
  69. IPAddress(address=IPNetwork('10.0.0.1/24'), vrf=None),
  70. IPAddress(address=IPNetwork('10.0.1.1/24'), vrf=vrfs[0]),
  71. IPAddress(address=IPNetwork('10.0.2.1/24'), vrf=vrfs[1]),
  72. IPAddress(address=IPNetwork('10.0.3.1/24'), vrf=vrfs[2]),
  73. ))
  74. child_ip_pks = {p.pk for p in parent_prefix.get_child_ips()}
  75. # Global container should return all children
  76. self.assertSetEqual(child_ip_pks, {ips[0].pk, ips[1].pk, ips[2].pk, ips[3].pk})
  77. parent_prefix.vrf = vrfs[0]
  78. parent_prefix.save()
  79. child_ip_pks = {p.pk for p in parent_prefix.get_child_ips()}
  80. # VRF container is limited to its own VRF
  81. self.assertSetEqual(child_ip_pks, {ips[1].pk})
  82. def test_get_available_prefixes(self):
  83. prefixes = Prefix.objects.bulk_create((
  84. Prefix(prefix=IPNetwork('10.0.0.0/16')), # Parent prefix
  85. Prefix(prefix=IPNetwork('10.0.0.0/20')),
  86. Prefix(prefix=IPNetwork('10.0.32.0/20')),
  87. Prefix(prefix=IPNetwork('10.0.128.0/18')),
  88. ))
  89. missing_prefixes = IPSet([
  90. IPNetwork('10.0.16.0/20'),
  91. IPNetwork('10.0.48.0/20'),
  92. IPNetwork('10.0.64.0/18'),
  93. IPNetwork('10.0.192.0/18'),
  94. ])
  95. available_prefixes = prefixes[0].get_available_prefixes()
  96. self.assertEqual(available_prefixes, missing_prefixes)
  97. def test_get_available_ips(self):
  98. parent_prefix = Prefix.objects.create(prefix=IPNetwork('10.0.0.0/28'))
  99. IPAddress.objects.bulk_create((
  100. IPAddress(address=IPNetwork('10.0.0.1/26')),
  101. IPAddress(address=IPNetwork('10.0.0.3/26')),
  102. IPAddress(address=IPNetwork('10.0.0.5/26')),
  103. IPAddress(address=IPNetwork('10.0.0.7/26')),
  104. IPAddress(address=IPNetwork('10.0.0.9/26')),
  105. IPAddress(address=IPNetwork('10.0.0.11/26')),
  106. IPAddress(address=IPNetwork('10.0.0.13/26')),
  107. ))
  108. missing_ips = IPSet([
  109. '10.0.0.2/32',
  110. '10.0.0.4/32',
  111. '10.0.0.6/32',
  112. '10.0.0.8/32',
  113. '10.0.0.10/32',
  114. '10.0.0.12/32',
  115. '10.0.0.14/32',
  116. ])
  117. available_ips = parent_prefix.get_available_ips()
  118. self.assertEqual(available_ips, missing_ips)
  119. def test_get_first_available_prefix(self):
  120. prefixes = Prefix.objects.bulk_create((
  121. Prefix(prefix=IPNetwork('10.0.0.0/16')), # Parent prefix
  122. Prefix(prefix=IPNetwork('10.0.0.0/24')),
  123. Prefix(prefix=IPNetwork('10.0.1.0/24')),
  124. Prefix(prefix=IPNetwork('10.0.2.0/24')),
  125. ))
  126. self.assertEqual(prefixes[0].get_first_available_prefix(), IPNetwork('10.0.3.0/24'))
  127. Prefix.objects.create(prefix=IPNetwork('10.0.3.0/24'))
  128. self.assertEqual(prefixes[0].get_first_available_prefix(), IPNetwork('10.0.4.0/22'))
  129. def test_get_first_available_ip(self):
  130. parent_prefix = Prefix.objects.create(prefix=IPNetwork('10.0.0.0/24'))
  131. IPAddress.objects.bulk_create((
  132. IPAddress(address=IPNetwork('10.0.0.1/24')),
  133. IPAddress(address=IPNetwork('10.0.0.2/24')),
  134. IPAddress(address=IPNetwork('10.0.0.3/24')),
  135. ))
  136. self.assertEqual(parent_prefix.get_first_available_ip(), '10.0.0.4/24')
  137. IPAddress.objects.create(address=IPNetwork('10.0.0.4/24'))
  138. self.assertEqual(parent_prefix.get_first_available_ip(), '10.0.0.5/24')
  139. def test_get_utilization(self):
  140. # Container Prefix
  141. prefix = Prefix.objects.create(
  142. prefix=IPNetwork('10.0.0.0/24'),
  143. status=PrefixStatusChoices.STATUS_CONTAINER
  144. )
  145. Prefix.objects.bulk_create((
  146. Prefix(prefix=IPNetwork('10.0.0.0/26')),
  147. Prefix(prefix=IPNetwork('10.0.0.128/26')),
  148. ))
  149. self.assertEqual(prefix.get_utilization(), 50)
  150. # Non-container Prefix
  151. prefix.status = PrefixStatusChoices.STATUS_ACTIVE
  152. prefix.save()
  153. IPAddress.objects.bulk_create(
  154. # Create 32 IPAddresses within the Prefix
  155. [IPAddress(address=IPNetwork('10.0.0.{}/24'.format(i))) for i in range(1, 33)]
  156. )
  157. self.assertEqual(prefix.get_utilization(), 12) # ~= 12%
  158. #
  159. # Uniqueness enforcement tests
  160. #
  161. @override_settings(ENFORCE_GLOBAL_UNIQUE=False)
  162. def test_duplicate_global(self):
  163. Prefix.objects.create(prefix=IPNetwork('192.0.2.0/24'))
  164. duplicate_prefix = Prefix(prefix=IPNetwork('192.0.2.0/24'))
  165. self.assertIsNone(duplicate_prefix.clean())
  166. @override_settings(ENFORCE_GLOBAL_UNIQUE=True)
  167. def test_duplicate_global_unique(self):
  168. Prefix.objects.create(prefix=IPNetwork('192.0.2.0/24'))
  169. duplicate_prefix = Prefix(prefix=IPNetwork('192.0.2.0/24'))
  170. self.assertRaises(ValidationError, duplicate_prefix.clean)
  171. def test_duplicate_vrf(self):
  172. vrf = VRF.objects.create(name='Test', rd='1:1', enforce_unique=False)
  173. Prefix.objects.create(vrf=vrf, prefix=IPNetwork('192.0.2.0/24'))
  174. duplicate_prefix = Prefix(vrf=vrf, prefix=IPNetwork('192.0.2.0/24'))
  175. self.assertIsNone(duplicate_prefix.clean())
  176. def test_duplicate_vrf_unique(self):
  177. vrf = VRF.objects.create(name='Test', rd='1:1', enforce_unique=True)
  178. Prefix.objects.create(vrf=vrf, prefix=IPNetwork('192.0.2.0/24'))
  179. duplicate_prefix = Prefix(vrf=vrf, prefix=IPNetwork('192.0.2.0/24'))
  180. self.assertRaises(ValidationError, duplicate_prefix.clean)
  181. class TestPrefixHierarchy(TestCase):
  182. """
  183. Test the automatic updating of depth and child count in response to changes made within
  184. the prefix hierarchy.
  185. """
  186. @classmethod
  187. def setUpTestData(cls):
  188. prefixes = (
  189. # IPv4
  190. Prefix(prefix='10.0.0.0/8', _depth=0, _children=2),
  191. Prefix(prefix='10.0.0.0/16', _depth=1, _children=1),
  192. Prefix(prefix='10.0.0.0/24', _depth=2, _children=0),
  193. # IPv6
  194. Prefix(prefix='2001:db8::/32', _depth=0, _children=2),
  195. Prefix(prefix='2001:db8::/40', _depth=1, _children=1),
  196. Prefix(prefix='2001:db8::/48', _depth=2, _children=0),
  197. )
  198. Prefix.objects.bulk_create(prefixes)
  199. def test_create_prefix4(self):
  200. # Create 10.0.0.0/12
  201. Prefix(prefix='10.0.0.0/12').save()
  202. prefixes = Prefix.objects.filter(prefix__family=4)
  203. self.assertEqual(prefixes[0].prefix, IPNetwork('10.0.0.0/8'))
  204. self.assertEqual(prefixes[0]._depth, 0)
  205. self.assertEqual(prefixes[0]._children, 3)
  206. self.assertEqual(prefixes[1].prefix, IPNetwork('10.0.0.0/12'))
  207. self.assertEqual(prefixes[1]._depth, 1)
  208. self.assertEqual(prefixes[1]._children, 2)
  209. self.assertEqual(prefixes[2].prefix, IPNetwork('10.0.0.0/16'))
  210. self.assertEqual(prefixes[2]._depth, 2)
  211. self.assertEqual(prefixes[2]._children, 1)
  212. self.assertEqual(prefixes[3].prefix, IPNetwork('10.0.0.0/24'))
  213. self.assertEqual(prefixes[3]._depth, 3)
  214. self.assertEqual(prefixes[3]._children, 0)
  215. def test_create_prefix6(self):
  216. # Create 2001:db8::/36
  217. Prefix(prefix='2001:db8::/36').save()
  218. prefixes = Prefix.objects.filter(prefix__family=6)
  219. self.assertEqual(prefixes[0].prefix, IPNetwork('2001:db8::/32'))
  220. self.assertEqual(prefixes[0]._depth, 0)
  221. self.assertEqual(prefixes[0]._children, 3)
  222. self.assertEqual(prefixes[1].prefix, IPNetwork('2001:db8::/36'))
  223. self.assertEqual(prefixes[1]._depth, 1)
  224. self.assertEqual(prefixes[1]._children, 2)
  225. self.assertEqual(prefixes[2].prefix, IPNetwork('2001:db8::/40'))
  226. self.assertEqual(prefixes[2]._depth, 2)
  227. self.assertEqual(prefixes[2]._children, 1)
  228. self.assertEqual(prefixes[3].prefix, IPNetwork('2001:db8::/48'))
  229. self.assertEqual(prefixes[3]._depth, 3)
  230. self.assertEqual(prefixes[3]._children, 0)
  231. def test_update_prefix4(self):
  232. # Change 10.0.0.0/24 to 10.0.0.0/12
  233. p = Prefix.objects.get(prefix='10.0.0.0/24')
  234. p.prefix = '10.0.0.0/12'
  235. p.save()
  236. prefixes = Prefix.objects.filter(prefix__family=4)
  237. self.assertEqual(prefixes[0].prefix, IPNetwork('10.0.0.0/8'))
  238. self.assertEqual(prefixes[0]._depth, 0)
  239. self.assertEqual(prefixes[0]._children, 2)
  240. self.assertEqual(prefixes[1].prefix, IPNetwork('10.0.0.0/12'))
  241. self.assertEqual(prefixes[1]._depth, 1)
  242. self.assertEqual(prefixes[1]._children, 1)
  243. self.assertEqual(prefixes[2].prefix, IPNetwork('10.0.0.0/16'))
  244. self.assertEqual(prefixes[2]._depth, 2)
  245. self.assertEqual(prefixes[2]._children, 0)
  246. def test_update_prefix6(self):
  247. # Change 2001:db8::/48 to 2001:db8::/36
  248. p = Prefix.objects.get(prefix='2001:db8::/48')
  249. p.prefix = '2001:db8::/36'
  250. p.save()
  251. prefixes = Prefix.objects.filter(prefix__family=6)
  252. self.assertEqual(prefixes[0].prefix, IPNetwork('2001:db8::/32'))
  253. self.assertEqual(prefixes[0]._depth, 0)
  254. self.assertEqual(prefixes[0]._children, 2)
  255. self.assertEqual(prefixes[1].prefix, IPNetwork('2001:db8::/36'))
  256. self.assertEqual(prefixes[1]._depth, 1)
  257. self.assertEqual(prefixes[1]._children, 1)
  258. self.assertEqual(prefixes[2].prefix, IPNetwork('2001:db8::/40'))
  259. self.assertEqual(prefixes[2]._depth, 2)
  260. self.assertEqual(prefixes[2]._children, 0)
  261. def test_update_prefix_vrf4(self):
  262. vrf = VRF(name='VRF A')
  263. vrf.save()
  264. # Move 10.0.0.0/16 to a VRF
  265. p = Prefix.objects.get(prefix='10.0.0.0/16')
  266. p.vrf = vrf
  267. p.save()
  268. prefixes = Prefix.objects.filter(vrf__isnull=True, prefix__family=4)
  269. self.assertEqual(prefixes[0].prefix, IPNetwork('10.0.0.0/8'))
  270. self.assertEqual(prefixes[0]._depth, 0)
  271. self.assertEqual(prefixes[0]._children, 1)
  272. self.assertEqual(prefixes[1].prefix, IPNetwork('10.0.0.0/24'))
  273. self.assertEqual(prefixes[1]._depth, 1)
  274. self.assertEqual(prefixes[1]._children, 0)
  275. prefixes = Prefix.objects.filter(vrf=vrf)
  276. self.assertEqual(prefixes[0].prefix, IPNetwork('10.0.0.0/16'))
  277. self.assertEqual(prefixes[0]._depth, 0)
  278. self.assertEqual(prefixes[0]._children, 0)
  279. def test_update_prefix_vrf6(self):
  280. vrf = VRF(name='VRF A')
  281. vrf.save()
  282. # Move 2001:db8::/40 to a VRF
  283. p = Prefix.objects.get(prefix='2001:db8::/40')
  284. p.vrf = vrf
  285. p.save()
  286. prefixes = Prefix.objects.filter(vrf__isnull=True, prefix__family=6)
  287. self.assertEqual(prefixes[0].prefix, IPNetwork('2001:db8::/32'))
  288. self.assertEqual(prefixes[0]._depth, 0)
  289. self.assertEqual(prefixes[0]._children, 1)
  290. self.assertEqual(prefixes[1].prefix, IPNetwork('2001:db8::/48'))
  291. self.assertEqual(prefixes[1]._depth, 1)
  292. self.assertEqual(prefixes[1]._children, 0)
  293. prefixes = Prefix.objects.filter(vrf=vrf)
  294. self.assertEqual(prefixes[0].prefix, IPNetwork('2001:db8::/40'))
  295. self.assertEqual(prefixes[0]._depth, 0)
  296. self.assertEqual(prefixes[0]._children, 0)
  297. def test_delete_prefix4(self):
  298. # Delete 10.0.0.0/16
  299. Prefix.objects.filter(prefix='10.0.0.0/16').delete()
  300. prefixes = Prefix.objects.filter(prefix__family=4)
  301. self.assertEqual(prefixes[0].prefix, IPNetwork('10.0.0.0/8'))
  302. self.assertEqual(prefixes[0]._depth, 0)
  303. self.assertEqual(prefixes[0]._children, 1)
  304. self.assertEqual(prefixes[1].prefix, IPNetwork('10.0.0.0/24'))
  305. self.assertEqual(prefixes[1]._depth, 1)
  306. self.assertEqual(prefixes[1]._children, 0)
  307. def test_delete_prefix6(self):
  308. # Delete 2001:db8::/40
  309. Prefix.objects.filter(prefix='2001:db8::/40').delete()
  310. prefixes = Prefix.objects.filter(prefix__family=6)
  311. self.assertEqual(prefixes[0].prefix, IPNetwork('2001:db8::/32'))
  312. self.assertEqual(prefixes[0]._depth, 0)
  313. self.assertEqual(prefixes[0]._children, 1)
  314. self.assertEqual(prefixes[1].prefix, IPNetwork('2001:db8::/48'))
  315. self.assertEqual(prefixes[1]._depth, 1)
  316. self.assertEqual(prefixes[1]._children, 0)
  317. def test_duplicate_prefix4(self):
  318. # Duplicate 10.0.0.0/16
  319. Prefix(prefix='10.0.0.0/16').save()
  320. prefixes = Prefix.objects.filter(prefix__family=4)
  321. self.assertEqual(prefixes[0].prefix, IPNetwork('10.0.0.0/8'))
  322. self.assertEqual(prefixes[0]._depth, 0)
  323. self.assertEqual(prefixes[0]._children, 3)
  324. self.assertEqual(prefixes[1].prefix, IPNetwork('10.0.0.0/16'))
  325. self.assertEqual(prefixes[1]._depth, 1)
  326. self.assertEqual(prefixes[1]._children, 1)
  327. self.assertEqual(prefixes[2].prefix, IPNetwork('10.0.0.0/16'))
  328. self.assertEqual(prefixes[2]._depth, 1)
  329. self.assertEqual(prefixes[2]._children, 1)
  330. self.assertEqual(prefixes[3].prefix, IPNetwork('10.0.0.0/24'))
  331. self.assertEqual(prefixes[3]._depth, 2)
  332. self.assertEqual(prefixes[3]._children, 0)
  333. def test_duplicate_prefix6(self):
  334. # Duplicate 2001:db8::/40
  335. Prefix(prefix='2001:db8::/40').save()
  336. prefixes = Prefix.objects.filter(prefix__family=6)
  337. self.assertEqual(prefixes[0].prefix, IPNetwork('2001:db8::/32'))
  338. self.assertEqual(prefixes[0]._depth, 0)
  339. self.assertEqual(prefixes[0]._children, 3)
  340. self.assertEqual(prefixes[1].prefix, IPNetwork('2001:db8::/40'))
  341. self.assertEqual(prefixes[1]._depth, 1)
  342. self.assertEqual(prefixes[1]._children, 1)
  343. self.assertEqual(prefixes[2].prefix, IPNetwork('2001:db8::/40'))
  344. self.assertEqual(prefixes[2]._depth, 1)
  345. self.assertEqual(prefixes[2]._children, 1)
  346. self.assertEqual(prefixes[3].prefix, IPNetwork('2001:db8::/48'))
  347. self.assertEqual(prefixes[3]._depth, 2)
  348. self.assertEqual(prefixes[3]._children, 0)
  349. class TestIPAddress(TestCase):
  350. def test_get_duplicates(self):
  351. ips = IPAddress.objects.bulk_create((
  352. IPAddress(address=IPNetwork('192.0.2.1/24')),
  353. IPAddress(address=IPNetwork('192.0.2.1/24')),
  354. IPAddress(address=IPNetwork('192.0.2.1/24')),
  355. ))
  356. duplicate_ip_pks = [p.pk for p in ips[0].get_duplicates()]
  357. self.assertSetEqual(set(duplicate_ip_pks), {ips[1].pk, ips[2].pk})
  358. #
  359. # Uniqueness enforcement tests
  360. #
  361. @override_settings(ENFORCE_GLOBAL_UNIQUE=False)
  362. def test_duplicate_global(self):
  363. IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'))
  364. duplicate_ip = IPAddress(address=IPNetwork('192.0.2.1/24'))
  365. self.assertIsNone(duplicate_ip.clean())
  366. @override_settings(ENFORCE_GLOBAL_UNIQUE=True)
  367. def test_duplicate_global_unique(self):
  368. IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'))
  369. duplicate_ip = IPAddress(address=IPNetwork('192.0.2.1/24'))
  370. self.assertRaises(ValidationError, duplicate_ip.clean)
  371. def test_duplicate_vrf(self):
  372. vrf = VRF.objects.create(name='Test', rd='1:1', enforce_unique=False)
  373. IPAddress.objects.create(vrf=vrf, address=IPNetwork('192.0.2.1/24'))
  374. duplicate_ip = IPAddress(vrf=vrf, address=IPNetwork('192.0.2.1/24'))
  375. self.assertIsNone(duplicate_ip.clean())
  376. def test_duplicate_vrf_unique(self):
  377. vrf = VRF.objects.create(name='Test', rd='1:1', enforce_unique=True)
  378. IPAddress.objects.create(vrf=vrf, address=IPNetwork('192.0.2.1/24'))
  379. duplicate_ip = IPAddress(vrf=vrf, address=IPNetwork('192.0.2.1/24'))
  380. self.assertRaises(ValidationError, duplicate_ip.clean)
  381. @override_settings(ENFORCE_GLOBAL_UNIQUE=True)
  382. def test_duplicate_nonunique_nonrole_role(self):
  383. IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'))
  384. duplicate_ip = IPAddress(address=IPNetwork('192.0.2.1/24'), role=IPAddressRoleChoices.ROLE_VIP)
  385. self.assertRaises(ValidationError, duplicate_ip.clean)
  386. @override_settings(ENFORCE_GLOBAL_UNIQUE=True)
  387. def test_duplicate_nonunique_role_nonrole(self):
  388. IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), role=IPAddressRoleChoices.ROLE_VIP)
  389. duplicate_ip = IPAddress(address=IPNetwork('192.0.2.1/24'))
  390. self.assertRaises(ValidationError, duplicate_ip.clean)
  391. @override_settings(ENFORCE_GLOBAL_UNIQUE=True)
  392. def test_duplicate_nonunique_role(self):
  393. IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), role=IPAddressRoleChoices.ROLE_VIP)
  394. IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), role=IPAddressRoleChoices.ROLE_VIP)
  395. class TestVLANGroup(TestCase):
  396. def test_get_next_available_vid(self):
  397. vlangroup = VLANGroup.objects.create(name='VLAN Group 1', slug='vlan-group-1')
  398. VLAN.objects.bulk_create((
  399. VLAN(name='VLAN 1', vid=1, group=vlangroup),
  400. VLAN(name='VLAN 2', vid=2, group=vlangroup),
  401. VLAN(name='VLAN 3', vid=3, group=vlangroup),
  402. VLAN(name='VLAN 5', vid=5, group=vlangroup),
  403. ))
  404. self.assertEqual(vlangroup.get_next_available_vid(), 4)
  405. VLAN.objects.bulk_create((
  406. VLAN(name='VLAN 4', vid=4, group=vlangroup),
  407. ))
  408. self.assertEqual(vlangroup.get_next_available_vid(), 6)