test_views.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. import datetime
  2. from netaddr import IPNetwork
  3. from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
  4. from ipam.choices import *
  5. from ipam.models import *
  6. from tenancy.models import Tenant
  7. from utilities.testing import ViewTestCases, create_tags
  8. class ASNTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  9. model = ASN
  10. @classmethod
  11. def setUpTestData(cls):
  12. rirs = [
  13. RIR.objects.create(name='RFC 6996', slug='rfc-6996', description='Private Use', is_private=True),
  14. RIR.objects.create(name='RFC 7300', slug='rfc-7300', description='IANA Use', is_private=True),
  15. ]
  16. sites = [
  17. Site.objects.create(name='Site 1', slug='site-1'),
  18. Site.objects.create(name='Site 2', slug='site-2')
  19. ]
  20. tenants = [
  21. Tenant.objects.create(name='Tenant 1', slug='tenant-1'),
  22. Tenant.objects.create(name='Tenant 2', slug='tenant-2'),
  23. ]
  24. asns = (
  25. ASN(asn=64513, rir=rirs[0], tenant=tenants[0]),
  26. ASN(asn=65535, rir=rirs[1], tenant=tenants[1]),
  27. ASN(asn=4200000000, rir=rirs[0], tenant=tenants[0]),
  28. ASN(asn=4200002301, rir=rirs[1], tenant=tenants[1]),
  29. )
  30. ASN.objects.bulk_create(asns)
  31. asns[0].sites.set([sites[0]])
  32. asns[1].sites.set([sites[1]])
  33. asns[2].sites.set([sites[0]])
  34. asns[3].sites.set([sites[1]])
  35. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  36. cls.form_data = {
  37. 'asn': 64512,
  38. 'rir': rirs[0].pk,
  39. 'tenant': tenants[0].pk,
  40. 'site': sites[0].pk,
  41. 'description': 'A new ASN',
  42. }
  43. cls.csv_data = (
  44. "asn,rir",
  45. "64533,RFC 6996",
  46. "64523,RFC 6996",
  47. "4200000002,RFC 6996",
  48. )
  49. cls.bulk_edit_data = {
  50. 'rir': rirs[1].pk,
  51. 'description': 'Next description',
  52. }
  53. class VRFTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  54. model = VRF
  55. @classmethod
  56. def setUpTestData(cls):
  57. tenants = (
  58. Tenant(name='Tenant A', slug='tenant-a'),
  59. Tenant(name='Tenant B', slug='tenant-b'),
  60. )
  61. Tenant.objects.bulk_create(tenants)
  62. VRF.objects.bulk_create([
  63. VRF(name='VRF 1', rd='65000:1'),
  64. VRF(name='VRF 2', rd='65000:2'),
  65. VRF(name='VRF 3', rd='65000:3'),
  66. ])
  67. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  68. cls.form_data = {
  69. 'name': 'VRF X',
  70. 'rd': '65000:999',
  71. 'tenant': tenants[0].pk,
  72. 'enforce_unique': True,
  73. 'description': 'A new VRF',
  74. 'tags': [t.pk for t in tags],
  75. }
  76. cls.csv_data = (
  77. "name",
  78. "VRF 4",
  79. "VRF 5",
  80. "VRF 6",
  81. )
  82. cls.bulk_edit_data = {
  83. 'tenant': tenants[1].pk,
  84. 'enforce_unique': False,
  85. 'description': 'New description',
  86. }
  87. class RouteTargetTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  88. model = RouteTarget
  89. @classmethod
  90. def setUpTestData(cls):
  91. tenants = (
  92. Tenant(name='Tenant A', slug='tenant-a'),
  93. Tenant(name='Tenant B', slug='tenant-b'),
  94. )
  95. Tenant.objects.bulk_create(tenants)
  96. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  97. route_targets = (
  98. RouteTarget(name='65000:1001', tenant=tenants[0]),
  99. RouteTarget(name='65000:1002', tenant=tenants[1]),
  100. RouteTarget(name='65000:1003'),
  101. )
  102. RouteTarget.objects.bulk_create(route_targets)
  103. cls.form_data = {
  104. 'name': '65000:100',
  105. 'description': 'A new route target',
  106. 'tags': [t.pk for t in tags],
  107. }
  108. cls.csv_data = (
  109. "name,tenant,description",
  110. "65000:1004,Tenant A,Foo",
  111. "65000:1005,Tenant B,Bar",
  112. "65000:1006,,No tenant",
  113. )
  114. cls.bulk_edit_data = {
  115. 'tenant': tenants[1].pk,
  116. 'description': 'New description',
  117. }
  118. class RIRTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  119. model = RIR
  120. @classmethod
  121. def setUpTestData(cls):
  122. RIR.objects.bulk_create([
  123. RIR(name='RIR 1', slug='rir-1'),
  124. RIR(name='RIR 2', slug='rir-2'),
  125. RIR(name='RIR 3', slug='rir-3'),
  126. ])
  127. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  128. cls.form_data = {
  129. 'name': 'RIR X',
  130. 'slug': 'rir-x',
  131. 'is_private': True,
  132. 'description': 'A new RIR',
  133. 'tags': [t.pk for t in tags],
  134. }
  135. cls.csv_data = (
  136. "name,slug,description",
  137. "RIR 4,rir-4,Fourth RIR",
  138. "RIR 5,rir-5,Fifth RIR",
  139. "RIR 6,rir-6,Sixth RIR",
  140. )
  141. cls.bulk_edit_data = {
  142. 'description': 'New description',
  143. }
  144. class AggregateTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  145. model = Aggregate
  146. @classmethod
  147. def setUpTestData(cls):
  148. rirs = (
  149. RIR(name='RIR 1', slug='rir-1'),
  150. RIR(name='RIR 2', slug='rir-2'),
  151. )
  152. RIR.objects.bulk_create(rirs)
  153. Aggregate.objects.bulk_create([
  154. Aggregate(prefix=IPNetwork('10.1.0.0/16'), rir=rirs[0]),
  155. Aggregate(prefix=IPNetwork('10.2.0.0/16'), rir=rirs[0]),
  156. Aggregate(prefix=IPNetwork('10.3.0.0/16'), rir=rirs[0]),
  157. ])
  158. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  159. cls.form_data = {
  160. 'prefix': IPNetwork('10.99.0.0/16'),
  161. 'rir': rirs[1].pk,
  162. 'date_added': datetime.date(2020, 1, 1),
  163. 'description': 'A new aggregate',
  164. 'tags': [t.pk for t in tags],
  165. }
  166. cls.csv_data = (
  167. "prefix,rir",
  168. "10.4.0.0/16,RIR 1",
  169. "10.5.0.0/16,RIR 1",
  170. "10.6.0.0/16,RIR 1",
  171. )
  172. cls.bulk_edit_data = {
  173. 'rir': rirs[1].pk,
  174. 'date_added': datetime.date(2020, 1, 1),
  175. 'description': 'New description',
  176. }
  177. class RoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  178. model = Role
  179. @classmethod
  180. def setUpTestData(cls):
  181. Role.objects.bulk_create([
  182. Role(name='Role 1', slug='role-1'),
  183. Role(name='Role 2', slug='role-2'),
  184. Role(name='Role 3', slug='role-3'),
  185. ])
  186. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  187. cls.form_data = {
  188. 'name': 'Role X',
  189. 'slug': 'role-x',
  190. 'weight': 200,
  191. 'description': 'A new role',
  192. 'tags': [t.pk for t in tags],
  193. }
  194. cls.csv_data = (
  195. "name,slug,weight",
  196. "Role 4,role-4,1000",
  197. "Role 5,role-5,1000",
  198. "Role 6,role-6,1000",
  199. )
  200. cls.bulk_edit_data = {
  201. 'description': 'New description',
  202. }
  203. class PrefixTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  204. model = Prefix
  205. @classmethod
  206. def setUpTestData(cls):
  207. sites = (
  208. Site(name='Site 1', slug='site-1'),
  209. Site(name='Site 2', slug='site-2'),
  210. )
  211. Site.objects.bulk_create(sites)
  212. vrfs = (
  213. VRF(name='VRF 1', rd='65000:1'),
  214. VRF(name='VRF 2', rd='65000:2'),
  215. )
  216. VRF.objects.bulk_create(vrfs)
  217. roles = (
  218. Role(name='Role 1', slug='role-1'),
  219. Role(name='Role 2', slug='role-2'),
  220. )
  221. Role.objects.bulk_create(roles)
  222. Prefix.objects.bulk_create([
  223. Prefix(prefix=IPNetwork('10.1.0.0/16'), vrf=vrfs[0], site=sites[0], role=roles[0]),
  224. Prefix(prefix=IPNetwork('10.2.0.0/16'), vrf=vrfs[0], site=sites[0], role=roles[0]),
  225. Prefix(prefix=IPNetwork('10.3.0.0/16'), vrf=vrfs[0], site=sites[0], role=roles[0]),
  226. ])
  227. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  228. cls.form_data = {
  229. 'prefix': IPNetwork('192.0.2.0/24'),
  230. 'site': sites[1].pk,
  231. 'vrf': vrfs[1].pk,
  232. 'tenant': None,
  233. 'vlan': None,
  234. 'status': PrefixStatusChoices.STATUS_RESERVED,
  235. 'role': roles[1].pk,
  236. 'is_pool': True,
  237. 'description': 'A new prefix',
  238. 'tags': [t.pk for t in tags],
  239. }
  240. cls.csv_data = (
  241. "vrf,prefix,status",
  242. "VRF 1,10.4.0.0/16,active",
  243. "VRF 1,10.5.0.0/16,active",
  244. "VRF 1,10.6.0.0/16,active",
  245. )
  246. cls.bulk_edit_data = {
  247. 'site': sites[1].pk,
  248. 'vrf': vrfs[1].pk,
  249. 'tenant': None,
  250. 'status': PrefixStatusChoices.STATUS_RESERVED,
  251. 'role': roles[1].pk,
  252. 'is_pool': False,
  253. 'description': 'New description',
  254. }
  255. class IPRangeTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  256. model = IPRange
  257. @classmethod
  258. def setUpTestData(cls):
  259. vrfs = (
  260. VRF(name='VRF 1', rd='65000:1'),
  261. VRF(name='VRF 2', rd='65000:2'),
  262. )
  263. VRF.objects.bulk_create(vrfs)
  264. roles = (
  265. Role(name='Role 1', slug='role-1'),
  266. Role(name='Role 2', slug='role-2'),
  267. )
  268. Role.objects.bulk_create(roles)
  269. ip_ranges = (
  270. IPRange(start_address='192.168.0.10/24', end_address='192.168.0.100/24', size=91),
  271. IPRange(start_address='192.168.1.10/24', end_address='192.168.1.100/24', size=91),
  272. IPRange(start_address='192.168.2.10/24', end_address='192.168.2.100/24', size=91),
  273. IPRange(start_address='192.168.3.10/24', end_address='192.168.3.100/24', size=91),
  274. IPRange(start_address='192.168.4.10/24', end_address='192.168.4.100/24', size=91),
  275. )
  276. IPRange.objects.bulk_create(ip_ranges)
  277. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  278. cls.form_data = {
  279. 'start_address': IPNetwork('192.0.5.10/24'),
  280. 'end_address': IPNetwork('192.0.5.100/24'),
  281. 'vrf': vrfs[1].pk,
  282. 'tenant': None,
  283. 'vlan': None,
  284. 'status': IPRangeStatusChoices.STATUS_RESERVED,
  285. 'role': roles[1].pk,
  286. 'is_pool': True,
  287. 'description': 'A new IP range',
  288. 'tags': [t.pk for t in tags],
  289. }
  290. cls.csv_data = (
  291. "vrf,start_address,end_address,status",
  292. "VRF 1,10.1.0.1/16,10.1.9.254/16,active",
  293. "VRF 1,10.2.0.1/16,10.2.9.254/16,active",
  294. "VRF 1,10.3.0.1/16,10.3.9.254/16,active",
  295. )
  296. cls.bulk_edit_data = {
  297. 'vrf': vrfs[1].pk,
  298. 'tenant': None,
  299. 'status': IPRangeStatusChoices.STATUS_RESERVED,
  300. 'role': roles[1].pk,
  301. 'description': 'New description',
  302. }
  303. class IPAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  304. model = IPAddress
  305. @classmethod
  306. def setUpTestData(cls):
  307. vrfs = (
  308. VRF(name='VRF 1', rd='65000:1'),
  309. VRF(name='VRF 2', rd='65000:2'),
  310. )
  311. VRF.objects.bulk_create(vrfs)
  312. IPAddress.objects.bulk_create([
  313. IPAddress(address=IPNetwork('192.0.2.1/24'), vrf=vrfs[0]),
  314. IPAddress(address=IPNetwork('192.0.2.2/24'), vrf=vrfs[0]),
  315. IPAddress(address=IPNetwork('192.0.2.3/24'), vrf=vrfs[0]),
  316. ])
  317. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  318. cls.form_data = {
  319. 'vrf': vrfs[1].pk,
  320. 'address': IPNetwork('192.0.2.99/24'),
  321. 'tenant': None,
  322. 'status': IPAddressStatusChoices.STATUS_RESERVED,
  323. 'role': IPAddressRoleChoices.ROLE_ANYCAST,
  324. 'nat_inside': None,
  325. 'dns_name': 'example',
  326. 'description': 'A new IP address',
  327. 'tags': [t.pk for t in tags],
  328. }
  329. cls.csv_data = (
  330. "vrf,address,status",
  331. "VRF 1,192.0.2.4/24,active",
  332. "VRF 1,192.0.2.5/24,active",
  333. "VRF 1,192.0.2.6/24,active",
  334. )
  335. cls.bulk_edit_data = {
  336. 'vrf': vrfs[1].pk,
  337. 'tenant': None,
  338. 'status': IPAddressStatusChoices.STATUS_RESERVED,
  339. 'role': IPAddressRoleChoices.ROLE_ANYCAST,
  340. 'dns_name': 'example',
  341. 'description': 'New description',
  342. }
  343. class FHRPGroupTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  344. model = FHRPGroup
  345. @classmethod
  346. def setUpTestData(cls):
  347. FHRPGroup.objects.bulk_create((
  348. FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP2, group_id=10, auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_PLAINTEXT, auth_key='foobar123'),
  349. FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP3, group_id=20, auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_MD5, auth_key='foobar123'),
  350. FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_HSRP, group_id=30),
  351. ))
  352. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  353. cls.form_data = {
  354. 'protocol': FHRPGroupProtocolChoices.PROTOCOL_VRRP2,
  355. 'group_id': 99,
  356. 'auth_type': FHRPGroupAuthTypeChoices.AUTHENTICATION_MD5,
  357. 'auth_key': 'abc123def456',
  358. 'description': 'Blah blah blah',
  359. 'tags': [t.pk for t in tags],
  360. }
  361. cls.csv_data = (
  362. "protocol,group_id,auth_type,auth_key,description",
  363. "vrrp2,40,plaintext,foobar123,Foo",
  364. "vrrp3,50,md5,foobar123,Bar",
  365. "hsrp,60,,,",
  366. )
  367. cls.bulk_edit_data = {
  368. 'protocol': FHRPGroupProtocolChoices.PROTOCOL_CARP,
  369. }
  370. class VLANGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  371. model = VLANGroup
  372. @classmethod
  373. def setUpTestData(cls):
  374. sites = (
  375. Site(name='Site 1', slug='site-1'),
  376. Site(name='Site 2', slug='site-2'),
  377. )
  378. Site.objects.bulk_create(sites)
  379. VLANGroup.objects.bulk_create([
  380. VLANGroup(name='VLAN Group 1', slug='vlan-group-1', scope=sites[0]),
  381. VLANGroup(name='VLAN Group 2', slug='vlan-group-2', scope=sites[0]),
  382. VLANGroup(name='VLAN Group 3', slug='vlan-group-3', scope=sites[0]),
  383. ])
  384. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  385. cls.form_data = {
  386. 'name': 'VLAN Group X',
  387. 'slug': 'vlan-group-x',
  388. 'description': 'A new VLAN group',
  389. 'tags': [t.pk for t in tags],
  390. }
  391. cls.csv_data = (
  392. f"name,slug,scope_type,scope_id,description",
  393. f"VLAN Group 4,vlan-group-4,,,Fourth VLAN group",
  394. f"VLAN Group 5,vlan-group-5,dcim.site,{sites[0].pk},Fifth VLAN group",
  395. f"VLAN Group 6,vlan-group-6,dcim.site,{sites[1].pk},Sixth VLAN group",
  396. )
  397. cls.bulk_edit_data = {
  398. 'description': 'New description',
  399. }
  400. class VLANTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  401. model = VLAN
  402. @classmethod
  403. def setUpTestData(cls):
  404. sites = (
  405. Site(name='Site 1', slug='site-1'),
  406. Site(name='Site 2', slug='site-2'),
  407. )
  408. Site.objects.bulk_create(sites)
  409. vlangroups = (
  410. VLANGroup(name='VLAN Group 1', slug='vlan-group-1', scope=sites[0]),
  411. VLANGroup(name='VLAN Group 2', slug='vlan-group-2', scope=sites[1]),
  412. )
  413. VLANGroup.objects.bulk_create(vlangroups)
  414. roles = (
  415. Role(name='Role 1', slug='role-1'),
  416. Role(name='Role 2', slug='role-2'),
  417. )
  418. Role.objects.bulk_create(roles)
  419. VLAN.objects.bulk_create([
  420. VLAN(group=vlangroups[0], vid=101, name='VLAN101', site=sites[0], role=roles[0]),
  421. VLAN(group=vlangroups[0], vid=102, name='VLAN102', site=sites[0], role=roles[0]),
  422. VLAN(group=vlangroups[0], vid=103, name='VLAN103', site=sites[0], role=roles[0]),
  423. ])
  424. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  425. cls.form_data = {
  426. 'site': sites[1].pk,
  427. 'group': vlangroups[1].pk,
  428. 'vid': 999,
  429. 'name': 'VLAN999',
  430. 'tenant': None,
  431. 'status': VLANStatusChoices.STATUS_RESERVED,
  432. 'role': roles[1].pk,
  433. 'description': 'A new VLAN',
  434. 'tags': [t.pk for t in tags],
  435. }
  436. cls.csv_data = (
  437. "vid,name,status",
  438. "104,VLAN104,active",
  439. "105,VLAN105,active",
  440. "106,VLAN106,active",
  441. )
  442. cls.bulk_edit_data = {
  443. 'site': sites[1].pk,
  444. 'group': vlangroups[1].pk,
  445. 'tenant': None,
  446. 'status': VLANStatusChoices.STATUS_RESERVED,
  447. 'role': roles[1].pk,
  448. 'description': 'New description',
  449. }
  450. # TODO: Update base class to PrimaryObjectViewTestCase
  451. # Blocked by absence of standard creation view
  452. class ServiceTestCase(
  453. ViewTestCases.GetObjectViewTestCase,
  454. ViewTestCases.GetObjectChangelogViewTestCase,
  455. ViewTestCases.EditObjectViewTestCase,
  456. ViewTestCases.DeleteObjectViewTestCase,
  457. ViewTestCases.ListObjectsViewTestCase,
  458. ViewTestCases.BulkImportObjectsViewTestCase,
  459. ViewTestCases.BulkEditObjectsViewTestCase,
  460. ViewTestCases.BulkDeleteObjectsViewTestCase
  461. ):
  462. model = Service
  463. @classmethod
  464. def setUpTestData(cls):
  465. site = Site.objects.create(name='Site 1', slug='site-1')
  466. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  467. devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
  468. devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
  469. device = Device.objects.create(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  470. Service.objects.bulk_create([
  471. Service(device=device, name='Service 1', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[101]),
  472. Service(device=device, name='Service 2', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[102]),
  473. Service(device=device, name='Service 3', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[103]),
  474. ])
  475. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  476. cls.form_data = {
  477. 'device': device.pk,
  478. 'virtual_machine': None,
  479. 'name': 'Service X',
  480. 'protocol': ServiceProtocolChoices.PROTOCOL_TCP,
  481. 'ports': '104,105',
  482. 'ipaddresses': [],
  483. 'description': 'A new service',
  484. 'tags': [t.pk for t in tags],
  485. }
  486. cls.csv_data = (
  487. "device,name,protocol,ports,description",
  488. "Device 1,Service 1,tcp,1,First service",
  489. "Device 1,Service 2,tcp,2,Second service",
  490. "Device 1,Service 3,udp,3,Third service",
  491. )
  492. cls.bulk_edit_data = {
  493. 'protocol': ServiceProtocolChoices.PROTOCOL_UDP,
  494. 'ports': '106,107',
  495. 'description': 'New description',
  496. }