test_api.py 121 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085
  1. from __future__ import unicode_literals
  2. from django.contrib.auth.models import User
  3. from django.urls import reverse
  4. from rest_framework import status
  5. from rest_framework.test import APITestCase
  6. from dcim.constants import (
  7. IFACE_FF_1GE_FIXED, IFACE_FF_LAG, IFACE_MODE_TAGGED, SUBDEVICE_ROLE_CHILD, SUBDEVICE_ROLE_PARENT,
  8. )
  9. from dcim.models import (
  10. ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
  11. DeviceBayTemplate, DeviceRole, DeviceType, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer,
  12. InventoryItem, Platform, PowerPort, PowerPortTemplate, PowerOutlet, PowerOutletTemplate, Rack, RackGroup,
  13. RackReservation, RackRole, Region, Site, VirtualChassis,
  14. )
  15. from ipam.models import VLAN
  16. from extras.models import Graph, GRAPH_TYPE_INTERFACE, GRAPH_TYPE_SITE
  17. from users.models import Token
  18. from utilities.tests import HttpStatusMixin
  19. class RegionTest(HttpStatusMixin, APITestCase):
  20. def setUp(self):
  21. user = User.objects.create(username='testuser', is_superuser=True)
  22. token = Token.objects.create(user=user)
  23. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  24. self.region1 = Region.objects.create(name='Test Region 1', slug='test-region-1')
  25. self.region2 = Region.objects.create(name='Test Region 2', slug='test-region-2')
  26. self.region3 = Region.objects.create(name='Test Region 3', slug='test-region-3')
  27. def test_get_region(self):
  28. url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
  29. response = self.client.get(url, **self.header)
  30. self.assertEqual(response.data['name'], self.region1.name)
  31. def test_list_regions(self):
  32. url = reverse('dcim-api:region-list')
  33. response = self.client.get(url, **self.header)
  34. self.assertEqual(response.data['count'], 3)
  35. def test_create_region(self):
  36. data = {
  37. 'name': 'Test Region 4',
  38. 'slug': 'test-region-4',
  39. }
  40. url = reverse('dcim-api:region-list')
  41. response = self.client.post(url, data, format='json', **self.header)
  42. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  43. self.assertEqual(Region.objects.count(), 4)
  44. region4 = Region.objects.get(pk=response.data['id'])
  45. self.assertEqual(region4.name, data['name'])
  46. self.assertEqual(region4.slug, data['slug'])
  47. def test_create_region_bulk(self):
  48. data = [
  49. {
  50. 'name': 'Test Region 4',
  51. 'slug': 'test-region-4',
  52. },
  53. {
  54. 'name': 'Test Region 5',
  55. 'slug': 'test-region-5',
  56. },
  57. {
  58. 'name': 'Test Region 6',
  59. 'slug': 'test-region-6',
  60. },
  61. ]
  62. url = reverse('dcim-api:region-list')
  63. response = self.client.post(url, data, format='json', **self.header)
  64. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  65. self.assertEqual(Region.objects.count(), 6)
  66. self.assertEqual(response.data[0]['name'], data[0]['name'])
  67. self.assertEqual(response.data[1]['name'], data[1]['name'])
  68. self.assertEqual(response.data[2]['name'], data[2]['name'])
  69. def test_update_region(self):
  70. data = {
  71. 'name': 'Test Region X',
  72. 'slug': 'test-region-x',
  73. }
  74. url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
  75. response = self.client.put(url, data, format='json', **self.header)
  76. self.assertHttpStatus(response, status.HTTP_200_OK)
  77. self.assertEqual(Region.objects.count(), 3)
  78. region1 = Region.objects.get(pk=response.data['id'])
  79. self.assertEqual(region1.name, data['name'])
  80. self.assertEqual(region1.slug, data['slug'])
  81. def test_delete_region(self):
  82. url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
  83. response = self.client.delete(url, **self.header)
  84. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  85. self.assertEqual(Region.objects.count(), 2)
  86. class SiteTest(HttpStatusMixin, APITestCase):
  87. def setUp(self):
  88. user = User.objects.create(username='testuser', is_superuser=True)
  89. token = Token.objects.create(user=user)
  90. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  91. self.region1 = Region.objects.create(name='Test Region 1', slug='test-region-1')
  92. self.region2 = Region.objects.create(name='Test Region 2', slug='test-region-2')
  93. self.site1 = Site.objects.create(region=self.region1, name='Test Site 1', slug='test-site-1')
  94. self.site2 = Site.objects.create(region=self.region1, name='Test Site 2', slug='test-site-2')
  95. self.site3 = Site.objects.create(region=self.region1, name='Test Site 3', slug='test-site-3')
  96. def test_get_site(self):
  97. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  98. response = self.client.get(url, **self.header)
  99. self.assertEqual(response.data['name'], self.site1.name)
  100. def test_get_site_graphs(self):
  101. self.graph1 = Graph.objects.create(
  102. type=GRAPH_TYPE_SITE, name='Test Graph 1',
  103. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=1'
  104. )
  105. self.graph2 = Graph.objects.create(
  106. type=GRAPH_TYPE_SITE, name='Test Graph 2',
  107. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=2'
  108. )
  109. self.graph3 = Graph.objects.create(
  110. type=GRAPH_TYPE_SITE, name='Test Graph 3',
  111. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=3'
  112. )
  113. url = reverse('dcim-api:site-graphs', kwargs={'pk': self.site1.pk})
  114. response = self.client.get(url, **self.header)
  115. self.assertEqual(len(response.data), 3)
  116. self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?site=test-site-1&foo=1')
  117. def test_list_sites(self):
  118. url = reverse('dcim-api:site-list')
  119. response = self.client.get(url, **self.header)
  120. self.assertEqual(response.data['count'], 3)
  121. def test_create_site(self):
  122. data = {
  123. 'name': 'Test Site 4',
  124. 'slug': 'test-site-4',
  125. 'region': self.region1.pk,
  126. }
  127. url = reverse('dcim-api:site-list')
  128. response = self.client.post(url, data, format='json', **self.header)
  129. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  130. self.assertEqual(Site.objects.count(), 4)
  131. site4 = Site.objects.get(pk=response.data['id'])
  132. self.assertEqual(site4.name, data['name'])
  133. self.assertEqual(site4.slug, data['slug'])
  134. self.assertEqual(site4.region_id, data['region'])
  135. def test_create_site_bulk(self):
  136. data = [
  137. {
  138. 'name': 'Test Site 4',
  139. 'slug': 'test-site-4',
  140. 'region': self.region1.pk,
  141. },
  142. {
  143. 'name': 'Test Site 5',
  144. 'slug': 'test-site-5',
  145. 'region': self.region1.pk,
  146. },
  147. {
  148. 'name': 'Test Site 6',
  149. 'slug': 'test-site-6',
  150. 'region': self.region1.pk,
  151. },
  152. ]
  153. url = reverse('dcim-api:site-list')
  154. response = self.client.post(url, data, format='json', **self.header)
  155. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  156. self.assertEqual(Site.objects.count(), 6)
  157. self.assertEqual(response.data[0]['name'], data[0]['name'])
  158. self.assertEqual(response.data[1]['name'], data[1]['name'])
  159. self.assertEqual(response.data[2]['name'], data[2]['name'])
  160. def test_update_site(self):
  161. data = {
  162. 'name': 'Test Site X',
  163. 'slug': 'test-site-x',
  164. 'region': self.region2.pk,
  165. }
  166. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  167. response = self.client.put(url, data, format='json', **self.header)
  168. self.assertHttpStatus(response, status.HTTP_200_OK)
  169. self.assertEqual(Site.objects.count(), 3)
  170. site1 = Site.objects.get(pk=response.data['id'])
  171. self.assertEqual(site1.name, data['name'])
  172. self.assertEqual(site1.slug, data['slug'])
  173. self.assertEqual(site1.region_id, data['region'])
  174. def test_delete_site(self):
  175. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  176. response = self.client.delete(url, **self.header)
  177. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  178. self.assertEqual(Site.objects.count(), 2)
  179. class RackGroupTest(HttpStatusMixin, APITestCase):
  180. def setUp(self):
  181. user = User.objects.create(username='testuser', is_superuser=True)
  182. token = Token.objects.create(user=user)
  183. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  184. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  185. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  186. self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1')
  187. self.rackgroup2 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 2', slug='test-rack-group-2')
  188. self.rackgroup3 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 3', slug='test-rack-group-3')
  189. def test_get_rackgroup(self):
  190. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  191. response = self.client.get(url, **self.header)
  192. self.assertEqual(response.data['name'], self.rackgroup1.name)
  193. def test_list_rackgroups(self):
  194. url = reverse('dcim-api:rackgroup-list')
  195. response = self.client.get(url, **self.header)
  196. self.assertEqual(response.data['count'], 3)
  197. def test_create_rackgroup(self):
  198. data = {
  199. 'name': 'Test Rack Group 4',
  200. 'slug': 'test-rack-group-4',
  201. 'site': self.site1.pk,
  202. }
  203. url = reverse('dcim-api:rackgroup-list')
  204. response = self.client.post(url, data, format='json', **self.header)
  205. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  206. self.assertEqual(RackGroup.objects.count(), 4)
  207. rackgroup4 = RackGroup.objects.get(pk=response.data['id'])
  208. self.assertEqual(rackgroup4.name, data['name'])
  209. self.assertEqual(rackgroup4.slug, data['slug'])
  210. self.assertEqual(rackgroup4.site_id, data['site'])
  211. def test_create_rackgroup_bulk(self):
  212. data = [
  213. {
  214. 'name': 'Test Rack Group 4',
  215. 'slug': 'test-rack-group-4',
  216. 'site': self.site1.pk,
  217. },
  218. {
  219. 'name': 'Test Rack Group 5',
  220. 'slug': 'test-rack-group-5',
  221. 'site': self.site1.pk,
  222. },
  223. {
  224. 'name': 'Test Rack Group 6',
  225. 'slug': 'test-rack-group-6',
  226. 'site': self.site1.pk,
  227. },
  228. ]
  229. url = reverse('dcim-api:rackgroup-list')
  230. response = self.client.post(url, data, format='json', **self.header)
  231. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  232. self.assertEqual(RackGroup.objects.count(), 6)
  233. self.assertEqual(response.data[0]['name'], data[0]['name'])
  234. self.assertEqual(response.data[1]['name'], data[1]['name'])
  235. self.assertEqual(response.data[2]['name'], data[2]['name'])
  236. def test_update_rackgroup(self):
  237. data = {
  238. 'name': 'Test Rack Group X',
  239. 'slug': 'test-rack-group-x',
  240. 'site': self.site2.pk,
  241. }
  242. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  243. response = self.client.put(url, data, format='json', **self.header)
  244. self.assertHttpStatus(response, status.HTTP_200_OK)
  245. self.assertEqual(RackGroup.objects.count(), 3)
  246. rackgroup1 = RackGroup.objects.get(pk=response.data['id'])
  247. self.assertEqual(rackgroup1.name, data['name'])
  248. self.assertEqual(rackgroup1.slug, data['slug'])
  249. self.assertEqual(rackgroup1.site_id, data['site'])
  250. def test_delete_rackgroup(self):
  251. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  252. response = self.client.delete(url, **self.header)
  253. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  254. self.assertEqual(RackGroup.objects.count(), 2)
  255. class RackRoleTest(HttpStatusMixin, APITestCase):
  256. def setUp(self):
  257. user = User.objects.create(username='testuser', is_superuser=True)
  258. token = Token.objects.create(user=user)
  259. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  260. self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000')
  261. self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00')
  262. self.rackrole3 = RackRole.objects.create(name='Test Rack Role 3', slug='test-rack-role-3', color='0000ff')
  263. def test_get_rackrole(self):
  264. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  265. response = self.client.get(url, **self.header)
  266. self.assertEqual(response.data['name'], self.rackrole1.name)
  267. def test_list_rackroles(self):
  268. url = reverse('dcim-api:rackrole-list')
  269. response = self.client.get(url, **self.header)
  270. self.assertEqual(response.data['count'], 3)
  271. def test_create_rackrole(self):
  272. data = {
  273. 'name': 'Test Rack Role 4',
  274. 'slug': 'test-rack-role-4',
  275. 'color': 'ffff00',
  276. }
  277. url = reverse('dcim-api:rackrole-list')
  278. response = self.client.post(url, data, format='json', **self.header)
  279. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  280. self.assertEqual(RackRole.objects.count(), 4)
  281. rackrole1 = RackRole.objects.get(pk=response.data['id'])
  282. self.assertEqual(rackrole1.name, data['name'])
  283. self.assertEqual(rackrole1.slug, data['slug'])
  284. self.assertEqual(rackrole1.color, data['color'])
  285. def test_create_rackrole_bulk(self):
  286. data = [
  287. {
  288. 'name': 'Test Rack Role 4',
  289. 'slug': 'test-rack-role-4',
  290. 'color': 'ffff00',
  291. },
  292. {
  293. 'name': 'Test Rack Role 5',
  294. 'slug': 'test-rack-role-5',
  295. 'color': 'ffff00',
  296. },
  297. {
  298. 'name': 'Test Rack Role 6',
  299. 'slug': 'test-rack-role-6',
  300. 'color': 'ffff00',
  301. },
  302. ]
  303. url = reverse('dcim-api:rackrole-list')
  304. response = self.client.post(url, data, format='json', **self.header)
  305. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  306. self.assertEqual(RackRole.objects.count(), 6)
  307. self.assertEqual(response.data[0]['name'], data[0]['name'])
  308. self.assertEqual(response.data[1]['name'], data[1]['name'])
  309. self.assertEqual(response.data[2]['name'], data[2]['name'])
  310. def test_update_rackrole(self):
  311. data = {
  312. 'name': 'Test Rack Role X',
  313. 'slug': 'test-rack-role-x',
  314. 'color': 'ffff00',
  315. }
  316. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  317. response = self.client.put(url, data, format='json', **self.header)
  318. self.assertHttpStatus(response, status.HTTP_200_OK)
  319. self.assertEqual(RackRole.objects.count(), 3)
  320. rackrole1 = RackRole.objects.get(pk=response.data['id'])
  321. self.assertEqual(rackrole1.name, data['name'])
  322. self.assertEqual(rackrole1.slug, data['slug'])
  323. self.assertEqual(rackrole1.color, data['color'])
  324. def test_delete_rackrole(self):
  325. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  326. response = self.client.delete(url, **self.header)
  327. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  328. self.assertEqual(RackRole.objects.count(), 2)
  329. class RackTest(HttpStatusMixin, APITestCase):
  330. def setUp(self):
  331. user = User.objects.create(username='testuser', is_superuser=True)
  332. token = Token.objects.create(user=user)
  333. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  334. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  335. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  336. self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1')
  337. self.rackgroup2 = RackGroup.objects.create(site=self.site2, name='Test Rack Group 2', slug='test-rack-group-2')
  338. self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000')
  339. self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00')
  340. self.rack1 = Rack.objects.create(
  341. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 1', u_height=42,
  342. )
  343. self.rack2 = Rack.objects.create(
  344. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 2', u_height=42,
  345. )
  346. self.rack3 = Rack.objects.create(
  347. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 3', u_height=42,
  348. )
  349. def test_get_rack(self):
  350. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  351. response = self.client.get(url, **self.header)
  352. self.assertEqual(response.data['name'], self.rack1.name)
  353. def test_get_rack_units(self):
  354. url = reverse('dcim-api:rack-units', kwargs={'pk': self.rack1.pk})
  355. response = self.client.get(url, **self.header)
  356. self.assertEqual(response.data['count'], 42)
  357. def test_list_racks(self):
  358. url = reverse('dcim-api:rack-list')
  359. response = self.client.get(url, **self.header)
  360. self.assertEqual(response.data['count'], 3)
  361. def test_create_rack(self):
  362. data = {
  363. 'name': 'Test Rack 4',
  364. 'site': self.site1.pk,
  365. 'group': self.rackgroup1.pk,
  366. 'role': self.rackrole1.pk,
  367. }
  368. url = reverse('dcim-api:rack-list')
  369. response = self.client.post(url, data, format='json', **self.header)
  370. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  371. self.assertEqual(Rack.objects.count(), 4)
  372. rack4 = Rack.objects.get(pk=response.data['id'])
  373. self.assertEqual(rack4.name, data['name'])
  374. self.assertEqual(rack4.site_id, data['site'])
  375. self.assertEqual(rack4.group_id, data['group'])
  376. self.assertEqual(rack4.role_id, data['role'])
  377. def test_create_rack_bulk(self):
  378. data = [
  379. {
  380. 'name': 'Test Rack 4',
  381. 'site': self.site1.pk,
  382. 'group': self.rackgroup1.pk,
  383. 'role': self.rackrole1.pk,
  384. },
  385. {
  386. 'name': 'Test Rack 5',
  387. 'site': self.site1.pk,
  388. 'group': self.rackgroup1.pk,
  389. 'role': self.rackrole1.pk,
  390. },
  391. {
  392. 'name': 'Test Rack 6',
  393. 'site': self.site1.pk,
  394. 'group': self.rackgroup1.pk,
  395. 'role': self.rackrole1.pk,
  396. },
  397. ]
  398. url = reverse('dcim-api:rack-list')
  399. response = self.client.post(url, data, format='json', **self.header)
  400. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  401. self.assertEqual(Rack.objects.count(), 6)
  402. self.assertEqual(response.data[0]['name'], data[0]['name'])
  403. self.assertEqual(response.data[1]['name'], data[1]['name'])
  404. self.assertEqual(response.data[2]['name'], data[2]['name'])
  405. def test_update_rack(self):
  406. data = {
  407. 'name': 'Test Rack X',
  408. 'site': self.site2.pk,
  409. 'group': self.rackgroup2.pk,
  410. 'role': self.rackrole2.pk,
  411. }
  412. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  413. response = self.client.put(url, data, format='json', **self.header)
  414. self.assertHttpStatus(response, status.HTTP_200_OK)
  415. self.assertEqual(Rack.objects.count(), 3)
  416. rack1 = Rack.objects.get(pk=response.data['id'])
  417. self.assertEqual(rack1.name, data['name'])
  418. self.assertEqual(rack1.site_id, data['site'])
  419. self.assertEqual(rack1.group_id, data['group'])
  420. self.assertEqual(rack1.role_id, data['role'])
  421. def test_delete_rack(self):
  422. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  423. response = self.client.delete(url, **self.header)
  424. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  425. self.assertEqual(Rack.objects.count(), 2)
  426. class RackReservationTest(HttpStatusMixin, APITestCase):
  427. def setUp(self):
  428. user = User.objects.create(username='testuser', is_superuser=True)
  429. token = Token.objects.create(user=user)
  430. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  431. self.user1 = user
  432. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  433. self.rack1 = Rack.objects.create(site=self.site1, name='Test Rack 1')
  434. self.rackreservation1 = RackReservation.objects.create(
  435. rack=self.rack1, units=[1, 2, 3], user=user, description='Reservation #1',
  436. )
  437. self.rackreservation2 = RackReservation.objects.create(
  438. rack=self.rack1, units=[4, 5, 6], user=user, description='Reservation #2',
  439. )
  440. self.rackreservation3 = RackReservation.objects.create(
  441. rack=self.rack1, units=[7, 8, 9], user=user, description='Reservation #3',
  442. )
  443. def test_get_rackreservation(self):
  444. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  445. response = self.client.get(url, **self.header)
  446. self.assertEqual(response.data['id'], self.rackreservation1.pk)
  447. def test_list_rackreservations(self):
  448. url = reverse('dcim-api:rackreservation-list')
  449. response = self.client.get(url, **self.header)
  450. self.assertEqual(response.data['count'], 3)
  451. def test_create_rackreservation(self):
  452. data = {
  453. 'rack': self.rack1.pk,
  454. 'units': [10, 11, 12],
  455. 'user': self.user1.pk,
  456. 'description': 'Fourth reservation',
  457. }
  458. url = reverse('dcim-api:rackreservation-list')
  459. response = self.client.post(url, data, format='json', **self.header)
  460. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  461. self.assertEqual(RackReservation.objects.count(), 4)
  462. rackreservation4 = RackReservation.objects.get(pk=response.data['id'])
  463. self.assertEqual(rackreservation4.rack_id, data['rack'])
  464. self.assertEqual(rackreservation4.units, data['units'])
  465. self.assertEqual(rackreservation4.user_id, data['user'])
  466. self.assertEqual(rackreservation4.description, data['description'])
  467. def test_create_rackreservation_bulk(self):
  468. data = [
  469. {
  470. 'rack': self.rack1.pk,
  471. 'units': [10, 11, 12],
  472. 'user': self.user1.pk,
  473. 'description': 'Reservation #4',
  474. },
  475. {
  476. 'rack': self.rack1.pk,
  477. 'units': [13, 14, 15],
  478. 'user': self.user1.pk,
  479. 'description': 'Reservation #5',
  480. },
  481. {
  482. 'rack': self.rack1.pk,
  483. 'units': [16, 17, 18],
  484. 'user': self.user1.pk,
  485. 'description': 'Reservation #6',
  486. },
  487. ]
  488. url = reverse('dcim-api:rackreservation-list')
  489. response = self.client.post(url, data, format='json', **self.header)
  490. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  491. self.assertEqual(RackReservation.objects.count(), 6)
  492. self.assertEqual(response.data[0]['description'], data[0]['description'])
  493. self.assertEqual(response.data[1]['description'], data[1]['description'])
  494. self.assertEqual(response.data[2]['description'], data[2]['description'])
  495. def test_update_rackreservation(self):
  496. data = {
  497. 'rack': self.rack1.pk,
  498. 'units': [10, 11, 12],
  499. 'user': self.user1.pk,
  500. 'description': 'Modified reservation',
  501. }
  502. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  503. response = self.client.put(url, data, format='json', **self.header)
  504. self.assertHttpStatus(response, status.HTTP_200_OK)
  505. self.assertEqual(RackReservation.objects.count(), 3)
  506. rackreservation1 = RackReservation.objects.get(pk=response.data['id'])
  507. self.assertEqual(rackreservation1.units, data['units'])
  508. self.assertEqual(rackreservation1.description, data['description'])
  509. def test_delete_rackreservation(self):
  510. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  511. response = self.client.delete(url, **self.header)
  512. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  513. self.assertEqual(RackReservation.objects.count(), 2)
  514. class ManufacturerTest(HttpStatusMixin, APITestCase):
  515. def setUp(self):
  516. user = User.objects.create(username='testuser', is_superuser=True)
  517. token = Token.objects.create(user=user)
  518. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  519. self.manufacturer1 = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  520. self.manufacturer2 = Manufacturer.objects.create(name='Test Manufacturer 2', slug='test-manufacturer-2')
  521. self.manufacturer3 = Manufacturer.objects.create(name='Test Manufacturer 3', slug='test-manufacturer-3')
  522. def test_get_manufacturer(self):
  523. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  524. response = self.client.get(url, **self.header)
  525. self.assertEqual(response.data['name'], self.manufacturer1.name)
  526. def test_list_manufacturers(self):
  527. url = reverse('dcim-api:manufacturer-list')
  528. response = self.client.get(url, **self.header)
  529. self.assertEqual(response.data['count'], 3)
  530. def test_create_manufacturer(self):
  531. data = {
  532. 'name': 'Test Manufacturer 4',
  533. 'slug': 'test-manufacturer-4',
  534. }
  535. url = reverse('dcim-api:manufacturer-list')
  536. response = self.client.post(url, data, format='json', **self.header)
  537. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  538. self.assertEqual(Manufacturer.objects.count(), 4)
  539. manufacturer4 = Manufacturer.objects.get(pk=response.data['id'])
  540. self.assertEqual(manufacturer4.name, data['name'])
  541. self.assertEqual(manufacturer4.slug, data['slug'])
  542. def test_create_manufacturer_bulk(self):
  543. data = [
  544. {
  545. 'name': 'Test Manufacturer 4',
  546. 'slug': 'test-manufacturer-4',
  547. },
  548. {
  549. 'name': 'Test Manufacturer 5',
  550. 'slug': 'test-manufacturer-5',
  551. },
  552. {
  553. 'name': 'Test Manufacturer 6',
  554. 'slug': 'test-manufacturer-6',
  555. },
  556. ]
  557. url = reverse('dcim-api:manufacturer-list')
  558. response = self.client.post(url, data, format='json', **self.header)
  559. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  560. self.assertEqual(Manufacturer.objects.count(), 6)
  561. self.assertEqual(response.data[0]['name'], data[0]['name'])
  562. self.assertEqual(response.data[1]['name'], data[1]['name'])
  563. self.assertEqual(response.data[2]['name'], data[2]['name'])
  564. def test_update_manufacturer(self):
  565. data = {
  566. 'name': 'Test Manufacturer X',
  567. 'slug': 'test-manufacturer-x',
  568. }
  569. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  570. response = self.client.put(url, data, format='json', **self.header)
  571. self.assertHttpStatus(response, status.HTTP_200_OK)
  572. self.assertEqual(Manufacturer.objects.count(), 3)
  573. manufacturer1 = Manufacturer.objects.get(pk=response.data['id'])
  574. self.assertEqual(manufacturer1.name, data['name'])
  575. self.assertEqual(manufacturer1.slug, data['slug'])
  576. def test_delete_manufacturer(self):
  577. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  578. response = self.client.delete(url, **self.header)
  579. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  580. self.assertEqual(Manufacturer.objects.count(), 2)
  581. class DeviceTypeTest(HttpStatusMixin, APITestCase):
  582. def setUp(self):
  583. user = User.objects.create(username='testuser', is_superuser=True)
  584. token = Token.objects.create(user=user)
  585. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  586. self.manufacturer1 = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  587. self.manufacturer2 = Manufacturer.objects.create(name='Test Manufacturer 2', slug='test-manufacturer-2')
  588. self.devicetype1 = DeviceType.objects.create(
  589. manufacturer=self.manufacturer1, model='Test Device Type 1', slug='test-device-type-1'
  590. )
  591. self.devicetype2 = DeviceType.objects.create(
  592. manufacturer=self.manufacturer1, model='Test Device Type 2', slug='test-device-type-2'
  593. )
  594. self.devicetype3 = DeviceType.objects.create(
  595. manufacturer=self.manufacturer1, model='Test Device Type 3', slug='test-device-type-3'
  596. )
  597. def test_get_devicetype(self):
  598. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  599. response = self.client.get(url, **self.header)
  600. self.assertEqual(response.data['model'], self.devicetype1.model)
  601. def test_list_devicetypes(self):
  602. url = reverse('dcim-api:devicetype-list')
  603. response = self.client.get(url, **self.header)
  604. self.assertEqual(response.data['count'], 3)
  605. def test_create_devicetype(self):
  606. data = {
  607. 'manufacturer': self.manufacturer1.pk,
  608. 'model': 'Test Device Type 4',
  609. 'slug': 'test-device-type-4',
  610. }
  611. url = reverse('dcim-api:devicetype-list')
  612. response = self.client.post(url, data, format='json', **self.header)
  613. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  614. self.assertEqual(DeviceType.objects.count(), 4)
  615. devicetype4 = DeviceType.objects.get(pk=response.data['id'])
  616. self.assertEqual(devicetype4.manufacturer_id, data['manufacturer'])
  617. self.assertEqual(devicetype4.model, data['model'])
  618. self.assertEqual(devicetype4.slug, data['slug'])
  619. def test_create_devicetype_bulk(self):
  620. data = [
  621. {
  622. 'manufacturer': self.manufacturer1.pk,
  623. 'model': 'Test Device Type 4',
  624. 'slug': 'test-device-type-4',
  625. },
  626. {
  627. 'manufacturer': self.manufacturer1.pk,
  628. 'model': 'Test Device Type 5',
  629. 'slug': 'test-device-type-5',
  630. },
  631. {
  632. 'manufacturer': self.manufacturer1.pk,
  633. 'model': 'Test Device Type 6',
  634. 'slug': 'test-device-type-6',
  635. },
  636. ]
  637. url = reverse('dcim-api:devicetype-list')
  638. response = self.client.post(url, data, format='json', **self.header)
  639. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  640. self.assertEqual(DeviceType.objects.count(), 6)
  641. self.assertEqual(response.data[0]['model'], data[0]['model'])
  642. self.assertEqual(response.data[1]['model'], data[1]['model'])
  643. self.assertEqual(response.data[2]['model'], data[2]['model'])
  644. def test_update_devicetype(self):
  645. data = {
  646. 'manufacturer': self.manufacturer2.pk,
  647. 'model': 'Test Device Type X',
  648. 'slug': 'test-device-type-x',
  649. }
  650. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  651. response = self.client.put(url, data, format='json', **self.header)
  652. self.assertHttpStatus(response, status.HTTP_200_OK)
  653. self.assertEqual(DeviceType.objects.count(), 3)
  654. devicetype1 = DeviceType.objects.get(pk=response.data['id'])
  655. self.assertEqual(devicetype1.manufacturer_id, data['manufacturer'])
  656. self.assertEqual(devicetype1.model, data['model'])
  657. self.assertEqual(devicetype1.slug, data['slug'])
  658. def test_delete_devicetype(self):
  659. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  660. response = self.client.delete(url, **self.header)
  661. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  662. self.assertEqual(DeviceType.objects.count(), 2)
  663. class ConsolePortTemplateTest(HttpStatusMixin, APITestCase):
  664. def setUp(self):
  665. user = User.objects.create(username='testuser', is_superuser=True)
  666. token = Token.objects.create(user=user)
  667. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  668. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  669. self.devicetype = DeviceType.objects.create(
  670. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  671. )
  672. self.consoleporttemplate1 = ConsolePortTemplate.objects.create(
  673. device_type=self.devicetype, name='Test CP Template 1'
  674. )
  675. self.consoleporttemplate2 = ConsolePortTemplate.objects.create(
  676. device_type=self.devicetype, name='Test CP Template 2'
  677. )
  678. self.consoleporttemplate3 = ConsolePortTemplate.objects.create(
  679. device_type=self.devicetype, name='Test CP Template 3'
  680. )
  681. def test_get_consoleporttemplate(self):
  682. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  683. response = self.client.get(url, **self.header)
  684. self.assertEqual(response.data['name'], self.consoleporttemplate1.name)
  685. def test_list_consoleporttemplates(self):
  686. url = reverse('dcim-api:consoleporttemplate-list')
  687. response = self.client.get(url, **self.header)
  688. self.assertEqual(response.data['count'], 3)
  689. def test_create_consoleporttemplate(self):
  690. data = {
  691. 'device_type': self.devicetype.pk,
  692. 'name': 'Test CP Template 4',
  693. }
  694. url = reverse('dcim-api:consoleporttemplate-list')
  695. response = self.client.post(url, data, format='json', **self.header)
  696. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  697. self.assertEqual(ConsolePortTemplate.objects.count(), 4)
  698. consoleporttemplate4 = ConsolePortTemplate.objects.get(pk=response.data['id'])
  699. self.assertEqual(consoleporttemplate4.device_type_id, data['device_type'])
  700. self.assertEqual(consoleporttemplate4.name, data['name'])
  701. def test_create_consoleporttemplate_bulk(self):
  702. data = [
  703. {
  704. 'device_type': self.devicetype.pk,
  705. 'name': 'Test CP Template 4',
  706. },
  707. {
  708. 'device_type': self.devicetype.pk,
  709. 'name': 'Test CP Template 5',
  710. },
  711. {
  712. 'device_type': self.devicetype.pk,
  713. 'name': 'Test CP Template 6',
  714. },
  715. ]
  716. url = reverse('dcim-api:consoleporttemplate-list')
  717. response = self.client.post(url, data, format='json', **self.header)
  718. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  719. self.assertEqual(ConsolePortTemplate.objects.count(), 6)
  720. self.assertEqual(response.data[0]['name'], data[0]['name'])
  721. self.assertEqual(response.data[1]['name'], data[1]['name'])
  722. self.assertEqual(response.data[2]['name'], data[2]['name'])
  723. def test_update_consoleporttemplate(self):
  724. data = {
  725. 'device_type': self.devicetype.pk,
  726. 'name': 'Test CP Template X',
  727. }
  728. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  729. response = self.client.put(url, data, format='json', **self.header)
  730. self.assertHttpStatus(response, status.HTTP_200_OK)
  731. self.assertEqual(ConsolePortTemplate.objects.count(), 3)
  732. consoleporttemplate1 = ConsolePortTemplate.objects.get(pk=response.data['id'])
  733. self.assertEqual(consoleporttemplate1.name, data['name'])
  734. def test_delete_consoleporttemplate(self):
  735. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  736. response = self.client.delete(url, **self.header)
  737. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  738. self.assertEqual(ConsolePortTemplate.objects.count(), 2)
  739. class ConsoleServerPortTemplateTest(HttpStatusMixin, APITestCase):
  740. def setUp(self):
  741. user = User.objects.create(username='testuser', is_superuser=True)
  742. token = Token.objects.create(user=user)
  743. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  744. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  745. self.devicetype = DeviceType.objects.create(
  746. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  747. )
  748. self.consoleserverporttemplate1 = ConsoleServerPortTemplate.objects.create(
  749. device_type=self.devicetype, name='Test CSP Template 1'
  750. )
  751. self.consoleserverporttemplate2 = ConsoleServerPortTemplate.objects.create(
  752. device_type=self.devicetype, name='Test CSP Template 2'
  753. )
  754. self.consoleserverporttemplate3 = ConsoleServerPortTemplate.objects.create(
  755. device_type=self.devicetype, name='Test CSP Template 3'
  756. )
  757. def test_get_consoleserverporttemplate(self):
  758. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  759. response = self.client.get(url, **self.header)
  760. self.assertEqual(response.data['name'], self.consoleserverporttemplate1.name)
  761. def test_list_consoleserverporttemplates(self):
  762. url = reverse('dcim-api:consoleserverporttemplate-list')
  763. response = self.client.get(url, **self.header)
  764. self.assertEqual(response.data['count'], 3)
  765. def test_create_consoleserverporttemplate(self):
  766. data = {
  767. 'device_type': self.devicetype.pk,
  768. 'name': 'Test CSP Template 4',
  769. }
  770. url = reverse('dcim-api:consoleserverporttemplate-list')
  771. response = self.client.post(url, data, format='json', **self.header)
  772. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  773. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 4)
  774. consoleserverporttemplate4 = ConsoleServerPortTemplate.objects.get(pk=response.data['id'])
  775. self.assertEqual(consoleserverporttemplate4.device_type_id, data['device_type'])
  776. self.assertEqual(consoleserverporttemplate4.name, data['name'])
  777. def test_create_consoleserverporttemplate_bulk(self):
  778. data = [
  779. {
  780. 'device_type': self.devicetype.pk,
  781. 'name': 'Test CSP Template 4',
  782. },
  783. {
  784. 'device_type': self.devicetype.pk,
  785. 'name': 'Test CSP Template 5',
  786. },
  787. {
  788. 'device_type': self.devicetype.pk,
  789. 'name': 'Test CSP Template 6',
  790. },
  791. ]
  792. url = reverse('dcim-api:consoleserverporttemplate-list')
  793. response = self.client.post(url, data, format='json', **self.header)
  794. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  795. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 6)
  796. self.assertEqual(response.data[0]['name'], data[0]['name'])
  797. self.assertEqual(response.data[1]['name'], data[1]['name'])
  798. self.assertEqual(response.data[2]['name'], data[2]['name'])
  799. def test_update_consoleserverporttemplate(self):
  800. data = {
  801. 'device_type': self.devicetype.pk,
  802. 'name': 'Test CSP Template X',
  803. }
  804. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  805. response = self.client.put(url, data, format='json', **self.header)
  806. self.assertHttpStatus(response, status.HTTP_200_OK)
  807. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 3)
  808. consoleserverporttemplate1 = ConsoleServerPortTemplate.objects.get(pk=response.data['id'])
  809. self.assertEqual(consoleserverporttemplate1.name, data['name'])
  810. def test_delete_consoleserverporttemplate(self):
  811. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  812. response = self.client.delete(url, **self.header)
  813. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  814. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 2)
  815. class PowerPortTemplateTest(HttpStatusMixin, APITestCase):
  816. def setUp(self):
  817. user = User.objects.create(username='testuser', is_superuser=True)
  818. token = Token.objects.create(user=user)
  819. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  820. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  821. self.devicetype = DeviceType.objects.create(
  822. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  823. )
  824. self.powerporttemplate1 = PowerPortTemplate.objects.create(
  825. device_type=self.devicetype, name='Test PP Template 1'
  826. )
  827. self.powerporttemplate2 = PowerPortTemplate.objects.create(
  828. device_type=self.devicetype, name='Test PP Template 2'
  829. )
  830. self.powerporttemplate3 = PowerPortTemplate.objects.create(
  831. device_type=self.devicetype, name='Test PP Template 3'
  832. )
  833. def test_get_powerporttemplate(self):
  834. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  835. response = self.client.get(url, **self.header)
  836. self.assertEqual(response.data['name'], self.powerporttemplate1.name)
  837. def test_list_powerporttemplates(self):
  838. url = reverse('dcim-api:powerporttemplate-list')
  839. response = self.client.get(url, **self.header)
  840. self.assertEqual(response.data['count'], 3)
  841. def test_create_powerporttemplate(self):
  842. data = {
  843. 'device_type': self.devicetype.pk,
  844. 'name': 'Test PP Template 4',
  845. }
  846. url = reverse('dcim-api:powerporttemplate-list')
  847. response = self.client.post(url, data, format='json', **self.header)
  848. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  849. self.assertEqual(PowerPortTemplate.objects.count(), 4)
  850. powerporttemplate4 = PowerPortTemplate.objects.get(pk=response.data['id'])
  851. self.assertEqual(powerporttemplate4.device_type_id, data['device_type'])
  852. self.assertEqual(powerporttemplate4.name, data['name'])
  853. def test_create_powerporttemplate_bulk(self):
  854. data = [
  855. {
  856. 'device_type': self.devicetype.pk,
  857. 'name': 'Test PP Template 4',
  858. },
  859. {
  860. 'device_type': self.devicetype.pk,
  861. 'name': 'Test PP Template 5',
  862. },
  863. {
  864. 'device_type': self.devicetype.pk,
  865. 'name': 'Test PP Template 6',
  866. },
  867. ]
  868. url = reverse('dcim-api:powerporttemplate-list')
  869. response = self.client.post(url, data, format='json', **self.header)
  870. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  871. self.assertEqual(PowerPortTemplate.objects.count(), 6)
  872. self.assertEqual(response.data[0]['name'], data[0]['name'])
  873. self.assertEqual(response.data[1]['name'], data[1]['name'])
  874. self.assertEqual(response.data[2]['name'], data[2]['name'])
  875. def test_update_powerporttemplate(self):
  876. data = {
  877. 'device_type': self.devicetype.pk,
  878. 'name': 'Test PP Template X',
  879. }
  880. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  881. response = self.client.put(url, data, format='json', **self.header)
  882. self.assertHttpStatus(response, status.HTTP_200_OK)
  883. self.assertEqual(PowerPortTemplate.objects.count(), 3)
  884. powerporttemplate1 = PowerPortTemplate.objects.get(pk=response.data['id'])
  885. self.assertEqual(powerporttemplate1.name, data['name'])
  886. def test_delete_powerporttemplate(self):
  887. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  888. response = self.client.delete(url, **self.header)
  889. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  890. self.assertEqual(PowerPortTemplate.objects.count(), 2)
  891. class PowerOutletTemplateTest(HttpStatusMixin, APITestCase):
  892. def setUp(self):
  893. user = User.objects.create(username='testuser', is_superuser=True)
  894. token = Token.objects.create(user=user)
  895. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  896. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  897. self.devicetype = DeviceType.objects.create(
  898. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  899. )
  900. self.poweroutlettemplate1 = PowerOutletTemplate.objects.create(
  901. device_type=self.devicetype, name='Test PO Template 1'
  902. )
  903. self.poweroutlettemplate2 = PowerOutletTemplate.objects.create(
  904. device_type=self.devicetype, name='Test PO Template 2'
  905. )
  906. self.poweroutlettemplate3 = PowerOutletTemplate.objects.create(
  907. device_type=self.devicetype, name='Test PO Template 3'
  908. )
  909. def test_get_poweroutlettemplate(self):
  910. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  911. response = self.client.get(url, **self.header)
  912. self.assertEqual(response.data['name'], self.poweroutlettemplate1.name)
  913. def test_list_poweroutlettemplates(self):
  914. url = reverse('dcim-api:poweroutlettemplate-list')
  915. response = self.client.get(url, **self.header)
  916. self.assertEqual(response.data['count'], 3)
  917. def test_create_poweroutlettemplate(self):
  918. data = {
  919. 'device_type': self.devicetype.pk,
  920. 'name': 'Test PO Template 4',
  921. }
  922. url = reverse('dcim-api:poweroutlettemplate-list')
  923. response = self.client.post(url, data, format='json', **self.header)
  924. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  925. self.assertEqual(PowerOutletTemplate.objects.count(), 4)
  926. poweroutlettemplate4 = PowerOutletTemplate.objects.get(pk=response.data['id'])
  927. self.assertEqual(poweroutlettemplate4.device_type_id, data['device_type'])
  928. self.assertEqual(poweroutlettemplate4.name, data['name'])
  929. def test_create_poweroutlettemplate_bulk(self):
  930. data = [
  931. {
  932. 'device_type': self.devicetype.pk,
  933. 'name': 'Test PO Template 4',
  934. },
  935. {
  936. 'device_type': self.devicetype.pk,
  937. 'name': 'Test PO Template 5',
  938. },
  939. {
  940. 'device_type': self.devicetype.pk,
  941. 'name': 'Test PO Template 6',
  942. },
  943. ]
  944. url = reverse('dcim-api:poweroutlettemplate-list')
  945. response = self.client.post(url, data, format='json', **self.header)
  946. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  947. self.assertEqual(PowerOutletTemplate.objects.count(), 6)
  948. self.assertEqual(response.data[0]['name'], data[0]['name'])
  949. self.assertEqual(response.data[1]['name'], data[1]['name'])
  950. self.assertEqual(response.data[2]['name'], data[2]['name'])
  951. def test_update_poweroutlettemplate(self):
  952. data = {
  953. 'device_type': self.devicetype.pk,
  954. 'name': 'Test PO Template X',
  955. }
  956. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  957. response = self.client.put(url, data, format='json', **self.header)
  958. self.assertHttpStatus(response, status.HTTP_200_OK)
  959. self.assertEqual(PowerOutletTemplate.objects.count(), 3)
  960. poweroutlettemplate1 = PowerOutletTemplate.objects.get(pk=response.data['id'])
  961. self.assertEqual(poweroutlettemplate1.name, data['name'])
  962. def test_delete_poweroutlettemplate(self):
  963. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  964. response = self.client.delete(url, **self.header)
  965. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  966. self.assertEqual(PowerOutletTemplate.objects.count(), 2)
  967. class InterfaceTemplateTest(HttpStatusMixin, APITestCase):
  968. def setUp(self):
  969. user = User.objects.create(username='testuser', is_superuser=True)
  970. token = Token.objects.create(user=user)
  971. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  972. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  973. self.devicetype = DeviceType.objects.create(
  974. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  975. )
  976. self.interfacetemplate1 = InterfaceTemplate.objects.create(
  977. device_type=self.devicetype, name='Test Interface Template 1'
  978. )
  979. self.interfacetemplate2 = InterfaceTemplate.objects.create(
  980. device_type=self.devicetype, name='Test Interface Template 2'
  981. )
  982. self.interfacetemplate3 = InterfaceTemplate.objects.create(
  983. device_type=self.devicetype, name='Test Interface Template 3'
  984. )
  985. def test_get_interfacetemplate(self):
  986. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  987. response = self.client.get(url, **self.header)
  988. self.assertEqual(response.data['name'], self.interfacetemplate1.name)
  989. def test_list_interfacetemplates(self):
  990. url = reverse('dcim-api:interfacetemplate-list')
  991. response = self.client.get(url, **self.header)
  992. self.assertEqual(response.data['count'], 3)
  993. def test_create_interfacetemplate(self):
  994. data = {
  995. 'device_type': self.devicetype.pk,
  996. 'name': 'Test Interface Template 4',
  997. }
  998. url = reverse('dcim-api:interfacetemplate-list')
  999. response = self.client.post(url, data, format='json', **self.header)
  1000. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1001. self.assertEqual(InterfaceTemplate.objects.count(), 4)
  1002. interfacetemplate4 = InterfaceTemplate.objects.get(pk=response.data['id'])
  1003. self.assertEqual(interfacetemplate4.device_type_id, data['device_type'])
  1004. self.assertEqual(interfacetemplate4.name, data['name'])
  1005. def test_create_interfacetemplate_bulk(self):
  1006. data = [
  1007. {
  1008. 'device_type': self.devicetype.pk,
  1009. 'name': 'Test Interface Template 4',
  1010. },
  1011. {
  1012. 'device_type': self.devicetype.pk,
  1013. 'name': 'Test Interface Template 5',
  1014. },
  1015. {
  1016. 'device_type': self.devicetype.pk,
  1017. 'name': 'Test Interface Template 6',
  1018. },
  1019. ]
  1020. url = reverse('dcim-api:interfacetemplate-list')
  1021. response = self.client.post(url, data, format='json', **self.header)
  1022. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1023. self.assertEqual(InterfaceTemplate.objects.count(), 6)
  1024. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1025. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1026. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1027. def test_update_interfacetemplate(self):
  1028. data = {
  1029. 'device_type': self.devicetype.pk,
  1030. 'name': 'Test Interface Template X',
  1031. }
  1032. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  1033. response = self.client.put(url, data, format='json', **self.header)
  1034. self.assertHttpStatus(response, status.HTTP_200_OK)
  1035. self.assertEqual(InterfaceTemplate.objects.count(), 3)
  1036. interfacetemplate1 = InterfaceTemplate.objects.get(pk=response.data['id'])
  1037. self.assertEqual(interfacetemplate1.name, data['name'])
  1038. def test_delete_interfacetemplate(self):
  1039. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  1040. response = self.client.delete(url, **self.header)
  1041. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1042. self.assertEqual(InterfaceTemplate.objects.count(), 2)
  1043. class DeviceBayTemplateTest(HttpStatusMixin, APITestCase):
  1044. def setUp(self):
  1045. user = User.objects.create(username='testuser', is_superuser=True)
  1046. token = Token.objects.create(user=user)
  1047. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1048. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1049. self.devicetype = DeviceType.objects.create(
  1050. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1051. )
  1052. self.devicebaytemplate1 = DeviceBayTemplate.objects.create(
  1053. device_type=self.devicetype, name='Test Device Bay Template 1'
  1054. )
  1055. self.devicebaytemplate2 = DeviceBayTemplate.objects.create(
  1056. device_type=self.devicetype, name='Test Device Bay Template 2'
  1057. )
  1058. self.devicebaytemplate3 = DeviceBayTemplate.objects.create(
  1059. device_type=self.devicetype, name='Test Device Bay Template 3'
  1060. )
  1061. def test_get_devicebaytemplate(self):
  1062. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  1063. response = self.client.get(url, **self.header)
  1064. self.assertEqual(response.data['name'], self.devicebaytemplate1.name)
  1065. def test_list_devicebaytemplates(self):
  1066. url = reverse('dcim-api:devicebaytemplate-list')
  1067. response = self.client.get(url, **self.header)
  1068. self.assertEqual(response.data['count'], 3)
  1069. def test_create_devicebaytemplate(self):
  1070. data = {
  1071. 'device_type': self.devicetype.pk,
  1072. 'name': 'Test Device Bay Template 4',
  1073. }
  1074. url = reverse('dcim-api:devicebaytemplate-list')
  1075. response = self.client.post(url, data, format='json', **self.header)
  1076. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1077. self.assertEqual(DeviceBayTemplate.objects.count(), 4)
  1078. devicebaytemplate4 = DeviceBayTemplate.objects.get(pk=response.data['id'])
  1079. self.assertEqual(devicebaytemplate4.device_type_id, data['device_type'])
  1080. self.assertEqual(devicebaytemplate4.name, data['name'])
  1081. def test_create_devicebaytemplate_bulk(self):
  1082. data = [
  1083. {
  1084. 'device_type': self.devicetype.pk,
  1085. 'name': 'Test Device Bay Template 4',
  1086. },
  1087. {
  1088. 'device_type': self.devicetype.pk,
  1089. 'name': 'Test Device Bay Template 5',
  1090. },
  1091. {
  1092. 'device_type': self.devicetype.pk,
  1093. 'name': 'Test Device Bay Template 6',
  1094. },
  1095. ]
  1096. url = reverse('dcim-api:devicebaytemplate-list')
  1097. response = self.client.post(url, data, format='json', **self.header)
  1098. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1099. self.assertEqual(DeviceBayTemplate.objects.count(), 6)
  1100. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1101. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1102. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1103. def test_update_devicebaytemplate(self):
  1104. data = {
  1105. 'device_type': self.devicetype.pk,
  1106. 'name': 'Test Device Bay Template X',
  1107. }
  1108. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  1109. response = self.client.put(url, data, format='json', **self.header)
  1110. self.assertHttpStatus(response, status.HTTP_200_OK)
  1111. self.assertEqual(DeviceBayTemplate.objects.count(), 3)
  1112. devicebaytemplate1 = DeviceBayTemplate.objects.get(pk=response.data['id'])
  1113. self.assertEqual(devicebaytemplate1.name, data['name'])
  1114. def test_delete_devicebaytemplate(self):
  1115. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  1116. response = self.client.delete(url, **self.header)
  1117. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1118. self.assertEqual(DeviceBayTemplate.objects.count(), 2)
  1119. class DeviceRoleTest(HttpStatusMixin, APITestCase):
  1120. def setUp(self):
  1121. user = User.objects.create(username='testuser', is_superuser=True)
  1122. token = Token.objects.create(user=user)
  1123. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1124. self.devicerole1 = DeviceRole.objects.create(
  1125. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1126. )
  1127. self.devicerole2 = DeviceRole.objects.create(
  1128. name='Test Device Role 2', slug='test-device-role-2', color='00ff00'
  1129. )
  1130. self.devicerole3 = DeviceRole.objects.create(
  1131. name='Test Device Role 3', slug='test-device-role-3', color='0000ff'
  1132. )
  1133. def test_get_devicerole(self):
  1134. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  1135. response = self.client.get(url, **self.header)
  1136. self.assertEqual(response.data['name'], self.devicerole1.name)
  1137. def test_list_deviceroles(self):
  1138. url = reverse('dcim-api:devicerole-list')
  1139. response = self.client.get(url, **self.header)
  1140. self.assertEqual(response.data['count'], 3)
  1141. def test_create_devicerole(self):
  1142. data = {
  1143. 'name': 'Test Device Role 4',
  1144. 'slug': 'test-device-role-4',
  1145. 'color': 'ffff00',
  1146. }
  1147. url = reverse('dcim-api:devicerole-list')
  1148. response = self.client.post(url, data, format='json', **self.header)
  1149. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1150. self.assertEqual(DeviceRole.objects.count(), 4)
  1151. devicerole4 = DeviceRole.objects.get(pk=response.data['id'])
  1152. self.assertEqual(devicerole4.name, data['name'])
  1153. self.assertEqual(devicerole4.slug, data['slug'])
  1154. self.assertEqual(devicerole4.color, data['color'])
  1155. def test_create_devicerole_bulk(self):
  1156. data = [
  1157. {
  1158. 'name': 'Test Device Role 4',
  1159. 'slug': 'test-device-role-4',
  1160. 'color': 'ffff00',
  1161. },
  1162. {
  1163. 'name': 'Test Device Role 5',
  1164. 'slug': 'test-device-role-5',
  1165. 'color': 'ffff00',
  1166. },
  1167. {
  1168. 'name': 'Test Device Role 6',
  1169. 'slug': 'test-device-role-6',
  1170. 'color': 'ffff00',
  1171. },
  1172. ]
  1173. url = reverse('dcim-api:devicerole-list')
  1174. response = self.client.post(url, data, format='json', **self.header)
  1175. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1176. self.assertEqual(DeviceRole.objects.count(), 6)
  1177. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1178. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1179. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1180. def test_update_devicerole(self):
  1181. data = {
  1182. 'name': 'Test Device Role X',
  1183. 'slug': 'test-device-role-x',
  1184. 'color': '00ffff',
  1185. }
  1186. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  1187. response = self.client.put(url, data, format='json', **self.header)
  1188. self.assertHttpStatus(response, status.HTTP_200_OK)
  1189. self.assertEqual(DeviceRole.objects.count(), 3)
  1190. devicerole1 = DeviceRole.objects.get(pk=response.data['id'])
  1191. self.assertEqual(devicerole1.name, data['name'])
  1192. self.assertEqual(devicerole1.slug, data['slug'])
  1193. self.assertEqual(devicerole1.color, data['color'])
  1194. def test_delete_devicerole(self):
  1195. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  1196. response = self.client.delete(url, **self.header)
  1197. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1198. self.assertEqual(DeviceRole.objects.count(), 2)
  1199. class PlatformTest(HttpStatusMixin, APITestCase):
  1200. def setUp(self):
  1201. user = User.objects.create(username='testuser', is_superuser=True)
  1202. token = Token.objects.create(user=user)
  1203. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1204. self.platform1 = Platform.objects.create(name='Test Platform 1', slug='test-platform-1')
  1205. self.platform2 = Platform.objects.create(name='Test Platform 2', slug='test-platform-2')
  1206. self.platform3 = Platform.objects.create(name='Test Platform 3', slug='test-platform-3')
  1207. def test_get_platform(self):
  1208. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  1209. response = self.client.get(url, **self.header)
  1210. self.assertEqual(response.data['name'], self.platform1.name)
  1211. def test_list_platforms(self):
  1212. url = reverse('dcim-api:platform-list')
  1213. response = self.client.get(url, **self.header)
  1214. self.assertEqual(response.data['count'], 3)
  1215. def test_create_platform(self):
  1216. data = {
  1217. 'name': 'Test Platform 4',
  1218. 'slug': 'test-platform-4',
  1219. }
  1220. url = reverse('dcim-api:platform-list')
  1221. response = self.client.post(url, data, format='json', **self.header)
  1222. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1223. self.assertEqual(Platform.objects.count(), 4)
  1224. platform4 = Platform.objects.get(pk=response.data['id'])
  1225. self.assertEqual(platform4.name, data['name'])
  1226. self.assertEqual(platform4.slug, data['slug'])
  1227. def test_create_platform_bulk(self):
  1228. data = [
  1229. {
  1230. 'name': 'Test Platform 4',
  1231. 'slug': 'test-platform-4',
  1232. },
  1233. {
  1234. 'name': 'Test Platform 5',
  1235. 'slug': 'test-platform-5',
  1236. },
  1237. {
  1238. 'name': 'Test Platform 6',
  1239. 'slug': 'test-platform-6',
  1240. },
  1241. ]
  1242. url = reverse('dcim-api:platform-list')
  1243. response = self.client.post(url, data, format='json', **self.header)
  1244. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1245. self.assertEqual(Platform.objects.count(), 6)
  1246. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1247. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1248. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1249. def test_update_platform(self):
  1250. data = {
  1251. 'name': 'Test Platform X',
  1252. 'slug': 'test-platform-x',
  1253. }
  1254. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  1255. response = self.client.put(url, data, format='json', **self.header)
  1256. self.assertHttpStatus(response, status.HTTP_200_OK)
  1257. self.assertEqual(Platform.objects.count(), 3)
  1258. platform1 = Platform.objects.get(pk=response.data['id'])
  1259. self.assertEqual(platform1.name, data['name'])
  1260. self.assertEqual(platform1.slug, data['slug'])
  1261. def test_delete_platform(self):
  1262. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  1263. response = self.client.delete(url, **self.header)
  1264. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1265. self.assertEqual(Platform.objects.count(), 2)
  1266. class DeviceTest(HttpStatusMixin, APITestCase):
  1267. def setUp(self):
  1268. user = User.objects.create(username='testuser', is_superuser=True)
  1269. token = Token.objects.create(user=user)
  1270. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1271. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1272. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  1273. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1274. self.devicetype1 = DeviceType.objects.create(
  1275. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1276. )
  1277. self.devicetype2 = DeviceType.objects.create(
  1278. manufacturer=manufacturer, model='Test Device Type 2', slug='test-device-type-2'
  1279. )
  1280. self.devicerole1 = DeviceRole.objects.create(
  1281. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1282. )
  1283. self.devicerole2 = DeviceRole.objects.create(
  1284. name='Test Device Role 2', slug='test-device-role-2', color='00ff00'
  1285. )
  1286. self.device1 = Device.objects.create(
  1287. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 1', site=self.site1
  1288. )
  1289. self.device2 = Device.objects.create(
  1290. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 2', site=self.site1
  1291. )
  1292. self.device3 = Device.objects.create(
  1293. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 3', site=self.site1
  1294. )
  1295. def test_get_device(self):
  1296. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  1297. response = self.client.get(url, **self.header)
  1298. self.assertEqual(response.data['name'], self.device1.name)
  1299. def test_list_devices(self):
  1300. url = reverse('dcim-api:device-list')
  1301. response = self.client.get(url, **self.header)
  1302. self.assertEqual(response.data['count'], 3)
  1303. def test_create_device(self):
  1304. data = {
  1305. 'device_type': self.devicetype1.pk,
  1306. 'device_role': self.devicerole1.pk,
  1307. 'name': 'Test Device 4',
  1308. 'site': self.site1.pk,
  1309. }
  1310. url = reverse('dcim-api:device-list')
  1311. response = self.client.post(url, data, format='json', **self.header)
  1312. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1313. self.assertEqual(Device.objects.count(), 4)
  1314. device4 = Device.objects.get(pk=response.data['id'])
  1315. self.assertEqual(device4.device_type_id, data['device_type'])
  1316. self.assertEqual(device4.device_role_id, data['device_role'])
  1317. self.assertEqual(device4.name, data['name'])
  1318. self.assertEqual(device4.site_id, data['site'])
  1319. def test_create_device_bulk(self):
  1320. data = [
  1321. {
  1322. 'device_type': self.devicetype1.pk,
  1323. 'device_role': self.devicerole1.pk,
  1324. 'name': 'Test Device 4',
  1325. 'site': self.site1.pk,
  1326. },
  1327. {
  1328. 'device_type': self.devicetype1.pk,
  1329. 'device_role': self.devicerole1.pk,
  1330. 'name': 'Test Device 5',
  1331. 'site': self.site1.pk,
  1332. },
  1333. {
  1334. 'device_type': self.devicetype1.pk,
  1335. 'device_role': self.devicerole1.pk,
  1336. 'name': 'Test Device 6',
  1337. 'site': self.site1.pk,
  1338. },
  1339. ]
  1340. url = reverse('dcim-api:device-list')
  1341. response = self.client.post(url, data, format='json', **self.header)
  1342. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1343. self.assertEqual(Device.objects.count(), 6)
  1344. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1345. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1346. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1347. def test_update_device(self):
  1348. data = {
  1349. 'device_type': self.devicetype2.pk,
  1350. 'device_role': self.devicerole2.pk,
  1351. 'name': 'Test Device X',
  1352. 'site': self.site2.pk,
  1353. }
  1354. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  1355. response = self.client.put(url, data, format='json', **self.header)
  1356. self.assertHttpStatus(response, status.HTTP_200_OK)
  1357. self.assertEqual(Device.objects.count(), 3)
  1358. device1 = Device.objects.get(pk=response.data['id'])
  1359. self.assertEqual(device1.device_type_id, data['device_type'])
  1360. self.assertEqual(device1.device_role_id, data['device_role'])
  1361. self.assertEqual(device1.name, data['name'])
  1362. self.assertEqual(device1.site_id, data['site'])
  1363. def test_delete_device(self):
  1364. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  1365. response = self.client.delete(url, **self.header)
  1366. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1367. self.assertEqual(Device.objects.count(), 2)
  1368. class ConsolePortTest(HttpStatusMixin, APITestCase):
  1369. def setUp(self):
  1370. user = User.objects.create(username='testuser', is_superuser=True)
  1371. token = Token.objects.create(user=user)
  1372. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1373. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1374. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1375. devicetype = DeviceType.objects.create(
  1376. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1377. )
  1378. devicerole = DeviceRole.objects.create(
  1379. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1380. )
  1381. self.device = Device.objects.create(
  1382. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1383. )
  1384. self.consoleport1 = ConsolePort.objects.create(device=self.device, name='Test Console Port 1')
  1385. self.consoleport2 = ConsolePort.objects.create(device=self.device, name='Test Console Port 2')
  1386. self.consoleport3 = ConsolePort.objects.create(device=self.device, name='Test Console Port 3')
  1387. def test_get_consoleport(self):
  1388. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  1389. response = self.client.get(url, **self.header)
  1390. self.assertEqual(response.data['name'], self.consoleport1.name)
  1391. def test_list_consoleports(self):
  1392. url = reverse('dcim-api:consoleport-list')
  1393. response = self.client.get(url, **self.header)
  1394. self.assertEqual(response.data['count'], 3)
  1395. def test_create_consoleport(self):
  1396. data = {
  1397. 'device': self.device.pk,
  1398. 'name': 'Test Console Port 4',
  1399. }
  1400. url = reverse('dcim-api:consoleport-list')
  1401. response = self.client.post(url, data, format='json', **self.header)
  1402. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1403. self.assertEqual(ConsolePort.objects.count(), 4)
  1404. consoleport4 = ConsolePort.objects.get(pk=response.data['id'])
  1405. self.assertEqual(consoleport4.device_id, data['device'])
  1406. self.assertEqual(consoleport4.name, data['name'])
  1407. def test_create_consoleport_bulk(self):
  1408. data = [
  1409. {
  1410. 'device': self.device.pk,
  1411. 'name': 'Test Console Port 4',
  1412. },
  1413. {
  1414. 'device': self.device.pk,
  1415. 'name': 'Test Console Port 5',
  1416. },
  1417. {
  1418. 'device': self.device.pk,
  1419. 'name': 'Test Console Port 6',
  1420. },
  1421. ]
  1422. url = reverse('dcim-api:consoleport-list')
  1423. response = self.client.post(url, data, format='json', **self.header)
  1424. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1425. self.assertEqual(ConsolePort.objects.count(), 6)
  1426. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1427. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1428. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1429. def test_update_consoleport(self):
  1430. consoleserverport = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 1')
  1431. data = {
  1432. 'device': self.device.pk,
  1433. 'name': 'Test Console Port X',
  1434. 'cs_port': consoleserverport.pk,
  1435. }
  1436. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  1437. response = self.client.put(url, data, format='json', **self.header)
  1438. self.assertHttpStatus(response, status.HTTP_200_OK)
  1439. self.assertEqual(ConsolePort.objects.count(), 3)
  1440. consoleport1 = ConsolePort.objects.get(pk=response.data['id'])
  1441. self.assertEqual(consoleport1.name, data['name'])
  1442. self.assertEqual(consoleport1.cs_port_id, data['cs_port'])
  1443. def test_delete_consoleport(self):
  1444. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  1445. response = self.client.delete(url, **self.header)
  1446. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1447. self.assertEqual(ConsolePort.objects.count(), 2)
  1448. class ConsoleServerPortTest(HttpStatusMixin, APITestCase):
  1449. def setUp(self):
  1450. user = User.objects.create(username='testuser', is_superuser=True)
  1451. token = Token.objects.create(user=user)
  1452. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1453. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1454. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1455. devicetype = DeviceType.objects.create(
  1456. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1', is_console_server=True
  1457. )
  1458. devicerole = DeviceRole.objects.create(
  1459. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1460. )
  1461. self.device = Device.objects.create(
  1462. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1463. )
  1464. self.consoleserverport1 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 1')
  1465. self.consoleserverport2 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 2')
  1466. self.consoleserverport3 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 3')
  1467. def test_get_consoleserverport(self):
  1468. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1469. response = self.client.get(url, **self.header)
  1470. self.assertEqual(response.data['name'], self.consoleserverport1.name)
  1471. def test_list_consoleserverports(self):
  1472. url = reverse('dcim-api:consoleserverport-list')
  1473. response = self.client.get(url, **self.header)
  1474. self.assertEqual(response.data['count'], 3)
  1475. def test_create_consoleserverport(self):
  1476. data = {
  1477. 'device': self.device.pk,
  1478. 'name': 'Test CS Port 4',
  1479. }
  1480. url = reverse('dcim-api:consoleserverport-list')
  1481. response = self.client.post(url, data, format='json', **self.header)
  1482. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1483. self.assertEqual(ConsoleServerPort.objects.count(), 4)
  1484. consoleserverport4 = ConsoleServerPort.objects.get(pk=response.data['id'])
  1485. self.assertEqual(consoleserverport4.device_id, data['device'])
  1486. self.assertEqual(consoleserverport4.name, data['name'])
  1487. def test_create_consoleserverport_bulk(self):
  1488. data = [
  1489. {
  1490. 'device': self.device.pk,
  1491. 'name': 'Test CS Port 4',
  1492. },
  1493. {
  1494. 'device': self.device.pk,
  1495. 'name': 'Test CS Port 5',
  1496. },
  1497. {
  1498. 'device': self.device.pk,
  1499. 'name': 'Test CS Port 6',
  1500. },
  1501. ]
  1502. url = reverse('dcim-api:consoleserverport-list')
  1503. response = self.client.post(url, data, format='json', **self.header)
  1504. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1505. self.assertEqual(ConsoleServerPort.objects.count(), 6)
  1506. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1507. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1508. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1509. def test_update_consoleserverport(self):
  1510. data = {
  1511. 'device': self.device.pk,
  1512. 'name': 'Test CS Port X',
  1513. }
  1514. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1515. response = self.client.put(url, data, format='json', **self.header)
  1516. self.assertHttpStatus(response, status.HTTP_200_OK)
  1517. self.assertEqual(ConsoleServerPort.objects.count(), 3)
  1518. consoleserverport1 = ConsoleServerPort.objects.get(pk=response.data['id'])
  1519. self.assertEqual(consoleserverport1.name, data['name'])
  1520. def test_delete_consoleserverport(self):
  1521. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1522. response = self.client.delete(url, **self.header)
  1523. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1524. self.assertEqual(ConsoleServerPort.objects.count(), 2)
  1525. class PowerPortTest(HttpStatusMixin, APITestCase):
  1526. def setUp(self):
  1527. user = User.objects.create(username='testuser', is_superuser=True)
  1528. token = Token.objects.create(user=user)
  1529. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1530. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1531. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1532. devicetype = DeviceType.objects.create(
  1533. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1534. )
  1535. devicerole = DeviceRole.objects.create(
  1536. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1537. )
  1538. self.device = Device.objects.create(
  1539. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1540. )
  1541. self.powerport1 = PowerPort.objects.create(device=self.device, name='Test Power Port 1')
  1542. self.powerport2 = PowerPort.objects.create(device=self.device, name='Test Power Port 2')
  1543. self.powerport3 = PowerPort.objects.create(device=self.device, name='Test Power Port 3')
  1544. def test_get_powerport(self):
  1545. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1546. response = self.client.get(url, **self.header)
  1547. self.assertEqual(response.data['name'], self.powerport1.name)
  1548. def test_list_powerports(self):
  1549. url = reverse('dcim-api:powerport-list')
  1550. response = self.client.get(url, **self.header)
  1551. self.assertEqual(response.data['count'], 3)
  1552. def test_create_powerport(self):
  1553. data = {
  1554. 'device': self.device.pk,
  1555. 'name': 'Test Power Port 4',
  1556. }
  1557. url = reverse('dcim-api:powerport-list')
  1558. response = self.client.post(url, data, format='json', **self.header)
  1559. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1560. self.assertEqual(PowerPort.objects.count(), 4)
  1561. powerport4 = PowerPort.objects.get(pk=response.data['id'])
  1562. self.assertEqual(powerport4.device_id, data['device'])
  1563. self.assertEqual(powerport4.name, data['name'])
  1564. def test_create_powerport_bulk(self):
  1565. data = [
  1566. {
  1567. 'device': self.device.pk,
  1568. 'name': 'Test Power Port 4',
  1569. },
  1570. {
  1571. 'device': self.device.pk,
  1572. 'name': 'Test Power Port 5',
  1573. },
  1574. {
  1575. 'device': self.device.pk,
  1576. 'name': 'Test Power Port 6',
  1577. },
  1578. ]
  1579. url = reverse('dcim-api:powerport-list')
  1580. response = self.client.post(url, data, format='json', **self.header)
  1581. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1582. self.assertEqual(PowerPort.objects.count(), 6)
  1583. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1584. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1585. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1586. def test_update_powerport(self):
  1587. poweroutlet = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 1')
  1588. data = {
  1589. 'device': self.device.pk,
  1590. 'name': 'Test Power Port X',
  1591. 'power_outlet': poweroutlet.pk,
  1592. }
  1593. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1594. response = self.client.put(url, data, format='json', **self.header)
  1595. self.assertHttpStatus(response, status.HTTP_200_OK)
  1596. self.assertEqual(PowerPort.objects.count(), 3)
  1597. powerport1 = PowerPort.objects.get(pk=response.data['id'])
  1598. self.assertEqual(powerport1.name, data['name'])
  1599. self.assertEqual(powerport1.power_outlet_id, data['power_outlet'])
  1600. def test_delete_powerport(self):
  1601. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1602. response = self.client.delete(url, **self.header)
  1603. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1604. self.assertEqual(PowerPort.objects.count(), 2)
  1605. class PowerOutletTest(HttpStatusMixin, APITestCase):
  1606. def setUp(self):
  1607. user = User.objects.create(username='testuser', is_superuser=True)
  1608. token = Token.objects.create(user=user)
  1609. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1610. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1611. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1612. devicetype = DeviceType.objects.create(
  1613. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1', is_pdu=True
  1614. )
  1615. devicerole = DeviceRole.objects.create(
  1616. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1617. )
  1618. self.device = Device.objects.create(
  1619. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1620. )
  1621. self.poweroutlet1 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 1')
  1622. self.poweroutlet2 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 2')
  1623. self.poweroutlet3 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 3')
  1624. def test_get_poweroutlet(self):
  1625. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1626. response = self.client.get(url, **self.header)
  1627. self.assertEqual(response.data['name'], self.poweroutlet1.name)
  1628. def test_list_poweroutlets(self):
  1629. url = reverse('dcim-api:poweroutlet-list')
  1630. response = self.client.get(url, **self.header)
  1631. self.assertEqual(response.data['count'], 3)
  1632. def test_create_poweroutlet(self):
  1633. data = {
  1634. 'device': self.device.pk,
  1635. 'name': 'Test Power Outlet 4',
  1636. }
  1637. url = reverse('dcim-api:poweroutlet-list')
  1638. response = self.client.post(url, data, format='json', **self.header)
  1639. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1640. self.assertEqual(PowerOutlet.objects.count(), 4)
  1641. poweroutlet4 = PowerOutlet.objects.get(pk=response.data['id'])
  1642. self.assertEqual(poweroutlet4.device_id, data['device'])
  1643. self.assertEqual(poweroutlet4.name, data['name'])
  1644. def test_create_poweroutlet_bulk(self):
  1645. data = [
  1646. {
  1647. 'device': self.device.pk,
  1648. 'name': 'Test Power Outlet 4',
  1649. },
  1650. {
  1651. 'device': self.device.pk,
  1652. 'name': 'Test Power Outlet 5',
  1653. },
  1654. {
  1655. 'device': self.device.pk,
  1656. 'name': 'Test Power Outlet 6',
  1657. },
  1658. ]
  1659. url = reverse('dcim-api:poweroutlet-list')
  1660. response = self.client.post(url, data, format='json', **self.header)
  1661. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1662. self.assertEqual(PowerOutlet.objects.count(), 6)
  1663. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1664. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1665. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1666. def test_update_poweroutlet(self):
  1667. data = {
  1668. 'device': self.device.pk,
  1669. 'name': 'Test Power Outlet X',
  1670. }
  1671. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1672. response = self.client.put(url, data, format='json', **self.header)
  1673. self.assertHttpStatus(response, status.HTTP_200_OK)
  1674. self.assertEqual(PowerOutlet.objects.count(), 3)
  1675. poweroutlet1 = PowerOutlet.objects.get(pk=response.data['id'])
  1676. self.assertEqual(poweroutlet1.name, data['name'])
  1677. def test_delete_poweroutlet(self):
  1678. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1679. response = self.client.delete(url, **self.header)
  1680. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1681. self.assertEqual(PowerOutlet.objects.count(), 2)
  1682. class InterfaceTest(HttpStatusMixin, APITestCase):
  1683. def setUp(self):
  1684. user = User.objects.create(username='testuser', is_superuser=True)
  1685. token = Token.objects.create(user=user)
  1686. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1687. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1688. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1689. devicetype = DeviceType.objects.create(
  1690. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1', is_network_device=True
  1691. )
  1692. devicerole = DeviceRole.objects.create(
  1693. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1694. )
  1695. self.device = Device.objects.create(
  1696. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1697. )
  1698. self.interface1 = Interface.objects.create(device=self.device, name='Test Interface 1')
  1699. self.interface2 = Interface.objects.create(device=self.device, name='Test Interface 2')
  1700. self.interface3 = Interface.objects.create(device=self.device, name='Test Interface 3')
  1701. self.vlan1 = VLAN.objects.create(name="Test VLAN 1", vid=1)
  1702. self.vlan2 = VLAN.objects.create(name="Test VLAN 2", vid=2)
  1703. self.vlan3 = VLAN.objects.create(name="Test VLAN 3", vid=3)
  1704. def test_get_interface(self):
  1705. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1706. response = self.client.get(url, **self.header)
  1707. self.assertEqual(response.data['name'], self.interface1.name)
  1708. def test_get_interface_graphs(self):
  1709. self.graph1 = Graph.objects.create(
  1710. type=GRAPH_TYPE_INTERFACE, name='Test Graph 1',
  1711. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=1'
  1712. )
  1713. self.graph2 = Graph.objects.create(
  1714. type=GRAPH_TYPE_INTERFACE, name='Test Graph 2',
  1715. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=2'
  1716. )
  1717. self.graph3 = Graph.objects.create(
  1718. type=GRAPH_TYPE_INTERFACE, name='Test Graph 3',
  1719. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=3'
  1720. )
  1721. url = reverse('dcim-api:interface-graphs', kwargs={'pk': self.interface1.pk})
  1722. response = self.client.get(url, **self.header)
  1723. self.assertEqual(len(response.data), 3)
  1724. self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?interface=Test Interface 1&foo=1')
  1725. def test_list_interfaces(self):
  1726. url = reverse('dcim-api:interface-list')
  1727. response = self.client.get(url, **self.header)
  1728. self.assertEqual(response.data['count'], 3)
  1729. def test_create_interface(self):
  1730. data = {
  1731. 'device': self.device.pk,
  1732. 'name': 'Test Interface 4',
  1733. }
  1734. url = reverse('dcim-api:interface-list')
  1735. response = self.client.post(url, data, format='json', **self.header)
  1736. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1737. self.assertEqual(Interface.objects.count(), 4)
  1738. interface4 = Interface.objects.get(pk=response.data['id'])
  1739. self.assertEqual(interface4.device_id, data['device'])
  1740. self.assertEqual(interface4.name, data['name'])
  1741. def test_create_interface_with_802_1q(self):
  1742. data = {
  1743. 'device': self.device.pk,
  1744. 'name': 'Test Interface 4',
  1745. 'mode': IFACE_MODE_TAGGED,
  1746. 'tagged_vlans': [self.vlan1.id, self.vlan2.id],
  1747. 'untagged_vlan': self.vlan3.id
  1748. }
  1749. url = reverse('dcim-api:interface-list')
  1750. response = self.client.post(url, data, format='json', **self.header)
  1751. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1752. self.assertEqual(Interface.objects.count(), 4)
  1753. interface5 = Interface.objects.get(pk=response.data['id'])
  1754. self.assertEqual(interface5.device_id, data['device'])
  1755. self.assertEqual(interface5.name, data['name'])
  1756. self.assertEqual(interface5.tagged_vlans.count(), 2)
  1757. self.assertEqual(interface5.untagged_vlan.id, data['untagged_vlan'])
  1758. def test_create_interface_bulk(self):
  1759. data = [
  1760. {
  1761. 'device': self.device.pk,
  1762. 'name': 'Test Interface 4',
  1763. },
  1764. {
  1765. 'device': self.device.pk,
  1766. 'name': 'Test Interface 5',
  1767. },
  1768. {
  1769. 'device': self.device.pk,
  1770. 'name': 'Test Interface 6',
  1771. },
  1772. ]
  1773. url = reverse('dcim-api:interface-list')
  1774. response = self.client.post(url, data, format='json', **self.header)
  1775. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1776. self.assertEqual(Interface.objects.count(), 6)
  1777. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1778. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1779. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1780. def test_create_interface_802_1q_bulk(self):
  1781. data = [
  1782. {
  1783. 'device': self.device.pk,
  1784. 'name': 'Test Interface 4',
  1785. 'mode': IFACE_MODE_TAGGED,
  1786. 'tagged_vlans': [self.vlan1.id],
  1787. 'untagged_vlan': self.vlan2.id,
  1788. },
  1789. {
  1790. 'device': self.device.pk,
  1791. 'name': 'Test Interface 5',
  1792. 'mode': IFACE_MODE_TAGGED,
  1793. 'tagged_vlans': [self.vlan1.id],
  1794. 'untagged_vlan': self.vlan2.id,
  1795. },
  1796. {
  1797. 'device': self.device.pk,
  1798. 'name': 'Test Interface 6',
  1799. 'mode': IFACE_MODE_TAGGED,
  1800. 'tagged_vlans': [self.vlan1.id],
  1801. 'untagged_vlan': self.vlan2.id,
  1802. },
  1803. ]
  1804. url = reverse('dcim-api:interface-list')
  1805. response = self.client.post(url, data, format='json', **self.header)
  1806. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1807. self.assertEqual(Interface.objects.count(), 6)
  1808. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1809. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1810. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1811. self.assertEqual(len(response.data[0]['tagged_vlans']), 1)
  1812. self.assertEqual(len(response.data[1]['tagged_vlans']), 1)
  1813. self.assertEqual(len(response.data[2]['tagged_vlans']), 1)
  1814. self.assertEqual(response.data[0]['untagged_vlan'], self.vlan2.id)
  1815. self.assertEqual(response.data[1]['untagged_vlan'], self.vlan2.id)
  1816. self.assertEqual(response.data[2]['untagged_vlan'], self.vlan2.id)
  1817. def test_update_interface(self):
  1818. lag_interface = Interface.objects.create(
  1819. device=self.device, name='Test LAG Interface', form_factor=IFACE_FF_LAG
  1820. )
  1821. data = {
  1822. 'device': self.device.pk,
  1823. 'name': 'Test Interface X',
  1824. 'lag': lag_interface.pk,
  1825. }
  1826. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1827. response = self.client.put(url, data, format='json', **self.header)
  1828. self.assertHttpStatus(response, status.HTTP_200_OK)
  1829. self.assertEqual(Interface.objects.count(), 4)
  1830. interface1 = Interface.objects.get(pk=response.data['id'])
  1831. self.assertEqual(interface1.name, data['name'])
  1832. self.assertEqual(interface1.lag_id, data['lag'])
  1833. def test_delete_interface(self):
  1834. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1835. response = self.client.delete(url, **self.header)
  1836. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1837. self.assertEqual(Interface.objects.count(), 2)
  1838. class DeviceBayTest(HttpStatusMixin, APITestCase):
  1839. def setUp(self):
  1840. user = User.objects.create(username='testuser', is_superuser=True)
  1841. token = Token.objects.create(user=user)
  1842. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1843. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1844. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1845. self.devicetype1 = DeviceType.objects.create(
  1846. manufacturer=manufacturer, model='Parent Device Type', slug='parent-device-type',
  1847. subdevice_role=SUBDEVICE_ROLE_PARENT
  1848. )
  1849. self.devicetype2 = DeviceType.objects.create(
  1850. manufacturer=manufacturer, model='Child Device Type', slug='child-device-type',
  1851. subdevice_role=SUBDEVICE_ROLE_CHILD
  1852. )
  1853. devicerole = DeviceRole.objects.create(
  1854. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1855. )
  1856. self.parent_device = Device.objects.create(
  1857. device_type=self.devicetype1, device_role=devicerole, name='Parent Device 1', site=site
  1858. )
  1859. self.child_device = Device.objects.create(
  1860. device_type=self.devicetype2, device_role=devicerole, name='Child Device 1', site=site
  1861. )
  1862. self.devicebay1 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 1')
  1863. self.devicebay2 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 2')
  1864. self.devicebay3 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 3')
  1865. def test_get_devicebay(self):
  1866. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1867. response = self.client.get(url, **self.header)
  1868. self.assertEqual(response.data['name'], self.devicebay1.name)
  1869. def test_list_devicebays(self):
  1870. url = reverse('dcim-api:devicebay-list')
  1871. response = self.client.get(url, **self.header)
  1872. self.assertEqual(response.data['count'], 3)
  1873. def test_create_devicebay(self):
  1874. data = {
  1875. 'device': self.parent_device.pk,
  1876. 'name': 'Test Device Bay 4',
  1877. 'installed_device': self.child_device.pk,
  1878. }
  1879. url = reverse('dcim-api:devicebay-list')
  1880. response = self.client.post(url, data, format='json', **self.header)
  1881. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1882. self.assertEqual(DeviceBay.objects.count(), 4)
  1883. devicebay4 = DeviceBay.objects.get(pk=response.data['id'])
  1884. self.assertEqual(devicebay4.device_id, data['device'])
  1885. self.assertEqual(devicebay4.name, data['name'])
  1886. self.assertEqual(devicebay4.installed_device_id, data['installed_device'])
  1887. def test_create_devicebay_bulk(self):
  1888. data = [
  1889. {
  1890. 'device': self.parent_device.pk,
  1891. 'name': 'Test Device Bay 4',
  1892. },
  1893. {
  1894. 'device': self.parent_device.pk,
  1895. 'name': 'Test Device Bay 5',
  1896. },
  1897. {
  1898. 'device': self.parent_device.pk,
  1899. 'name': 'Test Device Bay 6',
  1900. },
  1901. ]
  1902. url = reverse('dcim-api:devicebay-list')
  1903. response = self.client.post(url, data, format='json', **self.header)
  1904. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1905. self.assertEqual(DeviceBay.objects.count(), 6)
  1906. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1907. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1908. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1909. def test_update_devicebay(self):
  1910. data = {
  1911. 'device': self.parent_device.pk,
  1912. 'name': 'Test Device Bay X',
  1913. 'installed_device': self.child_device.pk,
  1914. }
  1915. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1916. response = self.client.put(url, data, format='json', **self.header)
  1917. self.assertHttpStatus(response, status.HTTP_200_OK)
  1918. self.assertEqual(DeviceBay.objects.count(), 3)
  1919. devicebay1 = DeviceBay.objects.get(pk=response.data['id'])
  1920. self.assertEqual(devicebay1.name, data['name'])
  1921. self.assertEqual(devicebay1.installed_device_id, data['installed_device'])
  1922. def test_delete_devicebay(self):
  1923. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1924. response = self.client.delete(url, **self.header)
  1925. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1926. self.assertEqual(DeviceBay.objects.count(), 2)
  1927. class InventoryItemTest(HttpStatusMixin, APITestCase):
  1928. def setUp(self):
  1929. user = User.objects.create(username='testuser', is_superuser=True)
  1930. token = Token.objects.create(user=user)
  1931. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1932. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1933. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1934. devicetype = DeviceType.objects.create(
  1935. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1936. )
  1937. devicerole = DeviceRole.objects.create(
  1938. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1939. )
  1940. self.device = Device.objects.create(
  1941. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1942. )
  1943. self.inventoryitem1 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 1')
  1944. self.inventoryitem2 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 2')
  1945. self.inventoryitem3 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 3')
  1946. def test_get_inventoryitem(self):
  1947. url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk})
  1948. response = self.client.get(url, **self.header)
  1949. self.assertEqual(response.data['name'], self.inventoryitem1.name)
  1950. def test_list_inventoryitems(self):
  1951. url = reverse('dcim-api:inventoryitem-list')
  1952. response = self.client.get(url, **self.header)
  1953. self.assertEqual(response.data['count'], 3)
  1954. def test_create_inventoryitem(self):
  1955. data = {
  1956. 'device': self.device.pk,
  1957. 'parent': self.inventoryitem1.pk,
  1958. 'name': 'Test Inventory Item 4',
  1959. 'manufacturer': self.manufacturer.pk,
  1960. }
  1961. url = reverse('dcim-api:inventoryitem-list')
  1962. response = self.client.post(url, data, format='json', **self.header)
  1963. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1964. self.assertEqual(InventoryItem.objects.count(), 4)
  1965. inventoryitem4 = InventoryItem.objects.get(pk=response.data['id'])
  1966. self.assertEqual(inventoryitem4.device_id, data['device'])
  1967. self.assertEqual(inventoryitem4.parent_id, data['parent'])
  1968. self.assertEqual(inventoryitem4.name, data['name'])
  1969. self.assertEqual(inventoryitem4.manufacturer_id, data['manufacturer'])
  1970. def test_create_inventoryitem_bulk(self):
  1971. data = [
  1972. {
  1973. 'device': self.device.pk,
  1974. 'parent': self.inventoryitem1.pk,
  1975. 'name': 'Test Inventory Item 4',
  1976. 'manufacturer': self.manufacturer.pk,
  1977. },
  1978. {
  1979. 'device': self.device.pk,
  1980. 'parent': self.inventoryitem1.pk,
  1981. 'name': 'Test Inventory Item 5',
  1982. 'manufacturer': self.manufacturer.pk,
  1983. },
  1984. {
  1985. 'device': self.device.pk,
  1986. 'parent': self.inventoryitem1.pk,
  1987. 'name': 'Test Inventory Item 6',
  1988. 'manufacturer': self.manufacturer.pk,
  1989. },
  1990. ]
  1991. url = reverse('dcim-api:inventoryitem-list')
  1992. response = self.client.post(url, data, format='json', **self.header)
  1993. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1994. self.assertEqual(InventoryItem.objects.count(), 6)
  1995. self.assertEqual(response.data[0]['name'], data[0]['name'])
  1996. self.assertEqual(response.data[1]['name'], data[1]['name'])
  1997. self.assertEqual(response.data[2]['name'], data[2]['name'])
  1998. def test_update_inventoryitem(self):
  1999. data = {
  2000. 'device': self.device.pk,
  2001. 'parent': self.inventoryitem1.pk,
  2002. 'name': 'Test Inventory Item X',
  2003. 'manufacturer': self.manufacturer.pk,
  2004. }
  2005. url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk})
  2006. response = self.client.put(url, data, format='json', **self.header)
  2007. self.assertHttpStatus(response, status.HTTP_200_OK)
  2008. self.assertEqual(InventoryItem.objects.count(), 3)
  2009. inventoryitem1 = InventoryItem.objects.get(pk=response.data['id'])
  2010. self.assertEqual(inventoryitem1.device_id, data['device'])
  2011. self.assertEqual(inventoryitem1.parent_id, data['parent'])
  2012. self.assertEqual(inventoryitem1.name, data['name'])
  2013. self.assertEqual(inventoryitem1.manufacturer_id, data['manufacturer'])
  2014. def test_delete_inventoryitem(self):
  2015. url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk})
  2016. response = self.client.delete(url, **self.header)
  2017. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  2018. self.assertEqual(InventoryItem.objects.count(), 2)
  2019. class ConsoleConnectionTest(HttpStatusMixin, APITestCase):
  2020. def setUp(self):
  2021. user = User.objects.create(username='testuser', is_superuser=True)
  2022. token = Token.objects.create(user=user)
  2023. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  2024. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  2025. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  2026. devicetype = DeviceType.objects.create(
  2027. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  2028. )
  2029. devicerole = DeviceRole.objects.create(
  2030. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  2031. )
  2032. device1 = Device.objects.create(
  2033. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  2034. )
  2035. device2 = Device.objects.create(
  2036. device_type=devicetype, device_role=devicerole, name='Test Device 2', site=site
  2037. )
  2038. cs_port1 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 1')
  2039. cs_port2 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 2')
  2040. cs_port3 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 3')
  2041. ConsolePort.objects.create(
  2042. device=device2, cs_port=cs_port1, name='Test Console Port 1', connection_status=True
  2043. )
  2044. ConsolePort.objects.create(
  2045. device=device2, cs_port=cs_port2, name='Test Console Port 2', connection_status=True
  2046. )
  2047. ConsolePort.objects.create(
  2048. device=device2, cs_port=cs_port3, name='Test Console Port 3', connection_status=True
  2049. )
  2050. def test_list_consoleconnections(self):
  2051. url = reverse('dcim-api:consoleconnections-list')
  2052. response = self.client.get(url, **self.header)
  2053. self.assertEqual(response.data['count'], 3)
  2054. class PowerConnectionTest(HttpStatusMixin, APITestCase):
  2055. def setUp(self):
  2056. user = User.objects.create(username='testuser', is_superuser=True)
  2057. token = Token.objects.create(user=user)
  2058. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  2059. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  2060. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  2061. devicetype = DeviceType.objects.create(
  2062. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  2063. )
  2064. devicerole = DeviceRole.objects.create(
  2065. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  2066. )
  2067. device1 = Device.objects.create(
  2068. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  2069. )
  2070. device2 = Device.objects.create(
  2071. device_type=devicetype, device_role=devicerole, name='Test Device 2', site=site
  2072. )
  2073. power_outlet1 = PowerOutlet.objects.create(device=device1, name='Test Power Outlet 1')
  2074. power_outlet2 = PowerOutlet.objects.create(device=device1, name='Test Power Outlet 2')
  2075. power_outlet3 = PowerOutlet.objects.create(device=device1, name='Test Power Outlet 3')
  2076. PowerPort.objects.create(
  2077. device=device2, power_outlet=power_outlet1, name='Test Power Port 1', connection_status=True
  2078. )
  2079. PowerPort.objects.create(
  2080. device=device2, power_outlet=power_outlet2, name='Test Power Port 2', connection_status=True
  2081. )
  2082. PowerPort.objects.create(
  2083. device=device2, power_outlet=power_outlet3, name='Test Power Port 3', connection_status=True
  2084. )
  2085. def test_list_powerconnections(self):
  2086. url = reverse('dcim-api:powerconnections-list')
  2087. response = self.client.get(url, **self.header)
  2088. self.assertEqual(response.data['count'], 3)
  2089. class InterfaceConnectionTest(HttpStatusMixin, APITestCase):
  2090. def setUp(self):
  2091. user = User.objects.create(username='testuser', is_superuser=True)
  2092. token = Token.objects.create(user=user)
  2093. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  2094. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  2095. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  2096. devicetype = DeviceType.objects.create(
  2097. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  2098. )
  2099. devicerole = DeviceRole.objects.create(
  2100. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  2101. )
  2102. self.device = Device.objects.create(
  2103. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  2104. )
  2105. self.interface1 = Interface.objects.create(device=self.device, name='Test Interface 1')
  2106. self.interface2 = Interface.objects.create(device=self.device, name='Test Interface 2')
  2107. self.interface3 = Interface.objects.create(device=self.device, name='Test Interface 3')
  2108. self.interface4 = Interface.objects.create(device=self.device, name='Test Interface 4')
  2109. self.interface5 = Interface.objects.create(device=self.device, name='Test Interface 5')
  2110. self.interface6 = Interface.objects.create(device=self.device, name='Test Interface 6')
  2111. self.interface7 = Interface.objects.create(device=self.device, name='Test Interface 7')
  2112. self.interface8 = Interface.objects.create(device=self.device, name='Test Interface 8')
  2113. self.interface9 = Interface.objects.create(device=self.device, name='Test Interface 9')
  2114. self.interface10 = Interface.objects.create(device=self.device, name='Test Interface 10')
  2115. self.interface11 = Interface.objects.create(device=self.device, name='Test Interface 11')
  2116. self.interface12 = Interface.objects.create(device=self.device, name='Test Interface 12')
  2117. self.interfaceconnection1 = InterfaceConnection.objects.create(
  2118. interface_a=self.interface1, interface_b=self.interface2
  2119. )
  2120. self.interfaceconnection2 = InterfaceConnection.objects.create(
  2121. interface_a=self.interface3, interface_b=self.interface4
  2122. )
  2123. self.interfaceconnection3 = InterfaceConnection.objects.create(
  2124. interface_a=self.interface5, interface_b=self.interface6
  2125. )
  2126. def test_get_interfaceconnection(self):
  2127. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  2128. response = self.client.get(url, **self.header)
  2129. self.assertEqual(response.data['interface_a']['id'], self.interfaceconnection1.interface_a_id)
  2130. self.assertEqual(response.data['interface_b']['id'], self.interfaceconnection1.interface_b_id)
  2131. def test_list_interfaceconnections(self):
  2132. url = reverse('dcim-api:interfaceconnection-list')
  2133. response = self.client.get(url, **self.header)
  2134. self.assertEqual(response.data['count'], 3)
  2135. def test_create_interfaceconnection(self):
  2136. data = {
  2137. 'interface_a': self.interface7.pk,
  2138. 'interface_b': self.interface8.pk,
  2139. }
  2140. url = reverse('dcim-api:interfaceconnection-list')
  2141. response = self.client.post(url, data, format='json', **self.header)
  2142. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  2143. self.assertEqual(InterfaceConnection.objects.count(), 4)
  2144. interfaceconnection4 = InterfaceConnection.objects.get(pk=response.data['id'])
  2145. self.assertEqual(interfaceconnection4.interface_a_id, data['interface_a'])
  2146. self.assertEqual(interfaceconnection4.interface_b_id, data['interface_b'])
  2147. def test_create_interfaceconnection_bulk(self):
  2148. data = [
  2149. {
  2150. 'interface_a': self.interface7.pk,
  2151. 'interface_b': self.interface8.pk,
  2152. },
  2153. {
  2154. 'interface_a': self.interface9.pk,
  2155. 'interface_b': self.interface10.pk,
  2156. },
  2157. {
  2158. 'interface_a': self.interface11.pk,
  2159. 'interface_b': self.interface12.pk,
  2160. },
  2161. ]
  2162. url = reverse('dcim-api:interfaceconnection-list')
  2163. response = self.client.post(url, data, format='json', **self.header)
  2164. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  2165. self.assertEqual(InterfaceConnection.objects.count(), 6)
  2166. self.assertEqual(response.data[0]['interface_a'], data[0]['interface_a'])
  2167. self.assertEqual(response.data[1]['interface_a'], data[1]['interface_a'])
  2168. self.assertEqual(response.data[2]['interface_a'], data[2]['interface_a'])
  2169. def test_update_interfaceconnection(self):
  2170. new_connection_status = not self.interfaceconnection1.connection_status
  2171. data = {
  2172. 'interface_a': self.interface7.pk,
  2173. 'interface_b': self.interface8.pk,
  2174. 'connection_status': new_connection_status,
  2175. }
  2176. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  2177. response = self.client.put(url, data, format='json', **self.header)
  2178. self.assertHttpStatus(response, status.HTTP_200_OK)
  2179. self.assertEqual(InterfaceConnection.objects.count(), 3)
  2180. interfaceconnection1 = InterfaceConnection.objects.get(pk=response.data['id'])
  2181. self.assertEqual(interfaceconnection1.interface_a_id, data['interface_a'])
  2182. self.assertEqual(interfaceconnection1.interface_b_id, data['interface_b'])
  2183. self.assertEqual(interfaceconnection1.connection_status, data['connection_status'])
  2184. def test_delete_interfaceconnection(self):
  2185. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  2186. response = self.client.delete(url, **self.header)
  2187. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  2188. self.assertEqual(InterfaceConnection.objects.count(), 2)
  2189. class ConnectedDeviceTest(HttpStatusMixin, APITestCase):
  2190. def setUp(self):
  2191. user = User.objects.create(username='testuser', is_superuser=True)
  2192. token = Token.objects.create(user=user)
  2193. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  2194. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  2195. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  2196. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  2197. self.devicetype1 = DeviceType.objects.create(
  2198. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  2199. )
  2200. self.devicetype2 = DeviceType.objects.create(
  2201. manufacturer=manufacturer, model='Test Device Type 2', slug='test-device-type-2'
  2202. )
  2203. self.devicerole1 = DeviceRole.objects.create(
  2204. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  2205. )
  2206. self.devicerole2 = DeviceRole.objects.create(
  2207. name='Test Device Role 2', slug='test-device-role-2', color='00ff00'
  2208. )
  2209. self.device1 = Device.objects.create(
  2210. device_type=self.devicetype1, device_role=self.devicerole1, name='TestDevice1', site=self.site1
  2211. )
  2212. self.device2 = Device.objects.create(
  2213. device_type=self.devicetype1, device_role=self.devicerole1, name='TestDevice2', site=self.site1
  2214. )
  2215. self.interface1 = Interface.objects.create(device=self.device1, name='eth0')
  2216. self.interface2 = Interface.objects.create(device=self.device2, name='eth0')
  2217. InterfaceConnection.objects.create(interface_a=self.interface1, interface_b=self.interface2)
  2218. def test_get_connected_device(self):
  2219. url = reverse('dcim-api:connected-device-list')
  2220. response = self.client.get(url + '?peer-device=TestDevice2&peer-interface=eth0', **self.header)
  2221. self.assertHttpStatus(response, status.HTTP_200_OK)
  2222. self.assertEqual(response.data['name'], self.device1.name)
  2223. class VirtualChassisTest(HttpStatusMixin, APITestCase):
  2224. def setUp(self):
  2225. user = User.objects.create(username='testuser', is_superuser=True)
  2226. token = Token.objects.create(user=user)
  2227. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  2228. site = Site.objects.create(name='Test Site', slug='test-site')
  2229. manufacturer = Manufacturer.objects.create(name='Test Manufacturer', slug='test-manufacturer')
  2230. device_type = DeviceType.objects.create(
  2231. manufacturer=manufacturer, model='Test Device Type', slug='test-device-type'
  2232. )
  2233. device_role = DeviceRole.objects.create(
  2234. name='Test Device Role', slug='test-device-role', color='ff0000'
  2235. )
  2236. # Create 9 member Devices with 12 interfaces each
  2237. self.device1 = Device.objects.create(
  2238. device_type=device_type, device_role=device_role, name='StackSwitch1', site=site
  2239. )
  2240. self.device2 = Device.objects.create(
  2241. device_type=device_type, device_role=device_role, name='StackSwitch2', site=site
  2242. )
  2243. self.device3 = Device.objects.create(
  2244. device_type=device_type, device_role=device_role, name='StackSwitch3', site=site
  2245. )
  2246. self.device4 = Device.objects.create(
  2247. device_type=device_type, device_role=device_role, name='StackSwitch4', site=site
  2248. )
  2249. self.device5 = Device.objects.create(
  2250. device_type=device_type, device_role=device_role, name='StackSwitch5', site=site
  2251. )
  2252. self.device6 = Device.objects.create(
  2253. device_type=device_type, device_role=device_role, name='StackSwitch6', site=site
  2254. )
  2255. self.device7 = Device.objects.create(
  2256. device_type=device_type, device_role=device_role, name='StackSwitch7', site=site
  2257. )
  2258. self.device8 = Device.objects.create(
  2259. device_type=device_type, device_role=device_role, name='StackSwitch8', site=site
  2260. )
  2261. self.device9 = Device.objects.create(
  2262. device_type=device_type, device_role=device_role, name='StackSwitch9', site=site
  2263. )
  2264. for i in range(0, 13):
  2265. Interface.objects.create(device=self.device1, name='1/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2266. for i in range(0, 13):
  2267. Interface.objects.create(device=self.device2, name='2/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2268. for i in range(0, 13):
  2269. Interface.objects.create(device=self.device3, name='3/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2270. for i in range(0, 13):
  2271. Interface.objects.create(device=self.device4, name='1/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2272. for i in range(0, 13):
  2273. Interface.objects.create(device=self.device5, name='2/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2274. for i in range(0, 13):
  2275. Interface.objects.create(device=self.device6, name='3/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2276. for i in range(0, 13):
  2277. Interface.objects.create(device=self.device7, name='1/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2278. for i in range(0, 13):
  2279. Interface.objects.create(device=self.device8, name='2/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2280. for i in range(0, 13):
  2281. Interface.objects.create(device=self.device9, name='3/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
  2282. # Create two VirtualChassis with three members each
  2283. self.vc1 = VirtualChassis.objects.create(master=self.device1, domain='test-domain-1')
  2284. Device.objects.filter(pk=self.device2.pk).update(virtual_chassis=self.vc1, vc_position=2)
  2285. Device.objects.filter(pk=self.device3.pk).update(virtual_chassis=self.vc1, vc_position=3)
  2286. self.vc2 = VirtualChassis.objects.create(master=self.device4, domain='test-domain-2')
  2287. Device.objects.filter(pk=self.device5.pk).update(virtual_chassis=self.vc2, vc_position=2)
  2288. Device.objects.filter(pk=self.device6.pk).update(virtual_chassis=self.vc2, vc_position=3)
  2289. def test_get_virtualchassis(self):
  2290. url = reverse('dcim-api:virtualchassis-detail', kwargs={'pk': self.vc1.pk})
  2291. response = self.client.get(url, **self.header)
  2292. self.assertEqual(response.data['domain'], self.vc1.domain)
  2293. def test_list_virtualchassis(self):
  2294. url = reverse('dcim-api:virtualchassis-list')
  2295. response = self.client.get(url, **self.header)
  2296. self.assertEqual(response.data['count'], 2)
  2297. def test_create_virtualchassis(self):
  2298. data = {
  2299. 'master': self.device7.pk,
  2300. 'domain': 'test-domain-3',
  2301. }
  2302. url = reverse('dcim-api:virtualchassis-list')
  2303. response = self.client.post(url, data, format='json', **self.header)
  2304. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  2305. self.assertEqual(VirtualChassis.objects.count(), 3)
  2306. vc3 = VirtualChassis.objects.get(pk=response.data['id'])
  2307. self.assertEqual(vc3.master.pk, data['master'])
  2308. self.assertEqual(vc3.domain, data['domain'])
  2309. # Verify that the master device was automatically assigned to the VC
  2310. self.assertTrue(Device.objects.filter(pk=vc3.master.pk, virtual_chassis=vc3.pk).exists())
  2311. def test_create_virtualchassis_bulk(self):
  2312. data = [
  2313. {
  2314. 'master': self.device7.pk,
  2315. 'domain': 'test-domain-3',
  2316. },
  2317. {
  2318. 'master': self.device8.pk,
  2319. 'domain': 'test-domain-4',
  2320. },
  2321. {
  2322. 'master': self.device9.pk,
  2323. 'domain': 'test-domain-5',
  2324. },
  2325. ]
  2326. url = reverse('dcim-api:virtualchassis-list')
  2327. response = self.client.post(url, data, format='json', **self.header)
  2328. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  2329. self.assertEqual(VirtualChassis.objects.count(), 5)
  2330. self.assertEqual(response.data[0]['master'], data[0]['master'])
  2331. self.assertEqual(response.data[0]['domain'], data[0]['domain'])
  2332. self.assertEqual(response.data[1]['master'], data[1]['master'])
  2333. self.assertEqual(response.data[1]['domain'], data[1]['domain'])
  2334. self.assertEqual(response.data[2]['master'], data[2]['master'])
  2335. self.assertEqual(response.data[2]['domain'], data[2]['domain'])
  2336. def test_update_virtualchassis(self):
  2337. data = {
  2338. 'master': self.device2.pk,
  2339. 'domain': 'test-domain-x',
  2340. }
  2341. url = reverse('dcim-api:virtualchassis-detail', kwargs={'pk': self.vc1.pk})
  2342. response = self.client.put(url, data, format='json', **self.header)
  2343. self.assertHttpStatus(response, status.HTTP_200_OK)
  2344. self.assertEqual(VirtualChassis.objects.count(), 2)
  2345. vc1 = VirtualChassis.objects.get(pk=response.data['id'])
  2346. self.assertEqual(vc1.master.pk, data['master'])
  2347. self.assertEqual(vc1.domain, data['domain'])
  2348. def test_delete_virtualchassis(self):
  2349. url = reverse('dcim-api:virtualchassis-detail', kwargs={'pk': self.vc1.pk})
  2350. response = self.client.delete(url, **self.header)
  2351. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  2352. self.assertEqual(VirtualChassis.objects.count(), 1)
  2353. # Verify that all VC members have had their VC-related fields nullified
  2354. for d in [self.device1, self.device2, self.device3]:
  2355. self.assertTrue(
  2356. Device.objects.filter(pk=d.pk, virtual_chassis=None, vc_position=None, vc_priority=None)
  2357. )