diff --git a/netbox_sys_plugin/api/serializers.py b/netbox_sys_plugin/api/serializers.py index 9f059aff5e5fec54e89589655507eca399f02b1c..7dd60b3d07ba0f359b1c9fdfb98300f35bd09bed 100644 --- a/netbox_sys_plugin/api/serializers.py +++ b/netbox_sys_plugin/api/serializers.py @@ -14,6 +14,7 @@ from virtualization.choices import * from netbox.api.serializers import NetBoxModelSerializer from ..utils import validate_extra_config_values from ..validators import validate_extra_config_structure +import json #Netbox Data Serializer @@ -396,4 +397,132 @@ class VirtualMachineSerializer(NetBoxModelSerializer): vm_assigned_extra_config = VmAssignedExtraConfig.objects.filter(assigned_object_type=ContentType.objects.get_for_model(VirtualMachine), assigned_object_id=obj.id) return NestedVmAssignedExtraConfigSerializer(vm_assigned_extra_config, many=True).data - \ No newline at end of file + +class CreateVirtualMachineSerializer(serializers.Serializer): + """Serializer to handle Create VM requests.""" + provider_type = serializers.IntegerField(required=True) + provider = serializers.IntegerField(required=True) + name = serializers.CharField(required=True, max_length=50) + status = serializers.CharField(required=True, max_length=50) + owner = serializers.IntegerField(required=True) + platform = serializers.IntegerField(required=True) + description = serializers.CharField(required=True) + virtual_machine_type = serializers.IntegerField(required=True) + interface_name = serializers.CharField(required=True, max_length=50) + ip_addresses = serializers.CharField(required=True, max_length=50) + ip_addresses_status = serializers.CharField(required=True, max_length=50) + gateway = serializers.CharField(required=True, max_length=50) + gateway_status = serializers.CharField(required=True, max_length=50) + domain_names = serializers.JSONField(required=False) + extra_config_structure = serializers.IntegerField(required=True) + extra_config_values = serializers.JSONField(required=False) + ntp_service_name = serializers.CharField(required=True, max_length=50) + ntp_service_protocol = serializers.CharField(required=True, max_length=50) + ntp_service_ports = serializers.CharField(required=True, max_length=50) + dns_service_name = serializers.CharField(required=True, max_length=50) + dns_service_protocol = serializers.CharField(required=True, max_length=50) + dns_service_ports = serializers.CharField(required=True, max_length=50) + syslog_service_name = serializers.CharField(required=True, max_length=50) + syslog_service_protocol = serializers.CharField(required=True, max_length=50) + syslog_service_ports = serializers.CharField(required=True, max_length=50) + tag = serializers.IntegerField(required=False) + + class Meta: + fields = ['cluster_type','cluster','name','status','role','platform' + ,'description','virtual_machine_type','interface_name','ip_addresses','ip_addresses_status' + ,'gateway','gateway_status','domain_names','extra_config_structure','extra_config_values' + ,'ntp_service_name','ntp_service_protocol','ntp_service_ports' + ,'dns_service_name','dns_service_protocol','dns_service_ports' + ,'syslog_service_name','syslog_service_protocol','syslog_service_ports' + ,'tag' + ] + + def validate(self, data): + request = self.context.get("request") + if not request or not request.user.has_perm("virtualization.add_virtualmachine"): + raise serializers.ValidationError("You dont have permission to create a VM") + + cluster_type = data.pop('provider_type', None) + data['cl_list_new-cluster_type']= str(cluster_type) + + cluster = data.pop('provider', None) + data['cl_list_new-cluster']= str(cluster) + + name = data.pop('name', None) + data['vms_new-0-name']=name + + status = data.pop('status', None) + data['vms_new-0-status']=status + + role = data.pop('owner', None) + data['vms_new-0-role']=str(role) + + platform = data.pop('platform', None) + data['vms_new-0-platform']=str(platform) + + description = data.pop('description', None) + data['vms_new-0-description']=description + + virtual_machine_type = data.pop('virtual_machine_type', None) + data['vmassignedvmtype_new-virtual_machine_type']=str(virtual_machine_type) + + interface_name = data.pop('interface_name', None) + data['vmis_new-0-name']=interface_name + + ip_addresses = data.pop('ip_addresses', None) + data['ip_new-address']=ip_addresses + + ip_addresses_status = data.pop('ip_addresses_status', None) + data['ip_new-status']=ip_addresses_status + + gateway = data.pop('gateway', None) + data['gateway_new-address']=gateway + + gateway_status = data.pop('gateway_status', None) + data['gateway_new-status']=gateway_status + + domain_names = data.pop('domain_names', None) + data['domainnames_new-domain_names']=json.dumps(domain_names) + + extra_config_structure = data.pop('extra_config_structure', None) + data['vmassignedextraconfig_new-provider_type_extra_config']=str(extra_config_structure) + + extra_config_values = data.pop('extra_config_values', None) + data['vmassignedextraconfig_new-extra_config_values']=json.dumps(extra_config_values) + + ntp_service_name = data.pop('ntp_service_name', None) + data['service_ntp-0-name']=ntp_service_name + + ntp_service_protocol = data.pop('ntp_service_protocol', None) + data['service_ntp-0-protocol']=ntp_service_protocol + + ntp_service_ports = data.pop('ntp_service_ports', None) + data['service_ntp-0-ports']=ntp_service_ports + + dns_service_name = data.pop('dns_service_name', None) + data['service_dns-0-name']=dns_service_name + + dns_service_protocol = data.pop('dns_service_protocol', None) + data['service_dns-0-protocol']=dns_service_protocol + + dns_service_ports = data.pop('dns_service_ports', None) + data['service_dns-0-ports']= dns_service_ports + + syslog_service_name = data.pop('syslog_service_name', None) + data['service_syslog-0-name']=syslog_service_name + + syslog_service_protocol = data.pop('syslog_service_protocol', None) + data['service_syslog-0-protocol']=syslog_service_protocol + + syslog_service_ports = data.pop('syslog_service_ports', None) + data['service_syslog-0-ports']=syslog_service_ports + + tag = data.pop('tag', None) + data['tag_new-tag']=str(tag) + + data = super().validate(data) + return data + + def create(self, data): + """Process VM creation using CreateVmForm.""" + return data diff --git a/netbox_sys_plugin/api/urls.py b/netbox_sys_plugin/api/urls.py index b6d7df961be9e650a4e68f4d9217b01bbeee36c5..67be6be3662b9595c9aa16e74345adce309c42a2 100644 --- a/netbox_sys_plugin/api/urls.py +++ b/netbox_sys_plugin/api/urls.py @@ -12,6 +12,7 @@ router.register(r'ProviderTypeExtraConfig', ProviderTypeExtraConfigViewSet) router.register(r'VirtualMachine', VirtualMachineViewSet, basename='virtualmachine') router.register(r'ExtraConfig', ProviderTypeExtraConfigViewSet) router.register(r'AssignedExtraConfig', VmAssignedExtraConfigViewSet) +router.register(r'CreateVirtualMachine', CreateVirtualMachineViewSet,basename='CreteVirtualMachine') app_name = 'netbox_sys_plugin' diff --git a/netbox_sys_plugin/api/views.py b/netbox_sys_plugin/api/views.py index c407a5412339f914289540ea91610c1888bd2e4c..ea8e963e96fcc8023164c9357208c66a3bcc6d3f 100644 --- a/netbox_sys_plugin/api/views.py +++ b/netbox_sys_plugin/api/views.py @@ -1,12 +1,15 @@ from rest_framework import viewsets, status -from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions from rest_framework.response import Response +from django.core.exceptions import ValidationError from django.db.models import Prefetch from netbox.api.viewsets import NetBoxModelViewSet from virtualization import filtersets +from django.db import transaction from .. filtersets import VmTypeFilterSet, ProviderTypeExtraConfigFilterSet from .. models import VirtualMachineMaintenance, ProviderCredentials, VmAssignedVirtualMachineType, VirtualMachineType,DomainNames, ProviderTypeExtraConfig, WebhookPayload from . serializers import * +from ..forms import CreateVmForm class VirtualMachineMaintenanceViewSet(viewsets.ModelViewSet): queryset = VirtualMachineMaintenance.objects.all() @@ -66,3 +69,24 @@ class VmAssignedExtraConfigViewSet(viewsets.ModelViewSet): serializer_class = VmAssignedExtraConfigSerializer http_method_names = ["get", "post", "patch", "delete", "options"] +class CreateVirtualMachineViewSet(NetBoxModelViewSet): + """API ViewSet to handle VM creation.""" + queryset = Cluster.objects.all() + serializer_class = CreateVirtualMachineSerializer + permission_classes = [IsAuthenticated, DjangoModelPermissions] + http_method_names = ["post"] + + def create(self, request): + serializer = self.get_serializer(data=request.data) + if serializer.is_valid(): + try: + with transaction.atomic(): + vm = serializer.save() + form = CreateVmForm(data=vm) + vm = form.process_creation(vm) + return Response({ + "message": "VM created successfully!", + }, status=status.HTTP_201_CREATED) + except (ValueError, ValidationError) as e: + return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/netbox_sys_plugin/tests/createvm/test_createvm_api.py b/netbox_sys_plugin/tests/createvm/test_createvm_api.py new file mode 100644 index 0000000000000000000000000000000000000000..eaa1d555866d500002e3c4d5c71c187322f30608 --- /dev/null +++ b/netbox_sys_plugin/tests/createvm/test_createvm_api.py @@ -0,0 +1,391 @@ +"""SYS Plugin CreateVirtualMachine API Test Case Class""" + +from users.models import ObjectPermission +from django.contrib.contenttypes.models import ContentType +from rest_framework import status +from virtualization.models import Cluster, ClusterType, VMInterface, VirtualMachine +from dcim.models import DeviceRole, Platform +from ipam.models import IPAddress, Service +from extras.models import Tag +from ... models import DomainNames, VmAssignedVirtualMachineType, VirtualMachineType, VmAssignedExtraConfig, ProviderTypeExtraConfig, WebhookPayload +from ..base import BaseAPITestCase + +class CreateVmAPITestCase(BaseAPITestCase): + """Test suite for Create Virtual Machine API""" + brief_fields = [ +"cluster_type","cluster","name","status","role","platform","description","virtual_machine_type","interface_name","ip_addresses" + "ip_addresses_status","gateway","gateway_status","domain_names","extra_config_structure","extra_config_values","ntp_service_name", + "ntp_service_protocol","ntp_service_ports","dns_service_name","dns_service_protocol","dns_service_ports","syslog_service_name", + "syslog_service_protocol","syslog_service_ports","tag" + ] + + + @classmethod + def setUpTestData(cls): + + """Set up test data for Create Virtual Machine API""" + #Create Tag + cls.tag = Tag.objects.create(name="test_tag",slug="testtag") + #Create Device Role + cls.devicerole = DeviceRole.objects.create(name="Test Device", slug="TestRole") + #Create Platform + cls.platform = Platform.objects.create(name="Test platform", slug="TestPlatform") + # Create a ClusterType + cls.cluster_type = ClusterType.objects.create(name="Test ClusterType1", slug="ClusterType1") + # Create Cluster + cls.cluster = Cluster.objects.create(name="Test Cluster", type=cls.cluster_type) + # Create VM Type + cls.vmtype = VirtualMachineType.objects.create( + virtual_machine_type_name='vm_type_name1', + virtual_machine_type_desc='vm_type_desc_1', + assigned_object=cls.cluster_type + ) + cls.extra_config_structure = ProviderTypeExtraConfig.objects.create( + extra_config_name="TEST", + extra_config_structure={'test_extra': [{'id': {'required': 'true','type': 'String'}}]}, + extra_config_description="Test Extra", + assigned_object=cls.cluster_type + ) + + # Data for valid creation + cls.valid_create_data = [{ + "provider_type": cls.cluster_type.id, + "provider": cls.cluster.id, + "name": "vm_test", + "status": "active", + "owner": cls.devicerole.id, + "platform": cls.platform.id, + "description": "test", + "virtual_machine_type": cls.vmtype.id, + "interface_name": "interface_test", + "ip_addresses": "192.168.1.10/24", + "ip_addresses_status": "active", + "gateway": "193.168.1.10/24", + "gateway_status": "active", + "domain_names": {"example_domain_name": "vm.example.com"}, + "extra_config_structure": cls.extra_config_structure.id, + "extra_config_values": {"id": "id"}, + "ntp_service_name": "ntp_test", + "ntp_service_protocol": "tcp", + "ntp_service_ports": "44", + "dns_service_name": "dns_test", + "dns_service_protocol": "tcp", + "dns_service_ports": "44", + "syslog_service_name": "syslog_test", + "syslog_service_protocol": "tcp", + "syslog_service_ports": "44", + "tag":str(cls.tag.id) + }, + { + "provider_type": cls.cluster_type.id, + "provider": cls.cluster.id, + "name": "vm_test2", + "status": "active", + "owner": cls.devicerole.id, + "platform": cls.platform.id, + "description": "test", + "virtual_machine_type": cls.vmtype.id, + "interface_name": "interface_test", + "ip_addresses": "192.168.1.10/24", + "ip_addresses_status": "active", + "gateway": "193.168.1.10/24", + "gateway_status": "active", + "domain_names": {"example_domain_name": "vm.example.com"}, + "extra_config_structure": cls.extra_config_structure.id, + "extra_config_values": {"id": "id"}, + "ntp_service_name": "ntp_test", + "ntp_service_protocol": "tcp", + "ntp_service_ports": "44", + "dns_service_name": "dns_test", + "dns_service_protocol": "tcp", + "dns_service_ports": "44", + "syslog_service_name": "syslog_test", + "syslog_service_protocol": "tcp", + "syslog_service_ports": "44", + "tag":str(cls.tag.id) + }] + + # Data for invalid creation + cls.invalid_create_data = [ + #Check unique + { + "provider_type": cls.cluster_type.id, + "provider": cls.cluster.id, + "name": "vm_test", + "status": "active", + "owner": cls.devicerole.id, + "platform": cls.platform.id, + "description": "test_unique", + "virtual_machine_type": cls.vmtype.id, + "interface_name": "interface_test", + "ip_addresses": "192.168.1.10/24", + "ip_addresses_status": "active", + "gateway": "193.168.1.10/24", + "gateway_status": "active", + "domain_names": {"example_domain_name": "vm.example.com"}, + "extra_config_structure": cls.extra_config_structure.id, + "extra_config_values": {"id": "id"}, + "ntp_service_name": "ntp_test", + "ntp_service_protocol": "tcp", + "ntp_service_ports": "44", + "dns_service_name": "dns_test", + "dns_service_protocol": "tcp", + "dns_service_ports": "44", + "syslog_service_name": "syslog_test", + "syslog_service_protocol": "tcp", + "syslog_service_ports": "44", + "tag":str(cls.tag.id) + }, + #Invalid port + { + "provider_type": cls.cluster_type.id, + "provider": cls.cluster.id, + "name": "vm_test", + "status": "active", + "owner": cls.devicerole.id, + "platform": cls.platform.id, + "description": "test_invalid", + "virtual_machine_type": cls.vmtype.id, + "interface_name": "interface_test", + "ip_addresses": "192.168.1.10/24", + "ip_addresses_status": "active", + "gateway": "193.168.1.10/24", + "gateway_status": "active", + "domain_names": {"example_domain_name": "vm.example.com"}, + "extra_config_structure": cls.extra_config_structure.id, + "extra_config_values": {"id": "id"}, + "ntp_service_name": "ntp_test", + "ntp_service_protocol": "tcp", + "ntp_service_ports": "44", + "dns_service_name": "dns_test", + "dns_service_protocol": "tcp", + "dns_service_ports": "AA", + "syslog_service_name": "syslog_test", + "syslog_service_protocol": "tcp", + "syslog_service_ports": "44", + "tag":str(cls.tag.id) + }, + #Missing field + { + "provider_type": cls.cluster_type.id, + "provider": cls.cluster.id, + "name": "vm_test", + "status": "active", + "owner": cls.devicerole.id, + "platform": cls.platform.id, + "virtual_machine_type": cls.vmtype.id, + "interface_name": "interface_test", + "ip_addresses": "192.168.1.10/24", + "ip_addresses_status": "active", + "gateway": "193.168.1.10/24", + "gateway_status": "active", + "domain_names": {"example_domain_name": "vm.example.com"}, + "extra_config_structure": cls.extra_config_structure.id, + "extra_config_values": {"id": "id"}, + "ntp_service_name": "ntp_test", + "ntp_service_protocol": "tcp", + "ntp_service_ports": "44", + "dns_service_name": "dns_test", + "dns_service_protocol": "tcp", + "dns_service_ports": "AA", + "syslog_service_name": "syslog_test", + "syslog_service_protocol": "tcp", + "syslog_service_ports": "44", + "tag":str(cls.tag.id) + } + ] + + def test_valid_createVM(self): + """Test creating a valid CreateVM""" + + obj_perm = ObjectPermission( + name="Create CreateVM Permission", + actions=["add", "view"], + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Platform)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Service)) + obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress)) + obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Tag)) + + api_data = self.valid_create_data[0] + response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + + def test_unique_key_createVM(self): + """Test unique vm key of CreateVM""" + + obj_perm = ObjectPermission( + name="Create test unique CreateVM Permission", + actions=["add", "view"], + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Platform)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Service)) + obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress)) + obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Tag)) + + #1st VM + api_data = self.invalid_create_data[0] + response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + #2nd VM + api_data = self.invalid_create_data[0] + response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertIn('Virtual machine name must be unique per cluster.',str(response.data)) + + def test_invalid_value_createVM(self): + """Test creating an invalid CreateVM""" + + obj_perm = ObjectPermission( + name="Create invalid CreateVM Permission", + actions=["add", "view"], + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Platform)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Service)) + obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress)) + obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Tag)) + + api_data = self.invalid_create_data[1] + response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertIn('Error during creation: Invalid ports value: AA',str(response.data)) + + def test_invalid_missing_value_createVM(self): + """Test creating an invalid CreateVM""" + + obj_perm = ObjectPermission( + name="Create invalid CreateVM Permission", + actions=["add", "view"], + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Platform)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Service)) + obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress)) + obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Tag)) + + api_data = self.invalid_create_data[2] + response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertIn('This field is required.',str(response.data)) + + + def test_get_all_created_virtual_machines(self): + """Test fetching all VMs""" + obj_perm = ObjectPermission( + name="View all VMs Permission", + actions=["view","add"], + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Platform)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Service)) + obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress)) + obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Tag)) + + #1st VM + api_data = self.valid_create_data[0] + response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + #2nd VM + api_data = self.valid_create_data[1] + response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + + response = self.client.get("/api/plugins/sys/VirtualMachine/", **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertGreaterEqual(len(response.data), 2) + + def test_get_single_created_virtual_machine(self): + """Test fetching a single VM""" + obj_perm = ObjectPermission( + name="View single VM Permission", + actions=["view","add"], + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Platform)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Service)) + obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress)) + obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType)) + obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig)) + obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload)) + obj_perm.object_types.add(ContentType.objects.get_for_model(Tag)) + + #1st VM + api_data = self.valid_create_data[0] + response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header) + self.assertHttpStatus(response, status.HTTP_201_CREATED) + + VM = VirtualMachine.objects.first() + response = self.client.get((f'/api/plugins/sys/VirtualMachine/{VM.id}/'), **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) diff --git a/netbox_sys_plugin/tests/createvm/test_createvm_view.py b/netbox_sys_plugin/tests/createvm/test_createvm_view.py index 5c094801582b777ae52bd94e522a5a8710950a71..79df3d9738a272626996ea8917c880e7c2e54300 100644 --- a/netbox_sys_plugin/tests/createvm/test_createvm_view.py +++ b/netbox_sys_plugin/tests/createvm/test_createvm_view.py @@ -136,7 +136,7 @@ class CreateVmFormTestCase(TestCase): #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 + self.invalid_ports_form_data["vms_new-0-role"] = "999" # Invalid Number form_data = self.invalid_ports_form_data form = CreateVmForm(data=form_data) with self.assertRaises(ValueError) as context: @@ -156,7 +156,7 @@ class CreateVmFormTestCase(TestCase): #invalid platform self.invalid_ports_form_data = self.form_data_template.copy() - self.invalid_ports_form_data["vms_new-0-platform"] = "2" # Invalid id + self.invalid_ports_form_data["vms_new-0-platform"] = "999" # Invalid id form_data = self.invalid_ports_form_data form = CreateVmForm(data=form_data) with self.assertRaises(ValueError) as context: @@ -176,7 +176,7 @@ class CreateVmFormTestCase(TestCase): #invalid Extra Config self.invalid_ports_form_data = self.form_data_template.copy() - self.invalid_ports_form_data["vmassignedextraconfig_new-provider_type_extra_config"] = "2" # Invalid id + self.invalid_ports_form_data["vmassignedextraconfig_new-provider_type_extra_config"] = "999" # Invalid id form_data = self.invalid_ports_form_data form = CreateVmForm(data=form_data) with self.assertRaises(ValueError) as context: diff --git a/netbox_sys_plugin/tests/test_init.py b/netbox_sys_plugin/tests/test_init.py index 8a0c2e0d70e9556cf6f7718867a04b26644ed88d..b0b0bb75ddce613ac44bc7d3a9fee1ef446f175e 100644 --- a/netbox_sys_plugin/tests/test_init.py +++ b/netbox_sys_plugin/tests/test_init.py @@ -24,5 +24,5 @@ class InitTestCase(APITestCase): self.assertTrue("VirtualMachine" in content) self.assertTrue("ExtraConfig" in content) self.assertTrue("AssignedExtraConfig" in content) - self.assertTrue("VirtualMachine" in content) + self.assertTrue("CreateVirtualMachine" in content) self.assertEqual(response.status_code, 200)