Files
openstack-api-simulator/app/openstack/opspec.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

62 lines
1.5 KiB
Python

"""OperationSpec — declarative OpenStack API operation descriptor."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Literal
HttpMethod = Literal["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"]
@dataclass(frozen=True, slots=True)
class OperationSpec:
"""One OpenStack API operation (method + path) within a service pack."""
operation_id: str
method: HttpMethod
path: str
service: str
resource_type: str
collection_key: str | None = None
item_key: str | None = None
kind: Literal["collection", "item", "action", "detail", "custom"] = "collection"
status_code: int = 200
create_status: int = 201
microversion_min: str | None = None
microversion_max: str | None = None
requires_auth: bool = True
requires_project: bool = True
action_name: str | None = None
response_fixture: dict[str, Any] | None = None
notes: str = ""
def path_params(self) -> list[str]:
import re
return re.findall(r"\{([^{}]+)\}", self.path)
@dataclass
class ServicePack:
name: str
typ: str
port: int
version_path: str
default_microversion: str | None
max_microversion: str | None
operations: list[OperationSpec] = field(default_factory=list)
def operation_count(self) -> int:
return len(self.operations)
@dataclass
class SeriesManifest:
series: str
major: int
services: list[dict[str, Any]]
checksum: str = ""
generated_at: str = ""
operation_count: int = 0
service_count: int = 0