test_api.py 87 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160
  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_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,
  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_update_region(self):
  45. data = {
  46. 'name': 'Test Region X',
  47. 'slug': 'test-region-x',
  48. }
  49. url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
  50. response = self.client.put(url, data, format='json', **self.header)
  51. self.assertHttpStatus(response, status.HTTP_200_OK)
  52. self.assertEqual(Region.objects.count(), 3)
  53. region1 = Region.objects.get(pk=response.data['id'])
  54. self.assertEqual(region1.name, data['name'])
  55. self.assertEqual(region1.slug, data['slug'])
  56. def test_delete_region(self):
  57. url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
  58. response = self.client.delete(url, **self.header)
  59. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  60. self.assertEqual(Region.objects.count(), 2)
  61. class SiteTest(HttpStatusMixin, APITestCase):
  62. def setUp(self):
  63. user = User.objects.create(username='testuser', is_superuser=True)
  64. token = Token.objects.create(user=user)
  65. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  66. self.region1 = Region.objects.create(name='Test Region 1', slug='test-region-1')
  67. self.region2 = Region.objects.create(name='Test Region 2', slug='test-region-2')
  68. self.site1 = Site.objects.create(region=self.region1, name='Test Site 1', slug='test-site-1')
  69. self.site2 = Site.objects.create(region=self.region1, name='Test Site 2', slug='test-site-2')
  70. self.site3 = Site.objects.create(region=self.region1, name='Test Site 3', slug='test-site-3')
  71. def test_get_site(self):
  72. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  73. response = self.client.get(url, **self.header)
  74. self.assertEqual(response.data['name'], self.site1.name)
  75. def test_get_site_graphs(self):
  76. self.graph1 = Graph.objects.create(
  77. type=GRAPH_TYPE_SITE, name='Test Graph 1',
  78. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=1'
  79. )
  80. self.graph2 = Graph.objects.create(
  81. type=GRAPH_TYPE_SITE, name='Test Graph 2',
  82. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=2'
  83. )
  84. self.graph3 = Graph.objects.create(
  85. type=GRAPH_TYPE_SITE, name='Test Graph 3',
  86. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=3'
  87. )
  88. url = reverse('dcim-api:site-graphs', kwargs={'pk': self.site1.pk})
  89. response = self.client.get(url, **self.header)
  90. self.assertEqual(len(response.data), 3)
  91. self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?site=test-site-1&foo=1')
  92. def test_list_sites(self):
  93. url = reverse('dcim-api:site-list')
  94. response = self.client.get(url, **self.header)
  95. self.assertEqual(response.data['count'], 3)
  96. def test_create_site(self):
  97. data = {
  98. 'name': 'Test Site 4',
  99. 'slug': 'test-site-4',
  100. 'region': self.region1.pk,
  101. }
  102. url = reverse('dcim-api:site-list')
  103. response = self.client.post(url, data, format='json', **self.header)
  104. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  105. self.assertEqual(Site.objects.count(), 4)
  106. site4 = Site.objects.get(pk=response.data['id'])
  107. self.assertEqual(site4.name, data['name'])
  108. self.assertEqual(site4.slug, data['slug'])
  109. self.assertEqual(site4.region_id, data['region'])
  110. def test_update_site(self):
  111. data = {
  112. 'name': 'Test Site X',
  113. 'slug': 'test-site-x',
  114. 'region': self.region2.pk,
  115. }
  116. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  117. response = self.client.put(url, data, format='json', **self.header)
  118. self.assertHttpStatus(response, status.HTTP_200_OK)
  119. self.assertEqual(Site.objects.count(), 3)
  120. site1 = Site.objects.get(pk=response.data['id'])
  121. self.assertEqual(site1.name, data['name'])
  122. self.assertEqual(site1.slug, data['slug'])
  123. self.assertEqual(site1.region_id, data['region'])
  124. def test_delete_site(self):
  125. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  126. response = self.client.delete(url, **self.header)
  127. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  128. self.assertEqual(Site.objects.count(), 2)
  129. class RackGroupTest(HttpStatusMixin, APITestCase):
  130. def setUp(self):
  131. user = User.objects.create(username='testuser', is_superuser=True)
  132. token = Token.objects.create(user=user)
  133. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  134. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  135. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  136. self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1')
  137. self.rackgroup2 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 2', slug='test-rack-group-2')
  138. self.rackgroup3 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 3', slug='test-rack-group-3')
  139. def test_get_rackgroup(self):
  140. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  141. response = self.client.get(url, **self.header)
  142. self.assertEqual(response.data['name'], self.rackgroup1.name)
  143. def test_list_rackgroups(self):
  144. url = reverse('dcim-api:rackgroup-list')
  145. response = self.client.get(url, **self.header)
  146. self.assertEqual(response.data['count'], 3)
  147. def test_create_rackgroup(self):
  148. data = {
  149. 'name': 'Test Rack Group 4',
  150. 'slug': 'test-rack-group-4',
  151. 'site': self.site1.pk,
  152. }
  153. url = reverse('dcim-api:rackgroup-list')
  154. response = self.client.post(url, data, format='json', **self.header)
  155. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  156. self.assertEqual(RackGroup.objects.count(), 4)
  157. rackgroup4 = RackGroup.objects.get(pk=response.data['id'])
  158. self.assertEqual(rackgroup4.name, data['name'])
  159. self.assertEqual(rackgroup4.slug, data['slug'])
  160. self.assertEqual(rackgroup4.site_id, data['site'])
  161. def test_update_rackgroup(self):
  162. data = {
  163. 'name': 'Test Rack Group X',
  164. 'slug': 'test-rack-group-x',
  165. 'site': self.site2.pk,
  166. }
  167. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  168. response = self.client.put(url, data, format='json', **self.header)
  169. self.assertHttpStatus(response, status.HTTP_200_OK)
  170. self.assertEqual(RackGroup.objects.count(), 3)
  171. rackgroup1 = RackGroup.objects.get(pk=response.data['id'])
  172. self.assertEqual(rackgroup1.name, data['name'])
  173. self.assertEqual(rackgroup1.slug, data['slug'])
  174. self.assertEqual(rackgroup1.site_id, data['site'])
  175. def test_delete_rackgroup(self):
  176. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  177. response = self.client.delete(url, **self.header)
  178. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  179. self.assertEqual(RackGroup.objects.count(), 2)
  180. class RackRoleTest(HttpStatusMixin, APITestCase):
  181. def setUp(self):
  182. user = User.objects.create(username='testuser', is_superuser=True)
  183. token = Token.objects.create(user=user)
  184. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  185. self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000')
  186. self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00')
  187. self.rackrole3 = RackRole.objects.create(name='Test Rack Role 3', slug='test-rack-role-3', color='0000ff')
  188. def test_get_rackrole(self):
  189. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  190. response = self.client.get(url, **self.header)
  191. self.assertEqual(response.data['name'], self.rackrole1.name)
  192. def test_list_rackroles(self):
  193. url = reverse('dcim-api:rackrole-list')
  194. response = self.client.get(url, **self.header)
  195. self.assertEqual(response.data['count'], 3)
  196. def test_create_rackrole(self):
  197. data = {
  198. 'name': 'Test Rack Role 4',
  199. 'slug': 'test-rack-role-4',
  200. 'color': 'ffff00',
  201. }
  202. url = reverse('dcim-api:rackrole-list')
  203. response = self.client.post(url, data, format='json', **self.header)
  204. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  205. self.assertEqual(RackRole.objects.count(), 4)
  206. rackrole1 = RackRole.objects.get(pk=response.data['id'])
  207. self.assertEqual(rackrole1.name, data['name'])
  208. self.assertEqual(rackrole1.slug, data['slug'])
  209. self.assertEqual(rackrole1.color, data['color'])
  210. def test_update_rackrole(self):
  211. data = {
  212. 'name': 'Test Rack Role X',
  213. 'slug': 'test-rack-role-x',
  214. 'color': 'ffff00',
  215. }
  216. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  217. response = self.client.put(url, data, format='json', **self.header)
  218. self.assertHttpStatus(response, status.HTTP_200_OK)
  219. self.assertEqual(RackRole.objects.count(), 3)
  220. rackrole1 = RackRole.objects.get(pk=response.data['id'])
  221. self.assertEqual(rackrole1.name, data['name'])
  222. self.assertEqual(rackrole1.slug, data['slug'])
  223. self.assertEqual(rackrole1.color, data['color'])
  224. def test_delete_rackrole(self):
  225. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  226. response = self.client.delete(url, **self.header)
  227. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  228. self.assertEqual(RackRole.objects.count(), 2)
  229. class RackTest(HttpStatusMixin, APITestCase):
  230. def setUp(self):
  231. user = User.objects.create(username='testuser', is_superuser=True)
  232. token = Token.objects.create(user=user)
  233. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  234. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  235. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  236. self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1')
  237. self.rackgroup2 = RackGroup.objects.create(site=self.site2, name='Test Rack Group 2', slug='test-rack-group-2')
  238. self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000')
  239. self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00')
  240. self.rack1 = Rack.objects.create(
  241. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 1', u_height=42,
  242. )
  243. self.rack2 = Rack.objects.create(
  244. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 2', u_height=42,
  245. )
  246. self.rack3 = Rack.objects.create(
  247. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 3', u_height=42,
  248. )
  249. def test_get_rack(self):
  250. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  251. response = self.client.get(url, **self.header)
  252. self.assertEqual(response.data['name'], self.rack1.name)
  253. def test_get_rack_units(self):
  254. url = reverse('dcim-api:rack-units', kwargs={'pk': self.rack1.pk})
  255. response = self.client.get(url, **self.header)
  256. self.assertEqual(response.data['count'], 42)
  257. def test_list_racks(self):
  258. url = reverse('dcim-api:rack-list')
  259. response = self.client.get(url, **self.header)
  260. self.assertEqual(response.data['count'], 3)
  261. def test_create_rack(self):
  262. data = {
  263. 'name': 'Test Rack 4',
  264. 'site': self.site1.pk,
  265. 'group': self.rackgroup1.pk,
  266. 'role': self.rackrole1.pk,
  267. }
  268. url = reverse('dcim-api:rack-list')
  269. response = self.client.post(url, data, format='json', **self.header)
  270. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  271. self.assertEqual(Rack.objects.count(), 4)
  272. rack4 = Rack.objects.get(pk=response.data['id'])
  273. self.assertEqual(rack4.name, data['name'])
  274. self.assertEqual(rack4.site_id, data['site'])
  275. self.assertEqual(rack4.group_id, data['group'])
  276. self.assertEqual(rack4.role_id, data['role'])
  277. def test_update_rack(self):
  278. data = {
  279. 'name': 'Test Rack X',
  280. 'site': self.site2.pk,
  281. 'group': self.rackgroup2.pk,
  282. 'role': self.rackrole2.pk,
  283. }
  284. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  285. response = self.client.put(url, data, format='json', **self.header)
  286. self.assertHttpStatus(response, status.HTTP_200_OK)
  287. self.assertEqual(Rack.objects.count(), 3)
  288. rack1 = Rack.objects.get(pk=response.data['id'])
  289. self.assertEqual(rack1.name, data['name'])
  290. self.assertEqual(rack1.site_id, data['site'])
  291. self.assertEqual(rack1.group_id, data['group'])
  292. self.assertEqual(rack1.role_id, data['role'])
  293. def test_delete_rack(self):
  294. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  295. response = self.client.delete(url, **self.header)
  296. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  297. self.assertEqual(Rack.objects.count(), 2)
  298. class RackReservationTest(HttpStatusMixin, APITestCase):
  299. def setUp(self):
  300. user = User.objects.create(username='testuser', is_superuser=True)
  301. token = Token.objects.create(user=user)
  302. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  303. self.user1 = user
  304. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  305. self.rack1 = Rack.objects.create(site=self.site1, name='Test Rack 1')
  306. self.rackreservation1 = RackReservation.objects.create(
  307. rack=self.rack1, units=[1, 2, 3], user=user, description='First reservation',
  308. )
  309. self.rackreservation2 = RackReservation.objects.create(
  310. rack=self.rack1, units=[4, 5, 6], user=user, description='Second reservation',
  311. )
  312. self.rackreservation3 = RackReservation.objects.create(
  313. rack=self.rack1, units=[7, 8, 9], user=user, description='Third reservation',
  314. )
  315. def test_get_rackreservation(self):
  316. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  317. response = self.client.get(url, **self.header)
  318. self.assertEqual(response.data['id'], self.rackreservation1.pk)
  319. def test_list_rackreservations(self):
  320. url = reverse('dcim-api:rackreservation-list')
  321. response = self.client.get(url, **self.header)
  322. self.assertEqual(response.data['count'], 3)
  323. def test_create_rackreservation(self):
  324. data = {
  325. 'rack': self.rack1.pk,
  326. 'units': [10, 11, 12],
  327. 'user': self.user1.pk,
  328. 'description': 'Fourth reservation',
  329. }
  330. url = reverse('dcim-api:rackreservation-list')
  331. response = self.client.post(url, data, format='json', **self.header)
  332. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  333. self.assertEqual(RackReservation.objects.count(), 4)
  334. rackreservation4 = RackReservation.objects.get(pk=response.data['id'])
  335. self.assertEqual(rackreservation4.rack_id, data['rack'])
  336. self.assertEqual(rackreservation4.units, data['units'])
  337. self.assertEqual(rackreservation4.user_id, data['user'])
  338. self.assertEqual(rackreservation4.description, data['description'])
  339. def test_update_rackreservation(self):
  340. data = {
  341. 'rack': self.rack1.pk,
  342. 'units': [10, 11, 12],
  343. 'user': self.user1.pk,
  344. 'description': 'Modified reservation',
  345. }
  346. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  347. response = self.client.put(url, data, format='json', **self.header)
  348. self.assertHttpStatus(response, status.HTTP_200_OK)
  349. self.assertEqual(RackReservation.objects.count(), 3)
  350. rackreservation1 = RackReservation.objects.get(pk=response.data['id'])
  351. self.assertEqual(rackreservation1.units, data['units'])
  352. self.assertEqual(rackreservation1.description, data['description'])
  353. def test_delete_rackreservation(self):
  354. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  355. response = self.client.delete(url, **self.header)
  356. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  357. self.assertEqual(RackReservation.objects.count(), 2)
  358. class ManufacturerTest(HttpStatusMixin, APITestCase):
  359. def setUp(self):
  360. user = User.objects.create(username='testuser', is_superuser=True)
  361. token = Token.objects.create(user=user)
  362. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  363. self.manufacturer1 = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  364. self.manufacturer2 = Manufacturer.objects.create(name='Test Manufacturer 2', slug='test-manufacturer-2')
  365. self.manufacturer3 = Manufacturer.objects.create(name='Test Manufacturer 3', slug='test-manufacturer-3')
  366. def test_get_manufacturer(self):
  367. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  368. response = self.client.get(url, **self.header)
  369. self.assertEqual(response.data['name'], self.manufacturer1.name)
  370. def test_list_manufacturers(self):
  371. url = reverse('dcim-api:manufacturer-list')
  372. response = self.client.get(url, **self.header)
  373. self.assertEqual(response.data['count'], 3)
  374. def test_create_manufacturer(self):
  375. data = {
  376. 'name': 'Test Manufacturer 4',
  377. 'slug': 'test-manufacturer-4',
  378. }
  379. url = reverse('dcim-api:manufacturer-list')
  380. response = self.client.post(url, data, format='json', **self.header)
  381. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  382. self.assertEqual(Manufacturer.objects.count(), 4)
  383. manufacturer4 = Manufacturer.objects.get(pk=response.data['id'])
  384. self.assertEqual(manufacturer4.name, data['name'])
  385. self.assertEqual(manufacturer4.slug, data['slug'])
  386. def test_update_manufacturer(self):
  387. data = {
  388. 'name': 'Test Manufacturer X',
  389. 'slug': 'test-manufacturer-x',
  390. }
  391. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  392. response = self.client.put(url, data, format='json', **self.header)
  393. self.assertHttpStatus(response, status.HTTP_200_OK)
  394. self.assertEqual(Manufacturer.objects.count(), 3)
  395. manufacturer1 = Manufacturer.objects.get(pk=response.data['id'])
  396. self.assertEqual(manufacturer1.name, data['name'])
  397. self.assertEqual(manufacturer1.slug, data['slug'])
  398. def test_delete_manufacturer(self):
  399. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  400. response = self.client.delete(url, **self.header)
  401. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  402. self.assertEqual(Manufacturer.objects.count(), 2)
  403. class DeviceTypeTest(HttpStatusMixin, APITestCase):
  404. def setUp(self):
  405. user = User.objects.create(username='testuser', is_superuser=True)
  406. token = Token.objects.create(user=user)
  407. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  408. self.manufacturer1 = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  409. self.manufacturer2 = Manufacturer.objects.create(name='Test Manufacturer 2', slug='test-manufacturer-2')
  410. self.devicetype1 = DeviceType.objects.create(
  411. manufacturer=self.manufacturer1, model='Test Device Type 1', slug='test-device-type-1'
  412. )
  413. self.devicetype2 = DeviceType.objects.create(
  414. manufacturer=self.manufacturer1, model='Test Device Type 2', slug='test-device-type-2'
  415. )
  416. self.devicetype3 = DeviceType.objects.create(
  417. manufacturer=self.manufacturer1, model='Test Device Type 3', slug='test-device-type-3'
  418. )
  419. def test_get_devicetype(self):
  420. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  421. response = self.client.get(url, **self.header)
  422. self.assertEqual(response.data['model'], self.devicetype1.model)
  423. def test_list_devicetypes(self):
  424. url = reverse('dcim-api:devicetype-list')
  425. response = self.client.get(url, **self.header)
  426. self.assertEqual(response.data['count'], 3)
  427. def test_create_devicetype(self):
  428. data = {
  429. 'manufacturer': self.manufacturer1.pk,
  430. 'model': 'Test Device Type 4',
  431. 'slug': 'test-device-type-4',
  432. }
  433. url = reverse('dcim-api:devicetype-list')
  434. response = self.client.post(url, data, format='json', **self.header)
  435. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  436. self.assertEqual(DeviceType.objects.count(), 4)
  437. devicetype4 = DeviceType.objects.get(pk=response.data['id'])
  438. self.assertEqual(devicetype4.manufacturer_id, data['manufacturer'])
  439. self.assertEqual(devicetype4.model, data['model'])
  440. self.assertEqual(devicetype4.slug, data['slug'])
  441. def test_update_devicetype(self):
  442. data = {
  443. 'manufacturer': self.manufacturer2.pk,
  444. 'model': 'Test Device Type X',
  445. 'slug': 'test-device-type-x',
  446. }
  447. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  448. response = self.client.put(url, data, format='json', **self.header)
  449. self.assertHttpStatus(response, status.HTTP_200_OK)
  450. self.assertEqual(DeviceType.objects.count(), 3)
  451. devicetype1 = DeviceType.objects.get(pk=response.data['id'])
  452. self.assertEqual(devicetype1.manufacturer_id, data['manufacturer'])
  453. self.assertEqual(devicetype1.model, data['model'])
  454. self.assertEqual(devicetype1.slug, data['slug'])
  455. def test_delete_devicetype(self):
  456. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  457. response = self.client.delete(url, **self.header)
  458. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  459. self.assertEqual(DeviceType.objects.count(), 2)
  460. class ConsolePortTemplateTest(HttpStatusMixin, APITestCase):
  461. def setUp(self):
  462. user = User.objects.create(username='testuser', is_superuser=True)
  463. token = Token.objects.create(user=user)
  464. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  465. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  466. self.devicetype = DeviceType.objects.create(
  467. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  468. )
  469. self.consoleporttemplate1 = ConsolePortTemplate.objects.create(
  470. device_type=self.devicetype, name='Test CP Template 1'
  471. )
  472. self.consoleporttemplate2 = ConsolePortTemplate.objects.create(
  473. device_type=self.devicetype, name='Test CP Template 2'
  474. )
  475. self.consoleporttemplate3 = ConsolePortTemplate.objects.create(
  476. device_type=self.devicetype, name='Test CP Template 3'
  477. )
  478. def test_get_consoleporttemplate(self):
  479. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  480. response = self.client.get(url, **self.header)
  481. self.assertEqual(response.data['name'], self.consoleporttemplate1.name)
  482. def test_list_consoleporttemplates(self):
  483. url = reverse('dcim-api:consoleporttemplate-list')
  484. response = self.client.get(url, **self.header)
  485. self.assertEqual(response.data['count'], 3)
  486. def test_create_consoleporttemplate(self):
  487. data = {
  488. 'device_type': self.devicetype.pk,
  489. 'name': 'Test CP Template 4',
  490. }
  491. url = reverse('dcim-api:consoleporttemplate-list')
  492. response = self.client.post(url, data, format='json', **self.header)
  493. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  494. self.assertEqual(ConsolePortTemplate.objects.count(), 4)
  495. consoleporttemplate4 = ConsolePortTemplate.objects.get(pk=response.data['id'])
  496. self.assertEqual(consoleporttemplate4.device_type_id, data['device_type'])
  497. self.assertEqual(consoleporttemplate4.name, data['name'])
  498. def test_update_consoleporttemplate(self):
  499. data = {
  500. 'device_type': self.devicetype.pk,
  501. 'name': 'Test CP Template X',
  502. }
  503. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  504. response = self.client.put(url, data, format='json', **self.header)
  505. self.assertHttpStatus(response, status.HTTP_200_OK)
  506. self.assertEqual(ConsolePortTemplate.objects.count(), 3)
  507. consoleporttemplate1 = ConsolePortTemplate.objects.get(pk=response.data['id'])
  508. self.assertEqual(consoleporttemplate1.name, data['name'])
  509. def test_delete_consoleporttemplate(self):
  510. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  511. response = self.client.delete(url, **self.header)
  512. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  513. self.assertEqual(ConsolePortTemplate.objects.count(), 2)
  514. class ConsoleServerPortTemplateTest(HttpStatusMixin, APITestCase):
  515. def setUp(self):
  516. user = User.objects.create(username='testuser', is_superuser=True)
  517. token = Token.objects.create(user=user)
  518. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  519. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  520. self.devicetype = DeviceType.objects.create(
  521. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  522. )
  523. self.consoleserverporttemplate1 = ConsoleServerPortTemplate.objects.create(
  524. device_type=self.devicetype, name='Test CSP Template 1'
  525. )
  526. self.consoleserverporttemplate2 = ConsoleServerPortTemplate.objects.create(
  527. device_type=self.devicetype, name='Test CSP Template 2'
  528. )
  529. self.consoleserverporttemplate3 = ConsoleServerPortTemplate.objects.create(
  530. device_type=self.devicetype, name='Test CSP Template 3'
  531. )
  532. def test_get_consoleserverporttemplate(self):
  533. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  534. response = self.client.get(url, **self.header)
  535. self.assertEqual(response.data['name'], self.consoleserverporttemplate1.name)
  536. def test_list_consoleserverporttemplates(self):
  537. url = reverse('dcim-api:consoleserverporttemplate-list')
  538. response = self.client.get(url, **self.header)
  539. self.assertEqual(response.data['count'], 3)
  540. def test_create_consoleserverporttemplate(self):
  541. data = {
  542. 'device_type': self.devicetype.pk,
  543. 'name': 'Test CSP Template 4',
  544. }
  545. url = reverse('dcim-api:consoleserverporttemplate-list')
  546. response = self.client.post(url, data, format='json', **self.header)
  547. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  548. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 4)
  549. consoleserverporttemplate4 = ConsoleServerPortTemplate.objects.get(pk=response.data['id'])
  550. self.assertEqual(consoleserverporttemplate4.device_type_id, data['device_type'])
  551. self.assertEqual(consoleserverporttemplate4.name, data['name'])
  552. def test_update_consoleserverporttemplate(self):
  553. data = {
  554. 'device_type': self.devicetype.pk,
  555. 'name': 'Test CSP Template X',
  556. }
  557. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  558. response = self.client.put(url, data, format='json', **self.header)
  559. self.assertHttpStatus(response, status.HTTP_200_OK)
  560. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 3)
  561. consoleserverporttemplate1 = ConsoleServerPortTemplate.objects.get(pk=response.data['id'])
  562. self.assertEqual(consoleserverporttemplate1.name, data['name'])
  563. def test_delete_consoleserverporttemplate(self):
  564. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  565. response = self.client.delete(url, **self.header)
  566. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  567. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 2)
  568. class PowerPortTemplateTest(HttpStatusMixin, APITestCase):
  569. def setUp(self):
  570. user = User.objects.create(username='testuser', is_superuser=True)
  571. token = Token.objects.create(user=user)
  572. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  573. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  574. self.devicetype = DeviceType.objects.create(
  575. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  576. )
  577. self.powerporttemplate1 = PowerPortTemplate.objects.create(
  578. device_type=self.devicetype, name='Test PP Template 1'
  579. )
  580. self.powerporttemplate2 = PowerPortTemplate.objects.create(
  581. device_type=self.devicetype, name='Test PP Template 2'
  582. )
  583. self.powerporttemplate3 = PowerPortTemplate.objects.create(
  584. device_type=self.devicetype, name='Test PP Template 3'
  585. )
  586. def test_get_powerporttemplate(self):
  587. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  588. response = self.client.get(url, **self.header)
  589. self.assertEqual(response.data['name'], self.powerporttemplate1.name)
  590. def test_list_powerporttemplates(self):
  591. url = reverse('dcim-api:powerporttemplate-list')
  592. response = self.client.get(url, **self.header)
  593. self.assertEqual(response.data['count'], 3)
  594. def test_create_powerporttemplate(self):
  595. data = {
  596. 'device_type': self.devicetype.pk,
  597. 'name': 'Test PP Template 4',
  598. }
  599. url = reverse('dcim-api:powerporttemplate-list')
  600. response = self.client.post(url, data, format='json', **self.header)
  601. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  602. self.assertEqual(PowerPortTemplate.objects.count(), 4)
  603. powerporttemplate4 = PowerPortTemplate.objects.get(pk=response.data['id'])
  604. self.assertEqual(powerporttemplate4.device_type_id, data['device_type'])
  605. self.assertEqual(powerporttemplate4.name, data['name'])
  606. def test_update_powerporttemplate(self):
  607. data = {
  608. 'device_type': self.devicetype.pk,
  609. 'name': 'Test PP Template X',
  610. }
  611. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  612. response = self.client.put(url, data, format='json', **self.header)
  613. self.assertHttpStatus(response, status.HTTP_200_OK)
  614. self.assertEqual(PowerPortTemplate.objects.count(), 3)
  615. powerporttemplate1 = PowerPortTemplate.objects.get(pk=response.data['id'])
  616. self.assertEqual(powerporttemplate1.name, data['name'])
  617. def test_delete_powerporttemplate(self):
  618. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  619. response = self.client.delete(url, **self.header)
  620. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  621. self.assertEqual(PowerPortTemplate.objects.count(), 2)
  622. class PowerOutletTemplateTest(HttpStatusMixin, APITestCase):
  623. def setUp(self):
  624. user = User.objects.create(username='testuser', is_superuser=True)
  625. token = Token.objects.create(user=user)
  626. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  627. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  628. self.devicetype = DeviceType.objects.create(
  629. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  630. )
  631. self.poweroutlettemplate1 = PowerOutletTemplate.objects.create(
  632. device_type=self.devicetype, name='Test PO Template 1'
  633. )
  634. self.poweroutlettemplate2 = PowerOutletTemplate.objects.create(
  635. device_type=self.devicetype, name='Test PO Template 2'
  636. )
  637. self.poweroutlettemplate3 = PowerOutletTemplate.objects.create(
  638. device_type=self.devicetype, name='Test PO Template 3'
  639. )
  640. def test_get_poweroutlettemplate(self):
  641. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  642. response = self.client.get(url, **self.header)
  643. self.assertEqual(response.data['name'], self.poweroutlettemplate1.name)
  644. def test_list_poweroutlettemplates(self):
  645. url = reverse('dcim-api:poweroutlettemplate-list')
  646. response = self.client.get(url, **self.header)
  647. self.assertEqual(response.data['count'], 3)
  648. def test_create_poweroutlettemplate(self):
  649. data = {
  650. 'device_type': self.devicetype.pk,
  651. 'name': 'Test PO Template 4',
  652. }
  653. url = reverse('dcim-api:poweroutlettemplate-list')
  654. response = self.client.post(url, data, format='json', **self.header)
  655. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  656. self.assertEqual(PowerOutletTemplate.objects.count(), 4)
  657. poweroutlettemplate4 = PowerOutletTemplate.objects.get(pk=response.data['id'])
  658. self.assertEqual(poweroutlettemplate4.device_type_id, data['device_type'])
  659. self.assertEqual(poweroutlettemplate4.name, data['name'])
  660. def test_update_poweroutlettemplate(self):
  661. data = {
  662. 'device_type': self.devicetype.pk,
  663. 'name': 'Test PO Template X',
  664. }
  665. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  666. response = self.client.put(url, data, format='json', **self.header)
  667. self.assertHttpStatus(response, status.HTTP_200_OK)
  668. self.assertEqual(PowerOutletTemplate.objects.count(), 3)
  669. poweroutlettemplate1 = PowerOutletTemplate.objects.get(pk=response.data['id'])
  670. self.assertEqual(poweroutlettemplate1.name, data['name'])
  671. def test_delete_poweroutlettemplate(self):
  672. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  673. response = self.client.delete(url, **self.header)
  674. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  675. self.assertEqual(PowerOutletTemplate.objects.count(), 2)
  676. class InterfaceTemplateTest(HttpStatusMixin, APITestCase):
  677. def setUp(self):
  678. user = User.objects.create(username='testuser', is_superuser=True)
  679. token = Token.objects.create(user=user)
  680. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  681. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  682. self.devicetype = DeviceType.objects.create(
  683. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  684. )
  685. self.interfacetemplate1 = InterfaceTemplate.objects.create(
  686. device_type=self.devicetype, name='Test Interface Template 1'
  687. )
  688. self.interfacetemplate2 = InterfaceTemplate.objects.create(
  689. device_type=self.devicetype, name='Test Interface Template 2'
  690. )
  691. self.interfacetemplate3 = InterfaceTemplate.objects.create(
  692. device_type=self.devicetype, name='Test Interface Template 3'
  693. )
  694. def test_get_interfacetemplate(self):
  695. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  696. response = self.client.get(url, **self.header)
  697. self.assertEqual(response.data['name'], self.interfacetemplate1.name)
  698. def test_list_interfacetemplates(self):
  699. url = reverse('dcim-api:interfacetemplate-list')
  700. response = self.client.get(url, **self.header)
  701. self.assertEqual(response.data['count'], 3)
  702. def test_create_interfacetemplate(self):
  703. data = {
  704. 'device_type': self.devicetype.pk,
  705. 'name': 'Test Interface Template 4',
  706. }
  707. url = reverse('dcim-api:interfacetemplate-list')
  708. response = self.client.post(url, data, format='json', **self.header)
  709. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  710. self.assertEqual(InterfaceTemplate.objects.count(), 4)
  711. interfacetemplate4 = InterfaceTemplate.objects.get(pk=response.data['id'])
  712. self.assertEqual(interfacetemplate4.device_type_id, data['device_type'])
  713. self.assertEqual(interfacetemplate4.name, data['name'])
  714. def test_update_interfacetemplate(self):
  715. data = {
  716. 'device_type': self.devicetype.pk,
  717. 'name': 'Test Interface Template X',
  718. }
  719. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  720. response = self.client.put(url, data, format='json', **self.header)
  721. self.assertHttpStatus(response, status.HTTP_200_OK)
  722. self.assertEqual(InterfaceTemplate.objects.count(), 3)
  723. interfacetemplate1 = InterfaceTemplate.objects.get(pk=response.data['id'])
  724. self.assertEqual(interfacetemplate1.name, data['name'])
  725. def test_delete_interfacetemplate(self):
  726. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  727. response = self.client.delete(url, **self.header)
  728. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  729. self.assertEqual(InterfaceTemplate.objects.count(), 2)
  730. class DeviceBayTemplateTest(HttpStatusMixin, APITestCase):
  731. def setUp(self):
  732. user = User.objects.create(username='testuser', is_superuser=True)
  733. token = Token.objects.create(user=user)
  734. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  735. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  736. self.devicetype = DeviceType.objects.create(
  737. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  738. )
  739. self.devicebaytemplate1 = DeviceBayTemplate.objects.create(
  740. device_type=self.devicetype, name='Test Device Bay Template 1'
  741. )
  742. self.devicebaytemplate2 = DeviceBayTemplate.objects.create(
  743. device_type=self.devicetype, name='Test Device Bay Template 2'
  744. )
  745. self.devicebaytemplate3 = DeviceBayTemplate.objects.create(
  746. device_type=self.devicetype, name='Test Device Bay Template 3'
  747. )
  748. def test_get_devicebaytemplate(self):
  749. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  750. response = self.client.get(url, **self.header)
  751. self.assertEqual(response.data['name'], self.devicebaytemplate1.name)
  752. def test_list_devicebaytemplates(self):
  753. url = reverse('dcim-api:devicebaytemplate-list')
  754. response = self.client.get(url, **self.header)
  755. self.assertEqual(response.data['count'], 3)
  756. def test_create_devicebaytemplate(self):
  757. data = {
  758. 'device_type': self.devicetype.pk,
  759. 'name': 'Test Device Bay Template 4',
  760. }
  761. url = reverse('dcim-api:devicebaytemplate-list')
  762. response = self.client.post(url, data, format='json', **self.header)
  763. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  764. self.assertEqual(DeviceBayTemplate.objects.count(), 4)
  765. devicebaytemplate4 = DeviceBayTemplate.objects.get(pk=response.data['id'])
  766. self.assertEqual(devicebaytemplate4.device_type_id, data['device_type'])
  767. self.assertEqual(devicebaytemplate4.name, data['name'])
  768. def test_update_devicebaytemplate(self):
  769. data = {
  770. 'device_type': self.devicetype.pk,
  771. 'name': 'Test Device Bay Template X',
  772. }
  773. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  774. response = self.client.put(url, data, format='json', **self.header)
  775. self.assertHttpStatus(response, status.HTTP_200_OK)
  776. self.assertEqual(DeviceBayTemplate.objects.count(), 3)
  777. devicebaytemplate1 = DeviceBayTemplate.objects.get(pk=response.data['id'])
  778. self.assertEqual(devicebaytemplate1.name, data['name'])
  779. def test_delete_devicebaytemplate(self):
  780. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  781. response = self.client.delete(url, **self.header)
  782. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  783. self.assertEqual(DeviceBayTemplate.objects.count(), 2)
  784. class DeviceRoleTest(HttpStatusMixin, APITestCase):
  785. def setUp(self):
  786. user = User.objects.create(username='testuser', is_superuser=True)
  787. token = Token.objects.create(user=user)
  788. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  789. self.devicerole1 = DeviceRole.objects.create(
  790. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  791. )
  792. self.devicerole2 = DeviceRole.objects.create(
  793. name='Test Device Role 2', slug='test-device-role-2', color='00ff00'
  794. )
  795. self.devicerole3 = DeviceRole.objects.create(
  796. name='Test Device Role 3', slug='test-device-role-3', color='0000ff'
  797. )
  798. def test_get_devicerole(self):
  799. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  800. response = self.client.get(url, **self.header)
  801. self.assertEqual(response.data['name'], self.devicerole1.name)
  802. def test_list_deviceroles(self):
  803. url = reverse('dcim-api:devicerole-list')
  804. response = self.client.get(url, **self.header)
  805. self.assertEqual(response.data['count'], 3)
  806. def test_create_devicerole(self):
  807. data = {
  808. 'name': 'Test Device Role 4',
  809. 'slug': 'test-device-role-4',
  810. 'color': 'ffff00',
  811. }
  812. url = reverse('dcim-api:devicerole-list')
  813. response = self.client.post(url, data, format='json', **self.header)
  814. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  815. self.assertEqual(DeviceRole.objects.count(), 4)
  816. devicerole4 = DeviceRole.objects.get(pk=response.data['id'])
  817. self.assertEqual(devicerole4.name, data['name'])
  818. self.assertEqual(devicerole4.slug, data['slug'])
  819. self.assertEqual(devicerole4.color, data['color'])
  820. def test_update_devicerole(self):
  821. data = {
  822. 'name': 'Test Device Role X',
  823. 'slug': 'test-device-role-x',
  824. 'color': '00ffff',
  825. }
  826. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  827. response = self.client.put(url, data, format='json', **self.header)
  828. self.assertHttpStatus(response, status.HTTP_200_OK)
  829. self.assertEqual(DeviceRole.objects.count(), 3)
  830. devicerole1 = DeviceRole.objects.get(pk=response.data['id'])
  831. self.assertEqual(devicerole1.name, data['name'])
  832. self.assertEqual(devicerole1.slug, data['slug'])
  833. self.assertEqual(devicerole1.color, data['color'])
  834. def test_delete_devicerole(self):
  835. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  836. response = self.client.delete(url, **self.header)
  837. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  838. self.assertEqual(DeviceRole.objects.count(), 2)
  839. class PlatformTest(HttpStatusMixin, APITestCase):
  840. def setUp(self):
  841. user = User.objects.create(username='testuser', is_superuser=True)
  842. token = Token.objects.create(user=user)
  843. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  844. self.platform1 = Platform.objects.create(name='Test Platform 1', slug='test-platform-1')
  845. self.platform2 = Platform.objects.create(name='Test Platform 2', slug='test-platform-2')
  846. self.platform3 = Platform.objects.create(name='Test Platform 3', slug='test-platform-3')
  847. def test_get_platform(self):
  848. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  849. response = self.client.get(url, **self.header)
  850. self.assertEqual(response.data['name'], self.platform1.name)
  851. def test_list_platforms(self):
  852. url = reverse('dcim-api:platform-list')
  853. response = self.client.get(url, **self.header)
  854. self.assertEqual(response.data['count'], 3)
  855. def test_create_platform(self):
  856. data = {
  857. 'name': 'Test Platform 4',
  858. 'slug': 'test-platform-4',
  859. }
  860. url = reverse('dcim-api:platform-list')
  861. response = self.client.post(url, data, format='json', **self.header)
  862. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  863. self.assertEqual(Platform.objects.count(), 4)
  864. platform4 = Platform.objects.get(pk=response.data['id'])
  865. self.assertEqual(platform4.name, data['name'])
  866. self.assertEqual(platform4.slug, data['slug'])
  867. def test_update_platform(self):
  868. data = {
  869. 'name': 'Test Platform X',
  870. 'slug': 'test-platform-x',
  871. }
  872. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  873. response = self.client.put(url, data, format='json', **self.header)
  874. self.assertHttpStatus(response, status.HTTP_200_OK)
  875. self.assertEqual(Platform.objects.count(), 3)
  876. platform1 = Platform.objects.get(pk=response.data['id'])
  877. self.assertEqual(platform1.name, data['name'])
  878. self.assertEqual(platform1.slug, data['slug'])
  879. def test_delete_platform(self):
  880. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  881. response = self.client.delete(url, **self.header)
  882. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  883. self.assertEqual(Platform.objects.count(), 2)
  884. class DeviceTest(HttpStatusMixin, APITestCase):
  885. def setUp(self):
  886. user = User.objects.create(username='testuser', is_superuser=True)
  887. token = Token.objects.create(user=user)
  888. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  889. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  890. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  891. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  892. self.devicetype1 = DeviceType.objects.create(
  893. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  894. )
  895. self.devicetype2 = DeviceType.objects.create(
  896. manufacturer=manufacturer, model='Test Device Type 2', slug='test-device-type-2'
  897. )
  898. self.devicerole1 = DeviceRole.objects.create(
  899. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  900. )
  901. self.devicerole2 = DeviceRole.objects.create(
  902. name='Test Device Role 2', slug='test-device-role-2', color='00ff00'
  903. )
  904. self.device1 = Device.objects.create(
  905. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 1', site=self.site1
  906. )
  907. self.device2 = Device.objects.create(
  908. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 2', site=self.site1
  909. )
  910. self.device3 = Device.objects.create(
  911. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 3', site=self.site1
  912. )
  913. def test_get_device(self):
  914. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  915. response = self.client.get(url, **self.header)
  916. self.assertEqual(response.data['name'], self.device1.name)
  917. def test_list_devices(self):
  918. url = reverse('dcim-api:device-list')
  919. response = self.client.get(url, **self.header)
  920. self.assertEqual(response.data['count'], 3)
  921. def test_create_device(self):
  922. data = {
  923. 'device_type': self.devicetype1.pk,
  924. 'device_role': self.devicerole1.pk,
  925. 'name': 'Test Device 4',
  926. 'site': self.site1.pk,
  927. }
  928. url = reverse('dcim-api:device-list')
  929. response = self.client.post(url, data, format='json', **self.header)
  930. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  931. self.assertEqual(Device.objects.count(), 4)
  932. device4 = Device.objects.get(pk=response.data['id'])
  933. self.assertEqual(device4.device_type_id, data['device_type'])
  934. self.assertEqual(device4.device_role_id, data['device_role'])
  935. self.assertEqual(device4.name, data['name'])
  936. self.assertEqual(device4.site_id, data['site'])
  937. def test_update_device(self):
  938. data = {
  939. 'device_type': self.devicetype2.pk,
  940. 'device_role': self.devicerole2.pk,
  941. 'name': 'Test Device X',
  942. 'site': self.site2.pk,
  943. }
  944. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  945. response = self.client.put(url, data, format='json', **self.header)
  946. self.assertHttpStatus(response, status.HTTP_200_OK)
  947. self.assertEqual(Device.objects.count(), 3)
  948. device1 = Device.objects.get(pk=response.data['id'])
  949. self.assertEqual(device1.device_type_id, data['device_type'])
  950. self.assertEqual(device1.device_role_id, data['device_role'])
  951. self.assertEqual(device1.name, data['name'])
  952. self.assertEqual(device1.site_id, data['site'])
  953. def test_delete_device(self):
  954. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  955. response = self.client.delete(url, **self.header)
  956. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  957. self.assertEqual(Device.objects.count(), 2)
  958. class ConsolePortTest(HttpStatusMixin, APITestCase):
  959. def setUp(self):
  960. user = User.objects.create(username='testuser', is_superuser=True)
  961. token = Token.objects.create(user=user)
  962. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  963. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  964. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  965. devicetype = DeviceType.objects.create(
  966. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  967. )
  968. devicerole = DeviceRole.objects.create(
  969. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  970. )
  971. self.device = Device.objects.create(
  972. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  973. )
  974. self.consoleport1 = ConsolePort.objects.create(device=self.device, name='Test Console Port 1')
  975. self.consoleport2 = ConsolePort.objects.create(device=self.device, name='Test Console Port 2')
  976. self.consoleport3 = ConsolePort.objects.create(device=self.device, name='Test Console Port 3')
  977. def test_get_consoleport(self):
  978. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  979. response = self.client.get(url, **self.header)
  980. self.assertEqual(response.data['name'], self.consoleport1.name)
  981. def test_list_consoleports(self):
  982. url = reverse('dcim-api:consoleport-list')
  983. response = self.client.get(url, **self.header)
  984. self.assertEqual(response.data['count'], 3)
  985. def test_create_consoleport(self):
  986. data = {
  987. 'device': self.device.pk,
  988. 'name': 'Test Console Port 4',
  989. }
  990. url = reverse('dcim-api:consoleport-list')
  991. response = self.client.post(url, data, format='json', **self.header)
  992. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  993. self.assertEqual(ConsolePort.objects.count(), 4)
  994. consoleport4 = ConsolePort.objects.get(pk=response.data['id'])
  995. self.assertEqual(consoleport4.device_id, data['device'])
  996. self.assertEqual(consoleport4.name, data['name'])
  997. def test_update_consoleport(self):
  998. consoleserverport = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 1')
  999. data = {
  1000. 'device': self.device.pk,
  1001. 'name': 'Test Console Port X',
  1002. 'cs_port': consoleserverport.pk,
  1003. }
  1004. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  1005. response = self.client.put(url, data, format='json', **self.header)
  1006. self.assertHttpStatus(response, status.HTTP_200_OK)
  1007. self.assertEqual(ConsolePort.objects.count(), 3)
  1008. consoleport1 = ConsolePort.objects.get(pk=response.data['id'])
  1009. self.assertEqual(consoleport1.name, data['name'])
  1010. self.assertEqual(consoleport1.cs_port_id, data['cs_port'])
  1011. def test_delete_consoleport(self):
  1012. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  1013. response = self.client.delete(url, **self.header)
  1014. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1015. self.assertEqual(ConsolePort.objects.count(), 2)
  1016. class ConsoleServerPortTest(HttpStatusMixin, APITestCase):
  1017. def setUp(self):
  1018. user = User.objects.create(username='testuser', is_superuser=True)
  1019. token = Token.objects.create(user=user)
  1020. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1021. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1022. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1023. devicetype = DeviceType.objects.create(
  1024. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1', is_console_server=True
  1025. )
  1026. devicerole = DeviceRole.objects.create(
  1027. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1028. )
  1029. self.device = Device.objects.create(
  1030. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1031. )
  1032. self.consoleserverport1 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 1')
  1033. self.consoleserverport2 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 2')
  1034. self.consoleserverport3 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 3')
  1035. def test_get_consoleserverport(self):
  1036. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1037. response = self.client.get(url, **self.header)
  1038. self.assertEqual(response.data['name'], self.consoleserverport1.name)
  1039. def test_list_consoleserverports(self):
  1040. url = reverse('dcim-api:consoleserverport-list')
  1041. response = self.client.get(url, **self.header)
  1042. self.assertEqual(response.data['count'], 3)
  1043. def test_create_consoleserverport(self):
  1044. data = {
  1045. 'device': self.device.pk,
  1046. 'name': 'Test CS Port 4',
  1047. }
  1048. url = reverse('dcim-api:consoleserverport-list')
  1049. response = self.client.post(url, data, format='json', **self.header)
  1050. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1051. self.assertEqual(ConsoleServerPort.objects.count(), 4)
  1052. consoleserverport4 = ConsoleServerPort.objects.get(pk=response.data['id'])
  1053. self.assertEqual(consoleserverport4.device_id, data['device'])
  1054. self.assertEqual(consoleserverport4.name, data['name'])
  1055. def test_update_consoleserverport(self):
  1056. data = {
  1057. 'device': self.device.pk,
  1058. 'name': 'Test CS Port X',
  1059. }
  1060. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1061. response = self.client.put(url, data, format='json', **self.header)
  1062. self.assertHttpStatus(response, status.HTTP_200_OK)
  1063. self.assertEqual(ConsoleServerPort.objects.count(), 3)
  1064. consoleserverport1 = ConsoleServerPort.objects.get(pk=response.data['id'])
  1065. self.assertEqual(consoleserverport1.name, data['name'])
  1066. def test_delete_consoleserverport(self):
  1067. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1068. response = self.client.delete(url, **self.header)
  1069. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1070. self.assertEqual(ConsoleServerPort.objects.count(), 2)
  1071. class PowerPortTest(HttpStatusMixin, APITestCase):
  1072. def setUp(self):
  1073. user = User.objects.create(username='testuser', is_superuser=True)
  1074. token = Token.objects.create(user=user)
  1075. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1076. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1077. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1078. devicetype = DeviceType.objects.create(
  1079. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1080. )
  1081. devicerole = DeviceRole.objects.create(
  1082. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1083. )
  1084. self.device = Device.objects.create(
  1085. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1086. )
  1087. self.powerport1 = PowerPort.objects.create(device=self.device, name='Test Power Port 1')
  1088. self.powerport2 = PowerPort.objects.create(device=self.device, name='Test Power Port 2')
  1089. self.powerport3 = PowerPort.objects.create(device=self.device, name='Test Power Port 3')
  1090. def test_get_powerport(self):
  1091. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1092. response = self.client.get(url, **self.header)
  1093. self.assertEqual(response.data['name'], self.powerport1.name)
  1094. def test_list_powerports(self):
  1095. url = reverse('dcim-api:powerport-list')
  1096. response = self.client.get(url, **self.header)
  1097. self.assertEqual(response.data['count'], 3)
  1098. def test_create_powerport(self):
  1099. data = {
  1100. 'device': self.device.pk,
  1101. 'name': 'Test Power Port 4',
  1102. }
  1103. url = reverse('dcim-api:powerport-list')
  1104. response = self.client.post(url, data, format='json', **self.header)
  1105. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1106. self.assertEqual(PowerPort.objects.count(), 4)
  1107. powerport4 = PowerPort.objects.get(pk=response.data['id'])
  1108. self.assertEqual(powerport4.device_id, data['device'])
  1109. self.assertEqual(powerport4.name, data['name'])
  1110. def test_update_powerport(self):
  1111. poweroutlet = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 1')
  1112. data = {
  1113. 'device': self.device.pk,
  1114. 'name': 'Test Power Port X',
  1115. 'power_outlet': poweroutlet.pk,
  1116. }
  1117. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1118. response = self.client.put(url, data, format='json', **self.header)
  1119. self.assertHttpStatus(response, status.HTTP_200_OK)
  1120. self.assertEqual(PowerPort.objects.count(), 3)
  1121. powerport1 = PowerPort.objects.get(pk=response.data['id'])
  1122. self.assertEqual(powerport1.name, data['name'])
  1123. self.assertEqual(powerport1.power_outlet_id, data['power_outlet'])
  1124. def test_delete_powerport(self):
  1125. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1126. response = self.client.delete(url, **self.header)
  1127. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1128. self.assertEqual(PowerPort.objects.count(), 2)
  1129. class PowerOutletTest(HttpStatusMixin, APITestCase):
  1130. def setUp(self):
  1131. user = User.objects.create(username='testuser', is_superuser=True)
  1132. token = Token.objects.create(user=user)
  1133. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1134. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1135. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1136. devicetype = DeviceType.objects.create(
  1137. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1', is_pdu=True
  1138. )
  1139. devicerole = DeviceRole.objects.create(
  1140. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1141. )
  1142. self.device = Device.objects.create(
  1143. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1144. )
  1145. self.poweroutlet1 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 1')
  1146. self.poweroutlet2 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 2')
  1147. self.poweroutlet3 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 3')
  1148. def test_get_poweroutlet(self):
  1149. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1150. response = self.client.get(url, **self.header)
  1151. self.assertEqual(response.data['name'], self.poweroutlet1.name)
  1152. def test_list_poweroutlets(self):
  1153. url = reverse('dcim-api:poweroutlet-list')
  1154. response = self.client.get(url, **self.header)
  1155. self.assertEqual(response.data['count'], 3)
  1156. def test_create_poweroutlet(self):
  1157. data = {
  1158. 'device': self.device.pk,
  1159. 'name': 'Test Power Outlet 4',
  1160. }
  1161. url = reverse('dcim-api:poweroutlet-list')
  1162. response = self.client.post(url, data, format='json', **self.header)
  1163. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1164. self.assertEqual(PowerOutlet.objects.count(), 4)
  1165. poweroutlet4 = PowerOutlet.objects.get(pk=response.data['id'])
  1166. self.assertEqual(poweroutlet4.device_id, data['device'])
  1167. self.assertEqual(poweroutlet4.name, data['name'])
  1168. def test_update_poweroutlet(self):
  1169. data = {
  1170. 'device': self.device.pk,
  1171. 'name': 'Test Power Outlet X',
  1172. }
  1173. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1174. response = self.client.put(url, data, format='json', **self.header)
  1175. self.assertHttpStatus(response, status.HTTP_200_OK)
  1176. self.assertEqual(PowerOutlet.objects.count(), 3)
  1177. poweroutlet1 = PowerOutlet.objects.get(pk=response.data['id'])
  1178. self.assertEqual(poweroutlet1.name, data['name'])
  1179. def test_delete_poweroutlet(self):
  1180. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1181. response = self.client.delete(url, **self.header)
  1182. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1183. self.assertEqual(PowerOutlet.objects.count(), 2)
  1184. class InterfaceTest(HttpStatusMixin, APITestCase):
  1185. def setUp(self):
  1186. user = User.objects.create(username='testuser', is_superuser=True)
  1187. token = Token.objects.create(user=user)
  1188. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1189. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1190. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1191. devicetype = DeviceType.objects.create(
  1192. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1', is_network_device=True
  1193. )
  1194. devicerole = DeviceRole.objects.create(
  1195. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1196. )
  1197. self.device = Device.objects.create(
  1198. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1199. )
  1200. self.interface1 = Interface.objects.create(device=self.device, name='Test Interface 1')
  1201. self.interface2 = Interface.objects.create(device=self.device, name='Test Interface 2')
  1202. self.interface3 = Interface.objects.create(device=self.device, name='Test Interface 3')
  1203. def test_get_interface(self):
  1204. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1205. response = self.client.get(url, **self.header)
  1206. self.assertEqual(response.data['name'], self.interface1.name)
  1207. def test_get_interface_graphs(self):
  1208. self.graph1 = Graph.objects.create(
  1209. type=GRAPH_TYPE_INTERFACE, name='Test Graph 1',
  1210. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=1'
  1211. )
  1212. self.graph2 = Graph.objects.create(
  1213. type=GRAPH_TYPE_INTERFACE, name='Test Graph 2',
  1214. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=2'
  1215. )
  1216. self.graph3 = Graph.objects.create(
  1217. type=GRAPH_TYPE_INTERFACE, name='Test Graph 3',
  1218. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=3'
  1219. )
  1220. url = reverse('dcim-api:interface-graphs', kwargs={'pk': self.interface1.pk})
  1221. response = self.client.get(url, **self.header)
  1222. self.assertEqual(len(response.data), 3)
  1223. self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?interface=Test Interface 1&foo=1')
  1224. def test_list_interfaces(self):
  1225. url = reverse('dcim-api:interface-list')
  1226. response = self.client.get(url, **self.header)
  1227. self.assertEqual(response.data['count'], 3)
  1228. def test_create_interface(self):
  1229. data = {
  1230. 'device': self.device.pk,
  1231. 'name': 'Test Interface 4',
  1232. }
  1233. url = reverse('dcim-api:interface-list')
  1234. response = self.client.post(url, data, format='json', **self.header)
  1235. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1236. self.assertEqual(Interface.objects.count(), 4)
  1237. interface4 = Interface.objects.get(pk=response.data['id'])
  1238. self.assertEqual(interface4.device_id, data['device'])
  1239. self.assertEqual(interface4.name, data['name'])
  1240. def test_update_interface(self):
  1241. lag_interface = Interface.objects.create(
  1242. device=self.device, name='Test LAG Interface', form_factor=IFACE_FF_LAG
  1243. )
  1244. data = {
  1245. 'device': self.device.pk,
  1246. 'name': 'Test Interface X',
  1247. 'lag': lag_interface.pk,
  1248. }
  1249. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1250. response = self.client.put(url, data, format='json', **self.header)
  1251. self.assertHttpStatus(response, status.HTTP_200_OK)
  1252. self.assertEqual(Interface.objects.count(), 4)
  1253. interface1 = Interface.objects.get(pk=response.data['id'])
  1254. self.assertEqual(interface1.name, data['name'])
  1255. self.assertEqual(interface1.lag_id, data['lag'])
  1256. def test_delete_interface(self):
  1257. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1258. response = self.client.delete(url, **self.header)
  1259. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1260. self.assertEqual(Interface.objects.count(), 2)
  1261. class DeviceBayTest(HttpStatusMixin, APITestCase):
  1262. def setUp(self):
  1263. user = User.objects.create(username='testuser', is_superuser=True)
  1264. token = Token.objects.create(user=user)
  1265. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1266. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1267. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1268. self.devicetype1 = DeviceType.objects.create(
  1269. manufacturer=manufacturer, model='Parent Device Type', slug='parent-device-type',
  1270. subdevice_role=SUBDEVICE_ROLE_PARENT
  1271. )
  1272. self.devicetype2 = DeviceType.objects.create(
  1273. manufacturer=manufacturer, model='Child Device Type', slug='child-device-type',
  1274. subdevice_role=SUBDEVICE_ROLE_CHILD
  1275. )
  1276. devicerole = DeviceRole.objects.create(
  1277. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1278. )
  1279. self.parent_device = Device.objects.create(
  1280. device_type=self.devicetype1, device_role=devicerole, name='Parent Device 1', site=site
  1281. )
  1282. self.child_device = Device.objects.create(
  1283. device_type=self.devicetype2, device_role=devicerole, name='Child Device 1', site=site
  1284. )
  1285. self.devicebay1 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 1')
  1286. self.devicebay2 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 2')
  1287. self.devicebay3 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 3')
  1288. def test_get_devicebay(self):
  1289. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1290. response = self.client.get(url, **self.header)
  1291. self.assertEqual(response.data['name'], self.devicebay1.name)
  1292. def test_list_devicebays(self):
  1293. url = reverse('dcim-api:devicebay-list')
  1294. response = self.client.get(url, **self.header)
  1295. self.assertEqual(response.data['count'], 3)
  1296. def test_create_devicebay(self):
  1297. data = {
  1298. 'device': self.parent_device.pk,
  1299. 'name': 'Test Device Bay 4',
  1300. 'installed_device': self.child_device.pk,
  1301. }
  1302. url = reverse('dcim-api:devicebay-list')
  1303. response = self.client.post(url, data, format='json', **self.header)
  1304. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1305. self.assertEqual(DeviceBay.objects.count(), 4)
  1306. devicebay4 = DeviceBay.objects.get(pk=response.data['id'])
  1307. self.assertEqual(devicebay4.device_id, data['device'])
  1308. self.assertEqual(devicebay4.name, data['name'])
  1309. self.assertEqual(devicebay4.installed_device_id, data['installed_device'])
  1310. def test_update_devicebay(self):
  1311. data = {
  1312. 'device': self.parent_device.pk,
  1313. 'name': 'Test Device Bay X',
  1314. 'installed_device': self.child_device.pk,
  1315. }
  1316. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1317. response = self.client.put(url, data, format='json', **self.header)
  1318. self.assertHttpStatus(response, status.HTTP_200_OK)
  1319. self.assertEqual(DeviceBay.objects.count(), 3)
  1320. devicebay1 = DeviceBay.objects.get(pk=response.data['id'])
  1321. self.assertEqual(devicebay1.name, data['name'])
  1322. self.assertEqual(devicebay1.installed_device_id, data['installed_device'])
  1323. def test_delete_devicebay(self):
  1324. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1325. response = self.client.delete(url, **self.header)
  1326. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1327. self.assertEqual(DeviceBay.objects.count(), 2)
  1328. class InventoryItemTest(HttpStatusMixin, APITestCase):
  1329. def setUp(self):
  1330. user = User.objects.create(username='testuser', is_superuser=True)
  1331. token = Token.objects.create(user=user)
  1332. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1333. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1334. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1335. devicetype = DeviceType.objects.create(
  1336. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1337. )
  1338. devicerole = DeviceRole.objects.create(
  1339. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1340. )
  1341. self.device = Device.objects.create(
  1342. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1343. )
  1344. self.inventoryitem1 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 1')
  1345. self.inventoryitem2 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 2')
  1346. self.inventoryitem3 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 3')
  1347. def test_get_inventoryitem(self):
  1348. url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk})
  1349. response = self.client.get(url, **self.header)
  1350. self.assertEqual(response.data['name'], self.inventoryitem1.name)
  1351. def test_list_inventoryitems(self):
  1352. url = reverse('dcim-api:inventoryitem-list')
  1353. response = self.client.get(url, **self.header)
  1354. self.assertEqual(response.data['count'], 3)
  1355. def test_create_inventoryitem(self):
  1356. data = {
  1357. 'device': self.device.pk,
  1358. 'parent': self.inventoryitem1.pk,
  1359. 'name': 'Test Inventory Item 4',
  1360. 'manufacturer': self.manufacturer.pk,
  1361. }
  1362. url = reverse('dcim-api:inventoryitem-list')
  1363. response = self.client.post(url, data, format='json', **self.header)
  1364. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1365. self.assertEqual(InventoryItem.objects.count(), 4)
  1366. inventoryitem4 = InventoryItem.objects.get(pk=response.data['id'])
  1367. self.assertEqual(inventoryitem4.device_id, data['device'])
  1368. self.assertEqual(inventoryitem4.parent_id, data['parent'])
  1369. self.assertEqual(inventoryitem4.name, data['name'])
  1370. self.assertEqual(inventoryitem4.manufacturer_id, data['manufacturer'])
  1371. def test_update_inventoryitem(self):
  1372. data = {
  1373. 'device': self.device.pk,
  1374. 'parent': self.inventoryitem1.pk,
  1375. 'name': 'Test Inventory Item X',
  1376. 'manufacturer': self.manufacturer.pk,
  1377. }
  1378. url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk})
  1379. response = self.client.put(url, data, format='json', **self.header)
  1380. self.assertHttpStatus(response, status.HTTP_200_OK)
  1381. self.assertEqual(InventoryItem.objects.count(), 3)
  1382. inventoryitem1 = InventoryItem.objects.get(pk=response.data['id'])
  1383. self.assertEqual(inventoryitem1.device_id, data['device'])
  1384. self.assertEqual(inventoryitem1.parent_id, data['parent'])
  1385. self.assertEqual(inventoryitem1.name, data['name'])
  1386. self.assertEqual(inventoryitem1.manufacturer_id, data['manufacturer'])
  1387. def test_delete_inventoryitem(self):
  1388. url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk})
  1389. response = self.client.delete(url, **self.header)
  1390. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1391. self.assertEqual(InventoryItem.objects.count(), 2)
  1392. class ConsoleConnectionTest(HttpStatusMixin, APITestCase):
  1393. def setUp(self):
  1394. user = User.objects.create(username='testuser', is_superuser=True)
  1395. token = Token.objects.create(user=user)
  1396. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1397. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1398. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1399. devicetype = DeviceType.objects.create(
  1400. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1401. )
  1402. devicerole = DeviceRole.objects.create(
  1403. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1404. )
  1405. device1 = Device.objects.create(
  1406. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1407. )
  1408. device2 = Device.objects.create(
  1409. device_type=devicetype, device_role=devicerole, name='Test Device 2', site=site
  1410. )
  1411. cs_port1 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 1')
  1412. cs_port2 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 2')
  1413. cs_port3 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 3')
  1414. ConsolePort.objects.create(
  1415. device=device2, cs_port=cs_port1, name='Test Console Port 1', connection_status=True
  1416. )
  1417. ConsolePort.objects.create(
  1418. device=device2, cs_port=cs_port2, name='Test Console Port 2', connection_status=True
  1419. )
  1420. ConsolePort.objects.create(
  1421. device=device2, cs_port=cs_port3, name='Test Console Port 3', connection_status=True
  1422. )
  1423. def test_list_consoleconnections(self):
  1424. url = reverse('dcim-api:consoleconnections-list')
  1425. response = self.client.get(url, **self.header)
  1426. self.assertEqual(response.data['count'], 3)
  1427. class PowerConnectionTest(HttpStatusMixin, APITestCase):
  1428. def setUp(self):
  1429. user = User.objects.create(username='testuser', is_superuser=True)
  1430. token = Token.objects.create(user=user)
  1431. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1432. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1433. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1434. devicetype = DeviceType.objects.create(
  1435. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1436. )
  1437. devicerole = DeviceRole.objects.create(
  1438. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1439. )
  1440. device1 = Device.objects.create(
  1441. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1442. )
  1443. device2 = Device.objects.create(
  1444. device_type=devicetype, device_role=devicerole, name='Test Device 2', site=site
  1445. )
  1446. power_outlet1 = PowerOutlet.objects.create(device=device1, name='Test Power Outlet 1')
  1447. power_outlet2 = PowerOutlet.objects.create(device=device1, name='Test Power Outlet 2')
  1448. power_outlet3 = PowerOutlet.objects.create(device=device1, name='Test Power Outlet 3')
  1449. PowerPort.objects.create(
  1450. device=device2, power_outlet=power_outlet1, name='Test Power Port 1', connection_status=True
  1451. )
  1452. PowerPort.objects.create(
  1453. device=device2, power_outlet=power_outlet2, name='Test Power Port 2', connection_status=True
  1454. )
  1455. PowerPort.objects.create(
  1456. device=device2, power_outlet=power_outlet3, name='Test Power Port 3', connection_status=True
  1457. )
  1458. def test_list_powerconnections(self):
  1459. url = reverse('dcim-api:powerconnections-list')
  1460. response = self.client.get(url, **self.header)
  1461. self.assertEqual(response.data['count'], 3)
  1462. class InterfaceConnectionTest(HttpStatusMixin, APITestCase):
  1463. def setUp(self):
  1464. user = User.objects.create(username='testuser', is_superuser=True)
  1465. token = Token.objects.create(user=user)
  1466. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1467. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1468. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1469. devicetype = DeviceType.objects.create(
  1470. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1471. )
  1472. devicerole = DeviceRole.objects.create(
  1473. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1474. )
  1475. self.device = Device.objects.create(
  1476. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1477. )
  1478. self.interface1 = Interface.objects.create(device=self.device, name='Test Interface 1')
  1479. self.interface2 = Interface.objects.create(device=self.device, name='Test Interface 2')
  1480. self.interface3 = Interface.objects.create(device=self.device, name='Test Interface 3')
  1481. self.interface4 = Interface.objects.create(device=self.device, name='Test Interface 4')
  1482. self.interface5 = Interface.objects.create(device=self.device, name='Test Interface 5')
  1483. self.interface6 = Interface.objects.create(device=self.device, name='Test Interface 6')
  1484. self.interface7 = Interface.objects.create(device=self.device, name='Test Interface 7')
  1485. self.interface8 = Interface.objects.create(device=self.device, name='Test Interface 8')
  1486. self.interfaceconnection1 = InterfaceConnection.objects.create(
  1487. interface_a=self.interface1, interface_b=self.interface2
  1488. )
  1489. self.interfaceconnection2 = InterfaceConnection.objects.create(
  1490. interface_a=self.interface3, interface_b=self.interface4
  1491. )
  1492. self.interfaceconnection3 = InterfaceConnection.objects.create(
  1493. interface_a=self.interface5, interface_b=self.interface6
  1494. )
  1495. def test_get_interfaceconnection(self):
  1496. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  1497. response = self.client.get(url, **self.header)
  1498. self.assertEqual(response.data['interface_a']['id'], self.interfaceconnection1.interface_a_id)
  1499. self.assertEqual(response.data['interface_b']['id'], self.interfaceconnection1.interface_b_id)
  1500. def test_list_interfaceconnections(self):
  1501. url = reverse('dcim-api:interfaceconnection-list')
  1502. response = self.client.get(url, **self.header)
  1503. self.assertEqual(response.data['count'], 3)
  1504. def test_create_interfaceconnection(self):
  1505. data = {
  1506. 'interface_a': self.interface7.pk,
  1507. 'interface_b': self.interface8.pk,
  1508. }
  1509. url = reverse('dcim-api:interfaceconnection-list')
  1510. response = self.client.post(url, data, format='json', **self.header)
  1511. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1512. self.assertEqual(InterfaceConnection.objects.count(), 4)
  1513. interfaceconnection4 = InterfaceConnection.objects.get(pk=response.data['id'])
  1514. self.assertEqual(interfaceconnection4.interface_a_id, data['interface_a'])
  1515. self.assertEqual(interfaceconnection4.interface_b_id, data['interface_b'])
  1516. def test_update_interfaceconnection(self):
  1517. new_connection_status = not self.interfaceconnection1.connection_status
  1518. data = {
  1519. 'interface_a': self.interface7.pk,
  1520. 'interface_b': self.interface8.pk,
  1521. 'connection_status': new_connection_status,
  1522. }
  1523. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  1524. response = self.client.put(url, data, format='json', **self.header)
  1525. self.assertHttpStatus(response, status.HTTP_200_OK)
  1526. self.assertEqual(InterfaceConnection.objects.count(), 3)
  1527. interfaceconnection1 = InterfaceConnection.objects.get(pk=response.data['id'])
  1528. self.assertEqual(interfaceconnection1.interface_a_id, data['interface_a'])
  1529. self.assertEqual(interfaceconnection1.interface_b_id, data['interface_b'])
  1530. self.assertEqual(interfaceconnection1.connection_status, data['connection_status'])
  1531. def test_delete_interfaceconnection(self):
  1532. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  1533. response = self.client.delete(url, **self.header)
  1534. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1535. self.assertEqual(InterfaceConnection.objects.count(), 2)
  1536. class ConnectedDeviceTest(HttpStatusMixin, APITestCase):
  1537. def setUp(self):
  1538. user = User.objects.create(username='testuser', is_superuser=True)
  1539. token = Token.objects.create(user=user)
  1540. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1541. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1542. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  1543. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1544. self.devicetype1 = DeviceType.objects.create(
  1545. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1546. )
  1547. self.devicetype2 = DeviceType.objects.create(
  1548. manufacturer=manufacturer, model='Test Device Type 2', slug='test-device-type-2'
  1549. )
  1550. self.devicerole1 = DeviceRole.objects.create(
  1551. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1552. )
  1553. self.devicerole2 = DeviceRole.objects.create(
  1554. name='Test Device Role 2', slug='test-device-role-2', color='00ff00'
  1555. )
  1556. self.device1 = Device.objects.create(
  1557. device_type=self.devicetype1, device_role=self.devicerole1, name='TestDevice1', site=self.site1
  1558. )
  1559. self.device2 = Device.objects.create(
  1560. device_type=self.devicetype1, device_role=self.devicerole1, name='TestDevice2', site=self.site1
  1561. )
  1562. self.interface1 = Interface.objects.create(device=self.device1, name='eth0')
  1563. self.interface2 = Interface.objects.create(device=self.device2, name='eth0')
  1564. InterfaceConnection.objects.create(interface_a=self.interface1, interface_b=self.interface2)
  1565. def test_get_connected_device(self):
  1566. url = reverse('dcim-api:connected-device-list')
  1567. response = self.client.get(url + '?peer-device=TestDevice2&peer-interface=eth0', **self.header)
  1568. self.assertHttpStatus(response, status.HTTP_200_OK)
  1569. self.assertEqual(response.data['name'], self.device1.name)