1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-24 17:28:08 +00:00

Upgrade dependencies and fix Pydantic warnings

This commit is contained in:
grossmj 2024-10-31 17:09:52 +10:00
parent 1530bdfc2b
commit 8c7c17b889
No known key found for this signature in database
GPG Key ID: 0A2D76AC45EA25CD
15 changed files with 50 additions and 47 deletions

View File

@ -43,7 +43,7 @@ class EthernetSwitchPort(BaseModel):
port_number: int port_number: int
type: EthernetSwitchPortType = Field(..., description="Port type") type: EthernetSwitchPortType = Field(..., description="Port type")
vlan: int = Field(..., ge=1, le=4094, description="VLAN number") vlan: int = Field(..., ge=1, le=4094, description="VLAN number")
ethertype: Optional[EthernetSwitchEtherType] = Field("0x8100", description="QinQ Ethertype") ethertype: Optional[EthernetSwitchEtherType] = Field(EthernetSwitchEtherType.ethertype_8021q, description="QinQ Ethertype")
@model_validator(mode="after") @model_validator(mode="after")
def check_ethertype(self) -> "EthernetSwitchPort": def check_ethertype(self) -> "EthernetSwitchPort":

View File

@ -29,13 +29,13 @@ from typing import Optional, Union, List
class CloudTemplate(TemplateBase): class CloudTemplate(TemplateBase):
category: Optional[Category] = "guest" category: Optional[Category] = Category.guest
default_name_format: Optional[str] = "Cloud{0}" default_name_format: Optional[str] = "Cloud{0}"
symbol: Optional[str] = "cloud" symbol: Optional[str] = "cloud"
ports_mapping: List[Union[EthernetPort, TAPPort, UDPPort]] = Field(default_factory=list) ports_mapping: List[Union[EthernetPort, TAPPort, UDPPort]] = Field(default_factory=list)
remote_console_host: Optional[str] = Field("127.0.0.1", description="Remote console host or IP") remote_console_host: Optional[str] = Field("127.0.0.1", description="Remote console host or IP")
remote_console_port: Optional[int] = Field(23, gt=0, le=65535, description="Remote console TCP port") remote_console_port: Optional[int] = Field(23, gt=0, le=65535, description="Remote console TCP port")
remote_console_type: Optional[CloudConsoleType] = Field("none", description="Remote console type") remote_console_type: Optional[CloudConsoleType] = Field(CloudConsoleType.none, description="Remote console type")
remote_console_http_path: Optional[str] = Field("/", description="Path of the remote web interface") remote_console_http_path: Optional[str] = Field("/", description="Path of the remote web interface")

View File

@ -24,7 +24,7 @@ from typing import Optional, List
class DockerTemplate(TemplateBase): class DockerTemplate(TemplateBase):
category: Optional[Category] = "guest" category: Optional[Category] = Category.guest
default_name_format: Optional[str] = "{name}-{0}" default_name_format: Optional[str] = "{name}-{0}"
symbol: Optional[str] = "docker_guest" symbol: Optional[str] = "docker_guest"
image: str = Field(..., description="Docker image name") image: str = Field(..., description="Docker image name")
@ -32,8 +32,8 @@ class DockerTemplate(TemplateBase):
mac_address: Optional[str] = Field("", description="Base MAC address", pattern="^([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})$|^$") mac_address: Optional[str] = Field("", description="Base MAC address", pattern="^([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})$|^$")
start_command: Optional[str] = Field("", description="Docker CMD entry") start_command: Optional[str] = Field("", description="Docker CMD entry")
environment: Optional[str] = Field("", description="Docker environment variables") environment: Optional[str] = Field("", description="Docker environment variables")
console_type: Optional[ConsoleType] = Field("telnet", description="Console type") console_type: Optional[ConsoleType] = Field(ConsoleType.telnet, description="Console type")
aux_type: Optional[AuxType] = Field("none", description="Auxiliary console type") aux_type: Optional[AuxType] = Field(AuxType.none, description="Auxiliary console type")
console_auto_start: Optional[bool] = Field( console_auto_start: Optional[bool] = Field(
False, description="Automatically start the console when the node has started" False, description="Automatically start the console when the node has started"
) )

View File

@ -32,7 +32,7 @@ from enum import Enum
class DynamipsTemplate(TemplateBase): class DynamipsTemplate(TemplateBase):
category: Optional[Category] = "router" category: Optional[Category] = Category.router
default_name_format: Optional[str] = "R{0}" default_name_format: Optional[str] = "R{0}"
symbol: Optional[str] = "router" symbol: Optional[str] = "router"
platform: DynamipsPlatform = Field(..., description="Cisco router platform") platform: DynamipsPlatform = Field(..., description="Cisco router platform")
@ -51,11 +51,11 @@ class DynamipsTemplate(TemplateBase):
disk0: Optional[int] = Field(0, description="Disk0 size in MB") disk0: Optional[int] = Field(0, description="Disk0 size in MB")
disk1: Optional[int] = Field(0, description="Disk1 size in MB") disk1: Optional[int] = Field(0, description="Disk1 size in MB")
auto_delete_disks: Optional[bool] = Field(False, description="Automatically delete nvram and disk files") auto_delete_disks: Optional[bool] = Field(False, description="Automatically delete nvram and disk files")
console_type: Optional[DynamipsConsoleType] = Field("telnet", description="Console type") console_type: Optional[DynamipsConsoleType] = Field(DynamipsConsoleType.telnet, description="Console type")
console_auto_start: Optional[bool] = Field( console_auto_start: Optional[bool] = Field(
False, description="Automatically start the console when the node has started" False, description="Automatically start the console when the node has started"
) )
aux_type: Optional[DynamipsConsoleType] = Field("none", description="Auxiliary console type") aux_type: Optional[DynamipsConsoleType] = Field(DynamipsConsoleType.none, description="Auxiliary console type")
slot0: Optional[DynamipsAdapters] = Field(None, description="Network module slot 0") slot0: Optional[DynamipsAdapters] = Field(None, description="Network module slot 0")
slot1: Optional[DynamipsAdapters] = Field(None, description="Network module slot 1") slot1: Optional[DynamipsAdapters] = Field(None, description="Network module slot 1")
slot2: Optional[DynamipsAdapters] = Field(None, description="Network module slot 2") slot2: Optional[DynamipsAdapters] = Field(None, description="Network module slot 2")
@ -72,8 +72,8 @@ class C7200DynamipsTemplate(DynamipsTemplate):
ram: Optional[int] = Field(512, description="Amount of RAM in MB") ram: Optional[int] = Field(512, description="Amount of RAM in MB")
nvram: Optional[int] = Field(512, description="Amount of NVRAM in KB") nvram: Optional[int] = Field(512, description="Amount of NVRAM in KB")
npe: Optional[DynamipsNPE] = Field("npe-400", description="NPE model") npe: Optional[DynamipsNPE] = Field(DynamipsNPE.npe_400, description="NPE model")
midplane: Optional[DynamipsMidplane] = Field("vxr", description="Midplane model") midplane: Optional[DynamipsMidplane] = Field(DynamipsMidplane.vxr, description="Midplane model")
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature") sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")

View File

@ -35,7 +35,7 @@ DEFAULT_PORTS = [
class EthernetHubTemplate(TemplateBase): class EthernetHubTemplate(TemplateBase):
category: Optional[Category] = "switch" category: Optional[Category] = Category.switch
default_name_format: Optional[str] = "Hub{0}" default_name_format: Optional[str] = "Hub{0}"
symbol: Optional[str] = "hub" symbol: Optional[str] = "hub"
ports_mapping: Optional[List[EthernetHubPort]] = Field(DEFAULT_PORTS, description="Ports") ports_mapping: Optional[List[EthernetHubPort]] = Field(DEFAULT_PORTS, description="Ports")

View File

@ -45,11 +45,11 @@ class ConsoleType(str, Enum):
class EthernetSwitchTemplate(TemplateBase): class EthernetSwitchTemplate(TemplateBase):
category: Optional[Category] = "switch" category: Optional[Category] = Category.switch
default_name_format: Optional[str] = "Switch{0}" default_name_format: Optional[str] = "Switch{0}"
symbol: Optional[str] = "ethernet_switch" symbol: Optional[str] = "ethernet_switch"
ports_mapping: Optional[List[EthernetSwitchPort]] = Field(DEFAULT_PORTS, description="Ports") ports_mapping: Optional[List[EthernetSwitchPort]] = Field(DEFAULT_PORTS, description="Ports")
console_type: Optional[ConsoleType] = Field("none", description="Console type") console_type: Optional[ConsoleType] = Field(ConsoleType.none, description="Console type")
class EthernetSwitchTemplateUpdate(EthernetSwitchTemplate): class EthernetSwitchTemplateUpdate(EthernetSwitchTemplate):

View File

@ -24,7 +24,7 @@ from typing import Optional
class IOUTemplate(TemplateBase): class IOUTemplate(TemplateBase):
category: Optional[Category] = "router" category: Optional[Category] = Category.router
default_name_format: Optional[str] = "IOU{0}" default_name_format: Optional[str] = "IOU{0}"
symbol: Optional[str] = "multilayer_switch" symbol: Optional[str] = "multilayer_switch"
path: str = Field(..., description="Path of IOU executable") path: str = Field(..., description="Path of IOU executable")
@ -36,7 +36,7 @@ class IOUTemplate(TemplateBase):
startup_config: Optional[str] = Field("iou_l3_base_startup-config.txt", description="Startup-config of IOU") startup_config: Optional[str] = Field("iou_l3_base_startup-config.txt", description="Startup-config of IOU")
private_config: Optional[str] = Field("", description="Private-config of IOU") private_config: Optional[str] = Field("", description="Private-config of IOU")
l1_keepalives: Optional[bool] = Field(False, description="Always keep up Ethernet interface (does not always work)") l1_keepalives: Optional[bool] = Field(False, description="Always keep up Ethernet interface (does not always work)")
console_type: Optional[ConsoleType] = Field("telnet", description="Console type") console_type: Optional[ConsoleType] = Field(ConsoleType.telnet, description="Console type")
console_auto_start: Optional[bool] = Field( console_auto_start: Optional[bool] = Field(
False, description="Automatically start the console when the node has started" False, description="Automatically start the console when the node has started"
) )

View File

@ -33,17 +33,17 @@ from typing import Optional, List
class QemuTemplate(TemplateBase): class QemuTemplate(TemplateBase):
category: Optional[Category] = "guest" category: Optional[Category] = Category.guest
default_name_format: Optional[str] = "{name}-{0}" default_name_format: Optional[str] = "{name}-{0}"
symbol: Optional[str] = "qemu_guest" symbol: Optional[str] = "qemu_guest"
qemu_path: Optional[str] = Field("", description="Qemu executable path") qemu_path: Optional[str] = Field("", description="Qemu executable path")
platform: Optional[QemuPlatform] = Field("x86_64", description="Platform to emulate") platform: Optional[QemuPlatform] = Field(QemuPlatform.x86_64, description="Platform to emulate")
linked_clone: Optional[bool] = Field(True, description="Whether the VM is a linked clone or not") linked_clone: Optional[bool] = Field(True, description="Whether the VM is a linked clone or not")
ram: Optional[int] = Field(256, description="Amount of RAM in MB") ram: Optional[int] = Field(256, description="Amount of RAM in MB")
cpus: Optional[int] = Field(1, ge=1, le=255, description="Number of vCPUs") cpus: Optional[int] = Field(1, ge=1, le=255, description="Number of vCPUs")
maxcpus: Optional[int] = Field(1, ge=1, le=255, description="Maximum number of hotpluggable vCPUs") maxcpus: Optional[int] = Field(1, ge=1, le=255, description="Maximum number of hotpluggable vCPUs")
adapters: Optional[int] = Field(1, ge=0, le=275, description="Number of adapters") adapters: Optional[int] = Field(1, ge=0, le=275, description="Number of adapters")
adapter_type: Optional[QemuAdapterType] = Field("e1000", description="QEMU adapter type") adapter_type: Optional[QemuAdapterType] = Field(QemuAdapterType.e1000, description="QEMU adapter type")
mac_address: Optional[str] = Field( mac_address: Optional[str] = Field(
"", description="QEMU MAC address", pattern="^([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})$|^$" "", description="QEMU MAC address", pattern="^([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})$|^$"
) )
@ -55,20 +55,20 @@ class QemuTemplate(TemplateBase):
0, 0,
description="Optional port segment size. A port segment is a block of port. For example Ethernet0/0 Ethernet0/1 is the module 0 with a port segment size of 2", description="Optional port segment size. A port segment is a block of port. For example Ethernet0/0 Ethernet0/1 is the module 0 with a port segment size of 2",
) )
console_type: Optional[QemuConsoleType] = Field("telnet", description="Console type") console_type: Optional[QemuConsoleType] = Field(QemuConsoleType.telnet, description="Console type")
console_auto_start: Optional[bool] = Field( console_auto_start: Optional[bool] = Field(
False, description="Automatically start the console when the node has started" False, description="Automatically start the console when the node has started"
) )
aux_type: Optional[QemuConsoleType] = Field("none", description="Auxiliary console type") aux_type: Optional[QemuConsoleType] = Field(QemuConsoleType.none, description="Auxiliary console type")
boot_priority: Optional[QemuBootPriority] = Field("c", description="QEMU boot priority") boot_priority: Optional[QemuBootPriority] = Field(QemuBootPriority.c, description="QEMU boot priority")
hda_disk_image: Optional[str] = Field("", description="QEMU hda disk image path") hda_disk_image: Optional[str] = Field("", description="QEMU hda disk image path")
hda_disk_interface: Optional[QemuDiskInterfaceType] = Field("none", description="QEMU hda interface") hda_disk_interface: Optional[QemuDiskInterfaceType] = Field(QemuDiskInterfaceType.none, description="QEMU hda interface")
hdb_disk_image: Optional[str] = Field("", description="QEMU hdb disk image path") hdb_disk_image: Optional[str] = Field("", description="QEMU hdb disk image path")
hdb_disk_interface: Optional[QemuDiskInterfaceType] = Field("none", description="QEMU hdb interface") hdb_disk_interface: Optional[QemuDiskInterfaceType] = Field(QemuDiskInterfaceType.none, description="QEMU hdb interface")
hdc_disk_image: Optional[str] = Field("", description="QEMU hdc disk image path") hdc_disk_image: Optional[str] = Field("", description="QEMU hdc disk image path")
hdc_disk_interface: Optional[QemuDiskInterfaceType] = Field("none", description="QEMU hdc interface") hdc_disk_interface: Optional[QemuDiskInterfaceType] = Field(QemuDiskInterfaceType.none, description="QEMU hdc interface")
hdd_disk_image: Optional[str] = Field("", description="QEMU hdd disk image path") hdd_disk_image: Optional[str] = Field("", description="QEMU hdd disk image path")
hdd_disk_interface: Optional[QemuDiskInterfaceType] = Field("none", description="QEMU hdd interface") hdd_disk_interface: Optional[QemuDiskInterfaceType] = Field(QemuDiskInterfaceType.none, description="QEMU hdd interface")
cdrom_image: Optional[str] = Field("", description="QEMU cdrom image path") cdrom_image: Optional[str] = Field("", description="QEMU cdrom image path")
initrd: Optional[str] = Field("", description="QEMU initrd path") initrd: Optional[str] = Field("", description="QEMU initrd path")
kernel_image: Optional[str] = Field("", description="QEMU kernel image path") kernel_image: Optional[str] = Field("", description="QEMU kernel image path")
@ -82,9 +82,9 @@ class QemuTemplate(TemplateBase):
) )
tpm: Optional[bool] = Field(False, description="Enable Trusted Platform Module (TPM)") tpm: Optional[bool] = Field(False, description="Enable Trusted Platform Module (TPM)")
uefi: Optional[bool] = Field(False, description="Enable UEFI boot mode") uefi: Optional[bool] = Field(False, description="Enable UEFI boot mode")
on_close: Optional[QemuOnCloseAction] = Field("power_off", description="Action to execute on the VM is closed") on_close: Optional[QemuOnCloseAction] = Field(QemuOnCloseAction.power_off, description="Action to execute on the VM is closed")
cpu_throttling: Optional[int] = Field(0, ge=0, le=800, description="Percentage of CPU allowed for QEMU") cpu_throttling: Optional[int] = Field(0, ge=0, le=800, description="Percentage of CPU allowed for QEMU")
process_priority: Optional[QemuProcessPriority] = Field("normal", description="Process priority for QEMU") process_priority: Optional[QemuProcessPriority] = Field(QemuProcessPriority.normal, description="Process priority for QEMU")
options: Optional[str] = Field("", description="Additional QEMU options") options: Optional[str] = Field("", description="Additional QEMU options")
custom_adapters: Optional[List[CustomAdapter]] = Field(default_factory=list, description="Custom adapters") custom_adapters: Optional[List[CustomAdapter]] = Field(default_factory=list, description="Custom adapters")

View File

@ -28,7 +28,7 @@ from typing import Optional, List
class VirtualBoxTemplate(TemplateBase): class VirtualBoxTemplate(TemplateBase):
category: Optional[Category] = "guest" category: Optional[Category] = Category.guest
default_name_format: Optional[str] = "{name}-{0}" default_name_format: Optional[str] = "{name}-{0}"
symbol: Optional[str] = "vbox_guest" symbol: Optional[str] = "vbox_guest"
vmname: str = Field(..., description="VirtualBox VM name (in VirtualBox itself)") vmname: str = Field(..., description="VirtualBox VM name (in VirtualBox itself)")
@ -38,8 +38,7 @@ class VirtualBoxTemplate(TemplateBase):
1, ge=0, le=36, description="Number of adapters" 1, ge=0, le=36, description="Number of adapters"
) # 36 is the maximum given by the ICH9 chipset in VirtualBox ) # 36 is the maximum given by the ICH9 chipset in VirtualBox
use_any_adapter: Optional[bool] = Field(False, description="Allow GNS3 to use any VirtualBox adapter") use_any_adapter: Optional[bool] = Field(False, description="Allow GNS3 to use any VirtualBox adapter")
adapter_type: Optional[VirtualBoxAdapterType] = Field( adapter_type: Optional[VirtualBoxAdapterType] = Field(VirtualBoxAdapterType.intel_pro_1000_mt_desktop, description="VirtualBox adapter type"
"Intel PRO/1000 MT Desktop (82540EM)", description="VirtualBox adapter type"
) )
first_port_name: Optional[str] = Field("", description="Optional name of the first networking port example: eth0") first_port_name: Optional[str] = Field("", description="Optional name of the first networking port example: eth0")
port_name_format: Optional[str] = Field( port_name_format: Optional[str] = Field(
@ -51,9 +50,9 @@ class VirtualBoxTemplate(TemplateBase):
) )
headless: Optional[bool] = Field(False, description="Headless mode") headless: Optional[bool] = Field(False, description="Headless mode")
on_close: Optional[VirtualBoxOnCloseAction] = Field( on_close: Optional[VirtualBoxOnCloseAction] = Field(
"power_off", description="Action to execute on the VM is closed" VirtualBoxOnCloseAction.power_off, description="Action to execute on the VM is closed"
) )
console_type: Optional[VirtualBoxConsoleType] = Field("none", description="Console type") console_type: Optional[VirtualBoxConsoleType] = Field(VirtualBoxConsoleType.none, description="Console type")
console_auto_start: Optional[bool] = Field( console_auto_start: Optional[bool] = Field(
False, description="Automatically start the console when the node has started" False, description="Automatically start the console when the node has started"
) )

View File

@ -29,7 +29,7 @@ from typing import Optional, List
class VMwareTemplate(TemplateBase): class VMwareTemplate(TemplateBase):
category: Optional[Category] = "guest" category: Optional[Category] = Category.guest
default_name_format: Optional[str] = "{name}-{0}" default_name_format: Optional[str] = "{name}-{0}"
symbol: Optional[str] = "vmware_guest" symbol: Optional[str] = "vmware_guest"
vmx_path: str = Field(..., description="Path to the vmx file") vmx_path: str = Field(..., description="Path to the vmx file")
@ -45,11 +45,11 @@ class VMwareTemplate(TemplateBase):
adapters: Optional[int] = Field( adapters: Optional[int] = Field(
1, ge=0, le=10, description="Number of adapters" 1, ge=0, le=10, description="Number of adapters"
) # 10 is the maximum adapters support by VMware VMs ) # 10 is the maximum adapters support by VMware VMs
adapter_type: Optional[VMwareAdapterType] = Field("e1000", description="VMware adapter type") adapter_type: Optional[VMwareAdapterType] = Field(VMwareAdapterType.e1000, description="VMware adapter type")
use_any_adapter: Optional[bool] = Field(False, description="Allow GNS3 to use any VMware adapter") use_any_adapter: Optional[bool] = Field(False, description="Allow GNS3 to use any VMware adapter")
headless: Optional[bool] = Field(False, description="Headless mode") headless: Optional[bool] = Field(False, description="Headless mode")
on_close: Optional[VMwareOnCloseAction] = Field("power_off", description="Action to execute on the VM is closed") on_close: Optional[VMwareOnCloseAction] = Field(VMwareOnCloseAction.power_off, description="Action to execute on the VM is closed")
console_type: Optional[VMwareConsoleType] = Field("none", description="Console type") console_type: Optional[VMwareConsoleType] = Field(VMwareConsoleType.none, description="Console type")
console_auto_start: Optional[bool] = Field( console_auto_start: Optional[bool] = Field(
False, description="Automatically start the console when the node has started" False, description="Automatically start the console when the node has started"
) )

View File

@ -24,11 +24,11 @@ from typing import Optional
class VPCSTemplate(TemplateBase): class VPCSTemplate(TemplateBase):
category: Optional[Category] = "guest" category: Optional[Category] = Category.guest
default_name_format: Optional[str] = "PC{0}" default_name_format: Optional[str] = "PC{0}"
symbol: Optional[str] = "vpcs_guest" symbol: Optional[str] = "vpcs_guest"
base_script_file: Optional[str] = Field("vpcs_base_config.txt", description="Script file") base_script_file: Optional[str] = Field("vpcs_base_config.txt", description="Script file")
console_type: Optional[ConsoleType] = Field("telnet", description="Console type") console_type: Optional[ConsoleType] = Field(ConsoleType.telnet, description="Console type")
console_auto_start: Optional[bool] = Field( console_auto_start: Optional[bool] = Field(
False, description="Automatically start the console when the node has started" False, description="Automatically start the console when the node has started"
) )

View File

@ -1,7 +1,8 @@
uvicorn==0.29.0 uvicorn==0.32.0
fastapi==0.112.0 pydantic==2.9.2
python-multipart==0.0.9 fastapi==0.113.0
websockets==12.0 python-multipart==0.0.16
websockets==13.1
aiohttp>=3.10.10,<3.11 aiohttp>=3.10.10,<3.11
async-timeout==4.0.3 async-timeout==4.0.3
aiofiles>=24.1.0,<25.0 aiofiles>=24.1.0,<25.0
@ -10,14 +11,14 @@ sentry-sdk>=2.17,<2.18 # optional dependency
psutil>=6.1.0 psutil>=6.1.0
distro>=1.9.0 distro>=1.9.0
py-cpuinfo==9.0.0 py-cpuinfo==9.0.0
sqlalchemy==2.0.31 sqlalchemy==2.0.36
aiosqlite==0.20.0 aiosqlite==0.20.0
alembic==1.12.1 alembic==1.13.3
bcrypt==4.2.0 bcrypt==4.2.0
python-jose[cryptography]==3.3.0 python-jose[cryptography]==3.3.0
email-validator==2.2.0 email-validator==2.2.0
watchfiles==0.22.0 watchfiles==0.24.0
zstandard==0.23.0 zstandard==0.23.0
platformdirs==4.2.2 platformdirs==4.3.6
importlib-resources>=1.3; python_version <= '3.9' importlib-resources>=1.3; python_version <= '3.9'
truststore>=0.10.0; python_version >= '3.10' truststore>=0.10.0; python_version >= '3.10'

View File

@ -1449,6 +1449,7 @@ async def test_add_ubridge_connection(vm):
vm._ubridge_hypervisor.assert_has_calls(calls, any_order=True) vm._ubridge_hypervisor.assert_has_calls(calls, any_order=True)
@pytest.mark.asyncio
async def test_add_ubridge_connections_with_base_mac_address(vm): async def test_add_ubridge_connections_with_base_mac_address(vm):
vm._ubridge_hypervisor = MagicMock() vm._ubridge_hypervisor = MagicMock()

View File

@ -793,6 +793,7 @@ async def test_build_command_with_invalid_options(vm):
@pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows") @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows")
@pytest.mark.asyncio
async def test_build_command_with_forbidden_options(vm): async def test_build_command_with_forbidden_options(vm):
vm.options = "-blockdev" vm.options = "-blockdev"

View File

@ -122,6 +122,7 @@ async def write_file(path, z):
f.write(chunk) f.write(chunk)
@pytest.mark.asyncio
async def test_import_project_containing_symlink(tmpdir, controller): async def test_import_project_containing_symlink(tmpdir, controller):
project = Project(controller=controller, name="test") project = Project(controller=controller, name="test")