test_views.py 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395
  1. import urllib.parse
  2. from decimal import Decimal
  3. import pytz
  4. import yaml
  5. from django.contrib.auth.models import User
  6. from django.contrib.contenttypes.models import ContentType
  7. from django.urls import reverse
  8. from dcim.choices import *
  9. from dcim.constants import *
  10. from dcim.models import *
  11. from utilities.testing import StandardTestCases, TestCase
  12. class RegionTestCase(StandardTestCases.Views):
  13. model = Region
  14. # Disable inapplicable tests
  15. test_get_object = None
  16. test_delete_object = None
  17. test_bulk_edit_objects = None
  18. @classmethod
  19. def setUpTestData(cls):
  20. # Create three Regions
  21. regions = (
  22. Region(name='Region 1', slug='region-1'),
  23. Region(name='Region 2', slug='region-2'),
  24. Region(name='Region 3', slug='region-3'),
  25. )
  26. for region in regions:
  27. region.save()
  28. cls.form_data = {
  29. 'name': 'Region X',
  30. 'slug': 'region-x',
  31. 'parent': regions[2].pk,
  32. }
  33. cls.csv_data = (
  34. "name,slug",
  35. "Region 4,region-4",
  36. "Region 5,region-5",
  37. "Region 6,region-6",
  38. )
  39. class SiteTestCase(StandardTestCases.Views):
  40. model = Site
  41. @classmethod
  42. def setUpTestData(cls):
  43. regions = (
  44. Region(name='Region 1', slug='region-1'),
  45. Region(name='Region 2', slug='region-2'),
  46. )
  47. for region in regions:
  48. region.save()
  49. Site.objects.bulk_create([
  50. Site(name='Site 1', slug='site-1', region=regions[0]),
  51. Site(name='Site 2', slug='site-2', region=regions[0]),
  52. Site(name='Site 3', slug='site-3', region=regions[0]),
  53. ])
  54. cls.form_data = {
  55. 'name': 'Site X',
  56. 'slug': 'site-x',
  57. 'status': SiteStatusChoices.STATUS_PLANNED,
  58. 'region': regions[1].pk,
  59. 'tenant': None,
  60. 'facility': 'Facility X',
  61. 'asn': 65001,
  62. 'time_zone': pytz.UTC,
  63. 'description': 'Site description',
  64. 'physical_address': '742 Evergreen Terrace, Springfield, USA',
  65. 'shipping_address': '742 Evergreen Terrace, Springfield, USA',
  66. 'latitude': Decimal('35.780000'),
  67. 'longitude': Decimal('-78.642000'),
  68. 'contact_name': 'Hank Hill',
  69. 'contact_phone': '123-555-9999',
  70. 'contact_email': 'hank@stricklandpropane.com',
  71. 'comments': 'Test site',
  72. 'tags': 'Alpha,Bravo,Charlie',
  73. }
  74. cls.csv_data = (
  75. "name,slug",
  76. "Site 4,site-4",
  77. "Site 5,site-5",
  78. "Site 6,site-6",
  79. )
  80. cls.bulk_edit_data = {
  81. 'status': SiteStatusChoices.STATUS_PLANNED,
  82. 'region': regions[1].pk,
  83. 'tenant': None,
  84. 'asn': 65009,
  85. 'time_zone': pytz.timezone('US/Eastern'),
  86. 'description': 'New description',
  87. }
  88. class RackGroupTestCase(StandardTestCases.Views):
  89. model = RackGroup
  90. # Disable inapplicable tests
  91. test_get_object = None
  92. test_delete_object = None
  93. test_bulk_edit_objects = None
  94. @classmethod
  95. def setUpTestData(cls):
  96. site = Site(name='Site 1', slug='site-1')
  97. site.save()
  98. RackGroup.objects.bulk_create([
  99. RackGroup(name='Rack Group 1', slug='rack-group-1', site=site),
  100. RackGroup(name='Rack Group 2', slug='rack-group-2', site=site),
  101. RackGroup(name='Rack Group 3', slug='rack-group-3', site=site),
  102. ])
  103. cls.form_data = {
  104. 'name': 'Rack Group X',
  105. 'slug': 'rack-group-x',
  106. 'site': site.pk,
  107. }
  108. cls.csv_data = (
  109. "site,name,slug",
  110. "Site 1,Rack Group 4,rack-group-4",
  111. "Site 1,Rack Group 5,rack-group-5",
  112. "Site 1,Rack Group 6,rack-group-6",
  113. )
  114. class RackRoleTestCase(StandardTestCases.Views):
  115. model = RackRole
  116. # Disable inapplicable tests
  117. test_get_object = None
  118. test_delete_object = None
  119. test_bulk_edit_objects = None
  120. @classmethod
  121. def setUpTestData(cls):
  122. RackRole.objects.bulk_create([
  123. RackRole(name='Rack Role 1', slug='rack-role-1'),
  124. RackRole(name='Rack Role 2', slug='rack-role-2'),
  125. RackRole(name='Rack Role 3', slug='rack-role-3'),
  126. ])
  127. cls.form_data = {
  128. 'name': 'Rack Role X',
  129. 'slug': 'rack-role-x',
  130. 'color': 'c0c0c0',
  131. 'description': 'New role',
  132. }
  133. cls.csv_data = (
  134. "name,slug,color",
  135. "Rack Role 4,rack-role-4,ff0000",
  136. "Rack Role 5,rack-role-5,00ff00",
  137. "Rack Role 6,rack-role-6,0000ff",
  138. )
  139. class RackReservationTestCase(StandardTestCases.Views):
  140. model = RackReservation
  141. # Disable inapplicable tests
  142. test_get_object = None
  143. test_create_object = None
  144. # TODO: Fix URL name for view
  145. test_import_objects = None
  146. @classmethod
  147. def setUpTestData(cls):
  148. user2 = User.objects.create_user(username='testuser2')
  149. user3 = User.objects.create_user(username='testuser3')
  150. site = Site.objects.create(name='Site 1', slug='site-1')
  151. rack = Rack(name='Rack 1', site=site)
  152. rack.save()
  153. RackReservation.objects.bulk_create([
  154. RackReservation(rack=rack, user=user2, units=[1, 2, 3], description='Reservation 1'),
  155. RackReservation(rack=rack, user=user2, units=[4, 5, 6], description='Reservation 2'),
  156. RackReservation(rack=rack, user=user2, units=[7, 8, 9], description='Reservation 3'),
  157. ])
  158. cls.form_data = {
  159. 'rack': rack.pk,
  160. 'units': [10, 11, 12],
  161. 'user': user3.pk,
  162. 'tenant': None,
  163. 'description': 'Rack reservation',
  164. }
  165. cls.bulk_edit_data = {
  166. 'user': user3.pk,
  167. 'tenant': None,
  168. 'description': 'New description',
  169. }
  170. class RackTestCase(StandardTestCases.Views):
  171. model = Rack
  172. @classmethod
  173. def setUpTestData(cls):
  174. sites = (
  175. Site(name='Site 1', slug='site-1'),
  176. Site(name='Site 2', slug='site-2'),
  177. )
  178. Site.objects.bulk_create(sites)
  179. rackgroups = (
  180. RackGroup(name='Rack Group 1', slug='rack-group-1', site=sites[0]),
  181. RackGroup(name='Rack Group 2', slug='rack-group-2', site=sites[1])
  182. )
  183. RackGroup.objects.bulk_create(rackgroups)
  184. rackroles = (
  185. RackRole(name='Rack Role 1', slug='rack-role-1'),
  186. RackRole(name='Rack Role 2', slug='rack-role-2'),
  187. )
  188. RackRole.objects.bulk_create(rackroles)
  189. Rack.objects.bulk_create((
  190. Rack(name='Rack 1', site=sites[0]),
  191. Rack(name='Rack 2', site=sites[0]),
  192. Rack(name='Rack 3', site=sites[0]),
  193. ))
  194. cls.form_data = {
  195. 'name': 'Rack X',
  196. 'facility_id': 'Facility X',
  197. 'site': sites[1].pk,
  198. 'group': rackgroups[1].pk,
  199. 'tenant': None,
  200. 'status': RackStatusChoices.STATUS_PLANNED,
  201. 'role': rackroles[1].pk,
  202. 'serial': '123456',
  203. 'asset_tag': 'ABCDEF',
  204. 'type': RackTypeChoices.TYPE_CABINET,
  205. 'width': RackWidthChoices.WIDTH_19IN,
  206. 'u_height': 48,
  207. 'desc_units': False,
  208. 'outer_width': 500,
  209. 'outer_depth': 500,
  210. 'outer_unit': RackDimensionUnitChoices.UNIT_MILLIMETER,
  211. 'comments': 'Some comments',
  212. 'tags': 'Alpha,Bravo,Charlie',
  213. }
  214. cls.csv_data = (
  215. "site,name,width,u_height",
  216. "Site 1,Rack 4,19,42",
  217. "Site 1,Rack 5,19,42",
  218. "Site 1,Rack 6,19,42",
  219. )
  220. cls.bulk_edit_data = {
  221. 'site': sites[1].pk,
  222. 'group': rackgroups[1].pk,
  223. 'tenant': None,
  224. 'status': RackStatusChoices.STATUS_DEPRECATED,
  225. 'role': rackroles[1].pk,
  226. 'serial': '654321',
  227. 'type': RackTypeChoices.TYPE_4POST,
  228. 'width': RackWidthChoices.WIDTH_23IN,
  229. 'u_height': 49,
  230. 'desc_units': True,
  231. 'outer_width': 30,
  232. 'outer_depth': 30,
  233. 'outer_unit': RackDimensionUnitChoices.UNIT_INCH,
  234. 'comments': 'New comments',
  235. }
  236. class ManufacturerTestCase(StandardTestCases.Views):
  237. model = Manufacturer
  238. # Disable inapplicable tests
  239. test_get_object = None
  240. test_delete_object = None
  241. test_bulk_edit_objects = None
  242. @classmethod
  243. def setUpTestData(cls):
  244. Manufacturer.objects.bulk_create([
  245. Manufacturer(name='Manufacturer 1', slug='manufacturer-1'),
  246. Manufacturer(name='Manufacturer 2', slug='manufacturer-2'),
  247. Manufacturer(name='Manufacturer 3', slug='manufacturer-3'),
  248. ])
  249. cls.form_data = {
  250. 'name': 'Manufacturer X',
  251. 'slug': 'manufacturer-x',
  252. }
  253. cls.csv_data = (
  254. "name,slug",
  255. "Manufacturer 4,manufacturer-4",
  256. "Manufacturer 5,manufacturer-5",
  257. "Manufacturer 6,manufacturer-6",
  258. )
  259. class DeviceTypeTestCase(StandardTestCases.Views):
  260. model = DeviceType
  261. @classmethod
  262. def setUpTestData(cls):
  263. manufacturers = (
  264. Manufacturer(name='Manufacturer 1', slug='manufacturer-1'),
  265. Manufacturer(name='Manufacturer 2', slug='manufacturer-2')
  266. )
  267. Manufacturer.objects.bulk_create(manufacturers)
  268. DeviceType.objects.bulk_create([
  269. DeviceType(model='Device Type 1', slug='device-type-1', manufacturer=manufacturers[0]),
  270. DeviceType(model='Device Type 2', slug='device-type-2', manufacturer=manufacturers[0]),
  271. DeviceType(model='Device Type 3', slug='device-type-3', manufacturer=manufacturers[0]),
  272. ])
  273. cls.form_data = {
  274. 'manufacturer': manufacturers[1].pk,
  275. 'model': 'Device Type X',
  276. 'slug': 'device-type-x',
  277. 'part_number': '123ABC',
  278. 'u_height': 2,
  279. 'is_full_depth': True,
  280. 'subdevice_role': '', # CharField
  281. 'comments': 'Some comments',
  282. 'tags': 'Alpha,Bravo,Charlie',
  283. }
  284. cls.bulk_edit_data = {
  285. 'manufacturer': manufacturers[1].pk,
  286. 'u_height': 3,
  287. 'is_full_depth': False,
  288. }
  289. def test_import_objects(self):
  290. """
  291. Custom import test for YAML-based imports (versus CSV)
  292. """
  293. IMPORT_DATA = """
  294. manufacturer: Generic
  295. model: TEST-1000
  296. slug: test-1000
  297. u_height: 2
  298. console-ports:
  299. - name: Console Port 1
  300. type: de-9
  301. - name: Console Port 2
  302. type: de-9
  303. - name: Console Port 3
  304. type: de-9
  305. console-server-ports:
  306. - name: Console Server Port 1
  307. type: rj-45
  308. - name: Console Server Port 2
  309. type: rj-45
  310. - name: Console Server Port 3
  311. type: rj-45
  312. power-ports:
  313. - name: Power Port 1
  314. type: iec-60320-c14
  315. - name: Power Port 2
  316. type: iec-60320-c14
  317. - name: Power Port 3
  318. type: iec-60320-c14
  319. power-outlets:
  320. - name: Power Outlet 1
  321. type: iec-60320-c13
  322. power_port: Power Port 1
  323. feed_leg: A
  324. - name: Power Outlet 2
  325. type: iec-60320-c13
  326. power_port: Power Port 1
  327. feed_leg: A
  328. - name: Power Outlet 3
  329. type: iec-60320-c13
  330. power_port: Power Port 1
  331. feed_leg: A
  332. interfaces:
  333. - name: Interface 1
  334. type: 1000base-t
  335. mgmt_only: true
  336. - name: Interface 2
  337. type: 1000base-t
  338. - name: Interface 3
  339. type: 1000base-t
  340. rear-ports:
  341. - name: Rear Port 1
  342. type: 8p8c
  343. - name: Rear Port 2
  344. type: 8p8c
  345. - name: Rear Port 3
  346. type: 8p8c
  347. front-ports:
  348. - name: Front Port 1
  349. type: 8p8c
  350. rear_port: Rear Port 1
  351. - name: Front Port 2
  352. type: 8p8c
  353. rear_port: Rear Port 2
  354. - name: Front Port 3
  355. type: 8p8c
  356. rear_port: Rear Port 3
  357. device-bays:
  358. - name: Device Bay 1
  359. - name: Device Bay 2
  360. - name: Device Bay 3
  361. """
  362. # Create the manufacturer
  363. Manufacturer(name='Generic', slug='generic').save()
  364. # Add all required permissions to the test user
  365. self.add_permissions(
  366. 'dcim.view_devicetype',
  367. 'dcim.add_devicetype',
  368. 'dcim.add_consoleporttemplate',
  369. 'dcim.add_consoleserverporttemplate',
  370. 'dcim.add_powerporttemplate',
  371. 'dcim.add_poweroutlettemplate',
  372. 'dcim.add_interfacetemplate',
  373. 'dcim.add_frontporttemplate',
  374. 'dcim.add_rearporttemplate',
  375. 'dcim.add_devicebaytemplate',
  376. )
  377. form_data = {
  378. 'data': IMPORT_DATA,
  379. 'format': 'yaml'
  380. }
  381. response = self.client.post(reverse('dcim:devicetype_import'), data=form_data, follow=True)
  382. self.assertHttpStatus(response, 200)
  383. dt = DeviceType.objects.get(model='TEST-1000')
  384. # Verify all of the components were created
  385. self.assertEqual(dt.consoleport_templates.count(), 3)
  386. cp1 = ConsolePortTemplate.objects.first()
  387. self.assertEqual(cp1.name, 'Console Port 1')
  388. self.assertEqual(cp1.type, ConsolePortTypeChoices.TYPE_DE9)
  389. self.assertEqual(dt.consoleserverport_templates.count(), 3)
  390. csp1 = ConsoleServerPortTemplate.objects.first()
  391. self.assertEqual(csp1.name, 'Console Server Port 1')
  392. self.assertEqual(csp1.type, ConsolePortTypeChoices.TYPE_RJ45)
  393. self.assertEqual(dt.powerport_templates.count(), 3)
  394. pp1 = PowerPortTemplate.objects.first()
  395. self.assertEqual(pp1.name, 'Power Port 1')
  396. self.assertEqual(pp1.type, PowerPortTypeChoices.TYPE_IEC_C14)
  397. self.assertEqual(dt.poweroutlet_templates.count(), 3)
  398. po1 = PowerOutletTemplate.objects.first()
  399. self.assertEqual(po1.name, 'Power Outlet 1')
  400. self.assertEqual(po1.type, PowerOutletTypeChoices.TYPE_IEC_C13)
  401. self.assertEqual(po1.power_port, pp1)
  402. self.assertEqual(po1.feed_leg, PowerOutletFeedLegChoices.FEED_LEG_A)
  403. self.assertEqual(dt.interface_templates.count(), 3)
  404. iface1 = InterfaceTemplate.objects.first()
  405. self.assertEqual(iface1.name, 'Interface 1')
  406. self.assertEqual(iface1.type, InterfaceTypeChoices.TYPE_1GE_FIXED)
  407. self.assertTrue(iface1.mgmt_only)
  408. self.assertEqual(dt.rearport_templates.count(), 3)
  409. rp1 = RearPortTemplate.objects.first()
  410. self.assertEqual(rp1.name, 'Rear Port 1')
  411. self.assertEqual(dt.frontport_templates.count(), 3)
  412. fp1 = FrontPortTemplate.objects.first()
  413. self.assertEqual(fp1.name, 'Front Port 1')
  414. self.assertEqual(fp1.rear_port, rp1)
  415. self.assertEqual(fp1.rear_port_position, 1)
  416. self.assertEqual(dt.device_bay_templates.count(), 3)
  417. db1 = DeviceBayTemplate.objects.first()
  418. self.assertEqual(db1.name, 'Device Bay 1')
  419. def test_devicetype_export(self):
  420. url = reverse('dcim:devicetype_list')
  421. self.add_permissions('dcim.view_devicetype')
  422. response = self.client.get('{}?export'.format(url))
  423. self.assertEqual(response.status_code, 200)
  424. data = list(yaml.load_all(response.content, Loader=yaml.SafeLoader))
  425. self.assertEqual(len(data), 3)
  426. self.assertEqual(data[0]['manufacturer'], 'Manufacturer 1')
  427. self.assertEqual(data[0]['model'], 'Device Type 1')
  428. class DeviceRoleTestCase(StandardTestCases.Views):
  429. model = DeviceRole
  430. # Disable inapplicable tests
  431. test_get_object = None
  432. test_delete_object = None
  433. test_bulk_edit_objects = None
  434. @classmethod
  435. def setUpTestData(cls):
  436. DeviceRole.objects.bulk_create([
  437. DeviceRole(name='Device Role 1', slug='device-role-1'),
  438. DeviceRole(name='Device Role 2', slug='device-role-2'),
  439. DeviceRole(name='Device Role 3', slug='device-role-3'),
  440. ])
  441. cls.form_data = {
  442. 'name': 'Devie Role X',
  443. 'slug': 'device-role-x',
  444. 'color': 'c0c0c0',
  445. 'vm_role': False,
  446. 'description': 'New device role',
  447. }
  448. cls.csv_data = (
  449. "name,slug,color",
  450. "Device Role 4,device-role-4,ff0000",
  451. "Device Role 5,device-role-5,00ff00",
  452. "Device Role 6,device-role-6,0000ff",
  453. )
  454. class PlatformTestCase(StandardTestCases.Views):
  455. model = Platform
  456. # Disable inapplicable tests
  457. test_get_object = None
  458. test_delete_object = None
  459. test_bulk_edit_objects = None
  460. @classmethod
  461. def setUpTestData(cls):
  462. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  463. Platform.objects.bulk_create([
  464. Platform(name='Platform 1', slug='platform-1', manufacturer=manufacturer),
  465. Platform(name='Platform 2', slug='platform-2', manufacturer=manufacturer),
  466. Platform(name='Platform 3', slug='platform-3', manufacturer=manufacturer),
  467. ])
  468. cls.form_data = {
  469. 'name': 'Platform X',
  470. 'slug': 'platform-x',
  471. 'manufacturer': manufacturer.pk,
  472. 'napalm_driver': 'junos',
  473. 'napalm_args': None,
  474. }
  475. cls.csv_data = (
  476. "name,slug",
  477. "Platform 4,platform-4",
  478. "Platform 5,platform-5",
  479. "Platform 6,platform-6",
  480. )
  481. class DeviceTestCase(StandardTestCases.Views):
  482. model = Device
  483. @classmethod
  484. def setUpTestData(cls):
  485. sites = (
  486. Site(name='Site 1', slug='site-1'),
  487. Site(name='Site 2', slug='site-2'),
  488. )
  489. Site.objects.bulk_create(sites)
  490. racks = (
  491. Rack(name='Rack 1', site=sites[0]),
  492. Rack(name='Rack 2', site=sites[1]),
  493. )
  494. Rack.objects.bulk_create(racks)
  495. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  496. devicetypes = (
  497. DeviceType(model='Device Type 1', slug='device-type-1', manufacturer=manufacturer),
  498. DeviceType(model='Device Type 2', slug='device-type-2', manufacturer=manufacturer),
  499. )
  500. DeviceType.objects.bulk_create(devicetypes)
  501. deviceroles = (
  502. DeviceRole(name='Device Role 1', slug='device-role-1'),
  503. DeviceRole(name='Device Role 2', slug='device-role-2'),
  504. )
  505. DeviceRole.objects.bulk_create(deviceroles)
  506. platforms = (
  507. Platform(name='Platform 1', slug='platform-1'),
  508. Platform(name='Platform 2', slug='platform-2'),
  509. )
  510. Platform.objects.bulk_create(platforms)
  511. Device.objects.bulk_create([
  512. Device(name='Device 1', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
  513. Device(name='Device 2', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
  514. Device(name='Device 3', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
  515. ])
  516. cls.form_data = {
  517. 'device_type': devicetypes[1].pk,
  518. 'device_role': deviceroles[1].pk,
  519. 'tenant': None,
  520. 'platform': platforms[1].pk,
  521. 'name': 'Device X',
  522. 'serial': '123456',
  523. 'asset_tag': 'ABCDEF',
  524. 'site': sites[1].pk,
  525. 'rack': racks[1].pk,
  526. 'position': 1,
  527. 'face': DeviceFaceChoices.FACE_FRONT,
  528. 'status': DeviceStatusChoices.STATUS_PLANNED,
  529. 'primary_ip4': None,
  530. 'primary_ip6': None,
  531. 'cluster': None,
  532. 'virtual_chassis': None,
  533. 'vc_position': None,
  534. 'vc_priority': None,
  535. 'comments': 'A new device',
  536. 'tags': 'Alpha,Bravo,Charlie',
  537. 'local_context_data': None,
  538. }
  539. cls.csv_data = (
  540. "device_role,manufacturer,model_name,status,site,name",
  541. "Device Role 1,Manufacturer 1,Device Type 1,Active,Site 1,Device 4",
  542. "Device Role 1,Manufacturer 1,Device Type 1,Active,Site 1,Device 5",
  543. "Device Role 1,Manufacturer 1,Device Type 1,Active,Site 1,Device 6",
  544. )
  545. cls.bulk_edit_data = {
  546. 'device_type': devicetypes[1].pk,
  547. 'device_role': deviceroles[1].pk,
  548. 'tenant': None,
  549. 'platform': platforms[1].pk,
  550. 'serial': '123456',
  551. 'status': DeviceStatusChoices.STATUS_DECOMMISSIONING,
  552. }
  553. # TODO: Convert to StandardTestCases.Views
  554. class ConsolePortTestCase(TestCase):
  555. user_permissions = (
  556. 'dcim.view_consoleport',
  557. )
  558. @classmethod
  559. def setUpTestData(cls):
  560. site = Site(name='Site 1', slug='site-1')
  561. site.save()
  562. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  563. manufacturer.save()
  564. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  565. devicetype.save()
  566. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  567. devicerole.save()
  568. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  569. device.save()
  570. ConsolePort.objects.bulk_create([
  571. ConsolePort(device=device, name='Console Port 1'),
  572. ConsolePort(device=device, name='Console Port 2'),
  573. ConsolePort(device=device, name='Console Port 3'),
  574. ])
  575. def test_consoleport_list(self):
  576. url = reverse('dcim:consoleport_list')
  577. response = self.client.get(url)
  578. self.assertHttpStatus(response, 200)
  579. def test_consoleport_import(self):
  580. self.add_permissions('dcim.add_consoleport')
  581. csv_data = (
  582. "device,name",
  583. "Device 1,Console Port 4",
  584. "Device 1,Console Port 5",
  585. "Device 1,Console Port 6",
  586. )
  587. response = self.client.post(reverse('dcim:consoleport_import'), {'csv': '\n'.join(csv_data)})
  588. self.assertHttpStatus(response, 200)
  589. self.assertEqual(ConsolePort.objects.count(), 6)
  590. # TODO: Convert to StandardTestCases.Views
  591. class ConsoleServerPortTestCase(TestCase):
  592. user_permissions = (
  593. 'dcim.view_consoleserverport',
  594. )
  595. @classmethod
  596. def setUpTestData(cls):
  597. site = Site(name='Site 1', slug='site-1')
  598. site.save()
  599. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  600. manufacturer.save()
  601. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  602. devicetype.save()
  603. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  604. devicerole.save()
  605. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  606. device.save()
  607. ConsoleServerPort.objects.bulk_create([
  608. ConsoleServerPort(device=device, name='Console Server Port 1'),
  609. ConsoleServerPort(device=device, name='Console Server Port 2'),
  610. ConsoleServerPort(device=device, name='Console Server Port 3'),
  611. ])
  612. def test_consoleserverport_list(self):
  613. url = reverse('dcim:consoleserverport_list')
  614. response = self.client.get(url)
  615. self.assertHttpStatus(response, 200)
  616. def test_consoleserverport_import(self):
  617. self.add_permissions('dcim.add_consoleserverport')
  618. csv_data = (
  619. "device,name",
  620. "Device 1,Console Server Port 4",
  621. "Device 1,Console Server Port 5",
  622. "Device 1,Console Server Port 6",
  623. )
  624. response = self.client.post(reverse('dcim:consoleserverport_import'), {'csv': '\n'.join(csv_data)})
  625. self.assertHttpStatus(response, 200)
  626. self.assertEqual(ConsoleServerPort.objects.count(), 6)
  627. # TODO: Convert to StandardTestCases.Views
  628. class PowerPortTestCase(TestCase):
  629. user_permissions = (
  630. 'dcim.view_powerport',
  631. )
  632. @classmethod
  633. def setUpTestData(cls):
  634. site = Site(name='Site 1', slug='site-1')
  635. site.save()
  636. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  637. manufacturer.save()
  638. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  639. devicetype.save()
  640. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  641. devicerole.save()
  642. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  643. device.save()
  644. PowerPort.objects.bulk_create([
  645. PowerPort(device=device, name='Power Port 1'),
  646. PowerPort(device=device, name='Power Port 2'),
  647. PowerPort(device=device, name='Power Port 3'),
  648. ])
  649. def test_powerport_list(self):
  650. url = reverse('dcim:powerport_list')
  651. response = self.client.get(url)
  652. self.assertHttpStatus(response, 200)
  653. def test_powerport_import(self):
  654. self.add_permissions('dcim.add_powerport')
  655. csv_data = (
  656. "device,name",
  657. "Device 1,Power Port 4",
  658. "Device 1,Power Port 5",
  659. "Device 1,Power Port 6",
  660. )
  661. response = self.client.post(reverse('dcim:powerport_import'), {'csv': '\n'.join(csv_data)})
  662. self.assertHttpStatus(response, 200)
  663. self.assertEqual(PowerPort.objects.count(), 6)
  664. # TODO: Convert to StandardTestCases.Views
  665. class PowerOutletTestCase(TestCase):
  666. user_permissions = (
  667. 'dcim.view_poweroutlet',
  668. )
  669. @classmethod
  670. def setUpTestData(cls):
  671. site = Site(name='Site 1', slug='site-1')
  672. site.save()
  673. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  674. manufacturer.save()
  675. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  676. devicetype.save()
  677. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  678. devicerole.save()
  679. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  680. device.save()
  681. PowerOutlet.objects.bulk_create([
  682. PowerOutlet(device=device, name='Power Outlet 1'),
  683. PowerOutlet(device=device, name='Power Outlet 2'),
  684. PowerOutlet(device=device, name='Power Outlet 3'),
  685. ])
  686. def test_poweroutlet_list(self):
  687. url = reverse('dcim:poweroutlet_list')
  688. response = self.client.get(url)
  689. self.assertHttpStatus(response, 200)
  690. def test_poweroutlet_import(self):
  691. self.add_permissions('dcim.add_poweroutlet')
  692. csv_data = (
  693. "device,name",
  694. "Device 1,Power Outlet 4",
  695. "Device 1,Power Outlet 5",
  696. "Device 1,Power Outlet 6",
  697. )
  698. response = self.client.post(reverse('dcim:poweroutlet_import'), {'csv': '\n'.join(csv_data)})
  699. self.assertHttpStatus(response, 200)
  700. self.assertEqual(PowerOutlet.objects.count(), 6)
  701. # TODO: Convert to StandardTestCases.Views
  702. class InterfaceTestCase(TestCase):
  703. user_permissions = (
  704. 'dcim.view_interface',
  705. )
  706. @classmethod
  707. def setUpTestData(cls):
  708. site = Site(name='Site 1', slug='site-1')
  709. site.save()
  710. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  711. manufacturer.save()
  712. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  713. devicetype.save()
  714. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  715. devicerole.save()
  716. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  717. device.save()
  718. Interface.objects.bulk_create([
  719. Interface(device=device, name='Interface 1'),
  720. Interface(device=device, name='Interface 2'),
  721. Interface(device=device, name='Interface 3'),
  722. ])
  723. def test_interface_list(self):
  724. url = reverse('dcim:interface_list')
  725. response = self.client.get(url)
  726. self.assertHttpStatus(response, 200)
  727. def test_interface_import(self):
  728. self.add_permissions('dcim.add_interface')
  729. csv_data = (
  730. "device,name,type",
  731. "Device 1,Interface 4,1000BASE-T (1GE)",
  732. "Device 1,Interface 5,1000BASE-T (1GE)",
  733. "Device 1,Interface 6,1000BASE-T (1GE)",
  734. )
  735. response = self.client.post(reverse('dcim:interface_import'), {'csv': '\n'.join(csv_data)})
  736. self.assertHttpStatus(response, 200)
  737. self.assertEqual(Interface.objects.count(), 6)
  738. # TODO: Convert to StandardTestCases.Views
  739. class FrontPortTestCase(TestCase):
  740. user_permissions = (
  741. 'dcim.view_frontport',
  742. )
  743. @classmethod
  744. def setUpTestData(cls):
  745. site = Site(name='Site 1', slug='site-1')
  746. site.save()
  747. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  748. manufacturer.save()
  749. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  750. devicetype.save()
  751. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  752. devicerole.save()
  753. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  754. device.save()
  755. rearport1 = RearPort(device=device, name='Rear Port 1')
  756. rearport1.save()
  757. rearport2 = RearPort(device=device, name='Rear Port 2')
  758. rearport2.save()
  759. rearport3 = RearPort(device=device, name='Rear Port 3')
  760. rearport3.save()
  761. # RearPorts for CSV import test
  762. RearPort(device=device, name='Rear Port 4').save()
  763. RearPort(device=device, name='Rear Port 5').save()
  764. RearPort(device=device, name='Rear Port 6').save()
  765. FrontPort.objects.bulk_create([
  766. FrontPort(device=device, name='Front Port 1', rear_port=rearport1),
  767. FrontPort(device=device, name='Front Port 2', rear_port=rearport2),
  768. FrontPort(device=device, name='Front Port 3', rear_port=rearport3),
  769. ])
  770. def test_frontport_list(self):
  771. url = reverse('dcim:frontport_list')
  772. response = self.client.get(url)
  773. self.assertHttpStatus(response, 200)
  774. def test_frontport_import(self):
  775. self.add_permissions('dcim.add_frontport')
  776. csv_data = (
  777. "device,name,type,rear_port,rear_port_position",
  778. "Device 1,Front Port 4,8P8C,Rear Port 4,1",
  779. "Device 1,Front Port 5,8P8C,Rear Port 5,1",
  780. "Device 1,Front Port 6,8P8C,Rear Port 6,1",
  781. )
  782. response = self.client.post(reverse('dcim:frontport_import'), {'csv': '\n'.join(csv_data)})
  783. self.assertHttpStatus(response, 200)
  784. self.assertEqual(FrontPort.objects.count(), 6)
  785. # TODO: Convert to StandardTestCases.Views
  786. class RearPortTestCase(TestCase):
  787. user_permissions = (
  788. 'dcim.view_rearport',
  789. )
  790. @classmethod
  791. def setUpTestData(cls):
  792. site = Site(name='Site 1', slug='site-1')
  793. site.save()
  794. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  795. manufacturer.save()
  796. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  797. devicetype.save()
  798. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  799. devicerole.save()
  800. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  801. device.save()
  802. RearPort.objects.bulk_create([
  803. RearPort(device=device, name='Rear Port 1'),
  804. RearPort(device=device, name='Rear Port 2'),
  805. RearPort(device=device, name='Rear Port 3'),
  806. ])
  807. def test_rearport_list(self):
  808. url = reverse('dcim:rearport_list')
  809. response = self.client.get(url)
  810. self.assertHttpStatus(response, 200)
  811. def test_rearport_import(self):
  812. self.add_permissions('dcim.add_rearport')
  813. csv_data = (
  814. "device,name,type,positions",
  815. "Device 1,Rear Port 4,8P8C,1",
  816. "Device 1,Rear Port 5,8P8C,1",
  817. "Device 1,Rear Port 6,8P8C,1",
  818. )
  819. response = self.client.post(reverse('dcim:rearport_import'), {'csv': '\n'.join(csv_data)})
  820. self.assertHttpStatus(response, 200)
  821. self.assertEqual(RearPort.objects.count(), 6)
  822. # TODO: Convert to StandardTestCases.Views
  823. class DeviceBayTestCase(TestCase):
  824. user_permissions = (
  825. 'dcim.view_devicebay',
  826. )
  827. @classmethod
  828. def setUpTestData(cls):
  829. site = Site(name='Site 1', slug='site-1')
  830. site.save()
  831. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  832. manufacturer.save()
  833. devicetype = DeviceType(
  834. model='Device Type 1',
  835. manufacturer=manufacturer,
  836. subdevice_role=SubdeviceRoleChoices.ROLE_PARENT
  837. )
  838. devicetype.save()
  839. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  840. devicerole.save()
  841. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  842. device.save()
  843. DeviceBay.objects.bulk_create([
  844. DeviceBay(device=device, name='Device Bay 1'),
  845. DeviceBay(device=device, name='Device Bay 2'),
  846. DeviceBay(device=device, name='Device Bay 3'),
  847. ])
  848. def test_devicebay_list(self):
  849. url = reverse('dcim:devicebay_list')
  850. response = self.client.get(url)
  851. self.assertHttpStatus(response, 200)
  852. def test_devicebay_import(self):
  853. self.add_permissions('dcim.add_devicebay')
  854. csv_data = (
  855. "device,name",
  856. "Device 1,Device Bay 4",
  857. "Device 1,Device Bay 5",
  858. "Device 1,Device Bay 6",
  859. )
  860. response = self.client.post(reverse('dcim:devicebay_import'), {'csv': '\n'.join(csv_data)})
  861. self.assertHttpStatus(response, 200)
  862. self.assertEqual(DeviceBay.objects.count(), 6)
  863. # TODO: Convert to StandardTestCases.Views
  864. class InventoryItemTestCase(TestCase):
  865. user_permissions = (
  866. 'dcim.view_inventoryitem',
  867. )
  868. @classmethod
  869. def setUpTestData(cls):
  870. site = Site(name='Site 1', slug='site-1')
  871. site.save()
  872. manufacturer = Manufacturer(name='Manufacturer 1', slug='manufacturer-1')
  873. manufacturer.save()
  874. devicetype = DeviceType(model='Device Type 1', manufacturer=manufacturer)
  875. devicetype.save()
  876. devicerole = DeviceRole(name='Device Role 1', slug='device-role-1')
  877. devicerole.save()
  878. device = Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
  879. device.save()
  880. InventoryItem.objects.bulk_create([
  881. InventoryItem(device=device, name='Inventory Item 1'),
  882. InventoryItem(device=device, name='Inventory Item 2'),
  883. InventoryItem(device=device, name='Inventory Item 3'),
  884. ])
  885. def test_inventoryitem_list(self):
  886. url = reverse('dcim:inventoryitem_list')
  887. params = {
  888. "device_id": Device.objects.first().pk,
  889. }
  890. response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params)))
  891. self.assertHttpStatus(response, 200)
  892. def test_inventoryitem_import(self):
  893. self.add_permissions('dcim.add_inventoryitem')
  894. csv_data = (
  895. "device,name",
  896. "Device 1,Inventory Item 4",
  897. "Device 1,Inventory Item 5",
  898. "Device 1,Inventory Item 6",
  899. )
  900. response = self.client.post(reverse('dcim:inventoryitem_import'), {'csv': '\n'.join(csv_data)})
  901. self.assertHttpStatus(response, 200)
  902. self.assertEqual(InventoryItem.objects.count(), 6)
  903. class CableTestCase(StandardTestCases.Views):
  904. model = Cable
  905. # TODO: Creation URL needs termination context
  906. test_create_object = None
  907. @classmethod
  908. def setUpTestData(cls):
  909. site = Site.objects.create(name='Site 1', slug='site-1')
  910. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  911. devicetype = DeviceType.objects.create(model='Device Type 1', manufacturer=manufacturer)
  912. devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
  913. devices = (
  914. Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole),
  915. Device(name='Device 2', site=site, device_type=devicetype, device_role=devicerole),
  916. Device(name='Device 3', site=site, device_type=devicetype, device_role=devicerole),
  917. Device(name='Device 4', site=site, device_type=devicetype, device_role=devicerole),
  918. )
  919. Device.objects.bulk_create(devices)
  920. interfaces = (
  921. Interface(device=devices[0], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  922. Interface(device=devices[0], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  923. Interface(device=devices[0], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  924. Interface(device=devices[1], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  925. Interface(device=devices[1], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  926. Interface(device=devices[1], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  927. Interface(device=devices[2], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  928. Interface(device=devices[2], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  929. Interface(device=devices[2], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  930. Interface(device=devices[3], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  931. Interface(device=devices[3], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  932. Interface(device=devices[3], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  933. )
  934. Interface.objects.bulk_create(interfaces)
  935. Cable(termination_a=interfaces[0], termination_b=interfaces[3], type=CableTypeChoices.TYPE_CAT6).save()
  936. Cable(termination_a=interfaces[1], termination_b=interfaces[4], type=CableTypeChoices.TYPE_CAT6).save()
  937. Cable(termination_a=interfaces[2], termination_b=interfaces[5], type=CableTypeChoices.TYPE_CAT6).save()
  938. interface_ct = ContentType.objects.get_for_model(Interface)
  939. cls.form_data = {
  940. # Changing terminations not supported when editing an existing Cable
  941. 'termination_a_type': interface_ct.pk,
  942. 'termination_a_id': interfaces[0].pk,
  943. 'termination_b_type': interface_ct.pk,
  944. 'termination_b_id': interfaces[3].pk,
  945. 'type': CableTypeChoices.TYPE_CAT6,
  946. 'status': CableStatusChoices.STATUS_PLANNED,
  947. 'label': 'Label',
  948. 'color': 'c0c0c0',
  949. 'length': 100,
  950. 'length_unit': CableLengthUnitChoices.UNIT_FOOT,
  951. }
  952. cls.csv_data = (
  953. "side_a_device,side_a_type,side_a_name,side_b_device,side_b_type,side_b_name",
  954. "Device 3,interface,Interface 1,Device 4,interface,Interface 1",
  955. "Device 3,interface,Interface 2,Device 4,interface,Interface 2",
  956. "Device 3,interface,Interface 3,Device 4,interface,Interface 3",
  957. )
  958. cls.bulk_edit_data = {
  959. 'type': CableTypeChoices.TYPE_CAT5E,
  960. 'status': CableStatusChoices.STATUS_CONNECTED,
  961. 'label': 'New label',
  962. 'color': '00ff00',
  963. 'length': 50,
  964. 'length_unit': CableLengthUnitChoices.UNIT_METER,
  965. }
  966. class VirtualChassisTestCase(StandardTestCases.Views):
  967. model = VirtualChassis
  968. # Disable inapplicable tests
  969. test_get_object = None
  970. test_import_objects = None
  971. test_bulk_edit_objects = None
  972. test_bulk_delete_objects = None
  973. # TODO: Requires special form handling
  974. test_create_object = None
  975. test_edit_object = None
  976. @classmethod
  977. def setUpTestData(cls):
  978. site = Site.objects.create(name='Site 1', slug='site-1')
  979. manufacturer = Manufacturer.objects.create(name='Manufacturer', slug='manufacturer-1')
  980. device_type = DeviceType.objects.create(
  981. manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'
  982. )
  983. device_role = DeviceRole.objects.create(
  984. name='Device Role', slug='device-role-1'
  985. )
  986. # Create 9 member Devices
  987. device1 = Device.objects.create(
  988. device_type=device_type, device_role=device_role, name='Device 1', site=site
  989. )
  990. device2 = Device.objects.create(
  991. device_type=device_type, device_role=device_role, name='Device 2', site=site
  992. )
  993. device3 = Device.objects.create(
  994. device_type=device_type, device_role=device_role, name='Device 3', site=site
  995. )
  996. device4 = Device.objects.create(
  997. device_type=device_type, device_role=device_role, name='Device 4', site=site
  998. )
  999. device5 = Device.objects.create(
  1000. device_type=device_type, device_role=device_role, name='Device 5', site=site
  1001. )
  1002. device6 = Device.objects.create(
  1003. device_type=device_type, device_role=device_role, name='Device 6', site=site
  1004. )
  1005. # Create three VirtualChassis with two members each
  1006. vc1 = VirtualChassis.objects.create(master=device1, domain='test-domain-1')
  1007. Device.objects.filter(pk=device2.pk).update(virtual_chassis=vc1, vc_position=2)
  1008. vc2 = VirtualChassis.objects.create(master=device3, domain='test-domain-2')
  1009. Device.objects.filter(pk=device4.pk).update(virtual_chassis=vc2, vc_position=2)
  1010. vc3 = VirtualChassis.objects.create(master=device5, domain='test-domain-3')
  1011. Device.objects.filter(pk=device6.pk).update(virtual_chassis=vc3, vc_position=2)
  1012. class PowerPanelTestCase(StandardTestCases.Views):
  1013. model = PowerPanel
  1014. # Disable inapplicable tests
  1015. test_bulk_edit_objects = None
  1016. @classmethod
  1017. def setUpTestData(cls):
  1018. sites = (
  1019. Site(name='Site 1', slug='site-1'),
  1020. Site(name='Site 2', slug='site-2'),
  1021. )
  1022. Site.objects.bulk_create(sites)
  1023. rackgroups = (
  1024. RackGroup(name='Rack Group 1', slug='rack-group-1', site=sites[0]),
  1025. RackGroup(name='Rack Group 2', slug='rack-group-2', site=sites[1]),
  1026. )
  1027. RackGroup.objects.bulk_create(rackgroups)
  1028. PowerPanel.objects.bulk_create((
  1029. PowerPanel(site=sites[0], rack_group=rackgroups[0], name='Power Panel 1'),
  1030. PowerPanel(site=sites[0], rack_group=rackgroups[0], name='Power Panel 2'),
  1031. PowerPanel(site=sites[0], rack_group=rackgroups[0], name='Power Panel 3'),
  1032. ))
  1033. cls.form_data = {
  1034. 'site': sites[1].pk,
  1035. 'rack_group': rackgroups[1].pk,
  1036. 'name': 'Power Panel X',
  1037. }
  1038. cls.csv_data = (
  1039. "site,rack_group_name,name",
  1040. "Site 1,Rack Group 1,Power Panel 4",
  1041. "Site 1,Rack Group 1,Power Panel 5",
  1042. "Site 1,Rack Group 1,Power Panel 6",
  1043. )
  1044. class PowerFeedTestCase(StandardTestCases.Views):
  1045. model = PowerFeed
  1046. @classmethod
  1047. def setUpTestData(cls):
  1048. site = Site.objects.create(name='Site 1', slug='site-1')
  1049. powerpanels = (
  1050. PowerPanel(site=site, name='Power Panel 1'),
  1051. PowerPanel(site=site, name='Power Panel 2'),
  1052. )
  1053. PowerPanel.objects.bulk_create(powerpanels)
  1054. racks = (
  1055. Rack(site=site, name='Rack 1'),
  1056. Rack(site=site, name='Rack 2'),
  1057. )
  1058. Rack.objects.bulk_create(racks)
  1059. PowerFeed.objects.bulk_create((
  1060. PowerFeed(name='Power Feed 1', power_panel=powerpanels[0], rack=racks[0]),
  1061. PowerFeed(name='Power Feed 2', power_panel=powerpanels[0], rack=racks[0]),
  1062. PowerFeed(name='Power Feed 3', power_panel=powerpanels[0], rack=racks[0]),
  1063. ))
  1064. cls.form_data = {
  1065. 'name': 'Power Feed X',
  1066. 'power_panel': powerpanels[1].pk,
  1067. 'rack': racks[1].pk,
  1068. 'status': PowerFeedStatusChoices.STATUS_PLANNED,
  1069. 'type': PowerFeedTypeChoices.TYPE_REDUNDANT,
  1070. 'supply': PowerFeedSupplyChoices.SUPPLY_DC,
  1071. 'phase': PowerFeedPhaseChoices.PHASE_3PHASE,
  1072. 'voltage': 100,
  1073. 'amperage': 100,
  1074. 'max_utilization': 50,
  1075. 'comments': 'New comments',
  1076. 'tags': 'Alpha,Bravo,Charlie',
  1077. # Connection
  1078. 'cable': None,
  1079. 'connected_endpoint': None,
  1080. 'connection_status': None,
  1081. }
  1082. cls.csv_data = (
  1083. "site,panel_name,name,voltage,amperage,max_utilization",
  1084. "Site 1,Power Panel 1,Power Feed 4,120,20,80",
  1085. "Site 1,Power Panel 1,Power Feed 5,120,20,80",
  1086. "Site 1,Power Panel 1,Power Feed 6,120,20,80",
  1087. )
  1088. cls.bulk_edit_data = {
  1089. 'power_panel': powerpanels[1].pk,
  1090. 'rack': racks[1].pk,
  1091. 'status': PowerFeedStatusChoices.STATUS_PLANNED,
  1092. 'type': PowerFeedTypeChoices.TYPE_REDUNDANT,
  1093. 'supply': PowerFeedSupplyChoices.SUPPLY_DC,
  1094. 'phase': PowerFeedPhaseChoices.PHASE_3PHASE,
  1095. 'voltage': 100,
  1096. 'amperage': 100,
  1097. 'max_utilization': 50,
  1098. 'comments': 'New comments',
  1099. }