test_api.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. from django.urls import reverse
  2. from rest_framework import status
  3. from dcim.choices import InterfaceModeChoices
  4. from ipam.models import VLAN
  5. from utilities.testing import APITestCase, APIViewTestCases
  6. from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
  7. class AppTest(APITestCase):
  8. def test_root(self):
  9. url = reverse('virtualization-api:api-root')
  10. response = self.client.get('{}?format=api'.format(url), **self.header)
  11. self.assertEqual(response.status_code, 200)
  12. class ClusterTypeTest(APIViewTestCases.APIViewTestCase):
  13. model = ClusterType
  14. brief_fields = ['cluster_count', 'display', 'id', 'name', 'slug', 'url']
  15. create_data = [
  16. {
  17. 'name': 'Cluster Type 4',
  18. 'slug': 'cluster-type-4',
  19. },
  20. {
  21. 'name': 'Cluster Type 5',
  22. 'slug': 'cluster-type-5',
  23. },
  24. {
  25. 'name': 'Cluster Type 6',
  26. 'slug': 'cluster-type-6',
  27. },
  28. ]
  29. bulk_update_data = {
  30. 'description': 'New description',
  31. }
  32. @classmethod
  33. def setUpTestData(cls):
  34. cluster_types = (
  35. ClusterType(name='Cluster Type 1', slug='cluster-type-1'),
  36. ClusterType(name='Cluster Type 2', slug='cluster-type-2'),
  37. ClusterType(name='Cluster Type 3', slug='cluster-type-3'),
  38. )
  39. ClusterType.objects.bulk_create(cluster_types)
  40. class ClusterGroupTest(APIViewTestCases.APIViewTestCase):
  41. model = ClusterGroup
  42. brief_fields = ['cluster_count', 'display', 'id', 'name', 'slug', 'url']
  43. create_data = [
  44. {
  45. 'name': 'Cluster Group 4',
  46. 'slug': 'cluster-type-4',
  47. },
  48. {
  49. 'name': 'Cluster Group 5',
  50. 'slug': 'cluster-type-5',
  51. },
  52. {
  53. 'name': 'Cluster Group 6',
  54. 'slug': 'cluster-type-6',
  55. },
  56. ]
  57. bulk_update_data = {
  58. 'description': 'New description',
  59. }
  60. @classmethod
  61. def setUpTestData(cls):
  62. cluster_Groups = (
  63. ClusterGroup(name='Cluster Group 1', slug='cluster-type-1'),
  64. ClusterGroup(name='Cluster Group 2', slug='cluster-type-2'),
  65. ClusterGroup(name='Cluster Group 3', slug='cluster-type-3'),
  66. )
  67. ClusterGroup.objects.bulk_create(cluster_Groups)
  68. class ClusterTest(APIViewTestCases.APIViewTestCase):
  69. model = Cluster
  70. brief_fields = ['display', 'id', 'name', 'url', 'virtualmachine_count']
  71. bulk_update_data = {
  72. 'comments': 'New comment',
  73. }
  74. @classmethod
  75. def setUpTestData(cls):
  76. cluster_types = (
  77. ClusterType(name='Cluster Type 1', slug='cluster-type-1'),
  78. ClusterType(name='Cluster Type 2', slug='cluster-type-2'),
  79. )
  80. ClusterType.objects.bulk_create(cluster_types)
  81. cluster_groups = (
  82. ClusterGroup(name='Cluster Group 1', slug='cluster-group-1'),
  83. ClusterGroup(name='Cluster Group 2', slug='cluster-group-2'),
  84. )
  85. ClusterGroup.objects.bulk_create(cluster_groups)
  86. clusters = (
  87. Cluster(name='Cluster 1', type=cluster_types[0], group=cluster_groups[0]),
  88. Cluster(name='Cluster 2', type=cluster_types[0], group=cluster_groups[0]),
  89. Cluster(name='Cluster 3', type=cluster_types[0], group=cluster_groups[0]),
  90. )
  91. Cluster.objects.bulk_create(clusters)
  92. cls.create_data = [
  93. {
  94. 'name': 'Cluster 4',
  95. 'type': cluster_types[1].pk,
  96. 'group': cluster_groups[1].pk,
  97. },
  98. {
  99. 'name': 'Cluster 5',
  100. 'type': cluster_types[1].pk,
  101. 'group': cluster_groups[1].pk,
  102. },
  103. {
  104. 'name': 'Cluster 6',
  105. 'type': cluster_types[1].pk,
  106. 'group': cluster_groups[1].pk,
  107. },
  108. ]
  109. class VirtualMachineTest(APIViewTestCases.APIViewTestCase):
  110. model = VirtualMachine
  111. brief_fields = ['display', 'id', 'name', 'url']
  112. bulk_update_data = {
  113. 'status': 'staged',
  114. }
  115. @classmethod
  116. def setUpTestData(cls):
  117. clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
  118. clustergroup = ClusterGroup.objects.create(name='Cluster Group 1', slug='cluster-group-1')
  119. clusters = (
  120. Cluster(name='Cluster 1', type=clustertype, group=clustergroup),
  121. Cluster(name='Cluster 2', type=clustertype, group=clustergroup),
  122. )
  123. Cluster.objects.bulk_create(clusters)
  124. virtual_machines = (
  125. VirtualMachine(name='Virtual Machine 1', cluster=clusters[0], local_context_data={'A': 1}),
  126. VirtualMachine(name='Virtual Machine 2', cluster=clusters[0], local_context_data={'B': 2}),
  127. VirtualMachine(name='Virtual Machine 3', cluster=clusters[0], local_context_data={'C': 3}),
  128. )
  129. VirtualMachine.objects.bulk_create(virtual_machines)
  130. cls.create_data = [
  131. {
  132. 'name': 'Virtual Machine 4',
  133. 'cluster': clusters[1].pk,
  134. },
  135. {
  136. 'name': 'Virtual Machine 5',
  137. 'cluster': clusters[1].pk,
  138. },
  139. {
  140. 'name': 'Virtual Machine 6',
  141. 'cluster': clusters[1].pk,
  142. },
  143. ]
  144. def test_config_context_included_by_default_in_list_view(self):
  145. """
  146. Check that config context data is included by default in the virtual machines list.
  147. """
  148. virtualmachine = VirtualMachine.objects.first()
  149. url = '{}?id={}'.format(reverse('virtualization-api:virtualmachine-list'), virtualmachine.pk)
  150. self.add_permissions('virtualization.view_virtualmachine')
  151. response = self.client.get(url, **self.header)
  152. self.assertEqual(response.data['results'][0].get('config_context', {}).get('A'), 1)
  153. def test_config_context_excluded(self):
  154. """
  155. Check that config context data can be excluded by passing ?exclude=config_context.
  156. """
  157. url = reverse('virtualization-api:virtualmachine-list') + '?exclude=config_context'
  158. self.add_permissions('virtualization.view_virtualmachine')
  159. response = self.client.get(url, **self.header)
  160. self.assertFalse('config_context' in response.data['results'][0])
  161. def test_unique_name_per_cluster_constraint(self):
  162. """
  163. Check that creating a virtual machine with a duplicate name fails.
  164. """
  165. data = {
  166. 'name': 'Virtual Machine 1',
  167. 'cluster': Cluster.objects.first().pk,
  168. }
  169. url = reverse('virtualization-api:virtualmachine-list')
  170. self.add_permissions('virtualization.add_virtualmachine')
  171. response = self.client.post(url, data, format='json', **self.header)
  172. self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
  173. class VMInterfaceTest(APIViewTestCases.APIViewTestCase):
  174. model = VMInterface
  175. brief_fields = ['display', 'id', 'name', 'url', 'virtual_machine']
  176. bulk_update_data = {
  177. 'description': 'New description',
  178. }
  179. graphql_base_name = 'vm_interface'
  180. @classmethod
  181. def setUpTestData(cls):
  182. clustertype = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1')
  183. cluster = Cluster.objects.create(name='Test Cluster 1', type=clustertype)
  184. virtualmachine = VirtualMachine.objects.create(cluster=cluster, name='Test VM 1')
  185. interfaces = (
  186. VMInterface(virtual_machine=virtualmachine, name='Interface 1'),
  187. VMInterface(virtual_machine=virtualmachine, name='Interface 2'),
  188. VMInterface(virtual_machine=virtualmachine, name='Interface 3'),
  189. )
  190. VMInterface.objects.bulk_create(interfaces)
  191. vlans = (
  192. VLAN(name='VLAN 1', vid=1),
  193. VLAN(name='VLAN 2', vid=2),
  194. VLAN(name='VLAN 3', vid=3),
  195. )
  196. VLAN.objects.bulk_create(vlans)
  197. cls.create_data = [
  198. {
  199. 'virtual_machine': virtualmachine.pk,
  200. 'name': 'Interface 4',
  201. 'mode': InterfaceModeChoices.MODE_TAGGED,
  202. 'tagged_vlans': [vlans[0].pk, vlans[1].pk],
  203. 'untagged_vlan': vlans[2].pk,
  204. },
  205. {
  206. 'virtual_machine': virtualmachine.pk,
  207. 'name': 'Interface 5',
  208. 'mode': InterfaceModeChoices.MODE_TAGGED,
  209. 'tagged_vlans': [vlans[0].pk, vlans[1].pk],
  210. 'untagged_vlan': vlans[2].pk,
  211. },
  212. {
  213. 'virtual_machine': virtualmachine.pk,
  214. 'name': 'Interface 6',
  215. 'mode': InterfaceModeChoices.MODE_TAGGED,
  216. 'tagged_vlans': [vlans[0].pk, vlans[1].pk],
  217. 'untagged_vlan': vlans[2].pk,
  218. },
  219. ]