Skip to content
Snippets Groups Projects

Feature/nat 217 import sites

Merged Neda Moeini requested to merge feature/NAT-217-Import-Sites into develop
6 files
+ 253
45
Compare changes
  • Side-by-side
  • Inline
Files
6
from typing import Dict, Any
import ipaddress
 
from typing import Dict, Any, Optional
 
from uuid import UUID
from fastapi import HTTPException, status
from fastapi import HTTPException, status
from fastapi.routing import APIRouter
from fastapi.routing import APIRouter
from orchestrator.services import processes, subscriptions
from orchestrator.services import processes, subscriptions
from pydantic import BaseModel
from pydantic import BaseModel
 
from sqlalchemy.exc import MultipleResultsFound
 
from gso.products.product_blocks.router import RouterRole, RouterVendor
from gso.products.product_blocks.site import SiteTier
from gso.products.product_blocks.site import SiteTier
router = APIRouter()
router = APIRouter()
 
def start_process(process_name: str, data: dict) -> UUID:
 
"""Utility function to start a process and handle common exceptions."""
 
 
pid = 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.")
 
 
process = processes._get_process(pid) # pylint: disable=protected-access
 
if process.last_status == "failed":
 
raise HTTPException(
 
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
 
detail=f"Process {pid} failed because of an internal error. {process.failed_reason}",
 
)
 
 
return pid
 
 
class SiteImport(BaseModel):
class SiteImport(BaseModel):
site_name: str
site_name: str
site_city: str
site_city: str
@@ -23,28 +44,62 @@ class SiteImport(BaseModel):
@@ -23,28 +44,62 @@ class SiteImport(BaseModel):
site_ts_address: str
site_ts_address: str
@router.post("/", status_code=status.HTTP_201_CREATED, tags=["Import"])
@router.post("/sites", status_code=status.HTTP_201_CREATED, tags=["Import"])
def import_site(site: SiteImport) -> Dict[str, Any]:
def import_site(site: SiteImport) -> Dict[str, Any]:
"""
"""
Import site by running the import_site workflow.
Import site by running the import_site workflow.
response:
Args:
- pid: The process id of the started process.
- site: A SiteImport object containing site details.
 
 
Returns:
 
- A dictionary containing the detail message and the process id.
 
Raises:
Raises:
HTTPException: If the site already exists or if there's an error in the process.
- HTTPException: If there's an error in the process or if the site already exists.
"""
"""
subscription = subscriptions.retrieve_subscription_by_subscription_instance_value(
try:
resource_type="site_name", value=site.site_name, sub_status=("provisioning", "active"))
subscription = subscriptions.retrieve_subscription_by_subscription_instance_value(
if subscription:
resource_type="site_name", value=site.site_name, sub_status=("provisioning", "active")
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Site already exists.")
)
 
if subscription:
 
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Site already exists.")
 
except MultipleResultsFound:
 
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Multiple subscriptions found.")
pid = processes.start_process("import_site", [site.dict()])
pid = start_process("import_site", site.dict())
if pid is None:
return {"detail": "Site import process started.", "pid": pid}
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to start the process.")
process = processes._get_process(pid) # pylint: disable=protected-access
if process.last_status == "failed":
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Process {pid} failed because of an internal error.")
return {"pid": str(pid)}
class RouterImportModel(BaseModel):
 
customer: str
 
router_site: str
 
hostname: str
 
ts_port: int
 
router_vendor: RouterVendor
 
router_role: RouterRole
 
is_ias_connected: Optional[bool] = None
 
router_access_via_ts: Optional[bool] = None
 
router_lo_ipv4_address: Optional[ipaddress.IPv4Address] = None
 
router_lo_ipv6_address: Optional[ipaddress.IPv6Address] = None
 
router_lo_iso_address: Optional[str] = None
 
router_si_ipv4_network: Optional[ipaddress.IPv4Network] = None
 
router_ias_lt_ipv4_network: Optional[ipaddress.IPv4Network] = None
 
router_ias_lt_ipv6_network: Optional[ipaddress.IPv6Network] = None
 
 
 
@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.
 
Args:
 
- router_data: A RouterImportModel object containing router details.
 
 
Returns:
 
- A dictionary containing the detail message and the process id.
 
 
Raises:
 
- 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}
Loading