230 lines
12 KiB
Python
230 lines
12 KiB
Python
"""Implemented REST path registry for UI catalog and surface probes.
|
|
|
|
CORE_* entries are deep lab handlers. Broadcom Automation API routes from
|
|
``universe.json`` (generated from the public operations index) fill the rest as
|
|
thin stubs — each ``(verb, path)`` is registered separately in ``stub_surface``.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from functools import lru_cache
|
|
from pathlib import Path
|
|
|
|
ACTIVE_STATUSES = frozenset({"implemented", "stub"})
|
|
|
|
# verb + path template → status (deep handlers)
|
|
CORE_IMPLEMENTED: dict[tuple[str, str], str] = {
|
|
("POST", "/api/session"): "implemented",
|
|
("DELETE", "/api/session"): "implemented",
|
|
("GET", "/api/session"): "implemented",
|
|
("POST", "/rest/com/vmware/cis/session"): "implemented",
|
|
("GET", "/rest/com/vmware/cis/session"): "implemented",
|
|
("DELETE", "/rest/com/vmware/cis/session"): "implemented",
|
|
("GET", "/api/cis/tasks"): "implemented",
|
|
("POST", "/api/cis/tasks"): "implemented",
|
|
("GET", "/api/cis/tasks/{task}"): "implemented",
|
|
("GET", "/api/appliance/system/version"): "implemented",
|
|
("GET", "/api/appliance/health/system"): "implemented",
|
|
("GET", "/api/appliance/networking"): "implemented",
|
|
("GET", "/api/appliance/networking/dns/hostname"): "implemented",
|
|
("PUT", "/api/appliance/networking/dns/hostname"): "implemented",
|
|
("POST", "/api/appliance/networking/dns/hostname"): "implemented",
|
|
("GET", "/api/appliance/networking/dns/servers"): "implemented",
|
|
("PUT", "/api/appliance/networking/dns/servers"): "implemented",
|
|
("POST", "/api/appliance/networking/dns/servers"): "implemented",
|
|
("GET", "/api/appliance/networking/dns/domains"): "implemented",
|
|
("PUT", "/api/appliance/networking/dns/domains"): "implemented",
|
|
("POST", "/api/appliance/networking/dns/domains"): "implemented",
|
|
("GET", "/api/appliance/timesync"): "implemented",
|
|
("GET", "/api/vcenter/vm"): "implemented",
|
|
("POST", "/api/vcenter/vm"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}"): "implemented",
|
|
("DELETE", "/api/vcenter/vm/{vm}"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/power"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/power"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/guest/identity"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/guest/local-filesystem"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/guest/filesystem"): "implemented",
|
|
("PUT", "/api/vcenter/vm/{vm}/guest/filesystem"): "implemented",
|
|
("DELETE", "/api/vcenter/vm/{vm}/guest/filesystem"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/guest/filesystem/files"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/tools"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/hardware"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/hardware/cpu"): "implemented",
|
|
("PATCH", "/api/vcenter/vm/{vm}/hardware/cpu"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/hardware/memory"): "implemented",
|
|
("PATCH", "/api/vcenter/vm/{vm}/hardware/memory"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/hardware/disk"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/hardware/disk"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/hardware/ethernet"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/hardware/ethernet"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/hardware/boot"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/snapshots"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/snapshots"): "implemented",
|
|
("DELETE", "/api/vcenter/vm/{vm}/snapshots/{snapshot}"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/snapshots/{snapshot}"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/clone"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/relocate"): "implemented",
|
|
("GET", "/api/vcenter/host"): "implemented",
|
|
("GET", "/api/vcenter/host/{host}"): "implemented",
|
|
("POST", "/api/vcenter/host/{host}/maintenance"): "implemented",
|
|
("GET", "/api/vcenter/datastore"): "implemented",
|
|
("GET", "/api/vcenter/datastore/{datastore}"): "implemented",
|
|
("GET", "/api/vcenter/datastore/{datastore}/files"): "implemented",
|
|
("POST", "/api/vcenter/datastore/{datastore}/files"): "implemented",
|
|
("GET", "/api/vcenter/network"): "implemented",
|
|
("GET", "/api/vcenter/datacenter"): "implemented",
|
|
("POST", "/api/vcenter/datacenter"): "implemented",
|
|
("DELETE", "/api/vcenter/datacenter/{datacenter}"): "implemented",
|
|
("GET", "/api/vcenter/cluster"): "implemented",
|
|
("POST", "/api/vcenter/cluster"): "implemented",
|
|
("DELETE", "/api/vcenter/cluster/{cluster}"): "implemented",
|
|
("GET", "/api/vcenter/folder"): "implemented",
|
|
("POST", "/api/vcenter/folder"): "implemented",
|
|
("POST", "/api/vcenter/folder/{folder}"): "implemented",
|
|
("DELETE", "/api/vcenter/folder/{folder}"): "implemented",
|
|
("GET", "/api/vcenter/resource-pool"): "implemented",
|
|
("POST", "/api/vcenter/resource-pool"): "implemented",
|
|
("DELETE", "/api/vcenter/resource-pool/{resource_pool}"): "implemented",
|
|
("GET", "/api/vcenter/network/dvs"): "implemented",
|
|
("POST", "/api/vcenter/network/dvs"): "implemented",
|
|
("POST", "/api/vcenter/network/dvpg"): "implemented",
|
|
("GET", "/api/cis/tagging/category"): "implemented",
|
|
("POST", "/api/cis/tagging/category"): "implemented",
|
|
("GET", "/api/cis/tagging/category/{category_id}"): "implemented",
|
|
("DELETE", "/api/cis/tagging/category/{category_id}"): "implemented",
|
|
("GET", "/api/cis/tagging/tag"): "implemented",
|
|
("POST", "/api/cis/tagging/tag"): "implemented",
|
|
("GET", "/api/cis/tagging/tag/{tag_id}"): "implemented",
|
|
("DELETE", "/api/cis/tagging/tag/{tag_id}"): "implemented",
|
|
("POST", "/api/cis/tagging/tag-association"): "implemented",
|
|
("GET", "/api/content/library"): "implemented",
|
|
("GET", "/api/content/library/{library_id}"): "implemented",
|
|
("GET", "/api/content/local-library"): "implemented",
|
|
("POST", "/api/content/local-library"): "implemented",
|
|
("GET", "/api/content/local-library/{library_id}"): "implemented",
|
|
("DELETE", "/api/content/local-library/{library_id}"): "implemented",
|
|
("GET", "/api/content/library/item"): "implemented",
|
|
("POST", "/api/content/library/item"): "implemented",
|
|
("GET", "/api/content/library/item/{library_item_id}"): "implemented",
|
|
("DELETE", "/api/content/library/item/{library_item_id}"): "implemented",
|
|
("POST", "/api/content/library/item/update-session"): "implemented",
|
|
("GET", "/api/content/library/item/update-session/{session_id}"): "implemented",
|
|
("POST", "/api/content/library/item/update-session/{session_id}"): "implemented",
|
|
("POST", "/api/content/library/item/update-session/{session_id}/file"): "implemented",
|
|
("POST", "/api/content/library/item/download-session"): "implemented",
|
|
("GET", "/api/content/library/item/download-session/{session_id}"): "implemented",
|
|
("GET", "/api/content/library/item/download-session/{session_id}/file"): "implemented",
|
|
("POST", "/api/vcenter/ovf/library-item/{item_id}"): "implemented",
|
|
("GET", "/api/vcenter/storage/policies"): "implemented",
|
|
("GET", "/api/vcenter/storage/policies/{policy}/vm"): "implemented",
|
|
("GET", "/api/vcenter/privilege"): "implemented",
|
|
("GET", "/api/vcenter/authorization/roles"): "implemented",
|
|
("GET", "/api/vcenter/authorization/permissions"): "implemented",
|
|
("POST", "/api/vcenter/authorization/permissions"): "implemented",
|
|
("DELETE", "/api/vcenter/authorization/permissions/{permission_id}"): "implemented",
|
|
("GET", "/api/vcenter/namespaces"): "implemented",
|
|
("GET", "/api/vcenter/namespace-management/nsx-tier0-gateway"): "implemented",
|
|
("GET", "/api/vcenter/namespace-management/networks"): "implemented",
|
|
("GET", "/api/vcenter/namespace-management/virtual-machine-classes"): "implemented",
|
|
("GET", "/api/vcenter/identity/providers"): "implemented",
|
|
("POST", "/api/vcenter/identity/providers"): "implemented",
|
|
("GET", "/api/vcenter/identity/providers/{provider}"): "implemented",
|
|
("PUT", "/api/vcenter/identity/providers/{provider}"): "implemented",
|
|
("PATCH", "/api/vcenter/identity/providers/{provider}"): "implemented",
|
|
("DELETE", "/api/vcenter/identity/providers/{provider}"): "implemented",
|
|
("GET", "/api/vcenter/certificate-management/vcenter/tls-csr"): "implemented",
|
|
("POST", "/api/vcenter/certificate-management/vcenter/tls-csr"): "implemented",
|
|
("GET", "/api/vcenter/certificate-management/vcenter/trusted-root-chains"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/guest/customization"): "implemented",
|
|
("GET", "/api/vcenter/certificate-management/vcenter/tls"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/guest/networking"): "implemented",
|
|
("GET", "/api/vcenter/vm/{vm}/guest/power"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/guest/power"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/tools"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/console/tickets"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}/guest/customization"): "implemented",
|
|
("POST", "/api/vcenter/vm/{vm}"): "implemented",
|
|
("GET", "/api/vcenter/host/{host}/storage/storage-device"): "implemented",
|
|
("GET", "/api/vcenter/host/{host}/networking"): "implemented",
|
|
("GET", "/api/vcenter/folder/{folder}/children"): "implemented",
|
|
("GET", "/api/vapi/metadata/metamodel/service"): "implemented",
|
|
("GET", "/api/vapi/metadata/authentication/component"): "implemented",
|
|
("GET", "/api/vcenter/activity-history"): "implemented",
|
|
("GET", "/rest/vcenter/vm"): "implemented",
|
|
("GET", "/rest/vcenter/vm/{vm}"): "implemented",
|
|
("POST", "/rest/vcenter/vm/{vm}/power"): "implemented",
|
|
("GET", "/rest/vcenter/host"): "implemented",
|
|
("GET", "/rest/vcenter/datastore"): "implemented",
|
|
("GET", "/rest/vcenter/network"): "implemented",
|
|
("GET", "/rest/vcenter/datacenter"): "implemented",
|
|
("GET", "/rest/vcenter/cluster"): "implemented",
|
|
("GET", "/rest/appliance/system/version"): "implemented",
|
|
}
|
|
|
|
|
|
@lru_cache(maxsize=1)
|
|
def _universe_routes() -> dict[tuple[str, str], str]:
|
|
path = Path(__file__).with_name("universe.json")
|
|
if not path.is_file():
|
|
return {}
|
|
payload = json.loads(path.read_text(encoding="utf-8"))
|
|
out: dict[tuple[str, str], str] = {}
|
|
for entry in payload.get("methods") or []:
|
|
verb = str(entry.get("verb", "")).upper()
|
|
route = str(entry.get("path", ""))
|
|
if verb and route:
|
|
out[(verb, route)] = "stub"
|
|
return out
|
|
|
|
|
|
def _merged() -> dict[tuple[str, str], str]:
|
|
merged = dict(_universe_routes())
|
|
merged.update(CORE_IMPLEMENTED)
|
|
return merged
|
|
|
|
|
|
IMPLEMENTED: dict[tuple[str, str], str] = _merged()
|
|
|
|
|
|
def reload_coverage() -> dict[tuple[str, str], str]:
|
|
"""Reload universe.json (tests / generator)."""
|
|
|
|
_universe_routes.cache_clear()
|
|
IMPLEMENTED.clear()
|
|
IMPLEMENTED.update(_merged())
|
|
from contextlib import suppress
|
|
|
|
with suppress(Exception):
|
|
from app.vsphere.contracts.matrix import _compiled_routes
|
|
|
|
_compiled_routes.cache_clear()
|
|
return IMPLEMENTED
|
|
|
|
|
|
def catalog_entries() -> list[dict[str, str]]:
|
|
return [
|
|
{"verb": verb, "path": path, "status": status}
|
|
for (verb, path), status in sorted(IMPLEMENTED.items())
|
|
]
|
|
|
|
|
|
def is_implemented(verb: str, path: str) -> bool:
|
|
return IMPLEMENTED.get((verb.upper(), path)) in ACTIVE_STATUSES
|
|
|
|
|
|
def universe_stats() -> dict[str, int | str]:
|
|
path = Path(__file__).with_name("universe.json")
|
|
if not path.is_file():
|
|
return {"broadcom_operations": 0, "unique_routes": 0}
|
|
payload = json.loads(path.read_text(encoding="utf-8"))
|
|
return {
|
|
"source_label": str(payload.get("source_label") or ""),
|
|
"broadcom_operations": int(payload.get("broadcom_operations") or 0),
|
|
"unique_routes": int(payload.get("unique_routes") or 0),
|
|
"registry_methods": len(IMPLEMENTED),
|
|
"core_methods": len(CORE_IMPLEMENTED),
|
|
"stub_methods": sum(1 for status in IMPLEMENTED.values() if status == "stub"),
|
|
}
|