diff --git a/scaleway-async/scaleway_async/baremetal/v3/__init__.py b/scaleway-async/scaleway_async/baremetal/v3/__init__.py new file mode 100644 index 000000000..990fa6b2e --- /dev/null +++ b/scaleway-async/scaleway_async/baremetal/v3/__init__.py @@ -0,0 +1,27 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from .types import ListServerPrivateNetworksRequestOrderBy +from .types import ServerPrivateNetworkStatus +from .content import SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES +from .types import ServerPrivateNetwork +from .types import ListServerPrivateNetworksResponse +from .types import PrivateNetworkApiAddServerPrivateNetworkRequest +from .types import PrivateNetworkApiDeleteServerPrivateNetworkRequest +from .types import PrivateNetworkApiListServerPrivateNetworksRequest +from .types import PrivateNetworkApiSetServerPrivateNetworksRequest +from .types import SetServerPrivateNetworksResponse +from .api import BaremetalV3PrivateNetworkAPI + +__all__ = [ + "ListServerPrivateNetworksRequestOrderBy", + "ServerPrivateNetworkStatus", + "SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES", + "ServerPrivateNetwork", + "ListServerPrivateNetworksResponse", + "PrivateNetworkApiAddServerPrivateNetworkRequest", + "PrivateNetworkApiDeleteServerPrivateNetworkRequest", + "PrivateNetworkApiListServerPrivateNetworksRequest", + "PrivateNetworkApiSetServerPrivateNetworksRequest", + "SetServerPrivateNetworksResponse", + "BaremetalV3PrivateNetworkAPI", +] diff --git a/scaleway-async/scaleway_async/baremetal/v3/api.py b/scaleway-async/scaleway_async/baremetal/v3/api.py new file mode 100644 index 000000000..fe209ae52 --- /dev/null +++ b/scaleway-async/scaleway_async/baremetal/v3/api.py @@ -0,0 +1,262 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Dict, List, Optional + +from scaleway_core.api import API +from scaleway_core.bridge import ( + Zone, +) +from scaleway_core.utils import ( + validate_path_param, + fetch_all_pages_async, +) +from .types import ( + ListServerPrivateNetworksRequestOrderBy, + ListServerPrivateNetworksResponse, + PrivateNetworkApiAddServerPrivateNetworkRequest, + PrivateNetworkApiSetServerPrivateNetworksRequest, + ServerPrivateNetwork, + SetServerPrivateNetworksResponse, +) +from .marshalling import ( + unmarshal_ServerPrivateNetwork, + unmarshal_ListServerPrivateNetworksResponse, + unmarshal_SetServerPrivateNetworksResponse, + marshal_PrivateNetworkApiAddServerPrivateNetworkRequest, + marshal_PrivateNetworkApiSetServerPrivateNetworksRequest, +) + + +class BaremetalV3PrivateNetworkAPI(API): + """ + Elastic Metal - Private Networks API. + """ + + async def add_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> ServerPrivateNetwork: + """ + Add a server to a Private Network. + Add an Elastic Metal server to a Private Network. + :param server_id: UUID of the server. + :param private_network_id: UUID of the Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param ipam_ip_ids: IPAM IDs of an IPs to attach to the server. + :return: :class:`ServerPrivateNetwork ` + + Usage: + :: + + result = await api.add_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + + res = self._request( + "POST", + f"/baremetal/v3/zones/{param_zone}/servers/{param_server_id}/private-networks", + body=marshal_PrivateNetworkApiAddServerPrivateNetworkRequest( + PrivateNetworkApiAddServerPrivateNetworkRequest( + server_id=server_id, + private_network_id=private_network_id, + zone=zone, + ipam_ip_ids=ipam_ip_ids, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_ServerPrivateNetwork(res.json()) + + async def set_server_private_networks( + self, + *, + server_id: str, + per_private_network_ipam_ip_ids: Dict[str, List[str]], + zone: Optional[Zone] = None, + ) -> SetServerPrivateNetworksResponse: + """ + Set multiple Private Networks on a server. + Configure multiple Private Networks on an Elastic Metal server. + :param server_id: UUID of the server. + :param per_private_network_ipam_ip_ids: Object where the keys are the UUIDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Elastic Metal server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`SetServerPrivateNetworksResponse ` + + Usage: + :: + + result = await api.set_server_private_networks( + server_id="example", + per_private_network_ipam_ip_ids={}, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + + res = self._request( + "PUT", + f"/baremetal/v3/zones/{param_zone}/servers/{param_server_id}/private-networks", + body=marshal_PrivateNetworkApiSetServerPrivateNetworksRequest( + PrivateNetworkApiSetServerPrivateNetworksRequest( + server_id=server_id, + per_private_network_ipam_ip_ids=per_private_network_ipam_ip_ids, + zone=zone, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_SetServerPrivateNetworksResponse(res.json()) + + async def list_server_private_networks( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + server_id: Optional[str] = None, + private_network_id: Optional[str] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> ListServerPrivateNetworksResponse: + """ + List the Private Networks of a server. + List the Private Networks of an Elastic Metal server. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Sort order for the returned Private Networks. + :param page: Page number for the returned Private Networks. + :param page_size: Maximum number of Private Networks per page. + :param server_id: Filter Private Networks by server UUID. + :param private_network_id: Filter Private Networks by Private Network UUID. + :param organization_id: Filter Private Networks by organization UUID. + :param project_id: Filter Private Networks by project UUID. + :param ipam_ip_ids: Filter Private Networks by IPAM IP UUIDs. + :return: :class:`ListServerPrivateNetworksResponse ` + + Usage: + :: + + result = await api.list_server_private_networks() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/baremetal/v3/zones/{param_zone}/server-private-networks", + params={ + "ipam_ip_ids": ipam_ip_ids, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_network_id": private_network_id, + "project_id": project_id or self.client.default_project_id, + "server_id": server_id, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListServerPrivateNetworksResponse(res.json()) + + async def list_server_private_networks_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + server_id: Optional[str] = None, + private_network_id: Optional[str] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> List[ServerPrivateNetwork]: + """ + List the Private Networks of a server. + List the Private Networks of an Elastic Metal server. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Sort order for the returned Private Networks. + :param page: Page number for the returned Private Networks. + :param page_size: Maximum number of Private Networks per page. + :param server_id: Filter Private Networks by server UUID. + :param private_network_id: Filter Private Networks by Private Network UUID. + :param organization_id: Filter Private Networks by organization UUID. + :param project_id: Filter Private Networks by project UUID. + :param ipam_ip_ids: Filter Private Networks by IPAM IP UUIDs. + :return: :class:`List[ServerPrivateNetwork] ` + + Usage: + :: + + result = await api.list_server_private_networks_all() + """ + + return await fetch_all_pages_async( + type=ListServerPrivateNetworksResponse, + key="server_private_networks", + fetcher=self.list_server_private_networks, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "server_id": server_id, + "private_network_id": private_network_id, + "organization_id": organization_id, + "project_id": project_id, + "ipam_ip_ids": ipam_ip_ids, + }, + ) + + async def delete_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ) -> None: + """ + Delete a Private Network. + :param server_id: UUID of the server. + :param private_network_id: UUID of the Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + + Usage: + :: + + result = await api.delete_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + param_private_network_id = validate_path_param( + "private_network_id", private_network_id + ) + + res = self._request( + "DELETE", + f"/baremetal/v3/zones/{param_zone}/servers/{param_server_id}/private-networks/{param_private_network_id}", + ) + + self._throw_on_error(res) diff --git a/scaleway-async/scaleway_async/baremetal/v3/content.py b/scaleway-async/scaleway_async/baremetal/v3/content.py new file mode 100644 index 000000000..66774cc7c --- /dev/null +++ b/scaleway-async/scaleway_async/baremetal/v3/content.py @@ -0,0 +1,15 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from typing import List + +from .types import ( + ServerPrivateNetworkStatus, +) + +SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES: List[ServerPrivateNetworkStatus] = [ + ServerPrivateNetworkStatus.ATTACHING, + ServerPrivateNetworkStatus.DETACHING, +] +""" +Lists transient statutes of the enum :class:`ServerPrivateNetworkStatus `. +""" diff --git a/scaleway-async/scaleway_async/baremetal/v3/marshalling.py b/scaleway-async/scaleway_async/baremetal/v3/marshalling.py new file mode 100644 index 000000000..d1c8dee32 --- /dev/null +++ b/scaleway-async/scaleway_async/baremetal/v3/marshalling.py @@ -0,0 +1,142 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Any, Dict +from dateutil import parser + +from scaleway_core.profile import ProfileDefaults +from .types import ( + ServerPrivateNetwork, + ListServerPrivateNetworksResponse, + SetServerPrivateNetworksResponse, + PrivateNetworkApiAddServerPrivateNetworkRequest, + PrivateNetworkApiSetServerPrivateNetworksRequest, +) + + +def unmarshal_ServerPrivateNetwork(data: Any) -> ServerPrivateNetwork: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ServerPrivateNetwork' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("server_id", None) + if field is not None: + args["server_id"] = field + + field = data.get("private_network_id", None) + if field is not None: + args["private_network_id"] = field + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("ipam_ip_ids", None) + if field is not None: + args["ipam_ip_ids"] = field + + field = data.get("vlan", None) + if field is not None: + args["vlan"] = field + else: + args["vlan"] = None + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return ServerPrivateNetwork(**args) + + +def unmarshal_ListServerPrivateNetworksResponse( + data: Any, +) -> ListServerPrivateNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListServerPrivateNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("server_private_networks", None) + if field is not None: + args["server_private_networks"] = ( + [unmarshal_ServerPrivateNetwork(v) for v in field] + if field is not None + else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListServerPrivateNetworksResponse(**args) + + +def unmarshal_SetServerPrivateNetworksResponse( + data: Any, +) -> SetServerPrivateNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'SetServerPrivateNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("server_private_networks", None) + if field is not None: + args["server_private_networks"] = ( + [unmarshal_ServerPrivateNetwork(v) for v in field] + if field is not None + else None + ) + + return SetServerPrivateNetworksResponse(**args) + + +def marshal_PrivateNetworkApiAddServerPrivateNetworkRequest( + request: PrivateNetworkApiAddServerPrivateNetworkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.private_network_id is not None: + output["private_network_id"] = request.private_network_id + + if request.ipam_ip_ids is not None: + output["ipam_ip_ids"] = request.ipam_ip_ids + + return output + + +def marshal_PrivateNetworkApiSetServerPrivateNetworksRequest( + request: PrivateNetworkApiSetServerPrivateNetworksRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.per_private_network_ipam_ip_ids is not None: + output["per_private_network_ipam_ip_ids"] = { + key: value for key, value in request.per_private_network_ipam_ip_ids.items() + } + + return output diff --git a/scaleway-async/scaleway_async/baremetal/v3/types.py b/scaleway-async/scaleway_async/baremetal/v3/types.py new file mode 100644 index 000000000..b0bd3abef --- /dev/null +++ b/scaleway-async/scaleway_async/baremetal/v3/types.py @@ -0,0 +1,204 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime +from enum import Enum +from typing import Dict, List, Optional + +from scaleway_core.bridge import ( + Zone, +) +from scaleway_core.utils import ( + StrEnumMeta, +) + + +class ListServerPrivateNetworksRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + UPDATED_AT_ASC = "updated_at_asc" + UPDATED_AT_DESC = "updated_at_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ServerPrivateNetworkStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_STATUS = "unknown_status" + ATTACHING = "attaching" + ATTACHED = "attached" + ERROR = "error" + DETACHING = "detaching" + LOCKED = "locked" + + def __str__(self) -> str: + return str(self.value) + + +@dataclass +class ServerPrivateNetwork: + id: str + """ + UUID of the Server-to-Private Network mapping. + """ + + project_id: str + """ + Private Network Project UUID. + """ + + server_id: str + """ + Server UUID. + """ + + private_network_id: str + """ + Private Network UUID. + """ + + status: ServerPrivateNetworkStatus + """ + Configuration status of the Private Network. + """ + + ipam_ip_ids: List[str] + """ + IPAM IP IDs of the server, if it has any. + """ + + vlan: Optional[int] + """ + VLAN UUID associated with the Private Network. + """ + + created_at: Optional[datetime] + """ + Private Network creation date. + """ + + updated_at: Optional[datetime] + """ + Date the Private Network was last modified. + """ + + +@dataclass +class ListServerPrivateNetworksResponse: + server_private_networks: List[ServerPrivateNetwork] + + total_count: int + + +@dataclass +class PrivateNetworkApiAddServerPrivateNetworkRequest: + server_id: str + """ + UUID of the server. + """ + + private_network_id: str + """ + UUID of the Private Network. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + ipam_ip_ids: Optional[List[str]] + """ + IPAM IDs of an IPs to attach to the server. + """ + + +@dataclass +class PrivateNetworkApiDeleteServerPrivateNetworkRequest: + server_id: str + """ + UUID of the server. + """ + + private_network_id: str + """ + UUID of the Private Network. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class PrivateNetworkApiListServerPrivateNetworksRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] + """ + Sort order for the returned Private Networks. + """ + + page: Optional[int] + """ + Page number for the returned Private Networks. + """ + + page_size: Optional[int] + """ + Maximum number of Private Networks per page. + """ + + server_id: Optional[str] + """ + Filter Private Networks by server UUID. + """ + + private_network_id: Optional[str] + """ + Filter Private Networks by Private Network UUID. + """ + + organization_id: Optional[str] + """ + Filter Private Networks by organization UUID. + """ + + project_id: Optional[str] + """ + Filter Private Networks by project UUID. + """ + + ipam_ip_ids: Optional[List[str]] + """ + Filter Private Networks by IPAM IP UUIDs. + """ + + +@dataclass +class PrivateNetworkApiSetServerPrivateNetworksRequest: + server_id: str + """ + UUID of the server. + """ + + per_private_network_ipam_ip_ids: Dict[str, List[str]] + """ + Object where the keys are the UUIDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Elastic Metal server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class SetServerPrivateNetworksResponse: + server_private_networks: List[ServerPrivateNetwork] diff --git a/scaleway/scaleway/baremetal/v3/__init__.py b/scaleway/scaleway/baremetal/v3/__init__.py new file mode 100644 index 000000000..990fa6b2e --- /dev/null +++ b/scaleway/scaleway/baremetal/v3/__init__.py @@ -0,0 +1,27 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from .types import ListServerPrivateNetworksRequestOrderBy +from .types import ServerPrivateNetworkStatus +from .content import SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES +from .types import ServerPrivateNetwork +from .types import ListServerPrivateNetworksResponse +from .types import PrivateNetworkApiAddServerPrivateNetworkRequest +from .types import PrivateNetworkApiDeleteServerPrivateNetworkRequest +from .types import PrivateNetworkApiListServerPrivateNetworksRequest +from .types import PrivateNetworkApiSetServerPrivateNetworksRequest +from .types import SetServerPrivateNetworksResponse +from .api import BaremetalV3PrivateNetworkAPI + +__all__ = [ + "ListServerPrivateNetworksRequestOrderBy", + "ServerPrivateNetworkStatus", + "SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES", + "ServerPrivateNetwork", + "ListServerPrivateNetworksResponse", + "PrivateNetworkApiAddServerPrivateNetworkRequest", + "PrivateNetworkApiDeleteServerPrivateNetworkRequest", + "PrivateNetworkApiListServerPrivateNetworksRequest", + "PrivateNetworkApiSetServerPrivateNetworksRequest", + "SetServerPrivateNetworksResponse", + "BaremetalV3PrivateNetworkAPI", +] diff --git a/scaleway/scaleway/baremetal/v3/api.py b/scaleway/scaleway/baremetal/v3/api.py new file mode 100644 index 000000000..47ee58457 --- /dev/null +++ b/scaleway/scaleway/baremetal/v3/api.py @@ -0,0 +1,262 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Dict, List, Optional + +from scaleway_core.api import API +from scaleway_core.bridge import ( + Zone, +) +from scaleway_core.utils import ( + validate_path_param, + fetch_all_pages, +) +from .types import ( + ListServerPrivateNetworksRequestOrderBy, + ListServerPrivateNetworksResponse, + PrivateNetworkApiAddServerPrivateNetworkRequest, + PrivateNetworkApiSetServerPrivateNetworksRequest, + ServerPrivateNetwork, + SetServerPrivateNetworksResponse, +) +from .marshalling import ( + unmarshal_ServerPrivateNetwork, + unmarshal_ListServerPrivateNetworksResponse, + unmarshal_SetServerPrivateNetworksResponse, + marshal_PrivateNetworkApiAddServerPrivateNetworkRequest, + marshal_PrivateNetworkApiSetServerPrivateNetworksRequest, +) + + +class BaremetalV3PrivateNetworkAPI(API): + """ + Elastic Metal - Private Networks API. + """ + + def add_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> ServerPrivateNetwork: + """ + Add a server to a Private Network. + Add an Elastic Metal server to a Private Network. + :param server_id: UUID of the server. + :param private_network_id: UUID of the Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param ipam_ip_ids: IPAM IDs of an IPs to attach to the server. + :return: :class:`ServerPrivateNetwork ` + + Usage: + :: + + result = api.add_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + + res = self._request( + "POST", + f"/baremetal/v3/zones/{param_zone}/servers/{param_server_id}/private-networks", + body=marshal_PrivateNetworkApiAddServerPrivateNetworkRequest( + PrivateNetworkApiAddServerPrivateNetworkRequest( + server_id=server_id, + private_network_id=private_network_id, + zone=zone, + ipam_ip_ids=ipam_ip_ids, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_ServerPrivateNetwork(res.json()) + + def set_server_private_networks( + self, + *, + server_id: str, + per_private_network_ipam_ip_ids: Dict[str, List[str]], + zone: Optional[Zone] = None, + ) -> SetServerPrivateNetworksResponse: + """ + Set multiple Private Networks on a server. + Configure multiple Private Networks on an Elastic Metal server. + :param server_id: UUID of the server. + :param per_private_network_ipam_ip_ids: Object where the keys are the UUIDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Elastic Metal server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`SetServerPrivateNetworksResponse ` + + Usage: + :: + + result = api.set_server_private_networks( + server_id="example", + per_private_network_ipam_ip_ids={}, + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + + res = self._request( + "PUT", + f"/baremetal/v3/zones/{param_zone}/servers/{param_server_id}/private-networks", + body=marshal_PrivateNetworkApiSetServerPrivateNetworksRequest( + PrivateNetworkApiSetServerPrivateNetworksRequest( + server_id=server_id, + per_private_network_ipam_ip_ids=per_private_network_ipam_ip_ids, + zone=zone, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_SetServerPrivateNetworksResponse(res.json()) + + def list_server_private_networks( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + server_id: Optional[str] = None, + private_network_id: Optional[str] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> ListServerPrivateNetworksResponse: + """ + List the Private Networks of a server. + List the Private Networks of an Elastic Metal server. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Sort order for the returned Private Networks. + :param page: Page number for the returned Private Networks. + :param page_size: Maximum number of Private Networks per page. + :param server_id: Filter Private Networks by server UUID. + :param private_network_id: Filter Private Networks by Private Network UUID. + :param organization_id: Filter Private Networks by organization UUID. + :param project_id: Filter Private Networks by project UUID. + :param ipam_ip_ids: Filter Private Networks by IPAM IP UUIDs. + :return: :class:`ListServerPrivateNetworksResponse ` + + Usage: + :: + + result = api.list_server_private_networks() + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + + res = self._request( + "GET", + f"/baremetal/v3/zones/{param_zone}/server-private-networks", + params={ + "ipam_ip_ids": ipam_ip_ids, + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + "private_network_id": private_network_id, + "project_id": project_id or self.client.default_project_id, + "server_id": server_id, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListServerPrivateNetworksResponse(res.json()) + + def list_server_private_networks_all( + self, + *, + zone: Optional[Zone] = None, + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + server_id: Optional[str] = None, + private_network_id: Optional[str] = None, + organization_id: Optional[str] = None, + project_id: Optional[str] = None, + ipam_ip_ids: Optional[List[str]] = None, + ) -> List[ServerPrivateNetwork]: + """ + List the Private Networks of a server. + List the Private Networks of an Elastic Metal server. + :param zone: Zone to target. If none is passed will use default zone from the config. + :param order_by: Sort order for the returned Private Networks. + :param page: Page number for the returned Private Networks. + :param page_size: Maximum number of Private Networks per page. + :param server_id: Filter Private Networks by server UUID. + :param private_network_id: Filter Private Networks by Private Network UUID. + :param organization_id: Filter Private Networks by organization UUID. + :param project_id: Filter Private Networks by project UUID. + :param ipam_ip_ids: Filter Private Networks by IPAM IP UUIDs. + :return: :class:`List[ServerPrivateNetwork] ` + + Usage: + :: + + result = api.list_server_private_networks_all() + """ + + return fetch_all_pages( + type=ListServerPrivateNetworksResponse, + key="server_private_networks", + fetcher=self.list_server_private_networks, + args={ + "zone": zone, + "order_by": order_by, + "page": page, + "page_size": page_size, + "server_id": server_id, + "private_network_id": private_network_id, + "organization_id": organization_id, + "project_id": project_id, + "ipam_ip_ids": ipam_ip_ids, + }, + ) + + def delete_server_private_network( + self, + *, + server_id: str, + private_network_id: str, + zone: Optional[Zone] = None, + ) -> None: + """ + Delete a Private Network. + :param server_id: UUID of the server. + :param private_network_id: UUID of the Private Network. + :param zone: Zone to target. If none is passed will use default zone from the config. + + Usage: + :: + + result = api.delete_server_private_network( + server_id="example", + private_network_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_server_id = validate_path_param("server_id", server_id) + param_private_network_id = validate_path_param( + "private_network_id", private_network_id + ) + + res = self._request( + "DELETE", + f"/baremetal/v3/zones/{param_zone}/servers/{param_server_id}/private-networks/{param_private_network_id}", + ) + + self._throw_on_error(res) diff --git a/scaleway/scaleway/baremetal/v3/content.py b/scaleway/scaleway/baremetal/v3/content.py new file mode 100644 index 000000000..66774cc7c --- /dev/null +++ b/scaleway/scaleway/baremetal/v3/content.py @@ -0,0 +1,15 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from typing import List + +from .types import ( + ServerPrivateNetworkStatus, +) + +SERVER_PRIVATE_NETWORK_TRANSIENT_STATUSES: List[ServerPrivateNetworkStatus] = [ + ServerPrivateNetworkStatus.ATTACHING, + ServerPrivateNetworkStatus.DETACHING, +] +""" +Lists transient statutes of the enum :class:`ServerPrivateNetworkStatus `. +""" diff --git a/scaleway/scaleway/baremetal/v3/marshalling.py b/scaleway/scaleway/baremetal/v3/marshalling.py new file mode 100644 index 000000000..d1c8dee32 --- /dev/null +++ b/scaleway/scaleway/baremetal/v3/marshalling.py @@ -0,0 +1,142 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. + +from typing import Any, Dict +from dateutil import parser + +from scaleway_core.profile import ProfileDefaults +from .types import ( + ServerPrivateNetwork, + ListServerPrivateNetworksResponse, + SetServerPrivateNetworksResponse, + PrivateNetworkApiAddServerPrivateNetworkRequest, + PrivateNetworkApiSetServerPrivateNetworksRequest, +) + + +def unmarshal_ServerPrivateNetwork(data: Any) -> ServerPrivateNetwork: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ServerPrivateNetwork' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("project_id", None) + if field is not None: + args["project_id"] = field + + field = data.get("server_id", None) + if field is not None: + args["server_id"] = field + + field = data.get("private_network_id", None) + if field is not None: + args["private_network_id"] = field + + field = data.get("status", None) + if field is not None: + args["status"] = field + + field = data.get("ipam_ip_ids", None) + if field is not None: + args["ipam_ip_ids"] = field + + field = data.get("vlan", None) + if field is not None: + args["vlan"] = field + else: + args["vlan"] = None + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return ServerPrivateNetwork(**args) + + +def unmarshal_ListServerPrivateNetworksResponse( + data: Any, +) -> ListServerPrivateNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListServerPrivateNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("server_private_networks", None) + if field is not None: + args["server_private_networks"] = ( + [unmarshal_ServerPrivateNetwork(v) for v in field] + if field is not None + else None + ) + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + return ListServerPrivateNetworksResponse(**args) + + +def unmarshal_SetServerPrivateNetworksResponse( + data: Any, +) -> SetServerPrivateNetworksResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'SetServerPrivateNetworksResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("server_private_networks", None) + if field is not None: + args["server_private_networks"] = ( + [unmarshal_ServerPrivateNetwork(v) for v in field] + if field is not None + else None + ) + + return SetServerPrivateNetworksResponse(**args) + + +def marshal_PrivateNetworkApiAddServerPrivateNetworkRequest( + request: PrivateNetworkApiAddServerPrivateNetworkRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.private_network_id is not None: + output["private_network_id"] = request.private_network_id + + if request.ipam_ip_ids is not None: + output["ipam_ip_ids"] = request.ipam_ip_ids + + return output + + +def marshal_PrivateNetworkApiSetServerPrivateNetworksRequest( + request: PrivateNetworkApiSetServerPrivateNetworksRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.per_private_network_ipam_ip_ids is not None: + output["per_private_network_ipam_ip_ids"] = { + key: value for key, value in request.per_private_network_ipam_ip_ids.items() + } + + return output diff --git a/scaleway/scaleway/baremetal/v3/types.py b/scaleway/scaleway/baremetal/v3/types.py new file mode 100644 index 000000000..b0bd3abef --- /dev/null +++ b/scaleway/scaleway/baremetal/v3/types.py @@ -0,0 +1,204 @@ +# This file was automatically generated. DO NOT EDIT. +# If you have any remark or suggestion do not hesitate to open an issue. +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime +from enum import Enum +from typing import Dict, List, Optional + +from scaleway_core.bridge import ( + Zone, +) +from scaleway_core.utils import ( + StrEnumMeta, +) + + +class ListServerPrivateNetworksRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + CREATED_AT_ASC = "created_at_asc" + CREATED_AT_DESC = "created_at_desc" + UPDATED_AT_ASC = "updated_at_asc" + UPDATED_AT_DESC = "updated_at_desc" + + def __str__(self) -> str: + return str(self.value) + + +class ServerPrivateNetworkStatus(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_STATUS = "unknown_status" + ATTACHING = "attaching" + ATTACHED = "attached" + ERROR = "error" + DETACHING = "detaching" + LOCKED = "locked" + + def __str__(self) -> str: + return str(self.value) + + +@dataclass +class ServerPrivateNetwork: + id: str + """ + UUID of the Server-to-Private Network mapping. + """ + + project_id: str + """ + Private Network Project UUID. + """ + + server_id: str + """ + Server UUID. + """ + + private_network_id: str + """ + Private Network UUID. + """ + + status: ServerPrivateNetworkStatus + """ + Configuration status of the Private Network. + """ + + ipam_ip_ids: List[str] + """ + IPAM IP IDs of the server, if it has any. + """ + + vlan: Optional[int] + """ + VLAN UUID associated with the Private Network. + """ + + created_at: Optional[datetime] + """ + Private Network creation date. + """ + + updated_at: Optional[datetime] + """ + Date the Private Network was last modified. + """ + + +@dataclass +class ListServerPrivateNetworksResponse: + server_private_networks: List[ServerPrivateNetwork] + + total_count: int + + +@dataclass +class PrivateNetworkApiAddServerPrivateNetworkRequest: + server_id: str + """ + UUID of the server. + """ + + private_network_id: str + """ + UUID of the Private Network. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + ipam_ip_ids: Optional[List[str]] + """ + IPAM IDs of an IPs to attach to the server. + """ + + +@dataclass +class PrivateNetworkApiDeleteServerPrivateNetworkRequest: + server_id: str + """ + UUID of the server. + """ + + private_network_id: str + """ + UUID of the Private Network. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class PrivateNetworkApiListServerPrivateNetworksRequest: + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + order_by: Optional[ListServerPrivateNetworksRequestOrderBy] + """ + Sort order for the returned Private Networks. + """ + + page: Optional[int] + """ + Page number for the returned Private Networks. + """ + + page_size: Optional[int] + """ + Maximum number of Private Networks per page. + """ + + server_id: Optional[str] + """ + Filter Private Networks by server UUID. + """ + + private_network_id: Optional[str] + """ + Filter Private Networks by Private Network UUID. + """ + + organization_id: Optional[str] + """ + Filter Private Networks by organization UUID. + """ + + project_id: Optional[str] + """ + Filter Private Networks by project UUID. + """ + + ipam_ip_ids: Optional[List[str]] + """ + Filter Private Networks by IPAM IP UUIDs. + """ + + +@dataclass +class PrivateNetworkApiSetServerPrivateNetworksRequest: + server_id: str + """ + UUID of the server. + """ + + per_private_network_ipam_ip_ids: Dict[str, List[str]] + """ + Object where the keys are the UUIDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Elastic Metal server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + """ + + zone: Optional[Zone] + """ + Zone to target. If none is passed will use default zone from the config. + """ + + +@dataclass +class SetServerPrivateNetworksResponse: + server_private_networks: List[ServerPrivateNetwork]