Expand lab seed tiers, OpenAPI PARAMS, and console DATA/Params UX.
This commit is contained in:
@@ -4,7 +4,7 @@ from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from fastapi import APIRouter, Depends, Query, Response
|
||||
|
||||
from app.db.pool import Database
|
||||
from app.dependencies import get_database
|
||||
@@ -22,6 +22,17 @@ async def list_libraries(
|
||||
return [item["id"] for item in await content.list_libraries(database)]
|
||||
|
||||
|
||||
@router.get("/api/content/local-library")
|
||||
async def list_local_libraries(
|
||||
database: Database = Depends(get_database), _: SessionInfo = Depends(require_read)
|
||||
) -> list[str]:
|
||||
return [
|
||||
item["id"]
|
||||
for item in await content.list_libraries(database)
|
||||
if str(item.get("type") or "LOCAL").upper() == "LOCAL"
|
||||
]
|
||||
|
||||
|
||||
@router.post("/api/content/local-library")
|
||||
async def create_library(
|
||||
body: dict[str, Any],
|
||||
@@ -39,6 +50,7 @@ async def create_library(
|
||||
)
|
||||
|
||||
|
||||
# Static /library/item* paths must win over /library/{library_id}.
|
||||
@router.get("/api/content/library/item")
|
||||
async def list_items(
|
||||
library_id: str = Query(...),
|
||||
@@ -74,26 +86,6 @@ async def create_item(
|
||||
)
|
||||
|
||||
|
||||
@router.post("/api/vcenter/ovf/library-item/{item_id}")
|
||||
async def deploy_ovf(
|
||||
item_id: str,
|
||||
body: dict[str, Any],
|
||||
database: Database = Depends(get_database),
|
||||
_: SessionInfo = Depends(require_privilege("VirtualMachine.Provisioning.DeployTemplate")),
|
||||
) -> dict[str, Any]:
|
||||
target = body.get("target") or {}
|
||||
deployment = body.get("deployment_spec") or body
|
||||
moid, task_id = await content.deploy_ovf_from_library(
|
||||
database,
|
||||
item_id=item_id,
|
||||
name=str(deployment.get("name") or f"ovf-{item_id[-6:]}"),
|
||||
folder=str(target.get("folder") or "group-v23"),
|
||||
host=str(target.get("host") or "host-11"),
|
||||
datastore=str(target.get("datastore") or "datastore-31"),
|
||||
)
|
||||
return {"resource_id": {"id": moid, "type": "VirtualMachine"}, "task": task_id}
|
||||
|
||||
|
||||
@router.post("/api/content/library/item/update-session")
|
||||
async def create_update_session(
|
||||
body: dict[str, Any],
|
||||
@@ -180,6 +172,97 @@ async def list_download_session_files(
|
||||
return await content.list_download_session_files(database, session_id)
|
||||
|
||||
|
||||
@router.get("/api/content/library/item/{library_item_id}")
|
||||
async def get_item(
|
||||
library_item_id: str,
|
||||
database: Database = Depends(get_database),
|
||||
_: SessionInfo = Depends(require_read),
|
||||
) -> dict[str, Any]:
|
||||
return await content.get_library_item(database, library_item_id)
|
||||
|
||||
|
||||
@router.delete("/api/content/library/item/{library_item_id}")
|
||||
async def delete_item(
|
||||
library_item_id: str,
|
||||
database: Database = Depends(get_database),
|
||||
_: SessionInfo = Depends(require_privilege("ContentLibrary.AddLibraryItem")),
|
||||
) -> Response:
|
||||
await content.delete_library_item(database, library_item_id)
|
||||
return Response(status_code=204)
|
||||
|
||||
|
||||
@router.get("/api/content/library/{library_id}")
|
||||
async def get_library(
|
||||
library_id: str,
|
||||
database: Database = Depends(get_database),
|
||||
_: SessionInfo = Depends(require_read),
|
||||
) -> dict[str, Any]:
|
||||
return await content.get_library(database, library_id)
|
||||
|
||||
|
||||
@router.get("/api/content/local-library/{library_id}")
|
||||
async def get_local_library(
|
||||
library_id: str,
|
||||
database: Database = Depends(get_database),
|
||||
_: SessionInfo = Depends(require_read),
|
||||
) -> dict[str, Any]:
|
||||
info = await content.get_library(database, library_id)
|
||||
if str(info.get("type") or "").upper() not in {"LOCAL", ""}:
|
||||
from app.vsphere.errors import not_found
|
||||
|
||||
raise not_found(f"Local library {library_id} not found")
|
||||
return info
|
||||
|
||||
|
||||
@router.delete("/api/content/local-library/{library_id}")
|
||||
async def delete_local_library(
|
||||
library_id: str,
|
||||
database: Database = Depends(get_database),
|
||||
_: SessionInfo = Depends(require_privilege("ContentLibrary.CreateLocalLibrary")),
|
||||
) -> Response:
|
||||
await content.delete_library(database, library_id)
|
||||
return Response(status_code=204)
|
||||
|
||||
|
||||
@router.post("/api/vcenter/ovf/library-item/{item_id}")
|
||||
async def deploy_ovf(
|
||||
item_id: str,
|
||||
body: dict[str, Any],
|
||||
database: Database = Depends(get_database),
|
||||
_: SessionInfo = Depends(require_privilege("VirtualMachine.Provisioning.DeployTemplate")),
|
||||
) -> dict[str, Any]:
|
||||
target = body.get("target") or {}
|
||||
deployment = body.get("deployment_spec") or body
|
||||
folder = (
|
||||
target.get("folder_id")
|
||||
or target.get("folder")
|
||||
or deployment.get("folder")
|
||||
or "group-v23"
|
||||
)
|
||||
host = target.get("host_id") or target.get("host") or "host-11"
|
||||
datastore = (
|
||||
target.get("datastore_id")
|
||||
or target.get("datastore")
|
||||
or deployment.get("datastore")
|
||||
or "datastore-31"
|
||||
)
|
||||
resource_pool = (
|
||||
target.get("resource_pool_id")
|
||||
or target.get("resource_pool")
|
||||
or deployment.get("resource_pool")
|
||||
)
|
||||
moid, task_id = await content.deploy_ovf_from_library(
|
||||
database,
|
||||
item_id=item_id,
|
||||
name=str(deployment.get("name") or f"ovf-{item_id[-6:]}"),
|
||||
folder=str(folder),
|
||||
host=str(host),
|
||||
datastore=str(datastore),
|
||||
resource_pool=str(resource_pool) if resource_pool else None,
|
||||
)
|
||||
return {"resource_id": {"id": moid, "type": "VirtualMachine"}, "task": task_id}
|
||||
|
||||
|
||||
@router.get("/api/vcenter/storage/policies")
|
||||
async def storage_policies(
|
||||
database: Database = Depends(get_database),
|
||||
|
||||
Reference in New Issue
Block a user