Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects

:safety_vest: :white_check_mark: Add API tests and add API missing validations

Merged Frederico SEQUEIRA requested to merge add_assigned_extra_config_testing into main
All threads resolved!

Files

+ 52
− 2
@@ -13,6 +13,7 @@ from django.contrib.contenttypes.models import ContentType
from .nested_serializers import *
from virtualization.choices import *
from netbox.api.serializers import NetBoxModelSerializer
from ..utils import validate_extra_config_values
#Netbox Data Serializer
@@ -157,13 +158,62 @@ class VmAssignedExtraConfigSerializer(NetBoxModelSerializer):
id = serializers.IntegerField(read_only=True)
virtual_machine = NestedVirtualMachineSerializer(source='assigned_object', read_only=True)
assigned_object_id = serializers.IntegerField(write_only=True)
assigned_object_type = serializers.CharField(write_only=True)
display = serializers.CharField(source="__str__")
assigned_object_type = serializers.PrimaryKeyRelatedField(
queryset=ContentType.objects.all(),
write_only=True,
)
display = serializers.CharField(source="__str__",read_only=True)
class Meta:
model = VmAssignedExtraConfig
fields = '__all__'
def create(self, validated_data):
assigned_object_type = validated_data.pop("assigned_object_type")
validated_data["assigned_object_type"] = assigned_object_type
return super().create(validated_data)
def validate_extra_config_values(self, extra_config_values):
"""
Validates the `extra_config_values` against the associated provider config structure.
"""
provider_config = self.initial_data.get("provider_type_extra_config")
if provider_config:
try:
provider_instance = ProviderTypeExtraConfig.objects.get(id=provider_config)
structure_dict = provider_instance.extra_config_structure
# Validate using the first key in the structure dict
first_structure_name = next(iter(structure_dict), None)
if first_structure_name:
structure = structure_dict[first_structure_name][0]
if isinstance(structure, dict): # Ensure structure is in the expected format
is_valid, errors = validate_extra_config_values(structure, extra_config_values)
if not is_valid:
raise serializers.ValidationError(errors)
except ProviderTypeExtraConfig.DoesNotExist:
raise serializers.ValidationError("Invalid ProviderTypeExtraConfig selected.")
return extra_config_values
def validate(self, data):
"""
Perform complete object-level validation.
"""
if 'extra_config_values' in data:
# Validate extra_config_values
data['extra_config_values'] = self.validate_extra_config_values(data.get('extra_config_values', {}))
# Ensure a valid virtual machine assignment
if not self.partial and not data.get("assigned_object_id"):
raise serializers.ValidationError(
{"__all__": "Can't assign more than one Extra Config to the same Virtual Machine"}
)
return data
class VirtualMachineSerializer(NetBoxModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='plugins-api:netbox_sys_plugin-api:virtualmachine-detail')
status = ChoiceField(choices=VirtualMachineStatusChoices, required=False)
Loading