test_api.py 123 KB

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