2026-06-29 14:22:37 +02:00
|
|
|
from dataclasses import dataclass, field
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
class ApiAccess:
|
|
|
|
|
api_name: str
|
|
|
|
|
api_version: str = ""
|
|
|
|
|
|
|
|
|
|
|
2026-06-29 22:16:48 +02:00
|
|
|
@dataclass
|
|
|
|
|
class AppCredential:
|
|
|
|
|
client_id: str
|
|
|
|
|
secret: str = ""
|
|
|
|
|
|
|
|
|
|
|
2026-06-29 14:22:37 +02:00
|
|
|
@dataclass
|
|
|
|
|
class AppSpec:
|
|
|
|
|
name: str
|
|
|
|
|
org_name: str
|
|
|
|
|
description: str = ""
|
|
|
|
|
email: str = ""
|
|
|
|
|
phone: str = ""
|
|
|
|
|
enabled: bool = True
|
|
|
|
|
apis: list["ApiAccess"] = field(default_factory=list)
|
|
|
|
|
environments: list[str] = field(default_factory=list)
|
2026-06-29 22:16:48 +02:00
|
|
|
credentials: list["AppCredential"] = field(default_factory=list)
|
2026-06-29 14:22:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
class OrgSpec:
|
|
|
|
|
name: str
|
|
|
|
|
description: str = ""
|
|
|
|
|
email: str = ""
|
|
|
|
|
phone: str = ""
|
|
|
|
|
enabled: bool = True
|
|
|
|
|
development: bool = False
|
|
|
|
|
environments: list[str] = field(default_factory=list)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
class Manifest:
|
|
|
|
|
organizations: list[OrgSpec] = field(default_factory=list)
|
|
|
|
|
applications: list[AppSpec] = field(default_factory=list)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
class EnvConfig:
|
|
|
|
|
name: str
|
|
|
|
|
url: str
|
|
|
|
|
username: str
|
|
|
|
|
password: str
|
|
|
|
|
verify_ssl: bool = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
class Action:
|
|
|
|
|
kind: str # "create_org" | "create_app" | "grant_api"
|
|
|
|
|
env_name: str
|
|
|
|
|
description: str
|
|
|
|
|
detail: dict = field(default_factory=dict)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
class NormResult:
|
|
|
|
|
actions_done: list[Action] = field(default_factory=list)
|
|
|
|
|
actions_skipped: list[Action] = field(default_factory=list)
|
|
|
|
|
errors: list[str] = field(default_factory=list)
|