Compare commits

..

52 Commits

Author SHA1 Message Date
afb7a6eb92 cpuset is optional 2025-02-03 10:16:49 +01:00
2e804ee9ca update to 0.1.34 2024-12-17 10:36:54 +01:00
fe00221ff8 update to 0.1.33 2024-12-02 17:07:35 +01:00
31ae5415b4 ajout de la suppression simple d'une VM 2024-12-02 17:06:14 +01:00
970a0c2dff ajout de force stop 2024-12-02 16:16:03 +01:00
7e3ab673fa update 2024-12-01 13:17:41 +01:00
d8a0ebcfe0 update 2024-12-01 13:13:27 +01:00
9f32505843 update 2024-11-28 10:56:15 +01:00
70a934f55c update storage 2024-11-27 15:17:33 +01:00
55bef3ed30 update time 2024-11-20 15:14:31 +01:00
dba29c2842 update vm.py 2024-11-12 11:40:22 +01:00
97b98db65d update vm.py 2024-11-12 11:39:59 +01:00
e9a25cd4bd update current_time 2024-11-12 11:35:18 +01:00
76d643b3ab update current_time and interval for stats 2024-11-12 11:21:55 +01:00
491fc1116c oubli du default None sur la config XML. 2024-11-11 18:25:33 +01:00
a88e7672f8 ajout de la config xml et la gestion de l'état de la VM. 2024-11-11 18:24:42 +01:00
9d7c516245 add node to events 2024-11-10 17:42:11 +01:00
c736ffe998 update version to 0.1.25 2024-11-10 17:24:08 +01:00
e23d0e4c68 update storage & events 2024-11-10 17:23:41 +01:00
1af6b86242 update MongoStats 2024-11-08 12:27:37 +01:00
3ead1d1e27 update MongoStats 2024-11-08 12:27:20 +01:00
72e0d3b30d update MongoStats 2024-11-08 12:22:03 +01:00
0bc25a7602 update MongoStats 2024-11-08 12:21:47 +01:00
c5d5413136 update MongoStats 2024-11-08 12:12:12 +01:00
d360dfc6b9 update MongoStats 2024-11-08 12:11:05 +01:00
00fe9c67c9 je veux mourir sur scene 2024-11-08 09:19:12 +01:00
60f3a78e87 update mongoStats 2024-11-08 09:15:57 +01:00
948865e23a go go 2024-11-07 17:32:52 +01:00
669c5f5208 putain de pydantic de Mer.... 2024-11-07 17:28:21 +01:00
8300dcba26 update 2024-11-07 16:35:20 +01:00
00235f0084 update 2024-11-07 14:54:15 +01:00
f87313eef9 update 2024-11-07 14:51:41 +01:00
c0a777637e update 2024-11-07 14:46:38 +01:00
046884a6df update 2024-11-07 14:44:56 +01:00
2eaa413f3c inversion sysinfo et os 2024-11-07 14:36:05 +01:00
6e4c2b3d86 add name 2024-11-07 14:24:07 +01:00
d332bfe4f1 update vm 2024-11-07 14:20:12 +01:00
49be491f25 for you my love 3 fois :-8" 2024-11-07 11:43:44 +01:00
8b4da53586 for you my love 2024-11-07 11:40:15 +01:00
aa351df9f5 for you my love 2024-11-07 11:38:59 +01:00
cfb1647039 create new class MongoStats 2024-11-07 09:35:35 +01:00
6b386d6758 update version to 1.0.6 2024-10-30 12:35:56 +01:00
327a6d9979 correction for current_time for the stats. 2024-10-30 12:35:18 +01:00
781f265ca4 update deevirt metadata 2024-10-25 11:06:45 +02:00
f6ecaf3f9a update metadata 2024-10-24 16:39:28 +02:00
5793d9411d update metadata 2024-10-24 16:32:16 +02:00
b5e8c4b927 add datacenter_id to events & stats 2024-10-24 14:18:53 +02:00
ffee09f957 correction on stats file 2024-10-24 12:52:54 +02:00
9e03deeadc create stats api 2024-10-24 12:51:59 +02:00
f0667781a4 update events and stats 2024-10-24 11:53:14 +02:00
743accd9ba add company_id 2024-10-23 18:00:20 +02:00
dad13df1ef update stats 2024-10-23 15:26:46 +02:00
16 changed files with 359 additions and 194 deletions

View File

@@ -0,0 +1,5 @@
from . import cluster as cluster_schema
from . import datacenter as datacenter_schema
from . import network as network_schema
from . import storage as storage_schema
from . import vm as vm_schema

View File

@@ -1,6 +1,6 @@
from typing import List, Optional
import uuid
from pydantic import UUID4, BaseModel, ConfigDict, Field
from pydantic import UUID1, UUID4, BaseModel, ConfigDict, Field
class Cluster(BaseModel):
model_config = ConfigDict(from_attributes=True)
@@ -8,5 +8,5 @@ class Cluster(BaseModel):
id: UUID4
name: str
compute_id: UUID4
storage_id: UUID4
storage_id: UUID1
network_switch_id: UUID4

View File

@@ -13,7 +13,7 @@ class Datacenter(BaseModel):
model_config = ConfigDict(from_attributes=True)
company_id:UUID4
id:UUID4
id:Optional[UUID4] = Field(default_factory=uuid.uuid4)
name:str
cluster_id:UUID4
storage_pool_id:Optional[UUID4]
@@ -26,4 +26,4 @@ class DatacenterCreate(BaseModel):
id:Optional[UUID4] = Field(default_factory=lambda:uuid.uuid4())
name:str
cluster_id:UUID4
storage_pool_id:Optional[UUID4]
storage_pool_id:Optional[UUID4] = Field(default=None)

View File

@@ -1,5 +1,6 @@
from ipaddress import IPv4Address, IPv6Address
from typing import List, Optional
from uuid import uuid4
from pydantic_xml import element, attr
from pydantic import UUID4, BaseModel, ConfigDict, Field
from pydantic_extra_types.mac_address import MacAddress
@@ -8,18 +9,24 @@ class lsp(BaseModel):
model_config = ConfigDict(from_attributes=True)
id:UUID4 = Field()
mac_addr:str = Field()
mac_addr:Optional[str] = Field(default=None)
ipv4_addr:Optional[IPv4Address] = Field(default=None)
ipv6_addr:Optional[IPv6Address] = Field(default=None)
class lspCreate(lsp):
id:Optional[UUID4] = Field(default_factory=uuid4)
mac_addr:Optional[str] = Field(default=None)
class lspAttached(BaseModel):
id:UUID4 = Field()
class ls(BaseModel):
model_config = ConfigDict(from_attributes=True)
datacenter_id:Optional[UUID4] = Field(default=None)
id:UUID4 = Field()
name:str = Field()
network_switch_port:Optional[List[lsp]] = Field(default=[])
class lspCreate(BaseModel):
switch_id:UUID4 = Field(default=None)
id:Optional[UUID4]
mac_addr:Optional[str] = Field()
class lsCreate(ls):
id:Optional[UUID4] = Field(default_factory=uuid4)

View File

@@ -0,0 +1,17 @@
import time, datetime
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
from ..libvirt.dom.stats import Stats, Memory
class MemorySwap(BaseModel):
swp_in:Optional[int] = Field(default=None)
swp_out:Optional[int] = Field(default=None)
class Memory(Memory):
swap:MemorySwap = Field()
class Stats(Stats):
memory:Memory = Field()
class MongoStats(Stats):
created_at: Optional[float] = Field(default=None, alias='created_at')

View File

@@ -1,5 +1,6 @@
from typing import List, Optional
from pydantic import UUID4, BaseModel, ConfigDict, Field
from uuid import UUID
from pydantic import UUID1, UUID4, BaseModel, ConfigDict, Field
from pydantic_xml import attr
from ..libvirt.dom import config as configDom
@@ -17,7 +18,7 @@ class StorageBlock(BaseModel):
name:str = Field()
size:int = Field()
vm_hard_disk:Optional[List[VMHardDisk]] = Field(default=[])
class StoragePool(BaseModel):
model_config = ConfigDict(from_attributes=True)
@@ -28,11 +29,21 @@ class StoragePool(BaseModel):
class Storage(BaseModel):
model_config = ConfigDict(from_attributes=True)
id:UUID4 = Field()
id:UUID1 = Field()
name:str = Field()
pool: Optional[List[StoragePool]] = Field(default=[], alias='storage_pool')
class DiskDriver(configDom.DevicesDiskDriver):
class StorageBlockCreate(BaseModel):
size:int = Field()
class StorageBlockAttached(BaseModel):
id:UUID4 = Field()
order:int = Field()
class StorageBlockDeattached(BaseModel):
id:UUID4 = Field()
"""class DiskDriver(configDom.DevicesDiskDriver):
name:str = Field(default="qemu")
type:configDom.DevicesDiskDriver.typeEnum = Field(default=configDom.DevicesDiskDriver.typeEnum.raw)
@@ -66,8 +77,7 @@ class DiskCreate(Disk):
order:int = Field(default=0, json_schema_extra={"hidden": True})
class DiskAttached(BaseModel):
order:int = Field()
order:int = Field()"""
class BlockCreate(BaseModel):
size:int = Field()

View File

@@ -1,9 +1,11 @@
from enum import Enum
from typing import List, Optional
from uuid import uuid4
from pydantic import UUID4, Field, ConfigDict
from pydantic import BaseModel as _BaseModel
from ..libvirt.dom import config as configDom
from ..libvirt.dom.events import LifeCycle
class BaseModel(_BaseModel):
class Config:
@@ -65,10 +67,11 @@ class DevicesDisk(BaseModel):
model_config = ConfigDict(from_attributes=True)
pool_id:Optional[UUID4] = Field(default=None)
id:UUID4 = Field(default_factory=uuid4)
id:Optional[UUID4] = Field(default_factory=uuid4)
size:int = Field()
unit:configDom.UnitEnum = Field(default=configDom.UnitEnum.GiB)
bus:configDom.DevicesDiskTarget.busEnum = Field(default=configDom.DevicesDiskTarget.busEnum.scsi)
order:Optional[int] = Field(default=0)
class DevicesCDROMSource(BaseModel):
protocol:configDom.DevicesDiskSource.protocolEnum = Field(default=configDom.DevicesDiskSource.protocolEnum.https)
@@ -159,20 +162,7 @@ class VM(BaseModel):
# Devices
devices:Devices = Field(default=Devices(), description="Matériel virtuel: Périphériques")
"""VM LIST GET"""
class VMs(BaseModel):
model_config = ConfigDict(from_attributes=True)
class Datacenter(BaseModel):
model_config = ConfigDict(from_attributes=True)
id:UUID4
name:str
id:UUID4
name:str
state:int
datacenter:Optional[Datacenter] = Field(default=[])
"""VM GET"""
class VMGetVCPU(VCPU):
@@ -192,11 +182,38 @@ class VMGetDevices(Devices):
interfaces:Optional[List[VMGetDevicesInterface]] = Field(default=None, description="Interfaces réseau")
class VMGet(VM):
class StateEnum(Enum):
NOSTATE = 0
RUNNING = 1
BLOCKED = 2
PAUSED = 3
SHUTDOWN = 4
SHUTOFF = 5
CRASHED = 6
PMSUSPENDED = 7
LAST = 8
state:StateEnum = Field(default=None)
vcpu:VMGetVCPU = Field()
gen_id:Optional[UUID4] = Field(default=None)
os:VMGetOS = Field(default=VMGetOS(), description="Options VM: Options de démarrage.")
devices:VMGetDevices = Field(default=VMGetDevices(), description="Matériel virtuel: Périphériques")
"""VM LIST GET"""
class VMs(BaseModel):
model_config = ConfigDict(from_attributes=True)
class Datacenter(BaseModel):
model_config = ConfigDict(from_attributes=True)
id:UUID4
name:str
id:UUID4
name:str
state:VMGet.StateEnum = Field(default=None)
datacenter:Optional[Datacenter] = Field(default=[])
"""VM POST"""
class VMPost(VM):
id:UUID4 = Field(default_factory=uuid4)
@@ -204,7 +221,11 @@ class VMPost(VM):
"""VM DELETE"""
class VMDelete(BaseModel):
id:UUID4 = Field()
all_delete:Optional[bool] = Field(default=False)
"""VM STOP"""
class VMStop(BaseModel):
force:Optional[bool] = Field(default=False)
class HardDisk(BaseModel):
pass

View File

@@ -20,19 +20,29 @@ class UnitEnum(str, Enum):
GiB = "GiB"
TiB = "TiB"
class Metadata(BaseXmlModel, search_mode='ordered'):
# wrapped("metadata", element(default=None, ns="deevirt", nsmap={'deevirt': 'https://deevirt.com/'}))
class MetadataDeevirt(BaseXmlModel, tag="instance"):
company_id:UUID4 = element()
datacenter_id:UUID4 = element()
class MetadataDeevirtNS(MetadataDeevirt, ns="deevirt", nsmap={'deevirt': 'https://deevirt.fr/schema/1.0'}):
pass
class OSType(BaseXmlModel, search_mode='ordered'):
class Metadata(BaseXmlModel):
instance:Optional[MetadataDeevirtNS] = element(default=None, ns="deevirt", nsmap={'deevirt': 'https://deevirt.fr/schema/1.0'})
class OSType(BaseXmlModel, search_mode='unordered'):
class archEnum(str, Enum):
x86 = "x86"
x86_64 = "x86_64"
class typeEnum(str, Enum):
hvm = "hvm"
arch:archEnum = attr(default=archEnum.x86_64)
machine:Optional[str] = attr(default="q35")
value:typeEnum = typeEnum.hvm
class OSFirmwareFeature(BaseXmlModel, search_mode='ordered'):
class OSFirmwareFeature(BaseXmlModel, search_mode='unordered'):
class nameEnum(str, Enum):
enrolled_keys = "enrolled-keys"
secure_boot = "secure-boot"
@@ -40,10 +50,10 @@ class OSFirmwareFeature(BaseXmlModel, search_mode='ordered'):
enabled:YesNoEnum = attr(default=YesNoEnum.NO)
name:nameEnum = attr()
class OSFirmware(BaseXmlModel, search_mode='ordered'):
class OSFirmware(BaseXmlModel, search_mode='unordered'):
feature:Optional[List[OSFirmwareFeature]] = element(default=None)
class OSLoader(BaseXmlModel, search_mode='ordered'):
class OSLoader(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
nvram = "nvram"
pflash = "pflash"
@@ -53,7 +63,7 @@ class OSLoader(BaseXmlModel, search_mode='ordered'):
type:typeEnum = attr(default=typeEnum.pflash)
path:Optional[str] = ""
class OSBoot(BaseXmlModel, search_mode='ordered'):
class OSBoot(BaseXmlModel, search_mode='unordered'):
class bootEnum(str, Enum):
hd = "hd",
network = "network",
@@ -61,17 +71,17 @@ class OSBoot(BaseXmlModel, search_mode='ordered'):
dev:bootEnum = attr()
class OSBootMenu(BaseXmlModel, search_mode='ordered'):
class OSBootMenu(BaseXmlModel, search_mode='unordered'):
enable:YesNoEnum = attr(default=YesNoEnum.NO)
timeout:int = attr(default=0)
class OSSmbios(BaseXmlModel, search_mode='ordered'):
class OSSmbios(BaseXmlModel, search_mode='unordered'):
class modeEnum(str, Enum):
sysinfo = "sysinfo"
mode:modeEnum = attr(default=modeEnum.sysinfo)
class OS(BaseXmlModel, search_mode='ordered'):
class OS(BaseXmlModel, search_mode='unordered'):
class firmwareEnum(str, Enum):
bios = "bios"
efi = "efi"
@@ -85,14 +95,14 @@ class OS(BaseXmlModel, search_mode='ordered'):
bootmenu:Optional[OSBootMenu] = element(default=None)
smbios:OSSmbios = element(default=OSSmbios())
class SysinfoEntry(BaseXmlModel, search_mode='ordered'):
class SysinfoEntry(BaseXmlModel, search_mode='unordered'):
name:str = attr()
value:str
class SysinfoBIOS(BaseXmlModel, search_mode='ordered'):
class SysinfoBIOS(BaseXmlModel, search_mode='unordered'):
entry:SysinfoEntry = element(default=None)
class SysinfoSystem(BaseXmlModel, search_mode='ordered'):
class SysinfoSystem(BaseXmlModel, search_mode='unordered'):
entry:List[SysinfoEntry] = element(default=[
SysinfoEntry(
name="manufacturer",
@@ -112,89 +122,93 @@ class SysinfoSystem(BaseXmlModel, search_mode='ordered'):
)
])
class SysinfoBaseBoard(BaseXmlModel, search_mode='ordered'):
class SysinfoBaseBoard(BaseXmlModel, search_mode='unordered'):
entry:List[SysinfoEntry] = element(default=None)
class SysinfoChassis(BaseXmlModel, search_mode='ordered'):
class SysinfoChassis(BaseXmlModel, search_mode='unordered'):
entry:List[SysinfoEntry] = element(default=None)
class SysinfoOEMStrings(BaseXmlModel, search_mode='ordered'):
class SysinfoOEMStrings(BaseXmlModel, search_mode='unordered'):
entry:List[SysinfoEntry] = element(default=None)
class Sysinfo(BaseXmlModel, search_mode='ordered'):
class Sysinfo(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
smbios = "smbios"
type:typeEnum = attr(default=typeEnum.smbios)
bios:Optional[SysinfoBIOS] = element(default=None)
system:Optional[SysinfoSystem] = element(default=SysinfoSystem())
baseBoard:Optional[SysinfoBaseBoard] = element(default=None)
chassis:Optional[SysinfoChassis] = element(default=None)
oemStrings:Optional[SysinfoOEMStrings] = element(default=None)
class VCPU(BaseXmlModel, search_mode='ordered'):
class VCPU(BaseXmlModel, search_mode='unordered'):
class placementEnum(str, Enum):
static = "static"
auto = "auto"
placement:placementEnum = attr(default=placementEnum.auto)
cpuset:str = attr(default=None)
current:int = attr()
cpuset:Optional[str] = attr(default=None)
current:Optional[int] = attr(default=None)
max:int = None
class VCPUS(BaseXmlModel, search_mode='ordered'):
class VCPUS(BaseXmlModel, search_mode='unordered'):
id:int = attr()
enabled:YesNoEnum = attr(default=YesNoEnum.YES)
hotpluggable:YesNoEnum = attr(default=YesNoEnum.YES)
order:int = attr()
class CPUTune(BaseXmlModel, search_mode='ordered'):
class CPUTune(BaseXmlModel, search_mode='unordered'):
"""Not implemented"""
pass
class MaxMemory(BaseXmlModel, search_mode='ordered'):
class MaxMemory(BaseXmlModel, search_mode='unordered'):
slots:int = attr()
unit:UnitEnum = attr(default=UnitEnum.MiB)
value:int
class Memory(BaseXmlModel, search_mode='ordered'):
class Memory(BaseXmlModel, search_mode='unordered'):
unit:UnitEnum = attr(default=UnitEnum.MiB)
value:int
class CurrentMemory(BaseXmlModel, search_mode='ordered'):
class CurrentMemory(BaseXmlModel, search_mode='unordered'):
unit:UnitEnum = attr(default=UnitEnum.MiB)
value:int
class MemoryBacking(BaseXmlModel, search_mode='ordered'):
class MemoryBacking(BaseXmlModel, search_mode='unordered'):
"""Not implemented"""
pass
class MemTune(BaseXmlModel, search_mode='ordered'):
class MemTune(BaseXmlModel, search_mode='unordered'):
"""Not implemented"""
pass
class NumaTuneMemory(BaseXmlModel, search_mode='ordered'):
class NumaTuneMemory(BaseXmlModel, search_mode='unordered'):
class modeEnum(str, Enum):
interleave = "interleave"
strict = "strict"
preferred = "preferred"
restrictive = "restrictive"
mode:modeEnum = attr()
modeset:str = attr()
mode:modeEnum = attr(default=None)
modeset:str = attr(default=None)
class NumaMemnode(BaseXmlModel, search_mode='ordered'):
class NumaMemnode(BaseXmlModel, search_mode='unordered'):
cellid:int = attr()
mode:NumaTuneMemory.modeEnum = attr()
nodeset:str = attr()
class NumaTune(BaseXmlModel, search_mode='ordered'):
memory:NumaTuneMemory = element()
memnode:NumaMemnode = element()
class NumaTune(BaseXmlModel, search_mode='unordered'):
memory:NumaTuneMemory = element(default=None)
memnode:NumaMemnode = element(default=None)
class ResourcePartition(BaseXmlModel, search_mode='ordered'):
class ResourcePartition(BaseXmlModel, search_mode='unordered'):
value:str
class Resource(BaseXmlModel, search_mode='ordered'):
class Resource(BaseXmlModel, search_mode='unordered'):
partition:ResourcePartition = element()
class CPUModel(BaseXmlModel, search_mode='ordered'):
class CPUModel(BaseXmlModel, search_mode='unordered'):
class fallbackEnum(str, Enum):
force = "force"
require = "require"
@@ -205,14 +219,14 @@ class CPUModel(BaseXmlModel, search_mode='ordered'):
fallback:fallbackEnum = attr()
value:str
class CPUTopology(BaseXmlModel, search_mode='ordered'):
class CPUTopology(BaseXmlModel, search_mode='unordered'):
sockets:int = attr()
dies:Optional[int] = attr(default=None)
clusters:Optional[int] = attr(default=None)
cores:int = attr()
threads:int = attr()
class CPUCache(BaseXmlModel, search_mode='ordered'):
class CPUCache(BaseXmlModel, search_mode='unordered'):
class modeEnum(str, Enum):
emulate = "emulate"
passthrough = "passthrough"
@@ -221,7 +235,7 @@ class CPUCache(BaseXmlModel, search_mode='ordered'):
level:int = attr()
mode:modeEnum = attr()
class CPUMaxphysaddr(BaseXmlModel, search_mode='ordered'):
class CPUMaxphysaddr(BaseXmlModel, search_mode='unordered'):
class modeEnum(str, Enum):
emulate = "emulate"
passthrough = "passthrough"
@@ -229,7 +243,7 @@ class CPUMaxphysaddr(BaseXmlModel, search_mode='ordered'):
mode:modeEnum = attr()
bits:int = attr()
class CPUFeature(BaseXmlModel, search_mode='ordered'):
class CPUFeature(BaseXmlModel, search_mode='unordered'):
class policyEnum(str, Enum):
force = "force"
require = "require"
@@ -240,14 +254,14 @@ class CPUFeature(BaseXmlModel, search_mode='ordered'):
policy:policyEnum = attr()
name:str = attr()
class CPUDistancesSibling(BaseXmlModel, search_mode='ordered'):
class CPUDistancesSibling(BaseXmlModel, search_mode='unordered'):
id:int = attr()
value:int = attr()
class CPUDistances(BaseXmlModel, search_mode='ordered'):
class CPUDistances(BaseXmlModel, search_mode='unordered'):
sibling:Optional[List[CPUDistancesSibling]] = element(default=None)
class CPUNumaCell(BaseXmlModel, search_mode='ordered'):
class CPUNumaCell(BaseXmlModel, search_mode='unordered'):
class memaccessEnum(str, Enum):
shared = "shared"
private = "private"
@@ -260,10 +274,10 @@ class CPUNumaCell(BaseXmlModel, search_mode='ordered'):
memaccess:Optional[memaccessEnum] = attr(default=None)
distances:Optional[CPUDistances] = element()
class CPUNuma(BaseXmlModel, search_mode='ordered'):
class CPUNuma(BaseXmlModel, search_mode='unordered'):
cell:Optional[List[CPUNumaCell]] = element(default=[])
class CPU(BaseXmlModel, search_mode='ordered'):
class CPU(BaseXmlModel, search_mode='unordered'):
class matchEnum(str, Enum):
minimum = "minimum"
exact = "exact"
@@ -289,40 +303,40 @@ class CPU(BaseXmlModel, search_mode='ordered'):
feature:Optional[CPUFeature] = element(default=None)
numa:Optional[CPUNuma] = element(default=None)
class PMSuspendToDisk(BaseXmlModel, search_mode='ordered'):
class PMSuspendToDisk(BaseXmlModel, search_mode='unordered'):
enabled:YesNoEnum = attr(default=YesNoEnum.NO)
class PMSuspendToMem(BaseXmlModel, search_mode='ordered'):
class PMSuspendToMem(BaseXmlModel, search_mode='unordered'):
enabled:YesNoEnum = attr(default=YesNoEnum.NO)
class PM(BaseXmlModel, search_mode='ordered'):
class PM(BaseXmlModel, search_mode='unordered'):
suspend_to_disk:PMSuspendToDisk = element(tag="suspend-to-disk", default=PMSuspendToDisk())
suspend_to_mem:PMSuspendToMem = element(tag="suspend-to-mem", default=PMSuspendToMem())
class FeaturesKVMHidden(BaseXmlModel, search_mode='ordered'):
class FeaturesKVMHidden(BaseXmlModel, search_mode='unordered'):
state:OnOffEnum = attr()
class FeaturesKVMHintDedicated(BaseXmlModel, search_mode='ordered'):
class FeaturesKVMHintDedicated(BaseXmlModel, search_mode='unordered'):
state:OnOffEnum = attr()
class FeaturesKVMPollControl(BaseXmlModel, search_mode='ordered'):
class FeaturesKVMPollControl(BaseXmlModel, search_mode='unordered'):
state:OnOffEnum = attr()
class FeaturesKVMPvIpi(BaseXmlModel, search_mode='ordered'):
class FeaturesKVMPvIpi(BaseXmlModel, search_mode='unordered'):
state:OnOffEnum = attr()
class FeaturesKVMDirtyRing(BaseXmlModel, search_mode='ordered'):
class FeaturesKVMDirtyRing(BaseXmlModel, search_mode='unordered'):
state:OnOffEnum = attr()
size:int = attr()
class FeaturesKVM(BaseXmlModel, search_mode='ordered'):
class FeaturesKVM(BaseXmlModel, search_mode='unordered'):
hidden:Optional[FeaturesKVMHidden] = element(default=None)
hint_dedicated:Optional[FeaturesKVMHintDedicated] = element(tag="hint-dedicated", default=None)
poll_control:Optional[FeaturesKVMPollControl] = element(tag="poll-control", default=None)
pv_ipi:Optional[FeaturesKVMPvIpi] = element(tag="pv-ipi", default=None)
dirty_ring:Optional[FeaturesKVMDirtyRing] = element(tag="dirty-ring", default=None)
class Features(BaseXmlModel, search_mode='ordered'):
class Features(BaseXmlModel, search_mode='unordered'):
pae:str = element(default=None)
acpi:str = element(default="")
apic:str = element(default="")
@@ -330,12 +344,12 @@ class Features(BaseXmlModel, search_mode='ordered'):
privnet:str = element(default=None)
kvm:FeaturesKVM = element(default=None)
class ClockTimerCatchup(BaseXmlModel, search_mode='ordered'):
class ClockTimerCatchup(BaseXmlModel, search_mode='unordered'):
threshold:int = attr()
slew:int = attr()
limit:int = attr()
class ClockTimer(BaseXmlModel, search_mode='ordered'):
class ClockTimer(BaseXmlModel, search_mode='unordered'):
class nameEnum(str, Enum):
kvmclock = "kvmclock"
@@ -355,7 +369,7 @@ class ClockTimer(BaseXmlModel, search_mode='ordered'):
track:Optional[trackEnum] = attr(default=None)
catchup:Optional[ClockTimerCatchup] = element(default=None)
class Clock(BaseXmlModel, search_mode='ordered'):
class Clock(BaseXmlModel, search_mode='unordered'):
class offsetEnum(str, Enum):
utc = "utc"
localtime = "localtime"
@@ -366,11 +380,11 @@ class Clock(BaseXmlModel, search_mode='ordered'):
offset:Optional[offsetEnum] = attr(default=offsetEnum.utc)
timer:Optional[ClockTimer] = element(default=None)
class Perf(BaseXmlModel, search_mode='ordered'):
class Perf(BaseXmlModel, search_mode='unordered'):
"""Not implemented"""
pass
class DevicesDiskDriver(BaseXmlModel, search_mode='ordered'):
class DevicesDiskDriver(BaseXmlModel, search_mode='unordered'):
class nameEnum(str, Enum):
qemu = "qemu"
@@ -385,22 +399,22 @@ class DevicesDiskDriver(BaseXmlModel, search_mode='ordered'):
type:typeEnum = attr(default=typeEnum.raw)
discard:discardEnum = attr(default=discardEnum.unmap)
class DevicesDiskAuthSecret(BaseXmlModel, search_mode='ordered'):
class DevicesDiskAuthSecret(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
ceph = "ceph"
type:typeEnum = attr(default=typeEnum.ceph)
uuid:UUID4 = attr(default=None)
class DevicesDiskAuth(BaseXmlModel, search_mode='ordered'):
class DevicesDiskAuth(BaseXmlModel, search_mode='unordered'):
username:str = attr()
secret:DevicesDiskAuthSecret = element(default=DevicesDiskAuthSecret())
class DevicesDiskSourceHost(BaseXmlModel, search_mode='ordered'):
class DevicesDiskSourceHost(BaseXmlModel, search_mode='unordered'):
name:str = attr()
port:int = attr()
class DevicesDiskSource(BaseXmlModel, search_mode='ordered'):
class DevicesDiskSource(BaseXmlModel, search_mode='unordered'):
class protocolEnum(str, Enum):
rbd = "rbd"
http = "http"
@@ -412,7 +426,7 @@ class DevicesDiskSource(BaseXmlModel, search_mode='ordered'):
name:str = attr()
host:List[DevicesDiskSourceHost] = element(default=None)
class DevicesDiskTarget(BaseXmlModel, search_mode='ordered'):
class DevicesDiskTarget(BaseXmlModel, search_mode='unordered'):
class busEnum(str, Enum):
virtio = "virtio"
scsi = "scsi"
@@ -421,7 +435,7 @@ class DevicesDiskTarget(BaseXmlModel, search_mode='ordered'):
dev:str = attr()
bus:busEnum = attr(default=busEnum.virtio)
class DevicesDisk(BaseXmlModel, search_mode='ordered'):
class DevicesDisk(BaseXmlModel, search_mode='unordered'):
"""
Disk: CEPH Storage only
CDROM: Network Only
@@ -442,32 +456,32 @@ class DevicesDisk(BaseXmlModel, search_mode='ordered'):
target:DevicesDiskTarget = element(default=None)
serial:UUID4 = element(default_factory=uuid4)
class DevicesInterfaceMAC(BaseXmlModel, search_mode='ordered'):
class DevicesInterfaceMAC(BaseXmlModel, search_mode='unordered'):
address:Optional[str] = attr(default=None)
class DevicesInterfaceSource(BaseXmlModel, search_mode='ordered'):
class DevicesInterfaceSource(BaseXmlModel, search_mode='unordered'):
bridge:str = attr(default="br-int")
class DevicesInterfaceVirtualPortParameters(BaseXmlModel, search_mode='ordered'):
class DevicesInterfaceVirtualPortParameters(BaseXmlModel, search_mode='unordered'):
interfaceid:UUID4 = attr(default=None)
class DevicesInterfaceVirtualport(BaseXmlModel, search_mode='ordered'):
class DevicesInterfaceVirtualport(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
openvswitch = "openvswitch"
type:typeEnum = attr(default=typeEnum.openvswitch)
parameters:DevicesInterfaceVirtualPortParameters = element(default=DevicesInterfaceVirtualPortParameters())
class DevicesInterfaceModel(BaseXmlModel, search_mode='ordered'):
class DevicesInterfaceModel(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
virtio = "virtio"
type:typeEnum = attr(default=typeEnum.virtio)
class DevicesInterfaceMTU(BaseXmlModel, search_mode='ordered'):
class DevicesInterfaceMTU(BaseXmlModel, search_mode='unordered'):
mtu:int = attr(default=1500)
class DevicesInterface(BaseXmlModel, search_mode='ordered'):
class DevicesInterface(BaseXmlModel, search_mode='unordered'):
"""Openvswitch Only"""
class typeEnum(str, Enum):
@@ -480,14 +494,14 @@ class DevicesInterface(BaseXmlModel, search_mode='ordered'):
model:DevicesInterfaceModel = element(default=DevicesInterfaceModel())
mtu:DevicesInterfaceMTU = element(default=DevicesInterfaceMTU())
class DevicesChannelSource(BaseXmlModel, search_mode='ordered'):
class DevicesChannelSource(BaseXmlModel, search_mode='unordered'):
class modeEnum(str, Enum):
bind = "bind"
mode:modeEnum = attr(default=modeEnum.bind)
path:str = attr(default=None)
class DevicesChannelTarget(BaseXmlModel, search_mode='ordered'):
class DevicesChannelTarget(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
virtio = "virtio"
@@ -502,7 +516,7 @@ class DevicesChannel(BaseXmlModel):
source:DevicesChannelSource = element(default=DevicesChannelSource())
target:DevicesChannelTarget = element(default=DevicesChannelTarget())
class Graphics(BaseXmlModel, search_mode='ordered'):
class Graphics(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
vnc = "vnc"
@@ -548,10 +562,10 @@ class Graphics(BaseXmlModel, search_mode='ordered'):
keymap:keymapEnum = attr(default=keymapEnum.en_us)
powerControl:YesNoEnum = attr(default=YesNoEnum.YES)
class Audio(BaseXmlModel, search_mode='ordered'):
class Audio(BaseXmlModel, search_mode='unordered'):
pass
class VideoModel(BaseXmlModel, search_mode='ordered'):
class VideoModel(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
vga = "vga"
cirrus = "cirrus"
@@ -561,10 +575,10 @@ class VideoModel(BaseXmlModel, search_mode='ordered'):
vram:int = attr(default=16384)
primary:YesNoEnum = attr(default=YesNoEnum.YES)
class Video(BaseXmlModel, search_mode='ordered'):
class Video(BaseXmlModel, search_mode='unordered'):
model:VideoModel = element()
class Watchdog(BaseXmlModel, search_mode='ordered'):
class Watchdog(BaseXmlModel, search_mode='unordered'):
class modelEnum(str, Enum):
itco = "itco"
@@ -584,7 +598,7 @@ class Watchdog(BaseXmlModel, search_mode='ordered'):
class TPMBackendEncryption(BaseXmlModel):
secret:UUID4 = attr()
class TPMBackend(BaseXmlModel, search_mode='ordered'):
class TPMBackend(BaseXmlModel, search_mode='unordered'):
class typeEnum(str, Enum):
emulator = "emulator"
@@ -596,7 +610,7 @@ class TPMBackend(BaseXmlModel, search_mode='ordered'):
version:versionEnum = attr(default=versionEnum.v20)
encryption:Optional[TPMBackendEncryption] = element(default=None)
class TPM(BaseXmlModel, search_mode='ordered'):
class TPM(BaseXmlModel, search_mode='unordered'):
class modelEnum(str, Enum):
tpm_tis = "tpm-tis"
tpm_crb = "tpm-crb"
@@ -604,7 +618,7 @@ class TPM(BaseXmlModel, search_mode='ordered'):
model:modelEnum = attr(default=modelEnum.tpm_tis)
backend:TPMBackend = element(default=TPMBackend())
class Devices(BaseXmlModel, search_mode='ordered'):
class Devices(BaseXmlModel, search_mode='unordered'):
emulator:str = element(default="/usr/libexec/qemu-kvm")
disk:Optional[List[DevicesDisk]] = element(default=[])
interface:Optional[List[DevicesInterface]] = element(default=[])
@@ -615,7 +629,10 @@ class Devices(BaseXmlModel, search_mode='ordered'):
watchdog:Optional[Watchdog] = element(default=None)
tpm:Optional[TPM] = element(default=None)
class Dom(BaseXmlModel, tag='domain', search_mode='ordered'):
class Dom(BaseXmlModel, tag='domain', search_mode='unordered'):
class typeEnum(str, Enum):
kvm = "kvm"
class on_poweroffEnum(str, Enum):
destroy = "destroy"
restart = "restart"
@@ -636,9 +653,12 @@ class Dom(BaseXmlModel, tag='domain', search_mode='ordered'):
pause = "pause"
ignore = "ignore"
type:typeEnum = attr(default=typeEnum.kvm)
# General metadata
uuid:Optional[UUID4] = element(default=None)
genid:Optional[UUID4] = element(default=None)
name:Optional[str] = element(default=None)
title:Optional[str] = element(default=None)
description:Optional[str] = element(default=None)
metadata:Optional[Metadata] = element(default=None)
@@ -659,12 +679,12 @@ class Dom(BaseXmlModel, tag='domain', search_mode='ordered'):
# Resource patitioning
resource:Optional[Resource] = element(default=None)
# BIOS BootLoader
os:OS = element(default=OS())
# SMBIOS System Information
sysinfo:Sysinfo = element(default=Sysinfo())
# BIOS BootLoader
os:OS = element(default=OS())
# CPU model and topology
cpu:CPU = element(default=CPU())

View File

@@ -0,0 +1,97 @@
from enum import Enum
from typing import List, Optional
from uuid import UUID
from pydantic import UUID4, BaseModel, Field
class HostAlive(BaseModel):
class Status(Enum):
UP = 1
DOWN = 2
status:Status = Field(default=Status.DOWN)
class LifeCycle(BaseModel):
class EventType(Enum):
DEFINED_UPDATED = 0
DEFINED_RENAMED = 1
DEFINED_FROM_SNAPSHOT = 2
DEFINED_LAST = 3
UNDEFINED_REMOVED = 10
UNDEFINED_RENAMED = 11
UNDEFINED_LAST = 12
STARTED_BOOTED = 20
STARTED_MIGRATED = 21
STARTED_RESTORED = 22
STARTED_FROM_SNAPSHOT = 23
STARTED_WAKEUP = 24
STARTED_LAST = 25
SUSPENDED_PAUSED = 30
SUSPENDED_MIGRATED = 31
SUSPENDED_IOERROR = 32
SUSPENDED_WATCHDOG = 33
SUSPENDED_RESTORED = 34
SUSPENDED_FROM_SNAPSHOT = 35
SUSPENDED_API_ERROR = 36
SUSPENDED_POSTCOPY = 37
SUSPENDED_POSTCOPY_FAILED = 38
SUSPENDED_LAST = 39
RESUMED_UNPAUSED = 40
RESUMED_MIGRATED = 41
RESUMED_FROM_SNAPSHOT = 42
RESUMED_POSTCOPY = 43
RESUMED_POSTCOPY_FAILED = 44
RESUMED_LAST = 45
STOPPED_SHUTDOWN = 50
STOPPED_DESTROYED = 51
STOPPED_CRASHED = 52
STOPPED_MIGRATED = 53
STOPPED_SAVED = 54
STOPPED_FAILED = 55
STOPPED_FROM_SNAPSHOT = 56
STOPPED_LAST = 57
SHUTDOWN_FINISHED = 60
SHUTDOWN_GUEST = 61
SHUTDOWN_HOST = 62
SHUTDOWN_LAST = 63
PMSUSPENDED_MEMORY = 70
PMSUSPENDED_DISK = 71
PMSUSPENDED_LAST = 72
CRASHED_PANICKED = 80
CRASHED_CRASHLOADED = 81
CRASHED_LAST = 82
LAST = 90
REBOOT = 100
node_id:UUID4 = Field()
company_id:UUID4 = Field()
datacenter_id:UUID4 = Field()
vm_id:UUID = Field()
action:EventType = Field()
config:Optional[str] = Field(default=None)
class GraphicsAddr(BaseModel):
family:int = Field()
node:str = Field()
service:int = Field()
class Graphics(BaseModel):
node_id:UUID4 = Field()
company_id:UUID4 = Field()
datacenter_id:UUID4 = Field()
vm_id:UUID = Field()
phase:int = Field()
localAddr:GraphicsAddr = Field()
remoteAddr:GraphicsAddr = Field()
authScheme:Optional[str] = Field(default=None)
subject:Optional[List] = Field(default=None)

View File

@@ -0,0 +1,62 @@
import datetime
from typing import List, Optional
from pydantic import UUID4, BaseModel, ConfigDict, Field
from time import time_ns
class CPU(BaseModel):
model_config = ConfigDict()
time:int = Field()
user:int = Field()
system:int = Field()
count:int = Field()
class DiskFlows(BaseModel):
bytes:int = Field()
reqs:int = Field()
times:int = Field()
class Disk(BaseModel):
model_config = ConfigDict()
uuid:UUID4 = Field()
name:str = Field()
read:DiskFlows = Field()
write:DiskFlows = Field()
class MemorySwap(BaseModel):
swp_in:Optional[int] = Field(default=None, serialization_alias="in")
swp_out:Optional[int] = Field(default=None, serialization_alias="out")
class Memory(BaseModel):
model_config = ConfigDict()
current:int = Field()
maximum:int = Field()
disk_caches:Optional[int] = Field(default=None)
rss:int = Field()
swap:MemorySwap = Field()
unused:Optional[int] = Field(default=None)
usable:Optional[int] = Field(default=None)
class InterfaceFlows(BaseModel):
bytes:int = Field()
drop:int = Field()
errs:int = Field()
pkts:int = Field()
class Interface(BaseModel):
model_config = ConfigDict()
uuid:UUID4 = Field()
name:str = Field()
rx:InterfaceFlows = Field()
tx:InterfaceFlows = Field()
class Stats(BaseModel):
current_time:int = Field(default_factory=time_ns)
interval:int = Field()
company_id:UUID4 = Field()
datacenter_id:UUID4 = Field()
vm_id:UUID4 = Field()
cpu:CPU = Field()
memory:Memory = Field()
network:List[Interface] = Field()
disk:List[Disk] = Field()

View File

@@ -1,13 +0,0 @@
from time import time_ns
from typing import List
from uuid import UUID
from pydantic import BaseModel, Field
from . import cpu, memory, disk, network
class Stats(BaseModel):
domain:UUID
cpu:cpu.CPU
memory:memory.Memory
network:List[network.Interface]
disk:List[disk.Disk]

View File

@@ -1,9 +0,0 @@
from pydantic import BaseModel, ConfigDict, Field
from time import time_ns
class CPU(BaseModel):
model_config = ConfigDict()
time:int = Field(default_factory=time_ns)
user:int = Field()
system:int = Field()
count:int = Field()

View File

@@ -1,16 +0,0 @@
from pydantic import UUID4, BaseModel, ConfigDict, Field
from time import time_ns
class DiskFlows(BaseModel):
bytes:int = Field()
reqs:int = Field()
times:int = Field()
class Disk(BaseModel):
model_config = ConfigDict()
time:int = Field(default_factory=time_ns)
uuid:UUID4 = Field()
name:str = Field()
read:DiskFlows = Field()
write:DiskFlows = Field()

View File

@@ -1,18 +0,0 @@
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
class MemorySwap(BaseModel):
swp_in:int = Field(serialization_alias="in")
swp_out:Optional[int] = Field(default=None, serialization_alias="out")
class Memory(BaseModel):
model_config = ConfigDict()
time:int = Field()
available:Optional[int] = Field(default=None)
current:int = Field()
maximum:int = Field()
disk_caches:Optional[int] = Field(default=None)
rss:int = Field()
swap:MemorySwap = Field()
unused:Optional[int] = Field(default=None)
usable:Optional[int] = Field(default=None)

View File

@@ -1,18 +0,0 @@
from typing import Any, List
from pydantic import UUID4, BaseModel, ConfigDict, Field
from time import time_ns
class InterfaceFlows(BaseModel):
bytes:int = Field()
drop:int = Field()
errs:int = Field()
pkts:int = Field()
class Interface(BaseModel):
model_config = ConfigDict()
uuid:UUID4 = Field()
time:int = Field(default_factory=time_ns)
name:str = Field()
rx:InterfaceFlows = Field()
tx:InterfaceFlows = Field()

View File

@@ -2,7 +2,7 @@ from setuptools import find_packages, setup
setup(
name='deevirt_schema',
version='0.1.2',
version='0.1.35',
description='Deevirt Schema',
url='https://git.celeonet.fr/Deevirt/deevirt_schema.git',
author='Celeonet',