1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-11 04:36:48 +00:00

refactor: the API's serializers and the new VM form no longer need models

Networks, Interfaces, Storages, Storage, Volume, MigrateInstance and
CreateInstance were unmanaged models with no table, there only so that
ModelSerializers and the new VM ModelForm could take their fields. They
made content types and migrations, and their DO_NOTHING foreign keys
added reverse accessors that meant nothing (Compute.host,
Compute.target_host, Instance.source_host).

The serializers are plain Serializers and NewVMForm a Form, field for
field as the models gave them (types, lengths, required, defaults, the
minimum of 1 for vCPUs, memory and disk size; the form's labels are
still derived from the field names). Compared field by field before and
after, the API schema changes only where the models were wrong:
- no int64 bounds on the listing fields;
- the interface fields lose the titles that named the wrong column
  (type was "Status", state "Device", mac "Forward");
- a pool's volumes is a list of objects (it was described as an
  integer) and a volume's allocation an integer (it was untyped).
One migration per app deletes the models; none touches a table.
This commit is contained in:
catborise 2026-11-06 11:06:40 +03:00
parent f3bdeddb0b
commit f1f52aac42
17 changed files with 434 additions and 736 deletions

View file

@ -1,4 +1,6 @@
from instances.models import CreateInstance, Flavor, Instance, MigrateInstance
from computes.models import Compute
from django.conf import settings
from instances.models import Flavor, Instance
from instances.utils import nic_macs
from rest_framework import serializers
@ -76,14 +78,28 @@ class DestroySerializer(DestroyOptionsSerializer):
submission_key = serializers.CharField(write_only=True)
class CreateInstanceSerializer(serializers.ModelSerializer):
class CreateInstanceSerializer(serializers.Serializer):
"""The API's VM create: the new VM form's fields, as a job."""
name = serializers.CharField(max_length=64)
# BIOS, UEFI or UEFI Secure Boot, as the host offers; left out: the machine's default
firmware = serializers.CharField(required=False)
video = serializers.CharField(initial="vga")
tpm = serializers.BooleanField(required=False)
vcpu = serializers.IntegerField(min_value=1)
vcpu_mode = serializers.CharField(max_length=64)
memory = serializers.IntegerField(min_value=1)
networks = serializers.CharField(max_length=256)
mac = serializers.CharField(allow_blank=True, max_length=255, required=False)
nwfilter = serializers.CharField(allow_blank=True, max_length=256, required=False)
storage = serializers.CharField(initial="default")
hdd_size = serializers.IntegerField(min_value=1, required=False)
cache_mode = serializers.CharField(initial="none")
meta_prealloc = serializers.BooleanField(required=False)
virtio = serializers.BooleanField(initial=True)
qemu_ga = serializers.BooleanField(initial=True)
cloud_init = serializers.BooleanField(required=False)
video = serializers.CharField(initial="vga")
listener_addr = serializers.ChoiceField(choices=settings.QEMU_CONSOLE_LISTENER_ADDRESSES)
submission_key = serializers.CharField(write_only=True)
def validate(self, attrs):
@ -93,32 +109,10 @@ class CreateInstanceSerializer(serializers.ModelSerializer):
raise serializers.ValidationError({"mac": str(err)})
return attrs
class Meta:
model = CreateInstance
fields = [
"name",
"firmware",
"tpm",
"vcpu",
"vcpu_mode",
"memory",
"networks",
"mac",
"nwfilter",
"storage",
"hdd_size",
"cache_mode",
"meta_prealloc",
"virtio",
"qemu_ga",
"cloud_init",
"video",
"listener_addr",
"submission_key",
]
class MigrateSerializer(serializers.ModelSerializer):
class MigrateSerializer(serializers.Serializer):
instance = serializers.PrimaryKeyRelatedField(queryset=Instance.objects.all())
target_compute = serializers.PrimaryKeyRelatedField(queryset=Compute.objects.all())
live = serializers.BooleanField(default=True)
offline = serializers.BooleanField(default=False)
# left out, also from a form-encoded request: auto converge on
@ -129,18 +123,3 @@ class MigrateSerializer(serializers.ModelSerializer):
disk_pools = serializers.DictField(child=serializers.CharField(allow_blank=True), default=dict)
delete_source = serializers.BooleanField(default=False)
submission_key = serializers.CharField(write_only=True)
class Meta:
model = MigrateInstance
fields = [
"instance",
"target_compute",
"live",
"offline",
"autoconverge",
"compress",
"unsafe",
"disk_pools",
"delete_source",
"submission_key",
]