Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions docs/api.clients.storage_box_types.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
StorageBoxTypesClient
=====================

.. autoclass:: hcloud.storage_box_types.client.StorageBoxTypesClient
:members:

.. autoclass:: hcloud.storage_box_types.client.StorageBoxTypesPageResult
:members:

.. autoclass:: hcloud.storage_box_types.client.BoundStorageBoxType
:members:

.. autoclass:: hcloud.storage_box_types.domain.StorageBoxType
:members:
75 changes: 75 additions & 0 deletions docs/api.clients.storage_boxes.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
StorageBoxesClient
=====================

.. autoclass:: hcloud.storage_boxes.client.StorageBoxesClient
:members:

.. autoclass:: hcloud.storage_boxes.client.StorageBoxesPageResult
:members:

.. autoclass:: hcloud.storage_boxes.client.StorageBoxSnapshotsPageResult
:members:

.. autoclass:: hcloud.storage_boxes.client.StorageBoxSubaccountsPageResult
:members:

.. autoclass:: hcloud.storage_boxes.client.BoundStorageBox
:members:

.. autoclass:: hcloud.storage_boxes.client.BoundStorageBoxSnapshot
:members:

.. autoclass:: hcloud.storage_boxes.client.BoundStorageBoxSubaccount
:members:


.. autoclass:: hcloud.storage_boxes.domain.StorageBox
:members:

.. autoclass:: hcloud.storage_boxes.domain.StorageBoxAccessSettings
:members:

.. autoclass:: hcloud.storage_boxes.domain.StorageBoxSnapshotPlan
:members:

.. autoclass:: hcloud.storage_boxes.domain.StorageBoxStats
:members:

.. autoclass:: hcloud.storage_boxes.domain.StorageBoxStatus
:members:


.. autoclass:: hcloud.storage_boxes.domain.StorageBoxSnapshot
:members:

.. autoclass:: hcloud.storage_boxes.domain.StorageBoxSnapshotStats
:members:


.. autoclass:: hcloud.storage_boxes.domain.StorageBoxSubaccount
:members:

.. autoclass:: hcloud.storage_boxes.domain.StorageBoxSubaccountAccessSettings
:members:


.. autoclass:: hcloud.storage_boxes.domain.CreateStorageBoxResponse
:members:

.. autoclass:: hcloud.storage_boxes.domain.CreateStorageBoxSnapshotResponse
:members:

.. autoclass:: hcloud.storage_boxes.domain.CreateStorageBoxSubaccountResponse
:members:

.. autoclass:: hcloud.storage_boxes.domain.StorageBoxFoldersResponse
:members:

.. autoclass:: hcloud.storage_boxes.domain.DeleteStorageBoxResponse
:members:

.. autoclass:: hcloud.storage_boxes.domain.DeleteStorageBoxSnapshotResponse
:members:

.. autoclass:: hcloud.storage_boxes.domain.DeleteStorageBoxSubaccountResponse
:members:
26 changes: 26 additions & 0 deletions hcloud/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
from .server_types import ServerTypesClient
from .servers import ServersClient
from .ssh_keys import SSHKeysClient
from .storage_box_types import StorageBoxTypesClient
from .storage_boxes import StorageBoxesClient
from .volumes import VolumesClient
from .zones import ZonesClient

Expand Down Expand Up @@ -141,11 +143,14 @@ def __init__(
poll_interval: int | float | BackoffFunction = 1.0,
poll_max_retries: int = 120,
timeout: float | tuple[float, float] | None = None,
*,
api_endpoint_hetzner: str = "https://api.hetzner.com/v1",
):
"""Create a new Client instance

:param token: Hetzner Cloud API token
:param api_endpoint: Hetzner Cloud API endpoint
:param api_endpoint_hetzner: Hetzner API endpoint.
:param application_name: Your application name
:param application_version: Your application _version
:param poll_interval:
Expand All @@ -164,6 +169,15 @@ def __init__(
poll_max_retries=poll_max_retries,
timeout=timeout,
)
self._client_hetzner = ClientBase(
token=token,
endpoint=api_endpoint_hetzner,
application_name=application_name,
application_version=application_version,
poll_interval=poll_interval,
poll_max_retries=poll_max_retries,
timeout=timeout,
)

self.datacenters = DatacentersClient(self)
"""DatacentersClient Instance
Expand Down Expand Up @@ -261,6 +275,18 @@ def __init__(
:type: :class:`ZonesClient <hcloud.zones.client.ZonesClient>`
"""

self.storage_box_types = StorageBoxTypesClient(self)
"""StorageBoxTypesClient Instance

:type: :class:`StorageBoxTypesClient <hcloud.storage_box_types.client.StorageBoxTypesClient>`
"""

self.storage_boxes = StorageBoxesClient(self)
"""StorageBoxesClient Instance

:type: :class:`StorageBoxesClient <hcloud.storage_boxes.client.StorageBoxesClient>`
"""

def request( # type: ignore[no-untyped-def]
self,
method: str,
Expand Down
15 changes: 15 additions & 0 deletions hcloud/storage_box_types/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from __future__ import annotations

from .client import (
BoundStorageBoxType,
StorageBoxTypesClient,
StorageBoxTypesPageResult,
)
from .domain import StorageBoxType

__all__ = [
"BoundStorageBoxType",
"StorageBoxType",
"StorageBoxTypesClient",
"StorageBoxTypesPageResult",
]
109 changes: 109 additions & 0 deletions hcloud/storage_box_types/client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
from __future__ import annotations

from typing import TYPE_CHECKING, Any, NamedTuple

from ..core import BoundModelBase, Meta, ResourceClientBase
from .domain import StorageBoxType

if TYPE_CHECKING:
from .._client import Client


class BoundStorageBoxType(BoundModelBase, StorageBoxType):
_client: StorageBoxTypesClient

model = StorageBoxType


class StorageBoxTypesPageResult(NamedTuple):
storage_box_types: list[BoundStorageBoxType]
meta: Meta


class StorageBoxTypesClient(ResourceClientBase):
"""
A client for the Storage Box Types API.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-types.
"""

_base_url = "/storage_box_types"

def __init__(self, client: Client):
super().__init__(client)
self._client = client._client_hetzner

def get_by_id(self, id: int) -> BoundStorageBoxType:
"""
Returns a specific Storage Box Type.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-types-get-a-storage-box-type

:param id: ID of the Storage Box Type.
"""
response = self._client.request(
method="GET",
url=f"{self._base_url}/{id}",
)
return BoundStorageBoxType(self, response["storage_box_type"])

def get_by_name(self, name: str) -> BoundStorageBoxType | None:
"""
Returns a specific Storage Box Type.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-types-list-storage-box-types

:param name: Name of the Storage Box Type.
"""
return self._get_first_by(self.get_list, name=name)

def get_list(
self,
name: str | None = None,
page: int | None = None,
per_page: int | None = None,
) -> StorageBoxTypesPageResult:
"""
Returns a list of Storage Box Types for a specific page.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-types-list-storage-box-types

:param name: Name of the Storage Box Type.
:param page: Page number to return.
:param per_page: Maximum number of entries returned per page.
"""
params: dict[str, Any] = {}
if name is not None:
params["name"] = name
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}",
params=params,
)
return StorageBoxTypesPageResult(
storage_box_types=[
BoundStorageBoxType(self, o) for o in response["storage_box_types"]
],
meta=Meta.parse_meta(response),
)

def get_all(
self,
name: str | None = None,
) -> list[BoundStorageBoxType]:
"""
Returns all Storage Box Types.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-types-list-storage-box-types

:param name: Name of the Storage Box Type.
"""
return self._iter_pages(
self.get_list,
name=name,
)
49 changes: 49 additions & 0 deletions hcloud/storage_box_types/domain.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from __future__ import annotations

from ..core import BaseDomain, DomainIdentityMixin
from ..deprecation import DeprecationInfo


class StorageBoxType(BaseDomain, DomainIdentityMixin):
"""
Storage Box Type Domain.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-types.
"""

__api_properties__ = (
"id",
"name",
"description",
"snapshot_limit",
"automatic_snapshot_limit",
"subaccounts_limit",
"size",
"deprecation",
"prices",
)
__slots__ = __api_properties__

def __init__(
self,
id: int | None = None,
name: str | None = None,
description: str | None = None,
snapshot_limit: int | None = None,
automatic_snapshot_limit: int | None = None,
subaccounts_limit: int | None = None,
size: int | None = None,
prices: list[dict] | None = None,
deprecation: dict | None = None,
):
self.id = id
self.name = name
self.description = description
self.snapshot_limit = snapshot_limit
self.automatic_snapshot_limit = automatic_snapshot_limit
self.subaccounts_limit = subaccounts_limit
self.size = size
self.prices = prices
self.deprecation = (
DeprecationInfo.from_dict(deprecation) if deprecation is not None else None
)
55 changes: 55 additions & 0 deletions hcloud/storage_boxes/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from __future__ import annotations

from .client import (
BoundStorageBox,
BoundStorageBoxSnapshot,
BoundStorageBoxSubaccount,
StorageBoxesClient,
StorageBoxesPageResult,
StorageBoxSnapshotsPageResult,
StorageBoxSubaccountsPageResult,
)
from .domain import (
CreateStorageBoxResponse,
CreateStorageBoxSnapshotResponse,
CreateStorageBoxSubaccountResponse,
DeleteStorageBoxResponse,
DeleteStorageBoxSnapshotResponse,
DeleteStorageBoxSubaccountResponse,
StorageBox,
StorageBoxAccessSettings,
StorageBoxFoldersResponse,
StorageBoxSnapshot,
StorageBoxSnapshotPlan,
StorageBoxSnapshotStats,
StorageBoxStats,
StorageBoxStatus,
StorageBoxSubaccount,
StorageBoxSubaccountAccessSettings,
)

__all__ = [
"BoundStorageBox",
"BoundStorageBoxSnapshot",
"BoundStorageBoxSubaccount",
"CreateStorageBoxResponse",
"CreateStorageBoxSnapshotResponse",
"CreateStorageBoxSubaccountResponse",
"DeleteStorageBoxResponse",
"DeleteStorageBoxSnapshotResponse",
"DeleteStorageBoxSubaccountResponse",
"StorageBox",
"StorageBoxAccessSettings",
"StorageBoxesClient",
"StorageBoxesPageResult",
"StorageBoxFoldersResponse",
"StorageBoxSnapshot",
"StorageBoxSnapshotPlan",
"StorageBoxSnapshotsPageResult",
"StorageBoxSnapshotStats",
"StorageBoxStats",
"StorageBoxStatus",
"StorageBoxSubaccount",
"StorageBoxSubaccountAccessSettings",
"StorageBoxSubaccountsPageResult",
]
Loading