|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | | -from typing import TYPE_CHECKING, Any, NamedTuple |
| 3 | +from typing import TYPE_CHECKING, Any, Literal, NamedTuple |
4 | 4 |
|
5 | 5 | from ..actions import ( |
6 | 6 | ActionSort, |
|
11 | 11 | ) |
12 | 12 | from ..actions.client import ResourceClientBaseActionsMixin |
13 | 13 | from ..core import BoundModelBase, Meta, ResourceClientBase |
14 | | -from .domain import Network, NetworkRoute, NetworkSubnet |
| 14 | +from .domain import ( |
| 15 | + Network, |
| 16 | + NetworkMember, |
| 17 | + NetworkMemberStatus, |
| 18 | + NetworkMemberType, |
| 19 | + NetworkRoute, |
| 20 | + NetworkSubnet, |
| 21 | +) |
15 | 22 |
|
16 | 23 | if TYPE_CHECKING: |
17 | 24 | from .._client import Client |
@@ -185,6 +192,27 @@ class NetworksPageResult(NamedTuple): |
185 | 192 | meta: Meta |
186 | 193 |
|
187 | 194 |
|
| 195 | +NetworkMemberSort = Literal[ |
| 196 | + "id", |
| 197 | + "id:asc", |
| 198 | + "id:desc", |
| 199 | + "type", |
| 200 | + "type:asc", |
| 201 | + "type:desc", |
| 202 | + "status", |
| 203 | + "status:asc", |
| 204 | + "status:desc", |
| 205 | + "ip", |
| 206 | + "ip:asc", |
| 207 | + "ip:desc", |
| 208 | +] |
| 209 | + |
| 210 | + |
| 211 | +class NetworkMembersPageResult(NamedTuple): |
| 212 | + members: list[NetworkMember] |
| 213 | + meta: Meta |
| 214 | + |
| 215 | + |
188 | 216 | class NetworksClient( |
189 | 217 | ResourceClientBaseActionsMixin, |
190 | 218 | ResourceClientBase, |
@@ -372,6 +400,82 @@ def delete(self, network: Network | BoundNetwork) -> bool: |
372 | 400 | self._client.request(url=f"{self._base_url}/{network.id}", method="DELETE") |
373 | 401 | return True |
374 | 402 |
|
| 403 | + def get_member_list( |
| 404 | + self, |
| 405 | + network: Network | BoundNetwork, |
| 406 | + *, |
| 407 | + type: list[NetworkMemberType] | None = None, |
| 408 | + status: list[NetworkMemberStatus] | None = None, |
| 409 | + subnet: list[str] | None = None, |
| 410 | + sort: list[NetworkMemberSort] | None = None, |
| 411 | + page: int | None = None, |
| 412 | + per_page: int | None = None, |
| 413 | + ) -> NetworkMembersPageResult: |
| 414 | + """ |
| 415 | + Returns a paginated list of Members for a Network. |
| 416 | +
|
| 417 | + :param network: Network to get the Members for. |
| 418 | + :param type: Filter the Members by type. |
| 419 | + :param status: Filter the Members by status. |
| 420 | + :param subnet: Filter the Members by the subnet they are attached to. |
| 421 | + :param sort: Sort Members by field and direction. |
| 422 | + :param page: Page number to get. |
| 423 | + :param per_page: Maximum number of Members returned per page. |
| 424 | + """ |
| 425 | + params: dict[str, Any] = {} |
| 426 | + if type is not None: |
| 427 | + params["type"] = type |
| 428 | + if status is not None: |
| 429 | + params["status"] = status |
| 430 | + if subnet is not None: |
| 431 | + params["subnet"] = subnet |
| 432 | + if sort is not None: |
| 433 | + params["sort"] = sort |
| 434 | + if page is not None: |
| 435 | + params["page"] = page |
| 436 | + if per_page is not None: |
| 437 | + params["per_page"] = per_page |
| 438 | + |
| 439 | + response = self._client.request( |
| 440 | + url=f"{self._base_url}/{network.id}/members", |
| 441 | + method="GET", |
| 442 | + params=params, |
| 443 | + ) |
| 444 | + |
| 445 | + return NetworkMembersPageResult( |
| 446 | + members=[NetworkMember(**o) for o in response["members"]], |
| 447 | + meta=Meta.parse_meta(response), |
| 448 | + ) |
| 449 | + |
| 450 | + def get_member_all( |
| 451 | + self, |
| 452 | + network: Network | BoundNetwork, |
| 453 | + *, |
| 454 | + type: list[NetworkMemberType] | None = None, |
| 455 | + status: list[NetworkMemberStatus] | None = None, |
| 456 | + subnet: list[str] | None = None, |
| 457 | + sort: list[NetworkMemberSort] | None = None, |
| 458 | + ) -> list[NetworkMember]: |
| 459 | + """ |
| 460 | + Returns all of Members for a Network. |
| 461 | +
|
| 462 | + :param network: Network to get the Members for. |
| 463 | + :param type: Filter the Members by type. |
| 464 | + :param status: Filter the Members by status. |
| 465 | + :param subnet: Filter the Members by the subnet they are attached to. |
| 466 | + :param sort: Sort Members by field and direction. |
| 467 | + :param page: Page number to get. |
| 468 | + :param per_page: Maximum number of Members returned per page. |
| 469 | + """ |
| 470 | + return self._iter_pages( |
| 471 | + self.get_member_list, |
| 472 | + network, |
| 473 | + type=type, |
| 474 | + status=status, |
| 475 | + subnet=subnet, |
| 476 | + sort=sort, |
| 477 | + ) |
| 478 | + |
375 | 479 | def get_actions_list( |
376 | 480 | self, |
377 | 481 | network: Network | BoundNetwork, |
|
0 commit comments