Source code for neuro_sdk._service_accounts
import logging
from dataclasses import dataclass
from datetime import datetime
from typing import Any, AsyncIterator, Mapping, Optional, Tuple
from dateutil.parser import isoparse
from ._config import Config
from ._core import _Core
from ._rewrite import rewrite_module
from ._utils import NoPublicConstructor, asyncgeneratorcontextmanager
logger = logging.getLogger(__package__)
@rewrite_module
@dataclass(frozen=True)
class ServiceAccount:
id: str
name: Optional[str]
owner: str
default_cluster: str
role: str
created_at: datetime
@rewrite_module
class ServiceAccounts(metaclass=NoPublicConstructor):
def __init__(self, core: _Core, config: Config) -> None:
self._core = core
self._config = config
def _parse_account_payload(self, payload: Mapping[str, Any]) -> ServiceAccount:
return ServiceAccount(
id=payload["id"],
owner=payload["owner"],
name=payload["name"],
default_cluster=payload["default_cluster"],
role=payload["role"],
created_at=isoparse(payload["created_at"]),
)
[docs] @asyncgeneratorcontextmanager
async def list(self) -> AsyncIterator[ServiceAccount]:
url = self._config.service_accounts_url
auth = await self._config._api_auth()
async with self._core.request("GET", url, auth=auth) as resp:
ret = await resp.json()
for item in ret:
yield self._parse_account_payload(item)
[docs] async def create(
self,
name: Optional[str] = None,
default_cluster: Optional[str] = None,
) -> Tuple[ServiceAccount, str]:
url = self._config.service_accounts_url
auth = await self._config._api_auth()
data = {
"name": name,
"default_cluster": default_cluster or self._config.cluster_name,
}
async with self._core.request("POST", url, auth=auth, json=data) as resp:
payload = await resp.json()
return self._parse_account_payload(payload), payload["token"]
[docs] async def get(self, id_or_name: str) -> ServiceAccount:
url = self._config.service_accounts_url / id_or_name
auth = await self._config._api_auth()
async with self._core.request("GET", url, auth=auth) as resp:
payload = await resp.json()
return self._parse_account_payload(payload)
[docs] async def rm(self, id_or_name: str) -> None:
url = self._config.service_accounts_url / id_or_name
auth = await self._config._api_auth()
async with self._core.request("DELETE", url, auth=auth):
pass