test_models.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. from django.core.exceptions import ValidationError
  2. from django.test import TestCase
  3. from dcim.models import Site
  4. from virtualization.models import *
  5. from tenancy.models import Tenant
  6. class VirtualMachineTestCase(TestCase):
  7. @classmethod
  8. def setUpTestData(cls):
  9. cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
  10. Cluster.objects.create(name='Cluster 1', type=cluster_type)
  11. def test_vm_duplicate_name_per_cluster(self):
  12. vm1 = VirtualMachine(
  13. cluster=Cluster.objects.first(),
  14. name='Test VM 1'
  15. )
  16. vm1.save()
  17. vm2 = VirtualMachine(
  18. cluster=vm1.cluster,
  19. name=vm1.name
  20. )
  21. # Two VMs assigned to the same Cluster and no Tenant should fail validation
  22. with self.assertRaises(ValidationError):
  23. vm2.full_clean()
  24. tenant = Tenant.objects.create(name='Test Tenant 1', slug='test-tenant-1')
  25. vm1.tenant = tenant
  26. vm1.save()
  27. vm2.tenant = tenant
  28. # Two VMs assigned to the same Cluster and the same Tenant should fail validation
  29. with self.assertRaises(ValidationError):
  30. vm2.full_clean()
  31. vm2.tenant = None
  32. # Two VMs assigned to the same Cluster and different Tenants should pass validation
  33. vm2.full_clean()
  34. vm2.save()
  35. def test_vm_mismatched_site_cluster(self):
  36. cluster_type = ClusterType.objects.first()
  37. sites = (
  38. Site(name='Site 1', slug='site-1'),
  39. Site(name='Site 2', slug='site-2'),
  40. )
  41. Site.objects.bulk_create(sites)
  42. clusters = (
  43. Cluster(name='Cluster 1', type=cluster_type, site=sites[0]),
  44. Cluster(name='Cluster 2', type=cluster_type, site=sites[1]),
  45. Cluster(name='Cluster 3', type=cluster_type, site=None),
  46. )
  47. Cluster.objects.bulk_create(clusters)
  48. # VM with site only should pass
  49. VirtualMachine(name='vm1', site=sites[0]).full_clean()
  50. # VM with non-site cluster only should pass
  51. VirtualMachine(name='vm1', cluster=clusters[2]).full_clean()
  52. # VM with mismatched site & cluster should fail
  53. with self.assertRaises(ValidationError):
  54. VirtualMachine(name='vm1', site=sites[0], cluster=clusters[1]).full_clean()
  55. # VM with cluster site but no direct site should have its site set automatically
  56. vm = VirtualMachine(name='vm1', site=None, cluster=clusters[0])
  57. vm.save()
  58. self.assertEqual(vm.site, sites[0])
  59. def test_vm_name_case_sensitivity(self):
  60. vm1 = VirtualMachine(
  61. cluster=Cluster.objects.first(),
  62. name='virtual machine 1'
  63. )
  64. vm1.save()
  65. vm2 = VirtualMachine(
  66. cluster=vm1.cluster,
  67. name='VIRTUAL MACHINE 1'
  68. )
  69. # Uniqueness validation for name should ignore case
  70. with self.assertRaises(ValidationError):
  71. vm2.full_clean()
  72. def test_disk_size(self):
  73. vm = VirtualMachine(
  74. cluster=Cluster.objects.first(),
  75. name='Virtual Machine 1'
  76. )
  77. vm.save()
  78. vm.refresh_from_db()
  79. self.assertEqual(vm.disk, None)
  80. # Create two VirtualDisks
  81. VirtualDisk.objects.create(virtual_machine=vm, name='Virtual Disk 1', size=10)
  82. VirtualDisk.objects.create(virtual_machine=vm, name='Virtual Disk 2', size=10)
  83. vm.refresh_from_db()
  84. self.assertEqual(vm.disk, 20)
  85. # Delete one VirtualDisk
  86. VirtualDisk.objects.first().delete()
  87. vm.refresh_from_db()
  88. self.assertEqual(vm.disk, 10)
  89. # Attempt to manually overwrite the aggregate disk size
  90. vm.disk = 30
  91. with self.assertRaises(ValidationError):
  92. vm.full_clean()