test_api.py 124 KB

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