test_views.py 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231
  1. import urllib.parse
  2. import yaml
  3. from django.contrib.auth.models import User
  4. from django.urls import reverse
  5. from dcim.choices import *
  6. from dcim.constants import *
  7. from dcim.models import *
  8. from utilities.testing import TestCase
  9. class RegionTestCase(TestCase):
  10. user_permissions = (
  11. 'dcim.view_region',
  12. )
  13. @classmethod
  14. def setUpTestData(cls):
  15. # Create three Regions
  16. for i in range(1, 4):
  17. Region(name='Region {}'.format(i), slug='region-{}'.format(i)).save()
  18. def test_region_list(self):
  19. url = reverse('dcim:region_list')
  20. response = self.client.get(url)
  21. self.assertEqual(response.status_code, 200)
  22. def test_region_import(self):
  23. self.add_permissions('dcim.add_region')
  24. csv_data = (
  25. "name,slug",
  26. "Region 4,region-4",
  27. "Region 5,region-5",
  28. "Region 6,region-6",
  29. )
  30. response = self.client.post(reverse('dcim:region_import'), {'csv': '\n'.join(csv_data)})
  31. self.assertEqual(response.status_code, 200)
  32. self.assertEqual(Region.objects.count(), 6)
  33. class SiteTestCase(TestCase):
  34. user_permissions = (
  35. 'dcim.view_site',
  36. )
  37. @classmethod
  38. def setUpTestData(cls):
  39. region = Region(name='Region 1', slug='region-1')
  40. region.save()
  41. Site.objects.bulk_create([
  42. Site(name='Site 1', slug='site-1', region=region),
  43. Site(name='Site 2', slug='site-2', region=region),
  44. Site(name='Site 3', slug='site-3', region=region),
  45. ])
  46. def test_site_list(self):
  47. url = reverse('dcim:site_list')
  48. params = {
  49. "region": Region.objects.first().slug,
  50. }
  51. response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params)))
  52. self.assertEqual(response.status_code, 200)
  53. def test_site(self):
  54. site = Site.objects.first()
  55. response = self.client.get(site.get_absolute_url())
  56. self.assertEqual(response.status_code, 200)
  57. def test_site_import(self):
  58. self.add_permissions('dcim.add_site')
  59. csv_data = (
  60. "name,slug",
  61. "Site 4,site-4",
  62. "Site 5,site-5",
  63. "Site 6,site-6",
  64. )
  65. response = self.client.post(reverse('dcim:site_import'), {'csv': '\n'.join(csv_data)})
  66. self.assertEqual(response.status_code, 200)
  67. self.assertEqual(Site.objects.count(), 6)
  68. class RackGroupTestCase(TestCase):
  69. user_permissions = (
  70. 'dcim.view_rackgroup',
  71. )
  72. @classmethod
  73. def setUpTestData(cls):
  74. site = Site(name='Site 1', slug='site-1')
  75. site.save()
  76. RackGroup.objects.bulk_create([
  77. RackGroup(name='Rack Group 1', slug='rack-group-1', site=site),
  78. RackGroup(name='Rack Group 2', slug='rack-group-2', site=site),
  79. RackGroup(name='Rack Group 3', slug='rack-group-3', site=site),
  80. ])
  81. def test_rackgroup_list(self):
  82. url = reverse('dcim:rackgroup_list')
  83. response = self.client.get(url)
  84. self.assertEqual(response.status_code, 200)
  85. def test_rackgroup_import(self):
  86. self.add_permissions('dcim.add_rackgroup')
  87. csv_data = (
  88. "site,name,slug",
  89. "Site 1,Rack Group 4,rack-group-4",
  90. "Site 1,Rack Group 5,rack-group-5",
  91. "Site 1,Rack Group 6,rack-group-6",
  92. )
  93. response = self.client.post(reverse('dcim:rackgroup_import'), {'csv': '\n'.join(csv_data)})
  94. self.assertEqual(response.status_code, 200)
  95. self.assertEqual(RackGroup.objects.count(), 6)
  96. class RackRoleTestCase(TestCase):
  97. user_permissions = (
  98. 'dcim.view_rackrole',
  99. )
  100. @classmethod
  101. def setUpTestData(cls):
  102. RackRole.objects.bulk_create([
  103. RackRole(name='Rack Role 1', slug='rack-role-1'),
  104. RackRole(name='Rack Role 2', slug='rack-role-2'),
  105. RackRole(name='Rack Role 3', slug='rack-role-3'),
  106. ])
  107. def test_rackrole_list(self):
  108. url = reverse('dcim:rackrole_list')
  109. response = self.client.get(url)
  110. self.assertEqual(response.status_code, 200)
  111. def test_rackrole_import(self):
  112. self.add_permissions('dcim.add_rackrole')
  113. csv_data = (
  114. "name,slug,color",
  115. "Rack Role 4,rack-role-4,ff0000",
  116. "Rack Role 5,rack-role-5,00ff00",
  117. "Rack Role 6,rack-role-6,0000ff",
  118. )
  119. response = self.client.post(reverse('dcim:rackrole_import'), {'csv': '\n'.join(csv_data)})
  120. self.assertEqual(response.status_code, 200)
  121. self.assertEqual(RackRole.objects.count(), 6)
  122. class RackReservationTestCase(TestCase):
  123. user_permissions = (
  124. 'dcim.view_rackreservation',
  125. )
  126. @classmethod
  127. def setUpTestData(cls):
  128. user = User.objects.create_user(username='testuser2')
  129. site = Site(name='Site 1', slug='site-1')
  130. site.save()
  131. rack = Rack(name='Rack 1', site=site)
  132. rack.save()
  133. RackReservation.objects.bulk_create([
  134. RackReservation(rack=rack, user=user, units=[1, 2, 3], description='Reservation 1'),
  135. RackReservation(rack=rack, user=user, units=[4, 5, 6], description='Reservation 2'),
  136. RackReservation(rack=rack, user=user, units=[7, 8, 9], description='Reservation 3'),
  137. ])
  138. def test_rackreservation_list(self):
  139. url = reverse('dcim:rackreservation_list')
  140. response = self.client.get(url)
  141. self.assertEqual(response.status_code, 200)
  142. class RackTestCase(TestCase):
  143. user_permissions = (
  144. 'dcim.view_rack',
  145. )
  146. @classmethod
  147. def setUpTestData(cls):
  148. site = Site(name='Site 1', slug='site-1')
  149. site.save()
  150. Rack.objects.bulk_create([
  151. Rack(name='Rack 1', site=site),
  152. Rack(name='Rack 2', site=site),
  153. Rack(name='Rack 3', site=site),
  154. ])
  155. def test_rack_list(self):
  156. url = reverse('dcim:rack_list')
  157. params = {
  158. "site": Site.objects.first().slug,
  159. }
  160. response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params)))
  161. self.assertEqual(response.status_code, 200)
  162. def test_rack(self):
  163. rack = Rack.objects.first()
  164. response = self.client.get(rack.get_absolute_url())
  165. self.assertEqual(response.status_code, 200)
  166. def test_rack_import(self):
  167. self.add_permissions('dcim.add_rack')
  168. csv_data = (
  169. "site,name,width,u_height",
  170. "Site 1,Rack 4,19,42",
  171. "Site 1,Rack 5,19,42",
  172. "Site 1,Rack 6,19,42",
  173. )
  174. response = self.client.post(reverse('dcim:rack_import'), {'csv': '\n'.join(csv_data)})
  175. self.assertEqual(response.status_code, 200)
  176. self.assertEqual(Rack.objects.count(), 6)
  177. class ManufacturerTypeTestCase(TestCase):
  178. user_permissions = (
  179. 'dcim.view_manufacturer',
  180. )
  181. @classmethod
  182. def setUpTestData(cls):
  183. Manufacturer.objects.bulk_create([
  184. Manufacturer(name='Manufacturer 1', slug='manufacturer-1'),
  185. Manufacturer(name='Manufacturer 2', slug='manufacturer-2'),
  186. Manufacturer(name='Manufacturer 3', slug='manufacturer-3'),
  187. ])
  188. def test_manufacturer_list(self):
  189. url = reverse('dcim:manufacturer_list')
  190. response = self.client.get(url)
  191. self.assertEqual(response.status_code, 200)
  192. def test_manufacturer_import(self):
  193. self.add_permissions('dcim.add_manufacturer')
  194. csv_data = (
  195. "name,slug",
  196. "Manufacturer 4,manufacturer-4",
  197. "Manufacturer 5,manufacturer-5",
  198. "Manufacturer 6,manufacturer-6",
  199. )
  200. response = self.client.post(reverse('dcim:manufacturer_import'), {'csv': '\n'.join(csv_data)})
  201. self.assertEqual(response.status_code, 200)
  202. self.assertEqual(Manufacturer.objects.count(), 6)
  203. class DeviceTypeTestCase(TestCase):
  204. user_permissions = (
  205. 'dcim.view_devicetype',
  206. )
  207. @classmethod
  208. def setUpTestData(cls):
  209. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  210. manufacturer.save()
  211. DeviceType.objects.bulk_create([
  212. DeviceType(model='Device Type 1', slug='device-type-1', manufacturer=manufacturer),
  213. DeviceType(model='Device Type 2', slug='device-type-2', manufacturer=manufacturer),
  214. DeviceType(model='Device Type 3', slug='device-type-3', manufacturer=manufacturer),
  215. ])
  216. def test_devicetype_list(self):
  217. url = reverse('dcim:devicetype_list')
  218. params = {
  219. "manufacturer": Manufacturer.objects.first().slug,
  220. }
  221. response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params)))
  222. self.assertEqual(response.status_code, 200)
  223. def test_devicetype_export(self):
  224. url = reverse('dcim:devicetype_list')
  225. response = self.client.get('{}?export'.format(url))
  226. self.assertEqual(response.status_code, 200)
  227. data = list(yaml.load_all(response.content, Loader=yaml.SafeLoader))
  228. self.assertEqual(len(data), 3)
  229. self.assertEqual(data[0]['manufacturer'], 'Manufacturer 1')
  230. self.assertEqual(data[0]['model'], 'Device Type 1')
  231. def test_devicetype(self):
  232. devicetype = DeviceType.objects.first()
  233. response = self.client.get(devicetype.get_absolute_url())
  234. self.assertEqual(response.status_code, 200)
  235. def test_devicetype_import(self):
  236. IMPORT_DATA = """
  237. manufacturer: Generic
  238. model: TEST-1000
  239. slug: test-1000
  240. u_height: 2
  241. console-ports:
  242. - name: Console Port 1
  243. type: de-9
  244. - name: Console Port 2
  245. type: de-9
  246. - name: Console Port 3
  247. type: de-9
  248. console-server-ports:
  249. - name: Console Server Port 1
  250. type: rj-45
  251. - name: Console Server Port 2
  252. type: rj-45
  253. - name: Console Server Port 3
  254. type: rj-45
  255. power-ports:
  256. - name: Power Port 1
  257. type: iec-60320-c14
  258. - name: Power Port 2
  259. type: iec-60320-c14
  260. - name: Power Port 3
  261. type: iec-60320-c14
  262. power-outlets:
  263. - name: Power Outlet 1
  264. type: iec-60320-c13
  265. power_port: Power Port 1
  266. feed_leg: A
  267. - name: Power Outlet 2
  268. type: iec-60320-c13
  269. power_port: Power Port 1
  270. feed_leg: A
  271. - name: Power Outlet 3
  272. type: iec-60320-c13
  273. power_port: Power Port 1
  274. feed_leg: A
  275. interfaces:
  276. - name: Interface 1
  277. type: 1000base-t
  278. mgmt_only: true
  279. - name: Interface 2
  280. type: 1000base-t
  281. - name: Interface 3
  282. type: 1000base-t
  283. rear-ports:
  284. - name: Rear Port 1
  285. type: 8p8c
  286. - name: Rear Port 2
  287. type: 8p8c
  288. - name: Rear Port 3
  289. type: 8p8c
  290. front-ports:
  291. - name: Front Port 1
  292. type: 8p8c
  293. rear_port: Rear Port 1
  294. - name: Front Port 2
  295. type: 8p8c
  296. rear_port: Rear Port 2
  297. - name: Front Port 3
  298. type: 8p8c
  299. rear_port: Rear Port 3
  300. device-bays:
  301. - name: Device Bay 1
  302. - name: Device Bay 2
  303. - name: Device Bay 3
  304. """
  305. # Create the manufacturer
  306. Manufacturer(name='Generic', slug='generic').save()
  307. # Add all required permissions to the test user
  308. self.add_permissions(
  309. 'dcim.add_devicetype',
  310. 'dcim.add_consoleporttemplate',
  311. 'dcim.add_consoleserverporttemplate',
  312. 'dcim.add_powerporttemplate',
  313. 'dcim.add_poweroutlettemplate',
  314. 'dcim.add_interfacetemplate',
  315. 'dcim.add_frontporttemplate',
  316. 'dcim.add_rearporttemplate',
  317. 'dcim.add_devicebaytemplate',
  318. )
  319. form_data = {
  320. 'data': IMPORT_DATA,
  321. 'format': 'yaml'
  322. }
  323. response = self.client.post(reverse('dcim:devicetype_import'), data=form_data, follow=True)
  324. self.assertEqual(response.status_code, 200)
  325. dt = DeviceType.objects.get(model='TEST-1000')
  326. # Verify all of the components were created
  327. self.assertEqual(dt.consoleport_templates.count(), 3)
  328. cp1 = ConsolePortTemplate.objects.first()
  329. self.assertEqual(cp1.name, 'Console Port 1')
  330. self.assertEqual(cp1.type, ConsolePortTypeChoices.TYPE_DE9)
  331. self.assertEqual(dt.consoleserverport_templates.count(), 3)
  332. csp1 = ConsoleServerPortTemplate.objects.first()
  333. self.assertEqual(csp1.name, 'Console Server Port 1')
  334. self.assertEqual(csp1.type, ConsolePortTypeChoices.TYPE_RJ45)
  335. self.assertEqual(dt.powerport_templates.count(), 3)
  336. pp1 = PowerPortTemplate.objects.first()
  337. self.assertEqual(pp1.name, 'Power Port 1')
  338. self.assertEqual(pp1.type, PowerPortTypeChoices.TYPE_IEC_C14)
  339. self.assertEqual(dt.poweroutlet_templates.count(), 3)
  340. po1 = PowerOutletTemplate.objects.first()
  341. self.assertEqual(po1.name, 'Power Outlet 1')
  342. self.assertEqual(po1.type, PowerOutletTypeChoices.TYPE_IEC_C13)
  343. self.assertEqual(po1.power_port, pp1)
  344. self.assertEqual(po1.feed_leg, PowerOutletFeedLegChoices.FEED_LEG_A)
  345. self.assertEqual(dt.interface_templates.count(), 3)
  346. iface1 = InterfaceTemplate.objects.first()
  347. self.assertEqual(iface1.name, 'Interface 1')
  348. self.assertEqual(iface1.type, InterfaceTypeChoices.TYPE_1GE_FIXED)
  349. self.assertTrue(iface1.mgmt_only)
  350. self.assertEqual(dt.rearport_templates.count(), 3)
  351. rp1 = RearPortTemplate.objects.first()
  352. self.assertEqual(rp1.name, 'Rear Port 1')
  353. self.assertEqual(dt.frontport_templates.count(), 3)
  354. fp1 = FrontPortTemplate.objects.first()
  355. self.assertEqual(fp1.name, 'Front Port 1')
  356. self.assertEqual(fp1.rear_port, rp1)
  357. self.assertEqual(fp1.rear_port_position, 1)
  358. self.assertEqual(dt.device_bay_templates.count(), 3)
  359. db1 = DeviceBayTemplate.objects.first()
  360. self.assertEqual(db1.name, 'Device Bay 1')
  361. class DeviceRoleTestCase(TestCase):
  362. user_permissions = (
  363. 'dcim.view_devicerole',
  364. )
  365. @classmethod
  366. def setUpTestData(cls):
  367. DeviceRole.objects.bulk_create([
  368. DeviceRole(name='Device Role 1', slug='device-role-1'),
  369. DeviceRole(name='Device Role 2', slug='device-role-2'),
  370. DeviceRole(name='Device Role 3', slug='device-role-3'),
  371. ])
  372. def test_devicerole_list(self):
  373. url = reverse('dcim:devicerole_list')
  374. response = self.client.get(url)
  375. self.assertEqual(response.status_code, 200)
  376. def test_devicerole_import(self):
  377. self.add_permissions('dcim.add_devicerole')
  378. csv_data = (
  379. "name,slug,color",
  380. "Device Role 4,device-role-4,ff0000",
  381. "Device Role 5,device-role-5,00ff00",
  382. "Device Role 6,device-role-6,0000ff",
  383. )
  384. response = self.client.post(reverse('dcim:devicerole_import'), {'csv': '\n'.join(csv_data)})
  385. self.assertEqual(response.status_code, 200)
  386. self.assertEqual(DeviceRole.objects.count(), 6)
  387. class PlatformTestCase(TestCase):
  388. user_permissions = (
  389. 'dcim.view_platform',
  390. )
  391. @classmethod
  392. def setUpTestData(cls):
  393. Platform.objects.bulk_create([
  394. Platform(name='Platform 1', slug='platform-1'),
  395. Platform(name='Platform 2', slug='platform-2'),
  396. Platform(name='Platform 3', slug='platform-3'),
  397. ])
  398. def test_platform_list(self):
  399. url = reverse('dcim:platform_list')
  400. response = self.client.get(url)
  401. self.assertEqual(response.status_code, 200)
  402. def test_platform_import(self):
  403. self.add_permissions('dcim.add_platform')
  404. csv_data = (
  405. "name,slug",
  406. "Platform 4,platform-4",
  407. "Platform 5,platform-5",
  408. "Platform 6,platform-6",
  409. )
  410. response = self.client.post(reverse('dcim:platform_import'), {'csv': '\n'.join(csv_data)})
  411. self.assertEqual(response.status_code, 200)
  412. self.assertEqual(Platform.objects.count(), 6)
  413. class DeviceTestCase(TestCase):
  414. user_permissions = (
  415. 'dcim.view_device',
  416. )
  417. @classmethod
  418. def setUpTestData(cls):
  419. site = Site(name='Site 1', slug='site-1')
  420. site.save()
  421. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  422. manufacturer.save()
  423. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  424. devicetype.save()
  425. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  426. devicerole.save()
  427. Device.objects.bulk_create([
  428. Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole),
  429. Device(name='Device 2', site=site, device_type=devicetype, device_role=devicerole),
  430. Device(name='Device 3', site=site, device_type=devicetype, device_role=devicerole),
  431. ])
  432. def test_device_list(self):
  433. url = reverse('dcim:device_list')
  434. params = {
  435. "device_type_id": DeviceType.objects.first().pk,
  436. "role": DeviceRole.objects.first().slug,
  437. }
  438. response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params)))
  439. self.assertEqual(response.status_code, 200)
  440. def test_device(self):
  441. device = Device.objects.first()
  442. response = self.client.get(device.get_absolute_url())
  443. self.assertEqual(response.status_code, 200)
  444. def test_device_import(self):
  445. self.add_permissions('dcim.add_device')
  446. csv_data = (
  447. "device_role,manufacturer,model_name,status,site,name",
  448. "Device Role 1,Manufacturer 1,Device Type 1,Active,Site 1,Device 4",
  449. "Device Role 1,Manufacturer 1,Device Type 1,Active,Site 1,Device 5",
  450. "Device Role 1,Manufacturer 1,Device Type 1,Active,Site 1,Device 6",
  451. )
  452. response = self.client.post(reverse('dcim:device_import'), {'csv': '\n'.join(csv_data)})
  453. self.assertEqual(response.status_code, 200)
  454. self.assertEqual(Device.objects.count(), 6)
  455. class ConsolePortTestCase(TestCase):
  456. user_permissions = (
  457. 'dcim.view_consoleport',
  458. )
  459. @classmethod
  460. def setUpTestData(cls):
  461. site = Site(name='Site 1', slug='site-1')
  462. site.save()
  463. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  464. manufacturer.save()
  465. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  466. devicetype.save()
  467. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  468. devicerole.save()
  469. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  470. device.save()
  471. ConsolePort.objects.bulk_create([
  472. ConsolePort(device=device, name='Console Port 1'),
  473. ConsolePort(device=device, name='Console Port 2'),
  474. ConsolePort(device=device, name='Console Port 3'),
  475. ])
  476. def test_consoleport_list(self):
  477. url = reverse('dcim:consoleport_list')
  478. response = self.client.get(url)
  479. self.assertEqual(response.status_code, 200)
  480. def test_consoleport_import(self):
  481. self.add_permissions('dcim.add_consoleport')
  482. csv_data = (
  483. "device,name",
  484. "Device 1,Console Port 4",
  485. "Device 1,Console Port 5",
  486. "Device 1,Console Port 6",
  487. )
  488. response = self.client.post(reverse('dcim:consoleport_import'), {'csv': '\n'.join(csv_data)})
  489. self.assertEqual(response.status_code, 200)
  490. self.assertEqual(ConsolePort.objects.count(), 6)
  491. class ConsoleServerPortTestCase(TestCase):
  492. user_permissions = (
  493. 'dcim.view_consoleserverport',
  494. )
  495. @classmethod
  496. def setUpTestData(cls):
  497. site = Site(name='Site 1', slug='site-1')
  498. site.save()
  499. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  500. manufacturer.save()
  501. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  502. devicetype.save()
  503. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  504. devicerole.save()
  505. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  506. device.save()
  507. ConsoleServerPort.objects.bulk_create([
  508. ConsoleServerPort(device=device, name='Console Server Port 1'),
  509. ConsoleServerPort(device=device, name='Console Server Port 2'),
  510. ConsoleServerPort(device=device, name='Console Server Port 3'),
  511. ])
  512. def test_consoleserverport_list(self):
  513. url = reverse('dcim:consoleserverport_list')
  514. response = self.client.get(url)
  515. self.assertEqual(response.status_code, 200)
  516. def test_consoleserverport_import(self):
  517. self.add_permissions('dcim.add_consoleserverport')
  518. csv_data = (
  519. "device,name",
  520. "Device 1,Console Server Port 4",
  521. "Device 1,Console Server Port 5",
  522. "Device 1,Console Server Port 6",
  523. )
  524. response = self.client.post(reverse('dcim:consoleserverport_import'), {'csv': '\n'.join(csv_data)})
  525. self.assertEqual(response.status_code, 200)
  526. self.assertEqual(ConsoleServerPort.objects.count(), 6)
  527. class PowerPortTestCase(TestCase):
  528. user_permissions = (
  529. 'dcim.view_powerport',
  530. )
  531. @classmethod
  532. def setUpTestData(cls):
  533. site = Site(name='Site 1', slug='site-1')
  534. site.save()
  535. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  536. manufacturer.save()
  537. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  538. devicetype.save()
  539. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  540. devicerole.save()
  541. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  542. device.save()
  543. PowerPort.objects.bulk_create([
  544. PowerPort(device=device, name='Power Port 1'),
  545. PowerPort(device=device, name='Power Port 2'),
  546. PowerPort(device=device, name='Power Port 3'),
  547. ])
  548. def test_powerport_list(self):
  549. url = reverse('dcim:powerport_list')
  550. response = self.client.get(url)
  551. self.assertEqual(response.status_code, 200)
  552. def test_powerport_import(self):
  553. self.add_permissions('dcim.add_powerport')
  554. csv_data = (
  555. "device,name",
  556. "Device 1,Power Port 4",
  557. "Device 1,Power Port 5",
  558. "Device 1,Power Port 6",
  559. )
  560. response = self.client.post(reverse('dcim:powerport_import'), {'csv': '\n'.join(csv_data)})
  561. self.assertEqual(response.status_code, 200)
  562. self.assertEqual(PowerPort.objects.count(), 6)
  563. class PowerOutletTestCase(TestCase):
  564. user_permissions = (
  565. 'dcim.view_poweroutlet',
  566. )
  567. @classmethod
  568. def setUpTestData(cls):
  569. site = Site(name='Site 1', slug='site-1')
  570. site.save()
  571. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  572. manufacturer.save()
  573. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  574. devicetype.save()
  575. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  576. devicerole.save()
  577. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  578. device.save()
  579. PowerOutlet.objects.bulk_create([
  580. PowerOutlet(device=device, name='Power Outlet 1'),
  581. PowerOutlet(device=device, name='Power Outlet 2'),
  582. PowerOutlet(device=device, name='Power Outlet 3'),
  583. ])
  584. def test_poweroutlet_list(self):
  585. url = reverse('dcim:poweroutlet_list')
  586. response = self.client.get(url)
  587. self.assertEqual(response.status_code, 200)
  588. def test_poweroutlet_import(self):
  589. self.add_permissions('dcim.add_poweroutlet')
  590. csv_data = (
  591. "device,name",
  592. "Device 1,Power Outlet 4",
  593. "Device 1,Power Outlet 5",
  594. "Device 1,Power Outlet 6",
  595. )
  596. response = self.client.post(reverse('dcim:poweroutlet_import'), {'csv': '\n'.join(csv_data)})
  597. self.assertEqual(response.status_code, 200)
  598. self.assertEqual(PowerOutlet.objects.count(), 6)
  599. class InterfaceTestCase(TestCase):
  600. user_permissions = (
  601. 'dcim.view_interface',
  602. )
  603. @classmethod
  604. def setUpTestData(cls):
  605. site = Site(name='Site 1', slug='site-1')
  606. site.save()
  607. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  608. manufacturer.save()
  609. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  610. devicetype.save()
  611. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  612. devicerole.save()
  613. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  614. device.save()
  615. Interface.objects.bulk_create([
  616. Interface(device=device, name='Interface 1'),
  617. Interface(device=device, name='Interface 2'),
  618. Interface(device=device, name='Interface 3'),
  619. ])
  620. def test_interface_list(self):
  621. url = reverse('dcim:interface_list')
  622. response = self.client.get(url)
  623. self.assertEqual(response.status_code, 200)
  624. def test_interface_import(self):
  625. self.add_permissions('dcim.add_interface')
  626. csv_data = (
  627. "device,name,type",
  628. "Device 1,Interface 4,1000BASE-T (1GE)",
  629. "Device 1,Interface 5,1000BASE-T (1GE)",
  630. "Device 1,Interface 6,1000BASE-T (1GE)",
  631. )
  632. response = self.client.post(reverse('dcim:interface_import'), {'csv': '\n'.join(csv_data)})
  633. self.assertEqual(response.status_code, 200)
  634. self.assertEqual(Interface.objects.count(), 6)
  635. class FrontPortTestCase(TestCase):
  636. user_permissions = (
  637. 'dcim.view_frontport',
  638. )
  639. @classmethod
  640. def setUpTestData(cls):
  641. site = Site(name='Site 1', slug='site-1')
  642. site.save()
  643. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  644. manufacturer.save()
  645. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  646. devicetype.save()
  647. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  648. devicerole.save()
  649. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  650. device.save()
  651. rearport1 = RearPort(device=device, name='Rear Port 1')
  652. rearport1.save()
  653. rearport2 = RearPort(device=device, name='Rear Port 2')
  654. rearport2.save()
  655. rearport3 = RearPort(device=device, name='Rear Port 3')
  656. rearport3.save()
  657. # RearPorts for CSV import test
  658. RearPort(device=device, name='Rear Port 4').save()
  659. RearPort(device=device, name='Rear Port 5').save()
  660. RearPort(device=device, name='Rear Port 6').save()
  661. FrontPort.objects.bulk_create([
  662. FrontPort(device=device, name='Front Port 1', rear_port=rearport1),
  663. FrontPort(device=device, name='Front Port 2', rear_port=rearport2),
  664. FrontPort(device=device, name='Front Port 3', rear_port=rearport3),
  665. ])
  666. def test_frontport_list(self):
  667. url = reverse('dcim:frontport_list')
  668. response = self.client.get(url)
  669. self.assertEqual(response.status_code, 200)
  670. def test_frontport_import(self):
  671. self.add_permissions('dcim.add_frontport')
  672. csv_data = (
  673. "device,name,type,rear_port,rear_port_position",
  674. "Device 1,Front Port 4,8P8C,Rear Port 4,1",
  675. "Device 1,Front Port 5,8P8C,Rear Port 5,1",
  676. "Device 1,Front Port 6,8P8C,Rear Port 6,1",
  677. )
  678. response = self.client.post(reverse('dcim:frontport_import'), {'csv': '\n'.join(csv_data)})
  679. self.assertEqual(response.status_code, 200)
  680. self.assertEqual(FrontPort.objects.count(), 6)
  681. class RearPortTestCase(TestCase):
  682. user_permissions = (
  683. 'dcim.view_rearport',
  684. )
  685. @classmethod
  686. def setUpTestData(cls):
  687. site = Site(name='Site 1', slug='site-1')
  688. site.save()
  689. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  690. manufacturer.save()
  691. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  692. devicetype.save()
  693. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  694. devicerole.save()
  695. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  696. device.save()
  697. RearPort.objects.bulk_create([
  698. RearPort(device=device, name='Rear Port 1'),
  699. RearPort(device=device, name='Rear Port 2'),
  700. RearPort(device=device, name='Rear Port 3'),
  701. ])
  702. def test_rearport_list(self):
  703. url = reverse('dcim:rearport_list')
  704. response = self.client.get(url)
  705. self.assertEqual(response.status_code, 200)
  706. def test_rearport_import(self):
  707. self.add_permissions('dcim.add_rearport')
  708. csv_data = (
  709. "device,name,type,positions",
  710. "Device 1,Rear Port 4,8P8C,1",
  711. "Device 1,Rear Port 5,8P8C,1",
  712. "Device 1,Rear Port 6,8P8C,1",
  713. )
  714. response = self.client.post(reverse('dcim:rearport_import'), {'csv': '\n'.join(csv_data)})
  715. self.assertEqual(response.status_code, 200)
  716. self.assertEqual(RearPort.objects.count(), 6)
  717. class DeviceBayTestCase(TestCase):
  718. user_permissions = (
  719. 'dcim.view_devicebay',
  720. )
  721. @classmethod
  722. def setUpTestData(cls):
  723. site = Site(name='Site 1', slug='site-1')
  724. site.save()
  725. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  726. manufacturer.save()
  727. devicetype = DeviceType(
  728. model='Device Type 1',
  729. manufacturer=manufacturer,
  730. subdevice_role=SubdeviceRoleChoices.ROLE_PARENT
  731. )
  732. devicetype.save()
  733. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  734. devicerole.save()
  735. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  736. device.save()
  737. DeviceBay.objects.bulk_create([
  738. DeviceBay(device=device, name='Device Bay 1'),
  739. DeviceBay(device=device, name='Device Bay 2'),
  740. DeviceBay(device=device, name='Device Bay 3'),
  741. ])
  742. def test_devicebay_list(self):
  743. url = reverse('dcim:devicebay_list')
  744. response = self.client.get(url)
  745. self.assertEqual(response.status_code, 200)
  746. def test_devicebay_import(self):
  747. self.add_permissions('dcim.add_devicebay')
  748. csv_data = (
  749. "device,name",
  750. "Device 1,Device Bay 4",
  751. "Device 1,Device Bay 5",
  752. "Device 1,Device Bay 6",
  753. )
  754. response = self.client.post(reverse('dcim:devicebay_import'), {'csv': '\n'.join(csv_data)})
  755. self.assertEqual(response.status_code, 200)
  756. self.assertEqual(DeviceBay.objects.count(), 6)
  757. class InventoryItemTestCase(TestCase):
  758. user_permissions = (
  759. 'dcim.view_inventoryitem',
  760. )
  761. @classmethod
  762. def setUpTestData(cls):
  763. site = Site(name='Site 1', slug='site-1')
  764. site.save()
  765. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  766. manufacturer.save()
  767. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  768. devicetype.save()
  769. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  770. devicerole.save()
  771. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  772. device.save()
  773. InventoryItem.objects.bulk_create([
  774. InventoryItem(device=device, name='Inventory Item 1'),
  775. InventoryItem(device=device, name='Inventory Item 2'),
  776. InventoryItem(device=device, name='Inventory Item 3'),
  777. ])
  778. def test_inventoryitem_list(self):
  779. url = reverse('dcim:inventoryitem_list')
  780. params = {
  781. "device_id": Device.objects.first().pk,
  782. }
  783. response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params)))
  784. self.assertEqual(response.status_code, 200)
  785. def test_inventoryitem_import(self):
  786. self.add_permissions('dcim.add_inventoryitem')
  787. csv_data = (
  788. "device,name",
  789. "Device 1,Inventory Item 4",
  790. "Device 1,Inventory Item 5",
  791. "Device 1,Inventory Item 6",
  792. )
  793. response = self.client.post(reverse('dcim:inventoryitem_import'), {'csv': '\n'.join(csv_data)})
  794. self.assertEqual(response.status_code, 200)
  795. self.assertEqual(InventoryItem.objects.count(), 6)
  796. class CableTestCase(TestCase):
  797. user_permissions = (
  798. 'dcim.view_cable',
  799. )
  800. @classmethod
  801. def setUpTestData(cls):
  802. site = Site(name='Site 1', slug='site-1')
  803. site.save()
  804. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  805. manufacturer.save()
  806. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  807. devicetype.save()
  808. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  809. devicerole.save()
  810. device1 = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  811. device1.save()
  812. device2 = Device(name='Device 2', site=site, device_type=devicetype, device_role=devicerole)
  813. device2.save()
  814. device3 = Device(name='Device 3', site=site, device_type=devicetype, device_role=devicerole)
  815. device3.save()
  816. device4 = Device(name='Device 4', site=site, device_type=devicetype, device_role=devicerole)
  817. device4.save()
  818. iface1 = Interface(device=device1, name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED)
  819. iface1.save()
  820. iface2 = Interface(device=device1, name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED)
  821. iface2.save()
  822. iface3 = Interface(device=device1, name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED)
  823. iface3.save()
  824. iface4 = Interface(device=device2, name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED)
  825. iface4.save()
  826. iface5 = Interface(device=device2, name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED)
  827. iface5.save()
  828. iface6 = Interface(device=device2, name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED)
  829. iface6.save()
  830. # Interfaces for CSV import testing
  831. Interface(device=device3, name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED).save()
  832. Interface(device=device3, name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED).save()
  833. Interface(device=device3, name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED).save()
  834. Interface(device=device4, name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED).save()
  835. Interface(device=device4, name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED).save()
  836. Interface(device=device4, name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED).save()
  837. Cable(termination_a=iface1, termination_b=iface4, type=CableTypeChoices.TYPE_CAT6).save()
  838. Cable(termination_a=iface2, termination_b=iface5, type=CableTypeChoices.TYPE_CAT6).save()
  839. Cable(termination_a=iface3, termination_b=iface6, type=CableTypeChoices.TYPE_CAT6).save()
  840. def test_cable_list(self):
  841. url = reverse('dcim:cable_list')
  842. params = {
  843. "type": CableTypeChoices.TYPE_CAT6,
  844. }
  845. response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params)))
  846. self.assertEqual(response.status_code, 200)
  847. def test_cable(self):
  848. cable = Cable.objects.first()
  849. response = self.client.get(cable.get_absolute_url())
  850. self.assertEqual(response.status_code, 200)
  851. def test_cable_import(self):
  852. self.add_permissions('dcim.add_cable')
  853. csv_data = (
  854. "side_a_device,side_a_type,side_a_name,side_b_device,side_b_type,side_b_name",
  855. "Device 3,interface,Interface 1,Device 4,interface,Interface 1",
  856. "Device 3,interface,Interface 2,Device 4,interface,Interface 2",
  857. "Device 3,interface,Interface 3,Device 4,interface,Interface 3",
  858. )
  859. response = self.client.post(reverse('dcim:cable_import'), {'csv': '\n'.join(csv_data)})
  860. self.assertEqual(response.status_code, 200)
  861. self.assertEqual(Cable.objects.count(), 6)
  862. class VirtualChassisTestCase(TestCase):
  863. user_permissions = (
  864. 'dcim.view_virtualchassis',
  865. )
  866. @classmethod
  867. def setUpTestData(cls):
  868. site = Site.objects.create(name='Site 1', slug='site-1')
  869. manufacturer = Manufacturer.objects.create(name='Manufacturer', slug='manufacturer-1')
  870. device_type = DeviceType.objects.create(
  871. manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'
  872. )
  873. device_role = DeviceRole.objects.create(
  874. name='Device Role', slug='device-role-1'
  875. )
  876. # Create 9 member Devices
  877. device1 = Device.objects.create(
  878. device_type=device_type, device_role=device_role, name='Device 1', site=site
  879. )
  880. device2 = Device.objects.create(
  881. device_type=device_type, device_role=device_role, name='Device 2', site=site
  882. )
  883. device3 = Device.objects.create(
  884. device_type=device_type, device_role=device_role, name='Device 3', site=site
  885. )
  886. device4 = Device.objects.create(
  887. device_type=device_type, device_role=device_role, name='Device 4', site=site
  888. )
  889. device5 = Device.objects.create(
  890. device_type=device_type, device_role=device_role, name='Device 5', site=site
  891. )
  892. device6 = Device.objects.create(
  893. device_type=device_type, device_role=device_role, name='Device 6', site=site
  894. )
  895. # Create three VirtualChassis with two members each
  896. vc1 = VirtualChassis.objects.create(master=device1, domain='test-domain-1')
  897. Device.objects.filter(pk=device2.pk).update(virtual_chassis=vc1, vc_position=2)
  898. vc2 = VirtualChassis.objects.create(master=device3, domain='test-domain-2')
  899. Device.objects.filter(pk=device4.pk).update(virtual_chassis=vc2, vc_position=2)
  900. vc3 = VirtualChassis.objects.create(master=device5, domain='test-domain-3')
  901. Device.objects.filter(pk=device6.pk).update(virtual_chassis=vc3, vc_position=2)
  902. def test_virtualchassis_list(self):
  903. url = reverse('dcim:virtualchassis_list')
  904. response = self.client.get(url)
  905. self.assertEqual(response.status_code, 200)