test_api.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. from django.urls import reverse
  2. from netaddr import IPNetwork
  3. from rest_framework import status
  4. from dcim.constants import IFACE_TYPE_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. ['cluster_count', '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. ['cluster_count', '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', 'virtualmachine_count']
  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. self.virtualmachine_with_context_data = VirtualMachine.objects.create(
  246. name='VM with context data',
  247. cluster=self.cluster1,
  248. local_context_data={
  249. 'A': 1,
  250. 'B': 2
  251. }
  252. )
  253. def test_get_virtualmachine(self):
  254. url = reverse('virtualization-api:virtualmachine-detail', kwargs={'pk': self.virtualmachine1.pk})
  255. response = self.client.get(url, **self.header)
  256. self.assertEqual(response.data['name'], self.virtualmachine1.name)
  257. def test_list_virtualmachines(self):
  258. url = reverse('virtualization-api:virtualmachine-list')
  259. response = self.client.get(url, **self.header)
  260. self.assertEqual(response.data['count'], 4)
  261. def test_list_virtualmachines_brief(self):
  262. url = reverse('virtualization-api:virtualmachine-list')
  263. response = self.client.get('{}?brief=1'.format(url), **self.header)
  264. self.assertEqual(
  265. sorted(response.data['results'][0]),
  266. ['id', 'name', 'url']
  267. )
  268. def test_create_virtualmachine(self):
  269. data = {
  270. 'name': 'Test Virtual Machine 4',
  271. 'cluster': self.cluster1.pk,
  272. }
  273. url = reverse('virtualization-api:virtualmachine-list')
  274. response = self.client.post(url, data, format='json', **self.header)
  275. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  276. self.assertEqual(VirtualMachine.objects.count(), 5)
  277. virtualmachine4 = VirtualMachine.objects.get(pk=response.data['id'])
  278. self.assertEqual(virtualmachine4.name, data['name'])
  279. self.assertEqual(virtualmachine4.cluster.pk, data['cluster'])
  280. def test_create_virtualmachine_without_cluster(self):
  281. data = {
  282. 'name': 'Test Virtual Machine 4',
  283. }
  284. url = reverse('virtualization-api:virtualmachine-list')
  285. response = self.client.post(url, data, format='json', **self.header)
  286. self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
  287. self.assertEqual(VirtualMachine.objects.count(), 4)
  288. def test_create_virtualmachine_bulk(self):
  289. data = [
  290. {
  291. 'name': 'Test Virtual Machine 4',
  292. 'cluster': self.cluster1.pk,
  293. },
  294. {
  295. 'name': 'Test Virtual Machine 5',
  296. 'cluster': self.cluster1.pk,
  297. },
  298. {
  299. 'name': 'Test Virtual Machine 6',
  300. 'cluster': self.cluster1.pk,
  301. },
  302. ]
  303. url = reverse('virtualization-api:virtualmachine-list')
  304. response = self.client.post(url, data, format='json', **self.header)
  305. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  306. self.assertEqual(VirtualMachine.objects.count(), 7)
  307. self.assertEqual(response.data[0]['name'], data[0]['name'])
  308. self.assertEqual(response.data[1]['name'], data[1]['name'])
  309. self.assertEqual(response.data[2]['name'], data[2]['name'])
  310. def test_update_virtualmachine(self):
  311. interface = Interface.objects.create(name='Test Interface 1', virtual_machine=self.virtualmachine1)
  312. ip4_address = IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), interface=interface)
  313. ip6_address = IPAddress.objects.create(address=IPNetwork('2001:db8::1/64'), interface=interface)
  314. cluster2 = Cluster.objects.create(
  315. name='Test Cluster 2',
  316. type=ClusterType.objects.first(),
  317. group=ClusterGroup.objects.first()
  318. )
  319. data = {
  320. 'name': 'Test Virtual Machine X',
  321. 'cluster': cluster2.pk,
  322. 'primary_ip4': ip4_address.pk,
  323. 'primary_ip6': ip6_address.pk,
  324. }
  325. url = reverse('virtualization-api:virtualmachine-detail', kwargs={'pk': self.virtualmachine1.pk})
  326. response = self.client.put(url, data, format='json', **self.header)
  327. self.assertHttpStatus(response, status.HTTP_200_OK)
  328. self.assertEqual(VirtualMachine.objects.count(), 4)
  329. virtualmachine1 = VirtualMachine.objects.get(pk=response.data['id'])
  330. self.assertEqual(virtualmachine1.name, data['name'])
  331. self.assertEqual(virtualmachine1.cluster.pk, data['cluster'])
  332. self.assertEqual(virtualmachine1.primary_ip4.pk, data['primary_ip4'])
  333. self.assertEqual(virtualmachine1.primary_ip6.pk, data['primary_ip6'])
  334. def test_delete_virtualmachine(self):
  335. url = reverse('virtualization-api:virtualmachine-detail', kwargs={'pk': self.virtualmachine1.pk})
  336. response = self.client.delete(url, **self.header)
  337. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  338. self.assertEqual(VirtualMachine.objects.count(), 3)
  339. def test_config_context_included_by_default_in_list_view(self):
  340. url = reverse('virtualization-api:virtualmachine-list')
  341. url = '{}?id={}'.format(url, self.virtualmachine_with_context_data.pk)
  342. response = self.client.get(url, **self.header)
  343. self.assertEqual(response.data['results'][0].get('config_context', {}).get('A'), 1)
  344. def test_config_context_excluded(self):
  345. url = reverse('virtualization-api:virtualmachine-list') + '?exclude=config_context'
  346. response = self.client.get(url, **self.header)
  347. self.assertFalse('config_context' in response.data['results'][0])
  348. class InterfaceTest(APITestCase):
  349. def setUp(self):
  350. super().setUp()
  351. clustertype = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1')
  352. cluster = Cluster.objects.create(name='Test Cluster 1', type=clustertype)
  353. self.virtualmachine = VirtualMachine.objects.create(cluster=cluster, name='Test VM 1')
  354. self.interface1 = Interface.objects.create(
  355. virtual_machine=self.virtualmachine,
  356. name='Test Interface 1',
  357. type=IFACE_TYPE_VIRTUAL
  358. )
  359. self.interface2 = Interface.objects.create(
  360. virtual_machine=self.virtualmachine,
  361. name='Test Interface 2',
  362. type=IFACE_TYPE_VIRTUAL
  363. )
  364. self.interface3 = Interface.objects.create(
  365. virtual_machine=self.virtualmachine,
  366. name='Test Interface 3',
  367. type=IFACE_TYPE_VIRTUAL
  368. )
  369. self.vlan1 = VLAN.objects.create(name="Test VLAN 1", vid=1)
  370. self.vlan2 = VLAN.objects.create(name="Test VLAN 2", vid=2)
  371. self.vlan3 = VLAN.objects.create(name="Test VLAN 3", vid=3)
  372. def test_get_interface(self):
  373. url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
  374. response = self.client.get(url, **self.header)
  375. self.assertEqual(response.data['name'], self.interface1.name)
  376. def test_list_interfaces(self):
  377. url = reverse('virtualization-api:interface-list')
  378. response = self.client.get(url, **self.header)
  379. self.assertEqual(response.data['count'], 3)
  380. def test_list_interfaces_brief(self):
  381. url = reverse('virtualization-api:interface-list')
  382. response = self.client.get('{}?brief=1'.format(url), **self.header)
  383. self.assertEqual(
  384. sorted(response.data['results'][0]),
  385. ['id', 'name', 'url', 'virtual_machine']
  386. )
  387. def test_create_interface(self):
  388. data = {
  389. 'virtual_machine': self.virtualmachine.pk,
  390. 'name': 'Test Interface 4',
  391. }
  392. url = reverse('virtualization-api:interface-list')
  393. response = self.client.post(url, data, format='json', **self.header)
  394. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  395. self.assertEqual(Interface.objects.count(), 4)
  396. interface4 = Interface.objects.get(pk=response.data['id'])
  397. self.assertEqual(interface4.virtual_machine_id, data['virtual_machine'])
  398. self.assertEqual(interface4.name, data['name'])
  399. def test_create_interface_with_802_1q(self):
  400. data = {
  401. 'virtual_machine': self.virtualmachine.pk,
  402. 'name': 'Test Interface 4',
  403. 'mode': IFACE_MODE_TAGGED,
  404. 'untagged_vlan': self.vlan3.id,
  405. 'tagged_vlans': [self.vlan1.id, self.vlan2.id],
  406. }
  407. url = reverse('virtualization-api:interface-list')
  408. response = self.client.post(url, data, format='json', **self.header)
  409. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  410. self.assertEqual(Interface.objects.count(), 4)
  411. self.assertEqual(response.data['virtual_machine']['id'], data['virtual_machine'])
  412. self.assertEqual(response.data['name'], data['name'])
  413. self.assertEqual(response.data['untagged_vlan']['id'], data['untagged_vlan'])
  414. self.assertEqual([v['id'] for v in response.data['tagged_vlans']], data['tagged_vlans'])
  415. def test_create_interface_bulk(self):
  416. data = [
  417. {
  418. 'virtual_machine': self.virtualmachine.pk,
  419. 'name': 'Test Interface 4',
  420. },
  421. {
  422. 'virtual_machine': self.virtualmachine.pk,
  423. 'name': 'Test Interface 5',
  424. },
  425. {
  426. 'virtual_machine': self.virtualmachine.pk,
  427. 'name': 'Test Interface 6',
  428. },
  429. ]
  430. url = reverse('virtualization-api:interface-list')
  431. response = self.client.post(url, data, format='json', **self.header)
  432. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  433. self.assertEqual(Interface.objects.count(), 6)
  434. self.assertEqual(response.data[0]['name'], data[0]['name'])
  435. self.assertEqual(response.data[1]['name'], data[1]['name'])
  436. self.assertEqual(response.data[2]['name'], data[2]['name'])
  437. def test_create_interface_802_1q_bulk(self):
  438. data = [
  439. {
  440. 'virtual_machine': self.virtualmachine.pk,
  441. 'name': 'Test Interface 4',
  442. 'mode': IFACE_MODE_TAGGED,
  443. 'untagged_vlan': self.vlan2.id,
  444. 'tagged_vlans': [self.vlan1.id],
  445. },
  446. {
  447. 'virtual_machine': self.virtualmachine.pk,
  448. 'name': 'Test Interface 5',
  449. 'mode': IFACE_MODE_TAGGED,
  450. 'untagged_vlan': self.vlan2.id,
  451. 'tagged_vlans': [self.vlan1.id],
  452. },
  453. {
  454. 'virtual_machine': self.virtualmachine.pk,
  455. 'name': 'Test Interface 6',
  456. 'mode': IFACE_MODE_TAGGED,
  457. 'untagged_vlan': self.vlan2.id,
  458. 'tagged_vlans': [self.vlan1.id],
  459. },
  460. ]
  461. url = reverse('virtualization-api:interface-list')
  462. response = self.client.post(url, data, format='json', **self.header)
  463. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  464. self.assertEqual(Interface.objects.count(), 6)
  465. for i in range(0, 3):
  466. self.assertEqual(response.data[i]['name'], data[i]['name'])
  467. self.assertEqual([v['id'] for v in response.data[i]['tagged_vlans']], data[i]['tagged_vlans'])
  468. self.assertEqual(response.data[i]['untagged_vlan']['id'], data[i]['untagged_vlan'])
  469. def test_update_interface(self):
  470. data = {
  471. 'virtual_machine': self.virtualmachine.pk,
  472. 'name': 'Test Interface X',
  473. }
  474. url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
  475. response = self.client.put(url, data, format='json', **self.header)
  476. self.assertHttpStatus(response, status.HTTP_200_OK)
  477. self.assertEqual(Interface.objects.count(), 3)
  478. interface1 = Interface.objects.get(pk=response.data['id'])
  479. self.assertEqual(interface1.name, data['name'])
  480. def test_delete_interface(self):
  481. url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
  482. response = self.client.delete(url, **self.header)
  483. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  484. self.assertEqual(Interface.objects.count(), 2)