"""Store for cloud access entries by (cluster_id, env, deploy_type).""" from __future__ import annotations from typing import Optional from src.models.cloud_access import CloudAccessEntry _store: dict[tuple[str, str, str], CloudAccessEntry] = {} CloudAccessKey = tuple[str, str, str] def _key(cluster_id: str, env: str, deploy_type: str) -> tuple[str, str, str]: return ( cluster_id.strip(), env.strip().lower(), deploy_type.strip().lower(), ) def set_entry( cluster_id: str, env: str, deploy_type: str, entry: CloudAccessEntry, ) -> None: """Store a cloud access entry for the key tuple.""" _store[_key(cluster_id, env, deploy_type)] = entry def get_entry( cluster_id: str, env: str, deploy_type: str, ) -> Optional[CloudAccessEntry]: """Return stored entry for (cluster_id, env, deploy_type), or None.""" return _store.get(_key(cluster_id, env, deploy_type)) def set_metrics_resolution( cluster_id: str, env: str, deploy_type: str, url: str, token: Optional[str] = None, ) -> None: """ Store or merge resolved metrics URL (and optional token) for the key. If an entry already exists, only metrics_url and metrics_token are updated; other fields (s3_access, logs_url, s3_url) are preserved. Otherwise creates a new entry with only metrics_url and metrics_token set. """ key = _key(cluster_id, env, deploy_type) existing = _store.get(key) if existing is not None: entry = CloudAccessEntry( s3_access=existing.s3_access, metrics_url=url, metrics_token=token, logs_url=existing.logs_url, s3_url=existing.s3_url, ) else: entry = CloudAccessEntry( s3_access=None, metrics_url=url, metrics_token=token, logs_url=None, s3_url=None, ) _store[key] = entry def delete_entry( cluster_id: str, env: str, deploy_type: str, ) -> bool: """Remove entry for the key tuple and return whether it existed.""" key = _key(cluster_id, env, deploy_type) if key in _store: del _store[key] return True return False def list_keys() -> list[CloudAccessKey]: """Return all (cluster_id, env, deploy_type) keys in the store.""" return sorted(_store.keys())