diff --git a/scaleway-async/scaleway_async/audit_trail/v1alpha1/__init__.py b/scaleway-async/scaleway_async/audit_trail/v1alpha1/__init__.py index c93a5172c..31a36578c 100644 --- a/scaleway-async/scaleway_async/audit_trail/v1alpha1/__init__.py +++ b/scaleway-async/scaleway_async/audit_trail/v1alpha1/__init__.py @@ -1,5 +1,6 @@ # 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 Action from .types import AlertRuleStatus from .content import ALERT_RULE_TRANSIENT_STATUSES from .types import AuthenticationEventFailureReason @@ -128,6 +129,7 @@ from .api import AuditTrailV1Alpha1API __all__ = [ + "Action", "AlertRuleStatus", "ALERT_RULE_TRANSIENT_STATUSES", "AuthenticationEventFailureReason", diff --git a/scaleway-async/scaleway_async/audit_trail/v1alpha1/types.py b/scaleway-async/scaleway_async/audit_trail/v1alpha1/types.py index 807e982c5..ab6fd6a23 100644 --- a/scaleway-async/scaleway_async/audit_trail/v1alpha1/types.py +++ b/scaleway-async/scaleway_async/audit_trail/v1alpha1/types.py @@ -19,6 +19,16 @@ ) +class Action(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_ACTION = "unknown_action" + CREATE = "create" + UPDATE = "update" + DELETE = "delete" + + def __str__(self) -> str: + return str(self.value) + + class AlertRuleStatus(str, Enum, metaclass=StrEnumMeta): UNKNOWN_STATUS = "unknown_status" ENABLED = "enabled" @@ -627,7 +637,7 @@ class Resource: updated_at: Optional[datetime] = None deleted_at: Optional[datetime] = None name: Optional[str] = None - action: Optional[str] = None + action: Optional[Action] = None secm_secret_info: Optional[SecretManagerSecretInfo] = None secm_secret_version_info: Optional[SecretManagerSecretVersionInfo] = None diff --git a/scaleway-async/scaleway_async/domain/v2beta1/api.py b/scaleway-async/scaleway_async/domain/v2beta1/api.py index 5f9360256..5db247a53 100644 --- a/scaleway-async/scaleway_async/domain/v2beta1/api.py +++ b/scaleway-async/scaleway_async/domain/v2beta1/api.py @@ -1614,6 +1614,7 @@ async def buy_domains( *, domains: list[str], duration_in_years: int, + auto_renew: bool, project_id: Optional[str] = None, owner_contact_id: Optional[str] = None, owner_contact: Optional[NewContact] = None, @@ -1628,6 +1629,7 @@ async def buy_domains( You can provide a domain's already existing contact or a new contact. :param domains: :param duration_in_years: + :param auto_renew: Enable the `auto renew` feature for all the requested domains. This means the domain will be automatically renewed before its expiry date. :param project_id: :param owner_contact_id: One-Of ('owner_contact_type'): at most one of 'owner_contact_id', 'owner_contact' could be set. @@ -1649,6 +1651,7 @@ async def buy_domains( result = await api.buy_domains( domains=[], duration_in_years=1, + auto_renew=False, ) """ @@ -1659,6 +1662,7 @@ async def buy_domains( RegistrarApiBuyDomainsRequest( domains=domains, duration_in_years=duration_in_years, + auto_renew=auto_renew, project_id=project_id, owner_contact_id=owner_contact_id, owner_contact=owner_contact, diff --git a/scaleway-async/scaleway_async/domain/v2beta1/marshalling.py b/scaleway-async/scaleway_async/domain/v2beta1/marshalling.py index 7a56c4ef1..42812a0bf 100644 --- a/scaleway-async/scaleway_async/domain/v2beta1/marshalling.py +++ b/scaleway-async/scaleway_async/domain/v2beta1/marshalling.py @@ -3229,6 +3229,9 @@ def marshal_RegistrarApiBuyDomainsRequest( if request.duration_in_years is not None: output["duration_in_years"] = request.duration_in_years + if request.auto_renew is not None: + output["auto_renew"] = request.auto_renew + if request.project_id is not None: output["project_id"] = request.project_id else: diff --git a/scaleway-async/scaleway_async/domain/v2beta1/types.py b/scaleway-async/scaleway_async/domain/v2beta1/types.py index 994676a9a..ee201ac8f 100644 --- a/scaleway-async/scaleway_async/domain/v2beta1/types.py +++ b/scaleway-async/scaleway_async/domain/v2beta1/types.py @@ -1516,6 +1516,11 @@ class RegisterExternalDomainResponse: class RegistrarApiBuyDomainsRequest: domains: list[str] duration_in_years: int + auto_renew: bool + """ + Enable the `auto renew` feature for all the requested domains. This means the domain will be automatically renewed before its expiry date. + """ + project_id: Optional[str] = None owner_contact_id: Optional[str] = None diff --git a/scaleway-async/scaleway_async/instance/v1/api.py b/scaleway-async/scaleway_async/instance/v1/api.py index 1059a909f..2e41ee299 100644 --- a/scaleway-async/scaleway_async/instance/v1/api.py +++ b/scaleway-async/scaleway_async/instance/v1/api.py @@ -3832,6 +3832,8 @@ async def list_private_ni_cs( """ List all private NICs. List all private NICs of a specified Instance. + Some private NICs, such as those in deleting, detaching, or in error state are + not listed. We strongly recommend migrating to v2alpha1 to retrieve all private NICs. :param server_id: Instance to which the private NIC is attached. :param zone: Zone to target. If none is passed will use default zone from the config. :param tags: Private NIC tags. @@ -3875,6 +3877,8 @@ async def list_private_ni_cs_all( """ List all private NICs. List all private NICs of a specified Instance. + Some private NICs, such as those in deleting, detaching, or in error state are + not listed. We strongly recommend migrating to v2alpha1 to retrieve all private NICs. :param server_id: Instance to which the private NIC is attached. :param zone: Zone to target. If none is passed will use default zone from the config. :param tags: Private NIC tags. @@ -3915,6 +3919,12 @@ async def create_private_nic( ) -> CreatePrivateNICResponse: """ Create a private NIC connecting an Instance to a Private Network. + Create a private NIC connecting an Instance to a Private Network. + Some private NICs, such as those in deleting, detaching, or in error state are + not listed in v1. + Therefore, you may encounter quota limits errors when creating a new private NIC, even if your visible + count is below the threshold. + We strongly recommend migrating to v2alpha1 to see all private NICs. :param server_id: UUID of the Instance the private NIC will be attached to. :param private_network_id: UUID of the private network where the private NIC will be attached. :param zone: Zone to target. If none is passed will use default zone from the config. diff --git a/scaleway-async/scaleway_async/instance/v2alpha1/__init__.py b/scaleway-async/scaleway_async/instance/v2alpha1/__init__.py index 1a0b7f0a7..c82818c9d 100644 --- a/scaleway-async/scaleway_async/instance/v2alpha1/__init__.py +++ b/scaleway-async/scaleway_async/instance/v2alpha1/__init__.py @@ -89,6 +89,7 @@ from .types import DeleteTemplateRequest from .types import DeleteTemplateUserDataRequest from .types import DeleteUserDataRequest +from .types import DetachAndDeletePrivateNetworkInterfaceRequest from .types import DetachServerFileSystemRequest from .types import DetachServerIPRequest from .types import DetachServerPrivateNetworkInterfaceRequest @@ -250,6 +251,7 @@ "DeleteTemplateRequest", "DeleteTemplateUserDataRequest", "DeleteUserDataRequest", + "DetachAndDeletePrivateNetworkInterfaceRequest", "DetachServerFileSystemRequest", "DetachServerIPRequest", "DetachServerPrivateNetworkInterfaceRequest", diff --git a/scaleway-async/scaleway_async/instance/v2alpha1/api.py b/scaleway-async/scaleway_async/instance/v2alpha1/api.py index 791681a5f..98411ba59 100644 --- a/scaleway-async/scaleway_async/instance/v2alpha1/api.py +++ b/scaleway-async/scaleway_async/instance/v2alpha1/api.py @@ -1420,6 +1420,39 @@ async def delete_private_network_interface( self._throw_on_error(res) + async def detach_and_delete_private_network_interface( + self, + *, + private_network_interface_id: str, + zone: Optional[ScwZone] = None, + ) -> PrivateNetworkInterface: + """ + :param private_network_interface_id: ID of the private network interface to detach and delete. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`PrivateNetworkInterface ` + + Usage: + :: + + result = await api.detach_and_delete_private_network_interface( + private_network_interface_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_private_network_interface_id = validate_path_param( + "private_network_interface_id", private_network_interface_id + ) + + res = self._request( + "POST", + f"/instance/v2alpha1/zones/{param_zone}/private-network-interfaces/{param_private_network_interface_id}/detach-and-delete", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_PrivateNetworkInterface(res.json()) + async def list_placement_groups( self, *, diff --git a/scaleway-async/scaleway_async/instance/v2alpha1/content.py b/scaleway-async/scaleway_async/instance/v2alpha1/content.py index 3cfdd6355..5452515ff 100644 --- a/scaleway-async/scaleway_async/instance/v2alpha1/content.py +++ b/scaleway-async/scaleway_async/instance/v2alpha1/content.py @@ -16,6 +16,7 @@ PrivateNetworkInterfaceStatus.ATTACHING, PrivateNetworkInterfaceStatus.DETACHING, PrivateNetworkInterfaceStatus.SYNCING, + PrivateNetworkInterfaceStatus.DELETING, ] """ Lists transient statutes of the enum :class:`PrivateNetworkInterfaceStatus `. @@ -39,6 +40,7 @@ ServerPrivateNetworkInterfaceStatus.ATTACHING, ServerPrivateNetworkInterfaceStatus.DETACHING, ServerPrivateNetworkInterfaceStatus.SYNCING, + ServerPrivateNetworkInterfaceStatus.DELETING, ] """ Lists transient statutes of the enum :class:`ServerPrivateNetworkInterfaceStatus `. diff --git a/scaleway-async/scaleway_async/instance/v2alpha1/marshalling.py b/scaleway-async/scaleway_async/instance/v2alpha1/marshalling.py index a12bec250..5f44f8b5f 100644 --- a/scaleway-async/scaleway_async/instance/v2alpha1/marshalling.py +++ b/scaleway-async/scaleway_async/instance/v2alpha1/marshalling.py @@ -649,6 +649,12 @@ def unmarshal_PrivateNetworkInterfaceSummary( else: args["tags"] = [] + field = data.get("zone", None) + if field is not None: + args["zone"] = field + else: + args["zone"] = None + field = data.get("created_at", None) if field is not None: args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field @@ -767,6 +773,12 @@ def unmarshal_SecurityGroupSummary(data: Any) -> SecurityGroupSummary: else: args["stateless"] = False + field = data.get("zone", None) + if field is not None: + args["zone"] = field + else: + args["zone"] = None + field = data.get("created_at", None) if field is not None: args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field @@ -1067,6 +1079,12 @@ def unmarshal_ServerSummary(data: Any) -> ServerSummary: else: args["rescue_mode"] = False + field = data.get("zone", None) + if field is not None: + args["zone"] = field + else: + args["zone"] = None + field = data.get("placement_group_id", None) if field is not None: args["placement_group_id"] = field @@ -1483,6 +1501,12 @@ def unmarshal_PrivateNetworkInterface(data: Any) -> PrivateNetworkInterface: else: args["tags"] = [] + field = data.get("zone", None) + if field is not None: + args["zone"] = field + else: + args["zone"] = None + field = data.get("created_at", None) if field is not None: args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field diff --git a/scaleway-async/scaleway_async/instance/v2alpha1/types.py b/scaleway-async/scaleway_async/instance/v2alpha1/types.py index c42ca1929..91bc73888 100644 --- a/scaleway-async/scaleway_async/instance/v2alpha1/types.py +++ b/scaleway-async/scaleway_async/instance/v2alpha1/types.py @@ -128,6 +128,9 @@ class PrivateNetworkInterfaceStatus(str, Enum, metaclass=StrEnumMeta): ATTACHING = "attaching" DETACHING = "detaching" SYNCING = "syncing" + DELETING = "deleting" + DETACH_ERROR = "detach_error" + DELETE_ERROR = "delete_error" def __str__(self) -> str: return str(self.value) @@ -208,6 +211,9 @@ class ServerPrivateNetworkInterfaceStatus(str, Enum, metaclass=StrEnumMeta): ATTACHING = "attaching" DETACHING = "detaching" SYNCING = "syncing" + DELETING = "deleting" + DETACH_ERROR = "detach_error" + DELETE_ERROR = "delete_error" def __str__(self) -> str: return str(self.value) @@ -767,6 +773,11 @@ class PrivateNetworkInterfaceSummary: Tags associated with the private network interface. """ + zone: ScwZone + """ + Zone in which the network interface is located. + """ + created_at: Optional[datetime] = None """ Creation timestamp of the private network interface. @@ -830,6 +841,11 @@ class SecurityGroupSummary: True if the security group is stateless. """ + zone: ScwZone + """ + Zone in which the security group is located. + """ + created_at: Optional[datetime] = None """ Creation timestamp of the security group. @@ -931,6 +947,11 @@ class ServerSummary: Whether the server is in rescue mode. """ + zone: ScwZone + """ + Zone in which the server is located. + """ + placement_group_id: Optional[str] = None """ ID of the placement group the server belongs to. @@ -1756,6 +1777,19 @@ class DeleteUserDataRequest: """ +@dataclass +class DetachAndDeletePrivateNetworkInterfaceRequest: + private_network_interface_id: str + """ + ID of the private network interface to detach and delete. + """ + + zone: Optional[ScwZone] = None + """ + Zone to target. If none is passed will use default zone from the config. + """ + + @dataclass class DetachServerFileSystemRequest: server_id: str @@ -2549,6 +2583,11 @@ class PrivateNetworkInterface: Tags associated with the private network interface. """ + zone: ScwZone + """ + Zone in which the network interface is located. + """ + created_at: Optional[datetime] = None """ Creation timestamp of the private network interface. diff --git a/scaleway-async/scaleway_async/key_manager/v1alpha1/__init__.py b/scaleway-async/scaleway_async/key_manager/v1alpha1/__init__.py index 185eff119..1fc464286 100644 --- a/scaleway-async/scaleway_async/key_manager/v1alpha1/__init__.py +++ b/scaleway-async/scaleway_async/key_manager/v1alpha1/__init__.py @@ -3,6 +3,7 @@ from .types import DataKeyAlgorithmSymmetricEncryption from .types import KeyAlgorithmAsymmetricEncryption from .types import KeyAlgorithmAsymmetricSigning +from .types import KeyAlgorithmKeyEncapsulation from .types import KeyAlgorithmSymmetricEncryption from .types import KeyOrigin from .types import KeyState @@ -51,6 +52,7 @@ "DataKeyAlgorithmSymmetricEncryption", "KeyAlgorithmAsymmetricEncryption", "KeyAlgorithmAsymmetricSigning", + "KeyAlgorithmKeyEncapsulation", "KeyAlgorithmSymmetricEncryption", "KeyOrigin", "KeyState", diff --git a/scaleway-async/scaleway_async/key_manager/v1alpha1/marshalling.py b/scaleway-async/scaleway_async/key_manager/v1alpha1/marshalling.py index 336c95806..517f06edd 100644 --- a/scaleway-async/scaleway_async/key_manager/v1alpha1/marshalling.py +++ b/scaleway-async/scaleway_async/key_manager/v1alpha1/marshalling.py @@ -100,6 +100,12 @@ def unmarshal_KeyUsage(data: Any) -> KeyUsage: KeyAlgorithmAsymmetricSigning.UNKNOWN_ASYMMETRIC_SIGNING ) + field = data.get("key_encapsulation", None) + if field is not None: + args["key_encapsulation"] = field + else: + args["key_encapsulation"] = None + return KeyUsage(**args) @@ -535,6 +541,11 @@ def marshal_KeyUsage( value=request.asymmetric_signing, marshal_func=None, ), + OneOfPossibility( + param="key_encapsulation", + value=request.key_encapsulation, + marshal_func=None, + ), ] ), ) diff --git a/scaleway-async/scaleway_async/key_manager/v1alpha1/types.py b/scaleway-async/scaleway_async/key_manager/v1alpha1/types.py index 6ecab53ee..cbcfe1517 100644 --- a/scaleway-async/scaleway_async/key_manager/v1alpha1/types.py +++ b/scaleway-async/scaleway_async/key_manager/v1alpha1/types.py @@ -28,8 +28,6 @@ class KeyAlgorithmAsymmetricEncryption(str, Enum, metaclass=StrEnumMeta): RSA_OAEP_2048_SHA256 = "rsa_oaep_2048_sha256" RSA_OAEP_3072_SHA256 = "rsa_oaep_3072_sha256" RSA_OAEP_4096_SHA256 = "rsa_oaep_4096_sha256" - ML_KEM_768 = "ml_kem_768" - ML_KEM_1024 = "ml_kem_1024" def __str__(self) -> str: return str(self.value) @@ -54,6 +52,15 @@ def __str__(self) -> str: return str(self.value) +class KeyAlgorithmKeyEncapsulation(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_KEY_ENCAPSULATION = "unknown_key_encapsulation" + ML_KEM_768 = "ml_kem_768" + ML_KEM_1024 = "ml_kem_1024" + + def __str__(self) -> str: + return str(self.value) + + class KeyAlgorithmSymmetricEncryption(str, Enum, metaclass=StrEnumMeta): UNKNOWN_SYMMETRIC_ENCRYPTION = "unknown_symmetric_encryption" AES_256_GCM = "aes_256_gcm" @@ -87,6 +94,7 @@ class ListAlgorithmsRequestUsage(str, Enum, metaclass=StrEnumMeta): SYMMETRIC_ENCRYPTION = "symmetric_encryption" ASYMMETRIC_ENCRYPTION = "asymmetric_encryption" ASYMMETRIC_SIGNING = "asymmetric_signing" + KEY_ENCAPSULATION = "key_encapsulation" def __str__(self) -> str: return str(self.value) @@ -141,6 +149,8 @@ class KeyUsage: KeyAlgorithmAsymmetricSigning.UNKNOWN_ASYMMETRIC_SIGNING ) + key_encapsulation: Optional[KeyAlgorithmKeyEncapsulation] = None + @dataclass class ListAlgorithmsResponseAlgorithm: diff --git a/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/__init__.py b/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/__init__.py index 6ed7cd9ec..1c5a6bd21 100644 --- a/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/__init__.py +++ b/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/__init__.py @@ -5,6 +5,7 @@ from .content import DATABASE_TRANSIENT_STATUSES from .types import ListDatabaseBackupsRequestOrderBy from .types import ListDatabasesRequestOrderBy +from .types import Version from .types import DatabaseBackup from .types import Database from .types import CreateDatabaseRequest @@ -16,6 +17,8 @@ from .types import ListDatabaseBackupsResponse from .types import ListDatabasesRequest from .types import ListDatabasesResponse +from .types import ListVersionsRequest +from .types import ListVersionsResponse from .types import RestoreDatabaseFromBackupRequest from .types import UpdateDatabaseRequest from .api import ServerlessSqldbV1Alpha1API @@ -26,6 +29,7 @@ "DATABASE_TRANSIENT_STATUSES", "ListDatabaseBackupsRequestOrderBy", "ListDatabasesRequestOrderBy", + "Version", "DatabaseBackup", "Database", "CreateDatabaseRequest", @@ -37,6 +41,8 @@ "ListDatabaseBackupsResponse", "ListDatabasesRequest", "ListDatabasesResponse", + "ListVersionsRequest", + "ListVersionsResponse", "RestoreDatabaseFromBackupRequest", "UpdateDatabaseRequest", "ServerlessSqldbV1Alpha1API", diff --git a/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/api.py b/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/api.py index e2166dd1f..c555825ec 100644 --- a/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/api.py +++ b/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/api.py @@ -21,8 +21,10 @@ DatabaseBackup, ListDatabaseBackupsResponse, ListDatabasesResponse, + ListVersionsResponse, RestoreDatabaseFromBackupRequest, UpdateDatabaseRequest, + Version, ) from .content import ( DATABASE_TRANSIENT_STATUSES, @@ -32,6 +34,7 @@ unmarshal_Database, unmarshal_ListDatabaseBackupsResponse, unmarshal_ListDatabasesResponse, + unmarshal_ListVersionsResponse, marshal_CreateDatabaseRequest, marshal_RestoreDatabaseFromBackupRequest, marshal_UpdateDatabaseRequest, @@ -49,6 +52,7 @@ async def create_database( name: str, cpu_min: int, cpu_max: int, + version: str, region: Optional[ScwRegion] = None, project_id: Optional[str] = None, from_backup_id: Optional[str] = None, @@ -59,6 +63,7 @@ async def create_database( :param name: The name of the Serverless SQL Database to be created. :param cpu_min: The minimum number of CPU units for your Serverless SQL Database. :param cpu_max: The maximum number of CPU units for your Serverless SQL Database. + :param version: The major version of the postgreSQL requested. :param region: Region to target. If none is passed will use default region from the config. :param project_id: The ID of your Scaleway project. :param from_backup_id: The ID of the backup to create the database from. @@ -71,6 +76,7 @@ async def create_database( name="example", cpu_min=1, cpu_max=1, + version="example", ) """ @@ -86,6 +92,7 @@ async def create_database( name=name, cpu_min=cpu_min, cpu_max=cpu_max, + version=version, region=region, project_id=project_id, from_backup_id=from_backup_id, @@ -556,3 +563,76 @@ async def export_database_backup( self._throw_on_error(res) return unmarshal_DatabaseBackup(res.json()) + + async def list_versions( + self, + *, + region: Optional[ScwRegion] = None, + version: Optional[str] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + ) -> ListVersionsResponse: + """ + List available PostgreSQL major versions. + :param region: Region to target. If none is passed will use default region from the config. + :param version: + :param page: + :param page_size: + :return: :class:`ListVersionsResponse ` + + Usage: + :: + + result = await api.list_versions() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/serverless-sqldb/v1alpha1/regions/{param_region}/versions", + params={ + "page": page, + "page_size": page_size or self.client.default_page_size, + "version": version, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListVersionsResponse(res.json()) + + async def list_versions_all( + self, + *, + region: Optional[ScwRegion] = None, + version: Optional[str] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + ) -> list[Version]: + """ + List available PostgreSQL major versions. + :param region: Region to target. If none is passed will use default region from the config. + :param version: + :param page: + :param page_size: + :return: :class:`list[Version] ` + + Usage: + :: + + result = await api.list_versions_all() + """ + + return await fetch_all_pages_async( + type=ListVersionsResponse, + key="versions", + fetcher=self.list_versions, + args={ + "region": region, + "version": version, + "page": page, + "page_size": page_size, + }, + ) diff --git a/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/marshalling.py b/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/marshalling.py index 88e522c58..a1288c5e2 100644 --- a/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/marshalling.py +++ b/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/marshalling.py @@ -9,9 +9,11 @@ DatabaseBackupStatus, DatabaseStatus, DatabaseBackup, + Version, Database, ListDatabaseBackupsResponse, ListDatabasesResponse, + ListVersionsResponse, CreateDatabaseRequest, RestoreDatabaseFromBackupRequest, UpdateDatabaseRequest, @@ -103,6 +105,37 @@ def unmarshal_DatabaseBackup(data: Any) -> DatabaseBackup: return DatabaseBackup(**args) +def unmarshal_Version(data: Any) -> Version: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Version' failed as data isn't a dictionary." + ) + + args: dict[str, Any] = {} + + field = data.get("name", None) + if field is not None: + args["name"] = field + else: + args["name"] = None + + field = data.get("region", None) + if field is not None: + args["region"] = field + else: + args["region"] = None + + field = data.get("end_of_life_at", None) + if field is not None: + args["end_of_life_at"] = ( + parser.isoparse(field) if isinstance(field, str) else field + ) + else: + args["end_of_life_at"] = None + + return Version(**args) + + def unmarshal_Database(data: Any) -> Database: if not isinstance(data, dict): raise TypeError( @@ -177,17 +210,23 @@ def unmarshal_Database(data: Any) -> Database: else: args["started"] = False + 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("engine_major_version", None) if field is not None: args["engine_major_version"] = field else: - args["engine_major_version"] = 0 + args["engine_major_version"] = None - field = data.get("created_at", None) + field = data.get("version", None) if field is not None: - args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + args["version"] = unmarshal_Version(field) else: - args["created_at"] = None + args["version"] = None return Database(**args) @@ -242,6 +281,31 @@ def unmarshal_ListDatabasesResponse(data: Any) -> ListDatabasesResponse: return ListDatabasesResponse(**args) +def unmarshal_ListVersionsResponse(data: Any) -> ListVersionsResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListVersionsResponse' failed as data isn't a dictionary." + ) + + args: dict[str, Any] = {} + + field = data.get("versions", None) + if field is not None: + args["versions"] = ( + [unmarshal_Version(v) for v in field] if field is not None else None + ) + else: + args["versions"] = [] + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + else: + args["total_count"] = 0 + + return ListVersionsResponse(**args) + + def marshal_CreateDatabaseRequest( request: CreateDatabaseRequest, defaults: ProfileDefaults, @@ -257,6 +321,9 @@ def marshal_CreateDatabaseRequest( if request.cpu_max is not None: output["cpu_max"] = request.cpu_max + if request.version is not None: + output["version"] = request.version + if request.project_id is not None: output["project_id"] = request.project_id else: diff --git a/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/types.py b/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/types.py index 90f8d76c1..e9b7b4e3e 100644 --- a/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/types.py +++ b/scaleway-async/scaleway_async/serverless_sqldb/v1alpha1/types.py @@ -56,6 +56,24 @@ def __str__(self) -> str: return str(self.value) +@dataclass +class Version: + name: str + """ + Major number of the PostgreSQL engine. + """ + + region: ScwRegion + """ + Region to target. If none is passed will use default region from the config. + """ + + end_of_life_at: Optional[datetime] = None + """ + Date of End Of Life. + """ + + @dataclass class DatabaseBackup: id: str @@ -176,14 +194,19 @@ class Database: Whether your Serverless SQL Database is running or not. """ - engine_major_version: int + created_at: Optional[datetime] = None """ - The major version of the underlying database engine. + Creation date. """ - created_at: Optional[datetime] = None + engine_major_version: Optional[int] = None """ - Creation date. + The major version of the underlying database engine. (deprecated in favor of `version`). + """ + + version: Optional[Version] = None + """ + The major version of the underlying database engine. """ @@ -204,6 +227,11 @@ class CreateDatabaseRequest: The maximum number of CPU units for your Serverless SQL Database. """ + version: str + """ + The major version of the postgreSQL requested. + """ + region: Optional[ScwRegion] = None """ Region to target. If none is passed will use default region from the config. @@ -378,6 +406,31 @@ class ListDatabasesResponse: """ +@dataclass +class ListVersionsRequest: + region: Optional[ScwRegion] = None + """ + Region to target. If none is passed will use default region from the config. + """ + + version: Optional[str] = None + page: Optional[int] = 0 + page_size: Optional[int] = 0 + + +@dataclass +class ListVersionsResponse: + versions: list[Version] + """ + Available PostgreSQL versions. + """ + + total_count: int + """ + Total count of versions available. + """ + + @dataclass class RestoreDatabaseFromBackupRequest: database_id: str diff --git a/scaleway/scaleway/audit_trail/v1alpha1/__init__.py b/scaleway/scaleway/audit_trail/v1alpha1/__init__.py index c93a5172c..31a36578c 100644 --- a/scaleway/scaleway/audit_trail/v1alpha1/__init__.py +++ b/scaleway/scaleway/audit_trail/v1alpha1/__init__.py @@ -1,5 +1,6 @@ # 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 Action from .types import AlertRuleStatus from .content import ALERT_RULE_TRANSIENT_STATUSES from .types import AuthenticationEventFailureReason @@ -128,6 +129,7 @@ from .api import AuditTrailV1Alpha1API __all__ = [ + "Action", "AlertRuleStatus", "ALERT_RULE_TRANSIENT_STATUSES", "AuthenticationEventFailureReason", diff --git a/scaleway/scaleway/audit_trail/v1alpha1/types.py b/scaleway/scaleway/audit_trail/v1alpha1/types.py index 807e982c5..ab6fd6a23 100644 --- a/scaleway/scaleway/audit_trail/v1alpha1/types.py +++ b/scaleway/scaleway/audit_trail/v1alpha1/types.py @@ -19,6 +19,16 @@ ) +class Action(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_ACTION = "unknown_action" + CREATE = "create" + UPDATE = "update" + DELETE = "delete" + + def __str__(self) -> str: + return str(self.value) + + class AlertRuleStatus(str, Enum, metaclass=StrEnumMeta): UNKNOWN_STATUS = "unknown_status" ENABLED = "enabled" @@ -627,7 +637,7 @@ class Resource: updated_at: Optional[datetime] = None deleted_at: Optional[datetime] = None name: Optional[str] = None - action: Optional[str] = None + action: Optional[Action] = None secm_secret_info: Optional[SecretManagerSecretInfo] = None secm_secret_version_info: Optional[SecretManagerSecretVersionInfo] = None diff --git a/scaleway/scaleway/domain/v2beta1/api.py b/scaleway/scaleway/domain/v2beta1/api.py index 04d732102..36bcac3f1 100644 --- a/scaleway/scaleway/domain/v2beta1/api.py +++ b/scaleway/scaleway/domain/v2beta1/api.py @@ -1612,6 +1612,7 @@ def buy_domains( *, domains: list[str], duration_in_years: int, + auto_renew: bool, project_id: Optional[str] = None, owner_contact_id: Optional[str] = None, owner_contact: Optional[NewContact] = None, @@ -1626,6 +1627,7 @@ def buy_domains( You can provide a domain's already existing contact or a new contact. :param domains: :param duration_in_years: + :param auto_renew: Enable the `auto renew` feature for all the requested domains. This means the domain will be automatically renewed before its expiry date. :param project_id: :param owner_contact_id: One-Of ('owner_contact_type'): at most one of 'owner_contact_id', 'owner_contact' could be set. @@ -1647,6 +1649,7 @@ def buy_domains( result = api.buy_domains( domains=[], duration_in_years=1, + auto_renew=False, ) """ @@ -1657,6 +1660,7 @@ def buy_domains( RegistrarApiBuyDomainsRequest( domains=domains, duration_in_years=duration_in_years, + auto_renew=auto_renew, project_id=project_id, owner_contact_id=owner_contact_id, owner_contact=owner_contact, diff --git a/scaleway/scaleway/domain/v2beta1/marshalling.py b/scaleway/scaleway/domain/v2beta1/marshalling.py index 7a56c4ef1..42812a0bf 100644 --- a/scaleway/scaleway/domain/v2beta1/marshalling.py +++ b/scaleway/scaleway/domain/v2beta1/marshalling.py @@ -3229,6 +3229,9 @@ def marshal_RegistrarApiBuyDomainsRequest( if request.duration_in_years is not None: output["duration_in_years"] = request.duration_in_years + if request.auto_renew is not None: + output["auto_renew"] = request.auto_renew + if request.project_id is not None: output["project_id"] = request.project_id else: diff --git a/scaleway/scaleway/domain/v2beta1/types.py b/scaleway/scaleway/domain/v2beta1/types.py index 994676a9a..ee201ac8f 100644 --- a/scaleway/scaleway/domain/v2beta1/types.py +++ b/scaleway/scaleway/domain/v2beta1/types.py @@ -1516,6 +1516,11 @@ class RegisterExternalDomainResponse: class RegistrarApiBuyDomainsRequest: domains: list[str] duration_in_years: int + auto_renew: bool + """ + Enable the `auto renew` feature for all the requested domains. This means the domain will be automatically renewed before its expiry date. + """ + project_id: Optional[str] = None owner_contact_id: Optional[str] = None diff --git a/scaleway/scaleway/instance/v1/api.py b/scaleway/scaleway/instance/v1/api.py index 58a2eca6d..07812e67d 100644 --- a/scaleway/scaleway/instance/v1/api.py +++ b/scaleway/scaleway/instance/v1/api.py @@ -3832,6 +3832,8 @@ def list_private_ni_cs( """ List all private NICs. List all private NICs of a specified Instance. + Some private NICs, such as those in deleting, detaching, or in error state are + not listed. We strongly recommend migrating to v2alpha1 to retrieve all private NICs. :param server_id: Instance to which the private NIC is attached. :param zone: Zone to target. If none is passed will use default zone from the config. :param tags: Private NIC tags. @@ -3875,6 +3877,8 @@ def list_private_ni_cs_all( """ List all private NICs. List all private NICs of a specified Instance. + Some private NICs, such as those in deleting, detaching, or in error state are + not listed. We strongly recommend migrating to v2alpha1 to retrieve all private NICs. :param server_id: Instance to which the private NIC is attached. :param zone: Zone to target. If none is passed will use default zone from the config. :param tags: Private NIC tags. @@ -3915,6 +3919,12 @@ def create_private_nic( ) -> CreatePrivateNICResponse: """ Create a private NIC connecting an Instance to a Private Network. + Create a private NIC connecting an Instance to a Private Network. + Some private NICs, such as those in deleting, detaching, or in error state are + not listed in v1. + Therefore, you may encounter quota limits errors when creating a new private NIC, even if your visible + count is below the threshold. + We strongly recommend migrating to v2alpha1 to see all private NICs. :param server_id: UUID of the Instance the private NIC will be attached to. :param private_network_id: UUID of the private network where the private NIC will be attached. :param zone: Zone to target. If none is passed will use default zone from the config. diff --git a/scaleway/scaleway/instance/v2alpha1/__init__.py b/scaleway/scaleway/instance/v2alpha1/__init__.py index 1a0b7f0a7..c82818c9d 100644 --- a/scaleway/scaleway/instance/v2alpha1/__init__.py +++ b/scaleway/scaleway/instance/v2alpha1/__init__.py @@ -89,6 +89,7 @@ from .types import DeleteTemplateRequest from .types import DeleteTemplateUserDataRequest from .types import DeleteUserDataRequest +from .types import DetachAndDeletePrivateNetworkInterfaceRequest from .types import DetachServerFileSystemRequest from .types import DetachServerIPRequest from .types import DetachServerPrivateNetworkInterfaceRequest @@ -250,6 +251,7 @@ "DeleteTemplateRequest", "DeleteTemplateUserDataRequest", "DeleteUserDataRequest", + "DetachAndDeletePrivateNetworkInterfaceRequest", "DetachServerFileSystemRequest", "DetachServerIPRequest", "DetachServerPrivateNetworkInterfaceRequest", diff --git a/scaleway/scaleway/instance/v2alpha1/api.py b/scaleway/scaleway/instance/v2alpha1/api.py index 1634ae6e8..34d16cafc 100644 --- a/scaleway/scaleway/instance/v2alpha1/api.py +++ b/scaleway/scaleway/instance/v2alpha1/api.py @@ -1418,6 +1418,39 @@ def delete_private_network_interface( self._throw_on_error(res) + def detach_and_delete_private_network_interface( + self, + *, + private_network_interface_id: str, + zone: Optional[ScwZone] = None, + ) -> PrivateNetworkInterface: + """ + :param private_network_interface_id: ID of the private network interface to detach and delete. + :param zone: Zone to target. If none is passed will use default zone from the config. + :return: :class:`PrivateNetworkInterface ` + + Usage: + :: + + result = api.detach_and_delete_private_network_interface( + private_network_interface_id="example", + ) + """ + + param_zone = validate_path_param("zone", zone or self.client.default_zone) + param_private_network_interface_id = validate_path_param( + "private_network_interface_id", private_network_interface_id + ) + + res = self._request( + "POST", + f"/instance/v2alpha1/zones/{param_zone}/private-network-interfaces/{param_private_network_interface_id}/detach-and-delete", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_PrivateNetworkInterface(res.json()) + def list_placement_groups( self, *, diff --git a/scaleway/scaleway/instance/v2alpha1/content.py b/scaleway/scaleway/instance/v2alpha1/content.py index 3cfdd6355..5452515ff 100644 --- a/scaleway/scaleway/instance/v2alpha1/content.py +++ b/scaleway/scaleway/instance/v2alpha1/content.py @@ -16,6 +16,7 @@ PrivateNetworkInterfaceStatus.ATTACHING, PrivateNetworkInterfaceStatus.DETACHING, PrivateNetworkInterfaceStatus.SYNCING, + PrivateNetworkInterfaceStatus.DELETING, ] """ Lists transient statutes of the enum :class:`PrivateNetworkInterfaceStatus `. @@ -39,6 +40,7 @@ ServerPrivateNetworkInterfaceStatus.ATTACHING, ServerPrivateNetworkInterfaceStatus.DETACHING, ServerPrivateNetworkInterfaceStatus.SYNCING, + ServerPrivateNetworkInterfaceStatus.DELETING, ] """ Lists transient statutes of the enum :class:`ServerPrivateNetworkInterfaceStatus `. diff --git a/scaleway/scaleway/instance/v2alpha1/marshalling.py b/scaleway/scaleway/instance/v2alpha1/marshalling.py index a12bec250..5f44f8b5f 100644 --- a/scaleway/scaleway/instance/v2alpha1/marshalling.py +++ b/scaleway/scaleway/instance/v2alpha1/marshalling.py @@ -649,6 +649,12 @@ def unmarshal_PrivateNetworkInterfaceSummary( else: args["tags"] = [] + field = data.get("zone", None) + if field is not None: + args["zone"] = field + else: + args["zone"] = None + field = data.get("created_at", None) if field is not None: args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field @@ -767,6 +773,12 @@ def unmarshal_SecurityGroupSummary(data: Any) -> SecurityGroupSummary: else: args["stateless"] = False + field = data.get("zone", None) + if field is not None: + args["zone"] = field + else: + args["zone"] = None + field = data.get("created_at", None) if field is not None: args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field @@ -1067,6 +1079,12 @@ def unmarshal_ServerSummary(data: Any) -> ServerSummary: else: args["rescue_mode"] = False + field = data.get("zone", None) + if field is not None: + args["zone"] = field + else: + args["zone"] = None + field = data.get("placement_group_id", None) if field is not None: args["placement_group_id"] = field @@ -1483,6 +1501,12 @@ def unmarshal_PrivateNetworkInterface(data: Any) -> PrivateNetworkInterface: else: args["tags"] = [] + field = data.get("zone", None) + if field is not None: + args["zone"] = field + else: + args["zone"] = None + field = data.get("created_at", None) if field is not None: args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field diff --git a/scaleway/scaleway/instance/v2alpha1/types.py b/scaleway/scaleway/instance/v2alpha1/types.py index c42ca1929..91bc73888 100644 --- a/scaleway/scaleway/instance/v2alpha1/types.py +++ b/scaleway/scaleway/instance/v2alpha1/types.py @@ -128,6 +128,9 @@ class PrivateNetworkInterfaceStatus(str, Enum, metaclass=StrEnumMeta): ATTACHING = "attaching" DETACHING = "detaching" SYNCING = "syncing" + DELETING = "deleting" + DETACH_ERROR = "detach_error" + DELETE_ERROR = "delete_error" def __str__(self) -> str: return str(self.value) @@ -208,6 +211,9 @@ class ServerPrivateNetworkInterfaceStatus(str, Enum, metaclass=StrEnumMeta): ATTACHING = "attaching" DETACHING = "detaching" SYNCING = "syncing" + DELETING = "deleting" + DETACH_ERROR = "detach_error" + DELETE_ERROR = "delete_error" def __str__(self) -> str: return str(self.value) @@ -767,6 +773,11 @@ class PrivateNetworkInterfaceSummary: Tags associated with the private network interface. """ + zone: ScwZone + """ + Zone in which the network interface is located. + """ + created_at: Optional[datetime] = None """ Creation timestamp of the private network interface. @@ -830,6 +841,11 @@ class SecurityGroupSummary: True if the security group is stateless. """ + zone: ScwZone + """ + Zone in which the security group is located. + """ + created_at: Optional[datetime] = None """ Creation timestamp of the security group. @@ -931,6 +947,11 @@ class ServerSummary: Whether the server is in rescue mode. """ + zone: ScwZone + """ + Zone in which the server is located. + """ + placement_group_id: Optional[str] = None """ ID of the placement group the server belongs to. @@ -1756,6 +1777,19 @@ class DeleteUserDataRequest: """ +@dataclass +class DetachAndDeletePrivateNetworkInterfaceRequest: + private_network_interface_id: str + """ + ID of the private network interface to detach and delete. + """ + + zone: Optional[ScwZone] = None + """ + Zone to target. If none is passed will use default zone from the config. + """ + + @dataclass class DetachServerFileSystemRequest: server_id: str @@ -2549,6 +2583,11 @@ class PrivateNetworkInterface: Tags associated with the private network interface. """ + zone: ScwZone + """ + Zone in which the network interface is located. + """ + created_at: Optional[datetime] = None """ Creation timestamp of the private network interface. diff --git a/scaleway/scaleway/key_manager/v1alpha1/__init__.py b/scaleway/scaleway/key_manager/v1alpha1/__init__.py index 185eff119..1fc464286 100644 --- a/scaleway/scaleway/key_manager/v1alpha1/__init__.py +++ b/scaleway/scaleway/key_manager/v1alpha1/__init__.py @@ -3,6 +3,7 @@ from .types import DataKeyAlgorithmSymmetricEncryption from .types import KeyAlgorithmAsymmetricEncryption from .types import KeyAlgorithmAsymmetricSigning +from .types import KeyAlgorithmKeyEncapsulation from .types import KeyAlgorithmSymmetricEncryption from .types import KeyOrigin from .types import KeyState @@ -51,6 +52,7 @@ "DataKeyAlgorithmSymmetricEncryption", "KeyAlgorithmAsymmetricEncryption", "KeyAlgorithmAsymmetricSigning", + "KeyAlgorithmKeyEncapsulation", "KeyAlgorithmSymmetricEncryption", "KeyOrigin", "KeyState", diff --git a/scaleway/scaleway/key_manager/v1alpha1/marshalling.py b/scaleway/scaleway/key_manager/v1alpha1/marshalling.py index 336c95806..517f06edd 100644 --- a/scaleway/scaleway/key_manager/v1alpha1/marshalling.py +++ b/scaleway/scaleway/key_manager/v1alpha1/marshalling.py @@ -100,6 +100,12 @@ def unmarshal_KeyUsage(data: Any) -> KeyUsage: KeyAlgorithmAsymmetricSigning.UNKNOWN_ASYMMETRIC_SIGNING ) + field = data.get("key_encapsulation", None) + if field is not None: + args["key_encapsulation"] = field + else: + args["key_encapsulation"] = None + return KeyUsage(**args) @@ -535,6 +541,11 @@ def marshal_KeyUsage( value=request.asymmetric_signing, marshal_func=None, ), + OneOfPossibility( + param="key_encapsulation", + value=request.key_encapsulation, + marshal_func=None, + ), ] ), ) diff --git a/scaleway/scaleway/key_manager/v1alpha1/types.py b/scaleway/scaleway/key_manager/v1alpha1/types.py index 6ecab53ee..cbcfe1517 100644 --- a/scaleway/scaleway/key_manager/v1alpha1/types.py +++ b/scaleway/scaleway/key_manager/v1alpha1/types.py @@ -28,8 +28,6 @@ class KeyAlgorithmAsymmetricEncryption(str, Enum, metaclass=StrEnumMeta): RSA_OAEP_2048_SHA256 = "rsa_oaep_2048_sha256" RSA_OAEP_3072_SHA256 = "rsa_oaep_3072_sha256" RSA_OAEP_4096_SHA256 = "rsa_oaep_4096_sha256" - ML_KEM_768 = "ml_kem_768" - ML_KEM_1024 = "ml_kem_1024" def __str__(self) -> str: return str(self.value) @@ -54,6 +52,15 @@ def __str__(self) -> str: return str(self.value) +class KeyAlgorithmKeyEncapsulation(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_KEY_ENCAPSULATION = "unknown_key_encapsulation" + ML_KEM_768 = "ml_kem_768" + ML_KEM_1024 = "ml_kem_1024" + + def __str__(self) -> str: + return str(self.value) + + class KeyAlgorithmSymmetricEncryption(str, Enum, metaclass=StrEnumMeta): UNKNOWN_SYMMETRIC_ENCRYPTION = "unknown_symmetric_encryption" AES_256_GCM = "aes_256_gcm" @@ -87,6 +94,7 @@ class ListAlgorithmsRequestUsage(str, Enum, metaclass=StrEnumMeta): SYMMETRIC_ENCRYPTION = "symmetric_encryption" ASYMMETRIC_ENCRYPTION = "asymmetric_encryption" ASYMMETRIC_SIGNING = "asymmetric_signing" + KEY_ENCAPSULATION = "key_encapsulation" def __str__(self) -> str: return str(self.value) @@ -141,6 +149,8 @@ class KeyUsage: KeyAlgorithmAsymmetricSigning.UNKNOWN_ASYMMETRIC_SIGNING ) + key_encapsulation: Optional[KeyAlgorithmKeyEncapsulation] = None + @dataclass class ListAlgorithmsResponseAlgorithm: diff --git a/scaleway/scaleway/serverless_sqldb/v1alpha1/__init__.py b/scaleway/scaleway/serverless_sqldb/v1alpha1/__init__.py index 6ed7cd9ec..1c5a6bd21 100644 --- a/scaleway/scaleway/serverless_sqldb/v1alpha1/__init__.py +++ b/scaleway/scaleway/serverless_sqldb/v1alpha1/__init__.py @@ -5,6 +5,7 @@ from .content import DATABASE_TRANSIENT_STATUSES from .types import ListDatabaseBackupsRequestOrderBy from .types import ListDatabasesRequestOrderBy +from .types import Version from .types import DatabaseBackup from .types import Database from .types import CreateDatabaseRequest @@ -16,6 +17,8 @@ from .types import ListDatabaseBackupsResponse from .types import ListDatabasesRequest from .types import ListDatabasesResponse +from .types import ListVersionsRequest +from .types import ListVersionsResponse from .types import RestoreDatabaseFromBackupRequest from .types import UpdateDatabaseRequest from .api import ServerlessSqldbV1Alpha1API @@ -26,6 +29,7 @@ "DATABASE_TRANSIENT_STATUSES", "ListDatabaseBackupsRequestOrderBy", "ListDatabasesRequestOrderBy", + "Version", "DatabaseBackup", "Database", "CreateDatabaseRequest", @@ -37,6 +41,8 @@ "ListDatabaseBackupsResponse", "ListDatabasesRequest", "ListDatabasesResponse", + "ListVersionsRequest", + "ListVersionsResponse", "RestoreDatabaseFromBackupRequest", "UpdateDatabaseRequest", "ServerlessSqldbV1Alpha1API", diff --git a/scaleway/scaleway/serverless_sqldb/v1alpha1/api.py b/scaleway/scaleway/serverless_sqldb/v1alpha1/api.py index 7aa513dfc..97b3915cf 100644 --- a/scaleway/scaleway/serverless_sqldb/v1alpha1/api.py +++ b/scaleway/scaleway/serverless_sqldb/v1alpha1/api.py @@ -21,8 +21,10 @@ DatabaseBackup, ListDatabaseBackupsResponse, ListDatabasesResponse, + ListVersionsResponse, RestoreDatabaseFromBackupRequest, UpdateDatabaseRequest, + Version, ) from .content import ( DATABASE_TRANSIENT_STATUSES, @@ -32,6 +34,7 @@ unmarshal_Database, unmarshal_ListDatabaseBackupsResponse, unmarshal_ListDatabasesResponse, + unmarshal_ListVersionsResponse, marshal_CreateDatabaseRequest, marshal_RestoreDatabaseFromBackupRequest, marshal_UpdateDatabaseRequest, @@ -49,6 +52,7 @@ def create_database( name: str, cpu_min: int, cpu_max: int, + version: str, region: Optional[ScwRegion] = None, project_id: Optional[str] = None, from_backup_id: Optional[str] = None, @@ -59,6 +63,7 @@ def create_database( :param name: The name of the Serverless SQL Database to be created. :param cpu_min: The minimum number of CPU units for your Serverless SQL Database. :param cpu_max: The maximum number of CPU units for your Serverless SQL Database. + :param version: The major version of the postgreSQL requested. :param region: Region to target. If none is passed will use default region from the config. :param project_id: The ID of your Scaleway project. :param from_backup_id: The ID of the backup to create the database from. @@ -71,6 +76,7 @@ def create_database( name="example", cpu_min=1, cpu_max=1, + version="example", ) """ @@ -86,6 +92,7 @@ def create_database( name=name, cpu_min=cpu_min, cpu_max=cpu_max, + version=version, region=region, project_id=project_id, from_backup_id=from_backup_id, @@ -554,3 +561,76 @@ def export_database_backup( self._throw_on_error(res) return unmarshal_DatabaseBackup(res.json()) + + def list_versions( + self, + *, + region: Optional[ScwRegion] = None, + version: Optional[str] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + ) -> ListVersionsResponse: + """ + List available PostgreSQL major versions. + :param region: Region to target. If none is passed will use default region from the config. + :param version: + :param page: + :param page_size: + :return: :class:`ListVersionsResponse ` + + Usage: + :: + + result = api.list_versions() + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + + res = self._request( + "GET", + f"/serverless-sqldb/v1alpha1/regions/{param_region}/versions", + params={ + "page": page, + "page_size": page_size or self.client.default_page_size, + "version": version, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListVersionsResponse(res.json()) + + def list_versions_all( + self, + *, + region: Optional[ScwRegion] = None, + version: Optional[str] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + ) -> list[Version]: + """ + List available PostgreSQL major versions. + :param region: Region to target. If none is passed will use default region from the config. + :param version: + :param page: + :param page_size: + :return: :class:`list[Version] ` + + Usage: + :: + + result = api.list_versions_all() + """ + + return fetch_all_pages( + type=ListVersionsResponse, + key="versions", + fetcher=self.list_versions, + args={ + "region": region, + "version": version, + "page": page, + "page_size": page_size, + }, + ) diff --git a/scaleway/scaleway/serverless_sqldb/v1alpha1/marshalling.py b/scaleway/scaleway/serverless_sqldb/v1alpha1/marshalling.py index 88e522c58..a1288c5e2 100644 --- a/scaleway/scaleway/serverless_sqldb/v1alpha1/marshalling.py +++ b/scaleway/scaleway/serverless_sqldb/v1alpha1/marshalling.py @@ -9,9 +9,11 @@ DatabaseBackupStatus, DatabaseStatus, DatabaseBackup, + Version, Database, ListDatabaseBackupsResponse, ListDatabasesResponse, + ListVersionsResponse, CreateDatabaseRequest, RestoreDatabaseFromBackupRequest, UpdateDatabaseRequest, @@ -103,6 +105,37 @@ def unmarshal_DatabaseBackup(data: Any) -> DatabaseBackup: return DatabaseBackup(**args) +def unmarshal_Version(data: Any) -> Version: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Version' failed as data isn't a dictionary." + ) + + args: dict[str, Any] = {} + + field = data.get("name", None) + if field is not None: + args["name"] = field + else: + args["name"] = None + + field = data.get("region", None) + if field is not None: + args["region"] = field + else: + args["region"] = None + + field = data.get("end_of_life_at", None) + if field is not None: + args["end_of_life_at"] = ( + parser.isoparse(field) if isinstance(field, str) else field + ) + else: + args["end_of_life_at"] = None + + return Version(**args) + + def unmarshal_Database(data: Any) -> Database: if not isinstance(data, dict): raise TypeError( @@ -177,17 +210,23 @@ def unmarshal_Database(data: Any) -> Database: else: args["started"] = False + 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("engine_major_version", None) if field is not None: args["engine_major_version"] = field else: - args["engine_major_version"] = 0 + args["engine_major_version"] = None - field = data.get("created_at", None) + field = data.get("version", None) if field is not None: - args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + args["version"] = unmarshal_Version(field) else: - args["created_at"] = None + args["version"] = None return Database(**args) @@ -242,6 +281,31 @@ def unmarshal_ListDatabasesResponse(data: Any) -> ListDatabasesResponse: return ListDatabasesResponse(**args) +def unmarshal_ListVersionsResponse(data: Any) -> ListVersionsResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListVersionsResponse' failed as data isn't a dictionary." + ) + + args: dict[str, Any] = {} + + field = data.get("versions", None) + if field is not None: + args["versions"] = ( + [unmarshal_Version(v) for v in field] if field is not None else None + ) + else: + args["versions"] = [] + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + else: + args["total_count"] = 0 + + return ListVersionsResponse(**args) + + def marshal_CreateDatabaseRequest( request: CreateDatabaseRequest, defaults: ProfileDefaults, @@ -257,6 +321,9 @@ def marshal_CreateDatabaseRequest( if request.cpu_max is not None: output["cpu_max"] = request.cpu_max + if request.version is not None: + output["version"] = request.version + if request.project_id is not None: output["project_id"] = request.project_id else: diff --git a/scaleway/scaleway/serverless_sqldb/v1alpha1/types.py b/scaleway/scaleway/serverless_sqldb/v1alpha1/types.py index 90f8d76c1..e9b7b4e3e 100644 --- a/scaleway/scaleway/serverless_sqldb/v1alpha1/types.py +++ b/scaleway/scaleway/serverless_sqldb/v1alpha1/types.py @@ -56,6 +56,24 @@ def __str__(self) -> str: return str(self.value) +@dataclass +class Version: + name: str + """ + Major number of the PostgreSQL engine. + """ + + region: ScwRegion + """ + Region to target. If none is passed will use default region from the config. + """ + + end_of_life_at: Optional[datetime] = None + """ + Date of End Of Life. + """ + + @dataclass class DatabaseBackup: id: str @@ -176,14 +194,19 @@ class Database: Whether your Serverless SQL Database is running or not. """ - engine_major_version: int + created_at: Optional[datetime] = None """ - The major version of the underlying database engine. + Creation date. """ - created_at: Optional[datetime] = None + engine_major_version: Optional[int] = None """ - Creation date. + The major version of the underlying database engine. (deprecated in favor of `version`). + """ + + version: Optional[Version] = None + """ + The major version of the underlying database engine. """ @@ -204,6 +227,11 @@ class CreateDatabaseRequest: The maximum number of CPU units for your Serverless SQL Database. """ + version: str + """ + The major version of the postgreSQL requested. + """ + region: Optional[ScwRegion] = None """ Region to target. If none is passed will use default region from the config. @@ -378,6 +406,31 @@ class ListDatabasesResponse: """ +@dataclass +class ListVersionsRequest: + region: Optional[ScwRegion] = None + """ + Region to target. If none is passed will use default region from the config. + """ + + version: Optional[str] = None + page: Optional[int] = 0 + page_size: Optional[int] = 0 + + +@dataclass +class ListVersionsResponse: + versions: list[Version] + """ + Available PostgreSQL versions. + """ + + total_count: int + """ + Total count of versions available. + """ + + @dataclass class RestoreDatabaseFromBackupRequest: database_id: str