138 lines
3.9 KiB
Python
138 lines
3.9 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, Response, status
|
|
|
|
from app.auth.repository import SessionRecord
|
|
from app.dependencies import get_fleet_service, require_session
|
|
from app.fleet.regions import list_lightsail_regions
|
|
from app.fleet.schemas import (
|
|
InstanceCreate,
|
|
InstanceGroupCreate,
|
|
InstanceGroupUpdate,
|
|
InstanceUpdate,
|
|
)
|
|
from app.fleet.service import FleetService
|
|
|
|
router = APIRouter(prefix="/api/v1", tags=["fleet"])
|
|
|
|
|
|
@router.get("/regions")
|
|
def list_regions(
|
|
_: SessionRecord = Depends(require_session),
|
|
) -> dict:
|
|
return {"data": list_lightsail_regions()}
|
|
|
|
|
|
@router.get("/instances")
|
|
def list_instances(
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": service.list_instances()}
|
|
|
|
|
|
@router.post("/instances", status_code=status.HTTP_201_CREATED)
|
|
def create_instance(
|
|
payload: InstanceCreate,
|
|
response: Response,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
instance = service.create_instance(payload)
|
|
response.headers["Location"] = f"/api/v1/instances/{instance['id']}"
|
|
return {"data": instance}
|
|
|
|
|
|
@router.get("/instances/{instance_id}")
|
|
def get_instance(
|
|
instance_id: str,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": service.get_instance(instance_id)}
|
|
|
|
|
|
@router.put("/instances/{instance_id}")
|
|
def update_instance(
|
|
instance_id: str,
|
|
payload: InstanceUpdate,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": service.update_instance(instance_id, payload)}
|
|
|
|
|
|
@router.delete("/instances/{instance_id}")
|
|
def archive_instance(
|
|
instance_id: str,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": service.archive_instance(instance_id)}
|
|
|
|
|
|
@router.post("/instances/{instance_id}/tests")
|
|
async def test_instance(
|
|
instance_id: str,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": await service.test_instance(instance_id)}
|
|
|
|
|
|
@router.post("/instances/{instance_id}/dns-syncs")
|
|
async def sync_instance_dns(
|
|
instance_id: str,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": await service.sync_dns(instance_id)}
|
|
|
|
|
|
@router.get("/instance-groups")
|
|
def list_groups(
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": service.list_groups()}
|
|
|
|
|
|
@router.post("/instance-groups", status_code=status.HTTP_201_CREATED)
|
|
def create_group(
|
|
payload: InstanceGroupCreate,
|
|
response: Response,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
group = service.create_group(payload)
|
|
response.headers["Location"] = f"/api/v1/instance-groups/{group['id']}"
|
|
return {"data": group}
|
|
|
|
|
|
@router.get("/instance-groups/{group_id}")
|
|
def get_group(
|
|
group_id: str,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": service.get_group(group_id)}
|
|
|
|
|
|
@router.put("/instance-groups/{group_id}")
|
|
def update_group(
|
|
group_id: str,
|
|
payload: InstanceGroupUpdate,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": service.update_group(group_id, payload)}
|
|
|
|
|
|
@router.delete("/instance-groups/{group_id}")
|
|
def archive_group(
|
|
group_id: str,
|
|
_: SessionRecord = Depends(require_session),
|
|
service: FleetService = Depends(get_fleet_service),
|
|
) -> dict:
|
|
return {"data": service.archive_group(group_id)}
|