main
py 75 lines 2.88 KB
Raw
1 from fastapi import APIRouter
2 from fastapi import Depends
3 from fastapi import HTTPException
4 from fastapi import Security
5 from loguru import logger
6 from sqlalchemy import select
7 from sqlalchemy.ext.asyncio import AsyncSession
8
9 from app.auth.utils import AuthHandler
10 from app.db.db_session import get_db
11 from app.network_connectors.models.network_connectors import (
12 CustomerNetworkConnectorsMeta,
13 )
14 from app.stack_provisioning.graylog.schema.decommission import (
15 DecommissionNetworkContentPackRequest,
16 )
17 from app.stack_provisioning.graylog.schema.decommission import (
18 DecommissionNetworkContentPackResponse,
19 )
20 from app.stack_provisioning.graylog.services.decommission import (
21 decommission_network_connector,
22 )
23
24 stack_decommissioning_graylog_router = APIRouter()
25
26
27 async def get_network_connectors_meta_by_customer_code_and_connector_name(
28 customer_code: str,
29 network_connector_name: str,
30 session: AsyncSession,
31 ) -> CustomerNetworkConnectorsMeta:
32 """
33 Retrieves the network connector meta by customer code and connector name.
34
35 Args:
36 customer_code (str): The code of the customer.
37 network_connector_name (str): The name of the network connector.
38 session (AsyncSession): The async session object for database operations.
39
40 Returns:
41 CustomerNetworkConnectorsMeta: The network connector meta for the customer.
42 """
43 stmt = select(CustomerNetworkConnectorsMeta).filter(
44 CustomerNetworkConnectorsMeta.customer_code == customer_code,
45 CustomerNetworkConnectorsMeta.network_connector_name == network_connector_name,
46 )
47 result = await session.execute(stmt)
48 return result.scalars().first()
49
50
51 @stack_decommissioning_graylog_router.post(
52 "/graylog/decommission/network_connector",
53 response_model=DecommissionNetworkContentPackResponse,
54 description="Decommission the Network Connector for the customer",
55 dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))],
56 )
57 async def decommission_network_connector_route(
58 decommission_request: DecommissionNetworkContentPackRequest,
59 session: AsyncSession = Depends(get_db),
60 ) -> DecommissionNetworkContentPackResponse:
61 """
62 Decommission the Network Connector for the customer
63 """
64 logger.info(f"Decommissioning the Network Connector for {decommission_request.network_connector.name}...")
65 network_connector_details = await get_network_connectors_meta_by_customer_code_and_connector_name(
66 decommission_request.customer_code,
67 decommission_request.network_connector.name,
68 session,
69 )
70 if network_connector_details is None:
71 raise HTTPException(
72 status_code=404,
73 detail=f"Network Connector {decommission_request.network_connector.name} not found for customer {decommission_request.customer_code}",
74 )
75 return await decommission_network_connector(network_connector_details, session)