diff --git a/gso/api/api_v1/api.py b/gso/api/api_v1/api.py index 8166a11f53cad3c020b722974f6c96fc776e6cf1..b7ba2d520e2d082bc1e127d790f668f9bf69e5a3 100644 --- a/gso/api/api_v1/api.py +++ b/gso/api/api_v1/api.py @@ -2,12 +2,9 @@ from fastapi.param_functions import Depends from fastapi.routing import APIRouter - from orchestrator.security import opa_security_default from gso.api.api_v1.endpoints import imports api_router = APIRouter() -api_router.include_router( - imports.router, prefix="/imports", dependencies=[Depends(opa_security_default)] -) \ No newline at end of file +api_router.include_router(imports.router, prefix="/imports", dependencies=[Depends(opa_security_default)]) diff --git a/gso/api/api_v1/endpoints/imports.py b/gso/api/api_v1/endpoints/imports.py index fe510fea828bc8256924b5c5888774d3a30ea0df..48da3fd2172a49f2bdcd96af110634d122d2c661 100644 --- a/gso/api/api_v1/endpoints/imports.py +++ b/gso/api/api_v1/endpoints/imports.py @@ -1,5 +1,5 @@ import ipaddress -from typing import Dict, Any, Optional +from typing import Any, Dict, Optional from uuid import UUID from fastapi import HTTPException, status @@ -15,9 +15,9 @@ router = APIRouter() def start_process(process_name: str, data: dict) -> UUID: - """Utility function to start a process and handle common exceptions.""" + """Start a process and handle common exceptions.""" - pid = processes.start_process(process_name, [data]) + pid: UUID = processes.start_process(process_name, [data]) if pid is None: raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to start the process.") @@ -46,16 +46,19 @@ class SiteImport(BaseModel): @router.post("/sites", status_code=status.HTTP_201_CREATED, tags=["Import"]) def import_site(site: SiteImport) -> Dict[str, Any]: - """ - Import site by running the import_site workflow. + """Import site by running the import_site workflow. + Args: - - site: A SiteImport object containing site details. + ---- + site (SiteImport): The site information to be imported. Returns: - - A dictionary containing the detail message and the process id. + ------- + dict: A dictionary containing the process id of the started process and detail message. Raises: - - HTTPException: If there's an error in the process or if the site already exists. + ------ + HTTPException: If the site already exists or if there's an error in the process. """ try: subscription = subscriptions.retrieve_subscription_by_subscription_instance_value( @@ -88,18 +91,21 @@ class RouterImportModel(BaseModel): @router.post("/routers", status_code=status.HTTP_201_CREATED, tags=["Import"]) -def import_router(router_data: RouterImportModel): - """ - Import router by running the import_router workflow. +def import_router(router_data: RouterImportModel) -> Dict[str, Any]: + """Import a router by running the import_router workflow. + Args: - - router_data: A RouterImportModel object containing router details. + ---- + router_data (RouterImportModel): The router information to be imported. Returns: - - A dictionary containing the detail message and the process id. + ------- + dict: A dictionary containing the process id of the started process and detail message. Raises: - - HTTPException: If there's an error in the process. + ------ + HTTPException: If there's an error in the process. """ pid = start_process("import_router", router_data.dict()) - return {"detail": f"Router added successfully", "pid": pid} + return {"detail": "Router added successfully", "pid": pid} diff --git a/gso/cli/import_sites.py b/gso/cli/import_sites.py index 4a4af843d7f1f07b81163a73b9f9be45b376110a..36e0cb49f9afffaae7c68119cb635f1199c60321 100644 --- a/gso/cli/import_sites.py +++ b/gso/cli/import_sites.py @@ -4,7 +4,7 @@ app: typer.Typer = typer.Typer() @app.command() -def import_sites(): +def import_sites() -> None: """Import sites from a source.""" # TODO: Implement this CLI command to import sites from a source. typer.echo("Importing sites...") diff --git a/gso/services/crm.py b/gso/services/crm.py index cdff901f435787eda9fb759a81d6374ad998e3ae..92fb150d3281cbf2883c266d07f5525a88b9cfd9 100644 --- a/gso/services/crm.py +++ b/gso/services/crm.py @@ -1,8 +1,9 @@ -from typing import Optional +from typing import Any, Dict class CustomerNotFoundError(Exception): """Exception raised when a customer is not found.""" + pass @@ -15,7 +16,7 @@ def all_customers() -> list[dict]: ] -def get_customer_by_name(name: str) -> Optional[dict]: +def get_customer_by_name(name: str) -> Dict[str, Any]: for customer in all_customers(): if customer["name"] == name: return customer diff --git a/gso/workflows/tasks/import_router.py b/gso/workflows/tasks/import_router.py index c6cd8d062e9084377cd732e69d45d9d67374a7d6..5b0468b6e23f10060e49ad65f10678190af8d5a4 100644 --- a/gso/workflows/tasks/import_router.py +++ b/gso/workflows/tasks/import_router.py @@ -1,33 +1,33 @@ import ipaddress from typing import Optional +from uuid import UUID from orchestrator import workflow from orchestrator.db import ( ProductTable, - SubscriptionTable, - SubscriptionInstanceValueTable, - SubscriptionInstanceTable, ResourceTypeTable, + SubscriptionInstanceTable, + SubscriptionInstanceValueTable, + SubscriptionTable, ) -from orchestrator.domain.base import S from orchestrator.forms import FormPage from orchestrator.targets import Target -from orchestrator.types import FormGenerator, State, UUIDstr, SubscriptionLifecycle -from orchestrator.workflow import StepList, init, step, done -from orchestrator.workflows.steps import store_process_subscription, set_status, resync +from orchestrator.types import FormGenerator, State, SubscriptionLifecycle +from orchestrator.workflow import StepList, done, init, step +from orchestrator.workflows.steps import resync, set_status, store_process_subscription -from gso.products import Site from gso.products.product_blocks import router as router_pb -from gso.products.product_blocks.router import RouterVendor, RouterRole +from gso.products.product_blocks.router import RouterRole, RouterVendor from gso.products.product_types import router from gso.products.product_types.router import RouterInactive +from gso.products.product_types.site import Site from gso.services.crm import get_customer_by_name @step("Create subscription") def create_subscription(customer: str) -> State: - customer_id: UUIDstr = get_customer_by_name(customer)["id"] - product_id: UUIDstr = ProductTable.query.filter_by(name="Router").first().product_id + customer_id: UUID = get_customer_by_name(customer)["id"] + product_id: UUID = ProductTable.query.filter_by(name="Router").first().product_id subscription = RouterInactive.from_product_id(product_id, customer_id) return { @@ -61,7 +61,7 @@ def initial_input_form_generator() -> FormGenerator: return user_input.dict() -def get_site_by_name(site_name: str) -> S: +def get_site_by_name(site_name: str) -> Site: subscription = ( SubscriptionTable.query.join( ProductTable, SubscriptionInstanceTable, SubscriptionInstanceValueTable, ResourceTypeTable diff --git a/gso/workflows/tasks/import_site.py b/gso/workflows/tasks/import_site.py index 2dbc2a8a232589ffbb6b3115bf39d3be9ecf9cd5..d743628fdc9a96148ba83c3130e263182eb6e980 100644 --- a/gso/workflows/tasks/import_site.py +++ b/gso/workflows/tasks/import_site.py @@ -1,12 +1,11 @@ -from uuid import uuid4 +from uuid import UUID, uuid4 from orchestrator.db.models import ProductTable from orchestrator.forms import FormPage from orchestrator.targets import Target -from orchestrator.types import State, SubscriptionLifecycle, FormGenerator +from orchestrator.types import FormGenerator, State, SubscriptionLifecycle from orchestrator.workflow import StepList, done, init, step, workflow from orchestrator.workflows.steps import resync, set_status, store_process_subscription -from pydantic.types import UUID from gso.products.product_blocks.site import SiteTier from gso.products.product_types import site @@ -50,15 +49,14 @@ def generate_initial_input_form() -> FormGenerator: initial_input_form=generate_initial_input_form, ) def import_site() -> StepList: - """ - Workflow to import a site without provisioning it. - """ + """Workflow to import a site without provisioning it.""" + return ( - init - >> create_subscription - >> store_process_subscription(Target.CREATE) - >> initialize_subscription - >> set_status(SubscriptionLifecycle.ACTIVE) - >> resync - >> done + init + >> create_subscription + >> store_process_subscription(Target.CREATE) + >> initialize_subscription + >> set_status(SubscriptionLifecycle.ACTIVE) + >> resync + >> done )