mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
* 8356 add virtual disk model * 8356 add supplemental forms * 8356 add menu * 8356 cleanup views * 8356 virtual machine tab * 8356 migrations * 8356 vm disk tables * 8356 cleanup * 8356 graphql * 8356 graphql * 8356 add components button * 8356 bulk add on virtualmachine * 8356 bulk add fixes * 8356 api tests * 8356 news tests add rename * 8356 VirtualDiskCreateForm * 8356 fix test * 8356 add todo to remove disk from vm * 8356 review changes * 8356 fix test * 8356 deprecate disk field * 8356 review changes * 8356 fix test * 8356 fix test * Simplify view actions * 8356 review changes * 8356 split trans tag * 8356 add total virtual disk size to api * 8356 add virtual disk list to virtual machine detail view * 8356 move virtual disk size to property * 8356 revert property * Tweak display of deprecated disk field * 8356 render single disk field * 8356 update serializer * 8356 model property * 8356 fix test * 8356 review changes * Revert disk space annotation * Use existing disk field to store aggregate virtual disk size * Introduce abstract ComponentModel for VM components * Add search index for VirtualDisk * Misc cleanup --------- Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
118 lines
3.7 KiB
Python
118 lines
3.7 KiB
Python
from django.core.exceptions import ValidationError
|
|
from django.test import TestCase
|
|
|
|
from dcim.models import Site
|
|
from virtualization.models import *
|
|
from tenancy.models import Tenant
|
|
|
|
|
|
class VirtualMachineTestCase(TestCase):
|
|
|
|
@classmethod
|
|
def setUpTestData(cls):
|
|
cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
|
|
Cluster.objects.create(name='Cluster 1', type=cluster_type)
|
|
|
|
def test_vm_duplicate_name_per_cluster(self):
|
|
vm1 = VirtualMachine(
|
|
cluster=Cluster.objects.first(),
|
|
name='Test VM 1'
|
|
)
|
|
vm1.save()
|
|
|
|
vm2 = VirtualMachine(
|
|
cluster=vm1.cluster,
|
|
name=vm1.name
|
|
)
|
|
|
|
# Two VMs assigned to the same Cluster and no Tenant should fail validation
|
|
with self.assertRaises(ValidationError):
|
|
vm2.full_clean()
|
|
|
|
tenant = Tenant.objects.create(name='Test Tenant 1', slug='test-tenant-1')
|
|
vm1.tenant = tenant
|
|
vm1.save()
|
|
vm2.tenant = tenant
|
|
|
|
# Two VMs assigned to the same Cluster and the same Tenant should fail validation
|
|
with self.assertRaises(ValidationError):
|
|
vm2.full_clean()
|
|
|
|
vm2.tenant = None
|
|
|
|
# Two VMs assigned to the same Cluster and different Tenants should pass validation
|
|
vm2.full_clean()
|
|
vm2.save()
|
|
|
|
def test_vm_mismatched_site_cluster(self):
|
|
cluster_type = ClusterType.objects.first()
|
|
|
|
sites = (
|
|
Site(name='Site 1', slug='site-1'),
|
|
Site(name='Site 2', slug='site-2'),
|
|
)
|
|
Site.objects.bulk_create(sites)
|
|
|
|
clusters = (
|
|
Cluster(name='Cluster 1', type=cluster_type, site=sites[0]),
|
|
Cluster(name='Cluster 2', type=cluster_type, site=sites[1]),
|
|
Cluster(name='Cluster 3', type=cluster_type, site=None),
|
|
)
|
|
Cluster.objects.bulk_create(clusters)
|
|
|
|
# VM with site only should pass
|
|
VirtualMachine(name='vm1', site=sites[0]).full_clean()
|
|
|
|
# VM with non-site cluster only should pass
|
|
VirtualMachine(name='vm1', cluster=clusters[2]).full_clean()
|
|
|
|
# VM with mismatched site & cluster should fail
|
|
with self.assertRaises(ValidationError):
|
|
VirtualMachine(name='vm1', site=sites[0], cluster=clusters[1]).full_clean()
|
|
|
|
# VM with cluster site but no direct site should have its site set automatically
|
|
vm = VirtualMachine(name='vm1', site=None, cluster=clusters[0])
|
|
vm.save()
|
|
self.assertEqual(vm.site, sites[0])
|
|
|
|
def test_vm_name_case_sensitivity(self):
|
|
vm1 = VirtualMachine(
|
|
cluster=Cluster.objects.first(),
|
|
name='virtual machine 1'
|
|
)
|
|
vm1.save()
|
|
|
|
vm2 = VirtualMachine(
|
|
cluster=vm1.cluster,
|
|
name='VIRTUAL MACHINE 1'
|
|
)
|
|
|
|
# Uniqueness validation for name should ignore case
|
|
with self.assertRaises(ValidationError):
|
|
vm2.full_clean()
|
|
|
|
def test_disk_size(self):
|
|
vm = VirtualMachine(
|
|
cluster=Cluster.objects.first(),
|
|
name='Virtual Machine 1'
|
|
)
|
|
vm.save()
|
|
vm.refresh_from_db()
|
|
self.assertEqual(vm.disk, None)
|
|
|
|
# Create two VirtualDisks
|
|
VirtualDisk.objects.create(virtual_machine=vm, name='Virtual Disk 1', size=10)
|
|
VirtualDisk.objects.create(virtual_machine=vm, name='Virtual Disk 2', size=10)
|
|
vm.refresh_from_db()
|
|
self.assertEqual(vm.disk, 20)
|
|
|
|
# Delete one VirtualDisk
|
|
VirtualDisk.objects.first().delete()
|
|
vm.refresh_from_db()
|
|
self.assertEqual(vm.disk, 10)
|
|
|
|
# Attempt to manually overwrite the aggregate disk size
|
|
vm.disk = 30
|
|
with self.assertRaises(ValidationError):
|
|
vm.full_clean()
|