diff --git a/hcloud/actions/__init__.py b/hcloud/actions/__init__.py index 8a96e5de..653ad9bd 100644 --- a/hcloud/actions/__init__.py +++ b/hcloud/actions/__init__.py @@ -2,6 +2,7 @@ from .client import ( ActionsClient, + ActionSort, ActionsPageResult, BoundAction, ResourceActionsClient, @@ -10,15 +11,18 @@ Action, ActionException, ActionFailedException, + ActionStatus, ActionTimeoutException, ) __all__ = [ "Action", + "ActionStatus", "ActionException", "ActionFailedException", "ActionTimeoutException", "ActionsClient", + "ActionSort", "ActionsPageResult", "BoundAction", "ResourceActionsClient", diff --git a/hcloud/actions/client.py b/hcloud/actions/client.py index 0e7f8461..26924ec1 100644 --- a/hcloud/actions/client.py +++ b/hcloud/actions/client.py @@ -2,10 +2,10 @@ import time import warnings -from typing import TYPE_CHECKING, Any, NamedTuple +from typing import TYPE_CHECKING, Any, Literal, NamedTuple from ..core import BoundModelBase, Meta, ResourceClientBase -from .domain import Action, ActionFailedException, ActionTimeoutException +from .domain import Action, ActionFailedException, ActionStatus, ActionTimeoutException if TYPE_CHECKING: from .._client import Client @@ -45,12 +45,78 @@ def wait_until_finished(self, max_retries: int | None = None) -> None: raise ActionFailedException(action=self) +ActionSort = Literal[ + "id", + "id:asc", + "id:desc", + "command", + "command:asc", + "command:desc", + "status", + "status:asc", + "status:desc", + "started", + "started:asc", + "started:desc", + "finished", + "finished:asc", + "finished:desc", +] + + class ActionsPageResult(NamedTuple): actions: list[BoundAction] meta: Meta -class ResourceActionsClient(ResourceClientBase): +class ResourceClientBaseActionsMixin(ResourceClientBase): + def _get_action_by_id( + self, + base_url: str, + id: int, + ) -> BoundAction: + response = self._client.request( + method="GET", + url=f"{base_url}/actions/{id}", + ) + return BoundAction( + client=self._parent.actions, + data=response["action"], + ) + + def _get_actions_list( + self, + base_url: str, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, + page: int | None = None, + per_page: int | None = None, + ) -> ActionsPageResult: + params: dict[str, Any] = {} + if status is not None: + params["status"] = status + if sort is not None: + params["sort"] = sort + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + + response = self._client.request( + method="GET", + url=f"{base_url}/actions", + params=params, + ) + return ActionsPageResult( + actions=[BoundAction(self._parent.actions, o) for o in response["actions"]], + meta=Meta.parse_meta(response), + ) + + +class ResourceActionsClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _resource: str def __init__(self, client: ResourceClientBase | Client, resource: str | None): @@ -66,69 +132,46 @@ def __init__(self, client: ResourceClientBase | Client, resource: str | None): self._resource = resource or "" def get_by_id(self, id: int) -> BoundAction: - """Get a specific action by its ID. + """ + Returns a specific Action by its ID. - :param id: int - :return: :class:`BoundAction ` + :param id: ID of the Action. """ - response = self._client.request( - url=f"{self._resource}/actions/{id}", - method="GET", - ) - return BoundAction(self._parent.actions, response["action"]) + return self._get_action_by_id(self._resource, id) def get_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Get a list of actions. - - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `command` `status` `progress` `started` `finished` . You can add one of ":asc", ":desc" to modify sort order. ( ":asc" is default) - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page + Returns a paginated list of Actions. - response = self._client.request( - url=f"{self._resource}/actions", - method="GET", - params=params, + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. + """ + return self._get_actions_list( + self._resource, + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_all( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Get all actions. + """ + Returns all Actions. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `command` `status` `progress` `started` `finished` . You can add one of ":asc", ":desc" to modify sort order. ( ":asc" is default) - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages(self.get_list, status=status, sort=sort) @@ -139,8 +182,8 @@ def __init__(self, client: Client): def get_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: @@ -162,8 +205,8 @@ def get_list( def get_all( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: """ .. deprecated:: 1.28 diff --git a/hcloud/actions/domain.py b/hcloud/actions/domain.py index b85aca99..99267599 100644 --- a/hcloud/actions/domain.py +++ b/hcloud/actions/domain.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, TypedDict +from typing import TYPE_CHECKING, Any, Literal, TypedDict from .._exceptions import HCloudException from ..core import BaseDomain @@ -8,6 +8,12 @@ if TYPE_CHECKING: from .client import BoundAction +ActionStatus = Literal[ + "running", + "success", + "error", +] + class Action(BaseDomain): """Action Domain @@ -45,7 +51,7 @@ def __init__( self, id: int, command: str | None = None, - status: str | None = None, + status: ActionStatus | None = None, progress: int | None = None, started: str | None = None, finished: str | None = None, diff --git a/hcloud/certificates/client.py b/hcloud/certificates/client.py index 851178e8..cf89196d 100644 --- a/hcloud/certificates/client.py +++ b/hcloud/certificates/client.py @@ -2,7 +2,14 @@ from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from .domain import ( Certificate, @@ -41,22 +48,18 @@ def __init__( def get_actions_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a Certificate. + """ + Returns a paginated list of Actions for a Certificate. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -68,16 +71,14 @@ def get_actions_list( def get_actions( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a Certificate. + """ + Returns all Actions for a Certificate. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions( self, @@ -122,7 +123,10 @@ class CertificatesPageResult(NamedTuple): meta: Meta -class CertificatesClient(ResourceClientBase): +class CertificatesClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/certificates" actions: ResourceActionsClient @@ -311,59 +315,40 @@ def delete(self, certificate: Certificate | BoundCertificate) -> bool: def get_actions_list( self, certificate: Certificate | BoundCertificate, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a Certificate. - - :param certificate: :class:`BoundCertificate ` or :class:`Certificate ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page + Returns a paginated list of Actions for a Certificate. - response = self._client.request( - url=f"{self._base_url}/{certificate.id}/actions", - method="GET", - params=params, + :param certificate: Certificate to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. + """ + return self._get_actions_list( + f"{self._base_url}/{certificate.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, certificate: Certificate | BoundCertificate, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a Certificate. + """ + Returns all Actions for a Certificate. - :param certificate: :class:`BoundCertificate ` or :class:`Certificate ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param certificate: Certificate to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, diff --git a/hcloud/firewalls/client.py b/hcloud/firewalls/client.py index 3caf1be6..883c2dde 100644 --- a/hcloud/firewalls/client.py +++ b/hcloud/firewalls/client.py @@ -2,7 +2,14 @@ from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from .domain import ( CreateFirewallResponse, @@ -97,22 +104,18 @@ def __init__( def get_actions_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a Firewall. + """ + Returns a paginated list of Actions for a Firewall. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -124,17 +127,14 @@ def get_actions_list( def get_actions( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a Firewall. - - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` + """ + Returns all Actions for a Firewall. - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions( self, @@ -198,7 +198,10 @@ class FirewallsPageResult(NamedTuple): meta: Meta -class FirewallsClient(ResourceClientBase): +class FirewallsClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/firewalls" actions: ResourceActionsClient @@ -214,59 +217,40 @@ def __init__(self, client: Client): def get_actions_list( self, firewall: Firewall | BoundFirewall, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a Firewall. + """ + Returns a paginated list of Actions for a Firewall. - :param firewall: :class:`BoundFirewall ` or :class:`Firewall ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param firewall: Firewall to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page - response = self._client.request( - url=f"{self._base_url}/{firewall.id}/actions", - method="GET", - params=params, + return self._get_actions_list( + f"{self._base_url}/{firewall.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, firewall: Firewall | BoundFirewall, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a Firewall. - - :param firewall: :class:`BoundFirewall ` or :class:`Firewall ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` + """ + Returns all Actions for a Firewall. - :return: List[:class:`BoundAction `] + :param firewall: Firewall to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, diff --git a/hcloud/floating_ips/client.py b/hcloud/floating_ips/client.py index 771a094a..0ce29dd3 100644 --- a/hcloud/floating_ips/client.py +++ b/hcloud/floating_ips/client.py @@ -2,7 +2,14 @@ from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from ..locations import BoundLocation from .domain import CreateFloatingIPResponse, FloatingIP @@ -43,22 +50,18 @@ def __init__( def get_actions_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a Floating IP. + """ + Returns a paginated list of Actions for a Floating IP. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -70,16 +73,14 @@ def get_actions_list( def get_actions( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a Floating IP. + """ + Returns all Actions for a Floating IP. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions(self, status=status, sort=sort) @@ -152,7 +153,10 @@ class FloatingIPsPageResult(NamedTuple): meta: Meta -class FloatingIPsClient(ResourceClientBase): +class FloatingIPsClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/floating_ips" actions: ResourceActionsClient @@ -168,59 +172,40 @@ def __init__(self, client: Client): def get_actions_list( self, floating_ip: FloatingIP | BoundFloatingIP, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a Floating IP. + """ + Returns a paginated list of Actions for a Floating IP. - :param floating_ip: :class:`BoundFloatingIP ` or :class:`FloatingIP ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param floating_ip: Floating IP to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page - response = self._client.request( - url=f"{self._base_url}/{floating_ip.id}/actions", - method="GET", - params=params, + return self._get_actions_list( + f"{self._base_url}/{floating_ip.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, floating_ip: FloatingIP | BoundFloatingIP, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a Floating IP. - - :param floating_ip: :class:`BoundFloatingIP ` or :class:`FloatingIP ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` + """ + Returns all Actions for a Floating IP. - :return: List[:class:`BoundAction `] + :param floating_ip: Floating IP to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, diff --git a/hcloud/images/client.py b/hcloud/images/client.py index 822ff14a..9d9d6f1e 100644 --- a/hcloud/images/client.py +++ b/hcloud/images/client.py @@ -3,7 +3,14 @@ import warnings from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from .domain import Image @@ -39,22 +46,18 @@ def __init__( def get_actions_list( self, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, - status: list[str] | None = None, ) -> ActionsPageResult: - """Returns a list of action objects for the image. + """ + Returns a paginated list of Actions for a Image. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -66,16 +69,14 @@ def get_actions_list( def get_actions( self, - sort: list[str] | None = None, - status: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for the image. + """ + Returns all Actions for a Image. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions( self, @@ -126,7 +127,10 @@ class ImagesPageResult(NamedTuple): meta: Meta -class ImagesClient(ResourceClientBase): +class ImagesClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/images" actions: ResourceActionsClient @@ -142,64 +146,46 @@ def __init__(self, client: Client): def get_actions_list( self, image: Image | BoundImage, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, - status: list[str] | None = None, ) -> ActionsPageResult: - """Returns a list of action objects for an image. + """ + Returns a paginated list of Actions for a Image. - :param image: :class:`BoundImage ` or :class:`Image ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param image: Image to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ - params: dict[str, Any] = {} - if sort is not None: - params["sort"] = sort - if status is not None: - params["status"] = status - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page - response = self._client.request( - url=f"{self._base_url}/{image.id}/actions", - method="GET", - params=params, + return self._get_actions_list( + f"{self._base_url}/{image.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, image: Image | BoundImage, - sort: list[str] | None = None, - status: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for an image. + """ + Returns all Actions for a Image. - :param image: :class:`BoundImage ` or :class:`Image ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `command` `status` `progress` `started` `finished` . You can add one of ":asc", ":desc" to modify sort order. ( ":asc" is default) - :return: List[:class:`BoundAction `] + :param image: Image to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, image, - sort=sort, status=status, + sort=sort, ) def get_by_id(self, id: int) -> BoundImage: diff --git a/hcloud/load_balancers/client.py b/hcloud/load_balancers/client.py index c0d373ce..e7305f22 100644 --- a/hcloud/load_balancers/client.py +++ b/hcloud/load_balancers/client.py @@ -5,7 +5,14 @@ from dateutil.parser import isoparse -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..certificates import BoundCertificate from ..core import BoundModelBase, Meta, ResourceClientBase from ..load_balancer_types import BoundLoadBalancerType @@ -212,22 +219,18 @@ def get_metrics( def get_actions_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a Load Balancer. + """ + Returns a paginated list of Actions for a Load Balancer. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -239,16 +242,14 @@ def get_actions_list( def get_actions( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a Load Balancer. + """ + Returns all Actions for a Load Balancer. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions(self, status=status, sort=sort) @@ -388,7 +389,10 @@ class LoadBalancersPageResult(NamedTuple): meta: Meta -class LoadBalancersClient(ResourceClientBase): +class LoadBalancersClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/load_balancers" actions: ResourceActionsClient @@ -621,59 +625,40 @@ def get_metrics( def get_actions_list( self, load_balancer: LoadBalancer | BoundLoadBalancer, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a Load Balancer. - - :param load_balancer: :class:`BoundLoadBalancer ` or :class:`LoadBalancer ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page + Returns a paginated list of Actions for a Load Balancer. - response = self._client.request( - url=f"{self._base_url}/{load_balancer.id}/actions", - method="GET", - params=params, + :param load_balancer: Load Balancer to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. + """ + return self._get_actions_list( + f"{self._base_url}/{load_balancer.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, load_balancer: LoadBalancer | BoundLoadBalancer, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a Load Balancer. + """ + Returns all Actions for a Load Balancer. - :param load_balancer: :class:`BoundLoadBalancer ` or :class:`LoadBalancer ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param load_balancer: Load Balancer to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, diff --git a/hcloud/networks/client.py b/hcloud/networks/client.py index 438d4a98..54d04cbd 100644 --- a/hcloud/networks/client.py +++ b/hcloud/networks/client.py @@ -2,7 +2,14 @@ from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from .domain import Network, NetworkRoute, NetworkSubnet @@ -77,22 +84,18 @@ def delete(self) -> bool: def get_actions_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a network. + """ + Returns a paginated list of Actions for a Network. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -104,16 +107,14 @@ def get_actions_list( def get_actions( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a network. + """ + Returns all Actions for a Network. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions(self, status=status, sort=sort) @@ -177,7 +178,10 @@ class NetworksPageResult(NamedTuple): meta: Meta -class NetworksClient(ResourceClientBase): +class NetworksClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/networks" actions: ResourceActionsClient @@ -364,59 +368,40 @@ def delete(self, network: Network | BoundNetwork) -> bool: def get_actions_list( self, network: Network | BoundNetwork, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a network. - - :param network: :class:`BoundNetwork ` or :class:`Network ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page + Returns a paginated list of Actions for a Network. - response = self._client.request( - url=f"{self._base_url}/{network.id}/actions", - method="GET", - params=params, + :param network: Network to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. + """ + return self._get_actions_list( + f"{self._base_url}/{network.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, network: Network | BoundNetwork, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a network. + """ + Returns all Actions for a Network. - :param network: :class:`BoundNetwork ` or :class:`Network ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param network: Network to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, diff --git a/hcloud/primary_ips/client.py b/hcloud/primary_ips/client.py index cc26e55e..15acdbf6 100644 --- a/hcloud/primary_ips/client.py +++ b/hcloud/primary_ips/client.py @@ -3,7 +3,14 @@ import warnings from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from .domain import CreatePrimaryIPResponse, PrimaryIP @@ -40,21 +47,18 @@ def __init__( def get_actions_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: """ Returns a paginated list of Actions for a Primary IP. - See https://docs.hetzner.cloud/reference/cloud#zones-list-zones - - :param primary_ip: Primary IP to fetch the Actions from. - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. - :param page: Page number to return. - :param per_page: Maximum number of entries returned per page. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -66,17 +70,14 @@ def get_actions_list( def get_actions( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: """ Returns all Actions for a Primary IP. - See https://docs.hetzner.cloud/reference/cloud#zones-list-zones - - :param primary_ip: Primary IP to fetch the Actions from. - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions( self, @@ -160,7 +161,10 @@ class PrimaryIPsPageResult(NamedTuple): meta: Meta -class PrimaryIPsClient(ResourceClientBase): +class PrimaryIPsClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/primary_ips" actions: ResourceActionsClient @@ -176,57 +180,40 @@ def __init__(self, client: Client): def get_actions_list( self, primary_ip: PrimaryIP | BoundPrimaryIP, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: """ Returns a paginated list of Actions for a Primary IP. - See https://docs.hetzner.cloud/reference/cloud#zones-list-zones - - :param primary_ip: Primary IP to fetch the Actions from. - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. - :param page: Page number to return. - :param per_page: Maximum number of entries returned per page. + :param primary_ip: Primary IP to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page - - response = self._client.request( - url=f"{self._base_url}/{primary_ip.id}/actions", - method="GET", - params=params, + return self._get_actions_list( + f"{self._base_url}/{primary_ip.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, primary_ip: PrimaryIP | BoundPrimaryIP, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: """ Returns all Actions for a Primary IP. - See https://docs.hetzner.cloud/reference/cloud#zones-list-zones - - :param primary_ip: Primary IP to fetch the Actions from. - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. + :param primary_ip: Primary IP to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, diff --git a/hcloud/servers/client.py b/hcloud/servers/client.py index e65e4e08..847aa88a 100644 --- a/hcloud/servers/client.py +++ b/hcloud/servers/client.py @@ -6,7 +6,14 @@ from dateutil.parser import isoparse -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from ..datacenters import BoundDatacenter from ..firewalls import BoundFirewall @@ -176,22 +183,18 @@ def __init__( def get_actions_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a server. + """ + Returns a paginated list of Actions for a Server. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -203,16 +206,14 @@ def get_actions_list( def get_actions( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a server. + """ + Returns all Actions for a Server. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions(self, status=status, sort=sort) @@ -513,7 +514,10 @@ class ServersPageResult(NamedTuple): meta: Meta -class ServersClient(ResourceClientBase): +class ServersClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/servers" actions: ResourceActionsClient @@ -719,59 +723,40 @@ def create( def get_actions_list( self, server: Server | BoundServer, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a server. - - :param server: :class:`BoundServer ` or :class:`Server ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page + Returns a paginated list of Actions for a Server. - response = self._client.request( - url=f"{self._base_url}/{server.id}/actions", - method="GET", - params=params, + :param server: Server to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. + """ + return self._get_actions_list( + f"{self._base_url}/{server.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, server: Server | BoundServer, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a server. + """ + Returns all Actions for a Server. - :param server: :class:`BoundServer ` or :class:`Server ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param server: Server to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, diff --git a/hcloud/storage_boxes/client.py b/hcloud/storage_boxes/client.py index f81e3c81..299ce204 100644 --- a/hcloud/storage_boxes/client.py +++ b/hcloud/storage_boxes/client.py @@ -2,7 +2,14 @@ from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from ..locations import BoundLocation, Location from ..ssh_keys import BoundSSHKey, SSHKey @@ -67,20 +74,20 @@ def __init__( def get_actions_list( self, *, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: """ - Returns a paginated list of Actions for a Storage Box for a specific page. + Returns a paginated list of Actions for a Storage Box. See https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-list-actions-for-a-storage-box - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. - :param page: Page number to return. - :param per_page: Maximum number of entries returned per page. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. Experimental: Storage Box support is experimental, breaking changes may occur within minor releases. @@ -96,8 +103,8 @@ def get_actions_list( def get_actions( self, *, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: """ Returns all Actions for a Storage Box. @@ -743,7 +750,10 @@ class StorageBoxSubaccountsPageResult(NamedTuple): meta: Meta -class StorageBoxesClient(ResourceClientBase): +class StorageBoxesClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): """ A client for the Storage Boxes API. @@ -1012,58 +1022,46 @@ def get_actions_list( self, storage_box: StorageBox | BoundStorageBox, *, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: """ - Returns a paginated list of Actions for a Storage Box for a specific page. + Returns a paginated list of Actions for a Storage Box. See https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-list-actions-for-a-storage-box - :param storage_box: Storage Box to fetch the Actions from. - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. - :param page: Page number to return. - :param per_page: Maximum number of entries returned per page. + :param storage_box: Storage Box to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. Experimental: Storage Box support is experimental, breaking changes may occur within minor releases. """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page - - response = self._client.request( - method="GET", - url=f"/storage_boxes/{storage_box.id}/actions", - params=params, - ) - return ActionsPageResult( - actions=[BoundAction(self._parent.actions, o) for o in response["actions"]], - meta=Meta.parse_meta(response), + return self._get_actions_list( + f"{self._base_url}/{storage_box.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) def get_actions( self, storage_box: StorageBox | BoundStorageBox, *, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: """ Returns all Actions for a Storage Box. See https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-list-actions-for-a-storage-box - :param storage_box: Storage Box to fetch the Actions from. + :param storage_box: Storage Box to get the Actions for. :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. :param sort: Sort resources by field and direction. diff --git a/hcloud/volumes/client.py b/hcloud/volumes/client.py index 2e36fd13..84900eb3 100644 --- a/hcloud/volumes/client.py +++ b/hcloud/volumes/client.py @@ -2,7 +2,14 @@ from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from ..locations import BoundLocation from .domain import CreateVolumeResponse, Volume @@ -40,22 +47,18 @@ def __init__( def get_actions_list( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a volume. + """ + Returns a paginated list of Actions for a Volume. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, status=status, sort=sort, page=page, per_page=per_page @@ -63,16 +66,14 @@ def get_actions_list( def get_actions( self, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a volume. + """ + Returns all Actions for a Volume. - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions(self, status=status, sort=sort) @@ -142,7 +143,10 @@ class VolumesPageResult(NamedTuple): meta: Meta -class VolumesClient(ResourceClientBase): +class VolumesClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): _base_url = "/volumes" actions: ResourceActionsClient @@ -293,59 +297,40 @@ def create( def get_actions_list( self, volume: Volume | BoundVolume, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: - """Returns all action objects for a volume. - - :param volume: :class:`BoundVolume ` or :class:`Volume ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :param page: int (optional) - Specifies the page to fetch - :param per_page: int (optional) - Specifies how many results are returned by page - :return: (List[:class:`BoundAction `], :class:`Meta `) """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page + Returns a paginated list of Actions for a Volume. - response = self._client.request( - url=f"{self._base_url}/{volume.id}/actions", - method="GET", - params=params, + :param volume: Volume to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. + """ + return self._get_actions_list( + f"{self._base_url}/{volume.id}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) - actions = [ - BoundAction(self._parent.actions, action_data) - for action_data in response["actions"] - ] - return ActionsPageResult(actions, Meta.parse_meta(response)) def get_actions( self, volume: Volume | BoundVolume, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: - """Returns all action objects for a volume. + """ + Returns all Actions for a Volume. - :param volume: :class:`BoundVolume ` or :class:`Volume ` - :param status: List[str] (optional) - Response will have only actions with specified statuses. Choices: `running` `success` `error` - :param sort: List[str] (optional) - Specify how the results are sorted. Choices: `id` `id:asc` `id:desc` `command` `command:asc` `command:desc` `status` `status:asc` `status:desc` `progress` `progress:asc` `progress:desc` `started` `started:asc` `started:desc` `finished` `finished:asc` `finished:desc` - :return: List[:class:`BoundAction `] + :param volume: Volume to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list, diff --git a/hcloud/zones/client.py b/hcloud/zones/client.py index 1e5383b1..e6a3ac3c 100644 --- a/hcloud/zones/client.py +++ b/hcloud/zones/client.py @@ -2,7 +2,14 @@ from typing import TYPE_CHECKING, Any, NamedTuple -from ..actions import ActionsPageResult, BoundAction, ResourceActionsClient +from ..actions import ( + ActionSort, + ActionsPageResult, + ActionStatus, + BoundAction, + ResourceActionsClient, +) +from ..actions.client import ResourceClientBaseActionsMixin from ..core import BoundModelBase, Meta, ResourceClientBase from .domain import ( CreateZoneResponse, @@ -81,20 +88,20 @@ def export_zonefile(self) -> ExportZonefileResponse: def get_actions_list( self, *, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: """ - Returns all Actions for the Zone for a specific page. + Returns a paginated list of Actions for a Zone. See https://docs.hetzner.cloud/reference/cloud#zones-list-zones - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. - :param page: Page number to return. - :param per_page: Maximum number of entries returned per page. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ return self._client.get_actions_list( self, @@ -107,16 +114,16 @@ def get_actions_list( def get_actions( self, *, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: """ - Returns all Actions for the Zone. + Returns all Actions for a Zone. See https://docs.hetzner.cloud/reference/cloud#zones-list-zones - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._client.get_actions( self, @@ -551,7 +558,10 @@ class ZoneRRSetsPageResult(NamedTuple): meta: Meta -class ZonesClient(ResourceClientBase): +class ZonesClient( + ResourceClientBaseActionsMixin, + ResourceClientBase, +): """ ZoneClient is a client for the Zone (DNS) API. @@ -774,57 +784,45 @@ def get_actions_list( self, zone: Zone | BoundZone, *, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, page: int | None = None, per_page: int | None = None, ) -> ActionsPageResult: """ - Returns all Actions for a Zone for a specific page. + Returns a paginated list of Actions for a Zone. See https://docs.hetzner.cloud/reference/cloud#zones-list-zones - :param zone: Zone to fetch the Actions from. - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. - :param page: Page number to return. - :param per_page: Maximum number of entries returned per page. + :param zone: Zone to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. + :param page: Page number to get. + :param per_page: Maximum number of Actions returned per page. """ - params: dict[str, Any] = {} - if status is not None: - params["status"] = status - if sort is not None: - params["sort"] = sort - if page is not None: - params["page"] = page - if per_page is not None: - params["per_page"] = per_page - - response = self._client.request( - method="GET", - url=f"{self._base_url}/{zone.id_or_name}/actions", - params=params, - ) - return ActionsPageResult( - actions=[BoundAction(self._parent.actions, o) for o in response["actions"]], - meta=Meta.parse_meta(response), + return self._get_actions_list( + f"{self._base_url}/{zone.id_or_name}", + status=status, + sort=sort, + page=page, + per_page=per_page, ) def get_actions( self, zone: Zone | BoundZone, *, - status: list[str] | None = None, - sort: list[str] | None = None, + status: list[ActionStatus] | None = None, + sort: list[ActionSort] | None = None, ) -> list[BoundAction]: """ Returns all Actions for a Zone. See https://docs.hetzner.cloud/reference/cloud#zones-list-zones - :param zone: Zone to fetch the Actions from. - :param status: Filter the actions by status. The response will only contain actions matching the specified statuses. - :param sort: Sort resources by field and direction. + :param zone: Zone to get the Actions for. + :param status: Filter the Actions by status. + :param sort: Sort Actions by field and direction. """ return self._iter_pages( self.get_actions_list,