test_views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. from django.test import override_settings
  2. from django.urls import reverse
  3. from netaddr import EUI
  4. from dcim.choices import InterfaceModeChoices
  5. from dcim.models import DeviceRole, Platform, Site
  6. from ipam.models import VLAN, VRF
  7. from utilities.testing import ViewTestCases, create_tags, create_test_device
  8. from virtualization.choices import *
  9. from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
  10. class ClusterGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  11. model = ClusterGroup
  12. @classmethod
  13. def setUpTestData(cls):
  14. ClusterGroup.objects.bulk_create([
  15. ClusterGroup(name='Cluster Group 1', slug='cluster-group-1'),
  16. ClusterGroup(name='Cluster Group 2', slug='cluster-group-2'),
  17. ClusterGroup(name='Cluster Group 3', slug='cluster-group-3'),
  18. ])
  19. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  20. cls.form_data = {
  21. 'name': 'Cluster Group X',
  22. 'slug': 'cluster-group-x',
  23. 'description': 'A new cluster group',
  24. 'tags': [t.pk for t in tags],
  25. }
  26. cls.csv_data = (
  27. "name,slug,description",
  28. "Cluster Group 4,cluster-group-4,Fourth cluster group",
  29. "Cluster Group 5,cluster-group-5,Fifth cluster group",
  30. "Cluster Group 6,cluster-group-6,Sixth cluster group",
  31. )
  32. cls.bulk_edit_data = {
  33. 'description': 'New description',
  34. }
  35. class ClusterTypeTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  36. model = ClusterType
  37. @classmethod
  38. def setUpTestData(cls):
  39. ClusterType.objects.bulk_create([
  40. ClusterType(name='Cluster Type 1', slug='cluster-type-1'),
  41. ClusterType(name='Cluster Type 2', slug='cluster-type-2'),
  42. ClusterType(name='Cluster Type 3', slug='cluster-type-3'),
  43. ])
  44. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  45. cls.form_data = {
  46. 'name': 'Cluster Type X',
  47. 'slug': 'cluster-type-x',
  48. 'description': 'A new cluster type',
  49. 'tags': [t.pk for t in tags],
  50. }
  51. cls.csv_data = (
  52. "name,slug,description",
  53. "Cluster Type 4,cluster-type-4,Fourth cluster type",
  54. "Cluster Type 5,cluster-type-5,Fifth cluster type",
  55. "Cluster Type 6,cluster-type-6,Sixth cluster type",
  56. )
  57. cls.bulk_edit_data = {
  58. 'description': 'New description',
  59. }
  60. class ClusterTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  61. model = Cluster
  62. @classmethod
  63. def setUpTestData(cls):
  64. sites = (
  65. Site(name='Site 1', slug='site-1'),
  66. Site(name='Site 2', slug='site-2'),
  67. )
  68. Site.objects.bulk_create(sites)
  69. clustergroups = (
  70. ClusterGroup(name='Cluster Group 1', slug='cluster-group-1'),
  71. ClusterGroup(name='Cluster Group 2', slug='cluster-group-2'),
  72. )
  73. ClusterGroup.objects.bulk_create(clustergroups)
  74. clustertypes = (
  75. ClusterType(name='Cluster Type 1', slug='cluster-type-1'),
  76. ClusterType(name='Cluster Type 2', slug='cluster-type-2'),
  77. )
  78. ClusterType.objects.bulk_create(clustertypes)
  79. Cluster.objects.bulk_create([
  80. Cluster(name='Cluster 1', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, site=sites[0]),
  81. Cluster(name='Cluster 2', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, site=sites[0]),
  82. Cluster(name='Cluster 3', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, site=sites[0]),
  83. ])
  84. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  85. cls.form_data = {
  86. 'name': 'Cluster X',
  87. 'group': clustergroups[1].pk,
  88. 'type': clustertypes[1].pk,
  89. 'status': ClusterStatusChoices.STATUS_OFFLINE,
  90. 'tenant': None,
  91. 'site': sites[1].pk,
  92. 'comments': 'Some comments',
  93. 'tags': [t.pk for t in tags],
  94. }
  95. cls.csv_data = (
  96. "name,type,status",
  97. "Cluster 4,Cluster Type 1,active",
  98. "Cluster 5,Cluster Type 1,active",
  99. "Cluster 6,Cluster Type 1,active",
  100. )
  101. cls.bulk_edit_data = {
  102. 'group': clustergroups[1].pk,
  103. 'type': clustertypes[1].pk,
  104. 'status': ClusterStatusChoices.STATUS_OFFLINE,
  105. 'tenant': None,
  106. 'site': sites[1].pk,
  107. 'comments': 'New comments',
  108. }
  109. @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
  110. def test_cluster_virtualmachines(self):
  111. cluster = Cluster.objects.first()
  112. url = reverse('virtualization:cluster_virtualmachines', kwargs={'pk': cluster.pk})
  113. self.assertHttpStatus(self.client.get(url), 200)
  114. @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
  115. def test_cluster_devices(self):
  116. cluster = Cluster.objects.first()
  117. url = reverse('virtualization:cluster_devices', kwargs={'pk': cluster.pk})
  118. self.assertHttpStatus(self.client.get(url), 200)
  119. class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  120. model = VirtualMachine
  121. @classmethod
  122. def setUpTestData(cls):
  123. deviceroles = (
  124. DeviceRole(name='Device Role 1', slug='device-role-1'),
  125. DeviceRole(name='Device Role 2', slug='device-role-2'),
  126. )
  127. DeviceRole.objects.bulk_create(deviceroles)
  128. platforms = (
  129. Platform(name='Platform 1', slug='platform-1'),
  130. Platform(name='Platform 2', slug='platform-2'),
  131. )
  132. Platform.objects.bulk_create(platforms)
  133. sites = (
  134. Site(name='Site 1', slug='site-1'),
  135. Site(name='Site 2', slug='site-2'),
  136. )
  137. Site.objects.bulk_create(sites)
  138. clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
  139. clusters = (
  140. Cluster(name='Cluster 1', type=clustertype, site=sites[0]),
  141. Cluster(name='Cluster 2', type=clustertype, site=sites[1]),
  142. )
  143. Cluster.objects.bulk_create(clusters)
  144. devices = (
  145. create_test_device('device1', site=sites[0], cluster=clusters[0]),
  146. create_test_device('device2', site=sites[1], cluster=clusters[1]),
  147. )
  148. VirtualMachine.objects.bulk_create([
  149. VirtualMachine(name='Virtual Machine 1', site=sites[0], cluster=clusters[0], device=devices[0], role=deviceroles[0], platform=platforms[0]),
  150. VirtualMachine(name='Virtual Machine 2', site=sites[0], cluster=clusters[0], device=devices[0], role=deviceroles[0], platform=platforms[0]),
  151. VirtualMachine(name='Virtual Machine 3', site=sites[0], cluster=clusters[0], device=devices[0], role=deviceroles[0], platform=platforms[0]),
  152. ])
  153. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  154. cls.form_data = {
  155. 'cluster': clusters[1].pk,
  156. 'device': devices[1].pk,
  157. 'site': sites[1].pk,
  158. 'tenant': None,
  159. 'platform': platforms[1].pk,
  160. 'name': 'Virtual Machine X',
  161. 'status': VirtualMachineStatusChoices.STATUS_STAGED,
  162. 'role': deviceroles[1].pk,
  163. 'primary_ip4': None,
  164. 'primary_ip6': None,
  165. 'vcpus': 4,
  166. 'memory': 32768,
  167. 'disk': 4000,
  168. 'comments': 'Some comments',
  169. 'tags': [t.pk for t in tags],
  170. 'local_context_data': None,
  171. }
  172. cls.csv_data = (
  173. "name,status,site,cluster,device",
  174. "Virtual Machine 4,active,Site 1,Cluster 1,device1",
  175. "Virtual Machine 5,active,Site 1,Cluster 1,device1",
  176. "Virtual Machine 6,active,Site 1,Cluster 1,",
  177. )
  178. cls.bulk_edit_data = {
  179. 'site': sites[1].pk,
  180. 'cluster': clusters[1].pk,
  181. 'device': devices[1].pk,
  182. 'tenant': None,
  183. 'platform': platforms[1].pk,
  184. 'status': VirtualMachineStatusChoices.STATUS_STAGED,
  185. 'role': deviceroles[1].pk,
  186. 'vcpus': 8,
  187. 'memory': 65535,
  188. 'disk': 8000,
  189. 'comments': 'New comments',
  190. }
  191. @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
  192. def test_virtualmachine_interfaces(self):
  193. virtualmachine = VirtualMachine.objects.first()
  194. vminterfaces = (
  195. VMInterface(virtual_machine=virtualmachine, name='Interface 1'),
  196. VMInterface(virtual_machine=virtualmachine, name='Interface 2'),
  197. VMInterface(virtual_machine=virtualmachine, name='Interface 3'),
  198. )
  199. VMInterface.objects.bulk_create(vminterfaces)
  200. url = reverse('virtualization:virtualmachine_interfaces', kwargs={'pk': virtualmachine.pk})
  201. self.assertHttpStatus(self.client.get(url), 200)
  202. class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase):
  203. model = VMInterface
  204. @classmethod
  205. def setUpTestData(cls):
  206. site = Site.objects.create(name='Site 1', slug='site-1')
  207. devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
  208. clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
  209. cluster = Cluster.objects.create(name='Cluster 1', type=clustertype, site=site)
  210. virtualmachines = (
  211. VirtualMachine(name='Virtual Machine 1', site=site, cluster=cluster, role=devicerole),
  212. VirtualMachine(name='Virtual Machine 2', site=site, cluster=cluster, role=devicerole),
  213. )
  214. VirtualMachine.objects.bulk_create(virtualmachines)
  215. interfaces = VMInterface.objects.bulk_create([
  216. VMInterface(virtual_machine=virtualmachines[0], name='Interface 1'),
  217. VMInterface(virtual_machine=virtualmachines[0], name='Interface 2'),
  218. VMInterface(virtual_machine=virtualmachines[0], name='Interface 3'),
  219. VMInterface(virtual_machine=virtualmachines[1], name='BRIDGE'),
  220. ])
  221. vlans = (
  222. VLAN(vid=1, name='VLAN1', site=site),
  223. VLAN(vid=101, name='VLAN101', site=site),
  224. VLAN(vid=102, name='VLAN102', site=site),
  225. VLAN(vid=103, name='VLAN103', site=site),
  226. )
  227. VLAN.objects.bulk_create(vlans)
  228. vrfs = (
  229. VRF(name='VRF 1'),
  230. VRF(name='VRF 2'),
  231. VRF(name='VRF 3'),
  232. )
  233. VRF.objects.bulk_create(vrfs)
  234. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  235. cls.form_data = {
  236. 'virtual_machine': virtualmachines[1].pk,
  237. 'name': 'Interface X',
  238. 'enabled': False,
  239. 'bridge': interfaces[3].pk,
  240. 'mac_address': EUI('01-02-03-04-05-06'),
  241. 'mtu': 65000,
  242. 'description': 'New description',
  243. 'mode': InterfaceModeChoices.MODE_TAGGED,
  244. 'untagged_vlan': vlans[0].pk,
  245. 'tagged_vlans': [v.pk for v in vlans[1:4]],
  246. 'vrf': vrfs[0].pk,
  247. 'tags': [t.pk for t in tags],
  248. }
  249. cls.bulk_create_data = {
  250. 'virtual_machine': virtualmachines[1].pk,
  251. 'name_pattern': 'Interface [4-6]',
  252. 'enabled': False,
  253. 'bridge': interfaces[3].pk,
  254. 'mac_address': EUI('01-02-03-04-05-06'),
  255. 'mtu': 2000,
  256. 'description': 'New description',
  257. 'mode': InterfaceModeChoices.MODE_TAGGED,
  258. 'untagged_vlan': vlans[0].pk,
  259. 'tagged_vlans': [v.pk for v in vlans[1:4]],
  260. 'vrf': vrfs[0].pk,
  261. 'tags': [t.pk for t in tags],
  262. }
  263. cls.csv_data = (
  264. f"virtual_machine,name,vrf.pk",
  265. f"Virtual Machine 2,Interface 4,{vrfs[0].pk}",
  266. f"Virtual Machine 2,Interface 5,{vrfs[0].pk}",
  267. f"Virtual Machine 2,Interface 6,{vrfs[0].pk}",
  268. )
  269. cls.bulk_edit_data = {
  270. 'enabled': False,
  271. 'mtu': 2000,
  272. 'description': 'New description',
  273. 'mode': InterfaceModeChoices.MODE_TAGGED,
  274. 'untagged_vlan': vlans[0].pk,
  275. 'tagged_vlans': [v.pk for v in vlans[1:4]],
  276. }