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.
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user