1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
|
from __future__ import annotations
from typing import TYPE_CHECKING, Any, NamedTuple
from ..actions import BoundAction
from ..core import BoundModelBase, ClientEntityBase, Meta
from .domain import CreatePlacementGroupResponse, PlacementGroup
if TYPE_CHECKING:
from .._client import Client
class BoundPlacementGroup(BoundModelBase, PlacementGroup):
_client: PlacementGroupsClient
model = PlacementGroup
def update(
self,
labels: dict[str, str] | None = None,
name: str | None = None,
) -> BoundPlacementGroup:
"""Updates the name or labels of a Placement Group
:param labels: Dict[str, str] (optional)
User-defined labels (key-value pairs)
:param name: str, (optional)
New Name to set
:return: :class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>`
"""
return self._client.update(self, labels, name)
def delete(self) -> bool:
"""Deletes a Placement Group
:return: boolean
"""
return self._client.delete(self)
class PlacementGroupsPageResult(NamedTuple):
placement_groups: list[BoundPlacementGroup]
meta: Meta | None
class PlacementGroupsClient(ClientEntityBase):
_client: Client
def get_by_id(self, id: int) -> BoundPlacementGroup:
"""Returns a specific Placement Group object
:param id: int
:return: :class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>`
"""
response = self._client.request(
url=f"/placement_groups/{id}",
method="GET",
)
return BoundPlacementGroup(self, response["placement_group"])
def get_list(
self,
label_selector: str | None = None,
page: int | None = None,
per_page: int | None = None,
name: str | None = None,
sort: list[str] | None = None,
type: str | None = None,
) -> PlacementGroupsPageResult:
"""Get a list of Placement Groups
:param label_selector: str (optional)
Can be used to filter Placement Groups by labels. The response will only contain Placement Groups matching the label selector values.
:param page: int (optional)
Specifies the page to fetch
:param per_page: int (optional)
Specifies how many results are returned by page
:param name: str (optional)
Can be used to filter Placement Groups by their name.
:param sort: List[str] (optional)
Choices: id name created (You can add one of ":asc", ":desc" to modify sort order. ( ":asc" is default))
:return: (List[:class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>`], :class:`Meta <hcloud.core.domain.Meta>`)
"""
params: dict[str, Any] = {}
if label_selector is not None:
params["label_selector"] = label_selector
if page is not None:
params["page"] = page
if per_page is not None:
params["per_page"] = per_page
if name is not None:
params["name"] = name
if sort is not None:
params["sort"] = sort
if type is not None:
params["type"] = type
response = self._client.request(
url="/placement_groups", method="GET", params=params
)
placement_groups = [
BoundPlacementGroup(self, placement_group_data)
for placement_group_data in response["placement_groups"]
]
return PlacementGroupsPageResult(placement_groups, Meta.parse_meta(response))
def get_all(
self,
label_selector: str | None = None,
name: str | None = None,
sort: list[str] | None = None,
) -> list[BoundPlacementGroup]:
"""Get all Placement Groups
:param label_selector: str (optional)
Can be used to filter Placement Groups by labels. The response will only contain Placement Groups matching the label selector values.
:param name: str (optional)
Can be used to filter Placement Groups by their name.
:param sort: List[str] (optional)
Choices: id name created (You can add one of ":asc", ":desc" to modify sort order. ( ":asc" is default))
:return: List[:class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>`]
"""
return self._iter_pages(
self.get_list,
label_selector=label_selector,
name=name,
sort=sort,
)
def get_by_name(self, name: str) -> BoundPlacementGroup | None:
"""Get Placement Group by name
:param name: str
Used to get Placement Group by name
:return: class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>`
"""
return self._get_first_by(name=name)
def create(
self,
name: str,
type: str,
labels: dict[str, str] | None = None,
) -> CreatePlacementGroupResponse:
"""Creates a new Placement Group.
:param name: str
Placement Group Name
:param type: str
Type of the Placement Group
:param labels: Dict[str, str] (optional)
User-defined labels (key-value pairs)
:return: :class:`CreatePlacementGroupResponse <hcloud.placement_groups.domain.CreatePlacementGroupResponse>`
"""
data: dict[str, Any] = {"name": name, "type": type}
if labels is not None:
data["labels"] = labels
response = self._client.request(
url="/placement_groups", json=data, method="POST"
)
action = None
if response.get("action") is not None:
action = BoundAction(self._client.actions, response["action"])
result = CreatePlacementGroupResponse(
placement_group=BoundPlacementGroup(self, response["placement_group"]),
action=action,
)
return result
def update(
self,
placement_group: PlacementGroup | BoundPlacementGroup,
labels: dict[str, str] | None = None,
name: str | None = None,
) -> BoundPlacementGroup:
"""Updates the description or labels of a Placement Group.
:param placement_group: :class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>` or :class:`PlacementGroup <hcloud.placement_groups.domain.PlacementGroup>`
:param labels: Dict[str, str] (optional)
User-defined labels (key-value pairs)
:param name: str (optional)
New name to set
:return: :class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>`
"""
data: dict[str, Any] = {}
if labels is not None:
data["labels"] = labels
if name is not None:
data["name"] = name
response = self._client.request(
url=f"/placement_groups/{placement_group.id}",
method="PUT",
json=data,
)
return BoundPlacementGroup(self, response["placement_group"])
def delete(self, placement_group: PlacementGroup | BoundPlacementGroup) -> bool:
"""Deletes a Placement Group.
:param placement_group: :class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>` or :class:`PlacementGroup <hcloud.placement_groups.domain.PlacementGroup>`
:return: boolean
"""
self._client.request(
url=f"/placement_groups/{placement_group.id}",
method="DELETE",
)
return True
|