Files
openstack-api-simulator/app/openstack/catalog.py
T
inecs 6033967e6a Initial commit: stateful OpenStack API laboratory simulator.
Ship Keystone auth, multi-service handlers (Yoga→Dalmatian), Compose/Helm
packaging, API contract packs, and pytest/Pulumi coverage labs.
2026-07-18 04:26:48 +03:00

50 lines
1.4 KiB
Python

"""Service catalog builders — loaded from PostgreSQL discovery seed."""
from __future__ import annotations
import json
from typing import Any
from asyncpg import Connection
from app.openstack.db_docs import require_doc
from app.openstack.errors import OpenStackError
from app.openstack.surface import catalog_entries
def public_base(host: str, port: int, *, scheme: str = "http") -> str:
host = host.split("%")[0]
return f"{scheme}://{host}:{port}"
def build_catalog(host: str, *, scheme: str = "http") -> list[dict[str, Any]]:
"""Sync helper for offline tests/tools (no DB). Runtime catalog uses DB only."""
return catalog_entries(host, scheme=scheme)
async def build_catalog_from_db(
conn: Connection,
host: str,
*,
scheme: str = "http",
) -> list[dict[str, Any]]:
"""Render Keystone catalog from the seeded DB template."""
doc = await require_doc(
conn,
service="keystone",
resource_type="service_catalog_template",
name="default",
)
catalog = doc.get("catalog") or doc.get("services") or []
rendered = json.dumps(catalog).replace("__HOST__", host).replace("__SCHEME__", scheme)
data = json.loads(rendered)
if not isinstance(data, list):
raise OpenStackError(
"NotFound",
"keystone/service_catalog_template/default has invalid catalog shape",
status_code=404,
)
return data