From b9cdac487c35e633defb807609147de3ead73e2c Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Wed, 30 Sep 2026 20:51:07 +0300 Subject: [PATCH] style: sort imports in compute, db and services modules --- gns3server/compute/__init__.py | 6 +-- gns3server/compute/base_manager.py | 39 ++++++++++--------- gns3server/compute/base_node.py | 33 ++++++++-------- gns3server/compute/builtin/__init__.py | 6 +-- .../compute/builtin/builtin_node_factory.py | 6 +-- gns3server/compute/builtin/nodes/cloud.py | 15 ++++--- .../compute/builtin/nodes/ethernet_hub.py | 3 +- .../compute/builtin/nodes/ethernet_switch.py | 9 +++-- gns3server/compute/builtin/nodes/nat.py | 7 ++-- gns3server/compute/port_manager.py | 11 +++--- gns3server/compute/project.py | 20 +++++----- gns3server/compute/virtualbox/__init__.py | 8 ++-- .../compute/virtualbox/virtualbox_vm.py | 27 +++++++------ gns3server/compute/vmware/__init__.py | 20 +++++----- gns3server/compute/vmware/vmware_vm.py | 23 ++++++----- gns3server/compute/vpcs/__init__.py | 2 +- gns3server/compute/vpcs/vpcs_vm.py | 22 +++++------ gns3server/db/models/__init__.py | 14 +++---- gns3server/db/models/acl.py | 8 ++-- gns3server/db/models/api_keys.py | 4 +- gns3server/db/models/base.py | 2 +- gns3server/db/models/computes.py | 4 +- gns3server/db/models/images.py | 5 +-- gns3server/db/models/llm_model_configs.py | 8 ++-- gns3server/db/models/pools.py | 7 ++-- gns3server/db/models/privileges.py | 8 ++-- gns3server/db/models/roles.py | 7 ++-- gns3server/db/models/templates.py | 4 +- gns3server/db/models/users.py | 9 ++--- gns3server/db/repositories/api_keys.py | 11 +++--- gns3server/db/repositories/computes.py | 12 +++--- gns3server/db/repositories/images.py | 17 ++++---- .../db/repositories/llm_model_configs.py | 15 +++---- gns3server/db/repositories/pools.py | 10 ++--- gns3server/db/repositories/rbac.py | 12 +++--- gns3server/db/repositories/templates.py | 12 +++--- gns3server/db/repositories/users.py | 10 ++--- gns3server/db/tasks.py | 23 +++++------ gns3server/services/__init__.py | 2 +- gns3server/services/authentication.py | 16 ++++---- gns3server/services/computes.py | 9 ++--- gns3server/services/templates.py | 17 ++++---- 42 files changed, 247 insertions(+), 256 deletions(-) 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,