Expand lab seed tiers, OpenAPI PARAMS, and console DATA/Params UX.

This commit is contained in:
2026-07-18 08:46:39 +03:00
parent f8d3cbdd59
commit 63cc409424
71 changed files with 38380 additions and 796 deletions
+47
View File
@@ -38,6 +38,9 @@ async def create_folder(
async def create_datacenter(database: Database, *, name: str, folder: str = "group-d1") -> str:
import secrets
parent_obj = await inventory.get_object(database, folder)
if parent_obj is None:
raise not_found(f"Parent {folder} not found")
moid = f"datacenter-{secrets.randbelow(900) + 100}"
host_folder = f"group-h{secrets.randbelow(90) + 10}"
vm_folder = f"group-v{secrets.randbelow(90) + 10}"
@@ -83,6 +86,9 @@ async def create_cluster(
) -> str:
import secrets
parent_obj = await inventory.get_object(database, folder)
if parent_obj is None:
raise not_found(f"Parent {folder} not found")
moid = f"domain-c{secrets.randbelow(900) + 100}"
rp = f"resgroup-{secrets.randbelow(900) + 100}"
await inventory.upsert_object(
@@ -162,6 +168,9 @@ async def delete_managed(database: Database, moid: str) -> None:
obj = await inventory.get_object(database, moid)
if obj is None:
raise not_found(f"Object {moid} not found")
# Protect the lab seed spine so surface/matrix probes cannot empty the inventory dump.
if moid in _SEED_PROTECTED_MOIDS or _is_seed_host_or_named_vm(moid, obj):
raise invalid_argument(f"Cannot delete protected seed object {moid}")
children = [
child for child in await inventory.list_objects(database) if child.parent_moid == moid
]
@@ -170,6 +179,44 @@ async def delete_managed(database: Database, moid: str) -> None:
await inventory.delete_object(database, moid)
# Stable MOIDs from profiles._topology / small named VMs (all seed sizes).
_SEED_PROTECTED_MOIDS = frozenset(
{
"group-d1",
"datacenter-21",
"group-h23",
"group-v23",
"group-s23",
"group-n23",
"domain-c21",
"resgroup-22",
"group-v100",
"group-v101",
"group-v102",
"network-41",
"dvs-51",
*(f"datastore-{30 + n}" for n in range(1, 9)),
*(f"dvportgroup-{40 + n}" for n in range(2, 9)),
*(f"group-v{103 + n}" for n in range(0, 8)),
"vm-101",
"vm-102",
"vm-103",
"vm-104",
"vm-105",
}
)
def _is_seed_host_or_named_vm(moid: str, obj: Any) -> bool:
if obj.type == "HostSystem" and moid.startswith("host-"):
# Seed hosts are host-11..host-N; probe hosts use other patterns if any.
try:
return 11 <= int(moid.split("-", 1)[1]) <= 40
except ValueError:
return False
return False
async def set_host_maintenance(database: Database, host: str, enabled: bool) -> dict[str, Any]:
obj = await inventory.get_object(database, host)
if obj is None or obj.type != "HostSystem":