test_views.py 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746
  1. from decimal import Decimal
  2. import pytz
  3. import yaml
  4. from django.contrib.auth.models import User
  5. from django.contrib.contenttypes.models import ContentType
  6. from django.urls import reverse
  7. from netaddr import EUI
  8. from dcim.choices import *
  9. from dcim.constants import *
  10. from dcim.models import *
  11. from ipam.models import VLAN
  12. from utilities.testing import ViewTestCases
  13. def create_test_device(name):
  14. """
  15. Convenience method for creating a Device (e.g. for component testing).
  16. """
  17. site, _ = Site.objects.get_or_create(name='Site 1', slug='site-1')
  18. manufacturer, _ = Manufacturer.objects.get_or_create(name='Manufacturer 1', slug='manufacturer-1')
  19. devicetype, _ = DeviceType.objects.get_or_create(model='Device Type 1', manufacturer=manufacturer)
  20. devicerole, _ = DeviceRole.objects.get_or_create(name='Device Role 1', slug='device-role-1')
  21. device = Device.objects.create(name=name, site=site, device_type=devicetype, device_role=devicerole)
  22. return device
  23. class RegionTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  24. model = Region
  25. @classmethod
  26. def setUpTestData(cls):
  27. # Create three Regions
  28. regions = (
  29. Region(name='Region 1', slug='region-1'),
  30. Region(name='Region 2', slug='region-2'),
  31. Region(name='Region 3', slug='region-3'),
  32. )
  33. for region in regions:
  34. region.save()
  35. cls.form_data = {
  36. 'name': 'Region X',
  37. 'slug': 'region-x',
  38. 'parent': regions[2].pk,
  39. 'description': 'A new region',
  40. }
  41. cls.csv_data = (
  42. "name,slug,description",
  43. "Region 4,region-4,Fourth region",
  44. "Region 5,region-5,Fifth region",
  45. "Region 6,region-6,Sixth region",
  46. )
  47. class SiteTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  48. model = Site
  49. @classmethod
  50. def setUpTestData(cls):
  51. regions = (
  52. Region(name='Region 1', slug='region-1'),
  53. Region(name='Region 2', slug='region-2'),
  54. )
  55. for region in regions:
  56. region.save()
  57. Site.objects.bulk_create([
  58. Site(name='Site 1', slug='site-1', region=regions[0]),
  59. Site(name='Site 2', slug='site-2', region=regions[0]),
  60. Site(name='Site 3', slug='site-3', region=regions[0]),
  61. ])
  62. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  63. cls.form_data = {
  64. 'name': 'Site X',
  65. 'slug': 'site-x',
  66. 'status': SiteStatusChoices.STATUS_PLANNED,
  67. 'region': regions[1].pk,
  68. 'tenant': None,
  69. 'facility': 'Facility X',
  70. 'asn': 65001,
  71. 'time_zone': pytz.UTC,
  72. 'description': 'Site description',
  73. 'physical_address': '742 Evergreen Terrace, Springfield, USA',
  74. 'shipping_address': '742 Evergreen Terrace, Springfield, USA',
  75. 'latitude': Decimal('35.780000'),
  76. 'longitude': Decimal('-78.642000'),
  77. 'contact_name': 'Hank Hill',
  78. 'contact_phone': '123-555-9999',
  79. 'contact_email': 'hank@stricklandpropane.com',
  80. 'comments': 'Test site',
  81. 'tags': [t.pk for t in tags],
  82. }
  83. cls.csv_data = (
  84. "name,slug",
  85. "Site 4,site-4",
  86. "Site 5,site-5",
  87. "Site 6,site-6",
  88. )
  89. cls.bulk_edit_data = {
  90. 'status': SiteStatusChoices.STATUS_PLANNED,
  91. 'region': regions[1].pk,
  92. 'tenant': None,
  93. 'asn': 65009,
  94. 'time_zone': pytz.timezone('US/Eastern'),
  95. 'description': 'New description',
  96. }
  97. class RackGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  98. model = RackGroup
  99. @classmethod
  100. def setUpTestData(cls):
  101. site = Site(name='Site 1', slug='site-1')
  102. site.save()
  103. rack_groups = (
  104. RackGroup(name='Rack Group 1', slug='rack-group-1', site=site),
  105. RackGroup(name='Rack Group 2', slug='rack-group-2', site=site),
  106. RackGroup(name='Rack Group 3', slug='rack-group-3', site=site),
  107. )
  108. for rackgroup in rack_groups:
  109. rackgroup.save()
  110. cls.form_data = {
  111. 'name': 'Rack Group X',
  112. 'slug': 'rack-group-x',
  113. 'site': site.pk,
  114. 'description': 'A new rack group',
  115. }
  116. cls.csv_data = (
  117. "site,name,slug,description",
  118. "Site 1,Rack Group 4,rack-group-4,Fourth rack group",
  119. "Site 1,Rack Group 5,rack-group-5,Fifth rack group",
  120. "Site 1,Rack Group 6,rack-group-6,Sixth rack group",
  121. )
  122. class RackRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  123. model = RackRole
  124. @classmethod
  125. def setUpTestData(cls):
  126. RackRole.objects.bulk_create([
  127. RackRole(name='Rack Role 1', slug='rack-role-1'),
  128. RackRole(name='Rack Role 2', slug='rack-role-2'),
  129. RackRole(name='Rack Role 3', slug='rack-role-3'),
  130. ])
  131. cls.form_data = {
  132. 'name': 'Rack Role X',
  133. 'slug': 'rack-role-x',
  134. 'color': 'c0c0c0',
  135. 'description': 'New role',
  136. }
  137. cls.csv_data = (
  138. "name,slug,color",
  139. "Rack Role 4,rack-role-4,ff0000",
  140. "Rack Role 5,rack-role-5,00ff00",
  141. "Rack Role 6,rack-role-6,0000ff",
  142. )
  143. class RackReservationTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  144. model = RackReservation
  145. @classmethod
  146. def setUpTestData(cls):
  147. user2 = User.objects.create_user(username='testuser2')
  148. user3 = User.objects.create_user(username='testuser3')
  149. site = Site.objects.create(name='Site 1', slug='site-1')
  150. rack_group = RackGroup(name='Rack Group 1', slug='rack-group-1', site=site)
  151. rack_group.save()
  152. rack = Rack(name='Rack 1', site=site, group=rack_group)
  153. rack.save()
  154. RackReservation.objects.bulk_create([
  155. RackReservation(rack=rack, user=user2, units=[1, 2, 3], description='Reservation 1'),
  156. RackReservation(rack=rack, user=user2, units=[4, 5, 6], description='Reservation 2'),
  157. RackReservation(rack=rack, user=user2, units=[7, 8, 9], description='Reservation 3'),
  158. ])
  159. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  160. cls.form_data = {
  161. 'rack': rack.pk,
  162. 'units': "10,11,12",
  163. 'user': user3.pk,
  164. 'tenant': None,
  165. 'description': 'Rack reservation',
  166. 'tags': [t.pk for t in tags],
  167. }
  168. cls.csv_data = (
  169. 'site,rack_group,rack,units,description',
  170. 'Site 1,Rack Group 1,Rack 1,"10,11,12",Reservation 1',
  171. 'Site 1,Rack Group 1,Rack 1,"13,14,15",Reservation 2',
  172. 'Site 1,Rack Group 1,Rack 1,"16,17,18",Reservation 3',
  173. )
  174. cls.bulk_edit_data = {
  175. 'user': user3.pk,
  176. 'tenant': None,
  177. 'description': 'New description',
  178. }
  179. class RackTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  180. model = Rack
  181. @classmethod
  182. def setUpTestData(cls):
  183. sites = (
  184. Site(name='Site 1', slug='site-1'),
  185. Site(name='Site 2', slug='site-2'),
  186. )
  187. Site.objects.bulk_create(sites)
  188. rackgroups = (
  189. RackGroup(name='Rack Group 1', slug='rack-group-1', site=sites[0]),
  190. RackGroup(name='Rack Group 2', slug='rack-group-2', site=sites[1])
  191. )
  192. for rackgroup in rackgroups:
  193. rackgroup.save()
  194. rackroles = (
  195. RackRole(name='Rack Role 1', slug='rack-role-1'),
  196. RackRole(name='Rack Role 2', slug='rack-role-2'),
  197. )
  198. RackRole.objects.bulk_create(rackroles)
  199. Rack.objects.bulk_create((
  200. Rack(name='Rack 1', site=sites[0]),
  201. Rack(name='Rack 2', site=sites[0]),
  202. Rack(name='Rack 3', site=sites[0]),
  203. ))
  204. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  205. cls.form_data = {
  206. 'name': 'Rack X',
  207. 'facility_id': 'Facility X',
  208. 'site': sites[1].pk,
  209. 'group': rackgroups[1].pk,
  210. 'tenant': None,
  211. 'status': RackStatusChoices.STATUS_PLANNED,
  212. 'role': rackroles[1].pk,
  213. 'serial': '123456',
  214. 'asset_tag': 'ABCDEF',
  215. 'type': RackTypeChoices.TYPE_CABINET,
  216. 'width': RackWidthChoices.WIDTH_19IN,
  217. 'u_height': 48,
  218. 'desc_units': False,
  219. 'outer_width': 500,
  220. 'outer_depth': 500,
  221. 'outer_unit': RackDimensionUnitChoices.UNIT_MILLIMETER,
  222. 'comments': 'Some comments',
  223. 'tags': [t.pk for t in tags],
  224. }
  225. cls.csv_data = (
  226. "site,group,name,width,u_height",
  227. "Site 1,,Rack 4,19,42",
  228. "Site 1,Rack Group 1,Rack 5,19,42",
  229. "Site 2,Rack Group 2,Rack 6,19,42",
  230. )
  231. cls.bulk_edit_data = {
  232. 'site': sites[1].pk,
  233. 'group': rackgroups[1].pk,
  234. 'tenant': None,
  235. 'status': RackStatusChoices.STATUS_DEPRECATED,
  236. 'role': rackroles[1].pk,
  237. 'serial': '654321',
  238. 'type': RackTypeChoices.TYPE_4POST,
  239. 'width': RackWidthChoices.WIDTH_23IN,
  240. 'u_height': 49,
  241. 'desc_units': True,
  242. 'outer_width': 30,
  243. 'outer_depth': 30,
  244. 'outer_unit': RackDimensionUnitChoices.UNIT_INCH,
  245. 'comments': 'New comments',
  246. }
  247. class ManufacturerTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  248. model = Manufacturer
  249. @classmethod
  250. def setUpTestData(cls):
  251. Manufacturer.objects.bulk_create([
  252. Manufacturer(name='Manufacturer 1', slug='manufacturer-1'),
  253. Manufacturer(name='Manufacturer 2', slug='manufacturer-2'),
  254. Manufacturer(name='Manufacturer 3', slug='manufacturer-3'),
  255. ])
  256. cls.form_data = {
  257. 'name': 'Manufacturer X',
  258. 'slug': 'manufacturer-x',
  259. 'description': 'A new manufacturer',
  260. }
  261. cls.csv_data = (
  262. "name,slug,description",
  263. "Manufacturer 4,manufacturer-4,Fourth manufacturer",
  264. "Manufacturer 5,manufacturer-5,Fifth manufacturer",
  265. "Manufacturer 6,manufacturer-6,Sixth manufacturer",
  266. )
  267. # TODO: Change base class to PrimaryObjectViewTestCase
  268. # Blocked by absence of bulk import view for DeviceTypes
  269. class DeviceTypeTestCase(
  270. ViewTestCases.GetObjectViewTestCase,
  271. ViewTestCases.CreateObjectViewTestCase,
  272. ViewTestCases.EditObjectViewTestCase,
  273. ViewTestCases.DeleteObjectViewTestCase,
  274. ViewTestCases.ListObjectsViewTestCase,
  275. ViewTestCases.BulkEditObjectsViewTestCase,
  276. ViewTestCases.BulkDeleteObjectsViewTestCase
  277. ):
  278. model = DeviceType
  279. @classmethod
  280. def setUpTestData(cls):
  281. manufacturers = (
  282. Manufacturer(name='Manufacturer 1', slug='manufacturer-1'),
  283. Manufacturer(name='Manufacturer 2', slug='manufacturer-2')
  284. )
  285. Manufacturer.objects.bulk_create(manufacturers)
  286. DeviceType.objects.bulk_create([
  287. DeviceType(model='Device Type 1', slug='device-type-1', manufacturer=manufacturers[0]),
  288. DeviceType(model='Device Type 2', slug='device-type-2', manufacturer=manufacturers[0]),
  289. DeviceType(model='Device Type 3', slug='device-type-3', manufacturer=manufacturers[0]),
  290. ])
  291. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  292. cls.form_data = {
  293. 'manufacturer': manufacturers[1].pk,
  294. 'model': 'Device Type X',
  295. 'slug': 'device-type-x',
  296. 'part_number': '123ABC',
  297. 'u_height': 2,
  298. 'is_full_depth': True,
  299. 'subdevice_role': '', # CharField
  300. 'comments': 'Some comments',
  301. 'tags': [t.pk for t in tags],
  302. }
  303. cls.bulk_edit_data = {
  304. 'manufacturer': manufacturers[1].pk,
  305. 'u_height': 3,
  306. 'is_full_depth': False,
  307. }
  308. def test_import_objects(self):
  309. """
  310. Custom import test for YAML-based imports (versus CSV)
  311. """
  312. IMPORT_DATA = """
  313. manufacturer: Generic
  314. model: TEST-1000
  315. slug: test-1000
  316. u_height: 2
  317. comments: test comment
  318. console-ports:
  319. - name: Console Port 1
  320. type: de-9
  321. - name: Console Port 2
  322. type: de-9
  323. - name: Console Port 3
  324. type: de-9
  325. console-server-ports:
  326. - name: Console Server Port 1
  327. type: rj-45
  328. - name: Console Server Port 2
  329. type: rj-45
  330. - name: Console Server Port 3
  331. type: rj-45
  332. power-ports:
  333. - name: Power Port 1
  334. type: iec-60320-c14
  335. - name: Power Port 2
  336. type: iec-60320-c14
  337. - name: Power Port 3
  338. type: iec-60320-c14
  339. power-outlets:
  340. - name: Power Outlet 1
  341. type: iec-60320-c13
  342. power_port: Power Port 1
  343. feed_leg: A
  344. - name: Power Outlet 2
  345. type: iec-60320-c13
  346. power_port: Power Port 1
  347. feed_leg: A
  348. - name: Power Outlet 3
  349. type: iec-60320-c13
  350. power_port: Power Port 1
  351. feed_leg: A
  352. interfaces:
  353. - name: Interface 1
  354. type: 1000base-t
  355. mgmt_only: true
  356. - name: Interface 2
  357. type: 1000base-t
  358. - name: Interface 3
  359. type: 1000base-t
  360. rear-ports:
  361. - name: Rear Port 1
  362. type: 8p8c
  363. - name: Rear Port 2
  364. type: 8p8c
  365. - name: Rear Port 3
  366. type: 8p8c
  367. front-ports:
  368. - name: Front Port 1
  369. type: 8p8c
  370. rear_port: Rear Port 1
  371. - name: Front Port 2
  372. type: 8p8c
  373. rear_port: Rear Port 2
  374. - name: Front Port 3
  375. type: 8p8c
  376. rear_port: Rear Port 3
  377. device-bays:
  378. - name: Device Bay 1
  379. - name: Device Bay 2
  380. - name: Device Bay 3
  381. """
  382. # Create the manufacturer
  383. Manufacturer(name='Generic', slug='generic').save()
  384. # Add all required permissions to the test user
  385. self.add_permissions(
  386. 'dcim.view_devicetype',
  387. 'dcim.add_devicetype',
  388. 'dcim.add_consoleporttemplate',
  389. 'dcim.add_consoleserverporttemplate',
  390. 'dcim.add_powerporttemplate',
  391. 'dcim.add_poweroutlettemplate',
  392. 'dcim.add_interfacetemplate',
  393. 'dcim.add_frontporttemplate',
  394. 'dcim.add_rearporttemplate',
  395. 'dcim.add_devicebaytemplate',
  396. )
  397. form_data = {
  398. 'data': IMPORT_DATA,
  399. 'format': 'yaml'
  400. }
  401. response = self.client.post(reverse('dcim:devicetype_import'), data=form_data, follow=True)
  402. self.assertHttpStatus(response, 200)
  403. dt = DeviceType.objects.get(model='TEST-1000')
  404. self.assertEqual(dt.comments, 'test comment')
  405. # Verify all of the components were created
  406. self.assertEqual(dt.consoleport_templates.count(), 3)
  407. cp1 = ConsolePortTemplate.objects.first()
  408. self.assertEqual(cp1.name, 'Console Port 1')
  409. self.assertEqual(cp1.type, ConsolePortTypeChoices.TYPE_DE9)
  410. self.assertEqual(dt.consoleserverport_templates.count(), 3)
  411. csp1 = ConsoleServerPortTemplate.objects.first()
  412. self.assertEqual(csp1.name, 'Console Server Port 1')
  413. self.assertEqual(csp1.type, ConsolePortTypeChoices.TYPE_RJ45)
  414. self.assertEqual(dt.powerport_templates.count(), 3)
  415. pp1 = PowerPortTemplate.objects.first()
  416. self.assertEqual(pp1.name, 'Power Port 1')
  417. self.assertEqual(pp1.type, PowerPortTypeChoices.TYPE_IEC_C14)
  418. self.assertEqual(dt.poweroutlet_templates.count(), 3)
  419. po1 = PowerOutletTemplate.objects.first()
  420. self.assertEqual(po1.name, 'Power Outlet 1')
  421. self.assertEqual(po1.type, PowerOutletTypeChoices.TYPE_IEC_C13)
  422. self.assertEqual(po1.power_port, pp1)
  423. self.assertEqual(po1.feed_leg, PowerOutletFeedLegChoices.FEED_LEG_A)
  424. self.assertEqual(dt.interface_templates.count(), 3)
  425. iface1 = InterfaceTemplate.objects.first()
  426. self.assertEqual(iface1.name, 'Interface 1')
  427. self.assertEqual(iface1.type, InterfaceTypeChoices.TYPE_1GE_FIXED)
  428. self.assertTrue(iface1.mgmt_only)
  429. self.assertEqual(dt.rearport_templates.count(), 3)
  430. rp1 = RearPortTemplate.objects.first()
  431. self.assertEqual(rp1.name, 'Rear Port 1')
  432. self.assertEqual(dt.frontport_templates.count(), 3)
  433. fp1 = FrontPortTemplate.objects.first()
  434. self.assertEqual(fp1.name, 'Front Port 1')
  435. self.assertEqual(fp1.rear_port, rp1)
  436. self.assertEqual(fp1.rear_port_position, 1)
  437. self.assertEqual(dt.device_bay_templates.count(), 3)
  438. db1 = DeviceBayTemplate.objects.first()
  439. self.assertEqual(db1.name, 'Device Bay 1')
  440. def test_devicetype_export(self):
  441. url = reverse('dcim:devicetype_list')
  442. self.add_permissions('dcim.view_devicetype')
  443. response = self.client.get('{}?export'.format(url))
  444. self.assertEqual(response.status_code, 200)
  445. data = list(yaml.load_all(response.content, Loader=yaml.SafeLoader))
  446. self.assertEqual(len(data), 3)
  447. self.assertEqual(data[0]['manufacturer'], 'Manufacturer 1')
  448. self.assertEqual(data[0]['model'], 'Device Type 1')
  449. #
  450. # DeviceType components
  451. #
  452. class ConsolePortTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase):
  453. model = ConsolePortTemplate
  454. @classmethod
  455. def setUpTestData(cls):
  456. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  457. devicetypes = (
  458. DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'),
  459. DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'),
  460. )
  461. DeviceType.objects.bulk_create(devicetypes)
  462. ConsolePortTemplate.objects.bulk_create((
  463. ConsolePortTemplate(device_type=devicetypes[0], name='Console Port Template 1'),
  464. ConsolePortTemplate(device_type=devicetypes[0], name='Console Port Template 2'),
  465. ConsolePortTemplate(device_type=devicetypes[0], name='Console Port Template 3'),
  466. ))
  467. cls.form_data = {
  468. 'device_type': devicetypes[1].pk,
  469. 'name': 'Console Port Template X',
  470. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  471. }
  472. cls.bulk_create_data = {
  473. 'device_type': devicetypes[1].pk,
  474. 'name_pattern': 'Console Port Template [4-6]',
  475. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  476. }
  477. cls.bulk_edit_data = {
  478. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  479. }
  480. class ConsoleServerPortTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase):
  481. model = ConsoleServerPortTemplate
  482. @classmethod
  483. def setUpTestData(cls):
  484. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  485. devicetypes = (
  486. DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'),
  487. DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'),
  488. )
  489. DeviceType.objects.bulk_create(devicetypes)
  490. ConsoleServerPortTemplate.objects.bulk_create((
  491. ConsoleServerPortTemplate(device_type=devicetypes[0], name='Console Server Port Template 1'),
  492. ConsoleServerPortTemplate(device_type=devicetypes[0], name='Console Server Port Template 2'),
  493. ConsoleServerPortTemplate(device_type=devicetypes[0], name='Console Server Port Template 3'),
  494. ))
  495. cls.form_data = {
  496. 'device_type': devicetypes[1].pk,
  497. 'name': 'Console Server Port Template X',
  498. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  499. }
  500. cls.bulk_create_data = {
  501. 'device_type': devicetypes[1].pk,
  502. 'name_pattern': 'Console Server Port Template [4-6]',
  503. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  504. }
  505. cls.bulk_edit_data = {
  506. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  507. }
  508. class PowerPortTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase):
  509. model = PowerPortTemplate
  510. @classmethod
  511. def setUpTestData(cls):
  512. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  513. devicetypes = (
  514. DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'),
  515. DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'),
  516. )
  517. DeviceType.objects.bulk_create(devicetypes)
  518. PowerPortTemplate.objects.bulk_create((
  519. PowerPortTemplate(device_type=devicetypes[0], name='Power Port Template 1'),
  520. PowerPortTemplate(device_type=devicetypes[0], name='Power Port Template 2'),
  521. PowerPortTemplate(device_type=devicetypes[0], name='Power Port Template 3'),
  522. ))
  523. cls.form_data = {
  524. 'device_type': devicetypes[1].pk,
  525. 'name': 'Power Port Template X',
  526. 'type': PowerPortTypeChoices.TYPE_IEC_C14,
  527. 'maximum_draw': 100,
  528. 'allocated_draw': 50,
  529. }
  530. cls.bulk_create_data = {
  531. 'device_type': devicetypes[1].pk,
  532. 'name_pattern': 'Power Port Template [4-6]',
  533. 'type': PowerPortTypeChoices.TYPE_IEC_C14,
  534. 'maximum_draw': 100,
  535. 'allocated_draw': 50,
  536. }
  537. cls.bulk_edit_data = {
  538. 'type': PowerPortTypeChoices.TYPE_IEC_C14,
  539. 'maximum_draw': 100,
  540. 'allocated_draw': 50,
  541. }
  542. class PowerOutletTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase):
  543. model = PowerOutletTemplate
  544. @classmethod
  545. def setUpTestData(cls):
  546. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  547. devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
  548. PowerOutletTemplate.objects.bulk_create((
  549. PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 1'),
  550. PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 2'),
  551. PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 3'),
  552. ))
  553. powerports = (
  554. PowerPortTemplate(device_type=devicetype, name='Power Port Template 1'),
  555. )
  556. PowerPortTemplate.objects.bulk_create(powerports)
  557. cls.form_data = {
  558. 'device_type': devicetype.pk,
  559. 'name': 'Power Outlet Template X',
  560. 'type': PowerOutletTypeChoices.TYPE_IEC_C13,
  561. 'power_port': powerports[0].pk,
  562. 'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_B,
  563. }
  564. cls.bulk_create_data = {
  565. 'device_type': devicetype.pk,
  566. 'name_pattern': 'Power Outlet Template [4-6]',
  567. 'type': PowerOutletTypeChoices.TYPE_IEC_C13,
  568. 'power_port': powerports[0].pk,
  569. 'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_B,
  570. }
  571. cls.bulk_edit_data = {
  572. 'type': PowerOutletTypeChoices.TYPE_IEC_C13,
  573. 'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_B,
  574. }
  575. class InterfaceTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase):
  576. model = InterfaceTemplate
  577. @classmethod
  578. def setUpTestData(cls):
  579. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  580. devicetypes = (
  581. DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'),
  582. DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'),
  583. )
  584. DeviceType.objects.bulk_create(devicetypes)
  585. InterfaceTemplate.objects.bulk_create((
  586. InterfaceTemplate(device_type=devicetypes[0], name='Interface Template 1'),
  587. InterfaceTemplate(device_type=devicetypes[0], name='Interface Template 2'),
  588. InterfaceTemplate(device_type=devicetypes[0], name='Interface Template 3'),
  589. ))
  590. cls.form_data = {
  591. 'device_type': devicetypes[1].pk,
  592. 'name': 'Interface Template X',
  593. 'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
  594. 'mgmt_only': True,
  595. }
  596. cls.bulk_create_data = {
  597. 'device_type': devicetypes[1].pk,
  598. 'name_pattern': 'Interface Template [4-6]',
  599. # Test that a label can be applied to each generated interface templates
  600. 'label_pattern': 'Interface Template Label [3-5]',
  601. 'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
  602. 'mgmt_only': True,
  603. }
  604. cls.bulk_edit_data = {
  605. 'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
  606. 'mgmt_only': True,
  607. }
  608. class FrontPortTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase):
  609. model = FrontPortTemplate
  610. @classmethod
  611. def setUpTestData(cls):
  612. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  613. devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
  614. rearports = (
  615. RearPortTemplate(device_type=devicetype, name='Rear Port Template 1'),
  616. RearPortTemplate(device_type=devicetype, name='Rear Port Template 2'),
  617. RearPortTemplate(device_type=devicetype, name='Rear Port Template 3'),
  618. RearPortTemplate(device_type=devicetype, name='Rear Port Template 4'),
  619. RearPortTemplate(device_type=devicetype, name='Rear Port Template 5'),
  620. RearPortTemplate(device_type=devicetype, name='Rear Port Template 6'),
  621. )
  622. RearPortTemplate.objects.bulk_create(rearports)
  623. FrontPortTemplate.objects.bulk_create((
  624. FrontPortTemplate(device_type=devicetype, name='Front Port Template 1', rear_port=rearports[0], rear_port_position=1),
  625. FrontPortTemplate(device_type=devicetype, name='Front Port Template 2', rear_port=rearports[1], rear_port_position=1),
  626. FrontPortTemplate(device_type=devicetype, name='Front Port Template 3', rear_port=rearports[2], rear_port_position=1),
  627. ))
  628. cls.form_data = {
  629. 'device_type': devicetype.pk,
  630. 'name': 'Front Port X',
  631. 'type': PortTypeChoices.TYPE_8P8C,
  632. 'rear_port': rearports[3].pk,
  633. 'rear_port_position': 1,
  634. }
  635. cls.bulk_create_data = {
  636. 'device_type': devicetype.pk,
  637. 'name_pattern': 'Front Port [4-6]',
  638. 'type': PortTypeChoices.TYPE_8P8C,
  639. 'rear_port_set': [
  640. '{}:1'.format(rp.pk) for rp in rearports[3:6]
  641. ],
  642. }
  643. cls.bulk_edit_data = {
  644. 'type': PortTypeChoices.TYPE_8P8C,
  645. }
  646. class RearPortTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase):
  647. model = RearPortTemplate
  648. @classmethod
  649. def setUpTestData(cls):
  650. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  651. devicetypes = (
  652. DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'),
  653. DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'),
  654. )
  655. DeviceType.objects.bulk_create(devicetypes)
  656. RearPortTemplate.objects.bulk_create((
  657. RearPortTemplate(device_type=devicetypes[0], name='Rear Port Template 1'),
  658. RearPortTemplate(device_type=devicetypes[0], name='Rear Port Template 2'),
  659. RearPortTemplate(device_type=devicetypes[0], name='Rear Port Template 3'),
  660. ))
  661. cls.form_data = {
  662. 'device_type': devicetypes[1].pk,
  663. 'name': 'Rear Port Template X',
  664. 'type': PortTypeChoices.TYPE_8P8C,
  665. 'positions': 2,
  666. }
  667. cls.bulk_create_data = {
  668. 'device_type': devicetypes[1].pk,
  669. 'name_pattern': 'Rear Port Template [4-6]',
  670. 'type': PortTypeChoices.TYPE_8P8C,
  671. 'positions': 2,
  672. }
  673. cls.bulk_edit_data = {
  674. 'type': PortTypeChoices.TYPE_8P8C,
  675. }
  676. # TODO: Change base class to DeviceComponentTemplateViewTestCase
  677. # Blocked by absence of bulk edit view for DeviceBays
  678. class DeviceBayTemplateTestCase(
  679. ViewTestCases.EditObjectViewTestCase,
  680. ViewTestCases.DeleteObjectViewTestCase,
  681. ViewTestCases.BulkCreateObjectsViewTestCase,
  682. ViewTestCases.BulkDeleteObjectsViewTestCase
  683. ):
  684. model = DeviceBayTemplate
  685. @classmethod
  686. def setUpTestData(cls):
  687. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  688. devicetypes = (
  689. DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'),
  690. DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'),
  691. )
  692. DeviceType.objects.bulk_create(devicetypes)
  693. DeviceBayTemplate.objects.bulk_create((
  694. DeviceBayTemplate(device_type=devicetypes[0], name='Device Bay Template 1'),
  695. DeviceBayTemplate(device_type=devicetypes[0], name='Device Bay Template 2'),
  696. DeviceBayTemplate(device_type=devicetypes[0], name='Device Bay Template 3'),
  697. ))
  698. cls.form_data = {
  699. 'device_type': devicetypes[1].pk,
  700. 'name': 'Device Bay Template X',
  701. }
  702. cls.bulk_create_data = {
  703. 'device_type': devicetypes[1].pk,
  704. 'name_pattern': 'Device Bay Template [4-6]',
  705. }
  706. class DeviceRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  707. model = DeviceRole
  708. @classmethod
  709. def setUpTestData(cls):
  710. DeviceRole.objects.bulk_create([
  711. DeviceRole(name='Device Role 1', slug='device-role-1'),
  712. DeviceRole(name='Device Role 2', slug='device-role-2'),
  713. DeviceRole(name='Device Role 3', slug='device-role-3'),
  714. ])
  715. cls.form_data = {
  716. 'name': 'Devie Role X',
  717. 'slug': 'device-role-x',
  718. 'color': 'c0c0c0',
  719. 'vm_role': False,
  720. 'description': 'New device role',
  721. }
  722. cls.csv_data = (
  723. "name,slug,color",
  724. "Device Role 4,device-role-4,ff0000",
  725. "Device Role 5,device-role-5,00ff00",
  726. "Device Role 6,device-role-6,0000ff",
  727. )
  728. class PlatformTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  729. model = Platform
  730. @classmethod
  731. def setUpTestData(cls):
  732. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  733. Platform.objects.bulk_create([
  734. Platform(name='Platform 1', slug='platform-1', manufacturer=manufacturer),
  735. Platform(name='Platform 2', slug='platform-2', manufacturer=manufacturer),
  736. Platform(name='Platform 3', slug='platform-3', manufacturer=manufacturer),
  737. ])
  738. cls.form_data = {
  739. 'name': 'Platform X',
  740. 'slug': 'platform-x',
  741. 'manufacturer': manufacturer.pk,
  742. 'napalm_driver': 'junos',
  743. 'napalm_args': None,
  744. 'description': 'A new platform',
  745. }
  746. cls.csv_data = (
  747. "name,slug,description",
  748. "Platform 4,platform-4,Fourth platform",
  749. "Platform 5,platform-5,Fifth platform",
  750. "Platform 6,platform-6,Sixth platform",
  751. )
  752. class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  753. model = Device
  754. @classmethod
  755. def setUpTestData(cls):
  756. sites = (
  757. Site(name='Site 1', slug='site-1'),
  758. Site(name='Site 2', slug='site-2'),
  759. )
  760. Site.objects.bulk_create(sites)
  761. rack_group = RackGroup(site=sites[0], name='Rack Group 1', slug='rack-group-1')
  762. rack_group.save()
  763. racks = (
  764. Rack(name='Rack 1', site=sites[0], group=rack_group),
  765. Rack(name='Rack 2', site=sites[1]),
  766. )
  767. Rack.objects.bulk_create(racks)
  768. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  769. devicetypes = (
  770. DeviceType(model='Device Type 1', slug='device-type-1', manufacturer=manufacturer),
  771. DeviceType(model='Device Type 2', slug='device-type-2', manufacturer=manufacturer),
  772. )
  773. DeviceType.objects.bulk_create(devicetypes)
  774. deviceroles = (
  775. DeviceRole(name='Device Role 1', slug='device-role-1'),
  776. DeviceRole(name='Device Role 2', slug='device-role-2'),
  777. )
  778. DeviceRole.objects.bulk_create(deviceroles)
  779. platforms = (
  780. Platform(name='Platform 1', slug='platform-1'),
  781. Platform(name='Platform 2', slug='platform-2'),
  782. )
  783. Platform.objects.bulk_create(platforms)
  784. Device.objects.bulk_create([
  785. Device(name='Device 1', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
  786. Device(name='Device 2', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
  787. Device(name='Device 3', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
  788. ])
  789. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  790. cls.form_data = {
  791. 'device_type': devicetypes[1].pk,
  792. 'device_role': deviceroles[1].pk,
  793. 'tenant': None,
  794. 'platform': platforms[1].pk,
  795. 'name': 'Device X',
  796. 'serial': '123456',
  797. 'asset_tag': 'ABCDEF',
  798. 'site': sites[1].pk,
  799. 'rack': racks[1].pk,
  800. 'position': 1,
  801. 'face': DeviceFaceChoices.FACE_FRONT,
  802. 'status': DeviceStatusChoices.STATUS_PLANNED,
  803. 'primary_ip4': None,
  804. 'primary_ip6': None,
  805. 'cluster': None,
  806. 'virtual_chassis': None,
  807. 'vc_position': None,
  808. 'vc_priority': None,
  809. 'comments': 'A new device',
  810. 'tags': [t.pk for t in tags],
  811. 'local_context_data': None,
  812. }
  813. cls.csv_data = (
  814. "device_role,manufacturer,device_type,status,name,site,rack_group,rack,position,face",
  815. "Device Role 1,Manufacturer 1,Device Type 1,Active,Device 4,Site 1,Rack Group 1,Rack 1,10,Front",
  816. "Device Role 1,Manufacturer 1,Device Type 1,Active,Device 5,Site 1,Rack Group 1,Rack 1,20,Front",
  817. "Device Role 1,Manufacturer 1,Device Type 1,Active,Device 6,Site 1,Rack Group 1,Rack 1,30,Front",
  818. )
  819. cls.bulk_edit_data = {
  820. 'device_type': devicetypes[1].pk,
  821. 'device_role': deviceroles[1].pk,
  822. 'tenant': None,
  823. 'platform': platforms[1].pk,
  824. 'serial': '123456',
  825. 'status': DeviceStatusChoices.STATUS_DECOMMISSIONING,
  826. }
  827. class ConsolePortTestCase(ViewTestCases.DeviceComponentViewTestCase):
  828. model = ConsolePort
  829. @classmethod
  830. def setUpTestData(cls):
  831. device = create_test_device('Device 1')
  832. ConsolePort.objects.bulk_create([
  833. ConsolePort(device=device, name='Console Port 1'),
  834. ConsolePort(device=device, name='Console Port 2'),
  835. ConsolePort(device=device, name='Console Port 3'),
  836. ])
  837. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  838. cls.form_data = {
  839. 'device': device.pk,
  840. 'name': 'Console Port X',
  841. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  842. 'description': 'A console port',
  843. 'tags': sorted([t.pk for t in tags]),
  844. }
  845. cls.bulk_create_data = {
  846. 'device': device.pk,
  847. 'name_pattern': 'Console Port [4-6]',
  848. # Test that a label can be applied to each generated console ports
  849. 'label_pattern': 'Serial[3-5]',
  850. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  851. 'description': 'A console port',
  852. 'tags': sorted([t.pk for t in tags]),
  853. }
  854. cls.bulk_edit_data = {
  855. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  856. 'description': 'New description',
  857. }
  858. cls.csv_data = (
  859. "device,name",
  860. "Device 1,Console Port 4",
  861. "Device 1,Console Port 5",
  862. "Device 1,Console Port 6",
  863. )
  864. class ConsoleServerPortTestCase(ViewTestCases.DeviceComponentViewTestCase):
  865. model = ConsoleServerPort
  866. @classmethod
  867. def setUpTestData(cls):
  868. device = create_test_device('Device 1')
  869. ConsoleServerPort.objects.bulk_create([
  870. ConsoleServerPort(device=device, name='Console Server Port 1'),
  871. ConsoleServerPort(device=device, name='Console Server Port 2'),
  872. ConsoleServerPort(device=device, name='Console Server Port 3'),
  873. ])
  874. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  875. cls.form_data = {
  876. 'device': device.pk,
  877. 'name': 'Console Server Port X',
  878. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  879. 'description': 'A console server port',
  880. 'tags': [t.pk for t in tags],
  881. }
  882. cls.bulk_create_data = {
  883. 'device': device.pk,
  884. 'name_pattern': 'Console Server Port [4-6]',
  885. 'type': ConsolePortTypeChoices.TYPE_RJ45,
  886. 'description': 'A console server port',
  887. 'tags': [t.pk for t in tags],
  888. }
  889. cls.bulk_edit_data = {
  890. 'type': ConsolePortTypeChoices.TYPE_RJ11,
  891. 'description': 'New description',
  892. }
  893. cls.csv_data = (
  894. "device,name",
  895. "Device 1,Console Server Port 4",
  896. "Device 1,Console Server Port 5",
  897. "Device 1,Console Server Port 6",
  898. )
  899. class PowerPortTestCase(ViewTestCases.DeviceComponentViewTestCase):
  900. model = PowerPort
  901. @classmethod
  902. def setUpTestData(cls):
  903. device = create_test_device('Device 1')
  904. PowerPort.objects.bulk_create([
  905. PowerPort(device=device, name='Power Port 1'),
  906. PowerPort(device=device, name='Power Port 2'),
  907. PowerPort(device=device, name='Power Port 3'),
  908. ])
  909. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  910. cls.form_data = {
  911. 'device': device.pk,
  912. 'name': 'Power Port X',
  913. 'type': PowerPortTypeChoices.TYPE_IEC_C14,
  914. 'maximum_draw': 100,
  915. 'allocated_draw': 50,
  916. 'description': 'A power port',
  917. 'tags': [t.pk for t in tags],
  918. }
  919. cls.bulk_create_data = {
  920. 'device': device.pk,
  921. 'name_pattern': 'Power Port [4-6]]',
  922. 'type': PowerPortTypeChoices.TYPE_IEC_C14,
  923. 'maximum_draw': 100,
  924. 'allocated_draw': 50,
  925. 'description': 'A power port',
  926. 'tags': [t.pk for t in tags],
  927. }
  928. cls.bulk_edit_data = {
  929. 'type': PowerPortTypeChoices.TYPE_IEC_C14,
  930. 'maximum_draw': 100,
  931. 'allocated_draw': 50,
  932. 'description': 'New description',
  933. }
  934. cls.csv_data = (
  935. "device,name",
  936. "Device 1,Power Port 4",
  937. "Device 1,Power Port 5",
  938. "Device 1,Power Port 6",
  939. )
  940. class PowerOutletTestCase(ViewTestCases.DeviceComponentViewTestCase):
  941. model = PowerOutlet
  942. @classmethod
  943. def setUpTestData(cls):
  944. device = create_test_device('Device 1')
  945. powerports = (
  946. PowerPort(device=device, name='Power Port 1'),
  947. PowerPort(device=device, name='Power Port 2'),
  948. )
  949. PowerPort.objects.bulk_create(powerports)
  950. PowerOutlet.objects.bulk_create([
  951. PowerOutlet(device=device, name='Power Outlet 1', power_port=powerports[0]),
  952. PowerOutlet(device=device, name='Power Outlet 2', power_port=powerports[0]),
  953. PowerOutlet(device=device, name='Power Outlet 3', power_port=powerports[0]),
  954. ])
  955. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  956. cls.form_data = {
  957. 'device': device.pk,
  958. 'name': 'Power Outlet X',
  959. 'type': PowerOutletTypeChoices.TYPE_IEC_C13,
  960. 'power_port': powerports[1].pk,
  961. 'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_B,
  962. 'description': 'A power outlet',
  963. 'tags': [t.pk for t in tags],
  964. }
  965. cls.bulk_create_data = {
  966. 'device': device.pk,
  967. 'name_pattern': 'Power Outlet [4-6]',
  968. 'type': PowerOutletTypeChoices.TYPE_IEC_C13,
  969. 'power_port': powerports[1].pk,
  970. 'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_B,
  971. 'description': 'A power outlet',
  972. 'tags': [t.pk for t in tags],
  973. }
  974. cls.bulk_edit_data = {
  975. 'type': PowerOutletTypeChoices.TYPE_IEC_C15,
  976. 'power_port': powerports[1].pk,
  977. 'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_B,
  978. 'description': 'New description',
  979. }
  980. cls.csv_data = (
  981. "device,name",
  982. "Device 1,Power Outlet 4",
  983. "Device 1,Power Outlet 5",
  984. "Device 1,Power Outlet 6",
  985. )
  986. class InterfaceTestCase(
  987. ViewTestCases.GetObjectViewTestCase,
  988. ViewTestCases.DeviceComponentViewTestCase,
  989. ):
  990. model = Interface
  991. @classmethod
  992. def setUpTestData(cls):
  993. device = create_test_device('Device 1')
  994. interfaces = (
  995. Interface(device=device, name='Interface 1'),
  996. Interface(device=device, name='Interface 2'),
  997. Interface(device=device, name='Interface 3'),
  998. Interface(device=device, name='LAG', type=InterfaceTypeChoices.TYPE_LAG),
  999. )
  1000. Interface.objects.bulk_create(interfaces)
  1001. vlans = (
  1002. VLAN(vid=1, name='VLAN1', site=device.site),
  1003. VLAN(vid=101, name='VLAN101', site=device.site),
  1004. VLAN(vid=102, name='VLAN102', site=device.site),
  1005. VLAN(vid=103, name='VLAN103', site=device.site),
  1006. )
  1007. VLAN.objects.bulk_create(vlans)
  1008. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  1009. cls.form_data = {
  1010. 'device': device.pk,
  1011. 'virtual_machine': None,
  1012. 'name': 'Interface X',
  1013. 'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
  1014. 'enabled': False,
  1015. 'lag': interfaces[3].pk,
  1016. 'mac_address': EUI('01:02:03:04:05:06'),
  1017. 'mtu': 2000,
  1018. 'mgmt_only': True,
  1019. 'description': 'A front port',
  1020. 'mode': InterfaceModeChoices.MODE_TAGGED,
  1021. 'untagged_vlan': vlans[0].pk,
  1022. 'tagged_vlans': [v.pk for v in vlans[1:4]],
  1023. 'tags': [t.pk for t in tags],
  1024. }
  1025. cls.bulk_create_data = {
  1026. 'device': device.pk,
  1027. 'name_pattern': 'Interface [4-6]',
  1028. 'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
  1029. 'enabled': False,
  1030. 'lag': interfaces[3].pk,
  1031. 'mac_address': EUI('01:02:03:04:05:06'),
  1032. 'mtu': 2000,
  1033. 'mgmt_only': True,
  1034. 'description': 'A front port',
  1035. 'mode': InterfaceModeChoices.MODE_TAGGED,
  1036. 'untagged_vlan': vlans[0].pk,
  1037. 'tagged_vlans': [v.pk for v in vlans[1:4]],
  1038. 'tags': [t.pk for t in tags],
  1039. }
  1040. cls.bulk_edit_data = {
  1041. 'type': InterfaceTypeChoices.TYPE_1GE_FIXED,
  1042. 'enabled': True,
  1043. 'lag': interfaces[3].pk,
  1044. 'mac_address': EUI('01:02:03:04:05:06'),
  1045. 'mtu': 2000,
  1046. 'mgmt_only': True,
  1047. 'description': 'New description',
  1048. 'mode': InterfaceModeChoices.MODE_TAGGED,
  1049. 'untagged_vlan': vlans[0].pk,
  1050. 'tagged_vlans': [v.pk for v in vlans[1:4]],
  1051. }
  1052. cls.csv_data = (
  1053. "device,name,type",
  1054. "Device 1,Interface 4,1000BASE-T (1GE)",
  1055. "Device 1,Interface 5,1000BASE-T (1GE)",
  1056. "Device 1,Interface 6,1000BASE-T (1GE)",
  1057. )
  1058. class FrontPortTestCase(ViewTestCases.DeviceComponentViewTestCase):
  1059. model = FrontPort
  1060. @classmethod
  1061. def setUpTestData(cls):
  1062. device = create_test_device('Device 1')
  1063. rearports = (
  1064. RearPort(device=device, name='Rear Port 1'),
  1065. RearPort(device=device, name='Rear Port 2'),
  1066. RearPort(device=device, name='Rear Port 3'),
  1067. RearPort(device=device, name='Rear Port 4'),
  1068. RearPort(device=device, name='Rear Port 5'),
  1069. RearPort(device=device, name='Rear Port 6'),
  1070. )
  1071. RearPort.objects.bulk_create(rearports)
  1072. FrontPort.objects.bulk_create([
  1073. FrontPort(device=device, name='Front Port 1', rear_port=rearports[0]),
  1074. FrontPort(device=device, name='Front Port 2', rear_port=rearports[1]),
  1075. FrontPort(device=device, name='Front Port 3', rear_port=rearports[2]),
  1076. ])
  1077. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  1078. cls.form_data = {
  1079. 'device': device.pk,
  1080. 'name': 'Front Port X',
  1081. 'type': PortTypeChoices.TYPE_8P8C,
  1082. 'rear_port': rearports[3].pk,
  1083. 'rear_port_position': 1,
  1084. 'description': 'New description',
  1085. 'tags': [t.pk for t in tags],
  1086. }
  1087. cls.bulk_create_data = {
  1088. 'device': device.pk,
  1089. 'name_pattern': 'Front Port [4-6]',
  1090. 'type': PortTypeChoices.TYPE_8P8C,
  1091. 'rear_port_set': [
  1092. '{}:1'.format(rp.pk) for rp in rearports[3:6]
  1093. ],
  1094. 'description': 'New description',
  1095. 'tags': [t.pk for t in tags],
  1096. }
  1097. cls.bulk_edit_data = {
  1098. 'type': PortTypeChoices.TYPE_8P8C,
  1099. 'description': 'New description',
  1100. }
  1101. cls.csv_data = (
  1102. "device,name,type,rear_port,rear_port_position",
  1103. "Device 1,Front Port 4,8P8C,Rear Port 4,1",
  1104. "Device 1,Front Port 5,8P8C,Rear Port 5,1",
  1105. "Device 1,Front Port 6,8P8C,Rear Port 6,1",
  1106. )
  1107. class RearPortTestCase(ViewTestCases.DeviceComponentViewTestCase):
  1108. model = RearPort
  1109. @classmethod
  1110. def setUpTestData(cls):
  1111. device = create_test_device('Device 1')
  1112. RearPort.objects.bulk_create([
  1113. RearPort(device=device, name='Rear Port 1'),
  1114. RearPort(device=device, name='Rear Port 2'),
  1115. RearPort(device=device, name='Rear Port 3'),
  1116. ])
  1117. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  1118. cls.form_data = {
  1119. 'device': device.pk,
  1120. 'name': 'Rear Port X',
  1121. 'type': PortTypeChoices.TYPE_8P8C,
  1122. 'positions': 3,
  1123. 'description': 'A rear port',
  1124. 'tags': [t.pk for t in tags],
  1125. }
  1126. cls.bulk_create_data = {
  1127. 'device': device.pk,
  1128. 'name_pattern': 'Rear Port [4-6]',
  1129. 'type': PortTypeChoices.TYPE_8P8C,
  1130. 'positions': 3,
  1131. 'description': 'A rear port',
  1132. 'tags': [t.pk for t in tags],
  1133. }
  1134. cls.bulk_edit_data = {
  1135. 'type': PortTypeChoices.TYPE_8P8C,
  1136. 'description': 'New description',
  1137. }
  1138. cls.csv_data = (
  1139. "device,name,type,positions",
  1140. "Device 1,Rear Port 4,8P8C,1",
  1141. "Device 1,Rear Port 5,8P8C,1",
  1142. "Device 1,Rear Port 6,8P8C,1",
  1143. )
  1144. class DeviceBayTestCase(ViewTestCases.DeviceComponentViewTestCase):
  1145. model = DeviceBay
  1146. @classmethod
  1147. def setUpTestData(cls):
  1148. device = create_test_device('Device 1')
  1149. # Update the DeviceType subdevice role to allow adding DeviceBays
  1150. DeviceType.objects.update(subdevice_role=SubdeviceRoleChoices.ROLE_PARENT)
  1151. DeviceBay.objects.bulk_create([
  1152. DeviceBay(device=device, name='Device Bay 1'),
  1153. DeviceBay(device=device, name='Device Bay 2'),
  1154. DeviceBay(device=device, name='Device Bay 3'),
  1155. ])
  1156. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  1157. cls.form_data = {
  1158. 'device': device.pk,
  1159. 'name': 'Device Bay X',
  1160. 'description': 'A device bay',
  1161. 'tags': [t.pk for t in tags],
  1162. }
  1163. cls.bulk_create_data = {
  1164. 'device': device.pk,
  1165. 'name_pattern': 'Device Bay [4-6]',
  1166. 'description': 'A device bay',
  1167. 'tags': [t.pk for t in tags],
  1168. }
  1169. cls.bulk_edit_data = {
  1170. 'description': 'New description',
  1171. }
  1172. cls.csv_data = (
  1173. "device,name",
  1174. "Device 1,Device Bay 4",
  1175. "Device 1,Device Bay 5",
  1176. "Device 1,Device Bay 6",
  1177. )
  1178. class InventoryItemTestCase(ViewTestCases.DeviceComponentViewTestCase):
  1179. model = InventoryItem
  1180. @classmethod
  1181. def setUpTestData(cls):
  1182. device = create_test_device('Device 1')
  1183. manufacturer, _ = Manufacturer.objects.get_or_create(name='Manufacturer 1', slug='manufacturer-1')
  1184. InventoryItem.objects.bulk_create([
  1185. InventoryItem(device=device, name='Inventory Item 1'),
  1186. InventoryItem(device=device, name='Inventory Item 2'),
  1187. InventoryItem(device=device, name='Inventory Item 3'),
  1188. ])
  1189. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  1190. cls.form_data = {
  1191. 'device': device.pk,
  1192. 'manufacturer': manufacturer.pk,
  1193. 'name': 'Inventory Item X',
  1194. 'parent': None,
  1195. 'discovered': False,
  1196. 'part_id': '123456',
  1197. 'serial': '123ABC',
  1198. 'asset_tag': 'ABC123',
  1199. 'description': 'An inventory item',
  1200. 'tags': [t.pk for t in tags],
  1201. }
  1202. cls.bulk_create_data = {
  1203. 'device': device.pk,
  1204. 'name_pattern': 'Inventory Item [4-6]',
  1205. 'manufacturer': manufacturer.pk,
  1206. 'parent': None,
  1207. 'discovered': False,
  1208. 'part_id': '123456',
  1209. 'serial': '123ABC',
  1210. 'description': 'An inventory item',
  1211. 'tags': [t.pk for t in tags],
  1212. }
  1213. cls.bulk_edit_data = {
  1214. 'part_id': '123456',
  1215. 'description': 'New description',
  1216. }
  1217. cls.csv_data = (
  1218. "device,name",
  1219. "Device 1,Inventory Item 4",
  1220. "Device 1,Inventory Item 5",
  1221. "Device 1,Inventory Item 6",
  1222. )
  1223. # TODO: Change base class to PrimaryObjectViewTestCase
  1224. # Blocked by lack of common creation view for cables (termination A must be initialized)
  1225. class CableTestCase(
  1226. ViewTestCases.GetObjectViewTestCase,
  1227. ViewTestCases.EditObjectViewTestCase,
  1228. ViewTestCases.DeleteObjectViewTestCase,
  1229. ViewTestCases.ListObjectsViewTestCase,
  1230. ViewTestCases.BulkImportObjectsViewTestCase,
  1231. ViewTestCases.BulkEditObjectsViewTestCase,
  1232. ViewTestCases.BulkDeleteObjectsViewTestCase
  1233. ):
  1234. model = Cable
  1235. @classmethod
  1236. def setUpTestData(cls):
  1237. site = Site.objects.create(name='Site 1', slug='site-1')
  1238. manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
  1239. devicetype = DeviceType.objects.create(model='Device Type 1', manufacturer=manufacturer)
  1240. devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
  1241. devices = (
  1242. Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole),
  1243. Device(name='Device 2', site=site, device_type=devicetype, device_role=devicerole),
  1244. Device(name='Device 3', site=site, device_type=devicetype, device_role=devicerole),
  1245. Device(name='Device 4', site=site, device_type=devicetype, device_role=devicerole),
  1246. )
  1247. Device.objects.bulk_create(devices)
  1248. interfaces = (
  1249. Interface(device=devices[0], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1250. Interface(device=devices[0], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1251. Interface(device=devices[0], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1252. Interface(device=devices[1], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1253. Interface(device=devices[1], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1254. Interface(device=devices[1], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1255. Interface(device=devices[2], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1256. Interface(device=devices[2], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1257. Interface(device=devices[2], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1258. Interface(device=devices[3], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1259. Interface(device=devices[3], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1260. Interface(device=devices[3], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
  1261. )
  1262. Interface.objects.bulk_create(interfaces)
  1263. Cable(termination_a=interfaces[0], termination_b=interfaces[3], type=CableTypeChoices.TYPE_CAT6).save()
  1264. Cable(termination_a=interfaces[1], termination_b=interfaces[4], type=CableTypeChoices.TYPE_CAT6).save()
  1265. Cable(termination_a=interfaces[2], termination_b=interfaces[5], type=CableTypeChoices.TYPE_CAT6).save()
  1266. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  1267. interface_ct = ContentType.objects.get_for_model(Interface)
  1268. cls.form_data = {
  1269. # Changing terminations not supported when editing an existing Cable
  1270. 'termination_a_type': interface_ct.pk,
  1271. 'termination_a_id': interfaces[0].pk,
  1272. 'termination_b_type': interface_ct.pk,
  1273. 'termination_b_id': interfaces[3].pk,
  1274. 'type': CableTypeChoices.TYPE_CAT6,
  1275. 'status': CableStatusChoices.STATUS_PLANNED,
  1276. 'label': 'Label',
  1277. 'color': 'c0c0c0',
  1278. 'length': 100,
  1279. 'length_unit': CableLengthUnitChoices.UNIT_FOOT,
  1280. 'tags': [t.pk for t in tags],
  1281. }
  1282. cls.csv_data = (
  1283. "side_a_device,side_a_type,side_a_name,side_b_device,side_b_type,side_b_name",
  1284. "Device 3,interface,Interface 1,Device 4,interface,Interface 1",
  1285. "Device 3,interface,Interface 2,Device 4,interface,Interface 2",
  1286. "Device 3,interface,Interface 3,Device 4,interface,Interface 3",
  1287. )
  1288. cls.bulk_edit_data = {
  1289. 'type': CableTypeChoices.TYPE_CAT5E,
  1290. 'status': CableStatusChoices.STATUS_CONNECTED,
  1291. 'label': 'New label',
  1292. 'color': '00ff00',
  1293. 'length': 50,
  1294. 'length_unit': CableLengthUnitChoices.UNIT_METER,
  1295. }
  1296. class VirtualChassisTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  1297. model = VirtualChassis
  1298. @classmethod
  1299. def setUpTestData(cls):
  1300. site = Site.objects.create(name='Site 1', slug='site-1')
  1301. manufacturer = Manufacturer.objects.create(name='Manufacturer', slug='manufacturer-1')
  1302. device_type = DeviceType.objects.create(
  1303. manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'
  1304. )
  1305. device_role = DeviceRole.objects.create(
  1306. name='Device Role', slug='device-role-1'
  1307. )
  1308. devices = (
  1309. Device(device_type=device_type, device_role=device_role, name='Device 1', site=site),
  1310. Device(device_type=device_type, device_role=device_role, name='Device 2', site=site),
  1311. Device(device_type=device_type, device_role=device_role, name='Device 3', site=site),
  1312. Device(device_type=device_type, device_role=device_role, name='Device 4', site=site),
  1313. Device(device_type=device_type, device_role=device_role, name='Device 5', site=site),
  1314. Device(device_type=device_type, device_role=device_role, name='Device 6', site=site),
  1315. Device(device_type=device_type, device_role=device_role, name='Device 7', site=site),
  1316. Device(device_type=device_type, device_role=device_role, name='Device 8', site=site),
  1317. Device(device_type=device_type, device_role=device_role, name='Device 9', site=site),
  1318. Device(device_type=device_type, device_role=device_role, name='Device 10', site=site),
  1319. Device(device_type=device_type, device_role=device_role, name='Device 11', site=site),
  1320. Device(device_type=device_type, device_role=device_role, name='Device 12', site=site),
  1321. )
  1322. Device.objects.bulk_create(devices)
  1323. # Create three VirtualChassis with three members each
  1324. vc1 = VirtualChassis.objects.create(name='VC1', master=devices[0], domain='domain-1')
  1325. Device.objects.filter(pk=devices[0].pk).update(virtual_chassis=vc1, vc_position=1)
  1326. Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=vc1, vc_position=2)
  1327. Device.objects.filter(pk=devices[2].pk).update(virtual_chassis=vc1, vc_position=3)
  1328. vc2 = VirtualChassis.objects.create(name='VC2', master=devices[3], domain='domain-2')
  1329. Device.objects.filter(pk=devices[3].pk).update(virtual_chassis=vc2, vc_position=1)
  1330. Device.objects.filter(pk=devices[4].pk).update(virtual_chassis=vc2, vc_position=2)
  1331. Device.objects.filter(pk=devices[5].pk).update(virtual_chassis=vc2, vc_position=3)
  1332. vc3 = VirtualChassis.objects.create(name='VC3', master=devices[6], domain='domain-3')
  1333. Device.objects.filter(pk=devices[6].pk).update(virtual_chassis=vc3, vc_position=1)
  1334. Device.objects.filter(pk=devices[7].pk).update(virtual_chassis=vc3, vc_position=2)
  1335. Device.objects.filter(pk=devices[8].pk).update(virtual_chassis=vc3, vc_position=3)
  1336. cls.form_data = {
  1337. 'name': 'VC4',
  1338. 'domain': 'domain-4',
  1339. # Management form data for VC members
  1340. 'form-TOTAL_FORMS': 0,
  1341. 'form-INITIAL_FORMS': 3,
  1342. 'form-MIN_NUM_FORMS': 0,
  1343. 'form-MAX_NUM_FORMS': 1000,
  1344. }
  1345. cls.csv_data = (
  1346. "name,domain,master",
  1347. "VC4,Domain 4,Device 10",
  1348. "VC5,Domain 5,Device 11",
  1349. "VC6,Domain 6,Device 12",
  1350. )
  1351. cls.bulk_edit_data = {
  1352. 'domain': 'domain-x',
  1353. }
  1354. class PowerPanelTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  1355. model = PowerPanel
  1356. @classmethod
  1357. def setUpTestData(cls):
  1358. sites = (
  1359. Site(name='Site 1', slug='site-1'),
  1360. Site(name='Site 2', slug='site-2'),
  1361. )
  1362. Site.objects.bulk_create(sites)
  1363. rackgroups = (
  1364. RackGroup(name='Rack Group 1', slug='rack-group-1', site=sites[0]),
  1365. RackGroup(name='Rack Group 2', slug='rack-group-2', site=sites[1]),
  1366. )
  1367. for rackgroup in rackgroups:
  1368. rackgroup.save()
  1369. PowerPanel.objects.bulk_create((
  1370. PowerPanel(site=sites[0], rack_group=rackgroups[0], name='Power Panel 1'),
  1371. PowerPanel(site=sites[0], rack_group=rackgroups[0], name='Power Panel 2'),
  1372. PowerPanel(site=sites[0], rack_group=rackgroups[0], name='Power Panel 3'),
  1373. ))
  1374. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  1375. cls.form_data = {
  1376. 'site': sites[1].pk,
  1377. 'rack_group': rackgroups[1].pk,
  1378. 'name': 'Power Panel X',
  1379. 'tags': [t.pk for t in tags],
  1380. }
  1381. cls.csv_data = (
  1382. "site,rack_group,name",
  1383. "Site 1,Rack Group 1,Power Panel 4",
  1384. "Site 1,Rack Group 1,Power Panel 5",
  1385. "Site 1,Rack Group 1,Power Panel 6",
  1386. )
  1387. cls.bulk_edit_data = {
  1388. 'site': sites[1].pk,
  1389. 'rack_group': rackgroups[1].pk,
  1390. }
  1391. class PowerFeedTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  1392. model = PowerFeed
  1393. @classmethod
  1394. def setUpTestData(cls):
  1395. site = Site.objects.create(name='Site 1', slug='site-1')
  1396. powerpanels = (
  1397. PowerPanel(site=site, name='Power Panel 1'),
  1398. PowerPanel(site=site, name='Power Panel 2'),
  1399. )
  1400. PowerPanel.objects.bulk_create(powerpanels)
  1401. racks = (
  1402. Rack(site=site, name='Rack 1'),
  1403. Rack(site=site, name='Rack 2'),
  1404. )
  1405. Rack.objects.bulk_create(racks)
  1406. PowerFeed.objects.bulk_create((
  1407. PowerFeed(name='Power Feed 1', power_panel=powerpanels[0], rack=racks[0]),
  1408. PowerFeed(name='Power Feed 2', power_panel=powerpanels[0], rack=racks[0]),
  1409. PowerFeed(name='Power Feed 3', power_panel=powerpanels[0], rack=racks[0]),
  1410. ))
  1411. tags = cls.create_tags('Alpha', 'Bravo', 'Charlie')
  1412. cls.form_data = {
  1413. 'name': 'Power Feed X',
  1414. 'power_panel': powerpanels[1].pk,
  1415. 'rack': racks[1].pk,
  1416. 'status': PowerFeedStatusChoices.STATUS_PLANNED,
  1417. 'type': PowerFeedTypeChoices.TYPE_REDUNDANT,
  1418. 'supply': PowerFeedSupplyChoices.SUPPLY_DC,
  1419. 'phase': PowerFeedPhaseChoices.PHASE_3PHASE,
  1420. 'voltage': 100,
  1421. 'amperage': 100,
  1422. 'max_utilization': 50,
  1423. 'comments': 'New comments',
  1424. 'tags': [t.pk for t in tags],
  1425. # Connection
  1426. 'cable': None,
  1427. 'connected_endpoint': None,
  1428. 'connection_status': None,
  1429. }
  1430. cls.csv_data = (
  1431. "site,power_panel,name,voltage,amperage,max_utilization",
  1432. "Site 1,Power Panel 1,Power Feed 4,120,20,80",
  1433. "Site 1,Power Panel 1,Power Feed 5,120,20,80",
  1434. "Site 1,Power Panel 1,Power Feed 6,120,20,80",
  1435. )
  1436. cls.bulk_edit_data = {
  1437. 'power_panel': powerpanels[1].pk,
  1438. 'rack': racks[1].pk,
  1439. 'status': PowerFeedStatusChoices.STATUS_PLANNED,
  1440. 'type': PowerFeedTypeChoices.TYPE_REDUNDANT,
  1441. 'supply': PowerFeedSupplyChoices.SUPPLY_DC,
  1442. 'phase': PowerFeedPhaseChoices.PHASE_3PHASE,
  1443. 'voltage': 100,
  1444. 'amperage': 100,
  1445. 'max_utilization': 50,
  1446. 'comments': 'New comments',
  1447. }