diff --git a/gns3server/compute/__init__.py b/gns3server/compute/__init__.py
index 9b7a6cc18..1b453bde3 100644
--- a/gns3server/compute/__init__.py
+++ b/gns3server/compute/__init__.py
@@ -14,15 +14,15 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
import os
+import sys
from .builtin import Builtin
-from .vpcs import VPCS
-from .virtualbox import VirtualBox
from .dynamips import Dynamips
from .qemu import Qemu
+from .virtualbox import VirtualBox
from .vmware import VMware
+from .vpcs import VPCS
MODULES = [Builtin, VPCS, VirtualBox, Dynamips, Qemu, VMware]
diff --git a/gns3server/compute/base_manager.py b/gns3server/compute/base_manager.py
index 6ee63f427..a455beb97 100644
--- a/gns3server/compute/base_manager.py
+++ b/gns3server/compute/base_manager.py
@@ -14,37 +14,38 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
-import os
-import struct
-import stat
import asyncio
-import aiofiles
-import socket
-import shutil
-import re
-import logging
import inspect
+import logging
+import os
+import re
+import shutil
+import socket
+import stat
+import struct
+import sys
+
+import aiofiles
log = logging.getLogger(__name__)
-from gns3server.utils.asyncio import cancellable_wait_run_in_executor
+from typing import Type
+from uuid import UUID, uuid4
+
from gns3server.compute.compute_error import ComputeError, ComputeForbiddenError, ComputeNotFoundError
+from gns3server.utils.asyncio import cancellable_wait_run_in_executor
from gns3server.utils.interfaces import is_interface_up
-from uuid import UUID, uuid4
-from typing import Type
from ..config import Config
from ..utils import force_unix_path
-from .project_manager import ProjectManager
-from .port_manager import PortManager
+from ..utils.images import default_images_directory, images_directories, list_images, md5sum, remove_checksum
from .base_node import BaseNode
-
-from .nios.nio_udp import NIOUDP
-from .nios.nio_tap import NIOTAP
+from .error import ImageMissingError, NodeError
from .nios.nio_ethernet import NIOEthernet
-from ..utils.images import md5sum, remove_checksum, images_directories, default_images_directory, list_images
-from .error import NodeError, ImageMissingError
+from .nios.nio_tap import NIOTAP
+from .nios.nio_udp import NIOUDP
+from .port_manager import PortManager
+from .project_manager import ProjectManager
CHUNK_SIZE = 1024 * 8 # 8KB
diff --git a/gns3server/compute/base_node.py b/gns3server/compute/base_node.py
index 0f56bdd04..8bfbb70c7 100644
--- a/gns3server/compute/base_node.py
+++ b/gns3server/compute/base_node.py
@@ -14,33 +14,34 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
-import os
-import stat
-import shutil
import asyncio
import contextlib
import json
-import struct
-import tempfile
-import psutil
+import logging
+import os
import platform
import re
-import asyncssh
+import shutil
+import stat
+import struct
+import sys
+import tempfile
+import asyncssh
+import psutil
from fastapi import WebSocketDisconnect
-from gns3server.utils.interfaces import interfaces
+
from gns3server.compute.compute_error import ComputeError
-from ..compute.port_manager import PortManager
-from ..utils.asyncio import wait_run_in_executor, locking
-from ..utils.asyncio.ssh_server import AsyncioSSHServer
-from ..utils.asyncio.telnet_server import AsyncioTelnetServer
from gns3server.compute.ubridge.hypervisor import Hypervisor
from gns3server.compute.ubridge.ubridge_error import UbridgeError
-from .nios.nio_udp import NIOUDP
-from .error import NodeError
+from gns3server.utils.interfaces import interfaces
-import logging
+from ..compute.port_manager import PortManager
+from ..utils.asyncio import locking, wait_run_in_executor
+from ..utils.asyncio.ssh_server import AsyncioSSHServer
+from ..utils.asyncio.telnet_server import AsyncioTelnetServer
+from .error import NodeError
+from .nios.nio_udp import NIOUDP
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/builtin/__init__.py b/gns3server/compute/builtin/__init__.py
index 94b20748b..86bbc2e15 100644
--- a/gns3server/compute/builtin/__init__.py
+++ b/gns3server/compute/builtin/__init__.py
@@ -18,11 +18,11 @@
Builtin nodes server module.
"""
-from ..base_manager import BaseManager
-from .builtin_node_factory import BuiltinNodeFactory, BUILTIN_NODES
-
import logging
+from ..base_manager import BaseManager
+from .builtin_node_factory import BUILTIN_NODES, BuiltinNodeFactory
+
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/builtin/builtin_node_factory.py b/gns3server/compute/builtin/builtin_node_factory.py
index eafa1d544..082b78c54 100644
--- a/gns3server/compute/builtin/builtin_node_factory.py
+++ b/gns3server/compute/builtin/builtin_node_factory.py
@@ -15,13 +15,13 @@
# along with this program. If not, see .
+import logging
+
from ..error import NodeError
from .nodes.cloud import Cloud
-from .nodes.nat import Nat
from .nodes.ethernet_hub import EthernetHub
from .nodes.ethernet_switch import EthernetSwitch
-
-import logging
+from .nodes.nat import Nat
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/builtin/nodes/cloud.py b/gns3server/compute/builtin/nodes/cloud.py
index 8e40e5ea6..5737a196d 100644
--- a/gns3server/compute/builtin/nodes/cloud.py
+++ b/gns3server/compute/builtin/nodes/cloud.py
@@ -14,18 +14,17 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
+import logging
import subprocess
+import sys
-from ...error import NodeError
-from ...base_node import BaseNode
-from ...nios.nio_udp import NIOUDP
+import gns3server.utils.asyncio
+import gns3server.utils.interfaces
from gns3server.compute.ubridge.ubridge_error import UbridgeError
-import gns3server.utils.interfaces
-import gns3server.utils.asyncio
-
-import logging
+from ...base_node import BaseNode
+from ...error import NodeError
+from ...nios.nio_udp import NIOUDP
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/builtin/nodes/ethernet_hub.py b/gns3server/compute/builtin/nodes/ethernet_hub.py
index 0edc82ae5..8fa5b29f6 100644
--- a/gns3server/compute/builtin/nodes/ethernet_hub.py
+++ b/gns3server/compute/builtin/nodes/ethernet_hub.py
@@ -15,11 +15,10 @@
# along with this program. If not, see .
import asyncio
+import logging
from ...base_node import BaseNode
-import logging
-
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/builtin/nodes/ethernet_switch.py b/gns3server/compute/builtin/nodes/ethernet_switch.py
index 153cb0af6..759f8a638 100644
--- a/gns3server/compute/builtin/nodes/ethernet_switch.py
+++ b/gns3server/compute/builtin/nodes/ethernet_switch.py
@@ -37,12 +37,13 @@ be the switch). ESW ``access``/``dot1q``/``qinq`` port modes are composed from
the ``brctl`` VLAN primitives here -- see ``_apply_port_vlan``.
"""
-from ...base_node import BaseNode
-from ...nios.nio_udp import NIOUDP
-from ...error import NodeError
+import logging
+
from gns3server.compute.ubridge.ubridge_error import UbridgeError
-import logging
+from ...base_node import BaseNode
+from ...error import NodeError
+from ...nios.nio_udp import NIOUDP
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/builtin/nodes/nat.py b/gns3server/compute/builtin/nodes/nat.py
index 4a75d9a48..ce5a4b77e 100644
--- a/gns3server/compute/builtin/nodes/nat.py
+++ b/gns3server/compute/builtin/nodes/nat.py
@@ -15,15 +15,14 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import logging
import sys
-from .cloud import Cloud
-from ...error import NodeError
-
import gns3server.utils.interfaces
from gns3server.config import Config
-import logging
+from ...error import NodeError
+from .cloud import Cloud
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/port_manager.py b/gns3server/compute/port_manager.py
index ece70c3ab..df5293733 100644
--- a/gns3server/compute/port_manager.py
+++ b/gns3server/compute/port_manager.py
@@ -14,13 +14,14 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import socket
import ipaddress
-import threading
-from fastapi import HTTPException, status
-from gns3server.config import Config
-
import logging
+import socket
+import threading
+
+from fastapi import HTTPException, status
+
+from gns3server.config import Config
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/project.py b/gns3server/compute/project.py
index 8e6ef7648..3e4296110 100644
--- a/gns3server/compute/project.py
+++ b/gns3server/compute/project.py
@@ -14,24 +14,24 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import asyncio
+import datetime
+import hashlib
+import logging
import os
import shutil
-import magic
-import asyncio
-import hashlib
-import datetime
-
from uuid import UUID, uuid4
+
+import magic
from fastapi import HTTPException, status
-from gns3server.compute.compute_error import ComputeError, ComputeNotFoundError, ComputeForbiddenError
-from .port_manager import PortManager
-from .notification_manager import NotificationManager
+from gns3server.compute.compute_error import ComputeError, ComputeForbiddenError, ComputeNotFoundError
+
from ..config import Config
from ..utils.asyncio import wait_run_in_executor
from ..utils.path import check_path_allowed, get_default_project_directory
-
-import logging
+from .notification_manager import NotificationManager
+from .port_manager import PortManager
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/virtualbox/__init__.py b/gns3server/compute/virtualbox/__init__.py
index 3f3e92634..27313318f 100644
--- a/gns3server/compute/virtualbox/__init__.py
+++ b/gns3server/compute/virtualbox/__init__.py
@@ -18,19 +18,19 @@
VirtualBox server module.
"""
+import asyncio
+import logging
import os
import re
-import sys
import shutil
-import asyncio
import subprocess
-import logging
+import sys
log = logging.getLogger(__name__)
from ..base_manager import BaseManager
-from .virtualbox_vm import VirtualBoxVM
from .virtualbox_error import VirtualBoxError
+from .virtualbox_vm import VirtualBoxVM
class VirtualBox(BaseManager):
diff --git a/gns3server/compute/virtualbox/virtualbox_vm.py b/gns3server/compute/virtualbox/virtualbox_vm.py
index e2e144e9f..729455d3d 100644
--- a/gns3server/compute/virtualbox/virtualbox_vm.py
+++ b/gns3server/compute/virtualbox/virtualbox_vm.py
@@ -18,28 +18,27 @@
VirtualBox VM instance.
"""
-import re
-import os
-import sys
+import asyncio
import json
-import uuid
+import logging
+import os
+import re
import shlex
import shutil
-import asyncio
+import sys
import tempfile
+import uuid
import xml.etree.ElementTree as ET
-from gns3server.utils import parse_version
-from gns3server.utils.asyncio.ssh_server import AsyncioSSHServer
-from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
-from gns3server.utils.asyncio.serial import asyncio_open_serial
-from gns3server.utils.asyncio import locking
-from gns3server.compute.virtualbox.virtualbox_error import VirtualBoxError
-from gns3server.compute.nios.nio_udp import NIOUDP
from gns3server.compute.adapters.ethernet_adapter import EthernetAdapter
from gns3server.compute.base_node import BaseNode
-
-import logging
+from gns3server.compute.nios.nio_udp import NIOUDP
+from gns3server.compute.virtualbox.virtualbox_error import VirtualBoxError
+from gns3server.utils import parse_version
+from gns3server.utils.asyncio import locking
+from gns3server.utils.asyncio.serial import asyncio_open_serial
+from gns3server.utils.asyncio.ssh_server import AsyncioSSHServer
+from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/vmware/__init__.py b/gns3server/compute/vmware/__init__.py
index c814fc55f..7aa615927 100644
--- a/gns3server/compute/vmware/__init__.py
+++ b/gns3server/compute/vmware/__init__.py
@@ -18,27 +18,27 @@
VMware player/workstation server module.
"""
-import os
-import sys
-import re
-import shutil
import asyncio
-import subprocess
-import logging
import codecs
import ipaddress
+import logging
+import os
+import re
import shlex
-
+import shutil
+import subprocess
+import sys
from collections import OrderedDict
-from gns3server.utils.interfaces import interfaces
-from gns3server.utils.asyncio import subprocess_check_output
+
from gns3server.utils import parse_version
+from gns3server.utils.asyncio import subprocess_check_output
+from gns3server.utils.interfaces import interfaces
log = logging.getLogger(__name__)
from gns3server.compute.base_manager import BaseManager
-from gns3server.compute.vmware.vmware_vm import VMwareVM
from gns3server.compute.vmware.vmware_error import VMwareError
+from gns3server.compute.vmware.vmware_vm import VMwareVM
class VMware(BaseManager):
diff --git a/gns3server/compute/vmware/vmware_vm.py b/gns3server/compute/vmware/vmware_vm.py
index b56b420a2..f4636f55a 100644
--- a/gns3server/compute/vmware/vmware_vm.py
+++ b/gns3server/compute/vmware/vmware_vm.py
@@ -18,25 +18,24 @@
VMware VM instance.
"""
-import sys
-import os
import asyncio
-import tempfile
+import logging
+import os
import platform
+import sys
+import tempfile
+from collections import OrderedDict
-from gns3server.utils.asyncio.ssh_server import AsyncioSSHServer
-from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
-from gns3server.utils.asyncio.serial import asyncio_open_serial
from gns3server.utils import parse_version
from gns3server.utils.asyncio import locking
-from collections import OrderedDict
-from .vmware_error import VMwareError
-from ..nios.nio_udp import NIOUDP
+from gns3server.utils.asyncio.serial import asyncio_open_serial
+from gns3server.utils.asyncio.ssh_server import AsyncioSSHServer
+from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
+
from ..adapters.ethernet_adapter import EthernetAdapter
from ..base_node import BaseNode
-
-
-import logging
+from ..nios.nio_udp import NIOUDP
+from .vmware_error import VMwareError
log = logging.getLogger(__name__)
diff --git a/gns3server/compute/vpcs/__init__.py b/gns3server/compute/vpcs/__init__.py
index d9073a193..15ab54f3e 100644
--- a/gns3server/compute/vpcs/__init__.py
+++ b/gns3server/compute/vpcs/__init__.py
@@ -18,8 +18,8 @@
VPCS server module.
"""
-import os
import asyncio
+import os
from ..base_manager import BaseManager
from .vpcs_error import VPCSError
diff --git a/gns3server/compute/vpcs/vpcs_vm.py b/gns3server/compute/vpcs/vpcs_vm.py
index c72405543..af0acf72e 100644
--- a/gns3server/compute/vpcs/vpcs_vm.py
+++ b/gns3server/compute/vpcs/vpcs_vm.py
@@ -19,27 +19,23 @@ VPCS VM management (creates command line, processes, files etc.) in
order to run a VPCS VM.
"""
+import asyncio
+import logging
import os
-import sys
+import re
+import shutil
+import signal
import socket
import subprocess
-import signal
-import re
-import asyncio
-import shutil
+import sys
-from gns3server.utils.asyncio import wait_for_process_termination
-from gns3server.utils.asyncio import monitor_process
-from gns3server.utils.asyncio import subprocess_check_output
from gns3server.utils import parse_version
+from gns3server.utils.asyncio import monitor_process, subprocess_check_output, wait_for_process_termination
-from .vpcs_error import VPCSError
from ..adapters.ethernet_adapter import EthernetAdapter
-from ..nios.nio_udp import NIOUDP
from ..base_node import BaseNode
-
-
-import logging
+from ..nios.nio_udp import NIOUDP
+from .vpcs_error import VPCSError
log = logging.getLogger(__name__)
diff --git a/gns3server/db/models/__init__.py b/gns3server/db/models/__init__.py
index e5e234be4..cf6acc92f 100644
--- a/gns3server/db/models/__init__.py
+++ b/gns3server/db/models/__init__.py
@@ -15,18 +15,16 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from .base import Base
from .acl import ACE
-from .users import User, UserGroup
-from .roles import Role
-from .privileges import Privilege
+from .api_keys import ApiKey
+from .base import Base
from .computes import Compute
from .images import Image, ImageSyncJob
-from .pools import Resource, ResourcePool
from .llm_model_configs import LLMModelConfig
-from .api_keys import ApiKey
+from .pools import Resource, ResourcePool
+from .privileges import Privilege
+from .roles import Role
from .templates import (
- Template,
CloudTemplate,
DockerTemplate,
DynamipsTemplate,
@@ -34,7 +32,9 @@ from .templates import (
EthernetSwitchTemplate,
IOUTemplate,
QemuTemplate,
+ Template,
VirtualBoxTemplate,
VMwareTemplate,
VPCSTemplate,
)
+from .users import User, UserGroup
diff --git a/gns3server/db/models/acl.py b/gns3server/db/models/acl.py
index fc75eedac..19e57d20f 100644
--- a/gns3server/db/models/acl.py
+++ b/gns3server/db/models/acl.py
@@ -15,12 +15,12 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from sqlalchemy import Column, String, Boolean, ForeignKey, CheckConstraint
+import logging
+
+from sqlalchemy import Boolean, CheckConstraint, Column, ForeignKey, String
from sqlalchemy.orm import relationship
-from .base import BaseTable, generate_uuid, GUID
-
-import logging
+from .base import GUID, BaseTable, generate_uuid
log = logging.getLogger(__name__)
diff --git a/gns3server/db/models/api_keys.py b/gns3server/db/models/api_keys.py
index ec320f9dd..b7bbb8c96 100644
--- a/gns3server/db/models/api_keys.py
+++ b/gns3server/db/models/api_keys.py
@@ -16,10 +16,10 @@
import uuid
-from sqlalchemy import Column, String, Boolean, DateTime, ForeignKey, func
+from sqlalchemy import Boolean, Column, DateTime, ForeignKey, String, func
from sqlalchemy.orm import Mapped, mapped_column
-from .base import BaseTable, GUID
+from .base import GUID, BaseTable
class ApiKey(BaseTable):
diff --git a/gns3server/db/models/base.py b/gns3server/db/models/base.py
index 5a185a437..522486e93 100644
--- a/gns3server/db/models/base.py
+++ b/gns3server/db/models/base.py
@@ -21,9 +21,9 @@ from typing import Optional
from fastapi.encoders import jsonable_encoder
from sqlalchemy import Column, DateTime, func, inspect
-from sqlalchemy.types import TypeDecorator, CHAR, VARCHAR
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
+from sqlalchemy.types import CHAR, VARCHAR, TypeDecorator
class Base(DeclarativeBase):
diff --git a/gns3server/db/models/computes.py b/gns3server/db/models/computes.py
index dff176cda..4561e9f82 100644
--- a/gns3server/db/models/computes.py
+++ b/gns3server/db/models/computes.py
@@ -15,9 +15,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from sqlalchemy import Column, String, Integer
+from sqlalchemy import Column, Integer, String
-from .base import BaseTable, GUID
+from .base import GUID, BaseTable
class Compute(BaseTable):
diff --git a/gns3server/db/models/images.py b/gns3server/db/models/images.py
index d5b323564..139f9054d 100644
--- a/gns3server/db/models/images.py
+++ b/gns3server/db/models/images.py
@@ -15,11 +15,10 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from sqlalchemy import Table, Column, String, ForeignKey, BigInteger, Integer, DateTime, JSON, Boolean
+from sqlalchemy import JSON, BigInteger, Boolean, Column, DateTime, ForeignKey, Integer, String, Table
from sqlalchemy.orm import Mapped, mapped_column, relationship
-from .base import Base, BaseTable, GUID
-
+from .base import GUID, Base, BaseTable
image_template_map = Table(
"image_template_map",
diff --git a/gns3server/db/models/llm_model_configs.py b/gns3server/db/models/llm_model_configs.py
index 4a95719f4..a710948a4 100644
--- a/gns3server/db/models/llm_model_configs.py
+++ b/gns3server/db/models/llm_model_configs.py
@@ -15,12 +15,12 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from sqlalchemy import Column, Boolean, ForeignKey, CheckConstraint, Index, Integer, String, text, JSON
+import logging
+
+from sqlalchemy import JSON, Boolean, CheckConstraint, Column, ForeignKey, Index, Integer, String, text
from sqlalchemy.orm import Mapped, mapped_column, relationship
-from .base import BaseTable, generate_uuid, GUID
-
-import logging
+from .base import GUID, BaseTable, generate_uuid
log = logging.getLogger(__name__)
diff --git a/gns3server/db/models/pools.py b/gns3server/db/models/pools.py
index cd6616429..49ceaf5b5 100644
--- a/gns3server/db/models/pools.py
+++ b/gns3server/db/models/pools.py
@@ -15,14 +15,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import logging
import uuid
-from sqlalchemy import Table, Column, String, ForeignKey
+from sqlalchemy import Column, ForeignKey, String, Table
from sqlalchemy.orm import Mapped, mapped_column, relationship
-from .base import Base, BaseTable, generate_uuid, GUID
-
-import logging
+from .base import GUID, Base, BaseTable, generate_uuid
log = logging.getLogger(__name__)
diff --git a/gns3server/db/models/privileges.py b/gns3server/db/models/privileges.py
index 49a904ed8..5bf99cd11 100644
--- a/gns3server/db/models/privileges.py
+++ b/gns3server/db/models/privileges.py
@@ -15,12 +15,12 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from sqlalchemy import Table, Column, String, ForeignKey, event
+import logging
+
+from sqlalchemy import Column, ForeignKey, String, Table, event
from sqlalchemy.orm import relationship
-from .base import Base, BaseTable, generate_uuid, GUID
-
-import logging
+from .base import GUID, Base, BaseTable, generate_uuid
log = logging.getLogger(__name__)
diff --git a/gns3server/db/models/roles.py b/gns3server/db/models/roles.py
index b56b6ef95..962070364 100644
--- a/gns3server/db/models/roles.py
+++ b/gns3server/db/models/roles.py
@@ -15,16 +15,15 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import logging
import uuid
-from sqlalchemy import Column, String, Boolean, event
+from sqlalchemy import Boolean, Column, String, event
from sqlalchemy.orm import Mapped, mapped_column, relationship
-from .base import BaseTable, generate_uuid, GUID
+from .base import GUID, BaseTable, generate_uuid
from .privileges import privilege_role_map
-import logging
-
log = logging.getLogger(__name__)
diff --git a/gns3server/db/models/templates.py b/gns3server/db/models/templates.py
index 0450be881..73d18e8b7 100644
--- a/gns3server/db/models/templates.py
+++ b/gns3server/db/models/templates.py
@@ -19,10 +19,10 @@
import uuid
from typing import Optional
-from sqlalchemy import Boolean, Column, String, Integer, Float, ForeignKey, JSON
+from sqlalchemy import JSON, Boolean, Column, Float, ForeignKey, Integer, String
from sqlalchemy.orm import Mapped, mapped_column, relationship
-from .base import BaseTable, generate_uuid, GUID
+from .base import GUID, BaseTable, generate_uuid
from .images import image_template_map
diff --git a/gns3server/db/models/users.py b/gns3server/db/models/users.py
index a66d20025..6c74a720c 100644
--- a/gns3server/db/models/users.py
+++ b/gns3server/db/models/users.py
@@ -15,19 +15,18 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import logging
+import uuid
from datetime import datetime
from typing import Optional
-from sqlalchemy import Table, Boolean, Column, Integer, String, DateTime, ForeignKey, event
+from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Table, event
from sqlalchemy.orm import Mapped, mapped_column, relationship
-from .base import Base, BaseTable, generate_uuid, GUID
-
from gns3server.config import Config
from gns3server.services import auth_service
-import logging
-import uuid
+from .base import GUID, Base, BaseTable, generate_uuid
log = logging.getLogger(__name__)
diff --git a/gns3server/db/repositories/api_keys.py b/gns3server/db/repositories/api_keys.py
index 1cbfdf25b..2f53824cb 100644
--- a/gns3server/db/repositories/api_keys.py
+++ b/gns3server/db/repositories/api_keys.py
@@ -14,18 +14,19 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from uuid import UUID
-from typing import Optional, List, cast
+import logging
from datetime import datetime, timezone
-from sqlalchemy import select, update, delete, func
+from typing import List, Optional, cast
+from uuid import UUID
+
+from sqlalchemy import delete, func, select, update
from sqlalchemy.engine import CursorResult
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
-from .base import BaseRepository
import gns3server.db.models as models
-import logging
+from .base import BaseRepository
log = logging.getLogger(__name__)
diff --git a/gns3server/db/repositories/computes.py b/gns3server/db/repositories/computes.py
index df9e5932d..3ccbc668b 100644
--- a/gns3server/db/repositories/computes.py
+++ b/gns3server/db/repositories/computes.py
@@ -15,18 +15,18 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+from typing import List, Optional, Union, cast
from uuid import UUID
-from typing import Optional, List, Union
-from sqlalchemy import select, update, delete
-from sqlalchemy.ext.asyncio import AsyncSession
-from sqlalchemy.engine import CursorResult
-from typing import cast
-from .base import BaseRepository
+from sqlalchemy import delete, select, update
+from sqlalchemy.engine import CursorResult
+from sqlalchemy.ext.asyncio import AsyncSession
import gns3server.db.models as models
from gns3server import schemas
+from .base import BaseRepository
+
class ComputesRepository(BaseRepository):
def __init__(self, db_session: AsyncSession) -> None:
diff --git a/gns3server/db/repositories/images.py b/gns3server/db/repositories/images.py
index 1d52295e7..dfdff06fb 100644
--- a/gns3server/db/repositories/images.py
+++ b/gns3server/db/repositories/images.py
@@ -15,23 +15,22 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import os
import asyncio
+import logging
+import os
from datetime import datetime, timezone
+from typing import Callable, List, Optional, cast
-from typing import Optional, List, Callable, cast
-from sqlalchemy import select, delete, update
+from sqlalchemy import delete, select, update
from sqlalchemy.engine import CursorResult
-from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.exc import IntegrityError
+from sqlalchemy.ext.asyncio import AsyncSession
+
+import gns3server.db.models as models
from gns3server.utils.image_inventory import fingerprint, image_lock, normalized_path
from .base import BaseRepository
-import gns3server.db.models as models
-
-import logging
-
log = logging.getLogger(__name__)
@@ -73,7 +72,7 @@ class ImagesRepository(BaseRepository):
async def is_usable(self, image: models.Image) -> bool:
"""Validate a checksum candidate without trusting stale catalog/sidecar data."""
- from gns3server.utils.images import inspect_image_file, InvalidImageError
+ from gns3server.utils.images import InvalidImageError, inspect_image_file
try:
current = await asyncio.to_thread(fingerprint, image.path)
diff --git a/gns3server/db/repositories/llm_model_configs.py b/gns3server/db/repositories/llm_model_configs.py
index 6e59d1b3a..f17991f10 100644
--- a/gns3server/db/repositories/llm_model_configs.py
+++ b/gns3server/db/repositories/llm_model_configs.py
@@ -15,16 +15,17 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from uuid import UUID
-from typing import Optional, List, Dict, Any, cast
-from sqlalchemy import select, update, delete, and_
-from sqlalchemy.engine import CursorResult
-from datetime import datetime
-
import logging
+from datetime import datetime
+from typing import Any, Dict, List, Optional, cast
+from uuid import UUID
+
+from sqlalchemy import and_, delete, select, update
+from sqlalchemy.engine import CursorResult
+
+import gns3server.db.models as models
from .base import BaseRepository
-import gns3server.db.models as models
log = logging.getLogger(__name__)
diff --git a/gns3server/db/repositories/pools.py b/gns3server/db/repositories/pools.py
index a9144166e..d5ead9e05 100644
--- a/gns3server/db/repositories/pools.py
+++ b/gns3server/db/repositories/pools.py
@@ -15,19 +15,19 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import logging
+from typing import List, Optional, Union, cast
from uuid import UUID
-from typing import Optional, List, Union, cast
-from sqlalchemy import select, update, delete
+
+from sqlalchemy import delete, select, update
from sqlalchemy.engine import CursorResult
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
-from .base import BaseRepository
-
import gns3server.db.models as models
from gns3server import schemas
-import logging
+from .base import BaseRepository
log = logging.getLogger(__name__)
diff --git a/gns3server/db/repositories/rbac.py b/gns3server/db/repositories/rbac.py
index 72cb1f954..4417e901d 100644
--- a/gns3server/db/repositories/rbac.py
+++ b/gns3server/db/repositories/rbac.py
@@ -15,20 +15,20 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from uuid import UUID
+import logging
+from typing import List, Optional, Union, cast
from urllib.parse import urlparse
-from typing import Optional, List, Union, cast
-from sqlalchemy import select, update, delete
+from uuid import UUID
+
+from sqlalchemy import delete, select, update
from sqlalchemy.engine import CursorResult
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
-from .base import BaseRepository
-
import gns3server.db.models as models
from gns3server import schemas
-import logging
+from .base import BaseRepository
log = logging.getLogger(__name__)
diff --git a/gns3server/db/repositories/templates.py b/gns3server/db/repositories/templates.py
index b92dd7fd7..9369dc2cc 100644
--- a/gns3server/db/repositories/templates.py
+++ b/gns3server/db/repositories/templates.py
@@ -15,25 +15,25 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import logging
import os
import uuid
-import logging
-
+from typing import List, Optional, Union, cast
from uuid import UUID
-from typing import List, Union, Optional, cast
-from sqlalchemy import select, delete
+
+from sqlalchemy import delete, select
from sqlalchemy.engine import CursorResult
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from sqlalchemy.orm.session import make_transient
-from .base import BaseRepository
-
import gns3server.db.models as models
from gns3server import schemas
from gns3server.utils.image_inventory import image_lock
from gns3server.controller.controller_error import ControllerNotFoundError
+from .base import BaseRepository
+
log = logging.getLogger(__name__)
TEMPLATE_TYPE_TO_MODEL = {
diff --git a/gns3server/db/repositories/users.py b/gns3server/db/repositories/users.py
index 556185272..9ab51eaa8 100644
--- a/gns3server/db/repositories/users.py
+++ b/gns3server/db/repositories/users.py
@@ -15,20 +15,20 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import logging
+from typing import List, Optional, Union, cast
from uuid import UUID
-from typing import Optional, List, Union, cast
-from sqlalchemy import select, update, delete, func
+
+from sqlalchemy import delete, func, select, update
from sqlalchemy.engine import CursorResult
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
-from .base import BaseRepository
-
import gns3server.db.models as models
from gns3server import schemas
from gns3server.services import auth_service
-import logging
+from .base import BaseRepository
log = logging.getLogger(__name__)
diff --git a/gns3server/db/tasks.py b/gns3server/db/tasks.py
index c00abb6e1..efa191762 100644
--- a/gns3server/db/tasks.py
+++ b/gns3server/db/tasks.py
@@ -15,30 +15,29 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+import logging
import os
+from typing import List, Optional
+import sqlalchemy as sa
+from alembic import command, config
+from alembic.runtime.migration import MigrationContext
+from alembic.script import ScriptDirectory
+from alembic.util.exc import CommandError
from fastapi import FastAPI
from pydantic import ValidationError
-from typing import List, Optional
from sqlalchemy import event
from sqlalchemy.engine import Engine
from sqlalchemy.exc import SQLAlchemyError
-import sqlalchemy as sa
-from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
-from alembic import command, config
-from alembic.script import ScriptDirectory
-from alembic.runtime.migration import MigrationContext
-from alembic.util.exc import CommandError
+from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
+from gns3server import schemas
+from gns3server.config import Config
from gns3server.db.repositories.computes import ComputesRepository
from gns3server.db.repositories.images import ImagesRepository
from gns3server.utils.images import read_image_info
-from gns3server import schemas
from .models import Base
-from gns3server.config import Config
-
-import logging
log = logging.getLogger(__name__)
@@ -141,6 +140,7 @@ async def connect_to_db(app: FastAPI) -> None:
# Ensure the additive schema before stamping the current head.
def upgrade_inventory(connection):
from alembic.operations import Operations
+
from gns3server.db_migrations.versions.d9e8a2b7c401_image_inventory_reconciliation import (
upgrade,
)
@@ -230,6 +230,7 @@ async def get_user_llm_config_full(user_id: str, app: FastAPI) -> Optional[dict]
or None if not found.
"""
from uuid import UUID
+
from gns3server.db.repositories.llm_model_configs import LLMModelConfigsRepository
from gns3server.utils.encryption import decrypt, is_encrypted
diff --git a/gns3server/services/__init__.py b/gns3server/services/__init__.py
index 572a235a2..a1701f719 100644
--- a/gns3server/services/__init__.py
+++ b/gns3server/services/__init__.py
@@ -14,8 +14,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from .authentication import AuthService
from .access_tickets import AccessTicketService
+from .authentication import AuthService
auth_service = AuthService()
access_ticket_service = AccessTicketService()
diff --git a/gns3server/services/authentication.py b/gns3server/services/authentication.py
index c507c01a8..ecca18578 100644
--- a/gns3server/services/authentication.py
+++ b/gns3server/services/authentication.py
@@ -14,22 +14,22 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from joserfc import jwt
-from joserfc.jwk import OctKey
-from joserfc.errors import JoseError, BadSignatureError
import base64
import json
+import logging
import time
from datetime import datetime, timedelta, timezone
-import bcrypt
-
from typing import Optional
+
+import bcrypt
from fastapi import HTTPException, status
-from gns3server.schemas.controller.tokens import TokenData
-from gns3server.config import Config
+from joserfc import jwt
+from joserfc.errors import BadSignatureError, JoseError
+from joserfc.jwk import OctKey
from pydantic import ValidationError
-import logging
+from gns3server.config import Config
+from gns3server.schemas.controller.tokens import TokenData
log = logging.getLogger(__name__)
diff --git a/gns3server/services/computes.py b/gns3server/services/computes.py
index c3e3dad80..c8d2b33fe 100644
--- a/gns3server/services/computes.py
+++ b/gns3server/services/computes.py
@@ -15,19 +15,18 @@
# along with this program. If not, see .
-from uuid import UUID
from typing import List, Union
+from uuid import UUID
-from gns3server import schemas
import gns3server.db.models as models
-
-from gns3server.db.repositories.computes import ComputesRepository
+from gns3server import schemas
from gns3server.controller import Controller
from gns3server.controller.controller_error import (
ControllerBadRequestError,
- ControllerNotFoundError,
ControllerForbiddenError,
+ ControllerNotFoundError,
)
+from gns3server.db.repositories.computes import ComputesRepository
class ComputesService:
diff --git a/gns3server/services/templates.py b/gns3server/services/templates.py
index c4fd274ed..fc5377ff2 100644
--- a/gns3server/services/templates.py
+++ b/gns3server/services/templates.py
@@ -16,23 +16,22 @@
import os
import uuid
-import pydantic
-
-from uuid import UUID
-from fastapi.encoders import jsonable_encoder
from typing import List, Optional
+from uuid import UUID
+import pydantic
+from fastapi.encoders import jsonable_encoder
+
+import gns3server.db.models as models
from gns3server import schemas
from gns3server.config import Config
-import gns3server.db.models as models
-from gns3server.db.repositories.templates import TemplatesRepository
from gns3server.controller.controller_error import (
- ControllerError,
ControllerBadRequestError,
- ControllerNotFoundError,
+ ControllerError,
ControllerForbiddenError,
+ ControllerNotFoundError,
)
-
+from gns3server.db.repositories.templates import TemplatesRepository
TEMPLATE_TYPE_TO_SCHEMA: dict[str, type[pydantic.BaseModel]] = {
"cloud": schemas.CloudTemplate,