Skip to main content
Glama
vm.py4.32 kB
""" TrueNAS Legacy VM models for bhyve-based virtual machines TrueNAS SCALE uses bhyve for legacy VMs via /api/v2.0/vm. New deployments should use Incus VMs (/api/v2.0/virt/instance) instead. """ from enum import Enum from typing import Any, Dict, List, Optional from pydantic import Field from .base import BaseModel class VMStatus(str, Enum): """Legacy VM runtime states""" RUNNING = "RUNNING" STOPPED = "STOPPED" SUSPENDED = "SUSPENDED" class VMBootloader(str, Enum): """VM bootloader types""" UEFI = "UEFI" UEFI_CSM = "UEFI_CSM" class VMDeviceType(str, Enum): """Types of devices in legacy VMs""" DISK = "DISK" CDROM = "CDROM" NIC = "NIC" RAW = "RAW" DISPLAY = "DISPLAY" USB = "USB" class VMDevice(BaseModel): """ Device attached to a legacy VM """ id: int = Field(..., description="Device ID") dtype: VMDeviceType = Field(..., description="Device type") order: int = Field(default=1000, description="Device order") vm: int = Field(..., description="Parent VM ID") attributes: Dict[str, Any] = Field( default_factory=dict, description="Device-specific attributes" ) class LegacyVM(BaseModel): """ Legacy bhyve VM model Represents a virtual machine managed by bhyve on TrueNAS. Note: New deployments should use Incus VMs instead. """ id: int = Field(..., description="VM numeric ID") name: str = Field(..., description="VM name") description: Optional[str] = Field(None, description="VM description") vcpus: int = Field(default=1, description="Number of virtual CPUs") memory: int = Field( default=512, description="Memory in MB" ) min_memory: Optional[int] = Field(None, description="Minimum memory for ballooning") autostart: bool = Field(default=False, description="Start on boot") time: str = Field(default="LOCAL", description="Time sync (LOCAL/UTC)") bootloader: VMBootloader = Field( default=VMBootloader.UEFI, description="Bootloader type" ) bootloader_ovmf: Optional[str] = Field(None, description="Custom OVMF path") shutdown_timeout: int = Field( default=90, description="Shutdown timeout in seconds" ) cpu_mode: str = Field(default="CUSTOM", description="CPU emulation mode") cpu_model: Optional[str] = Field(None, description="CPU model to emulate") hide_from_msr: bool = Field( default=False, description="Hide hypervisor from guest" ) hyperv_enlightenments: bool = Field( default=False, description="Enable Hyper-V enlightenments" ) ensure_display_device: bool = Field( default=True, description="Ensure display device exists" ) arch_type: Optional[str] = Field(None, description="Architecture type") machine_type: Optional[str] = Field(None, description="Machine type") uuid: Optional[str] = Field(None, description="VM UUID") status: Optional[VMStatus] = Field(None, description="Current status") devices: List[VMDevice] = Field( default_factory=list, description="Attached devices" ) class LegacyVMSummary(BaseModel): """ Summary information about a legacy VM for list operations """ id: int = Field(..., description="VM ID") name: str = Field(..., description="VM name") status: str = Field(..., description="Current status") vcpus: int = Field(..., description="Number of vCPUs") memory_mb: int = Field(..., description="Memory in MB") autostart: bool = Field(..., description="Autostart enabled") description: Optional[str] = Field(None, description="VM description") class LegacyVMUpdateRequest(BaseModel): """ Request model for updating legacy VM configuration Only the fields provided will be updated. """ name: Optional[str] = Field(None, description="VM name") description: Optional[str] = Field(None, description="VM description") vcpus: Optional[int] = Field(None, description="Number of vCPUs") memory: Optional[int] = Field(None, description="Memory in MB") autostart: Optional[bool] = Field(None, description="Start on boot") shutdown_timeout: Optional[int] = Field( None, description="Shutdown timeout in seconds" )

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vespo92/TrueNasCoreMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server