style: sort imports in controller API routes

This commit is contained in:
Mark Paronyan 2026-09-30 20:51:10 +03:00
parent b9cdac487c
commit 4ebc941951
28 changed files with 227 additions and 231 deletions

View File

@ -21,9 +21,7 @@ from gns3server.agent import AI_COPILOT_AVAILABLE
# Conditionally import AI-dependent routes
if AI_COPILOT_AVAILABLE:
from . import chat
from . import copilot
from . import llm_model_configs
from . import chat, copilot, llm_model_configs
_chat_router = chat.router
_copilot_router = copilot.router
@ -44,28 +42,29 @@ else:
)
from . import controller
from . import appliances
from . import computes
from . import drawings
from . import gns3vm
from . import links
from . import nodes
from . import projects
from . import snapshots
from . import symbols
from . import templates
from . import images
from . import users
from . import groups
from . import roles
from . import acl
from . import pools
from . import privileges
from . import api_keys
from . import netmiko
from . import settings
from . import (
acl,
api_keys,
appliances,
computes,
controller,
drawings,
gns3vm,
groups,
images,
links,
netmiko,
nodes,
pools,
privileges,
projects,
roles,
settings,
snapshots,
symbols,
templates,
users,
)
from .dependencies.authentication import get_current_active_user
router = APIRouter()

View File

@ -19,29 +19,27 @@
API routes for ACL.
"""
import logging
import re
from typing import Iterator, List, Optional, Sequence
from uuid import UUID
from fastapi import APIRouter, Depends, Request, status
from fastapi.routing import APIRoute, _IncludedRouter
from starlette.routing import BaseRoute, Mount
from uuid import UUID
from typing import Iterator, List, Optional, Sequence
from gns3server import schemas
from gns3server.controller.controller_error import ControllerBadRequestError, ControllerNotFoundError
from gns3server.controller import Controller
import gns3server.db.models as models
from gns3server.db.repositories.users import UsersRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerBadRequestError, ControllerNotFoundError
from gns3server.db.repositories.images import ImagesRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.templates import TemplatesRepository
from gns3server.db.repositories.users import UsersRepository
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege
import logging
log = logging.getLogger(__name__)
router = APIRouter()

View File

@ -18,18 +18,18 @@
API routes for API key management.
"""
import logging
import secrets
import bcrypt
from uuid import uuid4, UUID
from uuid import UUID, uuid4
from fastapi import APIRouter, Depends, status, HTTPException
import bcrypt
from fastapi import APIRouter, Depends, HTTPException, status
from gns3server import schemas
from gns3server.db.repositories.api_keys import ApiKeysRepository
from .dependencies.database import get_repository
from .dependencies.authentication import get_current_active_user
import logging
from .dependencies.authentication import get_current_active_user
from .dependencies.database import get_repository
log = logging.getLogger(__name__)

View File

@ -19,24 +19,22 @@ API routes for appliances.
"""
import logging
from typing import List, Optional, Union
from uuid import UUID
from fastapi import APIRouter, Depends, status
from typing import Optional, List, Union
from uuid import UUID
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerError, ControllerBadRequestError, ControllerNotFoundError
from gns3server.controller.controller_error import ControllerBadRequestError, ControllerError, ControllerNotFoundError
from gns3server.db.repositories.images import ImagesRepository
from gns3server.db.repositories.templates import TemplatesRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.templates import TemplatesRepository
from .dependencies.authentication import get_current_active_user
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege
log = logging.getLogger(__name__)
router = APIRouter()

View File

@ -24,16 +24,16 @@ import json
import logging
import uuid
from typing import Any, List, Optional
from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, Request, status
from fastapi.responses import StreamingResponse
from uuid import UUID
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.controller.project import Project
from gns3server.controller.controller_error import ControllerNotFoundError
from gns3server.agent.gns3_copilot.project_agent_manager import get_project_agent_manager
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerNotFoundError
from gns3server.controller.project import Project
from gns3server.db.tasks import get_user_llm_config_full
from .dependencies.authentication import get_current_active_user

View File

@ -18,16 +18,17 @@
API routes for computes.
"""
from fastapi import APIRouter, Body, Depends, status
from typing import Any, List, Union, Optional
from typing import Any, List, Optional, Union
from uuid import UUID
from gns3server.controller import Controller
from fastapi import APIRouter, Body, Depends, status
import gns3server.db.models as models
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.db.repositories.computes import ComputesRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.services.computes import ComputesService
from gns3server import schemas
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege

View File

@ -15,30 +15,28 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import asyncio
import signal
import logging
import os
import signal
import time
import psutil
from typing import Dict, List
from fastapi import APIRouter, FastAPI, Request, Depends, WebSocket, WebSocketDisconnect, status
from fastapi.responses import StreamingResponse
import psutil
from fastapi import APIRouter, Depends, FastAPI, Request, WebSocket, WebSocketDisconnect, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse
from fastapi.routing import Mount
from websockets.exceptions import ConnectionClosed, WebSocketException
from typing import List, Dict
from gns3server import schemas
from gns3server.agent.web_wireshark.stats import collect_webwireshark_stats
from gns3server.config import Config
from gns3server.controller import Controller
from gns3server.agent.web_wireshark.stats import collect_webwireshark_stats
from gns3server.version import __version__
from gns3server.controller.controller_error import ControllerError, ControllerForbiddenError
from gns3server import schemas
from gns3server.version import __version__
from .dependencies.authentication import get_current_active_user, get_current_active_user_from_websocket
import logging
log = logging.getLogger(__name__)
router = APIRouter()

View File

@ -21,7 +21,9 @@ API routes for GNS3 Copilot global operations (non-project).
import logging
from fastapi import APIRouter, Depends, HTTPException, status
from gns3server import schemas
from .dependencies.authentication import get_current_active_user
log = logging.getLogger(__name__)

View File

@ -17,21 +17,22 @@
import asyncio
import hashlib
import logging
import bcrypt
from fastapi import Request, Query, Depends, HTTPException, WebSocket, status
from fastapi.security import OAuth2PasswordBearer
from typing import Optional
from uuid import UUID
from gns3server import schemas
import bcrypt
from fastapi import Depends, HTTPException, Query, Request, WebSocket, status
from fastapi.security import OAuth2PasswordBearer
import gns3server.db.models as models
from gns3server import schemas
from gns3server.db.repositories.api_keys import ApiKeysRepository
from gns3server.db.repositories.users import UsersRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.users import UsersRepository
from gns3server.schemas.controller.tokens import TokenData
from gns3server.services import auth_service, access_ticket_service
from gns3server.services import access_ticket_service, auth_service
from gns3server.services.access_tickets import TICKET_PREFIX
from .database import get_repository
log = logging.getLogger(__name__)

View File

@ -15,9 +15,10 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from typing import AsyncGenerator, Callable, Type
from fastapi import Depends
from starlette.requests import HTTPConnection
from sqlalchemy.ext.asyncio import AsyncSession
from starlette.requests import HTTPConnection
from gns3server.db.repositories.base import BaseRepository

View File

@ -14,16 +14,17 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
import re
from fastapi import Request, WebSocket, Depends, HTTPException
from fastapi import Depends, HTTPException, Request, WebSocket
from gns3server import schemas
from gns3server.db.repositories.rbac import RbacRepository
from .authentication import get_current_active_user, get_current_active_user_from_websocket
from .database import get_repository
import logging
log = logging.getLogger()

View File

@ -18,14 +18,15 @@
API routes for drawings.
"""
from fastapi import APIRouter, Depends, status
from fastapi.encoders import jsonable_encoder
from typing import Any, List
from uuid import UUID
from fastapi import APIRouter, Depends, status
from fastapi.encoders import jsonable_encoder
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.db.repositories.rbac import RbacRepository
from gns3server import schemas
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege

View File

@ -19,12 +19,13 @@
API routes for managing the GNS3 VM.
"""
from fastapi import APIRouter
from fastapi.encoders import jsonable_encoder
from typing import List
from gns3server.controller import Controller
from fastapi import APIRouter
from fastapi.encoders import jsonable_encoder
from gns3server import schemas
from gns3server.controller import Controller
router = APIRouter()

View File

@ -19,26 +19,25 @@
API routes for user groups.
"""
from fastapi import APIRouter, Depends, status
from uuid import UUID
import logging
from typing import List, Optional
from uuid import UUID
from gns3server import schemas
from gns3server.controller.controller_error import (
ControllerError,
ControllerBadRequestError,
ControllerNotFoundError,
ControllerForbiddenError,
)
from fastapi import APIRouter, Depends, status
import gns3server.db.models as models
from gns3server.db.repositories.users import UsersRepository
from gns3server import schemas
from gns3server.controller.controller_error import (
ControllerBadRequestError,
ControllerError,
ControllerForbiddenError,
ControllerNotFoundError,
)
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.users import UsersRepository
from .dependencies.rbac import has_privilege
from .dependencies.database import get_repository
import logging
from .dependencies.rbac import has_privilege
log = logging.getLogger(__name__)

View File

@ -18,40 +18,40 @@
API routes for images.
"""
import os
import logging
import urllib.parse
import os
import tempfile
import urllib.parse
from typing import List, Literal, Optional
from fastapi import APIRouter, Request, Response, Depends, Query, status
from fastapi import APIRouter, Depends, Query, Request, Response, status
from fastapi.encoders import jsonable_encoder
from starlette.requests import ClientDisconnect
from sqlalchemy.orm.exc import MultipleResultsFound
from sqlalchemy.exc import SQLAlchemyError
from typing import List, Optional, Literal
from sqlalchemy.orm.exc import MultipleResultsFound
from starlette.requests import ClientDisconnect
import gns3server.db.models as models
from gns3server import schemas
from gns3server.config import Config
from gns3server.compute.qemu import Qemu
from gns3server.config import Config
from gns3server.controller import Controller
from gns3server.controller.controller_error import (
ControllerBadRequestError,
ControllerError,
ControllerForbiddenError,
ControllerNotFoundError,
)
from gns3server.db.repositories.images import ImagesRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.templates import TemplatesRepository
from gns3server.services.image_reconciliation import get_image_reconciliation_service
from gns3server.utils.image_inventory import ImageLockBusy, contained_path, fingerprint, image_lock, publish_image
from gns3server.utils.images import (
InvalidImageError,
write_image,
read_image_info,
default_images_directory,
get_builtin_disks,
)
import gns3server.db.models as models
from gns3server.db.repositories.images import ImagesRepository
from gns3server.db.repositories.templates import TemplatesRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.controller import Controller
from gns3server.services.image_reconciliation import get_image_reconciliation_service
from gns3server.utils.image_inventory import contained_path, image_lock, publish_image, fingerprint, ImageLockBusy
from gns3server.controller.controller_error import (
ControllerError,
ControllerNotFoundError,
ControllerForbiddenError,
ControllerBadRequestError,
read_image_info,
write_image,
)
from .dependencies.authentication import get_current_active_user

View File

@ -19,31 +19,30 @@ API routes for links.
"""
import asyncio
import logging
import os
import multidict
import aiohttp
from fastapi import APIRouter, Depends, Request, status, WebSocket
from fastapi.responses import FileResponse, StreamingResponse
from fastapi.encoders import jsonable_encoder
from typing import Any, List, Union
from uuid import UUID, uuid4
import aiohttp
import multidict
from fastapi import APIRouter, Depends, Request, WebSocket, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import FileResponse, StreamingResponse
from gns3server import schemas
from gns3server.agent.web_wireshark.manager import WebWiresharkManager
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerError
from gns3server.controller.link import _UNSET, Link
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.controller.link import Link, _UNSET
from gns3server.utils.http_client import HTTPClient
from gns3server.utils.port_allocator import link_id_to_port
from gns3server.utils.websocket_to_websocket import websocket_proxy
from gns3server import schemas
from gns3server.agent.web_wireshark.manager import WebWiresharkManager
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege, has_privilege_on_websocket
import logging
log = logging.getLogger(__name__)
responses: dict[int | str, dict[str, Any]] = {

View File

@ -19,24 +19,23 @@
API routes for LLM model configurations.
"""
from fastapi import APIRouter, Depends, HTTPException, status
from uuid import UUID
import logging
from typing import List
from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, status
from gns3server import schemas
from gns3server.controller.controller_error import (
ControllerBadRequestError,
ControllerNotFoundError,
)
from gns3server.db.repositories.llm_model_configs import LLMModelConfigsRepository
from gns3server.db.repositories.users import UsersRepository
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege
import logging
log = logging.getLogger(__name__)
router = APIRouter()

View File

@ -19,6 +19,7 @@
API routes for Netmiko metadata.
"""
import logging
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, status
@ -27,8 +28,6 @@ from gns3server import schemas
from .dependencies.authentication import get_current_active_user
import logging
log = logging.getLogger(__name__)

View File

@ -18,33 +18,32 @@
API routes for nodes.
"""
import aiohttp
import asyncio
import contextlib
import ipaddress
import logging
from typing import Any, Callable, List, Optional
from uuid import UUID
from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect, Request, Response, status, Query, HTTPException
import aiohttp
from fastapi import APIRouter, Depends, HTTPException, Query, Request, Response, WebSocket, WebSocketDisconnect, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse
from fastapi.routing import APIRoute
from typing import Any, List, Callable, Optional
from uuid import UUID
from gns3server.controller import Controller
from gns3server import schemas
from gns3server.config import Config
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerBadRequestError, ControllerForbiddenError
from gns3server.controller.node import Node
from gns3server.controller.project import Project
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.utils import force_unix_path
from gns3server.utils.http_client import HTTPClient
from gns3server.controller.controller_error import ControllerForbiddenError, ControllerBadRequestError
from gns3server.db.repositories.rbac import RbacRepository
from gns3server import schemas
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege, has_privilege_on_websocket
import logging
log = logging.getLogger(__name__)
node_locks: dict[str, dict[str, Any]] = {}

View File

@ -19,22 +19,21 @@
API routes for resource pools.
"""
from fastapi import APIRouter, Depends, status
from uuid import UUID
from typing import List, Optional
from gns3server import schemas
from gns3server.controller.controller_error import ControllerError, ControllerBadRequestError, ControllerNotFoundError
from gns3server.controller import Controller
import gns3server.db.models as models
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.pools import ResourcePoolsRepository
from .dependencies.rbac import has_privilege
from .dependencies.database import get_repository
import logging
from typing import List, Optional
from uuid import UUID
from fastapi import APIRouter, Depends, status
import gns3server.db.models as models
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerBadRequestError, ControllerError, ControllerNotFoundError
from gns3server.db.repositories.pools import ResourcePoolsRepository
from gns3server.db.repositories.rbac import RbacRepository
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege
log = logging.getLogger(__name__)

View File

@ -15,14 +15,16 @@
API route for privileges
"""
from typing import List
import gns3server.db.models as models
from gns3server.db.repositories.rbac import RbacRepository
from .dependencies.database import get_repository
from fastapi import APIRouter, Depends
import logging
from typing import List
from fastapi import APIRouter, Depends
import gns3server.db.models as models
from gns3server import schemas
from gns3server.db.repositories.rbac import RbacRepository
from .dependencies.database import get_repository
log = logging.getLogger(__name__)
router = APIRouter()

View File

@ -18,44 +18,45 @@
API routes for projects.
"""
import os
import asyncio
import logging
import os
import tempfile
import aiofiles
import time
import urllib.parse
import gns3server.utils.zipfile_zstd as zipfile
import logging
import aiofiles
import gns3server.utils.zipfile_zstd as zipfile
log = logging.getLogger()
from fastapi import APIRouter, Depends, Request, Body, HTTPException, status, WebSocket, WebSocketDisconnect
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse, FileResponse
from websockets.exceptions import ConnectionClosed, WebSocketException
from typing import Any, List, Optional
from uuid import UUID
from fastapi import APIRouter, Body, Depends, HTTPException, Request, WebSocket, WebSocketDisconnect, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import FileResponse, StreamingResponse
from websockets.exceptions import ConnectionClosed, WebSocketException
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.controller.project import Project
from gns3server.controller.link import _UNSET
from gns3server.controller.controller_error import ControllerError, ControllerBadRequestError
from gns3server.controller.import_project import import_project as import_controller_project
from gns3server.controller import Controller, marker_replay
from gns3server.controller.controller_error import ControllerBadRequestError, ControllerError
from gns3server.controller.export_project import export_project as export_controller_project
from gns3server.controller import marker_replay
from gns3server.controller.import_project import import_project as import_controller_project
from gns3server.controller.link import _UNSET
from gns3server.controller.marker_replay import SharkdError, SharkdMissingError
from gns3server.controller.project import Project
from gns3server.db.repositories.pools import ResourcePoolsRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.templates import TemplatesRepository
from gns3server.services.templates import TemplatesService
from gns3server.utils.asyncio import aiozipstream
from gns3server.utils.path import is_safe_path
from gns3server.db.repositories.templates import TemplatesRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.pools import ResourcePoolsRepository
from gns3server.services.templates import TemplatesService
from .dependencies.rbac import has_privilege, has_privilege_on_websocket
from .dependencies.authentication import get_current_active_user
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege, has_privilege_on_websocket
responses: dict[int | str, dict[str, Any]] = {
404: {"model": schemas.ErrorMessage, "description": "Could not find project"}

View File

@ -19,25 +19,25 @@
API routes for roles.
"""
from fastapi import APIRouter, Depends, status
from uuid import UUID
import logging
from typing import List, Optional
from uuid import UUID
from gns3server import schemas
from gns3server.controller.controller_error import (
ControllerError,
ControllerBadRequestError,
ControllerNotFoundError,
ControllerForbiddenError,
)
from fastapi import APIRouter, Depends, status
import gns3server.db.models as models
from gns3server import schemas
from gns3server.controller.controller_error import (
ControllerBadRequestError,
ControllerError,
ControllerForbiddenError,
ControllerNotFoundError,
)
from gns3server.db.repositories.rbac import RbacRepository
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege
import logging
log = logging.getLogger(__name__)
router = APIRouter()

View File

@ -19,8 +19,9 @@
API routes for managing the server settings (gns3_server.conf).
"""
from fastapi import APIRouter, Depends, HTTPException
import logging
from fastapi import APIRouter, Depends, HTTPException
from pydantic import ValidationError
from gns3server import schemas
@ -31,8 +32,6 @@ from gns3server.schemas.controller.settings import SECRET_MASK
from .dependencies.rbac import has_privilege
import logging
log = logging.getLogger(__name__)
router = APIRouter()

View File

@ -23,14 +23,15 @@ import logging
log = logging.getLogger()
from fastapi import APIRouter, Depends, status
from typing import Any, List
from uuid import UUID
from gns3server.controller.project import Project
from gns3server.db.repositories.rbac import RbacRepository
from fastapi import APIRouter, Depends, status
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.controller.project import Project
from gns3server.db.repositories.rbac import RbacRepository
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege

View File

@ -19,21 +19,20 @@
API routes for symbols.
"""
import logging
import os
from fastapi import APIRouter, Request, Depends, Response, status
from fastapi.responses import FileResponse
from typing import List
from gns3server.controller import Controller
from fastapi import APIRouter, Depends, Request, Response, status
from fastapi.responses import FileResponse
from gns3server import schemas
from gns3server.controller.controller_error import ControllerError, ControllerNotFoundError, ControllerForbiddenError
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerError, ControllerForbiddenError, ControllerNotFoundError
from gns3server.utils.get_resource import get_resource
from .dependencies.rbac import has_privilege
import logging
log = logging.getLogger(__name__)

View File

@ -18,30 +18,30 @@
API routes for templates.
"""
import os
import hashlib
import json
import logging
import os
log = logging.getLogger(__name__)
from fastapi import APIRouter, Request, HTTPException, Depends, Response, status, Query
from typing import Any, List, Optional, Union
from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, Query, Request, Response, status
from gns3server import schemas
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerBadRequestError, ControllerError
from gns3server.db.repositories.images import ImagesRepository
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.templates import TemplatesRepository
from gns3server.services.templates import TemplatesService
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.images import ImagesRepository
from gns3server.controller import Controller
from gns3server.controller.controller_error import ControllerError, ControllerBadRequestError
from gns3server.utils.images import get_builtin_disks
from .dependencies.authentication import get_current_active_user
from .dependencies.rbac import has_privilege
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege
responses: dict[int | str, dict[str, Any]] = {
404: {"model": schemas.ErrorMessage, "description": "Could not find template"}

View File

@ -19,30 +19,29 @@
API routes for users.
"""
import logging
from typing import List, Optional
from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, Response, status
from fastapi.security import OAuth2PasswordRequestForm
from uuid import UUID
from typing import List, Optional
from gns3server import schemas
from gns3server.controller.controller_error import (
ControllerError,
ControllerBadRequestError,
ControllerNotFoundError,
ControllerForbiddenError,
)
import gns3server.db.models as models
from gns3server.db.repositories.users import UsersRepository
from gns3server import schemas
from gns3server.controller.controller_error import (
ControllerBadRequestError,
ControllerError,
ControllerForbiddenError,
ControllerNotFoundError,
)
from gns3server.db.repositories.rbac import RbacRepository
from gns3server.db.repositories.users import UsersRepository
from gns3server.services import auth_service
from .dependencies.authentication import get_current_active_user
from .dependencies.database import get_repository
from .dependencies.rbac import has_privilege
import logging
log = logging.getLogger(__name__)
router = APIRouter()