test_api.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. from django.urls import reverse
  2. from netaddr import IPNetwork
  3. from rest_framework import status
  4. from dcim.constants import IFACE_FF_VIRTUAL, IFACE_MODE_TAGGED
  5. from dcim.models import Interface
  6. from ipam.models import IPAddress, VLAN
  7. from utilities.testing import APITestCase
  8. from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
  9. class ClusterTypeTest(APITestCase):
  10. def setUp(self):
  11. super().setUp()
  12. self.clustertype1 = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1')
  13. self.clustertype2 = ClusterType.objects.create(name='Test Cluster Type 2', slug='test-cluster-type-2')
  14. self.clustertype3 = ClusterType.objects.create(name='Test Cluster Type 3', slug='test-cluster-type-3')
  15. def test_get_clustertype(self):
  16. url = reverse('virtualization-api:clustertype-detail', kwargs={'pk': self.clustertype1.pk})
  17. response = self.client.get(url, **self.header)
  18. self.assertEqual(response.data['name'], self.clustertype1.name)
  19. def test_list_clustertypes(self):
  20. url = reverse('virtualization-api:clustertype-list')
  21. response = self.client.get(url, **self.header)
  22. self.assertEqual(response.data['count'], 3)
  23. def test_list_clustertypes_brief(self):
  24. url = reverse('virtualization-api:clustertype-list')
  25. response = self.client.get('{}?brief=1'.format(url), **self.header)
  26. self.assertEqual(
  27. sorted(response.data['results'][0]),
  28. ['id', 'name', 'slug', 'url']
  29. )
  30. def test_create_clustertype(self):
  31. data = {
  32. 'name': 'Test Cluster Type 4',
  33. 'slug': 'test-cluster-type-4',
  34. }
  35. url = reverse('virtualization-api:clustertype-list')
  36. response = self.client.post(url, data, format='json', **self.header)
  37. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  38. self.assertEqual(ClusterType.objects.count(), 4)
  39. clustertype4 = ClusterType.objects.get(pk=response.data['id'])
  40. self.assertEqual(clustertype4.name, data['name'])
  41. self.assertEqual(clustertype4.slug, data['slug'])
  42. def test_create_clustertype_bulk(self):
  43. data = [
  44. {
  45. 'name': 'Test Cluster Type 4',
  46. 'slug': 'test-cluster-type-4',
  47. },
  48. {
  49. 'name': 'Test Cluster Type 5',
  50. 'slug': 'test-cluster-type-5',
  51. },
  52. {
  53. 'name': 'Test Cluster Type 6',
  54. 'slug': 'test-cluster-type-6',
  55. },
  56. ]
  57. url = reverse('virtualization-api:clustertype-list')
  58. response = self.client.post(url, data, format='json', **self.header)
  59. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  60. self.assertEqual(ClusterType.objects.count(), 6)
  61. self.assertEqual(response.data[0]['name'], data[0]['name'])
  62. self.assertEqual(response.data[1]['name'], data[1]['name'])
  63. self.assertEqual(response.data[2]['name'], data[2]['name'])
  64. def test_update_clustertype(self):
  65. data = {
  66. 'name': 'Test Cluster Type X',
  67. 'slug': 'test-cluster-type-x',
  68. }
  69. url = reverse('virtualization-api:clustertype-detail', kwargs={'pk': self.clustertype1.pk})
  70. response = self.client.put(url, data, format='json', **self.header)
  71. self.assertHttpStatus(response, status.HTTP_200_OK)
  72. self.assertEqual(ClusterType.objects.count(), 3)
  73. clustertype1 = ClusterType.objects.get(pk=response.data['id'])
  74. self.assertEqual(clustertype1.name, data['name'])
  75. self.assertEqual(clustertype1.slug, data['slug'])
  76. def test_delete_clustertype(self):
  77. url = reverse('virtualization-api:clustertype-detail', kwargs={'pk': self.clustertype1.pk})
  78. response = self.client.delete(url, **self.header)
  79. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  80. self.assertEqual(ClusterType.objects.count(), 2)
  81. class ClusterGroupTest(APITestCase):
  82. def setUp(self):
  83. super().setUp()
  84. self.clustergroup1 = ClusterGroup.objects.create(name='Test Cluster Group 1', slug='test-cluster-group-1')
  85. self.clustergroup2 = ClusterGroup.objects.create(name='Test Cluster Group 2', slug='test-cluster-group-2')
  86. self.clustergroup3 = ClusterGroup.objects.create(name='Test Cluster Group 3', slug='test-cluster-group-3')
  87. def test_get_clustergroup(self):
  88. url = reverse('virtualization-api:clustergroup-detail', kwargs={'pk': self.clustergroup1.pk})
  89. response = self.client.get(url, **self.header)
  90. self.assertEqual(response.data['name'], self.clustergroup1.name)
  91. def test_list_clustergroups(self):
  92. url = reverse('virtualization-api:clustergroup-list')
  93. response = self.client.get(url, **self.header)
  94. self.assertEqual(response.data['count'], 3)
  95. def test_list_clustergroups_brief(self):
  96. url = reverse('virtualization-api:clustergroup-list')
  97. response = self.client.get('{}?brief=1'.format(url), **self.header)
  98. self.assertEqual(
  99. sorted(response.data['results'][0]),
  100. ['id', 'name', 'slug', 'url']
  101. )
  102. def test_create_clustergroup(self):
  103. data = {
  104. 'name': 'Test Cluster Group 4',
  105. 'slug': 'test-cluster-group-4',
  106. }
  107. url = reverse('virtualization-api:clustergroup-list')
  108. response = self.client.post(url, data, format='json', **self.header)
  109. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  110. self.assertEqual(ClusterGroup.objects.count(), 4)
  111. clustergroup4 = ClusterGroup.objects.get(pk=response.data['id'])
  112. self.assertEqual(clustergroup4.name, data['name'])
  113. self.assertEqual(clustergroup4.slug, data['slug'])
  114. def test_create_clustergroup_bulk(self):
  115. data = [
  116. {
  117. 'name': 'Test Cluster Group 4',
  118. 'slug': 'test-cluster-group-4',
  119. },
  120. {
  121. 'name': 'Test Cluster Group 5',
  122. 'slug': 'test-cluster-group-5',
  123. },
  124. {
  125. 'name': 'Test Cluster Group 6',
  126. 'slug': 'test-cluster-group-6',
  127. },
  128. ]
  129. url = reverse('virtualization-api:clustergroup-list')
  130. response = self.client.post(url, data, format='json', **self.header)
  131. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  132. self.assertEqual(ClusterGroup.objects.count(), 6)
  133. self.assertEqual(response.data[0]['name'], data[0]['name'])
  134. self.assertEqual(response.data[1]['name'], data[1]['name'])
  135. self.assertEqual(response.data[2]['name'], data[2]['name'])
  136. def test_update_clustergroup(self):
  137. data = {
  138. 'name': 'Test Cluster Group X',
  139. 'slug': 'test-cluster-group-x',
  140. }
  141. url = reverse('virtualization-api:clustergroup-detail', kwargs={'pk': self.clustergroup1.pk})
  142. response = self.client.put(url, data, format='json', **self.header)
  143. self.assertHttpStatus(response, status.HTTP_200_OK)
  144. self.assertEqual(ClusterGroup.objects.count(), 3)
  145. clustergroup1 = ClusterGroup.objects.get(pk=response.data['id'])
  146. self.assertEqual(clustergroup1.name, data['name'])
  147. self.assertEqual(clustergroup1.slug, data['slug'])
  148. def test_delete_clustergroup(self):
  149. url = reverse('virtualization-api:clustergroup-detail', kwargs={'pk': self.clustergroup1.pk})
  150. response = self.client.delete(url, **self.header)
  151. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  152. self.assertEqual(ClusterGroup.objects.count(), 2)
  153. class ClusterTest(APITestCase):
  154. def setUp(self):
  155. super().setUp()
  156. cluster_type = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1')
  157. cluster_group = ClusterGroup.objects.create(name='Test Cluster Group 1', slug='test-cluster-group-1')
  158. self.cluster1 = Cluster.objects.create(name='Test Cluster 1', type=cluster_type, group=cluster_group)
  159. self.cluster2 = Cluster.objects.create(name='Test Cluster 2', type=cluster_type, group=cluster_group)
  160. self.cluster3 = Cluster.objects.create(name='Test Cluster 3', type=cluster_type, group=cluster_group)
  161. def test_get_cluster(self):
  162. url = reverse('virtualization-api:cluster-detail', kwargs={'pk': self.cluster1.pk})
  163. response = self.client.get(url, **self.header)
  164. self.assertEqual(response.data['name'], self.cluster1.name)
  165. def test_list_clusters(self):
  166. url = reverse('virtualization-api:cluster-list')
  167. response = self.client.get(url, **self.header)
  168. self.assertEqual(response.data['count'], 3)
  169. def test_list_clusters_brief(self):
  170. url = reverse('virtualization-api:cluster-list')
  171. response = self.client.get('{}?brief=1'.format(url), **self.header)
  172. self.assertEqual(
  173. sorted(response.data['results'][0]),
  174. ['id', 'name', 'url']
  175. )
  176. def test_create_cluster(self):
  177. data = {
  178. 'name': 'Test Cluster 4',
  179. 'type': ClusterType.objects.first().pk,
  180. 'group': ClusterGroup.objects.first().pk,
  181. }
  182. url = reverse('virtualization-api:cluster-list')
  183. response = self.client.post(url, data, format='json', **self.header)
  184. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  185. self.assertEqual(Cluster.objects.count(), 4)
  186. cluster4 = Cluster.objects.get(pk=response.data['id'])
  187. self.assertEqual(cluster4.name, data['name'])
  188. self.assertEqual(cluster4.type.pk, data['type'])
  189. self.assertEqual(cluster4.group.pk, data['group'])
  190. def test_create_cluster_bulk(self):
  191. data = [
  192. {
  193. 'name': 'Test Cluster 4',
  194. 'type': ClusterType.objects.first().pk,
  195. 'group': ClusterGroup.objects.first().pk,
  196. },
  197. {
  198. 'name': 'Test Cluster 5',
  199. 'type': ClusterType.objects.first().pk,
  200. 'group': ClusterGroup.objects.first().pk,
  201. },
  202. {
  203. 'name': 'Test Cluster 6',
  204. 'type': ClusterType.objects.first().pk,
  205. 'group': ClusterGroup.objects.first().pk,
  206. },
  207. ]
  208. url = reverse('virtualization-api:cluster-list')
  209. response = self.client.post(url, data, format='json', **self.header)
  210. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  211. self.assertEqual(Cluster.objects.count(), 6)
  212. self.assertEqual(response.data[0]['name'], data[0]['name'])
  213. self.assertEqual(response.data[1]['name'], data[1]['name'])
  214. self.assertEqual(response.data[2]['name'], data[2]['name'])
  215. def test_update_cluster(self):
  216. cluster_type2 = ClusterType.objects.create(name='Test Cluster Type 2', slug='test-cluster-type-2')
  217. cluster_group2 = ClusterGroup.objects.create(name='Test Cluster Group 2', slug='test-cluster-group-2')
  218. data = {
  219. 'name': 'Test Cluster X',
  220. 'type': cluster_type2.pk,
  221. 'group': cluster_group2.pk,
  222. }
  223. url = reverse('virtualization-api:cluster-detail', kwargs={'pk': self.cluster1.pk})
  224. response = self.client.put(url, data, format='json', **self.header)
  225. self.assertHttpStatus(response, status.HTTP_200_OK)
  226. self.assertEqual(Cluster.objects.count(), 3)
  227. cluster1 = Cluster.objects.get(pk=response.data['id'])
  228. self.assertEqual(cluster1.name, data['name'])
  229. self.assertEqual(cluster1.type.pk, data['type'])
  230. self.assertEqual(cluster1.group.pk, data['group'])
  231. def test_delete_cluster(self):
  232. url = reverse('virtualization-api:cluster-detail', kwargs={'pk': self.cluster1.pk})
  233. response = self.client.delete(url, **self.header)
  234. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  235. self.assertEqual(Cluster.objects.count(), 2)
  236. class VirtualMachineTest(APITestCase):
  237. def setUp(self):
  238. super().setUp()
  239. cluster_type = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1')
  240. cluster_group = ClusterGroup.objects.create(name='Test Cluster Group 1', slug='test-cluster-group-1')
  241. self.cluster1 = Cluster.objects.create(name='Test Cluster 1', type=cluster_type, group=cluster_group)
  242. self.virtualmachine1 = VirtualMachine.objects.create(name='Test Virtual Machine 1', cluster=self.cluster1)
  243. self.virtualmachine2 = VirtualMachine.objects.create(name='Test Virtual Machine 2', cluster=self.cluster1)
  244. self.virtualmachine3 = VirtualMachine.objects.create(name='Test Virtual Machine 3', cluster=self.cluster1)
  245. def test_get_virtualmachine(self):
  246. url = reverse('virtualization-api:virtualmachine-detail', kwargs={'pk': self.virtualmachine1.pk})
  247. response = self.client.get(url, **self.header)
  248. self.assertEqual(response.data['name'], self.virtualmachine1.name)
  249. def test_list_virtualmachines(self):
  250. url = reverse('virtualization-api:virtualmachine-list')
  251. response = self.client.get(url, **self.header)
  252. self.assertEqual(response.data['count'], 3)
  253. def test_list_virtualmachines_brief(self):
  254. url = reverse('virtualization-api:virtualmachine-list')
  255. response = self.client.get('{}?brief=1'.format(url), **self.header)
  256. self.assertEqual(
  257. sorted(response.data['results'][0]),
  258. ['id', 'name', 'url']
  259. )
  260. def test_create_virtualmachine(self):
  261. data = {
  262. 'name': 'Test Virtual Machine 4',
  263. 'cluster': self.cluster1.pk,
  264. }
  265. url = reverse('virtualization-api:virtualmachine-list')
  266. response = self.client.post(url, data, format='json', **self.header)
  267. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  268. self.assertEqual(VirtualMachine.objects.count(), 4)
  269. virtualmachine4 = VirtualMachine.objects.get(pk=response.data['id'])
  270. self.assertEqual(virtualmachine4.name, data['name'])
  271. self.assertEqual(virtualmachine4.cluster.pk, data['cluster'])
  272. def test_create_virtualmachine_without_cluster(self):
  273. data = {
  274. 'name': 'Test Virtual Machine 4',
  275. }
  276. url = reverse('virtualization-api:virtualmachine-list')
  277. response = self.client.post(url, data, format='json', **self.header)
  278. self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
  279. self.assertEqual(VirtualMachine.objects.count(), 3)
  280. def test_create_virtualmachine_bulk(self):
  281. data = [
  282. {
  283. 'name': 'Test Virtual Machine 4',
  284. 'cluster': self.cluster1.pk,
  285. },
  286. {
  287. 'name': 'Test Virtual Machine 5',
  288. 'cluster': self.cluster1.pk,
  289. },
  290. {
  291. 'name': 'Test Virtual Machine 6',
  292. 'cluster': self.cluster1.pk,
  293. },
  294. ]
  295. url = reverse('virtualization-api:virtualmachine-list')
  296. response = self.client.post(url, data, format='json', **self.header)
  297. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  298. self.assertEqual(VirtualMachine.objects.count(), 6)
  299. self.assertEqual(response.data[0]['name'], data[0]['name'])
  300. self.assertEqual(response.data[1]['name'], data[1]['name'])
  301. self.assertEqual(response.data[2]['name'], data[2]['name'])
  302. def test_update_virtualmachine(self):
  303. interface = Interface.objects.create(name='Test Interface 1', virtual_machine=self.virtualmachine1)
  304. ip4_address = IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), interface=interface)
  305. ip6_address = IPAddress.objects.create(address=IPNetwork('2001:db8::1/64'), interface=interface)
  306. cluster2 = Cluster.objects.create(
  307. name='Test Cluster 2',
  308. type=ClusterType.objects.first(),
  309. group=ClusterGroup.objects.first()
  310. )
  311. data = {
  312. 'name': 'Test Virtual Machine X',
  313. 'cluster': cluster2.pk,
  314. 'primary_ip4': ip4_address.pk,
  315. 'primary_ip6': ip6_address.pk,
  316. }
  317. url = reverse('virtualization-api:virtualmachine-detail', kwargs={'pk': self.virtualmachine1.pk})
  318. response = self.client.put(url, data, format='json', **self.header)
  319. self.assertHttpStatus(response, status.HTTP_200_OK)
  320. self.assertEqual(VirtualMachine.objects.count(), 3)
  321. virtualmachine1 = VirtualMachine.objects.get(pk=response.data['id'])
  322. self.assertEqual(virtualmachine1.name, data['name'])
  323. self.assertEqual(virtualmachine1.cluster.pk, data['cluster'])
  324. self.assertEqual(virtualmachine1.primary_ip4.pk, data['primary_ip4'])
  325. self.assertEqual(virtualmachine1.primary_ip6.pk, data['primary_ip6'])
  326. def test_delete_virtualmachine(self):
  327. url = reverse('virtualization-api:virtualmachine-detail', kwargs={'pk': self.virtualmachine1.pk})
  328. response = self.client.delete(url, **self.header)
  329. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  330. self.assertEqual(VirtualMachine.objects.count(), 2)
  331. class InterfaceTest(APITestCase):
  332. def setUp(self):
  333. super().setUp()
  334. clustertype = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1')
  335. cluster = Cluster.objects.create(name='Test Cluster 1', type=clustertype)
  336. self.virtualmachine = VirtualMachine.objects.create(cluster=cluster, name='Test VM 1')
  337. self.interface1 = Interface.objects.create(
  338. virtual_machine=self.virtualmachine,
  339. name='Test Interface 1',
  340. form_factor=IFACE_FF_VIRTUAL
  341. )
  342. self.interface2 = Interface.objects.create(
  343. virtual_machine=self.virtualmachine,
  344. name='Test Interface 2',
  345. form_factor=IFACE_FF_VIRTUAL
  346. )
  347. self.interface3 = Interface.objects.create(
  348. virtual_machine=self.virtualmachine,
  349. name='Test Interface 3',
  350. form_factor=IFACE_FF_VIRTUAL
  351. )
  352. self.vlan1 = VLAN.objects.create(name="Test VLAN 1", vid=1)
  353. self.vlan2 = VLAN.objects.create(name="Test VLAN 2", vid=2)
  354. self.vlan3 = VLAN.objects.create(name="Test VLAN 3", vid=3)
  355. def test_get_interface(self):
  356. url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
  357. response = self.client.get(url, **self.header)
  358. self.assertEqual(response.data['name'], self.interface1.name)
  359. def test_list_interfaces(self):
  360. url = reverse('virtualization-api:interface-list')
  361. response = self.client.get(url, **self.header)
  362. self.assertEqual(response.data['count'], 3)
  363. def test_list_interfaces_brief(self):
  364. url = reverse('virtualization-api:interface-list')
  365. response = self.client.get('{}?brief=1'.format(url), **self.header)
  366. self.assertEqual(
  367. sorted(response.data['results'][0]),
  368. ['id', 'name', 'url', 'virtual_machine']
  369. )
  370. def test_create_interface(self):
  371. data = {
  372. 'virtual_machine': self.virtualmachine.pk,
  373. 'name': 'Test Interface 4',
  374. }
  375. url = reverse('virtualization-api:interface-list')
  376. response = self.client.post(url, data, format='json', **self.header)
  377. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  378. self.assertEqual(Interface.objects.count(), 4)
  379. interface4 = Interface.objects.get(pk=response.data['id'])
  380. self.assertEqual(interface4.virtual_machine_id, data['virtual_machine'])
  381. self.assertEqual(interface4.name, data['name'])
  382. def test_create_interface_with_802_1q(self):
  383. data = {
  384. 'virtual_machine': self.virtualmachine.pk,
  385. 'name': 'Test Interface 4',
  386. 'mode': IFACE_MODE_TAGGED,
  387. 'untagged_vlan': self.vlan3.id,
  388. 'tagged_vlans': [self.vlan1.id, self.vlan2.id],
  389. }
  390. url = reverse('virtualization-api:interface-list')
  391. response = self.client.post(url, data, format='json', **self.header)
  392. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  393. self.assertEqual(Interface.objects.count(), 4)
  394. self.assertEqual(response.data['virtual_machine']['id'], data['virtual_machine'])
  395. self.assertEqual(response.data['name'], data['name'])
  396. self.assertEqual(response.data['untagged_vlan']['id'], data['untagged_vlan'])
  397. self.assertEqual([v['id'] for v in response.data['tagged_vlans']], data['tagged_vlans'])
  398. def test_create_interface_bulk(self):
  399. data = [
  400. {
  401. 'virtual_machine': self.virtualmachine.pk,
  402. 'name': 'Test Interface 4',
  403. },
  404. {
  405. 'virtual_machine': self.virtualmachine.pk,
  406. 'name': 'Test Interface 5',
  407. },
  408. {
  409. 'virtual_machine': self.virtualmachine.pk,
  410. 'name': 'Test Interface 6',
  411. },
  412. ]
  413. url = reverse('virtualization-api:interface-list')
  414. response = self.client.post(url, data, format='json', **self.header)
  415. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  416. self.assertEqual(Interface.objects.count(), 6)
  417. self.assertEqual(response.data[0]['name'], data[0]['name'])
  418. self.assertEqual(response.data[1]['name'], data[1]['name'])
  419. self.assertEqual(response.data[2]['name'], data[2]['name'])
  420. def test_create_interface_802_1q_bulk(self):
  421. data = [
  422. {
  423. 'virtual_machine': self.virtualmachine.pk,
  424. 'name': 'Test Interface 4',
  425. 'mode': IFACE_MODE_TAGGED,
  426. 'untagged_vlan': self.vlan2.id,
  427. 'tagged_vlans': [self.vlan1.id],
  428. },
  429. {
  430. 'virtual_machine': self.virtualmachine.pk,
  431. 'name': 'Test Interface 5',
  432. 'mode': IFACE_MODE_TAGGED,
  433. 'untagged_vlan': self.vlan2.id,
  434. 'tagged_vlans': [self.vlan1.id],
  435. },
  436. {
  437. 'virtual_machine': self.virtualmachine.pk,
  438. 'name': 'Test Interface 6',
  439. 'mode': IFACE_MODE_TAGGED,
  440. 'untagged_vlan': self.vlan2.id,
  441. 'tagged_vlans': [self.vlan1.id],
  442. },
  443. ]
  444. url = reverse('virtualization-api:interface-list')
  445. response = self.client.post(url, data, format='json', **self.header)
  446. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  447. self.assertEqual(Interface.objects.count(), 6)
  448. for i in range(0, 3):
  449. self.assertEqual(response.data[i]['name'], data[i]['name'])
  450. self.assertEqual([v['id'] for v in response.data[i]['tagged_vlans']], data[i]['tagged_vlans'])
  451. self.assertEqual(response.data[i]['untagged_vlan']['id'], data[i]['untagged_vlan'])
  452. def test_update_interface(self):
  453. data = {
  454. 'virtual_machine': self.virtualmachine.pk,
  455. 'name': 'Test Interface X',
  456. }
  457. url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
  458. response = self.client.put(url, data, format='json', **self.header)
  459. self.assertHttpStatus(response, status.HTTP_200_OK)
  460. self.assertEqual(Interface.objects.count(), 3)
  461. interface1 = Interface.objects.get(pk=response.data['id'])
  462. self.assertEqual(interface1.name, data['name'])
  463. def test_delete_interface(self):
  464. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  465. response = self.client.delete(url, **self.header)
  466. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  467. self.assertEqual(Interface.objects.count(), 2)