diff --git a/nuon/api/runners/log_stream_tail_logs.py b/nuon/api/runners/log_stream_tail_logs.py new file mode 100644 index 00000000..a382aa45 --- /dev/null +++ b/nuon/api/runners/log_stream_tail_logs.py @@ -0,0 +1,229 @@ +from http import HTTPStatus +from typing import Any +from urllib.parse import quote + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.service_log_stream_tail_logs_response import ServiceLogStreamTailLogsResponse +from ...models.stderr_err_response import StderrErrResponse +from ...types import UNSET, Response, Unset + + +def _get_kwargs( + log_stream_id: str, + *, + since: str | Unset = UNSET, + wait: str | Unset = UNSET, +) -> dict[str, Any]: + + params: dict[str, Any] = {} + + params["since"] = since + + params["wait"] = wait + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/v1/log-streams/{log_stream_id}/logs/tail".format( + log_stream_id=quote(str(log_stream_id), safe=""), + ), + "params": params, + } + + return _kwargs + + +def _parse_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ServiceLogStreamTailLogsResponse | StderrErrResponse | None: + if response.status_code == 200: + response_200 = ServiceLogStreamTailLogsResponse.from_dict(response.json()) + + return response_200 + + if response.status_code == 400: + response_400 = StderrErrResponse.from_dict(response.json()) + + return response_400 + + if response.status_code == 401: + response_401 = StderrErrResponse.from_dict(response.json()) + + return response_401 + + if response.status_code == 403: + response_403 = StderrErrResponse.from_dict(response.json()) + + return response_403 + + if response.status_code == 404: + response_404 = StderrErrResponse.from_dict(response.json()) + + return response_404 + + if response.status_code == 500: + response_500 = StderrErrResponse.from_dict(response.json()) + + return response_500 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ServiceLogStreamTailLogsResponse | StderrErrResponse]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + log_stream_id: str, + *, + client: AuthenticatedClient, + since: str | Unset = UNSET, + wait: str | Unset = UNSET, +) -> Response[ServiceLogStreamTailLogsResponse | StderrErrResponse]: + """long-poll tail a log stream + + Returns rows after the supplied composite cursor, long-polling up to ~30s for new rows on an idle + stream. Behind the `log-tail-long-poll` org feature flag. + + Args: + log_stream_id (str): + since (str | Unset): + wait (str | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ServiceLogStreamTailLogsResponse | StderrErrResponse] + """ + + kwargs = _get_kwargs( + log_stream_id=log_stream_id, + since=since, + wait=wait, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + log_stream_id: str, + *, + client: AuthenticatedClient, + since: str | Unset = UNSET, + wait: str | Unset = UNSET, +) -> ServiceLogStreamTailLogsResponse | StderrErrResponse | None: + """long-poll tail a log stream + + Returns rows after the supplied composite cursor, long-polling up to ~30s for new rows on an idle + stream. Behind the `log-tail-long-poll` org feature flag. + + Args: + log_stream_id (str): + since (str | Unset): + wait (str | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ServiceLogStreamTailLogsResponse | StderrErrResponse + """ + + return sync_detailed( + log_stream_id=log_stream_id, + client=client, + since=since, + wait=wait, + ).parsed + + +async def asyncio_detailed( + log_stream_id: str, + *, + client: AuthenticatedClient, + since: str | Unset = UNSET, + wait: str | Unset = UNSET, +) -> Response[ServiceLogStreamTailLogsResponse | StderrErrResponse]: + """long-poll tail a log stream + + Returns rows after the supplied composite cursor, long-polling up to ~30s for new rows on an idle + stream. Behind the `log-tail-long-poll` org feature flag. + + Args: + log_stream_id (str): + since (str | Unset): + wait (str | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ServiceLogStreamTailLogsResponse | StderrErrResponse] + """ + + kwargs = _get_kwargs( + log_stream_id=log_stream_id, + since=since, + wait=wait, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + log_stream_id: str, + *, + client: AuthenticatedClient, + since: str | Unset = UNSET, + wait: str | Unset = UNSET, +) -> ServiceLogStreamTailLogsResponse | StderrErrResponse | None: + """long-poll tail a log stream + + Returns rows after the supplied composite cursor, long-polling up to ~30s for new rows on an idle + stream. Behind the `log-tail-long-poll` org feature flag. + + Args: + log_stream_id (str): + since (str | Unset): + wait (str | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ServiceLogStreamTailLogsResponse | StderrErrResponse + """ + + return ( + await asyncio_detailed( + log_stream_id=log_stream_id, + client=client, + since=since, + wait=wait, + ) + ).parsed diff --git a/nuon/models/__init__.py b/nuon/models/__init__.py index f2ced8fd..a7bce052 100644 --- a/nuon/models/__init__.py +++ b/nuon/models/__init__.py @@ -569,6 +569,7 @@ from .service_list_channels_response import ServiceListChannelsResponse from .service_log_stream_span import ServiceLogStreamSpan from .service_log_stream_span_attributes import ServiceLogStreamSpanAttributes +from .service_log_stream_tail_logs_response import ServiceLogStreamTailLogsResponse from .service_mng_restart_request import ServiceMngRestartRequest from .service_mng_shut_down_request import ServiceMngShutDownRequest from .service_mng_update_request import ServiceMngUpdateRequest @@ -1215,6 +1216,7 @@ "ServiceListChannelsResponse", "ServiceLogStreamSpan", "ServiceLogStreamSpanAttributes", + "ServiceLogStreamTailLogsResponse", "ServiceMngRestartRequest", "ServiceMngShutDownRequest", "ServiceMngUpdateRequest", diff --git a/nuon/models/service_log_stream_tail_logs_response.py b/nuon/models/service_log_stream_tail_logs_response.py new file mode 100644 index 00000000..31ec251d --- /dev/null +++ b/nuon/models/service_log_stream_tail_logs_response.py @@ -0,0 +1,97 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.app_otel_log_record import AppOtelLogRecord + + +T = TypeVar("T", bound="ServiceLogStreamTailLogsResponse") + + +@_attrs_define +class ServiceLogStreamTailLogsResponse: + """ + Attributes: + has_more (bool | Unset): + logs (list[AppOtelLogRecord] | Unset): + next_ (str | Unset): + """ + + has_more: bool | Unset = UNSET + logs: list[AppOtelLogRecord] | Unset = UNSET + next_: str | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + has_more = self.has_more + + logs: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.logs, Unset): + logs = [] + for logs_item_data in self.logs: + logs_item = logs_item_data.to_dict() + logs.append(logs_item) + + next_ = self.next_ + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if has_more is not UNSET: + field_dict["has_more"] = has_more + if logs is not UNSET: + field_dict["logs"] = logs + if next_ is not UNSET: + field_dict["next"] = next_ + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.app_otel_log_record import AppOtelLogRecord + + d = dict(src_dict) + has_more = d.pop("has_more", UNSET) + + _logs = d.pop("logs", UNSET) + logs: list[AppOtelLogRecord] | Unset = UNSET + if _logs is not UNSET: + logs = [] + for logs_item_data in _logs: + logs_item = AppOtelLogRecord.from_dict(logs_item_data) + + logs.append(logs_item) + + next_ = d.pop("next", UNSET) + + service_log_stream_tail_logs_response = cls( + has_more=has_more, + logs=logs, + next_=next_, + ) + + service_log_stream_tail_logs_response.additional_properties = d + return service_log_stream_tail_logs_response + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/pyproject.toml b/pyproject.toml index dbf8ae23..faee74ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "nuon" -version = "0.19.991" +version = "0.19.994" description = "A client library for accessing Nuon" authors = [] requires-python = ">=3.11" diff --git a/version.txt b/version.txt index 65b9a28e..9a657525 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.19.991 +0.19.994