From 038ab7de5c582a3ed9da3412a791a833d868fa9d Mon Sep 17 00:00:00 2001 From: Mickael B Date: Tue, 8 Oct 2024 20:56:56 +0200 Subject: [PATCH] correction --- api/vm.py | 151 ++++++++++++++++++++---------------------- libvirt/dom/config.py | 18 ++++- libvirt/enum.py | 15 ----- 3 files changed, 89 insertions(+), 95 deletions(-) diff --git a/api/vm.py b/api/vm.py index d884b50..5f5c746 100644 --- a/api/vm.py +++ b/api/vm.py @@ -5,13 +5,15 @@ from pydantic_xml import element, attr, wrapped from pydantic import UUID4, Field, field_serializer, ConfigDict, ValidationInfo, field_validator from pydantic import BaseModel as _BaseModel from pydantic_core import core_schema as cs -import libvirt + from pydantic_core import core_schema from pydantic.json_schema import GetJsonSchemaHandler, JsonSchemaValue -from deevirt_common.lib.virt import vm as domain -from deevirt_common.schemas import datacenter_schema, storage_schema, network_schema, libvirt +#from deevirt_common.lib.virt import vm as domain +#from deevirt_common.schemas import datacenter_schema, storage_schema, network_schema, configDom + +from deevirt_schema.libvirt.dom import config as configDom class BaseModel(_BaseModel): class Config: @@ -25,28 +27,28 @@ class BaseModel(_BaseModel): """ Common """ -class VMResource(BaseModel): +class Resource(BaseModel): """Experimental""" name:Optional[str] = Field(default=None, description="Nom du pool") -class VMVCPU(BaseModel): +class VCPU(BaseModel): value:int = Field(description="Nombre de VCPU") dedicated:Optional[bool] = Field(default=False, description="VCPU dédié") hotplug:Optional[bool] = Field(default=False, description="Ajout de VCPU à chaud.") -class VMMemory(BaseModel): - unit:Optional[libvirt.UnitEnum] = Field(default=libvirt.UnitEnum.GiB, description="Unité de mesure.") +class Memory(BaseModel): + unit:Optional[configDom.UnitEnum] = Field(default=configDom.UnitEnum.GiB, description="Unité de mesure.") value:int = Field(description="Taille de la mémoire.") hotplug:Optional[bool] = Field(default=False,description="Ajout à chaud de la mémoire.") -class VMOSBootMenu(BaseModel): +class OSBootMenu(BaseModel): enable:Optional[bool] = Field(default=False,description="Activation du menu de démarrage.") delay:Optional[int] = Field(default=0, description="Delai maximal pour entrer dans le menu démarrage en millisecondes") -class VMOSBootOrder(BaseModel): - dev:Optional[libvirt.OSBoot.bootEnum] = Field(default=None, description="Périphérique.") +class OSBootOrder(BaseModel): + dev:Optional[configDom.OSBoot.bootEnum] = Field(default=None, description="Périphérique.") -class VMOSInfo(BaseModel): +class OSInfo(BaseModel): model_config = ConfigDict(from_attributes=True) name:str = Field(alias="os.name", serialization_alias="name") @@ -54,24 +56,17 @@ class VMOSInfo(BaseModel): machine:str = Field(alias="os.machine", serialization_alias="architecture") kernel:str = Field(alias="os.kernel-release", serialization_alias="kernel") -class VMOS(BaseModel): - firmware:libvirt.OS.firmwareEnum = Field(default=libvirt.OS.firmwareEnum.bios, description="Microprogramme") +class OS(BaseModel): + firmware:configDom.OS.firmwareEnum = Field(default=configDom.OS.firmwareEnum.bios, description="Microprogramme") enrolled_keys:Optional[bool] = Field(default=None, description="Vérification de la signature du chargeur de démarrage") secure_boot:Optional[bool] = Field(default=None, description="Démarrage sécurisé") - boot_order:Optional[List[libvirt.OSBoot.bootEnum]] = Field(default=None, description="Ordre de démarrage des périphériques") - boot_menu:VMOSBootMenu = Field(default=VMOSBootMenu(), description="Menu de démarrage") + boot_order:Optional[List[configDom.OSBoot.bootEnum]] = Field(default=None, description="Ordre de démarrage des périphériques") + boot_menu:OSBootMenu = Field(default=OSBootMenu(), description="Menu de démarrage") -class VMClock(BaseModel): - class offsetEnum(str, Enum): - utc = "utc" - localtime = "localtime" - timezone = "timezone" - variable = "variable" - absolute = "absolute" - - offset:offsetEnum = Field(default=offsetEnum.utc, description="Sélection de l'offset ?") +class Clock(BaseModel): + offset:configDom.Clock.offsetEnum = Field(default=configDom.Clock.offsetEnum.utc, description="Sélection de l'offset ?") -class VMEvent(BaseModel): +class Event(BaseModel): class on_poweroffEnum(str, Enum): destroy = "destroy" restart = "restart" @@ -92,21 +87,21 @@ class VMEvent(BaseModel): pause = "pause" ignore = "ignore" - on_poweroff:on_poweroffEnum = Field(default=on_poweroffEnum.destroy, description="Action lors d'un poweroff") - on_reboot:on_rebootEnum = Field(default=on_rebootEnum.restart, description="Action lors d'un redémarrage") - on_crash:on_crashEnum = Field(default=on_crashEnum.restart, description="Action lors d'un crash de la VM") - on_failurelock:on_failurelockEnum = element(default=on_failurelockEnum.ignore, description="A tester") + on_poweroff:configDom.Dom.on_poweroffEnum = Field(default=configDom.Dom.on_poweroffEnum.destroy, description="Action lors d'un poweroff") + on_reboot:configDom.Dom.on_rebootEnum = Field(default=configDom.Dom.on_rebootEnum.restart, description="Action lors d'un redémarrage") + on_crash:configDom.Dom.on_crashEnum = Field(default=configDom.Dom.on_crashEnum.restart, description="Action lors d'un crash de la VM") + on_failurelock:configDom.Dom.on_failurelockEnum = element(default=configDom.Dom.on_failurelockEnum.ignore, description="A tester") -class VMDevicesDisk(BaseModel): +class DevicesDisk(BaseModel): model_config = ConfigDict(from_attributes=True) pool_id:UUID4 = Field() id:UUID4 = Field() size:int = Field() - unit:libvirt.UnitEnum = Field(default=libvirt.UnitEnum.GiB) - bus:libvirt.DevicesDiskTarget.busEnum = Field(default=libvirt.DevicesDiskTarget.busEnum.scsi) + unit:configDom.UnitEnum = Field(default=configDom.UnitEnum.GiB) + bus:configDom.DevicesDiskTarget.busEnum = Field(default=configDom.DevicesDiskTarget.busEnum.scsi) -class VMDevicesCDROMSource(BaseModel): +class DevicesCDROMSource(BaseModel): class protocolEnum(str, Enum): http = "http" https = "https" @@ -116,60 +111,60 @@ class VMDevicesCDROMSource(BaseModel): protocol:protocolEnum = attr(default=protocolEnum.https) name:str = attr() -class VMDevicesCDROM(BaseModel): +class DevicesCDROM(BaseModel): model_config = ConfigDict(from_attributes=True) - device:libvirt.DevicesDisk.deviceEnum = Field(default=libvirt.DevicesDisk.deviceEnum.cdrom, json_schema_extra={"hidden": True}) - source:VMDevicesCDROMSource = element(default=None) + device:configDom.DevicesDisk.deviceEnum = Field(default=configDom.DevicesDisk.deviceEnum.cdrom, json_schema_extra={"hidden": True}) + source:DevicesCDROMSource = element(default=None) -class VMDevicesInterfaceGuest(BaseModel): +class DevicesInterfaceGuest(BaseModel): model_config = ConfigDict(from_attributes=True) addr:str = Field() -class VMDevicesInterface(BaseModel): +class DevicesInterface(BaseModel): model_config = ConfigDict(from_attributes=True) switch_id:UUID4 id:UUID4 mac_addr:str = Field() -class VMGraphics(BaseModel): +class Graphics(BaseModel): port:int = Field(default=-1) autoport:bool = Field(default=False) websocket:int = Field(default=-1) password:Optional[str] = Field(default=None) - keymap:libvirt.Graphics.keymapEnum = Field(default=libvirt.Graphics.keymapEnum.fr) + keymap:configDom.Graphics.keymapEnum = Field(default=configDom.Graphics.keymapEnum.fr) power_control:bool = Field(default=False) -class VMAudio(BaseModel): +class Audio(BaseModel): pass -class VMVideoModel(BaseModel): - type:libvirt.VideoModel.typeEnum = Field(default=libvirt.VideoModel.typeEnum.cirrus) +class VideoModel(BaseModel): + type:configDom.VideoModel.typeEnum = Field(default=configDom.VideoModel.typeEnum.cirrus) vram:int = Field(default=16384) - primary:libvirt.YesNoEnum = Field(default=libvirt.YesNoEnum.YES) + primary:configDom.YesNoEnum = Field(default=configDom.YesNoEnum.YES) -class VMVideo(BaseModel): - model:VMVideoModel = element() +class Video(BaseModel): + model:VideoModel = element() -class VMWatchdog(BaseModel): - model:libvirt.Watchdog.modelEnum = Field(default=libvirt.Watchdog.modelEnum.itco) - action:libvirt.Watchdog.actionEnum = Field(default=libvirt.Watchdog.actionEnum.reset) +class Watchdog(BaseModel): + model:configDom.Watchdog.modelEnum = Field(default=configDom.Watchdog.modelEnum.itco) + action:configDom.Watchdog.actionEnum = Field(default=configDom.Watchdog.actionEnum.reset) -class VMTPM(BaseModel): - model:libvirt.TPM.modelEnum = attr(default=libvirt.TPM.modelEnum.tpm_tis) - version:libvirt.TPMBackend.versionEnum = Field(default=libvirt.TPMBackend.versionEnum.v20) +class TPM(BaseModel): + model:configDom.TPM.modelEnum = attr(default=configDom.TPM.modelEnum.tpm_tis) + version:configDom.TPMBackend.versionEnum = Field(default=configDom.TPMBackend.versionEnum.v20) -class VMDevices(BaseModel): - disks:Optional[List[VMDevicesDisk]] = Field(default=None, description="Disques virtuel") - cdrom:VMDevicesCDROM = Field(default=None, description="CDROM virtuel") - interfaces:Optional[List[VMDevicesInterface]] = Field(default=None, description="Interfaces réseau") - graphics:Optional[VMGraphics] = Field(default=None, description="Console VNC") - audio:VMAudio = Field(default=None, description="Carte Audio") - video:VMVideo = Field(default=None, description="Carte Vidéo") - watchdog:VMWatchdog = Field(default=None, description="Chien de garde") - tpm:VMTPM = Field(default=None, description="Puce de sécurité") +class Devices(BaseModel): + disks:Optional[List[DevicesDisk]] = Field(default=None, description="Disques virtuel") + cdrom:DevicesCDROM = Field(default=None, description="CDROM virtuel") + interfaces:Optional[List[DevicesInterface]] = Field(default=None, description="Interfaces réseau") + graphics:Optional[Graphics] = Field(default=None, description="Console VNC") + audio:Audio = Field(default=None, description="Carte Audio") + video:Video = Field(default=None, description="Carte Vidéo") + watchdog:Watchdog = Field(default=None, description="Chien de garde") + tpm:TPM = Field(default=None, description="Puce de sécurité") class VM(BaseModel): model_config = ConfigDict(from_attributes=True) @@ -181,25 +176,25 @@ class VM(BaseModel): description:Optional[str] = Field(default=None) # CPU Allocation - vcpu:VMVCPU = Field() + vcpu:VCPU = Field() # Memory Allocation - memory:VMMemory = Field() + memory:Memory = Field() # Pool of resource (Experimental) - resource:VMResource = Field(default=VMResource(), description="Pool de resources") + resource:Resource = Field(default=Resource(), description="Pool de resources") # BIOS BootLoader - os:VMOS = Field(default=VMOS(), description="Options VM: Options de démarrage.") + os:OS = Field(default=OS(), description="Options VM: Options de démarrage.") # Clock configuration - clock:VMClock = Field(default=VMClock(), description="Options VM: Gestion de l'horloge") + clock:Clock = Field(default=Clock(), description="Options VM: Gestion de l'horloge") # Event configuration - event:VMEvent = Field(default=VMEvent(), description="Options VM: Gestion des évènements") + event:Event = Field(default=Event(), description="Options VM: Gestion des évènements") # Devices - devices:VMDevices = Field(default=VMDevices(), description="Matériel virtuel: Périphériques") + devices:Devices = Field(default=Devices(), description="Matériel virtuel: Périphériques") """VM LIST GET""" class VMs(BaseModel): @@ -217,19 +212,19 @@ class VMs(BaseModel): datacenter:Optional[Datacenter] = Field(default=[]) """VM GET""" -class VMGetVCPU(VMVCPU): +class VMGetVCPU(VCPU): max:Optional[int] = Field(default=None, description="Maximum de VCPUs") -class VMGetOS(VMOS): - guest_info:Optional[VMOSInfo] = Field(default=None, description="Information de l'OS client") +class VMGetOS(OS): + guest_info:Optional[OSInfo] = Field(default=None, description="Information de l'OS client") -class VMGetDevicesDisk(VMDevicesDisk): +class VMGetDevicesDisk(DevicesDisk): allocated:float = Field(default=None) -class VMGetDevicesInterface(VMDevicesInterface): - guest_info:Optional[List[VMDevicesInterfaceGuest]] = Field(default=None, description="Information de configuration de la carte réseau.") +class VMGetDevicesInterface(DevicesInterface): + guest_info:Optional[List[DevicesInterfaceGuest]] = Field(default=None, description="Information de configuration de la carte réseau.") -class VMGetDevices(VMDevices): +class VMGetDevices(Devices): disks:Optional[List[VMGetDevicesDisk]] = Field(default=None, description="Disques virtuel") interfaces:Optional[List[VMGetDevicesInterface]] = Field(default=None, description="Interfaces réseau") @@ -240,7 +235,7 @@ class VMGet(VM): devices:VMGetDevices = Field(default=VMGetDevices(), description="Matériel virtuel: Périphériques") """VM POST""" -class VMCreate(VM): +class VMPost(VM): id:UUID4 = Field(default_factory=uuid4) datacenter_id:UUID4 = Field() @@ -248,8 +243,8 @@ class VMCreate(VM): class VMDelete(BaseModel): id:UUID4 = Field() -class VMHardDisk(BaseModel): +class HardDisk(BaseModel): pass -class VMNetInterfaceCreate(BaseModel): +class NetInterfaceCreate(BaseModel): pass \ No newline at end of file diff --git a/libvirt/dom/config.py b/libvirt/dom/config.py index 0ca70eb..6466b85 100644 --- a/libvirt/dom/config.py +++ b/libvirt/dom/config.py @@ -4,7 +4,21 @@ from uuid import uuid4 from pydantic import UUID4 from pydantic_xml import BaseXmlModel, attr, element, wrapped -from deevirt_schema.libvirt.enum import YesNoEnum, OnOffEnum, UnitEnum +from enum import Enum + +class YesNoEnum(str, Enum): + YES = "yes" + NO = "no" + +class OnOffEnum(str, Enum): + ON = "on" + OFF = "off" + +class UnitEnum(str, Enum): + KiB = "KiB" + MiB = "MiB" + GiB = "GiB" + TiB = "TiB" class Metadata(BaseXmlModel, search_mode='ordered'): # wrapped("metadata", element(default=None, ns="deevirt", nsmap={'deevirt': 'https://deevirt.com/'})) @@ -613,7 +627,7 @@ class Devices(BaseXmlModel, search_mode='ordered'): watchdog:Optional[Watchdog] = element(default=None) tpm:Optional[TPM] = element(default=None) -class VM(BaseXmlModel, tag='domain', search_mode='ordered'): +class Dom(BaseXmlModel, tag='domain', search_mode='ordered'): class on_poweroffEnum(str, Enum): destroy = "destroy" restart = "restart" diff --git a/libvirt/enum.py b/libvirt/enum.py index f54c521..e69de29 100644 --- a/libvirt/enum.py +++ b/libvirt/enum.py @@ -1,15 +0,0 @@ -from enum import Enum - -class YesNoEnum(str, Enum): - YES = "yes" - NO = "no" - -class OnOffEnum(str, Enum): - ON = "on" - OFF = "off" - -class UnitEnum(str, Enum): - KiB = "KiB" - MiB = "MiB" - GiB = "GiB" - TiB = "TiB" \ No newline at end of file