Newer
Older
# test_create_vm_form.py
from django.test import TestCase
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from virtualization.models import ClusterType, Cluster, VirtualMachine, VMInterface
from ipam.models import Service
from dcim.models import DeviceRole, Platform
from extras.models import Tag
from netbox_sys_plugin.models import ProviderTypeExtraConfig, VirtualMachineType
from netbox_sys_plugin.forms import CreateVmForm
# pylint: disable=W0201, R0902
class CreateVmFormTestCase(TestCase):
"""Test suite for the CreateVmForm."""
def setUp(self):
"""Set up the test data."""
self.cluster_type = ClusterType.objects.create(name="Test Cluster Type", slug="test-cluster-type")
self.cluster = Cluster.objects.create(name="Test Cluster", type=self.cluster_type)
self.role = DeviceRole.objects.create(name="Test Role", slug="test-role")
self.platform = Platform.objects.create(name="Test Platform", slug="test-platform")
self.tag = Tag.objects.create(name="Test Tag", slug="test-tag")
self.provider_extra_config = ProviderTypeExtraConfig.objects.create(
extra_config_name="Test Config",
extra_config_structure={
"config_structure": [{"field1": {"type": "string", "required": "True"}}]
},
extra_config_description="Test description"
)
self.vm_machine_type = VirtualMachineType.objects.create(
virtual_machine_type_name="BIG",
virtual_machine_type_desc="BIG",
assigned_object_type=ContentType.objects.get_for_model(ClusterType),
assigned_object_id=self.cluster_type.pk)
self.form_data_template = {
'cl_list_new-cluster_type': self.cluster_type.id,
'cl_list_new-cluster': self.cluster.id,
'vms_new-0-name': 'TEST_DATA2',
'vms_new-0-status': 'active',
'vms_new-0-role': str(self.role.id),
'vms_new-0-platform': str(self.platform.id),
'vms_new-0-description': 'TEST_DATA',
'vmassignedvmtype_new-virtual_machine_type': str(self.vm_machine_type.pk),
'vmis_new-0-name': 'TEST_DATA',
'ip_new-address': '100.0.0.1/24',
'ip_new-status': 'active',
'gateway_new-address': '100.2.3.4/24',
'gateway_new-status': 'active',
'domainnames_new-domain_names': '{"example_domain_name": "example_domain1","example_domain_name2": "example_domain2"}',
'vmassignedextraconfig_new-provider_type_extra_config': str(self.provider_extra_config.pk),
'vmassignedextraconfig_new-extra_config_values': '{"field1": "fieldvalue1"}',
'service_ntp-0-name': 'TEST_DATA1',
'service_ntp-0-protocol': 'tcp',
'service_ntp-0-ports': '440',
'service_dns-0-name': 'TEST_DATA2',
'service_dns-0-protocol': 'tcp',
'service_dns-0-ports': '44',
'service_syslog-0-name': 'TEST_DATA3',
'service_syslog-0-protocol': 'tcp',
'service_syslog-0-ports': '111',
'tag_new-tag':self.tag.id
def test_valid_form_submission_without_webhook(self):
"""Test a valid form submission."""
form_data = self.form_data_template
form = CreateVmForm(data=form_data)
vm = form.process_creation(form_data)
self.assertIsInstance(vm, VirtualMachine)
#Assert VM
self.assertEqual(VirtualMachine.objects.filter(id=vm.pk).count(), 1)
#Assert Interfaces
self.assertEqual(VMInterface.objects.filter(virtual_machine=vm).count(), 1)
#Assert Services
self.assertEqual(Service.objects.filter(virtual_machine=vm).count(), 3)
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
def test_invalid_form(self):
"""Test a valid form submission."""
#invalid json
self.invalid_ports_form_data = self.form_data_template.copy()
self.invalid_ports_form_data["domainnames_new-domain_names"] = "Invalid" # Invalid format
form_data = self.invalid_ports_form_data
form = CreateVmForm(data=form_data)
with self.assertRaises(ValueError) as context:
form.process_creation(form_data)
self.assertIn(
"Invalid JSON format: Please provide a valid JSON object.", str(context.exception))
#black ports
self.invalid_ports_form_data = self.form_data_template.copy()
self.invalid_ports_form_data["service_ntp-0-ports"] = "" # Invalid format
form_data = self.invalid_ports_form_data
form = CreateVmForm(data=form_data)
with self.assertRaises(ValidationError) as context:
form.process_creation(form_data)
self.assertIn(
"{'ports': ['This field cannot be blank.']}", str(context.exception))
#invalid/black ports
self.invalid_ports_form_data = self.form_data_template.copy()
self.invalid_ports_form_data["service_ntp-0-ports"] = "1,A," # Invalid format
form_data = self.invalid_ports_form_data
form = CreateVmForm(data=form_data)
with self.assertRaises(ValueError) as context:
form.process_creation(form_data)
self.assertIn(
"Invalid ports value:", str(context.exception))
#invalid tag
self.invalid_ports_form_data = self.form_data_template.copy()
self.invalid_ports_form_data["tag_new-tag"] = "10" # Invalid format
form_data = self.invalid_ports_form_data
form = CreateVmForm(data=form_data)
with self.assertRaises(ValueError) as context:
form.process_creation(form_data)
self.assertIn(
"Invalid tag", str(context.exception))
#invalid role/owner
self.invalid_ports_form_data = self.form_data_template.copy()
self.invalid_ports_form_data["vms_new-0-role"] = "2" # Invalid format
form_data = self.invalid_ports_form_data
form = CreateVmForm(data=form_data)
with self.assertRaises(ValueError) as context:
form.process_creation(form_data)
self.assertIn(
"Error during creation: Invalid Device Role ID", str(context.exception))
#invalid platform
self.invalid_ports_form_data = self.form_data_template.copy()
self.invalid_ports_form_data["vms_new-0-platform"] = "2" # Invalid format
form_data = self.invalid_ports_form_data
form = CreateVmForm(data=form_data)
with self.assertRaises(ValueError) as context:
form.process_creation(form_data)
self.assertIn(
"Invalid Platform ID", str(context.exception))
def tearDown(self):
"""Clean up after tests."""
VirtualMachine.objects.all().delete()
DeviceRole.objects.all().delete()
Platform.objects.all().delete()
ProviderTypeExtraConfig.objects.all().delete()
Service.objects.all().delete()
Cluster.objects.all().delete()
ClusterType.objects.all().delete()