diff --git a/src/database-mcp-server/LICENSE.txt b/src/database-mcp-server/LICENSE.txt new file mode 100644 index 0000000..8dc7c07 --- /dev/null +++ b/src/database-mcp-server/LICENSE.txt @@ -0,0 +1,35 @@ +Copyright (c) 2025 Oracle and/or its affiliates. + +The Universal Permissive License (UPL), Version 1.0 + +Subject to the condition set forth below, permission is hereby granted to any +person obtaining a copy of this software, associated documentation and/or data +(collectively the "Software"), free of charge and under any and all copyright +rights in the Software, and any and all patent rights owned or freely +licensable by each licensor hereunder covering either (i) the unmodified +Software as contributed to or provided by such licensor, or (ii) the Larger +Works (as defined below), to deal in both + +(a) the Software, and +(b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +one is included with the Software (each a "Larger Work" to which the Software +is contributed by such licensors), + +without restriction, including without limitation the rights to copy, create +derivative works of, display, perform, and distribute the Software and make, +use, sell, offer for sale, import, export, have made, and have sold the +Software and the Larger Work(s), and to sublicense the foregoing rights on +either these or other terms. + +This license is subject to the following condition: +The above copyright notice and either this complete permission notice or at +a minimum a reference to the UPL must be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/src/database-mcp-server/README.md b/src/database-mcp-server/README.md new file mode 100644 index 0000000..75ac669 --- /dev/null +++ b/src/database-mcp-server/README.md @@ -0,0 +1,112 @@ +# OCI Database MCP Server + +## Overview + +This server provides tools to interact with the OCI Database service. + +## Running the server + +```sh +uv run oracle.database-mcp-server +``` + +## Tools + +| Tool Name | Description | +| --- |------------------------------------------------------------------------------| +| list_application_vips | Get application virtual IP (VIP) addresses on a cloud VM cluster | +| list_autonomous_container_database_dataguard_associations | List Autonomous Data Guard associations for an Autonomous Container Database | +| list_autonomous_container_database_versions | List supported Autonomous Container Database versions | +| list_autonomous_container_databases | List Autonomous Container Databases in a compartment | +| list_autonomous_database_backups | List Autonomous Database backups by database ID or compartment | +| list_autonomous_database_character_sets | List supported character sets for Autonomous Databases | +| list_autonomous_database_clones | List clones for a specific Autonomous Database | +| list_autonomous_database_dataguard_associations | List Autonomous Data Guard associations for an Autonomous Database | +| list_autonomous_database_peers | List peers for a specific Autonomous Database | +| list_autonomous_database_refreshable_clones | List refreshable clones for a specific Autonomous Database | +| list_autonomous_database_software_images | List Autonomous Database Software Images in a compartment | +| list_autonomous_databases | List Autonomous Databases in a compartment | +| list_autonomous_db_preview_versions | List supported preview versions for Autonomous Databases | +| list_autonomous_db_versions | List supported versions for Autonomous Databases | +| list_autonomous_virtual_machines | List Autonomous Virtual Machines in a specified cluster and compartment | +| list_autonomous_vm_clusters | List Exadata Cloud@Customer Autonomous VM clusters in a compartment | +| list_backup_destination | List backup destinations in a compartment | +| list_backups | List database backups by database ID or compartment | +| list_cloud_autonomous_vm_clusters | List Autonomous Exadata VM clusters in the Oracle cloud | +| list_cloud_exadata_infrastructures | List cloud Exadata infrastructure resources in a compartment | +| list_cloud_vm_cluster_updates | List maintenance updates for a specific cloud VM cluster | +| list_cloud_vm_clusters | List cloud VM clusters in a compartment | +| list_console_connections | List console connections for a database node | +| list_console_histories | List console histories for a database node | +| list_container_database_patches | List patches applicable to a container database | +| list_data_guard_associations | List Data Guard associations for a database | +| list_database_software_images | List database software images in a compartment | +| list_databases | List databases in a specified Database Home | +| list_db_home_patch_history_entries | List patch history for a Database Home | +| list_db_home_patches | List patches applicable to a Database Home | +| list_db_homes | List Database Homes in a DB system and compartment | +| list_db_nodes | List database nodes in a DB system and compartment | +| list_db_servers | List Exadata DB servers for an Exadata infrastructure | +| list_db_system_compute_performances | Get a list of expected compute performance for a VM DB system | +| list_db_system_patches | List patches applicable to a DB system | +| list_db_system_shapes | Get a list of shapes available for launching a new DB system | +| list_db_system_storage_performances | Get a list of expected storage performance for a VM DB system | +| list_db_systems | List DB systems in a compartment | +| list_db_versions | Get a list of supported Oracle Database versions | +| list_exadata_infrastructures | List Exadata Cloud@Customer infrastructure resources in a compartment | +| list_exadb_vm_cluster_updates | List maintenance updates for an Exadata VM cluster on Exascale | +| list_exadb_vm_clusters | List Exadata VM clusters on Exascale Infrastructure in a compartment | +| list_exascale_db_storage_vaults | List Exadata Database Storage Vaults in a compartment | +| list_execution_actions | List execution action resources in a compartment | +| list_execution_windows | List execution window resources in a compartment | +| list_external_container_databases | List external container databases in a compartment | +| list_external_database_connectors | List external database connectors in a compartment | +| list_external_non_container_databases | List external non-container databases in a compartment | +| list_external_pluggable_databases | List external pluggable databases in a compartment | +| list_flex_components | Get a list of flex components available for launching a new DB system | +| list_gi_version_minor_versions | Get a list of supported Grid Infrastructure minor versions | +| list_gi_versions | Get a list of supported Grid Infrastructure (GI) versions | +| list_key_stores | Get a list of key stores in the specified compartment | +| list_maintenance_run_history | Get a list of maintenance run histories in a compartment | +| list_maintenance_runs | Get a list of maintenance runs in a compartment | +| list_oneoff_patches | List one-off patches in a compartment | +| list_pluggable_databases | Get a list of pluggable databases in a database or compartment | +| list_scheduled_actions | List Scheduled Action resources in a compartment | +| list_scheduling_plans | List Scheduling Plan resources in a compartment | +| list_scheduling_policies | List Scheduling Policy resources in a compartment | +| list_scheduling_windows | List Scheduling Window resources in a compartment | +| list_system_versions | Get a list of supported Exadata system versions | +| list_vm_cluster_networks | Get a list of VM cluster networks in a compartment | +| list_vm_cluster_patches | List patches applicable to a VM cluster | +| list_vm_cluster_updates | List maintenance updates for a VM cluster | +| list_vm_clusters | List VM clusters in a compartment | +| resource_pool_shapes | List available resource pool shapes | +| create_pluggable_database | Create and start a pluggable database | +| create_pluggable_database_from_local_clone | Create a pluggable database from a local clone | +| create_pluggable_database_from_remote_clone | Create a pluggable database by cloning from a remote source CDB | +| create_pluggable_database_from_relocate | Relocate (move) a pluggable database from a source CDB into the target CDB | +| delete_pluggable_database | Delete a specific pluggable database | +| get_pluggable_database | Get information about a specific pluggable database | +| update_pluggable_database | Update a specific pluggable database | +| get_compartment_by_name_tool | Return a compartment matching the provided name | +| list_subscribed_regions_tool | Return a list of all regions the customer (tenancy) is subscribed to | + + + +⚠️ **NOTE**: All actions are performed with the permissions of the configured OCI CLI profile. We advise least-privilege IAM setup, secure credential management, safe network practices, secure logging, and warn against exposing secrets. + +## Third-Party APIs + +Developers choosing to distribute a binary implementation of this project are responsible for obtaining and providing all required licenses and copyright notices for the third-party code used in order to ensure compliance with their respective open source licenses. + +## Disclaimer + +Users are responsible for their local environment and credential safety. Different language model selections may yield different results and performance. + +## License + +Copyright (c) 2025 Oracle and/or its affiliates. + +Released under the Universal Permissive License v1.0 as shown at +. + diff --git a/src/database-mcp-server/oracle/__init__.py b/src/database-mcp-server/oracle/__init__.py new file mode 100644 index 0000000..d9dff09 --- /dev/null +++ b/src/database-mcp-server/oracle/__init__.py @@ -0,0 +1,5 @@ +""" +Copyright (c) 2025, Oracle and/or its affiliates. +Licensed under the Universal Permissive License v1.0 as shown at +https://oss.oracle.com/licenses/upl. +""" diff --git a/src/database-mcp-server/oracle/database_mcp_server/__init__.py b/src/database-mcp-server/oracle/database_mcp_server/__init__.py new file mode 100644 index 0000000..18a8144 --- /dev/null +++ b/src/database-mcp-server/oracle/database_mcp_server/__init__.py @@ -0,0 +1,8 @@ +""" +Copyright (c) 2025, Oracle and/or its affiliates. +Licensed under the Universal Permissive License v1.0 as shown at +https://oss.oracle.com/licenses/upl. +""" + +__project__ = "oracle.database-mcp-server" +__version__ = "1.0.0" diff --git a/src/database-mcp-server/oracle/database_mcp_server/models.py b/src/database-mcp-server/oracle/database_mcp_server/models.py new file mode 100644 index 0000000..290527f --- /dev/null +++ b/src/database-mcp-server/oracle/database_mcp_server/models.py @@ -0,0 +1,7199 @@ +from __future__ import annotations + +from datetime import datetime +from typing import Optional + +import oci +from pydantic import BaseModel, Field + + +class OCIBaseModel(BaseModel): + """Base model that supports conversion from OCI SDK models.""" + + model_config = {"arbitrary_types_allowed": True} + + @classmethod + def from_oci(cls, sdk_obj): + """Convert an OCI SDK model into this Pydantic model.""" + return cls(**oci.util.to_dict(sdk_obj)) + + +class ApplicationVipSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ApplicationVipSummary.""" + + cloud_vm_cluster_id: Optional[str] = Field( + None, + description="**[Required]** Gets the cloud_vm_cluster_id of this ApplicationVipSummary. The `OCID`__ of the cloud VM cluster associated with the application virtual IP (VIP) address. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compartment_id: Optional[str] = Field( + None, + description="The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + hostname_label: Optional[str] = Field( + None, + description="**[Required]** Gets the hostname_label of this ApplicationVipSummary. The hostname of the application virtual IP (VIP) address.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ApplicationVipSummary. The `OCID`__ of the application virtual IP (VIP) address. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + ip_address: Optional[str] = Field( + None, description="The application virtual IP (VIP) address." + ) + lifecycle_details: Optional[str] = Field( + None, + description="Additional information about the current lifecycle state of the application virtual IP (VIP) address.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ApplicationVipSummary. The current lifecycle state of the application virtual IP (VIP) address. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "TERMINATING", "TERMINATED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + subnet_id: Optional[str] = Field( + None, + description="The `OCID`__ of the subnet associated with the application virtual IP (VIP) address. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + time_assigned: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_assigned of this ApplicationVipSummary. The date and time when the create operation for the application virtual IP (VIP) address completed.", + ) + + +def map_applicationvipsummary( + o: oci.database.models.ApplicationVipSummary, +) -> ApplicationVipSummary | None: + """Map oci.database.models.ApplicationVipSummary → ApplicationVipSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ApplicationVipSummary(**data) + except Exception: + return ApplicationVipSummary( + cloud_vm_cluster_id=getattr(o, "cloud_vm_cluster_id", None), + compartment_id=getattr(o, "compartment_id", None), + defined_tags=getattr(o, "defined_tags", None), + freeform_tags=getattr(o, "freeform_tags", None), + hostname_label=getattr(o, "hostname_label", None), + id=getattr(o, "id", None), + ip_address=getattr(o, "ip_address", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + subnet_id=getattr(o, "subnet_id", None), + time_assigned=getattr(o, "time_assigned", None), + ) + + +class AutonomousContainerDatabaseDataguardAssociation(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousContainerDatabaseDataguardAssociation.""" + + apply_lag: Optional[str] = Field( + None, + description="The lag time between updates to the primary Autonomous Container Database and application of the redo data on the standby Autonomous Container Database, as computed by the reporting database. Example: `9 seconds`", + ) + apply_rate: Optional[str] = Field( + None, + description="The rate at which redo logs are synchronized between the associated Autonomous Container Databases. Example: `180 Mb per second`", + ) + autonomous_container_database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the autonomous_container_database_id of this AutonomousContainerDatabaseDataguardAssociation. The `OCID`__ of the Autonomous Container Database that has a relationship with the peer Autonomous Container Database. Used only by Autonomous Database on Dedicated Exadata Infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + fast_start_fail_over_lag_limit_in_seconds: Optional[int] = Field( + None, + description="The lag time for my preference based on data loss tolerance in seconds.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this AutonomousContainerDatabaseDataguardAssociation. The OCID of the Autonomous Data Guard created for a given Autonomous Container Database.", + ) + is_automatic_failover_enabled: Optional[bool] = Field( + None, + description="Indicates whether Automatic Failover is enabled for Autonomous Container Database Dataguard Association", + ) + lifecycle_details: Optional[str] = Field( + None, + description="Additional information about the current lifecycleState, if available.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this AutonomousContainerDatabaseDataguardAssociation. The current state of Autonomous Data Guard. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "ROLE_CHANGE_IN_PROGRESS", "TERMINATING", "TERMINATED", "FAILED", "UNAVAILABLE", "UPDATING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + peer_autonomous_container_database_dataguard_association_id: Optional[str] = Field( + None, + description="The OCID of the peer Autonomous Container Database-Autonomous Data Guard association.", + ) + peer_autonomous_container_database_id: Optional[str] = Field( + None, + description="The `OCID`__ of the peer Autonomous Container Database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + peer_lifecycle_state: Optional[str] = Field( + None, + description='The current state of the Autonomous Container Database. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "BACKUP_IN_PROGRESS", "RESTORING", "RESTORE_FAILED", "RESTARTING", "MAINTENANCE_IN_PROGRESS", "ROLE_CHANGE_IN_PROGRESS", "ENABLING_AUTONOMOUS_DATA_GUARD", "UNAVAILABLE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + peer_role: Optional[str] = Field( + None, + description='**[Required]** Gets the peer_role of this AutonomousContainerDatabaseDataguardAssociation. The Data Guard role of the Autonomous Container Database or Autonomous Database, if Autonomous Data Guard is enabled. Allowed values for this property are: "PRIMARY", "STANDBY", "DISABLED_STANDBY", "BACKUP_COPY", "SNAPSHOT_STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + protection_mode: Optional[str] = Field( + None, + description="The protection mode of this Autonomous Data Guard association. For more information, see `Oracle Data Guard Protection Modes`__ in the Oracle Data Guard documentation. __ http://docs.oracle.com/database/122/SBYDB/oracle-data-guard-protection-modes.htm#SBYDB02000 Allowed values for this property are: \"MAXIMUM_AVAILABILITY\", \"MAXIMUM_PERFORMANCE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + role: Optional[str] = Field( + None, + description='**[Required]** Gets the role of this AutonomousContainerDatabaseDataguardAssociation. The Data Guard role of the Autonomous Container Database or Autonomous Database, if Autonomous Data Guard is enabled. Allowed values for this property are: "PRIMARY", "STANDBY", "DISABLED_STANDBY", "BACKUP_COPY", "SNAPSHOT_STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_created: Optional[datetime] = Field( + None, + description="The date and time the Autonomous DataGuard association was created.", + ) + time_last_role_changed: Optional[datetime] = Field( + None, description="The date and time when the last role change action happened." + ) + time_last_synced: Optional[datetime] = Field( + None, + description="The date and time of the last update to the apply lag, apply rate, and transport lag values.", + ) + transport_lag: Optional[str] = Field( + None, + description="The approximate number of seconds of redo data not yet available on the standby Autonomous Container Database, as computed by the reporting database. Example: `7 seconds`", + ) + + +def map_autonomouscontainerdatabasedataguardassociation( + o: oci.database.models.AutonomousContainerDatabaseDataguardAssociation, +) -> AutonomousContainerDatabaseDataguardAssociation | None: + """Map oci.database.models.AutonomousContainerDatabaseDataguardAssociation → AutonomousContainerDatabaseDataguardAssociation Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousContainerDatabaseDataguardAssociation(**data) + except Exception: + return AutonomousContainerDatabaseDataguardAssociation( + apply_lag=getattr(o, "apply_lag", None), + apply_rate=getattr(o, "apply_rate", None), + autonomous_container_database_id=getattr( + o, "autonomous_container_database_id", None + ), + fast_start_fail_over_lag_limit_in_seconds=getattr( + o, "fast_start_fail_over_lag_limit_in_seconds", None + ), + id=getattr(o, "id", None), + is_automatic_failover_enabled=getattr( + o, "is_automatic_failover_enabled", None + ), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + peer_autonomous_container_database_dataguard_association_id=getattr( + o, "peer_autonomous_container_database_dataguard_association_id", None + ), + peer_autonomous_container_database_id=getattr( + o, "peer_autonomous_container_database_id", None + ), + peer_lifecycle_state=getattr(o, "peer_lifecycle_state", None), + peer_role=getattr(o, "peer_role", None), + protection_mode=getattr(o, "protection_mode", None), + role=getattr(o, "role", None), + time_created=getattr(o, "time_created", None), + time_last_role_changed=getattr(o, "time_last_role_changed", None), + time_last_synced=getattr(o, "time_last_synced", None), + transport_lag=getattr(o, "transport_lag", None), + ) + + +class AutonomousContainerDatabaseVersionSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousContainerDatabaseVersionSummary.""" + + details: Optional[str] = Field( + None, + description="A URL that points to a detailed description of the Autonomous Container Database version.", + ) + supported_apps: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the supported_apps of this AutonomousContainerDatabaseVersionSummary. The list of applications supported for the given version.", + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this AutonomousContainerDatabaseVersionSummary. A valid Oracle Database version for provisioning an Autonomous Container Database.", + ) + + +def map_autonomouscontainerdatabaseversionsummary( + o: oci.database.models.AutonomousContainerDatabaseVersionSummary, +) -> AutonomousContainerDatabaseVersionSummary | None: + """Map oci.database.models.AutonomousContainerDatabaseVersionSummary → AutonomousContainerDatabaseVersionSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousContainerDatabaseVersionSummary(**data) + except Exception: + return AutonomousContainerDatabaseVersionSummary( + details=getattr(o, "details", None), + supported_apps=getattr(o, "supported_apps", None), + version=getattr(o, "version", None), + ) + + +class AutonomousContainerDatabaseSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousContainerDatabaseSummary.""" + + associated_backup_configuration_details: Optional[list[dict]] = Field( + None, + description="A backup config object holds information about preferred backup destinations only. This object holds information about the associated backup destinations, such as secondary backup destinations created for local backups or remote replicated backups.", + ) + autonomous_exadata_infrastructure_id: Optional[str] = Field( + None, + description="**No longer used.** For Autonomous Database on dedicated Exadata infrastructure, the container database is created within a specified `cloudAutonomousVmCluster`.", + ) + autonomous_vm_cluster_id: Optional[str] = Field( + None, description="The OCID of the Autonomous VM Cluster." + ) + availability_domain: Optional[str] = Field( + None, + description="The availability domain of the Autonomous Container Database.", + ) + available_cpus: Optional[float] = Field( + None, + description="Sum of CPUs available on the Autonomous VM Cluster + Sum of reclaimable CPUs available in the Autonomous Container Database.", + ) + backup_config: Optional[dict] = Field(None, description="") + backup_destination_properties_list: Optional[list[str]] = Field( + None, + description="This list describes the backup destination properties associated with the Autonomous Container Database (ACD) 's preferred backup destination. The object at a given index is associated with the destination present at the same index in the backup destination details list of the ACD Backup Configuration.", + ) + cloud_autonomous_vm_cluster_id: Optional[str] = Field( + None, + description="The `OCID`__ of the cloud Autonomous Exadata VM Cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this AutonomousContainerDatabaseSummary. The OCID of the compartment.", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous Container Database. For Autonomous Database on Dedicated Exadata Infrastructure, the CPU type (ECPUs or OCPUs) is determined by the parent Autonomous Exadata VM Cluster's compute model. ECPU compute model is the recommended model and OCPU compute model is legacy. See `Compute Models in Autonomous Database on Dedicated Exadata Infrastructure`__ for more details. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbak Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + db_name: Optional[str] = Field( + None, + description="The Database name for the Autonomous Container Database. The name must be unique within the Cloud Autonomous VM Cluster, starting with an alphabetic character, followed by 1 to 7 alphanumeric characters.", + ) + db_split_threshold: Optional[int] = Field( + None, + description="The CPU value beyond which an Autonomous Database will be opened across multiple nodes. The default value of this attribute is 16 for OCPUs and 64 for ECPUs.", + ) + db_unique_name: Optional[str] = Field( + None, + description="**Deprecated.** The `DB_UNIQUE_NAME` value is set by Oracle Cloud Infrastructure. Do not specify a value for this parameter. Specifying a value for this field will cause Terraform operations to fail.", + ) + db_version: Optional[str] = Field( + None, + description="Oracle Database version of the Autonomous Container Database.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this AutonomousContainerDatabaseSummary. The user-provided name for the Autonomous Container Database.", + ) + distribution_affinity: Optional[str] = Field( + None, + description="Determines whether an Autonomous Database must be opened across the maximum number of nodes or the least number of nodes. By default, Minimum nodes is selected. Allowed values for this property are: \"MINIMUM_DISTRIBUTION\", \"MAXIMUM_DISTRIBUTION\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + dst_file_version: Optional[str] = Field( + None, + description="DST Time-Zone File version of the Autonomous Container Database.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this AutonomousContainerDatabaseSummary. The OCID of the Autonomous Container Database.", + ) + infrastructure_type: Optional[str] = Field( + None, + description="The infrastructure type this resource belongs to. Allowed values for this property are: \"CLOUD\", \"CLOUD_AT_CUSTOMER\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + is_dst_file_update_enabled: Optional[bool] = Field( + None, + description="Indicates if an automatic DST Time Zone file update is enabled for the Autonomous Container Database. If enabled along with Release Update, patching will be done in a Non-Rolling manner.", + ) + key_history_entry: Optional[list[dict]] = Field( + None, description="Key History Entry." + ) + key_store_id: Optional[str] = Field( + None, + description="The `OCID`__ of the key store of Oracle Vault. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + key_store_wallet_name: Optional[str] = Field( + None, description="The wallet name for Oracle Key Vault." + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + kms_key_version_id: Optional[str] = Field( + None, + description="The OCID of the key container version that is used in database transparent data encryption (TDE) operations KMS Key can have multiple key versions. If none is specified, the current key version (latest) of the Key Id is used for the operation. Autonomous Database Serverless does not use key versions, hence is not applicable for Autonomous Database Serverless instances.", + ) + largest_provisionable_autonomous_database_in_cpus: Optional[float] = Field( + None, + description="The largest Autonomous Database (CPU) that can be created in a new Autonomous Container Database.", + ) + last_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this AutonomousContainerDatabaseSummary. The current state of the Autonomous Container Database. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "BACKUP_IN_PROGRESS", "RESTORING", "RESTORE_FAILED", "RESTARTING", "MAINTENANCE_IN_PROGRESS", "ROLE_CHANGE_IN_PROGRESS", "ENABLING_AUTONOMOUS_DATA_GUARD", "UNAVAILABLE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + list_one_off_patches: Optional[str] = Field( + None, + description="List of One-Off patches that has been successfully applied to Autonomous Container Database", + ) + maintenance_window: Optional[int] = Field(None, description="") + memory_per_oracle_compute_unit_in_gbs: Optional[int] = Field( + None, + description="The amount of memory (in GBs) enabled per ECPU or OCPU in the Autonomous VM Cluster.", + ) + net_services_architecture: Optional[str] = Field( + None, + description="Enabling SHARED server architecture enables a database server to allow many client processes to share very few server processes, thereby increasing the number of supported users. Allowed values for this property are: \"DEDICATED\", \"SHARED\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + next_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the next maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + patch_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last patch applied on the system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + patch_model: Optional[str] = Field( + None, + description="**[Required]** Gets the patch_model of this AutonomousContainerDatabaseSummary. Database patch model preference. Allowed values for this property are: \"RELEASE_UPDATES\", \"RELEASE_UPDATE_REVISIONS\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + provisionable_cpus: Optional[float] = Field( + None, + description="An array of CPU values that can be used to successfully provision a single Autonomous Database.", + ) + provisioned_cpus: Optional[float] = Field( + None, + description="The number of CPUs provisioned in an Autonomous Container Database.", + ) + reclaimable_cpus: Optional[float] = Field( + None, + description="CPUs that continue to be included in the count of CPUs available to the Autonomous Container Database even after one of its Autonomous Database is terminated or scaled down. You can release them to the available CPUs at its parent Autonomous VM Cluster level by restarting the Autonomous Container Database.", + ) + recovery_appliance_details: Optional[dict] = Field(None, description="") + reserved_cpus: Optional[float] = Field( + None, + description="The number of CPUs reserved in an Autonomous Container Database.", + ) + role: Optional[str] = Field( + None, + description='The Data Guard role of the Autonomous Container Database or Autonomous Database, if Autonomous Data Guard is enabled. Allowed values for this property are: "PRIMARY", "STANDBY", "DISABLED_STANDBY", "BACKUP_COPY", "SNAPSHOT_STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + service_level_agreement_type: Optional[str] = Field( + None, + description='**[Required]** Gets the service_level_agreement_type of this AutonomousContainerDatabaseSummary. The service level agreement type of the container database. The default is STANDARD. Allowed values for this property are: "STANDARD", "MISSION_CRITICAL", "AUTONOMOUS_DATAGUARD", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + standby_maintenance_buffer_in_days: Optional[int] = Field( + None, + description="The scheduling detail for the quarterly maintenance window of the standby Autonomous Container Database. This value represents the number of days before scheduled maintenance of the primary database.", + ) + time_created: Optional[datetime] = Field( + None, + description="The date and time the Autonomous Container Database was created.", + ) + time_of_last_backup: Optional[datetime] = Field( + None, + description="The timestamp of last successful backup. Here NULL value represents either there are no successful backups or backups are not configured for this Autonomous Container Database.", + ) + time_snapshot_standby_revert: Optional[datetime] = Field( + None, + description="The date and time the Autonomous Container Database will be reverted to Standby from Snapshot Standby.", + ) + total_cpus: Optional[int] = Field( + None, description="The number of CPUs allocated to the Autonomous VM cluster." + ) + vault_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Oracle Cloud Infrastructure `vault`__. This parameter and `secretId` are required for Customer Managed Keys. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/KeyManagement/Concepts/keyoverview.htm#concepts", + ) + version_preference: Optional[str] = Field( + None, + description="The next maintenance version preference. Allowed values for this property are: \"NEXT_RELEASE_UPDATE\", \"LATEST_RELEASE_UPDATE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + vm_failover_reservation: Optional[int] = Field( + None, + description="The percentage of CPUs reserved across nodes to support node failover. Allowed values are 0%, 25%, and 50%, with 50% being the default option.", + ) + + +def map_autonomouscontainerdatabasesummary( + o: oci.database.models.AutonomousContainerDatabaseSummary, +) -> AutonomousContainerDatabaseSummary | None: + """Map oci.database.models.AutonomousContainerDatabaseSummary → AutonomousContainerDatabaseSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousContainerDatabaseSummary(**data) + except Exception: + return AutonomousContainerDatabaseSummary( + associated_backup_configuration_details=getattr( + o, "associated_backup_configuration_details", None + ), + autonomous_exadata_infrastructure_id=getattr( + o, "autonomous_exadata_infrastructure_id", None + ), + autonomous_vm_cluster_id=getattr(o, "autonomous_vm_cluster_id", None), + availability_domain=getattr(o, "availability_domain", None), + available_cpus=getattr(o, "available_cpus", None), + backup_config=getattr(o, "backup_config", None), + backup_destination_properties_list=getattr( + o, "backup_destination_properties_list", None + ), + cloud_autonomous_vm_cluster_id=getattr( + o, "cloud_autonomous_vm_cluster_id", None + ), + compartment_id=getattr(o, "compartment_id", None), + compute_model=getattr(o, "compute_model", None), + db_name=getattr(o, "db_name", None), + db_split_threshold=getattr(o, "db_split_threshold", None), + db_unique_name=getattr(o, "db_unique_name", None), + db_version=getattr(o, "db_version", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + distribution_affinity=getattr(o, "distribution_affinity", None), + dst_file_version=getattr(o, "dst_file_version", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + infrastructure_type=getattr(o, "infrastructure_type", None), + is_dst_file_update_enabled=getattr(o, "is_dst_file_update_enabled", None), + key_history_entry=getattr(o, "key_history_entry", None), + key_store_id=getattr(o, "key_store_id", None), + key_store_wallet_name=getattr(o, "key_store_wallet_name", None), + kms_key_id=getattr(o, "kms_key_id", None), + kms_key_version_id=getattr(o, "kms_key_version_id", None), + largest_provisionable_autonomous_database_in_cpus=getattr( + o, "largest_provisionable_autonomous_database_in_cpus", None + ), + last_maintenance_run_id=getattr(o, "last_maintenance_run_id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + list_one_off_patches=getattr(o, "list_one_off_patches", None), + maintenance_window=getattr(o, "maintenance_window", None), + memory_per_oracle_compute_unit_in_gbs=getattr( + o, "memory_per_oracle_compute_unit_in_gbs", None + ), + net_services_architecture=getattr(o, "net_services_architecture", None), + next_maintenance_run_id=getattr(o, "next_maintenance_run_id", None), + patch_id=getattr(o, "patch_id", None), + patch_model=getattr(o, "patch_model", None), + provisionable_cpus=getattr(o, "provisionable_cpus", None), + provisioned_cpus=getattr(o, "provisioned_cpus", None), + reclaimable_cpus=getattr(o, "reclaimable_cpus", None), + recovery_appliance_details=getattr(o, "recovery_appliance_details", None), + reserved_cpus=getattr(o, "reserved_cpus", None), + role=getattr(o, "role", None), + service_level_agreement_type=getattr( + o, "service_level_agreement_type", None + ), + standby_maintenance_buffer_in_days=getattr( + o, "standby_maintenance_buffer_in_days", None + ), + time_created=getattr(o, "time_created", None), + time_of_last_backup=getattr(o, "time_of_last_backup", None), + time_snapshot_standby_revert=getattr( + o, "time_snapshot_standby_revert", None + ), + total_cpus=getattr(o, "total_cpus", None), + vault_id=getattr(o, "vault_id", None), + version_preference=getattr(o, "version_preference", None), + vm_failover_reservation=getattr(o, "vm_failover_reservation", None), + ) + + +class AutonomousDatabaseBackupSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousDatabaseBackupSummary.""" + + autonomous_database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the autonomous_database_id of this AutonomousDatabaseBackupSummary. The `OCID`__ of the Autonomous Database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + backup_destination_details: Optional[dict] = Field(None, description="") + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this AutonomousDatabaseBackupSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + database_size_in_tbs: Optional[float] = Field( + None, + description="The size of the database in terabytes at the time the backup was taken.", + ) + db_version: Optional[str] = Field( + None, description="A valid Oracle Database version for Autonomous Database." + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this AutonomousDatabaseBackupSummary. The user-friendly name for the backup. The name does not have to be unique.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this AutonomousDatabaseBackupSummary. The `OCID`__ of the Autonomous Database backup. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_automatic: Optional[bool] = Field( + None, + description="**[Required]** Gets the is_automatic of this AutonomousDatabaseBackupSummary. Indicates whether the backup is user-initiated or automatic.", + ) + is_restorable: Optional[bool] = Field( + None, + description="Indicates whether the backup can be used to restore the associated Autonomous Database.", + ) + key_store_id: Optional[str] = Field( + None, + description="The `OCID`__ of the key store of Oracle Vault. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + key_store_wallet_name: Optional[str] = Field( + None, description="The wallet name for Oracle Key Vault." + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + kms_key_version_id: Optional[str] = Field( + None, + description="The OCID of the key container version that is used in database transparent data encryption (TDE) operations KMS Key can have multiple key versions. If none is specified, the current key version (latest) of the Key Id is used for the operation. Autonomous Database Serverless does not use key versions, hence is not applicable for Autonomous Database Serverless instances.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this AutonomousDatabaseBackupSummary. The current state of the backup. Allowed values for this property are: "CREATING", "ACTIVE", "DELETING", "DELETED", "FAILED", "UPDATING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + retention_period_in_days: Optional[int] = Field( + None, description="Retention period, in days, for long-term backups" + ) + size_in_tbs: Optional[float] = Field( + None, description="The backup size in terrabytes (TB)." + ) + time_available_till: Optional[datetime] = Field( + None, description="Timestamp until when the backup will be available" + ) + time_ended: Optional[datetime] = Field( + None, description="The date and time the backup completed." + ) + time_started: Optional[datetime] = Field( + None, description="The date and time the backup started." + ) + type: Optional[str] = Field( + None, + description='**[Required]** Gets the type of this AutonomousDatabaseBackupSummary. The type of backup. Allowed values for this property are: "INCREMENTAL", "FULL", "LONGTERM", "VIRTUAL_FULL", "CUMULATIVE_INCREMENTAL", "ROLL_FORWARD_IMAGE_COPY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + vault_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Oracle Cloud Infrastructure `vault`__. This parameter and `secretId` are required for Customer Managed Keys. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/KeyManagement/Concepts/keyoverview.htm#concepts", + ) + + +def map_autonomousdatabasebackupsummary( + o: oci.database.models.AutonomousDatabaseBackupSummary, +) -> AutonomousDatabaseBackupSummary | None: + """Map oci.database.models.AutonomousDatabaseBackupSummary → AutonomousDatabaseBackupSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousDatabaseBackupSummary(**data) + except Exception: + return AutonomousDatabaseBackupSummary( + autonomous_database_id=getattr(o, "autonomous_database_id", None), + backup_destination_details=getattr(o, "backup_destination_details", None), + compartment_id=getattr(o, "compartment_id", None), + database_size_in_tbs=getattr(o, "database_size_in_tbs", None), + db_version=getattr(o, "db_version", None), + display_name=getattr(o, "display_name", None), + id=getattr(o, "id", None), + is_automatic=getattr(o, "is_automatic", None), + is_restorable=getattr(o, "is_restorable", None), + key_store_id=getattr(o, "key_store_id", None), + key_store_wallet_name=getattr(o, "key_store_wallet_name", None), + kms_key_id=getattr(o, "kms_key_id", None), + kms_key_version_id=getattr(o, "kms_key_version_id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + retention_period_in_days=getattr(o, "retention_period_in_days", None), + size_in_tbs=getattr(o, "size_in_tbs", None), + time_available_till=getattr(o, "time_available_till", None), + time_ended=getattr(o, "time_ended", None), + time_started=getattr(o, "time_started", None), + type=getattr(o, "type", None), + vault_id=getattr(o, "vault_id", None), + ) + + +class AutonomousDatabaseCharacterSets(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousDatabaseCharacterSets.""" + + name: Optional[str] = Field(None, description="A valid Oracle character set.") + + +def map_autonomousdatabasecharactersets( + o: oci.database.models.AutonomousDatabaseCharacterSets, +) -> AutonomousDatabaseCharacterSets | None: + """Map oci.database.models.AutonomousDatabaseCharacterSets → AutonomousDatabaseCharacterSets Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousDatabaseCharacterSets(**data) + except Exception: + return AutonomousDatabaseCharacterSets( + name=getattr(o, "name", None), + ) + + +class AutonomousDatabaseSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousDatabaseSummary.""" + + actual_used_data_storage_size_in_tbs: Optional[float] = Field( + None, + description="The current amount of storage in use for user and system data, in terabytes (TB).", + ) + allocated_storage_size_in_tbs: Optional[float] = Field( + None, + description="The amount of storage currently allocated for the database tables and billed for, rounded up. When auto-scaling is not enabled, this value is equal to the `dataStorageSizeInTBs` value. You can compare this value to the `actualUsedDataStorageSizeInTBs` value to determine if a manual shrink operation is appropriate for your allocated storage. **Note:** Auto-scaling does not automatically decrease allocated storage when data is deleted from the database.", + ) + apex_details: Optional[dict] = Field( + None, description="Information about Oracle APEX Application Development." + ) + are_primary_whitelisted_ips_used: Optional[bool] = Field( + None, + description="This field will be null if the Autonomous Database is not Data Guard enabled or Access Control is disabled. It's value would be `TRUE` if Autonomous Database is Data Guard enabled and Access Control is enabled and if the Autonomous Database uses primary IP access control list (ACL) for standby. It's value would be `FALSE` if Autonomous Database is Data Guard enabled and Access Control is enabled and if the Autonomous Database uses different IP access control list (ACL) for standby compared to primary.", + ) + auto_refresh_frequency_in_seconds: Optional[int] = Field( + None, + description="The frequency a refreshable clone is refreshed after auto-refresh is enabled. The minimum is 1 hour. The maximum is 7 days. The date and time that auto-refresh is enabled is controlled by the `timeOfAutoRefreshStart` parameter.", + ) + auto_refresh_point_lag_in_seconds: Optional[int] = Field( + None, + description="The time, in seconds, the data of the refreshable clone lags the primary database at the point of refresh. The minimum is 0 minutes (0 mins means refresh to the latest available timestamp). The maximum is 7 days. The lag time increases after refreshing until the next data refresh happens.", + ) + autonomous_container_database_id: Optional[str] = Field( + None, + description="The Autonomous Container Database `OCID`__. Used only by Autonomous Database on Dedicated Exadata Infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + autonomous_maintenance_schedule_type: Optional[str] = Field( + None, + description="The maintenance schedule type of the Autonomous Database Serverless. An EARLY maintenance schedule follows a schedule applying patches prior to the REGULAR schedule. A REGULAR maintenance schedule follows the normal cycle Allowed values for this property are: \"EARLY\", \"REGULAR\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + availability_domain: Optional[str] = Field( + None, + description="The availability domain where the Autonomous Database Serverless instance is located.", + ) + available_upgrade_versions: Optional[str] = Field( + None, + description="List of Oracle Database versions available for a database upgrade. If there are no version upgrades available, this list is empty.", + ) + backup_config: Optional[dict] = Field(None, description="") + backup_retention_period_in_days: Optional[int] = Field( + None, description="Retention period, in days, for long-term backups" + ) + byol_compute_count_limit: Optional[float] = Field( + None, + description="The maximum number of CPUs allowed with a Bring Your Own License (BYOL), including those used for auto-scaling, disaster recovery, tools, etc. Any CPU usage above this limit is considered as License Included and billed.", + ) + character_set: Optional[str] = Field( + None, + description="The character set for the autonomous database. The default is AL32UTF8. Allowed values are: AL32UTF8, AR8ADOS710, AR8ADOS720, AR8APTEC715, AR8ARABICMACS, AR8ASMO8X, AR8ISO8859P6, AR8MSWIN1256, AR8MUSSAD768, AR8NAFITHA711, AR8NAFITHA721, AR8SAKHR706, AR8SAKHR707, AZ8ISO8859P9E, BG8MSWIN, BG8PC437S, BLT8CP921, BLT8ISO8859P13, BLT8MSWIN1257, BLT8PC775, BN8BSCII, CDN8PC863, CEL8ISO8859P14, CL8ISO8859P5, CL8ISOIR111, CL8KOI8R, CL8KOI8U, CL8MACCYRILLICS, CL8MSWIN1251, EE8ISO8859P2, EE8MACCES, EE8MACCROATIANS, EE8MSWIN1250, EE8PC852, EL8DEC, EL8ISO8859P7, EL8MACGREEKS, EL8MSWIN1253, EL8PC437S, EL8PC851, EL8PC869, ET8MSWIN923, HU8ABMOD, HU8CWI2, IN8ISCII, IS8PC861, IW8ISO8859P8, IW8MACHEBREWS, IW8MSWIN1255, IW8PC1507, JA16EUC, JA16EUCTILDE, JA16SJIS, JA16SJISTILDE, JA16VMS, KO16KSC5601, KO16KSCCS, KO16MSWIN949, LA8ISO6937, LA8PASSPORT, LT8MSWIN921, LT8PC772, LT8PC774, LV8PC1117, LV8PC8LR, LV8RST104090, N8PC865, NE8ISO8859P10, NEE8ISO8859P4, RU8BESTA, RU8PC855, RU8PC866, SE8ISO8859P3, TH8MACTHAIS, TH8TISASCII, TR8DEC, TR8MACTURKISHS, TR8MSWIN1254, TR8PC857, US7ASCII, US8PC437, UTF8, VN8MSWIN1258, VN8VN3, WE8DEC, WE8DG, WE8ISO8859P1, WE8ISO8859P15, WE8ISO8859P9, WE8MACROMAN8S, WE8MSWIN1252, WE8NCR4970, WE8NEXTSTEP, WE8PC850, WE8PC858, WE8PC860, WE8ROMAN8, ZHS16CGB231280, ZHS16GBK, ZHT16BIG5, ZHT16CCDC, ZHT16DBT, ZHT16HKSCS, ZHT16MSWIN950, ZHT32EUC, ZHT32SOPS, ZHT32TRIS", + ) + clone_table_space_list: Optional[int] = Field( + None, + description="A list of the source Autonomous Database's table space number(s) used to create this partial clone from the backup.", + ) + cluster_placement_group_id: Optional[str] = Field( + None, + description="The `OCID`__ of the cluster placement group of the Autonomous Serverless Database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this AutonomousDatabaseSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compute_count: Optional[float] = Field( + None, + description="The compute amount (CPUs) available to the database. Minimum and maximum values depend on the compute model and whether the database is an Autonomous Database Serverless instance or an Autonomous Database on Dedicated Exadata Infrastructure. The 'ECPU' compute model requires a minimum value of one, for databases in the elastic resource pool and minimum value of two, otherwise. Required when using the `computeModel` parameter. When using `cpuCoreCount` parameter, it is an error to specify computeCount to a non-null value. Providing `computeModel` and `computeCount` is the preferred method for both OCPU and ECPU.", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous Database. This is required if using the `computeCount` parameter. If using `cpuCoreCount` then it is an error to specify `computeModel` to a non-null value. ECPU compute model is the recommended model and OCPU compute model is legacy. Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + connection_strings: Optional[str] = Field( + None, + description="The connection string used to connect to the Autonomous Database. The username for the Service Console is ADMIN. Use the password you entered when creating the Autonomous Database for the password value.", + ) + connection_urls: Optional[dict] = Field(None, description="") + cpu_core_count: Optional[int] = Field( + None, + description="The number of CPU cores to be made available to the database. When the ECPU is selected, the value for cpuCoreCount is 0. For Autonomous Database on Dedicated Exadata infrastructure, the maximum number of cores is determined by the infrastructure shape. See `Characteristics of Infrastructure Shapes`__ for shape details. **Note:** This parameter cannot be used with the `ocpuCount` parameter. __ https://www.oracle.com/pls/topic/lookup?ctx=en/cloud/paas/autonomous-database&id=ATPFG-GUID-B0F033C1-CC5A-42F0-B2E7-3CECFEDA1FD1", + ) + customer_contacts: Optional[list[str]] = Field( + None, description="Customer Contacts." + ) + data_safe_status: Optional[str] = Field( + None, + description='Status of the Data Safe registration for this Autonomous Database. Allowed values for this property are: "REGISTERING", "REGISTERED", "DEREGISTERING", "NOT_REGISTERED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + data_storage_size_in_gbs: Optional[int] = Field( + None, + description="The quantity of data in the database, in gigabytes. For Autonomous Transaction Processing databases using ECPUs on Serverless Infrastructure, this value is always populated. In all the other cases, this value will be null and `dataStorageSizeInTBs` will be populated instead.", + ) + data_storage_size_in_tbs: Optional[int] = Field( + None, + description="**[Required]** Gets the data_storage_size_in_tbs of this AutonomousDatabaseSummary. The quantity of data in the database, in terabytes. The following points apply to Autonomous Databases on Serverless Infrastructure: - This is an integer field whose value remains null when the data size is in GBs and cannot be converted to TBs (by dividing the GB value by 1024) without rounding error. - To get the exact value of data storage size without rounding error, please see `dataStorageSizeInGBs` of Autonomous Database.", + ) + database_edition: Optional[str] = Field( + None, + description="The Oracle Database Edition that applies to the Autonomous databases. Allowed values for this property are: \"STANDARD_EDITION\", \"ENTERPRISE_EDITION\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + database_management_status: Optional[str] = Field( + None, + description='Status of Database Management for this Autonomous Database. Allowed values for this property are: "ENABLING", "ENABLED", "DISABLING", "NOT_ENABLED", "FAILED_ENABLING", "FAILED_DISABLING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + dataguard_region_type: Optional[str] = Field( + None, + description="**Deprecated.** The Autonomous Data Guard region type of the Autonomous Database. For Autonomous Database Serverless, Autonomous Data Guard associations have designated primary and standby regions, and these region types do not change when the database changes roles. The standby regions in Autonomous Data Guard associations can be the same region designated as the primary region, or they can be remote regions. Certain database administrative operations may be available only in the primary region of the Autonomous Data Guard association, and cannot be performed when the database using the primary role is operating in a remote Autonomous Data Guard standby region. Allowed values for this property are: \"PRIMARY_DG_REGION\", \"REMOTE_STANDBY_DG_REGION\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + db_name: Optional[str] = Field( + None, + description="**[Required]** Gets the db_name of this AutonomousDatabaseSummary. The database name.", + ) + db_tools_details: Optional[list[dict]] = Field( + None, + description="The list of database tools details. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, whitelistedIps, isMTLSConnectionRequired, openMode, permissionLevel, dbWorkload, privateEndpointLabel, nsgIds, dbVersion, isRefreshable, dbName, scheduledOperations, isLocalDataGuardEnabled, or isFreeTier.", + ) + db_version: Optional[str] = Field( + None, description="A valid Oracle Database version for Autonomous Database." + ) + db_workload: Optional[str] = Field( + None, + description='The Autonomous Database workload type. The following values are valid: - OLTP - indicates an Autonomous Transaction Processing database - DW - indicates an Autonomous Data Warehouse database - AJD - indicates an Autonomous JSON Database - APEX - indicates an Autonomous Database with the Oracle APEX Application Development workload type. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, isMTLSConnectionRequired, privateEndpointLabel, nsgIds, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier. Allowed values for this property are: "OLTP", "DW", "AJD", "APEX", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + disaster_recovery_region_type: Optional[str] = Field( + None, + description="**Deprecated.** The disaster recovery (DR) region type of the Autonomous Database. For Autonomous Database Serverless instances, DR associations have designated primary and standby regions. These region types do not change when the database changes roles. The standby region in DR associations can be the same region as the primary region, or they can be in a remote regions. Some database administration operations may be available only in the primary region of the DR association, and cannot be performed when the database using the primary role is operating in a remote region. Allowed values for this property are: \"PRIMARY\", \"REMOTE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + display_name: Optional[str] = Field( + None, + description="The user-friendly name for the Autonomous Database. The name does not have to be unique.", + ) + encryption_key: Optional[dict] = Field(None, description="") + encryption_key_history_entry: Optional[list[dict]] = Field( + None, description="Key History Entry." + ) + failed_data_recovery_in_seconds: Optional[int] = Field( + None, + description="Indicates the number of seconds of data loss for a Data Guard failover.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this AutonomousDatabaseSummary. The `OCID`__ of the Autonomous Database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + in_memory_area_in_gbs: Optional[int] = Field( + None, + description="The area assigned to In-Memory tables in Autonomous Database.", + ) + in_memory_percentage: Optional[int] = Field( + None, + description="The percentage of the System Global Area(SGA) assigned to In-Memory tables in Autonomous Database. This property is applicable only to Autonomous Databases on the Exadata Cloud@Customer platform.", + ) + infrastructure_type: Optional[str] = Field( + None, + description="The infrastructure type this resource belongs to. Allowed values for this property are: \"CLOUD\", \"CLOUD_AT_CUSTOMER\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + is_access_control_enabled: Optional[bool] = Field( + None, + description="Indicates if the database-level access control is enabled. If disabled, database access is defined by the network security rules. If enabled, database access is restricted to the IP addresses defined by the rules specified with the `whitelistedIps` property. While specifying `whitelistedIps` rules is optional, if database-level access control is enabled and no rules are specified, the database will become inaccessible. The rules can be added later using the `UpdateAutonomousDatabase` API operation or edit option in console. When creating a database clone, the desired access control setting should be specified. By default, database-level access control will be disabled for the clone. This property is applicable only to Autonomous Databases on the Exadata Cloud@Customer platform. For Autonomous Database Serverless instances, `whitelistedIps` is used.", + ) + is_auto_scaling_enabled: Optional[bool] = Field( + None, + description="Indicates if auto scaling is enabled for the Autonomous Database CPU core count. The default value is `TRUE`.", + ) + is_auto_scaling_for_storage_enabled: Optional[bool] = Field( + None, + description="Indicates if auto scaling is enabled for the Autonomous Database storage. The default value is `FALSE`.", + ) + is_backup_retention_locked: Optional[bool] = Field( + None, + description="Indicates if the Autonomous Database is backup retention locked.", + ) + is_data_guard_enabled: Optional[bool] = Field( + None, + description="**Deprecated.** Indicates whether the Autonomous Database has local (in-region) Data Guard enabled. Not applicable to cross-region Autonomous Data Guard associations, or to Autonomous Databases using dedicated Exadata infrastructure or Exadata Cloud@Customer infrastructure.", + ) + is_dedicated: Optional[bool] = Field( + None, + description="True if the database uses `dedicated Exadata infrastructure`__. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/index.html", + ) + is_dev_tier: Optional[bool] = Field( + None, + description="Autonomous Database for Developers are fixed-shape Autonomous Databases that developers can use to build and test new applications. On Serverless, these are low-cost and billed per instance, on Dedicated and Cloud@Customer there is no additional cost to create Developer databases. Developer databases come with limited resources and is not intended for large-scale testing and production deployments. When you need more compute or storage resources, you may upgrade to a full paid production database.", + ) + is_free_tier: Optional[bool] = Field( + None, + description="Indicates if this is an Always Free resource. The default value is false. Note that Always Free Autonomous Databases have 1 CPU and 20GB of memory. For Always Free databases, memory and CPU cannot be scaled. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, isMTLSConnectionRequired, openMode, permissionLevel, privateEndpointLabel, nsgIds, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, or isLocalDataGuardEnabled", + ) + is_local_data_guard_enabled: Optional[bool] = Field( + None, + description="Indicates whether the Autonomous Database has local (in-region) Data Guard enabled. Not applicable to cross-region Autonomous Data Guard associations, or to Autonomous Databases using dedicated Exadata infrastructure or Exadata Cloud@Customer infrastructure.", + ) + is_mtls_connection_required: Optional[bool] = Field( + None, + description="Specifies if the Autonomous Database requires mTLS connections. This may not be updated in parallel with any of the following: licenseModel, databaseEdition, cpuCoreCount, computeCount, dataStorageSizeInTBs, whitelistedIps, openMode, permissionLevel, db-workload, privateEndpointLabel, nsgIds, customerContacts, dbVersion, scheduledOperations, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier. Service Change: The default value of the isMTLSConnectionRequired attribute will change from true to false on July 1, 2023 in the following APIs: - CreateAutonomousDatabase - GetAutonomousDatabase - UpdateAutonomousDatabase Details: Prior to the July 1, 2023 change, the isMTLSConnectionRequired attribute default value was true. This applies to Autonomous Database Serverless. Does this impact me? If you use or maintain custom scripts or Terraform scripts referencing the CreateAutonomousDatabase, GetAutonomousDatabase, or UpdateAutonomousDatabase APIs, you want to check, and possibly modify, the scripts for the changed default value of the attribute. Should you choose not to leave your scripts unchanged, the API calls containing this attribute will continue to work, but the default value will switch from true to false. How do I make this change? Using either OCI SDKs or command line tools, update your custom scripts to explicitly set the isMTLSConnectionRequired attribute to true.", + ) + is_preview: Optional[bool] = Field( + None, + description="Indicates if the Autonomous Database version is a preview version.", + ) + is_reconnect_clone_enabled: Optional[bool] = Field( + None, + description="Indicates if the refreshable clone can be reconnected to its source database.", + ) + is_refreshable_clone: Optional[bool] = Field( + None, + description="Indicates if the Autonomous Database is a refreshable clone. This cannot be updated in parallel with any of the following: cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, openMode, permissionLevel, dbWorkload, privateEndpointLabel, nsgIds, dbVersion, dbName, scheduledOperations, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier.", + ) + is_remote_data_guard_enabled: Optional[bool] = Field( + None, + description="Indicates whether the Autonomous Database has Cross Region Data Guard enabled. Not applicable to Autonomous Databases using dedicated Exadata infrastructure or Exadata Cloud@Customer infrastructure.", + ) + key_history_entry: Optional[list[dict]] = Field( + None, description="Key History Entry." + ) + key_store_id: Optional[str] = Field( + None, + description="The `OCID`__ of the key store of Oracle Vault. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + key_store_wallet_name: Optional[str] = Field( + None, description="The wallet name for Oracle Key Vault." + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + kms_key_lifecycle_details: Optional[str] = Field( + None, description="KMS key lifecycle details." + ) + kms_key_version_id: Optional[str] = Field( + None, + description="The OCID of the key container version that is used in database transparent data encryption (TDE) operations KMS Key can have multiple key versions. If none is specified, the current key version (latest) of the Key Id is used for the operation. Autonomous Database Serverless does not use key versions, hence is not applicable for Autonomous Database Serverless instances.", + ) + license_model: Optional[str] = Field( + None, + description="The Oracle license model that applies to the Oracle Autonomous Database. Bring your own license (BYOL) allows you to apply your current on-premises Oracle software licenses to equivalent, highly automated Oracle services in the cloud. License Included allows you to subscribe to new Oracle Database software licenses and the Oracle Database service. Note that when provisioning an `Autonomous Database on dedicated Exadata infrastructure`__, this attribute must be null. It is already set at the Autonomous Exadata Infrastructure level. When provisioning an `Autonomous Database Serverless]`__ database, if a value is not specified, the system defaults the value to `BRING_YOUR_OWN_LICENSE`. Bring your own license (BYOL) also allows you to select the DB edition using the optional parameter. This cannot be updated in parallel with any of the following: cpuCoreCount, computeCount, dataStorageSizeInTBs, adminPassword, isMTLSConnectionRequired, dbWorkload, privateEndpointLabel, nsgIds, dbVersion, dbName, scheduledOperations, dbToolsDetails, or isFreeTier. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/index.html __ https://docs.oracle.com/en/cloud/paas/autonomous-database/index.html Allowed values for this property are: \"LICENSE_INCLUDED\", \"BRING_YOUR_OWN_LICENSE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this AutonomousDatabaseSummary. The current state of the Autonomous Database. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "STOPPING", "STOPPED", "STARTING", "TERMINATING", "TERMINATED", "UNAVAILABLE", "RESTORE_IN_PROGRESS", "RESTORE_FAILED", "BACKUP_IN_PROGRESS", "SCALE_IN_PROGRESS", "AVAILABLE_NEEDS_ATTENTION", "UPDATING", "MAINTENANCE_IN_PROGRESS", "RESTARTING", "RECREATING", "ROLE_CHANGE_IN_PROGRESS", "UPGRADING", "INACCESSIBLE", "STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + local_adg_auto_failover_max_data_loss_limit: Optional[int] = Field( + None, + description="Parameter that allows users to select an acceptable maximum data loss limit in seconds, up to which Automatic Failover will be triggered when necessary for a Local Autonomous Data Guard", + ) + local_disaster_recovery_type: Optional[str] = Field( + None, + description="Indicates the local disaster recovery (DR) type of the Autonomous Database Serverless instance. Autonomous Data Guard (ADG) DR type provides business critical DR with a faster recovery time objective (RTO) during failover or switchover. Backup-based DR type provides lower cost DR with a slower RTO during failover or switchover.", + ) + local_standby_db: Optional[dict] = Field(None, description="") + long_term_backup_schedule: Optional[int] = Field(None, description="") + memory_per_oracle_compute_unit_in_gbs: Optional[int] = Field( + None, description="The amount of memory (in GBs) enabled per ECPU or OCPU." + ) + ncharacter_set: Optional[str] = Field( + None, + description="The national character set for the autonomous database. The default is AL16UTF16. Allowed values are: AL16UTF16 or UTF8.", + ) + net_services_architecture: Optional[str] = Field( + None, + description="Enabling SHARED server architecture enables a database server to allow many client processes to share very few server processes, thereby increasing the number of supported users. Allowed values for this property are: \"DEDICATED\", \"SHARED\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + next_long_term_backup_time_stamp: Optional[datetime] = Field( + None, + description="The date and time when the next long-term backup would be created.", + ) + nsg_ids: Optional[str] = Field( + None, + description="The list of `OCIDs`__ for the network security groups (NSGs) to which this resource belongs. Setting this to an empty list removes all resources from all NSGs. For more information about NSGs, see `Security Rules`__. **NsgIds restrictions:** - A network security group (NSG) is optional for Autonomous Databases with private access. The nsgIds list can be empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/Network/Concepts/securityrules.htm", + ) + ocpu_count: Optional[float] = Field( + None, + description="The number of OCPU cores to be made available to the database. The following points apply: - For Autonomous Databases on Dedicated Exadata Infrastructure, to provision less than 1 core, enter a fractional value in an increment of 0.1. For example, you can provision 0.3 or 0.4 cores, but not 0.35 cores. (Note that fractional OCPU values are not supported for Autonomous Database Serverless instances.) - To provision cores, enter an integer between 1 and the maximum number of cores available for the infrastructure shape. For example, you can provision 2 cores or 3 cores, but not 2.5 cores. This applies to Autonomous Databases on both serverless and dedicated Exadata infrastructure. - For Autonomous Database Serverless instances, this parameter is not used. For Autonomous Databases on Dedicated Exadata Infrastructure, the maximum number of cores is determined by the infrastructure shape. See `Characteristics of Infrastructure Shapes`__ for shape details. **Note:** This parameter cannot be used with the `cpuCoreCount` parameter. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbde/index.html", + ) + open_mode: Optional[str] = Field( + None, + description="Indicates the Autonomous Database mode. The database can be opened in `READ_ONLY` or `READ_WRITE` mode. This cannot be updated in parallel with any of the following: cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, isMTLSConnectionRequired, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, or isFreeTier. Allowed values for this property are: \"READ_ONLY\", \"READ_WRITE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + operations_insights_status: Optional[str] = Field( + None, + description='Status of Operations Insights for this Autonomous Database. Allowed values for this property are: "ENABLING", "ENABLED", "DISABLING", "NOT_ENABLED", "FAILED_ENABLING", "FAILED_DISABLING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + peer_db_ids: Optional[str] = Field( + None, + description="The list of `OCIDs`__ of standby databases located in Autonomous Data Guard remote regions that are associated with the source database. Note that for Autonomous Database Serverless instances, standby databases located in the same region as the source primary database do not have OCIDs. __ https://docs.oracle.com/iaas/Content/General/Concepts/identifiers.htm", + ) + permission_level: Optional[str] = Field( + None, + description="The Autonomous Database permission level. Restricted mode allows access only by admin users. This cannot be updated in parallel with any of the following: cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, isMTLSConnectionRequired, nsgIds, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, or isFreeTier. Allowed values for this property are: \"RESTRICTED\", \"UNRESTRICTED\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + private_endpoint: Optional[str] = Field( + None, description="The private endpoint for the resource." + ) + private_endpoint_ip: Optional[str] = Field( + None, description="The private endpoint Ip address for the resource." + ) + private_endpoint_label: Optional[str] = Field( + None, + description="The resource's private endpoint label. - Setting the endpoint label to a non-empty string creates a private endpoint database. - Resetting the endpoint label to an empty string, after the creation of the private endpoint database, changes the private endpoint database to a public endpoint database. - Setting the endpoint label to a non-empty string value, updates to a new private endpoint database, when the database is disabled and re-enabled. This setting cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, isMTLSConnectionRequired, dbWorkload, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, or isFreeTier.", + ) + provisionable_cpus: Optional[float] = Field( + None, + description="An array of CPU values that an Autonomous Database can be scaled to.", + ) + public_connection_urls: Optional[dict] = Field( + None, + description="The Public URLs of Private Endpoint database for accessing Oracle Application Express (APEX) and SQL Developer Web with a browser from a Compute instance within your VCN or that has a direct connection to your VCN.", + ) + public_endpoint: Optional[str] = Field( + None, + description="The public endpoint for the private endpoint enabled resource.", + ) + refreshable_mode: Optional[str] = Field( + None, + description="The refresh mode of the clone. AUTOMATIC indicates that the clone is automatically being refreshed with data from the source Autonomous Database. Allowed values for this property are: \"AUTOMATIC\", \"MANUAL\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + refreshable_status: Optional[str] = Field( + None, + description="The refresh status of the clone. REFRESHING indicates that the clone is currently being refreshed with data from the source Autonomous Database. Allowed values for this property are: \"REFRESHING\", \"NOT_REFRESHING\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + remote_disaster_recovery_configuration: Optional[dict] = Field(None, description="") + resource_pool_leader_id: Optional[str] = Field( + None, + description="The unique identifier for leader autonomous database OCID `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + resource_pool_summary: Optional[dict] = Field(None, description="") + role: Optional[str] = Field( + None, + description='The Data Guard role of the Autonomous Container Database or Autonomous Database, if Autonomous Data Guard is enabled. Allowed values for this property are: "PRIMARY", "STANDBY", "DISABLED_STANDBY", "BACKUP_COPY", "SNAPSHOT_STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + scheduled_operations: Optional[list[dict]] = Field( + None, + description="The list of scheduled operations. Consists of values such as dayOfWeek, scheduledStartTime, scheduledStopTime. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, whitelistedIps, isMTLSConnectionRequired, openMode, permissionLevel, dbWorkload, privateEndpointLabel, nsgIds, dbVersion, isRefreshable, dbName, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier.", + ) + security_attributes: Optional[str] = Field( + None, + description='Security Attributes for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. Example: `{"Oracle-ZPR": {"MaxEgressCount": {"value": "42", "mode": "audit"}}}` __ https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm', + ) + service_console_url: Optional[str] = Field( + None, description="The URL of the Service Console for the Autonomous Database." + ) + source_id: Optional[str] = Field( + None, + description="The `OCID`__ of the source Autonomous Database that was cloned to create the current Autonomous Database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + standby_db: Optional[dict] = Field( + None, + description="**Deprecated** Autonomous Data Guard standby database details.", + ) + standby_whitelisted_ips: Optional[str] = Field( + None, + description='The client IP access control list (ACL). This feature is available for `Autonomous Database Serverless]`__ and on Exadata Cloud@Customer. Only clients connecting from an IP address included in the ACL may access the Autonomous Database instance. If `arePrimaryWhitelistedIpsUsed` is \'TRUE\' then Autonomous Database uses this primary\'s IP access control list (ACL) for the disaster recovery peer called `standbywhitelistedips`. For Autonomous Database Serverless, this is an array of CIDR (classless inter-domain routing) notations for a subnet or VCN OCID (virtual cloud network Oracle Cloud ID). Multiple IPs and VCN OCIDs should be separate strings separated by commas, but if it’s other configurations that need multiple pieces of information then its each piece is connected with semicolon (;) as a delimiter. Example: `["1.1.1.1","1.1.1.0/24","ocid1.vcn.oc1.sea.","ocid1.vcn.oc1.sea.;1.1.1.1","ocid1.vcn.oc1.sea.;1.1.0.0/16"]` For Exadata Cloud@Customer, this is an array of IP addresses or CIDR notations. Example: `["1.1.1.1","1.1.1.0/24","1.1.2.25"]` For an update operation, if you want to delete all the IPs in the ACL, use an array with a single empty string entry. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, adminPassword, isMTLSConnectionRequired, openMode, permissionLevel, dbWorkload, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/index.html', + ) + subnet_id: Optional[str] = Field( + None, + description="The `OCID`__ of the subnet the resource is associated with. **Subnet Restrictions:** - For bare metal DB systems and for single node virtual machine DB systems, do not use a subnet that overlaps with 192.168.16.16/28. - For Exadata and virtual machine 2-node RAC systems, do not use a subnet that overlaps with 192.168.128.0/20. - For Autonomous Database, setting this will disable public secure access to the database. These subnets are used by the Oracle Clusterware private interconnect on the database instance. Specifying an overlapping subnet will cause the private interconnect to malfunction. This restriction applies to both the client subnet and the backup subnet. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + subscription_id: Optional[str] = Field( + None, + description="The `OCID`__ of the subscription with which resource needs to be associated with. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + supported_regions_to_clone_to: Optional[str] = Field( + None, + description="The list of regions that support the creation of an Autonomous Database clone or an Autonomous Data Guard standby database.", + ) + system_tags: Optional[str] = Field( + None, + description="System tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the Autonomous Database was created." + ) + time_data_guard_role_changed: Optional[datetime] = Field( + None, + description='The date and time the Autonomous Data Guard role was switched for the Autonomous Database. For databases that have standbys in both the primary Data Guard region and a remote Data Guard standby region, this is the latest timestamp of either the database using the "primary" role in the primary Data Guard region, or database located in the remote Data Guard standby region.', + ) + time_deletion_of_free_autonomous_database: Optional[datetime] = Field( + None, + description="The date and time the Always Free database will be automatically deleted because of inactivity. If the database is in the STOPPED state and without activity until this time, it will be deleted.", + ) + time_disaster_recovery_role_changed: Optional[datetime] = Field( + None, + description="The date and time the Disaster Recovery role was switched for the standby Autonomous Database.", + ) + time_local_data_guard_enabled: Optional[datetime] = Field( + None, + description="The date and time that Autonomous Data Guard was enabled for an Autonomous Database where the standby was provisioned in the same region as the primary database.", + ) + time_maintenance_begin: Optional[datetime] = Field( + None, description="The date and time when maintenance will begin." + ) + time_maintenance_end: Optional[datetime] = Field( + None, description="The date and time when maintenance will end." + ) + time_of_auto_refresh_start: Optional[datetime] = Field( + None, + description="The the date and time that auto-refreshing will begin for an Autonomous Database refreshable clone. This value controls only the start time for the first refresh operation. Subsequent (ongoing) refresh operations have start times controlled by the value of the `autoRefreshFrequencyInSeconds` parameter.", + ) + time_of_joining_resource_pool: Optional[datetime] = Field( + None, description="The time the member joined the resource pool." + ) + time_of_last_failover: Optional[datetime] = Field( + None, description="The timestamp of the last failover operation." + ) + time_of_last_refresh: Optional[datetime] = Field( + None, description="The date and time when last refresh happened." + ) + time_of_last_refresh_point: Optional[datetime] = Field( + None, + description="The refresh point timestamp (UTC). The refresh point is the time to which the database was most recently refreshed. Data created after the refresh point is not included in the refresh.", + ) + time_of_last_switchover: Optional[datetime] = Field( + None, + description="The timestamp of the last switchover operation for the Autonomous Database.", + ) + time_of_next_refresh: Optional[datetime] = Field( + None, description="The date and time of next refresh." + ) + time_reclamation_of_free_autonomous_database: Optional[datetime] = Field( + None, + description="The date and time the Always Free database will be stopped because of inactivity. If this time is reached without any database activity, the database will automatically be put into the STOPPED state.", + ) + time_undeleted: Optional[datetime] = Field( + None, + description="The date and time the Autonomous Database was most recently undeleted.", + ) + time_until_reconnect_clone_enabled: Optional[datetime] = Field( + None, + description="The time and date as an RFC3339 formatted string, e.g., 2022-01-01T12:00:00.000Z, to set the limit for a refreshable clone to be reconnected to its source database.", + ) + total_backup_storage_size_in_gbs: Optional[float] = Field( + None, description="The backup storage to the database." + ) + used_data_storage_size_in_gbs: Optional[int] = Field( + None, description="The storage space consumed by Autonomous Database in GBs." + ) + used_data_storage_size_in_tbs: Optional[int] = Field( + None, + description="The amount of storage that has been used for Autonomous Databases in dedicated infrastructure, in terabytes.", + ) + vault_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Oracle Cloud Infrastructure `vault`__. This parameter and `secretId` are required for Customer Managed Keys. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/KeyManagement/Concepts/keyoverview.htm#concepts", + ) + whitelisted_ips: Optional[str] = Field( + None, + description='The client IP access control list (ACL). This feature is available for `Autonomous Database Serverless]`__ and on Exadata Cloud@Customer. Only clients connecting from an IP address included in the ACL may access the Autonomous Database instance. If `arePrimaryWhitelistedIpsUsed` is \'TRUE\' then Autonomous Database uses this primary\'s IP access control list (ACL) for the disaster recovery peer called `standbywhitelistedips`. For Autonomous Database Serverless, this is an array of CIDR (classless inter-domain routing) notations for a subnet or VCN OCID (virtual cloud network Oracle Cloud ID). Multiple IPs and VCN OCIDs should be separate strings separated by commas, but if it’s other configurations that need multiple pieces of information then its each piece is connected with semicolon (;) as a delimiter. Example: `["1.1.1.1","1.1.1.0/24","ocid1.vcn.oc1.sea.","ocid1.vcn.oc1.sea.;1.1.1.1","ocid1.vcn.oc1.sea.;1.1.0.0/16"]` For Exadata Cloud@Customer, this is an array of IP addresses or CIDR notations. Example: `["1.1.1.1","1.1.1.0/24","1.1.2.25"]` For an update operation, if you want to delete all the IPs in the ACL, use an array with a single empty string entry. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, adminPassword, isMTLSConnectionRequired, openMode, permissionLevel, dbWorkload, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/index.html', + ) + + +def map_autonomousdatabasesummary( + o: oci.database.models.AutonomousDatabaseSummary, +) -> AutonomousDatabaseSummary | None: + """Map oci.database.models.AutonomousDatabaseSummary → AutonomousDatabaseSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousDatabaseSummary(**data) + except Exception: + return AutonomousDatabaseSummary( + actual_used_data_storage_size_in_tbs=getattr( + o, "actual_used_data_storage_size_in_tbs", None + ), + allocated_storage_size_in_tbs=getattr( + o, "allocated_storage_size_in_tbs", None + ), + apex_details=getattr(o, "apex_details", None), + are_primary_whitelisted_ips_used=getattr( + o, "are_primary_whitelisted_ips_used", None + ), + auto_refresh_frequency_in_seconds=getattr( + o, "auto_refresh_frequency_in_seconds", None + ), + auto_refresh_point_lag_in_seconds=getattr( + o, "auto_refresh_point_lag_in_seconds", None + ), + autonomous_container_database_id=getattr( + o, "autonomous_container_database_id", None + ), + autonomous_maintenance_schedule_type=getattr( + o, "autonomous_maintenance_schedule_type", None + ), + availability_domain=getattr(o, "availability_domain", None), + available_upgrade_versions=getattr(o, "available_upgrade_versions", None), + backup_config=getattr(o, "backup_config", None), + backup_retention_period_in_days=getattr( + o, "backup_retention_period_in_days", None + ), + byol_compute_count_limit=getattr(o, "byol_compute_count_limit", None), + character_set=getattr(o, "character_set", None), + clone_table_space_list=getattr(o, "clone_table_space_list", None), + cluster_placement_group_id=getattr(o, "cluster_placement_group_id", None), + compartment_id=getattr(o, "compartment_id", None), + compute_count=getattr(o, "compute_count", None), + compute_model=getattr(o, "compute_model", None), + connection_strings=getattr(o, "connection_strings", None), + connection_urls=getattr(o, "connection_urls", None), + cpu_core_count=getattr(o, "cpu_core_count", None), + customer_contacts=getattr(o, "customer_contacts", None), + data_safe_status=getattr(o, "data_safe_status", None), + data_storage_size_in_gbs=getattr(o, "data_storage_size_in_gbs", None), + data_storage_size_in_tbs=getattr(o, "data_storage_size_in_tbs", None), + database_edition=getattr(o, "database_edition", None), + database_management_status=getattr(o, "database_management_status", None), + dataguard_region_type=getattr(o, "dataguard_region_type", None), + db_name=getattr(o, "db_name", None), + db_tools_details=getattr(o, "db_tools_details", None), + db_version=getattr(o, "db_version", None), + db_workload=getattr(o, "db_workload", None), + defined_tags=getattr(o, "defined_tags", None), + disaster_recovery_region_type=getattr( + o, "disaster_recovery_region_type", None + ), + display_name=getattr(o, "display_name", None), + encryption_key=getattr(o, "encryption_key", None), + encryption_key_history_entry=getattr( + o, "encryption_key_history_entry", None + ), + failed_data_recovery_in_seconds=getattr( + o, "failed_data_recovery_in_seconds", None + ), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + in_memory_area_in_gbs=getattr(o, "in_memory_area_in_gbs", None), + in_memory_percentage=getattr(o, "in_memory_percentage", None), + infrastructure_type=getattr(o, "infrastructure_type", None), + is_access_control_enabled=getattr(o, "is_access_control_enabled", None), + is_auto_scaling_enabled=getattr(o, "is_auto_scaling_enabled", None), + is_auto_scaling_for_storage_enabled=getattr( + o, "is_auto_scaling_for_storage_enabled", None + ), + is_backup_retention_locked=getattr(o, "is_backup_retention_locked", None), + is_data_guard_enabled=getattr(o, "is_data_guard_enabled", None), + is_dedicated=getattr(o, "is_dedicated", None), + is_dev_tier=getattr(o, "is_dev_tier", None), + is_free_tier=getattr(o, "is_free_tier", None), + is_local_data_guard_enabled=getattr(o, "is_local_data_guard_enabled", None), + is_mtls_connection_required=getattr(o, "is_mtls_connection_required", None), + is_preview=getattr(o, "is_preview", None), + is_reconnect_clone_enabled=getattr(o, "is_reconnect_clone_enabled", None), + is_refreshable_clone=getattr(o, "is_refreshable_clone", None), + is_remote_data_guard_enabled=getattr( + o, "is_remote_data_guard_enabled", None + ), + key_history_entry=getattr(o, "key_history_entry", None), + key_store_id=getattr(o, "key_store_id", None), + key_store_wallet_name=getattr(o, "key_store_wallet_name", None), + kms_key_id=getattr(o, "kms_key_id", None), + kms_key_lifecycle_details=getattr(o, "kms_key_lifecycle_details", None), + kms_key_version_id=getattr(o, "kms_key_version_id", None), + license_model=getattr(o, "license_model", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + local_adg_auto_failover_max_data_loss_limit=getattr( + o, "local_adg_auto_failover_max_data_loss_limit", None + ), + local_disaster_recovery_type=getattr( + o, "local_disaster_recovery_type", None + ), + local_standby_db=getattr(o, "local_standby_db", None), + long_term_backup_schedule=getattr(o, "long_term_backup_schedule", None), + memory_per_oracle_compute_unit_in_gbs=getattr( + o, "memory_per_oracle_compute_unit_in_gbs", None + ), + ncharacter_set=getattr(o, "ncharacter_set", None), + net_services_architecture=getattr(o, "net_services_architecture", None), + next_long_term_backup_time_stamp=getattr( + o, "next_long_term_backup_time_stamp", None + ), + nsg_ids=getattr(o, "nsg_ids", None), + ocpu_count=getattr(o, "ocpu_count", None), + open_mode=getattr(o, "open_mode", None), + operations_insights_status=getattr(o, "operations_insights_status", None), + peer_db_ids=getattr(o, "peer_db_ids", None), + permission_level=getattr(o, "permission_level", None), + private_endpoint=getattr(o, "private_endpoint", None), + private_endpoint_ip=getattr(o, "private_endpoint_ip", None), + private_endpoint_label=getattr(o, "private_endpoint_label", None), + provisionable_cpus=getattr(o, "provisionable_cpus", None), + public_connection_urls=getattr(o, "public_connection_urls", None), + public_endpoint=getattr(o, "public_endpoint", None), + refreshable_mode=getattr(o, "refreshable_mode", None), + refreshable_status=getattr(o, "refreshable_status", None), + remote_disaster_recovery_configuration=getattr( + o, "remote_disaster_recovery_configuration", None + ), + resource_pool_leader_id=getattr(o, "resource_pool_leader_id", None), + resource_pool_summary=getattr(o, "resource_pool_summary", None), + role=getattr(o, "role", None), + scheduled_operations=getattr(o, "scheduled_operations", None), + security_attributes=getattr(o, "security_attributes", None), + service_console_url=getattr(o, "service_console_url", None), + source_id=getattr(o, "source_id", None), + standby_db=getattr(o, "standby_db", None), + standby_whitelisted_ips=getattr(o, "standby_whitelisted_ips", None), + subnet_id=getattr(o, "subnet_id", None), + subscription_id=getattr(o, "subscription_id", None), + supported_regions_to_clone_to=getattr( + o, "supported_regions_to_clone_to", None + ), + system_tags=getattr(o, "system_tags", None), + time_created=getattr(o, "time_created", None), + time_data_guard_role_changed=getattr( + o, "time_data_guard_role_changed", None + ), + time_deletion_of_free_autonomous_database=getattr( + o, "time_deletion_of_free_autonomous_database", None + ), + time_disaster_recovery_role_changed=getattr( + o, "time_disaster_recovery_role_changed", None + ), + time_local_data_guard_enabled=getattr( + o, "time_local_data_guard_enabled", None + ), + time_maintenance_begin=getattr(o, "time_maintenance_begin", None), + time_maintenance_end=getattr(o, "time_maintenance_end", None), + time_of_auto_refresh_start=getattr(o, "time_of_auto_refresh_start", None), + time_of_joining_resource_pool=getattr( + o, "time_of_joining_resource_pool", None + ), + time_of_last_failover=getattr(o, "time_of_last_failover", None), + time_of_last_refresh=getattr(o, "time_of_last_refresh", None), + time_of_last_refresh_point=getattr(o, "time_of_last_refresh_point", None), + time_of_last_switchover=getattr(o, "time_of_last_switchover", None), + time_of_next_refresh=getattr(o, "time_of_next_refresh", None), + time_reclamation_of_free_autonomous_database=getattr( + o, "time_reclamation_of_free_autonomous_database", None + ), + time_undeleted=getattr(o, "time_undeleted", None), + time_until_reconnect_clone_enabled=getattr( + o, "time_until_reconnect_clone_enabled", None + ), + total_backup_storage_size_in_gbs=getattr( + o, "total_backup_storage_size_in_gbs", None + ), + used_data_storage_size_in_gbs=getattr( + o, "used_data_storage_size_in_gbs", None + ), + used_data_storage_size_in_tbs=getattr( + o, "used_data_storage_size_in_tbs", None + ), + vault_id=getattr(o, "vault_id", None), + whitelisted_ips=getattr(o, "whitelisted_ips", None), + ) + + +class AutonomousDatabaseDataguardAssociation(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousDatabaseDataguardAssociation.""" + + apply_lag: Optional[str] = Field( + None, + description="The lag time between updates to the primary database and application of the redo data on the standby database, as computed by the reporting database. Example: `9 seconds`", + ) + apply_rate: Optional[str] = Field( + None, + description="The rate at which redo logs are synced between the associated databases. Example: `180 Mb per second`", + ) + autonomous_database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the autonomous_database_id of this AutonomousDatabaseDataguardAssociation. The `OCID`__ of the Autonomous Database that has a relationship with the peer Autonomous Database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this AutonomousDatabaseDataguardAssociation. The OCID of the Autonomous Dataguard created for Autonomous Container Database where given Autonomous Database resides in.", + ) + is_automatic_failover_enabled: Optional[bool] = Field( + None, + description="Indicates whether Automatic Failover is enabled for Autonomous Container Database Dataguard Association", + ) + lifecycle_details: Optional[str] = Field( + None, + description="Additional information about the current lifecycleState, if available.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this AutonomousDatabaseDataguardAssociation. The current state of Autonomous Data Guard. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "ROLE_CHANGE_IN_PROGRESS", "TERMINATING", "TERMINATED", "FAILED", "UNAVAILABLE", "UPDATING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + peer_autonomous_database_id: Optional[str] = Field( + None, + description="The `OCID`__ of the peer Autonomous Database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + peer_autonomous_database_life_cycle_state: Optional[str] = Field( + None, + description='The current state of the Autonomous Database. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "STOPPING", "STOPPED", "STARTING", "TERMINATING", "TERMINATED", "UNAVAILABLE", "RESTORE_IN_PROGRESS", "RESTORE_FAILED", "BACKUP_IN_PROGRESS", "SCALE_IN_PROGRESS", "AVAILABLE_NEEDS_ATTENTION", "UPDATING", "MAINTENANCE_IN_PROGRESS", "RESTARTING", "RECREATING", "ROLE_CHANGE_IN_PROGRESS", "UPGRADING", "INACCESSIBLE", "STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + peer_role: Optional[str] = Field( + None, + description='**[Required]** Gets the peer_role of this AutonomousDatabaseDataguardAssociation. The Data Guard role of the Autonomous Container Database or Autonomous Database, if Autonomous Data Guard is enabled. Allowed values for this property are: "PRIMARY", "STANDBY", "DISABLED_STANDBY", "BACKUP_COPY", "SNAPSHOT_STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + protection_mode: Optional[str] = Field( + None, + description="The protection mode of this Autonomous Data Guard association. For more information, see `Oracle Data Guard Protection Modes`__ in the Oracle Data Guard documentation. __ http://docs.oracle.com/database/122/SBYDB/oracle-data-guard-protection-modes.htm#SBYDB02000 Allowed values for this property are: \"MAXIMUM_AVAILABILITY\", \"MAXIMUM_PERFORMANCE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + role: Optional[str] = Field( + None, + description='**[Required]** Gets the role of this AutonomousDatabaseDataguardAssociation. The Data Guard role of the Autonomous Container Database or Autonomous Database, if Autonomous Data Guard is enabled. Allowed values for this property are: "PRIMARY", "STANDBY", "DISABLED_STANDBY", "BACKUP_COPY", "SNAPSHOT_STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the Data Guard association was created." + ) + time_last_role_changed: Optional[datetime] = Field( + None, description="The date and time when the last role change action happened." + ) + time_last_synced: Optional[datetime] = Field( + None, + description="The date and time of the last update to the apply lag, apply rate, and transport lag values.", + ) + transport_lag: Optional[str] = Field( + None, + description="The approximate number of seconds of redo data not yet available on the standby Autonomous Container Database, as computed by the reporting database. Example: `7 seconds`", + ) + + +def map_autonomousdatabasedataguardassociation( + o: oci.database.models.AutonomousDatabaseDataguardAssociation, +) -> AutonomousDatabaseDataguardAssociation | None: + """Map oci.database.models.AutonomousDatabaseDataguardAssociation → AutonomousDatabaseDataguardAssociation Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousDatabaseDataguardAssociation(**data) + except Exception: + return AutonomousDatabaseDataguardAssociation( + apply_lag=getattr(o, "apply_lag", None), + apply_rate=getattr(o, "apply_rate", None), + autonomous_database_id=getattr(o, "autonomous_database_id", None), + id=getattr(o, "id", None), + is_automatic_failover_enabled=getattr( + o, "is_automatic_failover_enabled", None + ), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + peer_autonomous_database_id=getattr(o, "peer_autonomous_database_id", None), + peer_autonomous_database_life_cycle_state=getattr( + o, "peer_autonomous_database_life_cycle_state", None + ), + peer_role=getattr(o, "peer_role", None), + protection_mode=getattr(o, "protection_mode", None), + role=getattr(o, "role", None), + time_created=getattr(o, "time_created", None), + time_last_role_changed=getattr(o, "time_last_role_changed", None), + time_last_synced=getattr(o, "time_last_synced", None), + transport_lag=getattr(o, "transport_lag", None), + ) + + +class AutonomousDatabasePeerCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousDatabasePeerCollection.""" + + items: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the items of this AutonomousDatabasePeerCollection. This array holds details about Autonomous Database Peers for Oracle an Autonomous Database.", + ) + + +def map_autonomousdatabasepeercollection( + o: oci.database.models.AutonomousDatabasePeerCollection, +) -> AutonomousDatabasePeerCollection | None: + """Map oci.database.models.AutonomousDatabasePeerCollection → AutonomousDatabasePeerCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousDatabasePeerCollection(**data) + except Exception: + return AutonomousDatabasePeerCollection( + items=getattr(o, "items", None), + ) + + +class RefreshableCloneCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.RefreshableCloneCollection.""" + + items: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the items of this RefreshableCloneCollection.", + ) + + +def map_refreshableclonecollection( + o: oci.database.models.RefreshableCloneCollection, +) -> RefreshableCloneCollection | None: + """Map oci.database.models.RefreshableCloneCollection → RefreshableCloneCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return RefreshableCloneCollection(**data) + except Exception: + return RefreshableCloneCollection( + items=getattr(o, "items", None), + ) + + +class AutonomousDatabaseSoftwareImageCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousDatabaseSoftwareImageCollection.""" + + items: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the items of this AutonomousDatabaseSoftwareImageCollection. List of Autonomous Database Software Images.", + ) + + +def map_autonomousdatabasesoftwareimagecollection( + o: oci.database.models.AutonomousDatabaseSoftwareImageCollection, +) -> AutonomousDatabaseSoftwareImageCollection | None: + """Map oci.database.models.AutonomousDatabaseSoftwareImageCollection → AutonomousDatabaseSoftwareImageCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousDatabaseSoftwareImageCollection(**data) + except Exception: + return AutonomousDatabaseSoftwareImageCollection( + items=getattr(o, "items", None), + ) + + +class AutonomousDbPreviewVersionSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousDbPreviewVersionSummary.""" + + db_workload: Optional[str] = Field( + None, + description='The Autonomous Database workload type. The following values are valid: - OLTP - indicates an Autonomous Transaction Processing database - DW - indicates an Autonomous Data Warehouse database - AJD - indicates an Autonomous JSON Database - APEX - indicates an Autonomous Database with the Oracle APEX Application Development workload type. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, isMTLSConnectionRequired, privateEndpointLabel, nsgIds, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier. Allowed values for this property are: "OLTP", "DW", "AJD", "APEX", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + details: Optional[str] = Field( + None, + description="A URL that points to a detailed description of the preview version.", + ) + time_preview_begin: Optional[datetime] = Field( + None, + description="The date and time when the preview version availability begins.", + ) + time_preview_end: Optional[datetime] = Field( + None, + description="The date and time when the preview version availability ends.", + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this AutonomousDbPreviewVersionSummary. A valid Autonomous Database preview version.", + ) + + +def map_autonomousdbpreviewversionsummary( + o: oci.database.models.AutonomousDbPreviewVersionSummary, +) -> AutonomousDbPreviewVersionSummary | None: + """Map oci.database.models.AutonomousDbPreviewVersionSummary → AutonomousDbPreviewVersionSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousDbPreviewVersionSummary(**data) + except Exception: + return AutonomousDbPreviewVersionSummary( + db_workload=getattr(o, "db_workload", None), + details=getattr(o, "details", None), + time_preview_begin=getattr(o, "time_preview_begin", None), + time_preview_end=getattr(o, "time_preview_end", None), + version=getattr(o, "version", None), + ) + + +class AutonomousDbVersionSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousDbVersionSummary.""" + + db_workload: Optional[str] = Field( + None, + description='The Autonomous Database workload type. The following values are valid: - OLTP - indicates an Autonomous Transaction Processing database - DW - indicates an Autonomous Data Warehouse database - AJD - indicates an Autonomous JSON Database - APEX - indicates an Autonomous Database with the Oracle APEX Application Development workload type. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, isMTLSConnectionRequired, privateEndpointLabel, nsgIds, dbVersion, isRefreshable, dbName, scheduledOperations, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier. Allowed values for this property are: "OLTP", "DW", "AJD", "APEX", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + details: Optional[str] = Field( + None, + description="A URL that points to a detailed description of the Autonomous Database version.", + ) + is_dedicated: Optional[bool] = Field( + None, + description="True if the database uses `dedicated Exadata infrastructure`__. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/index.html", + ) + is_default_for_free: Optional[bool] = Field( + None, + description="True if this version of the Oracle Database software's default is free.", + ) + is_default_for_paid: Optional[bool] = Field( + None, + description="True if this version of the Oracle Database software's default is paid.", + ) + is_free_tier_enabled: Optional[bool] = Field( + None, + description="True if this version of the Oracle Database software can be used for Always-Free Autonomous Databases.", + ) + is_paid_enabled: Optional[bool] = Field( + None, + description="True if this version of the Oracle Database software has payments enabled.", + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this AutonomousDbVersionSummary. A valid Oracle Database version for Autonomous Database.", + ) + + +def map_autonomousdbversionsummary( + o: oci.database.models.AutonomousDbVersionSummary, +) -> AutonomousDbVersionSummary | None: + """Map oci.database.models.AutonomousDbVersionSummary → AutonomousDbVersionSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousDbVersionSummary(**data) + except Exception: + return AutonomousDbVersionSummary( + db_workload=getattr(o, "db_workload", None), + details=getattr(o, "details", None), + is_dedicated=getattr(o, "is_dedicated", None), + is_default_for_free=getattr(o, "is_default_for_free", None), + is_default_for_paid=getattr(o, "is_default_for_paid", None), + is_free_tier_enabled=getattr(o, "is_free_tier_enabled", None), + is_paid_enabled=getattr(o, "is_paid_enabled", None), + version=getattr(o, "version", None), + ) + + +class AutonomousVirtualMachineSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousVirtualMachineSummary.""" + + autonomous_vm_cluster_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Autonomous VM Cluster associated with the Autonomous Virtual Machine. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + client_ip_address: Optional[str] = Field(None, description="Client IP Address.") + cloud_autonomous_vm_cluster_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Cloud Autonomous VM Cluster associated with the Autonomous Virtual Machine. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compartment_id: Optional[str] = Field( + None, + description="The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + cpu_core_count: Optional[int] = Field( + None, + description="The number of CPU cores enabled on the Autonomous Virtual Machine.", + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, + description="The allocated local node storage in GBs on the Autonomous Virtual Machine.", + ) + db_server_display_name: Optional[str] = Field( + None, + description="The display name of the dbServer associated with the Autonomous Virtual Machine.", + ) + db_server_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Db server associated with the Autonomous Virtual Machine. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this AutonomousVirtualMachineSummary. The `OCID`__ of the Autonomous Virtual Machine. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this AutonomousVirtualMachineSummary. The current state of the Autonomous Virtual Machine. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + memory_size_in_gbs: Optional[int] = Field( + None, + description="The allocated memory in GBs on the Autonomous Virtual Machine.", + ) + vm_name: Optional[str] = Field( + None, description="The name of the Autonomous Virtual Machine." + ) + + +def map_autonomousvirtualmachinesummary( + o: oci.database.models.AutonomousVirtualMachineSummary, +) -> AutonomousVirtualMachineSummary | None: + """Map oci.database.models.AutonomousVirtualMachineSummary → AutonomousVirtualMachineSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousVirtualMachineSummary(**data) + except Exception: + return AutonomousVirtualMachineSummary( + autonomous_vm_cluster_id=getattr(o, "autonomous_vm_cluster_id", None), + client_ip_address=getattr(o, "client_ip_address", None), + cloud_autonomous_vm_cluster_id=getattr( + o, "cloud_autonomous_vm_cluster_id", None + ), + compartment_id=getattr(o, "compartment_id", None), + cpu_core_count=getattr(o, "cpu_core_count", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_server_display_name=getattr(o, "db_server_display_name", None), + db_server_id=getattr(o, "db_server_id", None), + defined_tags=getattr(o, "defined_tags", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + vm_name=getattr(o, "vm_name", None), + ) + + +class AutonomousVmClusterSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousVmClusterSummary.""" + + autonomous_data_storage_percentage: Optional[float] = Field( + None, + description="The percentage of the data storage used for the Autonomous Databases in an Autonomous VM Cluster.", + ) + autonomous_data_storage_size_in_tbs: Optional[float] = Field( + None, + description="The data disk group size allocated for Autonomous Databases, in TBs.", + ) + available_autonomous_data_storage_size_in_tbs: Optional[float] = Field( + None, + description="The data disk group size available for Autonomous Databases, in TBs.", + ) + available_container_databases: Optional[int] = Field( + None, + description="The number of Autonomous Container Databases that can be created with the currently available local storage.", + ) + available_cpus: Optional[int] = Field( + None, description="The numnber of CPU cores available." + ) + available_data_storage_size_in_tbs: Optional[float] = Field( + None, + description="**Deprecated.** Use `availableAutonomousDataStorageSizeInTBs` for Autonomous Databases' data storage availability in TBs.", + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this AutonomousVmClusterSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous VM Cluster. ECPU compute model is the recommended model and OCPU compute model is legacy. See `Compute Models in Autonomous Database on Dedicated Exadata #Infrastructure`__ for more details. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbak Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + cpu_core_count_per_node: Optional[int] = Field( + None, description="The number of CPU cores enabled per VM cluster node." + ) + cpu_percentage: Optional[float] = Field( + None, + description="The percentage of total number of CPUs used in an Autonomous VM Cluster.", + ) + cpus_enabled: Optional[int] = Field( + None, description="The number of enabled CPU cores." + ) + cpus_lowest_scaled_value: Optional[int] = Field( + None, description="The lowest value to which cpus can be scaled down." + ) + data_storage_size_in_gbs: Optional[float] = Field( + None, description="The total data storage allocated in GBs." + ) + data_storage_size_in_tbs: Optional[float] = Field( + None, description="The total data storage allocated in TBs" + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, description="The local node storage allocated in GBs." + ) + db_servers: Optional[str] = Field( + None, + description="The list of `OCIDs`__ of the Db servers. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this AutonomousVmClusterSummary. The user-friendly name for the Autonomous VM cluster. The name does not need to be unique.", + ) + exadata_infrastructure_id: Optional[str] = Field( + None, + description="**[Required]** Gets the exadata_infrastructure_id of this AutonomousVmClusterSummary. The `OCID`__ of the Exadata infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + exadata_storage_in_tbs_lowest_scaled_value: Optional[float] = Field( + None, + description="The lowest value to which exadataStorage(in TBs) can be scaled down.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this AutonomousVmClusterSummary. The `OCID`__ of the Autonomous VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_local_backup_enabled: Optional[bool] = Field( + None, + description="If true, database backup on local Exadata storage is configured for the Autonomous VM cluster. If false, database backup on local Exadata storage is not available in the Autonomous VM cluster.", + ) + is_mtls_enabled: Optional[bool] = Field( + None, + description="Enable mutual TLS(mTLS) authentication for database while provisioning a VMCluster. Default is TLS.", + ) + last_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + license_model: Optional[str] = Field( + None, + description="The Oracle license model that applies to the Autonomous VM cluster. The default is LICENSE_INCLUDED. Allowed values for this property are: \"LICENSE_INCLUDED\", \"BRING_YOUR_OWN_LICENSE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this AutonomousVmClusterSummary. The current state of the Autonomous VM cluster. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + maintenance_window: Optional[int] = Field(None, description="") + max_acds_lowest_scaled_value: Optional[int] = Field( + None, + description="The lowest value to which maximum number of ACDs can be scaled down.", + ) + memory_per_oracle_compute_unit_in_gbs: Optional[int] = Field( + None, + description="The amount of memory (in GBs) to be enabled per OCPU or ECPU.", + ) + memory_size_in_gbs: Optional[int] = Field( + None, description="The memory allocated in GBs." + ) + next_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the next maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + node_count: Optional[int] = Field( + None, description="The number of nodes in the Autonomous VM Cluster." + ) + non_provisionable_autonomous_container_databases: Optional[int] = Field( + None, + description="The number of non-provisionable Autonomous Container Databases in an Autonomous VM Cluster.", + ) + ocpus_enabled: Optional[float] = Field( + None, description="The number of enabled OCPU cores." + ) + provisionable_autonomous_container_databases: Optional[int] = Field( + None, description="**Deprecated.** Use field totalContainerDatabases." + ) + provisioned_autonomous_container_databases: Optional[int] = Field( + None, + description="The number of provisioned Autonomous Container Databases in an Autonomous VM Cluster.", + ) + provisioned_cpus: Optional[float] = Field( + None, description="The number of CPUs provisioned in an Autonomous VM Cluster." + ) + reclaimable_cpus: Optional[int] = Field( + None, + description="CPUs that continue to be included in the count of CPUs available to the Autonomous Container Database even after one of its Autonomous Database is terminated or scaled down. You can release them to the available CPUs at its parent Autonomous VM Cluster level by restarting the Autonomous Container Database.", + ) + reserved_cpus: Optional[float] = Field( + None, description="The number of CPUs reserved in an Autonomous VM Cluster." + ) + scan_listener_port_non_tls: Optional[int] = Field( + None, + description="The SCAN Listener Non TLS port number. Default value is 1521.", + ) + scan_listener_port_tls: Optional[int] = Field( + None, description="The SCAN Listener TLS port number. Default value is 2484." + ) + time_created: Optional[datetime] = Field( + None, + description="The date and time that the Autonomous VM cluster was created.", + ) + time_database_ssl_certificate_expires: Optional[datetime] = Field( + None, + description="The date and time of the Database SSL certificate expiration.", + ) + time_ords_certificate_expires: Optional[datetime] = Field( + None, description="The date and time of the ORDS certificate expiration." + ) + time_zone: Optional[str] = Field( + None, + description="The time zone to use for the Autonomous VM cluster. For details, see `DB System Time Zones`__. __ https://docs.cloud.oracle.com/Content/Database/References/timezones.htm", + ) + total_autonomous_data_storage_in_tbs: Optional[float] = Field( + None, + description="The total data disk group size for Autonomous Databases, in TBs.", + ) + total_container_databases: Optional[int] = Field( + None, + description="The total number of Autonomous Container Databases that can be created.", + ) + vm_cluster_network_id: Optional[str] = Field( + None, + description="**[Required]** Gets the vm_cluster_network_id of this AutonomousVmClusterSummary. The `OCID`__ of the VM cluster network. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + + +def map_autonomousvmclustersummary( + o: oci.database.models.AutonomousVmClusterSummary, +) -> AutonomousVmClusterSummary | None: + """Map oci.database.models.AutonomousVmClusterSummary → AutonomousVmClusterSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousVmClusterSummary(**data) + except Exception: + return AutonomousVmClusterSummary( + autonomous_data_storage_percentage=getattr( + o, "autonomous_data_storage_percentage", None + ), + autonomous_data_storage_size_in_tbs=getattr( + o, "autonomous_data_storage_size_in_tbs", None + ), + available_autonomous_data_storage_size_in_tbs=getattr( + o, "available_autonomous_data_storage_size_in_tbs", None + ), + available_container_databases=getattr( + o, "available_container_databases", None + ), + available_cpus=getattr(o, "available_cpus", None), + available_data_storage_size_in_tbs=getattr( + o, "available_data_storage_size_in_tbs", None + ), + compartment_id=getattr(o, "compartment_id", None), + compute_model=getattr(o, "compute_model", None), + cpu_core_count_per_node=getattr(o, "cpu_core_count_per_node", None), + cpu_percentage=getattr(o, "cpu_percentage", None), + cpus_enabled=getattr(o, "cpus_enabled", None), + cpus_lowest_scaled_value=getattr(o, "cpus_lowest_scaled_value", None), + data_storage_size_in_gbs=getattr(o, "data_storage_size_in_gbs", None), + data_storage_size_in_tbs=getattr(o, "data_storage_size_in_tbs", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_servers=getattr(o, "db_servers", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + exadata_infrastructure_id=getattr(o, "exadata_infrastructure_id", None), + exadata_storage_in_tbs_lowest_scaled_value=getattr( + o, "exadata_storage_in_tbs_lowest_scaled_value", None + ), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + is_local_backup_enabled=getattr(o, "is_local_backup_enabled", None), + is_mtls_enabled=getattr(o, "is_mtls_enabled", None), + last_maintenance_run_id=getattr(o, "last_maintenance_run_id", None), + license_model=getattr(o, "license_model", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + maintenance_window=getattr(o, "maintenance_window", None), + max_acds_lowest_scaled_value=getattr( + o, "max_acds_lowest_scaled_value", None + ), + memory_per_oracle_compute_unit_in_gbs=getattr( + o, "memory_per_oracle_compute_unit_in_gbs", None + ), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + next_maintenance_run_id=getattr(o, "next_maintenance_run_id", None), + node_count=getattr(o, "node_count", None), + non_provisionable_autonomous_container_databases=getattr( + o, "non_provisionable_autonomous_container_databases", None + ), + ocpus_enabled=getattr(o, "ocpus_enabled", None), + provisionable_autonomous_container_databases=getattr( + o, "provisionable_autonomous_container_databases", None + ), + provisioned_autonomous_container_databases=getattr( + o, "provisioned_autonomous_container_databases", None + ), + provisioned_cpus=getattr(o, "provisioned_cpus", None), + reclaimable_cpus=getattr(o, "reclaimable_cpus", None), + reserved_cpus=getattr(o, "reserved_cpus", None), + scan_listener_port_non_tls=getattr(o, "scan_listener_port_non_tls", None), + scan_listener_port_tls=getattr(o, "scan_listener_port_tls", None), + time_created=getattr(o, "time_created", None), + time_database_ssl_certificate_expires=getattr( + o, "time_database_ssl_certificate_expires", None + ), + time_ords_certificate_expires=getattr( + o, "time_ords_certificate_expires", None + ), + time_zone=getattr(o, "time_zone", None), + total_autonomous_data_storage_in_tbs=getattr( + o, "total_autonomous_data_storage_in_tbs", None + ), + total_container_databases=getattr(o, "total_container_databases", None), + vm_cluster_network_id=getattr(o, "vm_cluster_network_id", None), + ) + + +class BackupDestinationSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.BackupDestinationSummary.""" + + associated_databases: Optional[list[dict]] = Field( + None, description="List of databases associated with the backup destination." + ) + compartment_id: Optional[str] = Field( + None, + description="The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + connection_string: Optional[str] = Field( + None, + description="For a RECOVERY_APPLIANCE backup destination, the connection string for connecting to the Recovery Appliance.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, description="The user-provided name of the backup destination." + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="The `OCID`__ of the backup destination. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, + description="A descriptive text associated with the lifecycleState. Typically contains additional displayable text", + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current lifecycle state of the backup destination. Allowed values for this property are: "ACTIVE", "FAILED", "DELETED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + local_mount_point_path: Optional[str] = Field( + None, + description="The local directory path on each VM cluster node where the NFS server location is mounted. The local directory path and the NFS server location must each be the same across all of the VM cluster nodes. Ensure that the NFS mount is maintained continuously on all of the VM cluster nodes.", + ) + nfs_mount_type: Optional[str] = Field( + None, + description="NFS Mount type for backup destination. Allowed values for this property are: \"SELF_MOUNT\", \"AUTOMATED_MOUNT\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + nfs_server: Optional[str] = Field( + None, description="Host names or IP addresses for NFS Auto mount." + ) + nfs_server_export: Optional[str] = Field( + None, description="Specifies the directory on which to mount the file system" + ) + time_at_which_storage_details_are_updated: Optional[datetime] = Field( + None, + description="The time when the total storage size and the utilized storage size of the backup destination are updated.", + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the backup destination was created." + ) + total_storage_size_in_gbs: Optional[int] = Field( + None, + description="The total storage size of the backup destination in GBs, rounded to the nearest integer.", + ) + type: Optional[str] = Field( + None, + description="Type of the backup destination. Allowed values for this property are: \"NFS\", \"RECOVERY_APPLIANCE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + utilized_storage_size_in_gbs: Optional[int] = Field( + None, + description="The total amount of space utilized on the backup destination (in GBs), rounded to the nearest integer.", + ) + vpc_users: Optional[str] = Field( + None, + description="For a RECOVERY_APPLIANCE backup destination, the Virtual Private Catalog (VPC) users that are used to access the Recovery Appliance.", + ) + + +def map_backupdestinationsummary( + o: oci.database.models.BackupDestinationSummary, +) -> BackupDestinationSummary | None: + """Map oci.database.models.BackupDestinationSummary → BackupDestinationSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return BackupDestinationSummary(**data) + except Exception: + return BackupDestinationSummary( + associated_databases=getattr(o, "associated_databases", None), + compartment_id=getattr(o, "compartment_id", None), + connection_string=getattr(o, "connection_string", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + local_mount_point_path=getattr(o, "local_mount_point_path", None), + nfs_mount_type=getattr(o, "nfs_mount_type", None), + nfs_server=getattr(o, "nfs_server", None), + nfs_server_export=getattr(o, "nfs_server_export", None), + time_at_which_storage_details_are_updated=getattr( + o, "time_at_which_storage_details_are_updated", None + ), + time_created=getattr(o, "time_created", None), + total_storage_size_in_gbs=getattr(o, "total_storage_size_in_gbs", None), + type=getattr(o, "type", None), + utilized_storage_size_in_gbs=getattr( + o, "utilized_storage_size_in_gbs", None + ), + vpc_users=getattr(o, "vpc_users", None), + ) + + +class BackupSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.BackupSummary.""" + + availability_domain: Optional[str] = Field( + None, + description="The name of the availability domain where the database backup is stored.", + ) + compartment_id: Optional[str] = Field( + None, + description="The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + database_edition: Optional[str] = Field( + None, + description='The Oracle Database edition of the DB system from which the database backup was taken. Allowed values for this property are: "STANDARD_EDITION", "ENTERPRISE_EDITION", "ENTERPRISE_EDITION_HIGH_PERFORMANCE", "ENTERPRISE_EDITION_EXTREME_PERFORMANCE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + database_id: Optional[str] = Field( + None, + description="The `OCID`__ of the database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + database_size_in_gbs: Optional[float] = Field( + None, + description="The size of the database in gigabytes at the time the backup was taken.", + ) + display_name: Optional[str] = Field( + None, + description="The user-friendly name for the backup. The name does not have to be unique.", + ) + encryption_key_location_details: Optional[dict] = Field(None, description="") + id: Optional[str] = Field( + None, + description="The `OCID`__ of the backup. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + key_store_id: Optional[str] = Field( + None, + description="The `OCID`__ of the key store of Oracle Vault. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + key_store_wallet_name: Optional[str] = Field( + None, description="The wallet name for Oracle Key Vault." + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + kms_key_version_id: Optional[str] = Field( + None, + description="The OCID of the key container version that is used in database transparent data encryption (TDE) operations KMS Key can have multiple key versions. If none is specified, the current key version (latest) of the Key Id is used for the operation. Autonomous Database Serverless does not use key versions, hence is not applicable for Autonomous Database Serverless instances.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the backup. Allowed values for this property are: "CREATING", "ACTIVE", "DELETING", "DELETED", "FAILED", "RESTORING", "CANCELING", "CANCELED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + shape: Optional[str] = Field( + None, description="Shape of the backup's source database." + ) + time_ended: Optional[datetime] = Field( + None, description="The date and time the backup was completed." + ) + time_started: Optional[datetime] = Field( + None, description="The date and time the backup started." + ) + type: Optional[str] = Field( + None, + description='The type of backup. Allowed values for this property are: "INCREMENTAL", "FULL", "VIRTUAL_FULL", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + vault_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Oracle Cloud Infrastructure `vault`__. This parameter and `secretId` are required for Customer Managed Keys. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/KeyManagement/Concepts/keyoverview.htm#concepts", + ) + version: Optional[str] = Field( + None, description="Version of the backup's source database" + ) + + +def map_backupsummary(o: oci.database.models.BackupSummary) -> BackupSummary | None: + """Map oci.database.models.BackupSummary → BackupSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return BackupSummary(**data) + except Exception: + return BackupSummary( + availability_domain=getattr(o, "availability_domain", None), + compartment_id=getattr(o, "compartment_id", None), + database_edition=getattr(o, "database_edition", None), + database_id=getattr(o, "database_id", None), + database_size_in_gbs=getattr(o, "database_size_in_gbs", None), + display_name=getattr(o, "display_name", None), + encryption_key_location_details=getattr( + o, "encryption_key_location_details", None + ), + id=getattr(o, "id", None), + key_store_id=getattr(o, "key_store_id", None), + key_store_wallet_name=getattr(o, "key_store_wallet_name", None), + kms_key_id=getattr(o, "kms_key_id", None), + kms_key_version_id=getattr(o, "kms_key_version_id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + shape=getattr(o, "shape", None), + time_ended=getattr(o, "time_ended", None), + time_started=getattr(o, "time_started", None), + type=getattr(o, "type", None), + vault_id=getattr(o, "vault_id", None), + version=getattr(o, "version", None), + ) + + +class CloudAutonomousVmClusterSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.CloudAutonomousVmClusterSummary.""" + + autonomous_data_storage_percentage: Optional[float] = Field( + None, + description="The percentage of the data storage used for the Autonomous Databases in an Autonomous VM Cluster.", + ) + autonomous_data_storage_size_in_tbs: Optional[float] = Field( + None, + description="The data disk group size allocated for Autonomous Databases, in TBs.", + ) + availability_domain: Optional[str] = Field( + None, + description="**[Required]** Gets the availability_domain of this CloudAutonomousVmClusterSummary. The name of the availability domain that the cloud Autonomous VM cluster is located in.", + ) + available_autonomous_data_storage_size_in_tbs: Optional[float] = Field( + None, + description="The data disk group size available for Autonomous Databases, in TBs.", + ) + available_container_databases: Optional[int] = Field( + None, + description="The number of Autonomous Container Databases that can be created with the currently available local storage.", + ) + available_cpus: Optional[float] = Field( + None, description="CPU cores available for allocation to Autonomous Databases." + ) + cloud_exadata_infrastructure_id: Optional[str] = Field( + None, + description="**[Required]** Gets the cloud_exadata_infrastructure_id of this CloudAutonomousVmClusterSummary. The `OCID`__ of the cloud Exadata infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + cluster_time_zone: Optional[str] = Field( + None, description="The time zone of the Cloud Autonomous VM Cluster." + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this CloudAutonomousVmClusterSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Cloud Autonomous VM Cluster. ECPU compute model is the recommended model and OCPU compute model is legacy. See `Compute Models in Autonomous Database on Dedicated Exadata #Infrastructure`__ for more details. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbak Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + cpu_core_count: Optional[int] = Field( + None, description="The number of CPU cores on the cloud Autonomous VM cluster." + ) + cpu_core_count_per_node: Optional[int] = Field( + None, description="The number of CPU cores enabled per VM cluster node." + ) + cpu_percentage: Optional[float] = Field( + None, + description="The percentage of total number of CPUs used in an Autonomous VM Cluster.", + ) + data_storage_size_in_gbs: Optional[float] = Field( + None, description="The total data storage allocated, in gigabytes (GB)." + ) + data_storage_size_in_tbs: Optional[float] = Field( + None, description="The total data storage allocated, in terabytes (TB)." + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, description="The local node storage allocated in GBs." + ) + db_servers: Optional[str] = Field( + None, + description="The list of `OCIDs`__ of the Db servers. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + description: Optional[str] = Field( + None, description="User defined description of the cloud Autonomous VM cluster." + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this CloudAutonomousVmClusterSummary. The user-friendly name for the cloud Autonomous VM cluster. The name does not need to be unique.", + ) + domain: Optional[str] = Field( + None, description="The domain name for the cloud Autonomous VM cluster." + ) + exadata_storage_in_tbs_lowest_scaled_value: Optional[float] = Field( + None, + description="The lowest value to which exadataStorage (in TBs) can be scaled down.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + hostname: Optional[str] = Field( + None, description="The hostname for the cloud Autonomous VM cluster." + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this CloudAutonomousVmClusterSummary. The `OCID`__ of the Cloud Autonomous VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_mtls_enabled_vm_cluster: Optional[bool] = Field( + None, + description="Enable mutual TLS(mTLS) authentication for database at time of provisioning a VMCluster. This is applicable to database TLS Certificates only. Default is TLS", + ) + last_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + last_update_history_entry_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance update history. This value is updated when a maintenance update starts. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + license_model: Optional[str] = Field( + None, + description="The Oracle license model that applies to the Oracle Autonomous Database. Bring your own license (BYOL) allows you to apply your current on-premises Oracle software licenses to equivalent, highly automated Oracle services in the cloud. License Included allows you to subscribe to new Oracle Database software licenses and the Oracle Database service. Note that when provisioning an `Autonomous Database on dedicated Exadata infrastructure`__, this attribute must be null. It is already set at the Autonomous Exadata Infrastructure level. When provisioning an `Autonomous Database Serverless]`__ database, if a value is not specified, the system defaults the value to `BRING_YOUR_OWN_LICENSE`. Bring your own license (BYOL) also allows you to select the DB edition using the optional parameter. This cannot be updated in parallel with any of the following: cpuCoreCount, computeCount, dataStorageSizeInTBs, adminPassword, isMTLSConnectionRequired, dbWorkload, privateEndpointLabel, nsgIds, dbVersion, dbName, scheduledOperations, dbToolsDetails, or isFreeTier. __ https://docs.oracle.com/en/cloud/paas/autonomous-database/index.html __ https://docs.oracle.com/en/cloud/paas/autonomous-database/index.html Allowed values for this property are: \"LICENSE_INCLUDED\", \"BRING_YOUR_OWN_LICENSE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this CloudAutonomousVmClusterSummary. The current state of the cloud Autonomous VM cluster. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + maintenance_window: Optional[int] = Field(None, description="") + max_acds_lowest_scaled_value: Optional[int] = Field( + None, + description="The lowest value to which maximum number of ACDs can be scaled down.", + ) + memory_per_oracle_compute_unit_in_gbs: Optional[int] = Field( + None, description="The amount of memory (in GBs) enabled per OCPU or ECPU." + ) + memory_size_in_gbs: Optional[int] = Field( + None, description="The memory allocated in GBs." + ) + next_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the next maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + node_count: Optional[int] = Field( + None, description="The number of database servers in the cloud VM cluster." + ) + non_provisionable_autonomous_container_databases: Optional[int] = Field( + None, + description="The number of non-provisionable Autonomous Container Databases in an Autonomous VM Cluster.", + ) + nsg_ids: Optional[str] = Field( + None, + description="The list of `OCIDs`__ for the network security groups (NSGs) to which this resource belongs. Setting this to an empty list removes all resources from all NSGs. For more information about NSGs, see `Security Rules`__. **NsgIds restrictions:** - A network security group (NSG) is optional for Autonomous Databases with private access. The nsgIds list can be empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/Network/Concepts/securityrules.htm", + ) + ocpu_count: Optional[float] = Field( + None, + description="The number of CPU cores on the cloud Autonomous VM cluster. Only 1 decimal place is allowed for the fractional part.", + ) + ocpus_lowest_scaled_value: Optional[int] = Field( + None, description="The lowest value to which ocpus can be scaled down." + ) + provisionable_autonomous_container_databases: Optional[int] = Field( + None, + description="The number of provisionable Autonomous Container Databases in an Autonomous VM Cluster.", + ) + provisioned_autonomous_container_databases: Optional[int] = Field( + None, + description="The number of provisioned Autonomous Container Databases in an Autonomous VM Cluster.", + ) + provisioned_cpus: Optional[float] = Field( + None, description="The number of CPUs provisioned in an Autonomous VM Cluster." + ) + reclaimable_cpus: Optional[float] = Field( + None, + description="CPUs that continue to be included in the count of CPUs available to the Autonomous Container Database even after one of its Autonomous Database is terminated or scaled down. You can release them to the available CPUs at its parent Autonomous VM Cluster level by restarting the Autonomous Container Database.", + ) + reserved_cpus: Optional[float] = Field( + None, description="The number of CPUs reserved in an Autonomous VM Cluster." + ) + scan_listener_port_non_tls: Optional[int] = Field( + None, description="The SCAN Listener Non TLS port. Default is 1521." + ) + scan_listener_port_tls: Optional[int] = Field( + None, description="The SCAN Listenenr TLS port. Default is 2484." + ) + security_attributes: Optional[str] = Field( + None, + description='Security Attributes for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. Example: `{"Oracle-ZPR": {"MaxEgressCount": {"value": "42", "mode": "audit"}}}` __ https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm', + ) + shape: Optional[str] = Field( + None, + description="The model name of the Exadata hardware running the cloud Autonomous VM cluster.", + ) + subnet_id: Optional[str] = Field( + None, + description="**[Required]** Gets the subnet_id of this CloudAutonomousVmClusterSummary. The `OCID`__ of the subnet the cloud Autonomous VM Cluster is associated with. **Subnet Restrictions:** - For Exadata and virtual machine 2-node RAC DB systems, do not use a subnet that overlaps with 192.168.128.0/20. These subnets are used by the Oracle Clusterware private interconnect on the database instance. Specifying an overlapping subnet will cause the private interconnect to malfunction. This restriction applies to both the client subnet and backup subnet. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + time_created: Optional[datetime] = Field( + None, + description="The date and time that the cloud Autonomous VM cluster was created.", + ) + time_database_ssl_certificate_expires: Optional[datetime] = Field( + None, description="The date and time of Database SSL certificate expiration." + ) + time_ords_certificate_expires: Optional[datetime] = Field( + None, description="The date and time of ORDS certificate expiration." + ) + time_updated: Optional[datetime] = Field( + None, + description="The last date and time that the cloud Autonomous VM cluster was updated.", + ) + total_autonomous_data_storage_in_tbs: Optional[float] = Field( + None, + description="The total data disk group size for Autonomous Databases, in TBs.", + ) + total_container_databases: Optional[int] = Field( + None, + description="The total number of Autonomous Container Databases that can be created with the allocated local storage.", + ) + total_cpus: Optional[float] = Field( + None, description="The total number of CPUs in an Autonomous VM Cluster." + ) + + +def map_cloudautonomousvmclustersummary( + o: oci.database.models.CloudAutonomousVmClusterSummary, +) -> CloudAutonomousVmClusterSummary | None: + """Map oci.database.models.CloudAutonomousVmClusterSummary → CloudAutonomousVmClusterSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return CloudAutonomousVmClusterSummary(**data) + except Exception: + return CloudAutonomousVmClusterSummary( + autonomous_data_storage_percentage=getattr( + o, "autonomous_data_storage_percentage", None + ), + autonomous_data_storage_size_in_tbs=getattr( + o, "autonomous_data_storage_size_in_tbs", None + ), + availability_domain=getattr(o, "availability_domain", None), + available_autonomous_data_storage_size_in_tbs=getattr( + o, "available_autonomous_data_storage_size_in_tbs", None + ), + available_container_databases=getattr( + o, "available_container_databases", None + ), + available_cpus=getattr(o, "available_cpus", None), + cloud_exadata_infrastructure_id=getattr( + o, "cloud_exadata_infrastructure_id", None + ), + cluster_time_zone=getattr(o, "cluster_time_zone", None), + compartment_id=getattr(o, "compartment_id", None), + compute_model=getattr(o, "compute_model", None), + cpu_core_count=getattr(o, "cpu_core_count", None), + cpu_core_count_per_node=getattr(o, "cpu_core_count_per_node", None), + cpu_percentage=getattr(o, "cpu_percentage", None), + data_storage_size_in_gbs=getattr(o, "data_storage_size_in_gbs", None), + data_storage_size_in_tbs=getattr(o, "data_storage_size_in_tbs", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_servers=getattr(o, "db_servers", None), + defined_tags=getattr(o, "defined_tags", None), + description=getattr(o, "description", None), + display_name=getattr(o, "display_name", None), + domain=getattr(o, "domain", None), + exadata_storage_in_tbs_lowest_scaled_value=getattr( + o, "exadata_storage_in_tbs_lowest_scaled_value", None + ), + freeform_tags=getattr(o, "freeform_tags", None), + hostname=getattr(o, "hostname", None), + id=getattr(o, "id", None), + is_mtls_enabled_vm_cluster=getattr(o, "is_mtls_enabled_vm_cluster", None), + last_maintenance_run_id=getattr(o, "last_maintenance_run_id", None), + last_update_history_entry_id=getattr( + o, "last_update_history_entry_id", None + ), + license_model=getattr(o, "license_model", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + maintenance_window=getattr(o, "maintenance_window", None), + max_acds_lowest_scaled_value=getattr( + o, "max_acds_lowest_scaled_value", None + ), + memory_per_oracle_compute_unit_in_gbs=getattr( + o, "memory_per_oracle_compute_unit_in_gbs", None + ), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + next_maintenance_run_id=getattr(o, "next_maintenance_run_id", None), + node_count=getattr(o, "node_count", None), + non_provisionable_autonomous_container_databases=getattr( + o, "non_provisionable_autonomous_container_databases", None + ), + nsg_ids=getattr(o, "nsg_ids", None), + ocpu_count=getattr(o, "ocpu_count", None), + ocpus_lowest_scaled_value=getattr(o, "ocpus_lowest_scaled_value", None), + provisionable_autonomous_container_databases=getattr( + o, "provisionable_autonomous_container_databases", None + ), + provisioned_autonomous_container_databases=getattr( + o, "provisioned_autonomous_container_databases", None + ), + provisioned_cpus=getattr(o, "provisioned_cpus", None), + reclaimable_cpus=getattr(o, "reclaimable_cpus", None), + reserved_cpus=getattr(o, "reserved_cpus", None), + scan_listener_port_non_tls=getattr(o, "scan_listener_port_non_tls", None), + scan_listener_port_tls=getattr(o, "scan_listener_port_tls", None), + security_attributes=getattr(o, "security_attributes", None), + shape=getattr(o, "shape", None), + subnet_id=getattr(o, "subnet_id", None), + time_created=getattr(o, "time_created", None), + time_database_ssl_certificate_expires=getattr( + o, "time_database_ssl_certificate_expires", None + ), + time_ords_certificate_expires=getattr( + o, "time_ords_certificate_expires", None + ), + time_updated=getattr(o, "time_updated", None), + total_autonomous_data_storage_in_tbs=getattr( + o, "total_autonomous_data_storage_in_tbs", None + ), + total_container_databases=getattr(o, "total_container_databases", None), + total_cpus=getattr(o, "total_cpus", None), + ) + + +class CloudExadataInfrastructureSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.CloudExadataInfrastructureSummary.""" + + activated_storage_count: Optional[int] = Field( + None, + description="The requested number of additional storage servers activated for the Exadata infrastructure.", + ) + additional_storage_count: Optional[int] = Field( + None, + description="The requested number of additional storage servers for the Exadata infrastructure.", + ) + availability_domain: Optional[str] = Field( + None, + description="**[Required]** Gets the availability_domain of this CloudExadataInfrastructureSummary. The name of the availability domain that the cloud Exadata infrastructure resource is located in.", + ) + available_storage_size_in_gbs: Optional[int] = Field( + None, + description="The available storage can be allocated to the cloud Exadata infrastructure resource, in gigabytes (GB).", + ) + cluster_placement_group_id: Optional[str] = Field( + None, + description="The `OCID`__ of the cluster placement group of the Exadata Infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this CloudExadataInfrastructureSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compute_count: Optional[int] = Field( + None, + description="The number of compute servers for the cloud Exadata infrastructure.", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous Database. This is required if using the `computeCount` parameter. If using `cpuCoreCount` then it is an error to specify `computeModel` to a non-null value. ECPU compute model is the recommended model and OCPU compute model is legacy. Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + cpu_count: Optional[int] = Field( + None, description="The total number of CPU cores allocated." + ) + customer_contacts: Optional[list[str]] = Field( + None, + description="The list of customer email addresses that receive information from Oracle about the specified OCI Database service resource. Oracle uses these email addresses to send notifications about planned and unplanned software maintenance updates, information about system hardware, and other information needed by administrators. Up to 10 email addresses can be added to the customer contacts for a cloud Exadata infrastructure instance.", + ) + data_storage_size_in_tbs: Optional[float] = Field( + None, description="Size, in terabytes, of the DATA disk group." + ) + database_server_type: Optional[str] = Field( + None, description="The database server type of the Exadata infrastructure." + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, description="The local node storage allocated in GBs." + ) + db_server_version: Optional[str] = Field( + None, + description="The software version of the database servers (dom0) in the cloud Exadata infrastructure. Example: 20.1.15", + ) + defined_file_system_configurations: Optional[list[dict]] = Field( + None, + description="Details of the file system configuration of the Exadata infrastructure.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this CloudExadataInfrastructureSummary. The user-friendly name for the cloud Exadata infrastructure resource. The name does not need to be unique.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this CloudExadataInfrastructureSummary. The `OCID`__ of the cloud Exadata infrastructure resource. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_scheduling_policy_associated: Optional[bool] = Field( + None, + description="If true, the infrastructure is using granular maintenance scheduling preference.", + ) + last_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this CloudExadataInfrastructureSummary. The current lifecycle state of the cloud Exadata infrastructure resource. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + maintenance_window: Optional[int] = Field(None, description="") + max_cpu_count: Optional[int] = Field( + None, description="The total number of CPU cores available." + ) + max_data_storage_in_tbs: Optional[float] = Field( + None, description="The total available DATA disk group size." + ) + max_db_node_storage_in_gbs: Optional[int] = Field( + None, description="The total local node storage available in GBs." + ) + max_memory_in_gbs: Optional[int] = Field( + None, description="The total memory available in GBs." + ) + memory_size_in_gbs: Optional[int] = Field( + None, description="The memory allocated in GBs." + ) + monthly_db_server_version: Optional[str] = Field( + None, + description="The monthly software version of the database servers (dom0) in the cloud Exadata infrastructure. Example: 20.1.15", + ) + monthly_storage_server_version: Optional[str] = Field( + None, + description="The monthly software version of the storage servers (cells) in the cloud Exadata infrastructure. Example: 20.1.15", + ) + next_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the next maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + shape: Optional[str] = Field( + None, + description="**[Required]** Gets the shape of this CloudExadataInfrastructureSummary. The model name of the cloud Exadata infrastructure resource.", + ) + storage_count: Optional[int] = Field( + None, + description="The number of storage servers for the cloud Exadata infrastructure.", + ) + storage_server_type: Optional[str] = Field( + None, description="The storage server type of the Exadata infrastructure." + ) + storage_server_version: Optional[str] = Field( + None, + description="The software version of the storage servers (cells) in the cloud Exadata infrastructure. Example: 20.1.15", + ) + subscription_id: Optional[str] = Field( + None, + description="The `OCID`__ of the subscription with which resource needs to be associated with. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + system_tags: Optional[str] = Field( + None, + description="System tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + time_created: Optional[datetime] = Field( + None, + description="The date and time the cloud Exadata infrastructure resource was created.", + ) + total_storage_size_in_gbs: Optional[int] = Field( + None, + description="The total storage allocated to the cloud Exadata infrastructure resource, in gigabytes (GB).", + ) + + +def map_cloudexadatainfrastructuresummary( + o: oci.database.models.CloudExadataInfrastructureSummary, +) -> CloudExadataInfrastructureSummary | None: + """Map oci.database.models.CloudExadataInfrastructureSummary → CloudExadataInfrastructureSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return CloudExadataInfrastructureSummary(**data) + except Exception: + return CloudExadataInfrastructureSummary( + activated_storage_count=getattr(o, "activated_storage_count", None), + additional_storage_count=getattr(o, "additional_storage_count", None), + availability_domain=getattr(o, "availability_domain", None), + available_storage_size_in_gbs=getattr( + o, "available_storage_size_in_gbs", None + ), + cluster_placement_group_id=getattr(o, "cluster_placement_group_id", None), + compartment_id=getattr(o, "compartment_id", None), + compute_count=getattr(o, "compute_count", None), + compute_model=getattr(o, "compute_model", None), + cpu_count=getattr(o, "cpu_count", None), + customer_contacts=getattr(o, "customer_contacts", None), + data_storage_size_in_tbs=getattr(o, "data_storage_size_in_tbs", None), + database_server_type=getattr(o, "database_server_type", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_server_version=getattr(o, "db_server_version", None), + defined_file_system_configurations=getattr( + o, "defined_file_system_configurations", None + ), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + is_scheduling_policy_associated=getattr( + o, "is_scheduling_policy_associated", None + ), + last_maintenance_run_id=getattr(o, "last_maintenance_run_id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + maintenance_window=getattr(o, "maintenance_window", None), + max_cpu_count=getattr(o, "max_cpu_count", None), + max_data_storage_in_tbs=getattr(o, "max_data_storage_in_tbs", None), + max_db_node_storage_in_gbs=getattr(o, "max_db_node_storage_in_gbs", None), + max_memory_in_gbs=getattr(o, "max_memory_in_gbs", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + monthly_db_server_version=getattr(o, "monthly_db_server_version", None), + monthly_storage_server_version=getattr( + o, "monthly_storage_server_version", None + ), + next_maintenance_run_id=getattr(o, "next_maintenance_run_id", None), + shape=getattr(o, "shape", None), + storage_count=getattr(o, "storage_count", None), + storage_server_type=getattr(o, "storage_server_type", None), + storage_server_version=getattr(o, "storage_server_version", None), + subscription_id=getattr(o, "subscription_id", None), + system_tags=getattr(o, "system_tags", None), + time_created=getattr(o, "time_created", None), + total_storage_size_in_gbs=getattr(o, "total_storage_size_in_gbs", None), + ) + + +class UpdateSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.UpdateSummary.""" + + available_actions: Optional[str] = Field( + None, + description='The possible actions performed by the update operation on the infrastructure components. Allowed values for items in this list are: "ROLLING_APPLY", "NON_ROLLING_APPLY", "PRECHECK", "ROLLBACK", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + description: Optional[str] = Field( + None, + description="**[Required]** Gets the description of this UpdateSummary. Details of the maintenance update package.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this UpdateSummary. The `OCID`__ of the maintenance update. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + last_action: Optional[str] = Field( + None, + description='The previous update action performed. Allowed values for this property are: "ROLLING_APPLY", "NON_ROLLING_APPLY", "PRECHECK", "ROLLBACK", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + lifecycle_details: Optional[str] = Field( + None, + description="Descriptive text providing additional details about the lifecycle state.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the maintenance update. Dependent on value of `lastAction`. Allowed values for this property are: "AVAILABLE", "SUCCESS", "IN_PROGRESS", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_released: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_released of this UpdateSummary. The date and time the maintenance update was released.", + ) + update_type: Optional[str] = Field( + None, + description='**[Required]** Gets the update_type of this UpdateSummary. The type of cloud VM cluster maintenance update. Allowed values for this property are: "GI_UPGRADE", "GI_PATCH", "OS_UPDATE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this UpdateSummary. The version of the maintenance update package.", + ) + + +def map_updatesummary(o: oci.database.models.UpdateSummary) -> UpdateSummary | None: + """Map oci.database.models.UpdateSummary → UpdateSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return UpdateSummary(**data) + except Exception: + return UpdateSummary( + available_actions=getattr(o, "available_actions", None), + description=getattr(o, "description", None), + id=getattr(o, "id", None), + last_action=getattr(o, "last_action", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + time_released=getattr(o, "time_released", None), + update_type=getattr(o, "update_type", None), + version=getattr(o, "version", None), + ) + + +class CloudVmClusterSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.CloudVmClusterSummary.""" + + availability_domain: Optional[str] = Field( + None, + description="**[Required]** Gets the availability_domain of this CloudVmClusterSummary. The name of the availability domain that the cloud Exadata infrastructure resource is located in.", + ) + backup_network_nsg_ids: Optional[str] = Field( + None, + description="A list of the `OCIDs`__ of the network security groups (NSGs) that the backup network of this DB system belongs to. Setting this to an empty array after the list is created removes the resource from all NSGs. For more information about NSGs, see `Security Rules`__. Applicable only to Exadata systems. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/Network/Concepts/securityrules.htm", + ) + backup_subnet_id: Optional[str] = Field( + None, + description="The `OCID`__ of the backup network subnet associated with the cloud VM cluster. **Subnet Restriction:** See the subnet restrictions information for **subnetId**. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + cloud_automation_update_details: Optional[datetime] = Field(None, description="") + cloud_exadata_infrastructure_id: Optional[str] = Field( + None, + description="**[Required]** Gets the cloud_exadata_infrastructure_id of this CloudVmClusterSummary. The `OCID`__ of the cloud Exadata infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + cluster_name: Optional[str] = Field( + None, + description="The cluster name for cloud VM cluster. The cluster name must begin with an alphabetic character, and may contain hyphens (-). Underscores (_) are not permitted. The cluster name can be no longer than 11 characters and is not case sensitive.", + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this CloudVmClusterSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous Database. This is required if using the `computeCount` parameter. If using `cpuCoreCount` then it is an error to specify `computeModel` to a non-null value. ECPU compute model is the recommended model and OCPU compute model is legacy. Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + cpu_core_count: Optional[int] = Field( + None, + description="**[Required]** Gets the cpu_core_count of this CloudVmClusterSummary. The number of CPU cores enabled on the cloud VM cluster.", + ) + data_collection_options: Optional[dict] = Field(None, description="") + data_storage_percentage: Optional[int] = Field( + None, + description="The percentage assigned to DATA storage (user data and database files). The remaining percentage is assigned to RECO storage (database redo logs, archive logs, and recovery manager backups). Accepted values are 35, 40, 60 and 80. The default is 80 percent assigned to DATA storage. See `Storage Configuration`__ in the Exadata documentation for details on the impact of the configuration settings on storage. __ https://docs.cloud.oracle.com/Content/Database/Concepts/exaoverview.htm#Exadata", + ) + data_storage_size_in_tbs: Optional[float] = Field( + None, description="The data disk group size to be allocated in TBs." + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, description="The local node storage to be allocated in GBs." + ) + db_servers: Optional[str] = Field(None, description="The list of DB servers.") + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + disk_redundancy: Optional[str] = Field( + None, + description="The type of redundancy configured for the cloud Vm cluster. NORMAL is 2-way redundancy. HIGH is 3-way redundancy. Allowed values for this property are: \"HIGH\", \"NORMAL\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this CloudVmClusterSummary. The user-friendly name for the cloud VM cluster. The name does not need to be unique.", + ) + domain: Optional[str] = Field( + None, + description="**[Required]** Gets the domain of this CloudVmClusterSummary. The domain name for the cloud VM cluster.", + ) + file_system_configuration_details: Optional[list[dict]] = Field( + None, description="Details of the file system configuration of the VM cluster." + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + gi_software_image_id: Optional[str] = Field( + None, + description="The `OCID`__ of a grid infrastructure software image. This is a database software image of the type `GRID_IMAGE`. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + gi_version: Optional[str] = Field( + None, description="A valid Oracle Grid Infrastructure (GI) software version." + ) + hostname: Optional[str] = Field( + None, + description="**[Required]** Gets the hostname of this CloudVmClusterSummary. The hostname for the cloud VM cluster.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this CloudVmClusterSummary. The `OCID`__ of the cloud VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_local_backup_enabled: Optional[bool] = Field( + None, + description="If true, database backup on local Exadata storage is configured for the cloud VM cluster. If false, database backup on local Exadata storage is not available in the cloud VM cluster.", + ) + is_sparse_diskgroup_enabled: Optional[bool] = Field( + None, + description="If true, sparse disk group is configured for the cloud VM cluster. If false, sparse disk group is not created.", + ) + last_update_history_entry_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance update history entry. This value is updated when a maintenance update starts. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + license_model: Optional[str] = Field( + None, + description="The Oracle license model that applies to the cloud VM cluster. The default is LICENSE_INCLUDED. Allowed values for this property are: \"LICENSE_INCLUDED\", \"BRING_YOUR_OWN_LICENSE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this CloudVmClusterSummary. The current state of the cloud VM cluster. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + listener_port: Optional[int] = Field( + None, + description="The port number configured for the listener on the cloud VM cluster.", + ) + memory_size_in_gbs: Optional[int] = Field( + None, description="The memory to be allocated in GBs." + ) + node_count: Optional[int] = Field( + None, description="The number of nodes in the cloud VM cluster." + ) + nsg_ids: Optional[str] = Field( + None, + description="The list of `OCIDs`__ for the network security groups (NSGs) to which this resource belongs. Setting this to an empty list removes all resources from all NSGs. For more information about NSGs, see `Security Rules`__. **NsgIds restrictions:** - A network security group (NSG) is optional for Autonomous Databases with private access. The nsgIds list can be empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/Network/Concepts/securityrules.htm", + ) + ocpu_count: Optional[float] = Field( + None, + description="The number of OCPU cores to enable on the cloud VM cluster. Only 1 decimal place is allowed for the fractional part.", + ) + scan_dns_name: Optional[str] = Field( + None, + description="The FQDN of the DNS record for the SCAN IP addresses that are associated with the cloud VM cluster.", + ) + scan_dns_record_id: Optional[str] = Field( + None, + description="The `OCID`__ of the DNS record for the SCAN IP addresses that are associated with the cloud VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + scan_ip_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the Single Client Access Name (SCAN) IP addresses associated with the cloud VM cluster. SCAN IP addresses are typically used for load balancing and are not assigned to any interface. Oracle Clusterware directs the requests to the appropriate nodes in the cluster. **Note:** For a single-node DB system, this list is empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + scan_listener_port_tcp: Optional[int] = Field( + None, + description="The TCP Single Client Access Name (SCAN) port. The default port is 1521.", + ) + scan_listener_port_tcp_ssl: Optional[int] = Field( + None, + description="The TCPS Single Client Access Name (SCAN) port. The default port is 2484.", + ) + security_attributes: Optional[str] = Field( + None, + description='Security Attributes for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. Example: `{"Oracle-ZPR": {"MaxEgressCount": {"value": "42", "mode": "audit"}}}` __ https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm', + ) + shape: Optional[str] = Field( + None, + description="**[Required]** Gets the shape of this CloudVmClusterSummary. The model name of the Exadata hardware running the cloud VM cluster.", + ) + ssh_public_keys: Optional[str] = Field( + None, + description="**[Required]** Gets the ssh_public_keys of this CloudVmClusterSummary. The public key portion of one or more key pairs used for SSH access to the cloud VM cluster.", + ) + storage_size_in_gbs: Optional[int] = Field( + None, + description="The storage allocation for the disk group, in gigabytes (GB).", + ) + subnet_id: Optional[str] = Field( + None, + description="**[Required]** Gets the subnet_id of this CloudVmClusterSummary. The `OCID`__ of the subnet associated with the cloud VM cluster. **Subnet Restrictions:** - For Exadata and virtual machine 2-node RAC systems, do not use a subnet that overlaps with 192.168.128.0/20. These subnets are used by the Oracle Clusterware private interconnect on the database instance. Specifying an overlapping subnet will cause the private interconnect to malfunction. This restriction applies to both the client subnet and backup subnet. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + subscription_id: Optional[str] = Field( + None, + description="The `OCID`__ of the subscription with which resource needs to be associated with. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + system_tags: Optional[str] = Field( + None, + description="System tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + system_version: Optional[str] = Field( + None, description="Operating system version of the image." + ) + time_created: Optional[datetime] = Field( + None, description="The date and time that the cloud VM cluster was created." + ) + time_zone: Optional[str] = Field( + None, + description="The time zone of the cloud VM cluster. For details, see `Exadata Infrastructure Time Zones`__. __ https://docs.cloud.oracle.com/Content/Database/References/timezones.htm", + ) + vip_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the virtual IP (VIP) addresses associated with the cloud VM cluster. The Cluster Ready Services (CRS) creates and maintains one VIP address for each node in the Exadata Cloud Service instance to enable failover. If one node fails, the VIP is reassigned to another active node in the cluster. **Note:** For a single-node DB system, this list is empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + zone_id: Optional[str] = Field( + None, + description="The OCID of the zone the cloud VM cluster is associated with.", + ) + + +def map_cloudvmclustersummary( + o: oci.database.models.CloudVmClusterSummary, +) -> CloudVmClusterSummary | None: + """Map oci.database.models.CloudVmClusterSummary → CloudVmClusterSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return CloudVmClusterSummary(**data) + except Exception: + return CloudVmClusterSummary( + availability_domain=getattr(o, "availability_domain", None), + backup_network_nsg_ids=getattr(o, "backup_network_nsg_ids", None), + backup_subnet_id=getattr(o, "backup_subnet_id", None), + cloud_automation_update_details=getattr( + o, "cloud_automation_update_details", None + ), + cloud_exadata_infrastructure_id=getattr( + o, "cloud_exadata_infrastructure_id", None + ), + cluster_name=getattr(o, "cluster_name", None), + compartment_id=getattr(o, "compartment_id", None), + compute_model=getattr(o, "compute_model", None), + cpu_core_count=getattr(o, "cpu_core_count", None), + data_collection_options=getattr(o, "data_collection_options", None), + data_storage_percentage=getattr(o, "data_storage_percentage", None), + data_storage_size_in_tbs=getattr(o, "data_storage_size_in_tbs", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_servers=getattr(o, "db_servers", None), + defined_tags=getattr(o, "defined_tags", None), + disk_redundancy=getattr(o, "disk_redundancy", None), + display_name=getattr(o, "display_name", None), + domain=getattr(o, "domain", None), + file_system_configuration_details=getattr( + o, "file_system_configuration_details", None + ), + freeform_tags=getattr(o, "freeform_tags", None), + gi_software_image_id=getattr(o, "gi_software_image_id", None), + gi_version=getattr(o, "gi_version", None), + hostname=getattr(o, "hostname", None), + id=getattr(o, "id", None), + is_local_backup_enabled=getattr(o, "is_local_backup_enabled", None), + is_sparse_diskgroup_enabled=getattr(o, "is_sparse_diskgroup_enabled", None), + last_update_history_entry_id=getattr( + o, "last_update_history_entry_id", None + ), + license_model=getattr(o, "license_model", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + listener_port=getattr(o, "listener_port", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + node_count=getattr(o, "node_count", None), + nsg_ids=getattr(o, "nsg_ids", None), + ocpu_count=getattr(o, "ocpu_count", None), + scan_dns_name=getattr(o, "scan_dns_name", None), + scan_dns_record_id=getattr(o, "scan_dns_record_id", None), + scan_ip_ids=getattr(o, "scan_ip_ids", None), + scan_listener_port_tcp=getattr(o, "scan_listener_port_tcp", None), + scan_listener_port_tcp_ssl=getattr(o, "scan_listener_port_tcp_ssl", None), + security_attributes=getattr(o, "security_attributes", None), + shape=getattr(o, "shape", None), + ssh_public_keys=getattr(o, "ssh_public_keys", None), + storage_size_in_gbs=getattr(o, "storage_size_in_gbs", None), + subnet_id=getattr(o, "subnet_id", None), + subscription_id=getattr(o, "subscription_id", None), + system_tags=getattr(o, "system_tags", None), + system_version=getattr(o, "system_version", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + vip_ids=getattr(o, "vip_ids", None), + zone_id=getattr(o, "zone_id", None), + ) + + +class ConsoleConnectionSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ConsoleConnectionSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ConsoleConnectionSummary. The OCID of the compartment to contain the console connection.", + ) + connection_string: Optional[str] = Field( + None, + description="**[Required]** Gets the connection_string of this ConsoleConnectionSummary. The SSH connection string for the console connection.", + ) + db_node_id: Optional[str] = Field( + None, + description="**[Required]** Gets the db_node_id of this ConsoleConnectionSummary. The OCID of the database node.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + fingerprint: Optional[str] = Field( + None, + description="**[Required]** Gets the fingerprint of this ConsoleConnectionSummary. The SSH public key fingerprint for the console connection.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ConsoleConnectionSummary. The OCID of the console connection.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ConsoleConnectionSummary. The current state of the console connection. Allowed values for this property are: "ACTIVE", "CREATING", "DELETED", "DELETING", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + service_host_key_fingerprint: Optional[str] = Field( + None, + description="The SSH public key's fingerprint for the console connection service host.", + ) + + +def map_consoleconnectionsummary( + o: oci.database.models.ConsoleConnectionSummary, +) -> ConsoleConnectionSummary | None: + """Map oci.database.models.ConsoleConnectionSummary → ConsoleConnectionSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ConsoleConnectionSummary(**data) + except Exception: + return ConsoleConnectionSummary( + compartment_id=getattr(o, "compartment_id", None), + connection_string=getattr(o, "connection_string", None), + db_node_id=getattr(o, "db_node_id", None), + defined_tags=getattr(o, "defined_tags", None), + fingerprint=getattr(o, "fingerprint", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + service_host_key_fingerprint=getattr( + o, "service_host_key_fingerprint", None + ), + ) + + +class ConsoleHistoryCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ConsoleHistoryCollection.""" + + items: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the items of this ConsoleHistoryCollection. List of Db Node console histories.", + ) + + +def map_consolehistorycollection( + o: oci.database.models.ConsoleHistoryCollection, +) -> ConsoleHistoryCollection | None: + """Map oci.database.models.ConsoleHistoryCollection → ConsoleHistoryCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ConsoleHistoryCollection(**data) + except Exception: + return ConsoleHistoryCollection( + items=getattr(o, "items", None), + ) + + +class AutonomousPatchSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.AutonomousPatchSummary.""" + + autonomous_patch_type: Optional[str] = Field( + None, + description='Maintenance run type, either "QUARTERLY" or "TIMEZONE". Allowed values for this property are: "QUARTERLY", "TIMEZONE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + description: Optional[str] = Field( + None, + description="**[Required]** Gets the description of this AutonomousPatchSummary. The text describing this patch package.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this AutonomousPatchSummary. The `OCID`__ of the patch. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, + description="A descriptive text associated with the lifecycleState. Typically can contain additional displayable text.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the patch as a result of lastAction. Allowed values for this property are: "AVAILABLE", "SUCCESS", "IN_PROGRESS", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + patch_model: Optional[str] = Field( + None, + description="Database patching model preference. See `My Oracle Support note 2285040.1`__ for information on the Release Update (RU) and Release Update Revision (RUR) patching models. __ https://support.oracle.com/rs?type=doc&id=2285040.1 Allowed values for this property are: \"RELEASE_UPDATES\", \"RELEASE_UPDATE_REVISIONS\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + quarter: Optional[str] = Field( + None, description="First month of the quarter in which the patch was released." + ) + time_released: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_released of this AutonomousPatchSummary. The date and time that the patch was released.", + ) + type: Optional[str] = Field( + None, + description="**[Required]** Gets the type of this AutonomousPatchSummary. The type of patch. BUNDLE is one example.", + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this AutonomousPatchSummary. The version of this patch package.", + ) + year: Optional[str] = Field( + None, description="Year in which the patch was released." + ) + + +def map_autonomouspatchsummary( + o: oci.database.models.AutonomousPatchSummary, +) -> AutonomousPatchSummary | None: + """Map oci.database.models.AutonomousPatchSummary → AutonomousPatchSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return AutonomousPatchSummary(**data) + except Exception: + return AutonomousPatchSummary( + autonomous_patch_type=getattr(o, "autonomous_patch_type", None), + description=getattr(o, "description", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + patch_model=getattr(o, "patch_model", None), + quarter=getattr(o, "quarter", None), + time_released=getattr(o, "time_released", None), + type=getattr(o, "type", None), + version=getattr(o, "version", None), + year=getattr(o, "year", None), + ) + + +class DataGuardAssociationSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DataGuardAssociationSummary.""" + + apply_lag: Optional[str] = Field( + None, + description="The lag time between updates to the primary database and application of the redo data on the standby database, as computed by the reporting database. Example: `9 seconds`", + ) + apply_rate: Optional[str] = Field( + None, + description="The rate at which redo logs are synced between the associated databases. Example: `180 Mb per second`", + ) + database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the database_id of this DataGuardAssociationSummary. The `OCID`__ of the reporting database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this DataGuardAssociationSummary. The `OCID`__ of the Data Guard association. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_active_data_guard_enabled: Optional[bool] = Field( + None, description="True if active Data Guard is enabled." + ) + lifecycle_details: Optional[str] = Field( + None, + description="Additional information about the current lifecycleState, if available.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this DataGuardAssociationSummary. The current state of the Data Guard association. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "UPGRADING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + peer_data_guard_association_id: Optional[str] = Field( + None, + description="The `OCID`__ of the peer database's Data Guard association. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + peer_database_id: Optional[str] = Field( + None, + description="The `OCID`__ of the associated peer database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + peer_db_home_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Database Home containing the associated peer database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + peer_db_system_id: Optional[str] = Field( + None, + description="**[Required]** Gets the peer_db_system_id of this DataGuardAssociationSummary. The `OCID`__ of the DB system containing the associated peer database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + peer_role: Optional[str] = Field( + None, + description='**[Required]** Gets the peer_role of this DataGuardAssociationSummary. The role of the peer database in this Data Guard association. Allowed values for this property are: "PRIMARY", "STANDBY", "DISABLED_STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + protection_mode: Optional[str] = Field( + None, + description='**[Required]** Gets the protection_mode of this DataGuardAssociationSummary. The protection mode of this Data Guard association. For more information, see `Oracle Data Guard Protection Modes`__ in the Oracle Data Guard documentation. __ http://docs.oracle.com/database/122/SBYDB/oracle-data-guard-protection-modes.htm#SBYDB02000 Allowed values for this property are: "MAXIMUM_AVAILABILITY", "MAXIMUM_PERFORMANCE", "MAXIMUM_PROTECTION", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + role: Optional[str] = Field( + None, + description='**[Required]** Gets the role of this DataGuardAssociationSummary. The role of the reporting database in this Data Guard association. Allowed values for this property are: "PRIMARY", "STANDBY", "DISABLED_STANDBY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the Data Guard association was created." + ) + transport_type: Optional[str] = Field( + None, + description='The redo transport type used by this Data Guard association. For more information, see `Redo Transport Services`__ in the Oracle Data Guard documentation. __ http://docs.oracle.com/database/122/SBYDB/oracle-data-guard-redo-transport-services.htm#SBYDB00400 Allowed values for this property are: "SYNC", "ASYNC", "FASTSYNC", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + + +def map_dataguardassociationsummary( + o: oci.database.models.DataGuardAssociationSummary, +) -> DataGuardAssociationSummary | None: + """Map oci.database.models.DataGuardAssociationSummary → DataGuardAssociationSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DataGuardAssociationSummary(**data) + except Exception: + return DataGuardAssociationSummary( + apply_lag=getattr(o, "apply_lag", None), + apply_rate=getattr(o, "apply_rate", None), + database_id=getattr(o, "database_id", None), + id=getattr(o, "id", None), + is_active_data_guard_enabled=getattr( + o, "is_active_data_guard_enabled", None + ), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + peer_data_guard_association_id=getattr( + o, "peer_data_guard_association_id", None + ), + peer_database_id=getattr(o, "peer_database_id", None), + peer_db_home_id=getattr(o, "peer_db_home_id", None), + peer_db_system_id=getattr(o, "peer_db_system_id", None), + peer_role=getattr(o, "peer_role", None), + protection_mode=getattr(o, "protection_mode", None), + role=getattr(o, "role", None), + time_created=getattr(o, "time_created", None), + transport_type=getattr(o, "transport_type", None), + ) + + +class DatabaseSoftwareImageSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DatabaseSoftwareImageSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this DatabaseSoftwareImageSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + database_software_image_included_patches: Optional[str] = Field( + None, description="List of one-off patches for Database Homes." + ) + database_software_image_one_off_patches: Optional[str] = Field( + None, description="List of one-off patches for Database Homes." + ) + database_version: Optional[str] = Field( + None, + description="**[Required]** Gets the database_version of this DatabaseSoftwareImageSummary. The database version with which the database software image is to be built.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this DatabaseSoftwareImageSummary. The user-friendly name for the database software image. The name does not have to be unique.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this DatabaseSoftwareImageSummary. The `OCID`__ of the database software image. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + image_shape_family: Optional[str] = Field( + None, + description='**[Required]** Gets the image_shape_family of this DatabaseSoftwareImageSummary. To what shape the image is meant for. Allowed values for this property are: "VM_BM_SHAPE", "EXADATA_SHAPE", "EXACC_SHAPE", "EXADBXS_SHAPE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + image_type: Optional[str] = Field( + None, + description="**[Required]** Gets the image_type of this DatabaseSoftwareImageSummary. The type of software image. Can be grid or database. Allowed values for this property are: \"GRID_IMAGE\", \"DATABASE_IMAGE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + included_patches_summary: Optional[str] = Field( + None, + description="The patches included in the image and the version of the image.", + ) + is_upgrade_supported: Optional[bool] = Field( + None, + description="True if this Database software image is supported for Upgrade.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Detailed message for the lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this DatabaseSoftwareImageSummary. The current state of the database software image. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "DELETING", "DELETED", "FAILED", "TERMINATING", "TERMINATED", "UPDATING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + ls_inventory: Optional[str] = Field( + None, + description="The output from the OPatch lsInventory command, which is passed as a string.", + ) + patch_set: Optional[str] = Field( + None, + description="**[Required]** Gets the patch_set of this DatabaseSoftwareImageSummary. The PSU or PBP or Release Updates. To get a list of supported versions, use the :func:`list_db_versions` operation.", + ) + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this DatabaseSoftwareImageSummary. The date and time the database software image was created.", + ) + + +def map_databasesoftwareimagesummary( + o: oci.database.models.DatabaseSoftwareImageSummary, +) -> DatabaseSoftwareImageSummary | None: + """Map oci.database.models.DatabaseSoftwareImageSummary → DatabaseSoftwareImageSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DatabaseSoftwareImageSummary(**data) + except Exception: + return DatabaseSoftwareImageSummary( + compartment_id=getattr(o, "compartment_id", None), + database_software_image_included_patches=getattr( + o, "database_software_image_included_patches", None + ), + database_software_image_one_off_patches=getattr( + o, "database_software_image_one_off_patches", None + ), + database_version=getattr(o, "database_version", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + image_shape_family=getattr(o, "image_shape_family", None), + image_type=getattr(o, "image_type", None), + included_patches_summary=getattr(o, "included_patches_summary", None), + is_upgrade_supported=getattr(o, "is_upgrade_supported", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + ls_inventory=getattr(o, "ls_inventory", None), + patch_set=getattr(o, "patch_set", None), + time_created=getattr(o, "time_created", None), + ) + + +class DatabaseSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DatabaseSummary.""" + + character_set: Optional[str] = Field( + None, description="The character set for the database." + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this DatabaseSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + connection_strings: Optional[str] = Field( + None, + description="The Connection strings used to connect to the Oracle Database.", + ) + data_guard_group: Optional[dict] = Field(None, description="") + database_management_config: Optional[dict] = Field(None, description="") + database_software_image_id: Optional[str] = Field( + None, + description="The database software image `OCID`__ __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + db_backup_config: Optional[dict] = Field(None, description="") + db_home_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Database Home. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + db_name: Optional[str] = Field( + None, + description="**[Required]** Gets the db_name of this DatabaseSummary. The database name.", + ) + db_system_id: Optional[str] = Field( + None, + description="The `OCID`__ of the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + db_unique_name: Optional[str] = Field( + None, + description="**[Required]** Gets the db_unique_name of this DatabaseSummary. A system-generated name for the database to ensure uniqueness within an Oracle Data Guard group (a primary database and its standby databases). The unique name cannot be changed.", + ) + db_workload: Optional[str] = Field( + None, + description="**Deprecated.** The dbWorkload field has been deprecated for Exadata Database Service on Dedicated Infrastructure, Exadata Database Service on Cloud@Customer, and Base Database Service. Support for this attribute will end in November 2023. You may choose to update your custom scripts to exclude the dbWorkload attribute. After November 2023 if you pass a value to the dbWorkload attribute, it will be ignored. The database workload type.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + encryption_key_location_details: Optional[dict] = Field(None, description="") + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this DatabaseSummary. The `OCID`__ of the database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_cdb: Optional[bool] = Field( + None, description="True if the database is a container database." + ) + key_store_id: Optional[str] = Field( + None, + description="The `OCID`__ of the key store of Oracle Vault. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + key_store_wallet_name: Optional[str] = Field( + None, description="The wallet name for Oracle Key Vault." + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + kms_key_version_id: Optional[str] = Field( + None, + description="The OCID of the key container version that is used in database transparent data encryption (TDE) operations KMS Key can have multiple key versions. If none is specified, the current key version (latest) of the Key Id is used for the operation. Autonomous Database Serverless does not use key versions, hence is not applicable for Autonomous Database Serverless instances.", + ) + last_backup_duration_in_seconds: Optional[int] = Field( + None, description="The duration when the latest database backup created." + ) + last_backup_timestamp: Optional[datetime] = Field( + None, + description="The date and time when the latest database backup was created.", + ) + last_failed_backup_timestamp: Optional[datetime] = Field( + None, description="The date and time when the latest database backup failed." + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this DatabaseSummary. The current state of the database. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "BACKUP_IN_PROGRESS", "UPGRADING", "CONVERTING", "TERMINATING", "TERMINATED", "RESTORE_FAILED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + ncharacter_set: Optional[str] = Field( + None, description="The national character set for the database." + ) + pdb_name: Optional[str] = Field( + None, + description="The name of the pluggable database. The name must begin with an alphabetic character and can contain a maximum of thirty alphanumeric characters. Special characters are not permitted. Pluggable database should not be same as database name.", + ) + sid_prefix: Optional[str] = Field( + None, + description="Specifies a prefix for the `Oracle SID` of the database to be created.", + ) + source_database_point_in_time_recovery_timestamp: Optional[datetime] = Field( + None, + description="Point in time recovery timeStamp of the source database at which cloned database system is cloned from the source database system, as described in `RFC 3339`__ __ https://tools.ietf.org/rfc/rfc3339", + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the database was created." + ) + vault_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Oracle Cloud Infrastructure `vault`__. This parameter and `secretId` are required for Customer Managed Keys. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/KeyManagement/Concepts/keyoverview.htm#concepts", + ) + vm_cluster_id: Optional[str] = Field( + None, + description="The `OCID`__ of the VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + + +def map_databasesummary( + o: oci.database.models.DatabaseSummary, +) -> DatabaseSummary | None: + """Map oci.database.models.DatabaseSummary → DatabaseSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DatabaseSummary(**data) + except Exception: + return DatabaseSummary( + character_set=getattr(o, "character_set", None), + compartment_id=getattr(o, "compartment_id", None), + connection_strings=getattr(o, "connection_strings", None), + data_guard_group=getattr(o, "data_guard_group", None), + database_management_config=getattr(o, "database_management_config", None), + database_software_image_id=getattr(o, "database_software_image_id", None), + db_backup_config=getattr(o, "db_backup_config", None), + db_home_id=getattr(o, "db_home_id", None), + db_name=getattr(o, "db_name", None), + db_system_id=getattr(o, "db_system_id", None), + db_unique_name=getattr(o, "db_unique_name", None), + db_workload=getattr(o, "db_workload", None), + defined_tags=getattr(o, "defined_tags", None), + encryption_key_location_details=getattr( + o, "encryption_key_location_details", None + ), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + is_cdb=getattr(o, "is_cdb", None), + key_store_id=getattr(o, "key_store_id", None), + key_store_wallet_name=getattr(o, "key_store_wallet_name", None), + kms_key_id=getattr(o, "kms_key_id", None), + kms_key_version_id=getattr(o, "kms_key_version_id", None), + last_backup_duration_in_seconds=getattr( + o, "last_backup_duration_in_seconds", None + ), + last_backup_timestamp=getattr(o, "last_backup_timestamp", None), + last_failed_backup_timestamp=getattr( + o, "last_failed_backup_timestamp", None + ), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + ncharacter_set=getattr(o, "ncharacter_set", None), + pdb_name=getattr(o, "pdb_name", None), + sid_prefix=getattr(o, "sid_prefix", None), + source_database_point_in_time_recovery_timestamp=getattr( + o, "source_database_point_in_time_recovery_timestamp", None + ), + time_created=getattr(o, "time_created", None), + vault_id=getattr(o, "vault_id", None), + vm_cluster_id=getattr(o, "vm_cluster_id", None), + ) + + +class PatchHistoryEntrySummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.PatchHistoryEntrySummary.""" + + action: Optional[str] = Field( + None, + description="The action being performed or was completed. Allowed values for this property are: \"APPLY\", \"PRECHECK\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this PatchHistoryEntrySummary. The `OCID`__ of the patch history entry. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, + description="A descriptive text associated with the lifecycleState. Typically contains additional displayable text.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this PatchHistoryEntrySummary. The current state of the action. Allowed values for this property are: "IN_PROGRESS", "SUCCEEDED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + patch_id: Optional[str] = Field( + None, + description="**[Required]** Gets the patch_id of this PatchHistoryEntrySummary. The `OCID`__ of the patch. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + patch_type: Optional[str] = Field( + None, + description='The type of Patch operation. Allowed values for this property are: "OS", "DB", "GI", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_ended: Optional[datetime] = Field( + None, description="The date and time when the patch action completed" + ) + time_started: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_started of this PatchHistoryEntrySummary. The date and time when the patch action started.", + ) + + +def map_patchhistoryentrysummary( + o: oci.database.models.PatchHistoryEntrySummary, +) -> PatchHistoryEntrySummary | None: + """Map oci.database.models.PatchHistoryEntrySummary → PatchHistoryEntrySummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return PatchHistoryEntrySummary(**data) + except Exception: + return PatchHistoryEntrySummary( + action=getattr(o, "action", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + patch_id=getattr(o, "patch_id", None), + patch_type=getattr(o, "patch_type", None), + time_ended=getattr(o, "time_ended", None), + time_started=getattr(o, "time_started", None), + ) + + +class PatchSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.PatchSummary.""" + + available_actions: Optional[str] = Field( + None, + description="Actions that can possibly be performed using this patch. Allowed values for items in this list are: \"APPLY\", \"PRECHECK\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + description: Optional[str] = Field( + None, + description="**[Required]** Gets the description of this PatchSummary. The text describing this patch package.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this PatchSummary. The `OCID`__ of the patch. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + last_action: Optional[str] = Field( + None, + description="Action that is currently being performed or was completed last. Allowed values for this property are: \"APPLY\", \"PRECHECK\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + lifecycle_details: Optional[str] = Field( + None, + description="A descriptive text associated with the lifecycleState. Typically can contain additional displayable text.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the patch as a result of lastAction. Allowed values for this property are: "AVAILABLE", "SUCCESS", "IN_PROGRESS", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_released: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_released of this PatchSummary. The date and time that the patch was released.", + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this PatchSummary. The version of this patch package.", + ) + + +def map_patchsummary(o: oci.database.models.PatchSummary) -> PatchSummary | None: + """Map oci.database.models.PatchSummary → PatchSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return PatchSummary(**data) + except Exception: + return PatchSummary( + available_actions=getattr(o, "available_actions", None), + description=getattr(o, "description", None), + id=getattr(o, "id", None), + last_action=getattr(o, "last_action", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + time_released=getattr(o, "time_released", None), + version=getattr(o, "version", None), + ) + + +class DbHomeSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DbHomeSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this DbHomeSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + database_software_image_id: Optional[str] = Field( + None, + description="The database software image `OCID`__ __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + db_home_location: Optional[str] = Field( + None, + description="**[Required]** Gets the db_home_location of this DbHomeSummary. The location of the Oracle Database Home.", + ) + db_system_id: Optional[str] = Field( + None, + description="The `OCID`__ of the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + db_version: Optional[str] = Field( + None, + description="**[Required]** Gets the db_version of this DbHomeSummary. The Oracle Database version.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this DbHomeSummary. The user-provided name for the Database Home. The name does not need to be unique.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this DbHomeSummary. The `OCID`__ of the Database Home. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_unified_auditing_enabled: Optional[bool] = Field( + None, description="Indicates whether unified autiding is enabled or not." + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + last_patch_history_entry_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last patch history. This value is updated as soon as a patch operation is started. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this DbHomeSummary. The current state of the Database Home. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + one_off_patches: Optional[str] = Field( + None, description="List of one-off patches for Database Homes." + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the Database Home was created." + ) + vm_cluster_id: Optional[str] = Field( + None, + description="The `OCID`__ of the VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + + +def map_dbhomesummary(o: oci.database.models.DbHomeSummary) -> DbHomeSummary | None: + """Map oci.database.models.DbHomeSummary → DbHomeSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DbHomeSummary(**data) + except Exception: + return DbHomeSummary( + compartment_id=getattr(o, "compartment_id", None), + database_software_image_id=getattr(o, "database_software_image_id", None), + db_home_location=getattr(o, "db_home_location", None), + db_system_id=getattr(o, "db_system_id", None), + db_version=getattr(o, "db_version", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + is_unified_auditing_enabled=getattr(o, "is_unified_auditing_enabled", None), + kms_key_id=getattr(o, "kms_key_id", None), + last_patch_history_entry_id=getattr(o, "last_patch_history_entry_id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + one_off_patches=getattr(o, "one_off_patches", None), + time_created=getattr(o, "time_created", None), + vm_cluster_id=getattr(o, "vm_cluster_id", None), + ) + + +class DbNodeSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DbNodeSummary.""" + + additional_details: Optional[str] = Field( + None, description="Additional information about the planned maintenance." + ) + backup_ip_id: Optional[str] = Field( + None, + description="The `OCID`__ of the backup IP address associated with the database node. Use this OCID with either the :func:`get_private_ip` or the :func:`get_public_ip_by_private_ip_id` API to get the IP address needed to make a database connection. **Note:** Applies only to Exadata Cloud Service. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + backup_vnic2_id: Optional[str] = Field( + None, + description="The `OCID`__ of the second backup VNIC. **Note:** Applies only to Exadata Cloud Service. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + backup_vnic_id: Optional[str] = Field( + None, + description="The `OCID`__ of the backup VNIC. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + cpu_core_count: Optional[int] = Field( + None, description="The number of CPU cores enabled on the Db node." + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, description="The allocated local node storage in GBs on the Db node." + ) + db_server_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Exacc Db server associated with the database node. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + db_system_id: Optional[str] = Field( + None, + description="**[Required]** Gets the db_system_id of this DbNodeSummary. The `OCID`__ of the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + fault_domain: Optional[str] = Field( + None, description="The name of the Fault Domain the instance is contained in." + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + host_ip_id: Optional[str] = Field( + None, + description="The `OCID`__ of the host IP address associated with the database node. Use this OCID with either the :func:`get_private_ip` or the :func:`get_public_ip_by_private_ip_id` API to get the IP address needed to make a database connection. **Note:** Applies only to Exadata Cloud Service. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + hostname: Optional[str] = Field( + None, description="The host name for the database node." + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this DbNodeSummary. The `OCID`__ of the database node. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this DbNodeSummary. The current state of the database node. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "STOPPING", "STOPPED", "STARTING", "TERMINATING", "TERMINATED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + maintenance_type: Optional[str] = Field( + None, + description="The type of database node maintenance. Allowed values for this property are: \"VMDB_REBOOT_MIGRATION\", \"EXADBXS_REBOOT_MIGRATION\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + memory_size_in_gbs: Optional[int] = Field( + None, description="The allocated memory in GBs on the Db node." + ) + software_storage_size_in_gb: Optional[int] = Field( + None, + description="The size (in GB) of the block storage volume allocation for the DB system. This attribute applies only for virtual machine DB systems.", + ) + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this DbNodeSummary. The date and time that the database node was created.", + ) + time_maintenance_window_end: Optional[datetime] = Field( + None, description="End date and time of maintenance window." + ) + time_maintenance_window_start: Optional[datetime] = Field( + None, description="Start date and time of maintenance window." + ) + total_cpu_core_count: Optional[int] = Field( + None, description="The total number of CPU cores reserved on the Db node." + ) + vnic2_id: Optional[str] = Field( + None, + description="The `OCID`__ of the second VNIC. **Note:** Applies only to Exadata Cloud Service. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + vnic_id: Optional[str] = Field( + None, + description="**[Required]** Gets the vnic_id of this DbNodeSummary. The `OCID`__ of the VNIC. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + + +def map_dbnodesummary(o: oci.database.models.DbNodeSummary) -> DbNodeSummary | None: + """Map oci.database.models.DbNodeSummary → DbNodeSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DbNodeSummary(**data) + except Exception: + return DbNodeSummary( + additional_details=getattr(o, "additional_details", None), + backup_ip_id=getattr(o, "backup_ip_id", None), + backup_vnic2_id=getattr(o, "backup_vnic2_id", None), + backup_vnic_id=getattr(o, "backup_vnic_id", None), + cpu_core_count=getattr(o, "cpu_core_count", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_server_id=getattr(o, "db_server_id", None), + db_system_id=getattr(o, "db_system_id", None), + defined_tags=getattr(o, "defined_tags", None), + fault_domain=getattr(o, "fault_domain", None), + freeform_tags=getattr(o, "freeform_tags", None), + host_ip_id=getattr(o, "host_ip_id", None), + hostname=getattr(o, "hostname", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + maintenance_type=getattr(o, "maintenance_type", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + software_storage_size_in_gb=getattr(o, "software_storage_size_in_gb", None), + time_created=getattr(o, "time_created", None), + time_maintenance_window_end=getattr(o, "time_maintenance_window_end", None), + time_maintenance_window_start=getattr( + o, "time_maintenance_window_start", None + ), + total_cpu_core_count=getattr(o, "total_cpu_core_count", None), + vnic2_id=getattr(o, "vnic2_id", None), + vnic_id=getattr(o, "vnic_id", None), + ) + + +class DbServerSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DbServerSummary.""" + + autonomous_virtual_machine_ids: Optional[str] = Field( + None, + description="The list of `OCIDs`__ of the Autonomous Virtual Machines associated with the Db server. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + autonomous_vm_cluster_ids: Optional[str] = Field( + None, + description="The list of `OCIDs`__ of the Autonomous VM Clusters associated with the Db server. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compartment_id: Optional[str] = Field( + None, + description="The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous Database. This is required if using the `computeCount` parameter. If using `cpuCoreCount` then it is an error to specify `computeModel` to a non-null value. ECPU compute model is the recommended model and OCPU compute model is legacy. Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + cpu_core_count: Optional[int] = Field( + None, description="The number of CPU cores enabled on the Db server." + ) + db_node_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the Db nodes associated with the Db server. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, description="The allocated local node storage in GBs on the Db server." + ) + db_server_patching_details: Optional[dict] = Field(None, description="") + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="The user-friendly name for the Db server. The name does not need to be unique.", + ) + exadata_infrastructure_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Exadata infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="The `OCID`__ of the Db server. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the Db server. Allowed values for this property are: "CREATING", "AVAILABLE", "UNAVAILABLE", "DELETING", "DELETED", "MAINTENANCE_IN_PROGRESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + max_cpu_count: Optional[int] = Field( + None, description="The total number of CPU cores available." + ) + max_db_node_storage_in_gbs: Optional[int] = Field( + None, description="The total local node storage available in GBs." + ) + max_memory_in_gbs: Optional[int] = Field( + None, description="The total memory available in GBs." + ) + memory_size_in_gbs: Optional[int] = Field( + None, description="The allocated memory in GBs on the Db server." + ) + shape: Optional[str] = Field( + None, + description="The shape of the Db server. The shape determines the amount of CPU, storage, and memory resources available.", + ) + time_created: Optional[datetime] = Field( + None, description="The date and time that the Db Server was created." + ) + vm_cluster_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the VM Clusters associated with the Db server. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + + +def map_dbserversummary( + o: oci.database.models.DbServerSummary, +) -> DbServerSummary | None: + """Map oci.database.models.DbServerSummary → DbServerSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DbServerSummary(**data) + except Exception: + return DbServerSummary( + autonomous_virtual_machine_ids=getattr( + o, "autonomous_virtual_machine_ids", None + ), + autonomous_vm_cluster_ids=getattr(o, "autonomous_vm_cluster_ids", None), + compartment_id=getattr(o, "compartment_id", None), + compute_model=getattr(o, "compute_model", None), + cpu_core_count=getattr(o, "cpu_core_count", None), + db_node_ids=getattr(o, "db_node_ids", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_server_patching_details=getattr(o, "db_server_patching_details", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + exadata_infrastructure_id=getattr(o, "exadata_infrastructure_id", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + max_cpu_count=getattr(o, "max_cpu_count", None), + max_db_node_storage_in_gbs=getattr(o, "max_db_node_storage_in_gbs", None), + max_memory_in_gbs=getattr(o, "max_memory_in_gbs", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + shape=getattr(o, "shape", None), + time_created=getattr(o, "time_created", None), + vm_cluster_ids=getattr(o, "vm_cluster_ids", None), + ) + + +class DbSystemComputePerformanceSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DbSystemComputePerformanceSummary.""" + + compute_performance_list: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the compute_performance_list of this DbSystemComputePerformanceSummary. List of Compute performance details for the specified DB system shape.", + ) + shape: Optional[str] = Field( + None, + description="**[Required]** Gets the shape of this DbSystemComputePerformanceSummary. The shape of the DB system.", + ) + + +def map_dbsystemcomputeperformancesummary( + o: oci.database.models.DbSystemComputePerformanceSummary, +) -> DbSystemComputePerformanceSummary | None: + """Map oci.database.models.DbSystemComputePerformanceSummary → DbSystemComputePerformanceSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DbSystemComputePerformanceSummary(**data) + except Exception: + return DbSystemComputePerformanceSummary( + compute_performance_list=getattr(o, "compute_performance_list", None), + shape=getattr(o, "shape", None), + ) + + +class DbSystemShapeSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DbSystemShapeSummary.""" + + are_server_types_supported: Optional[bool] = Field( + None, + description="If true, the shape supports configurable DB and Storage Server types.", + ) + available_core_count: Optional[int] = Field( + None, + description="**[Required]** Gets the available_core_count of this DbSystemShapeSummary. The maximum number of CPU cores that can be enabled on the DB system for this shape.", + ) + available_core_count_per_node: Optional[int] = Field( + None, + description="The maximum number of CPU cores per database node that can be enabled for this shape. Only applicable to the flex Exadata shape, ExaCC Elastic shapes and VM Flex shapes.", + ) + available_data_storage_in_t_bs: Optional[int] = Field( + None, description="The maximum DATA storage that can be enabled for this shape." + ) + available_data_storage_per_server_in_tbs: Optional[float] = Field( + None, + description="The maximum data storage available per storage server for this shape. Only applicable to ExaCC Elastic shapes.", + ) + available_db_node_per_node_in_gbs: Optional[int] = Field( + None, + description="The maximum Db Node storage available per database node for this shape. Only applicable to ExaCC Elastic shapes.", + ) + available_db_node_storage_in_g_bs: Optional[int] = Field( + None, + description="The maximum Db Node storage that can be enabled for this shape.", + ) + available_memory_in_gbs: Optional[int] = Field( + None, description="The maximum memory that can be enabled for this shape." + ) + available_memory_per_node_in_gbs: Optional[int] = Field( + None, + description="The maximum memory available per database node for this shape. Only applicable to ExaCC Elastic shapes.", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous Database. This is required if using the `computeCount` parameter. If using `cpuCoreCount` then it is an error to specify `computeModel` to a non-null value. ECPU compute model is the recommended model and OCPU compute model is legacy. Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + core_count_increment: Optional[int] = Field( + None, + description="The discrete number by which the CPU core count for this shape can be increased or decreased.", + ) + display_name: Optional[str] = Field( + None, description="The display name of the shape used for the DB system." + ) + max_storage_count: Optional[int] = Field( + None, + description="The maximum number of Exadata storage servers available for the Exadata infrastructure.", + ) + maximum_node_count: Optional[int] = Field( + None, + description="The maximum number of compute servers available for this shape.", + ) + min_core_count_per_node: Optional[int] = Field( + None, + description="The minimum number of CPU cores that can be enabled per node for this shape.", + ) + min_data_storage_in_t_bs: Optional[int] = Field( + None, + description="The minimum data storage that need be allocated for this shape.", + ) + min_db_node_storage_per_node_in_g_bs: Optional[int] = Field( + None, + description="The minimum Db Node storage that need be allocated per node for this shape.", + ) + min_memory_per_node_in_g_bs: Optional[int] = Field( + None, + description="The minimum memory that need be allocated per node for this shape.", + ) + min_storage_count: Optional[int] = Field( + None, + description="The minimum number of Exadata storage servers available for the Exadata infrastructure.", + ) + minimum_core_count: Optional[int] = Field( + None, + description="The minimum number of CPU cores that can be enabled on the DB system for this shape.", + ) + minimum_node_count: Optional[int] = Field( + None, + description="The minimum number of compute servers available for this shape.", + ) + name: Optional[str] = Field( + None, + description="**[Required]** Gets the name of this DbSystemShapeSummary. The name of the shape used for the DB system.", + ) + shape: Optional[str] = Field( + None, description="Deprecated. Use `name` instead of `shape`." + ) + shape_family: Optional[str] = Field( + None, description="The family of the shape used for the DB system." + ) + shape_type: Optional[str] = Field( + None, + description='The shape type for the virtual machine DB system. Shape type is determined by CPU hardware. Valid values are `AMD` , `INTEL`, `INTEL_FLEX_X9` or `AMPERE_FLEX_A1`. Allowed values for this property are: "AMD", "INTEL", "INTEL_FLEX_X9", "AMPERE_FLEX_A1", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + + +def map_dbsystemshapesummary( + o: oci.database.models.DbSystemShapeSummary, +) -> DbSystemShapeSummary | None: + """Map oci.database.models.DbSystemShapeSummary → DbSystemShapeSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DbSystemShapeSummary(**data) + except Exception: + return DbSystemShapeSummary( + are_server_types_supported=getattr(o, "are_server_types_supported", None), + available_core_count=getattr(o, "available_core_count", None), + available_core_count_per_node=getattr( + o, "available_core_count_per_node", None + ), + available_data_storage_in_t_bs=getattr( + o, "available_data_storage_in_t_bs", None + ), + available_data_storage_per_server_in_tbs=getattr( + o, "available_data_storage_per_server_in_tbs", None + ), + available_db_node_per_node_in_gbs=getattr( + o, "available_db_node_per_node_in_gbs", None + ), + available_db_node_storage_in_g_bs=getattr( + o, "available_db_node_storage_in_g_bs", None + ), + available_memory_in_gbs=getattr(o, "available_memory_in_gbs", None), + available_memory_per_node_in_gbs=getattr( + o, "available_memory_per_node_in_gbs", None + ), + compute_model=getattr(o, "compute_model", None), + core_count_increment=getattr(o, "core_count_increment", None), + display_name=getattr(o, "display_name", None), + max_storage_count=getattr(o, "max_storage_count", None), + maximum_node_count=getattr(o, "maximum_node_count", None), + min_core_count_per_node=getattr(o, "min_core_count_per_node", None), + min_data_storage_in_t_bs=getattr(o, "min_data_storage_in_t_bs", None), + min_db_node_storage_per_node_in_g_bs=getattr( + o, "min_db_node_storage_per_node_in_g_bs", None + ), + min_memory_per_node_in_g_bs=getattr(o, "min_memory_per_node_in_g_bs", None), + min_storage_count=getattr(o, "min_storage_count", None), + minimum_core_count=getattr(o, "minimum_core_count", None), + minimum_node_count=getattr(o, "minimum_node_count", None), + name=getattr(o, "name", None), + shape=getattr(o, "shape", None), + shape_family=getattr(o, "shape_family", None), + shape_type=getattr(o, "shape_type", None), + ) + + +class DbSystemStoragePerformanceSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DbSystemStoragePerformanceSummary.""" + + data_storage_performance_list: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the data_storage_performance_list of this DbSystemStoragePerformanceSummary. List of storage performance for the DATA disks", + ) + reco_storage_performance_list: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the reco_storage_performance_list of this DbSystemStoragePerformanceSummary. List of storage performance for the RECO disks", + ) + shape_type: Optional[str] = Field( + None, + description='**[Required]** Gets the shape_type of this DbSystemStoragePerformanceSummary. ShapeType of the DbSystems INTEL , AMD, INTEL_FLEX_X9 or AMPERE_FLEX_A1 Allowed values for this property are: "AMD", "INTEL", "INTEL_FLEX_X9", "AMPERE_FLEX_A1", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + + +def map_dbsystemstorageperformancesummary( + o: oci.database.models.DbSystemStoragePerformanceSummary, +) -> DbSystemStoragePerformanceSummary | None: + """Map oci.database.models.DbSystemStoragePerformanceSummary → DbSystemStoragePerformanceSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DbSystemStoragePerformanceSummary(**data) + except Exception: + return DbSystemStoragePerformanceSummary( + data_storage_performance_list=getattr( + o, "data_storage_performance_list", None + ), + reco_storage_performance_list=getattr( + o, "reco_storage_performance_list", None + ), + shape_type=getattr(o, "shape_type", None), + ) + + +class DbSystemSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DbSystemSummary.""" + + availability_domain: Optional[str] = Field( + None, + description="**[Required]** Gets the availability_domain of this DbSystemSummary. The name of the availability domain that the DB system is located in.", + ) + backup_network_nsg_ids: Optional[str] = Field( + None, + description="A list of the `OCIDs`__ of the network security groups (NSGs) that the backup network of this DB system belongs to. Setting this to an empty array after the list is created removes the resource from all NSGs. For more information about NSGs, see `Security Rules`__. Applicable only to Exadata systems. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/Network/Concepts/securityrules.htm", + ) + backup_subnet_id: Optional[str] = Field( + None, + description="The `OCID`__ of the backup network subnet the DB system is associated with. Applicable only to Exadata DB systems. **Subnet Restriction:** See the subnet restrictions information for **subnetId**. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + cluster_name: Optional[str] = Field( + None, + description="The cluster name for Exadata and 2-node RAC virtual machine DB systems. The cluster name must begin with an alphabetic character, and may contain hyphens (-). Underscores (_) are not permitted. The cluster name can be no longer than 11 characters and is not case sensitive.", + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this DbSystemSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + cpu_core_count: Optional[int] = Field( + None, + description="**[Required]** Gets the cpu_core_count of this DbSystemSummary. The number of CPU cores enabled on the DB system.", + ) + data_collection_options: Optional[dict] = Field(None, description="") + data_storage_percentage: Optional[int] = Field( + None, + description="The percentage assigned to DATA storage (user data and database files). The remaining percentage is assigned to RECO storage (database redo logs, archive logs, and recovery manager backups). Accepted values are 40 and 80. The default is 80 percent assigned to DATA storage. Not applicable for virtual machine DB systems.", + ) + data_storage_size_in_gbs: Optional[int] = Field( + None, + description="The data storage size, in gigabytes, that is currently available to the DB system. Applies only for virtual machine DB systems.", + ) + database_edition: Optional[str] = Field( + None, + description='**[Required]** Gets the database_edition of this DbSystemSummary. The Oracle Database edition that applies to all the databases on the DB system. Allowed values for this property are: "STANDARD_EDITION", "ENTERPRISE_EDITION", "ENTERPRISE_EDITION_HIGH_PERFORMANCE", "ENTERPRISE_EDITION_EXTREME_PERFORMANCE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + db_system_options: Optional[str] = Field(None, description="") + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + disk_redundancy: Optional[str] = Field( + None, + description="The type of redundancy configured for the DB system. NORMAL is 2-way redundancy. HIGH is 3-way redundancy. Allowed values for this property are: \"HIGH\", \"NORMAL\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this DbSystemSummary. The user-friendly name for the DB system. The name does not have to be unique.", + ) + domain: Optional[str] = Field( + None, + description="**[Required]** Gets the domain of this DbSystemSummary. The domain name for the DB system.", + ) + fault_domains: Optional[str] = Field( + None, + description="List of the Fault Domains in which this DB system is provisioned.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + gi_software_image_id: Optional[str] = Field( + None, + description="The `OCID`__ of a grid infrastructure software image. This is a database software image of the type `GRID_IMAGE`. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + hostname: Optional[str] = Field( + None, + description="**[Required]** Gets the hostname of this DbSystemSummary. The hostname for the DB system.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this DbSystemSummary. The `OCID`__ of the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + last_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + last_patch_history_entry_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last patch history. This value is updated as soon as a patch operation starts. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + license_model: Optional[str] = Field( + None, + description="The Oracle license model that applies to all the databases on the DB system. The default is LICENSE_INCLUDED. Allowed values for this property are: \"LICENSE_INCLUDED\", \"BRING_YOUR_OWN_LICENSE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this DbSystemSummary. The current state of the DB system. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MIGRATED", "MAINTENANCE_IN_PROGRESS", "NEEDS_ATTENTION", "UPGRADING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + listener_port: Optional[int] = Field( + None, + description="The port number configured for the listener on the DB system.", + ) + maintenance_window: Optional[int] = Field(None, description="") + memory_size_in_gbs: Optional[int] = Field( + None, description="Memory allocated to the DB system, in gigabytes." + ) + next_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the next maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + node_count: Optional[int] = Field( + None, + description="The number of nodes in the DB system. For RAC DB systems, the value is greater than 1.", + ) + nsg_ids: Optional[str] = Field( + None, + description="The list of `OCIDs`__ for the network security groups (NSGs) to which this resource belongs. Setting this to an empty list removes all resources from all NSGs. For more information about NSGs, see `Security Rules`__. **NsgIds restrictions:** - A network security group (NSG) is optional for Autonomous Databases with private access. The nsgIds list can be empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/Network/Concepts/securityrules.htm", + ) + os_version: Optional[str] = Field( + None, description="The most recent OS Patch Version applied on the DB system." + ) + point_in_time_data_disk_clone_timestamp: Optional[datetime] = Field( + None, + description="The point in time for a cloned database system when the data disks were cloned from the source database system, as described in `RFC 3339`__. __ https://tools.ietf.org/rfc/rfc3339", + ) + reco_storage_size_in_gb: Optional[int] = Field( + None, + description="The RECO/REDO storage size, in gigabytes, that is currently allocated to the DB system. Applies only for virtual machine DB systems.", + ) + scan_dns_name: Optional[str] = Field( + None, + description="The FQDN of the DNS record for the SCAN IP addresses that are associated with the DB system.", + ) + scan_dns_record_id: Optional[str] = Field( + None, + description="The `OCID`__ of the DNS record for the SCAN IP addresses that are associated with the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + scan_ip_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the Single Client Access Name (SCAN) IPv4 addresses associated with the DB system. SCAN IPv4 addresses are typically used for load balancing and are not assigned to any interface. Oracle Clusterware directs the requests to the appropriate nodes in the cluster. **Note:** For a single-node DB system, this list is empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + scan_ipv6_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the Single Client Access Name (SCAN) IPv6 addresses associated with the DB system. SCAN IPv6 addresses are typically used for load balancing and are not assigned to any interface. Oracle Clusterware directs the requests to the appropriate nodes in the cluster. **Note:** For a single-node DB system, this list is empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + security_attributes: Optional[str] = Field( + None, + description='Security Attributes for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. Example: `{"Oracle-ZPR": {"MaxEgressCount": {"value": "42", "mode": "audit"}}}` __ https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm', + ) + shape: Optional[str] = Field( + None, + description="**[Required]** Gets the shape of this DbSystemSummary. The shape of the DB system. The shape determines resources to allocate to the DB system. - For virtual machine shapes, the number of CPU cores and memory - For bare metal and Exadata shapes, the number of CPU cores, storage, and memory", + ) + source_db_system_id: Optional[str] = Field( + None, + description="The `OCID`__ of the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + sparse_diskgroup: Optional[bool] = Field( + None, + description="True, if Sparse Diskgroup is configured for Exadata dbsystem, False, if Sparse diskgroup was not configured.", + ) + ssh_public_keys: Optional[str] = Field( + None, + description="**[Required]** Gets the ssh_public_keys of this DbSystemSummary. The public key portion of one or more key pairs used for SSH access to the DB system.", + ) + storage_volume_performance_mode: Optional[str] = Field( + None, + description="The block storage volume performance level. Valid values are `BALANCED` and `HIGH_PERFORMANCE`. See `Block Volume Performance`__ for more information. __ https://docs.cloud.oracle.com/Content/Block/Concepts/blockvolumeperformance.htm Allowed values for this property are: \"BALANCED\", \"HIGH_PERFORMANCE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + subnet_id: Optional[str] = Field( + None, + description="**[Required]** Gets the subnet_id of this DbSystemSummary. The `OCID`__ of the subnet the DB system is associated with. **Subnet Restrictions:** - For bare metal DB systems and for single node virtual machine DB systems, do not use a subnet that overlaps with 192.168.16.16/28. - For Exadata and virtual machine 2-node RAC DB systems, do not use a subnet that overlaps with 192.168.128.0/20. These subnets are used by the Oracle Clusterware private interconnect on the database instance. Specifying an overlapping subnet will cause the private interconnect to malfunction. This restriction applies to both the client subnet and backup subnet. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the DB system was created." + ) + time_zone: Optional[str] = Field( + None, + description="The time zone of the DB system. For details, see `DB System Time Zones`__. __ https://docs.cloud.oracle.com/Content/Database/References/timezones.htm", + ) + version: Optional[str] = Field( + None, description="The Oracle Database version of the DB system." + ) + vip_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the virtual IPv4 (VIP) addresses associated with the DB system. The Cluster Ready Services (CRS) creates and maintains one VIPv4 address for each node in the DB system to enable failover. If one node fails, the VIPv4 is reassigned to another active node in the cluster. **Note:** For a single-node DB system, this list is empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + vipv6_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the virtual IPv6 (VIP) addresses associated with the DB system. The Cluster Ready Services (CRS) creates and maintains one VIP IpV6 address for each node in the DB system to enable failover. If one node fails, the VIP is reassigned to another active node in the cluster. **Note:** For a single-node DB system, this list is empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + zone_id: Optional[str] = Field( + None, description="The OCID of the zone the DB system is associated with." + ) + + +def map_dbsystemsummary( + o: oci.database.models.DbSystemSummary, +) -> DbSystemSummary | None: + """Map oci.database.models.DbSystemSummary → DbSystemSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DbSystemSummary(**data) + except Exception: + return DbSystemSummary( + availability_domain=getattr(o, "availability_domain", None), + backup_network_nsg_ids=getattr(o, "backup_network_nsg_ids", None), + backup_subnet_id=getattr(o, "backup_subnet_id", None), + cluster_name=getattr(o, "cluster_name", None), + compartment_id=getattr(o, "compartment_id", None), + cpu_core_count=getattr(o, "cpu_core_count", None), + data_collection_options=getattr(o, "data_collection_options", None), + data_storage_percentage=getattr(o, "data_storage_percentage", None), + data_storage_size_in_gbs=getattr(o, "data_storage_size_in_gbs", None), + database_edition=getattr(o, "database_edition", None), + db_system_options=getattr(o, "db_system_options", None), + defined_tags=getattr(o, "defined_tags", None), + disk_redundancy=getattr(o, "disk_redundancy", None), + display_name=getattr(o, "display_name", None), + domain=getattr(o, "domain", None), + fault_domains=getattr(o, "fault_domains", None), + freeform_tags=getattr(o, "freeform_tags", None), + gi_software_image_id=getattr(o, "gi_software_image_id", None), + hostname=getattr(o, "hostname", None), + id=getattr(o, "id", None), + kms_key_id=getattr(o, "kms_key_id", None), + last_maintenance_run_id=getattr(o, "last_maintenance_run_id", None), + last_patch_history_entry_id=getattr(o, "last_patch_history_entry_id", None), + license_model=getattr(o, "license_model", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + listener_port=getattr(o, "listener_port", None), + maintenance_window=getattr(o, "maintenance_window", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + next_maintenance_run_id=getattr(o, "next_maintenance_run_id", None), + node_count=getattr(o, "node_count", None), + nsg_ids=getattr(o, "nsg_ids", None), + os_version=getattr(o, "os_version", None), + point_in_time_data_disk_clone_timestamp=getattr( + o, "point_in_time_data_disk_clone_timestamp", None + ), + reco_storage_size_in_gb=getattr(o, "reco_storage_size_in_gb", None), + scan_dns_name=getattr(o, "scan_dns_name", None), + scan_dns_record_id=getattr(o, "scan_dns_record_id", None), + scan_ip_ids=getattr(o, "scan_ip_ids", None), + scan_ipv6_ids=getattr(o, "scan_ipv6_ids", None), + security_attributes=getattr(o, "security_attributes", None), + shape=getattr(o, "shape", None), + source_db_system_id=getattr(o, "source_db_system_id", None), + sparse_diskgroup=getattr(o, "sparse_diskgroup", None), + ssh_public_keys=getattr(o, "ssh_public_keys", None), + storage_volume_performance_mode=getattr( + o, "storage_volume_performance_mode", None + ), + subnet_id=getattr(o, "subnet_id", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + version=getattr(o, "version", None), + vip_ids=getattr(o, "vip_ids", None), + vipv6_ids=getattr(o, "vipv6_ids", None), + zone_id=getattr(o, "zone_id", None), + ) + + +class DbVersionSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.DbVersionSummary.""" + + is_latest_for_major_version: Optional[bool] = Field( + None, + description="True if this version of the Oracle Database software is the latest version for a release.", + ) + is_preview_db_version: Optional[bool] = Field( + None, + description="True if this version of the Oracle Database software is the preview version.", + ) + is_upgrade_supported: Optional[bool] = Field( + None, + description="True if this version of the Oracle Database software is supported for Upgrade.", + ) + supports_pdb: Optional[bool] = Field( + None, + description="True if this version of the Oracle Database software supports pluggable databases.", + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this DbVersionSummary. A valid Oracle Database version.", + ) + + +def map_dbversionsummary( + o: oci.database.models.DbVersionSummary, +) -> DbVersionSummary | None: + """Map oci.database.models.DbVersionSummary → DbVersionSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return DbVersionSummary(**data) + except Exception: + return DbVersionSummary( + is_latest_for_major_version=getattr(o, "is_latest_for_major_version", None), + is_preview_db_version=getattr(o, "is_preview_db_version", None), + is_upgrade_supported=getattr(o, "is_upgrade_supported", None), + supports_pdb=getattr(o, "supports_pdb", None), + version=getattr(o, "version", None), + ) + + +class ExadataInfrastructureSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExadataInfrastructureSummary.""" + + activated_storage_count: Optional[int] = Field( + None, + description="The requested number of additional storage servers activated for the Exadata infrastructure.", + ) + additional_compute_count: Optional[int] = Field( + None, + description="The requested number of additional compute servers for the Exadata infrastructure.", + ) + additional_compute_system_model: Optional[str] = Field( + None, + description='Oracle Exadata System Model specification. The system model determines the amount of compute or storage server resources available for use. For more information, please see [System and Shape Configuration Options] (https://docs.oracle.com/en/engineered-systems/exadata-cloud-at-customer/ecccm/ecc-system-config-options.html#GUID-9E090174-5C57-4EB1-9243-B470F9F10D6B) Allowed values for this property are: "X7", "X8", "X8M", "X9M", "X10M", "X11M", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + additional_storage_count: Optional[int] = Field( + None, + description="The requested number of additional storage servers for the Exadata infrastructure.", + ) + admin_network_cidr: Optional[str] = Field( + None, description="The CIDR block for the Exadata administration network." + ) + availability_domain: Optional[str] = Field( + None, + description="The name of the availability domain that the Exadata infrastructure is located in.", + ) + cloud_control_plane_server1: Optional[str] = Field( + None, description="The IP address for the first control plane server." + ) + cloud_control_plane_server2: Optional[str] = Field( + None, description="The IP address for the second control plane server." + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExadataInfrastructureSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compute_count: Optional[int] = Field( + None, + description="The number of compute servers for the Exadata infrastructure.", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous Database. This is required if using the `computeCount` parameter. If using `cpuCoreCount` then it is an error to specify `computeModel` to a non-null value. ECPU compute model is the recommended model and OCPU compute model is legacy. Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + contacts: Optional[str] = Field( + None, description="The list of contacts for the Exadata infrastructure." + ) + corporate_proxy: Optional[str] = Field( + None, + description="The corporate network proxy for access to the control plane network.", + ) + cpus_enabled: Optional[int] = Field( + None, description="The number of enabled CPU cores." + ) + csi_number: Optional[str] = Field( + None, description="The CSI Number of the Exadata infrastructure." + ) + data_storage_size_in_tbs: Optional[float] = Field( + None, description="Size, in terabytes, of the DATA disk group." + ) + database_server_type: Optional[str] = Field( + None, description="The database server type of the Exadata infrastructure." + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, description="The local node storage allocated in GBs." + ) + db_server_version: Optional[str] = Field( + None, + description="The software version of the database servers (dom0) in the Exadata infrastructure.", + ) + defined_file_system_configurations: Optional[list[dict]] = Field( + None, + description="Details of the file system configuration of the Exadata infrastructure.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExadataInfrastructureSummary. The user-friendly name for the Exadata Cloud@Customer infrastructure. The name does not need to be unique.", + ) + dns_server: Optional[str] = Field( + None, description="The list of DNS server IP addresses. Maximum of 3 allowed." + ) + exascale_config: Optional[dict] = Field(None, description="") + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + gateway: Optional[str] = Field( + None, description="The gateway for the control plane network." + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExadataInfrastructureSummary. The `OCID`__ of the Exadata infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + infini_band_network_cidr: Optional[str] = Field( + None, description="The CIDR block for the Exadata InfiniBand interconnect." + ) + is_cps_offline_report_enabled: Optional[bool] = Field( + None, + description="Indicates whether cps offline diagnostic report is enabled for this Exadata infrastructure. This will allow a customer to quickly check status themselves and fix problems on their end, saving time and frustration for both Oracle and the customer when they find the CPS in a disconnected state.You can enable offline diagnostic report during Exadata infrastructure provisioning. You can also disable or enable it at any time using the UpdateExadatainfrastructure API.", + ) + is_multi_rack_deployment: Optional[bool] = Field( + None, description="Indicates if deployment is Multi-Rack or not." + ) + is_scheduling_policy_associated: Optional[bool] = Field( + None, + description="If true, the infrastructure is using granular maintenance scheduling preference.", + ) + last_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ExadataInfrastructureSummary. The current lifecycle state of the Exadata infrastructure. Allowed values for this property are: "CREATING", "REQUIRES_ACTIVATION", "ACTIVATING", "ACTIVE", "ACTIVATION_FAILED", "FAILED", "UPDATING", "DELETING", "DELETED", "DISCONNECTED", "MAINTENANCE_IN_PROGRESS", "WAITING_FOR_CONNECTIVITY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + maintenance_slo_status: Optional[str] = Field( + None, + description="A field to capture ‘Maintenance SLO Status’ for the Exadata infrastructure with values ‘OK’, ‘DEGRADED’. Default is ‘OK’ when the infrastructure is provisioned. Allowed values for this property are: \"OK\", \"DEGRADED\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + maintenance_window: Optional[int] = Field(None, description="") + max_cpu_count: Optional[int] = Field( + None, description="The total number of CPU cores available." + ) + max_data_storage_in_t_bs: Optional[float] = Field( + None, description="The total available DATA disk group size." + ) + max_db_node_storage_in_g_bs: Optional[int] = Field( + None, description="The total local node storage available in GBs." + ) + max_memory_in_gbs: Optional[int] = Field( + None, description="The total memory available in GBs." + ) + memory_size_in_gbs: Optional[int] = Field( + None, description="The memory allocated in GBs." + ) + monthly_db_server_version: Optional[str] = Field( + None, + description="The monthly software version of the database servers (dom0) in the Exadata infrastructure.", + ) + multi_rack_configuration_file: Optional[str] = Field( + None, description="The base64 encoded Multi-Rack configuration json file." + ) + netmask: Optional[str] = Field( + None, description="The netmask for the control plane network." + ) + network_bonding_mode_details: Optional[dict] = Field(None, description="") + next_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the next maintenance run. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + ntp_server: Optional[str] = Field( + None, description="The list of NTP server IP addresses. Maximum of 3 allowed." + ) + rack_serial_number: Optional[str] = Field( + None, description="The serial number for the Exadata infrastructure." + ) + shape: Optional[str] = Field( + None, + description="**[Required]** Gets the shape of this ExadataInfrastructureSummary. The shape of the Exadata infrastructure. The shape determines the amount of CPU, storage, and memory resources allocated to the instance.", + ) + storage_count: Optional[int] = Field( + None, + description="The number of Exadata storage servers for the Exadata infrastructure.", + ) + storage_server_type: Optional[str] = Field( + None, description="The storage server type of the Exadata infrastructure." + ) + storage_server_version: Optional[str] = Field( + None, + description="The software version of the storage servers (cells) in the Exadata infrastructure.", + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the Exadata infrastructure was created." + ) + time_zone: Optional[str] = Field( + None, + description="The time zone of the Exadata infrastructure. For details, see `Exadata Infrastructure Time Zones`__. __ https://docs.cloud.oracle.com/Content/Database/References/timezones.htm", + ) + + +def map_exadatainfrastructuresummary( + o: oci.database.models.ExadataInfrastructureSummary, +) -> ExadataInfrastructureSummary | None: + """Map oci.database.models.ExadataInfrastructureSummary → ExadataInfrastructureSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExadataInfrastructureSummary(**data) + except Exception: + return ExadataInfrastructureSummary( + activated_storage_count=getattr(o, "activated_storage_count", None), + additional_compute_count=getattr(o, "additional_compute_count", None), + additional_compute_system_model=getattr( + o, "additional_compute_system_model", None + ), + additional_storage_count=getattr(o, "additional_storage_count", None), + admin_network_cidr=getattr(o, "admin_network_cidr", None), + availability_domain=getattr(o, "availability_domain", None), + cloud_control_plane_server1=getattr(o, "cloud_control_plane_server1", None), + cloud_control_plane_server2=getattr(o, "cloud_control_plane_server2", None), + compartment_id=getattr(o, "compartment_id", None), + compute_count=getattr(o, "compute_count", None), + compute_model=getattr(o, "compute_model", None), + contacts=getattr(o, "contacts", None), + corporate_proxy=getattr(o, "corporate_proxy", None), + cpus_enabled=getattr(o, "cpus_enabled", None), + csi_number=getattr(o, "csi_number", None), + data_storage_size_in_tbs=getattr(o, "data_storage_size_in_tbs", None), + database_server_type=getattr(o, "database_server_type", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_server_version=getattr(o, "db_server_version", None), + defined_file_system_configurations=getattr( + o, "defined_file_system_configurations", None + ), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + dns_server=getattr(o, "dns_server", None), + exascale_config=getattr(o, "exascale_config", None), + freeform_tags=getattr(o, "freeform_tags", None), + gateway=getattr(o, "gateway", None), + id=getattr(o, "id", None), + infini_band_network_cidr=getattr(o, "infini_band_network_cidr", None), + is_cps_offline_report_enabled=getattr( + o, "is_cps_offline_report_enabled", None + ), + is_multi_rack_deployment=getattr(o, "is_multi_rack_deployment", None), + is_scheduling_policy_associated=getattr( + o, "is_scheduling_policy_associated", None + ), + last_maintenance_run_id=getattr(o, "last_maintenance_run_id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + maintenance_slo_status=getattr(o, "maintenance_slo_status", None), + maintenance_window=getattr(o, "maintenance_window", None), + max_cpu_count=getattr(o, "max_cpu_count", None), + max_data_storage_in_t_bs=getattr(o, "max_data_storage_in_t_bs", None), + max_db_node_storage_in_g_bs=getattr(o, "max_db_node_storage_in_g_bs", None), + max_memory_in_gbs=getattr(o, "max_memory_in_gbs", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + monthly_db_server_version=getattr(o, "monthly_db_server_version", None), + multi_rack_configuration_file=getattr( + o, "multi_rack_configuration_file", None + ), + netmask=getattr(o, "netmask", None), + network_bonding_mode_details=getattr( + o, "network_bonding_mode_details", None + ), + next_maintenance_run_id=getattr(o, "next_maintenance_run_id", None), + ntp_server=getattr(o, "ntp_server", None), + rack_serial_number=getattr(o, "rack_serial_number", None), + shape=getattr(o, "shape", None), + storage_count=getattr(o, "storage_count", None), + storage_server_type=getattr(o, "storage_server_type", None), + storage_server_version=getattr(o, "storage_server_version", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + ) + + +class ExadbVmClusterUpdateSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExadbVmClusterUpdateSummary.""" + + available_actions: Optional[str] = Field( + None, + description='The possible actions performed by the update operation on the infrastructure components. Allowed values for items in this list are: "ROLLING_APPLY", "NON_ROLLING_APPLY", "PRECHECK", "ROLLBACK", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + description: Optional[str] = Field( + None, + description="**[Required]** Gets the description of this ExadbVmClusterUpdateSummary. Details of the maintenance update package.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExadbVmClusterUpdateSummary. The `OCID`__ of the maintenance update. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + last_action: Optional[str] = Field( + None, + description='The previous update action performed. Allowed values for this property are: "ROLLING_APPLY", "NON_ROLLING_APPLY", "PRECHECK", "ROLLBACK", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + lifecycle_details: Optional[str] = Field( + None, + description="Descriptive text providing additional details about the lifecycle state.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the maintenance update. Dependent on value of `lastAction`. Allowed values for this property are: "AVAILABLE", "SUCCESS", "IN_PROGRESS", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_released: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_released of this ExadbVmClusterUpdateSummary. The date and time the maintenance update was released.", + ) + update_type: Optional[str] = Field( + None, + description='**[Required]** Gets the update_type of this ExadbVmClusterUpdateSummary. The type of cloud VM cluster maintenance update. Allowed values for this property are: "GI_UPGRADE", "GI_PATCH", "OS_UPDATE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this ExadbVmClusterUpdateSummary. The version of the maintenance update package.", + ) + + +def map_exadbvmclusterupdatesummary( + o: oci.database.models.ExadbVmClusterUpdateSummary, +) -> ExadbVmClusterUpdateSummary | None: + """Map oci.database.models.ExadbVmClusterUpdateSummary → ExadbVmClusterUpdateSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExadbVmClusterUpdateSummary(**data) + except Exception: + return ExadbVmClusterUpdateSummary( + available_actions=getattr(o, "available_actions", None), + description=getattr(o, "description", None), + id=getattr(o, "id", None), + last_action=getattr(o, "last_action", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + time_released=getattr(o, "time_released", None), + update_type=getattr(o, "update_type", None), + version=getattr(o, "version", None), + ) + + +class ExadbVmClusterSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExadbVmClusterSummary.""" + + availability_domain: Optional[str] = Field( + None, + description="**[Required]** Gets the availability_domain of this ExadbVmClusterSummary. The name of the availability domain in which the Exadata VM cluster on Exascale Infrastructure is located.", + ) + backup_network_nsg_ids: Optional[str] = Field( + None, + description="A list of the `OCIDs`__ of the network security groups (NSGs) that the backup network of this DB system belongs to. Setting this to an empty array after the list is created removes the resource from all NSGs. For more information about NSGs, see `Security Rules`__. Applicable only to Exadata systems. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/Network/Concepts/securityrules.htm", + ) + backup_subnet_id: Optional[str] = Field( + None, + description="**[Required]** Gets the backup_subnet_id of this ExadbVmClusterSummary. The `OCID`__ of the backup network subnet associated with the Exadata VM cluster on Exascale Infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + cluster_name: Optional[str] = Field( + None, + description="The cluster name for Exadata VM cluster on Exascale Infrastructure. The cluster name must begin with an alphabetic character, and may contain hyphens (-). Underscores (_) are not permitted. The cluster name can be no longer than 11 characters and is not case sensitive.", + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExadbVmClusterSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + data_collection_options: Optional[dict] = Field(None, description="") + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExadbVmClusterSummary. The user-friendly name for the Exadata VM cluster on Exascale Infrastructure. The name does not need to be unique.", + ) + domain: Optional[str] = Field( + None, + description="**[Required]** Gets the domain of this ExadbVmClusterSummary. A domain name used for the Exadata VM cluster on Exascale Infrastructure. If the Oracle-provided internet and VCN resolver is enabled for the specified subnet, then the domain name for the subnet is used (do not provide one). Otherwise, provide a valid DNS domain name. Hyphens (-) are not permitted. Applies to Exadata Database Service on Exascale Infrastructure only.", + ) + enabled_e_cpu_count: Optional[int] = Field( + None, + description="**[Required]** Gets the enabled_e_cpu_count of this ExadbVmClusterSummary. The number of ECPUs to enable for an Exadata VM cluster on Exascale Infrastructure.", + ) + exascale_db_storage_vault_id: Optional[str] = Field( + None, + description="**[Required]** Gets the exascale_db_storage_vault_id of this ExadbVmClusterSummary. The `OCID`__ of the Exadata Database Storage Vault. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + gi_version: Optional[str] = Field( + None, description="A valid Oracle Grid Infrastructure (GI) software version." + ) + grid_image_id: Optional[str] = Field( + None, + description="Grid Setup will be done using this grid image id. The grid image id can be extracted from 1. Obtain the supported major versions using API /20160918/giVersions?compartmentId=&shape=EXADB_XS&availabilityDomain= 2. Replace {version} with one of the supported major versions and obtain the supported minor versions using API /20160918/giVersions/{version}/minorVersions?compartmentId=&shapeFamily=EXADB_XS&availabilityDomain=", + ) + grid_image_type: Optional[str] = Field( + None, + description="The type of Grid Image Allowed values for this property are: \"RELEASE_UPDATE\", \"CUSTOM_IMAGE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + hostname: Optional[str] = Field( + None, + description="**[Required]** Gets the hostname of this ExadbVmClusterSummary. The hostname for the Exadata VM cluster on Exascale Infrastructure. The hostname must begin with an alphabetic character, and can contain alphanumeric characters and hyphens (-). For Exadata systems, the maximum length of the hostname is 12 characters. The maximum length of the combined hostname and domain is 63 characters. **Note:** The hostname must be unique within the subnet. If it is not unique, then the Exadata VM cluster on Exascale Infrastructure will fail to provision.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExadbVmClusterSummary. The `OCID`__ of the Exadata VM cluster on Exascale Infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + last_update_history_entry_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last maintenance update history entry. This value is updated when a maintenance update starts. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + license_model: Optional[str] = Field( + None, + description="The Oracle license model that applies to the Exadata VM cluster on Exascale Infrastructure. The default is BRING_YOUR_OWN_LICENSE. Allowed values for this property are: \"LICENSE_INCLUDED\", \"BRING_YOUR_OWN_LICENSE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ExadbVmClusterSummary. The current state of the Exadata VM cluster on Exascale Infrastructure. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + listener_port: Optional[int] = Field( + None, + description="The port number configured for the listener on the Exadata VM cluster on Exascale Infrastructure.", + ) + memory_size_in_gbs: Optional[int] = Field( + None, + description="The memory that you want to be allocated in GBs. Memory is calculated based on 11 GB per VM core reserved.", + ) + node_count: Optional[int] = Field( + None, + description="**[Required]** Gets the node_count of this ExadbVmClusterSummary. The number of nodes in the Exadata VM cluster on Exascale Infrastructure.", + ) + nsg_ids: Optional[str] = Field( + None, + description="The list of `OCIDs`__ for the network security groups (NSGs) to which this resource belongs. Setting this to an empty list removes all resources from all NSGs. For more information about NSGs, see `Security Rules`__. **NsgIds restrictions:** - A network security group (NSG) is optional for Autonomous Databases with private access. The nsgIds list can be empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm __ https://docs.cloud.oracle.com/Content/Network/Concepts/securityrules.htm", + ) + private_zone_id: Optional[str] = Field( + None, + description="The private zone ID in which you want DNS records to be created.", + ) + scan_dns_name: Optional[str] = Field( + None, + description="The FQDN of the DNS record for the SCAN IP addresses that are associated with the Exadata VM cluster on Exascale Infrastructure.", + ) + scan_dns_record_id: Optional[str] = Field( + None, + description="The `OCID`__ of the DNS record for the SCAN IP addresses that are associated with the Exadata VM cluster on Exascale Infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + scan_ip_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the Single Client Access Name (SCAN) IP addresses associated with the Exadata VM cluster on Exascale Infrastructure. SCAN IP addresses are typically used for load balancing and are not assigned to any interface. Oracle Clusterware directs the requests to the appropriate nodes in the cluster. **Note:** For a single-node DB system, this list is empty. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + scan_listener_port_tcp: Optional[int] = Field( + None, + description="The TCP Single Client Access Name (SCAN) port. The default port is 1521.", + ) + scan_listener_port_tcp_ssl: Optional[int] = Field( + None, + description="The Secured Communication (TCPS) protocol Single Client Access Name (SCAN) port. The default port is 2484.", + ) + security_attributes: Optional[str] = Field( + None, + description='Security Attributes for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. Example: `{"Oracle-ZPR": {"MaxEgressCount": {"value": "42", "mode": "audit"}}}` __ https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm', + ) + shape: Optional[str] = Field( + None, + description="**[Required]** Gets the shape of this ExadbVmClusterSummary. The shape of the Exadata VM cluster on Exascale Infrastructure resource", + ) + snapshot_file_system_storage: Optional[dict] = Field(None, description="") + ssh_public_keys: Optional[str] = Field( + None, + description="**[Required]** Gets the ssh_public_keys of this ExadbVmClusterSummary. The public key portion of one or more key pairs used for SSH access to the Exadata VM cluster on Exascale Infrastructure.", + ) + subnet_id: Optional[str] = Field( + None, + description="**[Required]** Gets the subnet_id of this ExadbVmClusterSummary. The `OCID`__ of the subnet associated with the Exadata VM cluster on Exascale Infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + system_tags: Optional[str] = Field( + None, + description="System tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + system_version: Optional[str] = Field( + None, description="Operating system version of the image." + ) + time_created: Optional[datetime] = Field( + None, + description="The date and time that the Exadata VM cluster on Exascale Infrastructure was created.", + ) + time_zone: Optional[str] = Field( + None, + description="The time zone to use for the Exadata VM cluster on Exascale Infrastructure. For details, see `Time Zones`__. __ https://docs.cloud.oracle.com/Content/Database/References/timezones.htm", + ) + total_e_cpu_count: Optional[int] = Field( + None, + description="**[Required]** Gets the total_e_cpu_count of this ExadbVmClusterSummary. The number of Total ECPUs for an Exadata VM cluster on Exascale Infrastructure.", + ) + total_file_system_storage: Optional[dict] = Field(None, description="") + vip_ids: Optional[str] = Field( + None, + description="The `OCID`__ of the virtual IP (VIP) addresses associated with the Exadata VM cluster on Exascale Infrastructure. The Cluster Ready Services (CRS) creates and maintains one VIP address for each node in the Exadata Cloud Service instance to enable failover. If one node fails, then the VIP is reassigned to another active node in the cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + vm_file_system_storage: Optional[dict] = Field( + None, + description="**[Required]** Gets the vm_file_system_storage of this ExadbVmClusterSummary.", + ) + zone_id: Optional[str] = Field( + None, + description="The OCID of the zone with which the Exadata VM cluster on Exascale Infrastructure is associated.", + ) + + +def map_exadbvmclustersummary( + o: oci.database.models.ExadbVmClusterSummary, +) -> ExadbVmClusterSummary | None: + """Map oci.database.models.ExadbVmClusterSummary → ExadbVmClusterSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExadbVmClusterSummary(**data) + except Exception: + return ExadbVmClusterSummary( + availability_domain=getattr(o, "availability_domain", None), + backup_network_nsg_ids=getattr(o, "backup_network_nsg_ids", None), + backup_subnet_id=getattr(o, "backup_subnet_id", None), + cluster_name=getattr(o, "cluster_name", None), + compartment_id=getattr(o, "compartment_id", None), + data_collection_options=getattr(o, "data_collection_options", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + domain=getattr(o, "domain", None), + enabled_e_cpu_count=getattr(o, "enabled_e_cpu_count", None), + exascale_db_storage_vault_id=getattr( + o, "exascale_db_storage_vault_id", None + ), + freeform_tags=getattr(o, "freeform_tags", None), + gi_version=getattr(o, "gi_version", None), + grid_image_id=getattr(o, "grid_image_id", None), + grid_image_type=getattr(o, "grid_image_type", None), + hostname=getattr(o, "hostname", None), + id=getattr(o, "id", None), + last_update_history_entry_id=getattr( + o, "last_update_history_entry_id", None + ), + license_model=getattr(o, "license_model", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + listener_port=getattr(o, "listener_port", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + node_count=getattr(o, "node_count", None), + nsg_ids=getattr(o, "nsg_ids", None), + private_zone_id=getattr(o, "private_zone_id", None), + scan_dns_name=getattr(o, "scan_dns_name", None), + scan_dns_record_id=getattr(o, "scan_dns_record_id", None), + scan_ip_ids=getattr(o, "scan_ip_ids", None), + scan_listener_port_tcp=getattr(o, "scan_listener_port_tcp", None), + scan_listener_port_tcp_ssl=getattr(o, "scan_listener_port_tcp_ssl", None), + security_attributes=getattr(o, "security_attributes", None), + shape=getattr(o, "shape", None), + snapshot_file_system_storage=getattr( + o, "snapshot_file_system_storage", None + ), + ssh_public_keys=getattr(o, "ssh_public_keys", None), + subnet_id=getattr(o, "subnet_id", None), + system_tags=getattr(o, "system_tags", None), + system_version=getattr(o, "system_version", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + total_e_cpu_count=getattr(o, "total_e_cpu_count", None), + total_file_system_storage=getattr(o, "total_file_system_storage", None), + vip_ids=getattr(o, "vip_ids", None), + vm_file_system_storage=getattr(o, "vm_file_system_storage", None), + zone_id=getattr(o, "zone_id", None), + ) + + +class ExascaleDbStorageVaultSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExascaleDbStorageVaultSummary.""" + + additional_flash_cache_in_percent: Optional[int] = Field( + None, + description="The size of additional Flash Cache in percentage of High Capacity database storage.", + ) + availability_domain: Optional[str] = Field( + None, + description="**[Required]** Gets the availability_domain of this ExascaleDbStorageVaultSummary. The name of the availability domain in which the Exadata Database Storage Vault is located.", + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExascaleDbStorageVaultSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + description: Optional[str] = Field( + None, description="Exadata Database Storage Vault description." + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExascaleDbStorageVaultSummary. The user-friendly name for the Exadata Database Storage Vault. The name does not need to be unique.", + ) + exadata_infrastructure_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Exadata infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + high_capacity_database_storage: Optional[dict] = Field( + None, + description="**[Required]** Gets the high_capacity_database_storage of this ExascaleDbStorageVaultSummary.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExascaleDbStorageVaultSummary. The `OCID`__ of the Exadata Database Storage Vault. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description="**[Required]** Gets the lifecycle_state of this ExascaleDbStorageVaultSummary. The current state of the Exadata Database Storage Vault.", + ) + system_tags: Optional[str] = Field( + None, + description="System tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + time_created: Optional[datetime] = Field( + None, + description="The date and time that the Exadata Database Storage Vault was created.", + ) + time_zone: Optional[str] = Field( + None, + description="The time zone that you want to use for the Exadata Database Storage Vault. For details, see `Time Zones`__. __ https://docs.cloud.oracle.com/Content/Database/References/timezones.htm", + ) + vm_cluster_count: Optional[int] = Field( + None, + description="The number of Exadata VM clusters used the Exadata Database Storage Vault.", + ) + + +def map_exascaledbstoragevaultsummary( + o: oci.database.models.ExascaleDbStorageVaultSummary, +) -> ExascaleDbStorageVaultSummary | None: + """Map oci.database.models.ExascaleDbStorageVaultSummary → ExascaleDbStorageVaultSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExascaleDbStorageVaultSummary(**data) + except Exception: + return ExascaleDbStorageVaultSummary( + additional_flash_cache_in_percent=getattr( + o, "additional_flash_cache_in_percent", None + ), + availability_domain=getattr(o, "availability_domain", None), + compartment_id=getattr(o, "compartment_id", None), + defined_tags=getattr(o, "defined_tags", None), + description=getattr(o, "description", None), + display_name=getattr(o, "display_name", None), + exadata_infrastructure_id=getattr(o, "exadata_infrastructure_id", None), + freeform_tags=getattr(o, "freeform_tags", None), + high_capacity_database_storage=getattr( + o, "high_capacity_database_storage", None + ), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + system_tags=getattr(o, "system_tags", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + vm_cluster_count=getattr(o, "vm_cluster_count", None), + ) + + +class ExecutionActionSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExecutionActionSummary.""" + + action_members: Optional[list[str]] = Field( + None, description="List of action members of this execution action." + ) + action_params: Optional[str] = Field( + None, + description='**[Required]** Gets the action_params of this ExecutionActionSummary. Map where a key value pair describes the specific action parameter. Example: `{"count": "3"}`', + ) + action_type: Optional[str] = Field( + None, + description='**[Required]** Gets the action_type of this ExecutionActionSummary. The action type of the execution action being performed Allowed values for this property are: "DB_SERVER_FULL_SOFTWARE_UPDATE", "STORAGE_SERVER_FULL_SOFTWARE_UPDATE", "NETWORK_SWITCH_FULL_SOFTWARE_UPDATE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExecutionActionSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + description: Optional[str] = Field( + None, description="Description of the execution action." + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExecutionActionSummary. The user-friendly name for the execution action. The name does not need to be unique.", + ) + estimated_time_in_mins: Optional[int] = Field( + None, description="The estimated time of the execution action in minutes." + ) + execution_action_order: Optional[int] = Field( + None, description="The priority order of the execution action." + ) + execution_window_id: Optional[str] = Field( + None, + description="**[Required]** Gets the execution_window_id of this ExecutionActionSummary. The `OCID`__ of the execution window resource the execution action belongs to. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExecutionActionSummary. The `OCID`__ of the execution action. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ExecutionActionSummary. The current state of the execution action. Valid states are SCHEDULED, IN_PROGRESS, FAILED, CANCELED, UPDATING, DELETED, SUCCEEDED and PARTIAL_SUCCESS. Allowed values for this property are: "SCHEDULED", "IN_PROGRESS", "FAILED", "CANCELED", "UPDATING", "DELETED", "SUCCEEDED", "PARTIAL_SUCCESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + lifecycle_substate: Optional[str] = Field( + None, + description='The current sub-state of the execution action. Valid states are DURATION_EXCEEDED, MAINTENANCE_IN_PROGRESS and WAITING. Allowed values for this property are: "DURATION_EXCEEDED", "MAINTENANCE_IN_PROGRESS", "WAITING", "RESCHEDULED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the execution action was created." + ) + time_updated: Optional[datetime] = Field( + None, + description="The last date and time that the execution action was updated.", + ) + total_time_taken_in_mins: Optional[int] = Field( + None, + description="The total time taken by corresponding resource activity in minutes.", + ) + + +def map_executionactionsummary( + o: oci.database.models.ExecutionActionSummary, +) -> ExecutionActionSummary | None: + """Map oci.database.models.ExecutionActionSummary → ExecutionActionSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExecutionActionSummary(**data) + except Exception: + return ExecutionActionSummary( + action_members=getattr(o, "action_members", None), + action_params=getattr(o, "action_params", None), + action_type=getattr(o, "action_type", None), + compartment_id=getattr(o, "compartment_id", None), + defined_tags=getattr(o, "defined_tags", None), + description=getattr(o, "description", None), + display_name=getattr(o, "display_name", None), + estimated_time_in_mins=getattr(o, "estimated_time_in_mins", None), + execution_action_order=getattr(o, "execution_action_order", None), + execution_window_id=getattr(o, "execution_window_id", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + lifecycle_substate=getattr(o, "lifecycle_substate", None), + time_created=getattr(o, "time_created", None), + time_updated=getattr(o, "time_updated", None), + total_time_taken_in_mins=getattr(o, "total_time_taken_in_mins", None), + ) + + +class ExecutionWindowSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExecutionWindowSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExecutionWindowSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + description: Optional[str] = Field( + None, description="Description of the execution window." + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExecutionWindowSummary. The user-friendly name for the execution window. The name does not need to be unique.", + ) + estimated_time_in_mins: Optional[int] = Field( + None, description="The estimated time of the execution window in minutes." + ) + execution_resource_id: Optional[str] = Field( + None, + description="**[Required]** Gets the execution_resource_id of this ExecutionWindowSummary. The `OCID`__ of the execution resource the execution window belongs to. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExecutionWindowSummary. The `OCID`__ of the execution window. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_enforced_duration: Optional[bool] = Field( + None, + description="Indicates if duration the user plans to allocate for scheduling window is strictly enforced. The default value is `FALSE`.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ExecutionWindowSummary. The current state of the Schedule Policy. Valid states are CREATED, SCHEDULED, IN_PROGRESS, FAILED, CANCELED, UPDATING, DELETED, SUCCEEDED and PARTIAL_SUCCESS. Allowed values for this property are: "CREATED", "SCHEDULED", "IN_PROGRESS", "FAILED", "CANCELED", "UPDATING", "DELETED", "SUCCEEDED", "PARTIAL_SUCCESS", "CREATING", "DELETING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + lifecycle_substate: Optional[str] = Field( + None, + description='The current sub-state of the execution window. Valid states are DURATION_EXCEEDED, MAINTENANCE_IN_PROGRESS and WAITING. Allowed values for this property are: "DURATION_EXCEEDED", "MAINTENANCE_IN_PROGRESS", "WAITING", "RESCHEDULED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the execution window was created." + ) + time_ended: Optional[datetime] = Field( + None, description="The date and time that the execution window ended." + ) + time_scheduled: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_scheduled of this ExecutionWindowSummary. The scheduled start date and time of the execution window.", + ) + time_started: Optional[datetime] = Field( + None, description="The date and time that the execution window was started." + ) + time_updated: Optional[datetime] = Field( + None, + description="The last date and time that the execution window was updated.", + ) + total_time_taken_in_mins: Optional[int] = Field( + None, + description="The total time taken by corresponding resource activity in minutes.", + ) + window_duration_in_mins: Optional[int] = Field( + None, + description="**[Required]** Gets the window_duration_in_mins of this ExecutionWindowSummary. Duration window allows user to set a duration they plan to allocate for Scheduling window. The duration is in minutes.", + ) + window_type: Optional[str] = Field( + None, + description="The execution window is of PLANNED or UNPLANNED type. Allowed values for this property are: \"PLANNED\", \"UNPLANNED\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + + +def map_executionwindowsummary( + o: oci.database.models.ExecutionWindowSummary, +) -> ExecutionWindowSummary | None: + """Map oci.database.models.ExecutionWindowSummary → ExecutionWindowSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExecutionWindowSummary(**data) + except Exception: + return ExecutionWindowSummary( + compartment_id=getattr(o, "compartment_id", None), + defined_tags=getattr(o, "defined_tags", None), + description=getattr(o, "description", None), + display_name=getattr(o, "display_name", None), + estimated_time_in_mins=getattr(o, "estimated_time_in_mins", None), + execution_resource_id=getattr(o, "execution_resource_id", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + is_enforced_duration=getattr(o, "is_enforced_duration", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + lifecycle_substate=getattr(o, "lifecycle_substate", None), + time_created=getattr(o, "time_created", None), + time_ended=getattr(o, "time_ended", None), + time_scheduled=getattr(o, "time_scheduled", None), + time_started=getattr(o, "time_started", None), + time_updated=getattr(o, "time_updated", None), + total_time_taken_in_mins=getattr(o, "total_time_taken_in_mins", None), + window_duration_in_mins=getattr(o, "window_duration_in_mins", None), + window_type=getattr(o, "window_type", None), + ) + + +class ExternalContainerDatabaseSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExternalContainerDatabaseSummary.""" + + character_set: Optional[str] = Field( + None, description="The character set of the external database." + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExternalContainerDatabaseSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + database_configuration: Optional[str] = Field( + None, + description="The Oracle Database configuration Allowed values for this property are: \"RAC\", \"SINGLE_INSTANCE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + database_edition: Optional[str] = Field( + None, + description='The Oracle Database edition. Allowed values for this property are: "STANDARD_EDITION", "ENTERPRISE_EDITION", "ENTERPRISE_EDITION_HIGH_PERFORMANCE", "ENTERPRISE_EDITION_EXTREME_PERFORMANCE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + database_management_config: Optional[dict] = Field(None, description="") + database_version: Optional[str] = Field( + None, description="The Oracle Database version." + ) + db_id: Optional[str] = Field( + None, + description="The Oracle Database ID, which identifies an Oracle Database located outside of Oracle Cloud.", + ) + db_packs: Optional[str] = Field( + None, + description="The database packs licensed for the external Oracle Database.", + ) + db_unique_name: Optional[str] = Field( + None, description="The `DB_UNIQUE_NAME` of the external database." + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExternalContainerDatabaseSummary. The user-friendly name for the external database. The name does not have to be unique.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExternalContainerDatabaseSummary. The `OCID`__ of the Oracle Cloud Infrastructure external database resource. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ExternalContainerDatabaseSummary. The current state of the Oracle Cloud Infrastructure external database resource. Allowed values for this property are: "PROVISIONING", "NOT_CONNECTED", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + ncharacter_set: Optional[str] = Field( + None, description="The national character of the external database." + ) + stack_monitoring_config: Optional[dict] = Field(None, description="") + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this ExternalContainerDatabaseSummary. The date and time the database was created.", + ) + time_zone: Optional[str] = Field( + None, + description="The time zone of the external database. It is a time zone offset (a character type in the format '[+|-]TZH:TZM') or a time zone region name, depending on how the time zone value was specified when the database was created / last altered.", + ) + + +def map_externalcontainerdatabasesummary( + o: oci.database.models.ExternalContainerDatabaseSummary, +) -> ExternalContainerDatabaseSummary | None: + """Map oci.database.models.ExternalContainerDatabaseSummary → ExternalContainerDatabaseSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExternalContainerDatabaseSummary(**data) + except Exception: + return ExternalContainerDatabaseSummary( + character_set=getattr(o, "character_set", None), + compartment_id=getattr(o, "compartment_id", None), + database_configuration=getattr(o, "database_configuration", None), + database_edition=getattr(o, "database_edition", None), + database_management_config=getattr(o, "database_management_config", None), + database_version=getattr(o, "database_version", None), + db_id=getattr(o, "db_id", None), + db_packs=getattr(o, "db_packs", None), + db_unique_name=getattr(o, "db_unique_name", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + ncharacter_set=getattr(o, "ncharacter_set", None), + stack_monitoring_config=getattr(o, "stack_monitoring_config", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + ) + + +class ExternalDatabaseConnectorSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExternalDatabaseConnectorSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExternalDatabaseConnectorSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + connection_status: Optional[str] = Field( + None, + description="**[Required]** Gets the connection_status of this ExternalDatabaseConnectorSummary. The status of connectivity to the external database.", + ) + connector_type: Optional[str] = Field( + None, + description="**[Required]** Gets the connector_type of this ExternalDatabaseConnectorSummary. The type of connector used by the external database resource. Allowed values for this property are: \"MACS\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExternalDatabaseConnectorSummary. The user-friendly name for the :func:`create_external_database_connector_details`. The name does not have to be unique.", + ) + external_database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the external_database_id of this ExternalDatabaseConnectorSummary. The `OCID`__ of the external database resource. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExternalDatabaseConnectorSummary. The `OCID`__ of the :func:`create_external_database_connector_details`. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description="**[Required]** Gets the lifecycle_state of this ExternalDatabaseConnectorSummary. The current lifecycle state of the external database connector resource.", + ) + time_connection_status_last_updated: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_connection_status_last_updated of this ExternalDatabaseConnectorSummary. The date and time the `connectionStatus` of this external connector was last updated.", + ) + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this ExternalDatabaseConnectorSummary. The date and time the external connector was created.", + ) + + +def map_externaldatabaseconnectorsummary( + o: oci.database.models.ExternalDatabaseConnectorSummary, +) -> ExternalDatabaseConnectorSummary | None: + """Map oci.database.models.ExternalDatabaseConnectorSummary → ExternalDatabaseConnectorSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExternalDatabaseConnectorSummary(**data) + except Exception: + return ExternalDatabaseConnectorSummary( + compartment_id=getattr(o, "compartment_id", None), + connection_status=getattr(o, "connection_status", None), + connector_type=getattr(o, "connector_type", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + external_database_id=getattr(o, "external_database_id", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + time_connection_status_last_updated=getattr( + o, "time_connection_status_last_updated", None + ), + time_created=getattr(o, "time_created", None), + ) + + +class ExternalNonContainerDatabaseSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExternalNonContainerDatabaseSummary.""" + + character_set: Optional[str] = Field( + None, description="The character set of the external database." + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExternalNonContainerDatabaseSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + database_configuration: Optional[str] = Field( + None, + description="The Oracle Database configuration Allowed values for this property are: \"RAC\", \"SINGLE_INSTANCE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + database_edition: Optional[str] = Field( + None, + description='The Oracle Database edition. Allowed values for this property are: "STANDARD_EDITION", "ENTERPRISE_EDITION", "ENTERPRISE_EDITION_HIGH_PERFORMANCE", "ENTERPRISE_EDITION_EXTREME_PERFORMANCE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + database_management_config: Optional[dict] = Field(None, description="") + database_version: Optional[str] = Field( + None, description="The Oracle Database version." + ) + db_id: Optional[str] = Field( + None, + description="The Oracle Database ID, which identifies an Oracle Database located outside of Oracle Cloud.", + ) + db_packs: Optional[str] = Field( + None, + description="The database packs licensed for the external Oracle Database.", + ) + db_unique_name: Optional[str] = Field( + None, description="The `DB_UNIQUE_NAME` of the external database." + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExternalNonContainerDatabaseSummary. The user-friendly name for the external database. The name does not have to be unique.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExternalNonContainerDatabaseSummary. The `OCID`__ of the Oracle Cloud Infrastructure external database resource. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ExternalNonContainerDatabaseSummary. The current state of the Oracle Cloud Infrastructure external database resource. Allowed values for this property are: "PROVISIONING", "NOT_CONNECTED", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + ncharacter_set: Optional[str] = Field( + None, description="The national character of the external database." + ) + operations_insights_config: Optional[dict] = Field(None, description="") + stack_monitoring_config: Optional[dict] = Field(None, description="") + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this ExternalNonContainerDatabaseSummary. The date and time the database was created.", + ) + time_zone: Optional[str] = Field( + None, + description="The time zone of the external database. It is a time zone offset (a character type in the format '[+|-]TZH:TZM') or a time zone region name, depending on how the time zone value was specified when the database was created / last altered.", + ) + + +def map_externalnoncontainerdatabasesummary( + o: oci.database.models.ExternalNonContainerDatabaseSummary, +) -> ExternalNonContainerDatabaseSummary | None: + """Map oci.database.models.ExternalNonContainerDatabaseSummary → ExternalNonContainerDatabaseSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExternalNonContainerDatabaseSummary(**data) + except Exception: + return ExternalNonContainerDatabaseSummary( + character_set=getattr(o, "character_set", None), + compartment_id=getattr(o, "compartment_id", None), + database_configuration=getattr(o, "database_configuration", None), + database_edition=getattr(o, "database_edition", None), + database_management_config=getattr(o, "database_management_config", None), + database_version=getattr(o, "database_version", None), + db_id=getattr(o, "db_id", None), + db_packs=getattr(o, "db_packs", None), + db_unique_name=getattr(o, "db_unique_name", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + ncharacter_set=getattr(o, "ncharacter_set", None), + operations_insights_config=getattr(o, "operations_insights_config", None), + stack_monitoring_config=getattr(o, "stack_monitoring_config", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + ) + + +class ExternalPluggableDatabaseSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ExternalPluggableDatabaseSummary.""" + + character_set: Optional[str] = Field( + None, description="The character set of the external database." + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this ExternalPluggableDatabaseSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + database_configuration: Optional[str] = Field( + None, + description="The Oracle Database configuration Allowed values for this property are: \"RAC\", \"SINGLE_INSTANCE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + database_edition: Optional[str] = Field( + None, + description='The Oracle Database edition. Allowed values for this property are: "STANDARD_EDITION", "ENTERPRISE_EDITION", "ENTERPRISE_EDITION_HIGH_PERFORMANCE", "ENTERPRISE_EDITION_EXTREME_PERFORMANCE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + database_management_config: Optional[dict] = Field(None, description="") + database_version: Optional[str] = Field( + None, description="The Oracle Database version." + ) + db_id: Optional[str] = Field( + None, + description="The Oracle Database ID, which identifies an Oracle Database located outside of Oracle Cloud.", + ) + db_packs: Optional[str] = Field( + None, + description="The database packs licensed for the external Oracle Database.", + ) + db_unique_name: Optional[str] = Field( + None, description="The `DB_UNIQUE_NAME` of the external database." + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this ExternalPluggableDatabaseSummary. The user-friendly name for the external database. The name does not have to be unique.", + ) + external_container_database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the external_container_database_id of this ExternalPluggableDatabaseSummary. The `OCID`__ of the :func:`create_external_container_database_details` that contains the specified :func:`create_external_pluggable_database_details` resource. __ https://docs.cloud.oracle.com/iaas/Content/General/Concepts/identifiers.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this ExternalPluggableDatabaseSummary. The `OCID`__ of the Oracle Cloud Infrastructure external database resource. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this ExternalPluggableDatabaseSummary. The current state of the Oracle Cloud Infrastructure external database resource. Allowed values for this property are: "PROVISIONING", "NOT_CONNECTED", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + ncharacter_set: Optional[str] = Field( + None, description="The national character of the external database." + ) + operations_insights_config: Optional[dict] = Field(None, description="") + source_id: Optional[str] = Field( + None, + description="The `OCID`__ of the the non-container database that was converted to a pluggable database to create this resource. __ https://docs.cloud.oracle.com/iaas/Content/General/Concepts/identifiers.htm", + ) + stack_monitoring_config: Optional[dict] = Field(None, description="") + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this ExternalPluggableDatabaseSummary. The date and time the database was created.", + ) + time_zone: Optional[str] = Field( + None, + description="The time zone of the external database. It is a time zone offset (a character type in the format '[+|-]TZH:TZM') or a time zone region name, depending on how the time zone value was specified when the database was created / last altered.", + ) + + +def map_externalpluggabledatabasesummary( + o: oci.database.models.ExternalPluggableDatabaseSummary, +) -> ExternalPluggableDatabaseSummary | None: + """Map oci.database.models.ExternalPluggableDatabaseSummary → ExternalPluggableDatabaseSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ExternalPluggableDatabaseSummary(**data) + except Exception: + return ExternalPluggableDatabaseSummary( + character_set=getattr(o, "character_set", None), + compartment_id=getattr(o, "compartment_id", None), + database_configuration=getattr(o, "database_configuration", None), + database_edition=getattr(o, "database_edition", None), + database_management_config=getattr(o, "database_management_config", None), + database_version=getattr(o, "database_version", None), + db_id=getattr(o, "db_id", None), + db_packs=getattr(o, "db_packs", None), + db_unique_name=getattr(o, "db_unique_name", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + external_container_database_id=getattr( + o, "external_container_database_id", None + ), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + ncharacter_set=getattr(o, "ncharacter_set", None), + operations_insights_config=getattr(o, "operations_insights_config", None), + source_id=getattr(o, "source_id", None), + stack_monitoring_config=getattr(o, "stack_monitoring_config", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + ) + + +class FlexComponentCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.FlexComponentCollection.""" + + items: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the items of this FlexComponentCollection.", + ) + + +def map_flexcomponentcollection( + o: oci.database.models.FlexComponentCollection, +) -> FlexComponentCollection | None: + """Map oci.database.models.FlexComponentCollection → FlexComponentCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return FlexComponentCollection(**data) + except Exception: + return FlexComponentCollection( + items=getattr(o, "items", None), + ) + + +class GiMinorVersionSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.GiMinorVersionSummary.""" + + grid_image_id: Optional[str] = Field( + None, description="Grid Infrastructure Image Id" + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this GiMinorVersionSummary. A valid Oracle Grid Infrastructure (GI) software version.", + ) + + +def map_giminorversionsummary( + o: oci.database.models.GiMinorVersionSummary, +) -> GiMinorVersionSummary | None: + """Map oci.database.models.GiMinorVersionSummary → GiMinorVersionSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return GiMinorVersionSummary(**data) + except Exception: + return GiMinorVersionSummary( + grid_image_id=getattr(o, "grid_image_id", None), + version=getattr(o, "version", None), + ) + + +class GiVersionSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.GiVersionSummary.""" + + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this GiVersionSummary. A valid Oracle Grid Infrastructure (GI) software version.", + ) + + +def map_giversionsummary( + o: oci.database.models.GiVersionSummary, +) -> GiVersionSummary | None: + """Map oci.database.models.GiVersionSummary → GiVersionSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return GiVersionSummary(**data) + except Exception: + return GiVersionSummary( + version=getattr(o, "version", None), + ) + + +class KeyStoreSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.KeyStoreSummary.""" + + associated_databases: Optional[list[dict]] = Field( + None, description="List of databases associated with the key store." + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this KeyStoreSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this KeyStoreSummary. The user-friendly name for the key store. The name does not need to be unique.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this KeyStoreSummary. The `OCID`__ of the key store. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this KeyStoreSummary. The current state of the key store. Allowed values for this property are: "ACTIVE", "DELETED", "NEEDS_ATTENTION", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_created: Optional[datetime] = Field( + None, description="The date and time that the key store was created." + ) + type_details: Optional[dict] = Field( + None, + description="**[Required]** Gets the type_details of this KeyStoreSummary.", + ) + + +def map_keystoresummary( + o: oci.database.models.KeyStoreSummary, +) -> KeyStoreSummary | None: + """Map oci.database.models.KeyStoreSummary → KeyStoreSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return KeyStoreSummary(**data) + except Exception: + return KeyStoreSummary( + associated_databases=getattr(o, "associated_databases", None), + compartment_id=getattr(o, "compartment_id", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + time_created=getattr(o, "time_created", None), + type_details=getattr(o, "type_details", None), + ) + + +class MaintenanceRunHistorySummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.MaintenanceRunHistorySummary.""" + + current_execution_window: Optional[str] = Field( + None, description="The OCID of the current execution window." + ) + db_servers_history_details: Optional[list[dict]] = Field( + None, description="List of database server history details." + ) + granular_maintenance_history: Optional[int] = Field( + None, description="The list of granular maintenance history details." + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this MaintenanceRunHistorySummary. The OCID of the maintenance run history.", + ) + maintenance_run_details: Optional[int] = Field(None, description="") + + +def map_maintenancerunhistorysummary( + o: oci.database.models.MaintenanceRunHistorySummary, +) -> MaintenanceRunHistorySummary | None: + """Map oci.database.models.MaintenanceRunHistorySummary → MaintenanceRunHistorySummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return MaintenanceRunHistorySummary(**data) + except Exception: + return MaintenanceRunHistorySummary( + current_execution_window=getattr(o, "current_execution_window", None), + db_servers_history_details=getattr(o, "db_servers_history_details", None), + granular_maintenance_history=getattr( + o, "granular_maintenance_history", None + ), + id=getattr(o, "id", None), + maintenance_run_details=getattr(o, "maintenance_run_details", None), + ) + + +class MaintenanceRunSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.MaintenanceRunSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this MaintenanceRunSummary. The OCID of the compartment.", + ) + current_custom_action_timeout_in_mins: Optional[int] = Field( + None, + description="Extend current custom action timeout between the current database servers during waiting state, from 0 (zero) to 30 minutes.", + ) + current_patching_component: Optional[str] = Field( + None, + description="The name of the current infrastruture component that is getting patched.", + ) + custom_action_timeout_in_mins: Optional[int] = Field( + None, + description="Determines the amount of time the system will wait before the start of each database server patching operation. Specify a number of minutes, from 15 to 120.", + ) + database_software_image_id: Optional[str] = Field( + None, + description="The Autonomous Database Software Image `OCID`__ __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + description: Optional[str] = Field( + None, description="Description of the maintenance run." + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this MaintenanceRunSummary. The user-friendly name for the maintenance run.", + ) + estimated_component_patching_start_time: Optional[datetime] = Field( + None, + description="The estimated start time of the next infrastruture component patching operation.", + ) + estimated_patching_time: Optional[str] = Field(None, description="") + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this MaintenanceRunSummary. The OCID of the maintenance run.", + ) + is_custom_action_timeout_enabled: Optional[bool] = Field( + None, + description="If true, enables the configuration of a custom action timeout (waiting period) between database servers patching operations.", + ) + is_dst_file_update_enabled: Optional[bool] = Field( + None, + description="Indicates if an automatic DST Time Zone file update is enabled for the Autonomous Container Database. If enabled along with Release Update, patching will be done in a Non-Rolling manner.", + ) + is_maintenance_run_granular: Optional[bool] = Field( + None, + description="If `FALSE`, the maintenance run doesn't support granular maintenance.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this MaintenanceRunSummary. The current state of the maintenance run. For Autonomous Database Serverless instances, valid states are IN_PROGRESS, SUCCEEDED, and FAILED. Allowed values for this property are: "SCHEDULED", "IN_PROGRESS", "SUCCEEDED", "SKIPPED", "FAILED", "UPDATING", "DELETING", "DELETED", "CANCELED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + maintenance_subtype: Optional[str] = Field( + None, + description='Maintenance sub-type. Allowed values for this property are: "QUARTERLY", "HARDWARE", "CRITICAL", "INFRASTRUCTURE", "DATABASE", "ONEOFF", "SECURITY_MONTHLY", "TIMEZONE", "CUSTOM_DATABASE_SOFTWARE_IMAGE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + maintenance_type: Optional[str] = Field( + None, + description="Maintenance type. Allowed values for this property are: \"PLANNED\", \"UNPLANNED\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + patch_failure_count: Optional[int] = Field( + None, description="Contain the patch failure count." + ) + patch_id: Optional[str] = Field( + None, + description="The unique identifier of the patch. The identifier string includes the patch type, the Oracle Database version, and the patch creation date (using the format YYMMDD). For example, the identifier `ru_patch_19.9.0.0_201030` is used for an RU patch for Oracle Database 19.9.0.0 that was released October 30, 2020.", + ) + patching_end_time: Optional[datetime] = Field( + None, description="The time when the patching operation ended." + ) + patching_mode: Optional[str] = Field( + None, + description='Cloud Exadata infrastructure node patching method, either "ROLLING" or "NONROLLING". Default value is ROLLING. *IMPORTANT*: Non-rolling infrastructure patching involves system down time. See `Oracle-Managed Infrastructure Maintenance Updates`__ for more information. __ https://docs.cloud.oracle.com/iaas/Content/Database/Concepts/examaintenance.htm#Oracle Allowed values for this property are: "ROLLING", "NONROLLING", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + patching_start_time: Optional[datetime] = Field( + None, description="The time when the patching operation started." + ) + patching_status: Optional[str] = Field( + None, + description='The status of the patching operation. Allowed values for this property are: "PATCHING", "WAITING", "SCHEDULED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + peer_maintenance_run_id: Optional[str] = Field( + None, + description="The `OCID`__ of the maintenance run for the Autonomous Data Guard association's peer container database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + target_db_server_version: Optional[str] = Field( + None, + description="The target software version for the database server patching operation.", + ) + target_resource_id: Optional[str] = Field( + None, + description="The ID of the target resource on which the maintenance run occurs.", + ) + target_resource_type: Optional[str] = Field( + None, + description='The type of the target resource on which the maintenance run occurs. Allowed values for this property are: "AUTONOMOUS_EXADATA_INFRASTRUCTURE", "AUTONOMOUS_CONTAINER_DATABASE", "EXADATA_DB_SYSTEM", "CLOUD_EXADATA_INFRASTRUCTURE", "EXACC_INFRASTRUCTURE", "AUTONOMOUS_VM_CLUSTER", "AUTONOMOUS_DATABASE", "CLOUD_AUTONOMOUS_VM_CLUSTER", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + target_storage_server_version: Optional[str] = Field( + None, description="The target Cell version that is to be patched to." + ) + time_ended: Optional[datetime] = Field( + None, description="The date and time the maintenance run was completed." + ) + time_scheduled: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_scheduled of this MaintenanceRunSummary. The date and time the maintenance run is scheduled to occur.", + ) + time_started: Optional[datetime] = Field( + None, description="The date and time the maintenance run starts." + ) + total_time_taken_in_mins: Optional[int] = Field( + None, + description="The total time taken by corresponding resource activity in minutes.", + ) + + +def map_maintenancerunsummary( + o: oci.database.models.MaintenanceRunSummary, +) -> MaintenanceRunSummary | None: + """Map oci.database.models.MaintenanceRunSummary → MaintenanceRunSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return MaintenanceRunSummary(**data) + except Exception: + return MaintenanceRunSummary( + compartment_id=getattr(o, "compartment_id", None), + current_custom_action_timeout_in_mins=getattr( + o, "current_custom_action_timeout_in_mins", None + ), + current_patching_component=getattr(o, "current_patching_component", None), + custom_action_timeout_in_mins=getattr( + o, "custom_action_timeout_in_mins", None + ), + database_software_image_id=getattr(o, "database_software_image_id", None), + description=getattr(o, "description", None), + display_name=getattr(o, "display_name", None), + estimated_component_patching_start_time=getattr( + o, "estimated_component_patching_start_time", None + ), + estimated_patching_time=getattr(o, "estimated_patching_time", None), + id=getattr(o, "id", None), + is_custom_action_timeout_enabled=getattr( + o, "is_custom_action_timeout_enabled", None + ), + is_dst_file_update_enabled=getattr(o, "is_dst_file_update_enabled", None), + is_maintenance_run_granular=getattr(o, "is_maintenance_run_granular", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + maintenance_subtype=getattr(o, "maintenance_subtype", None), + maintenance_type=getattr(o, "maintenance_type", None), + patch_failure_count=getattr(o, "patch_failure_count", None), + patch_id=getattr(o, "patch_id", None), + patching_end_time=getattr(o, "patching_end_time", None), + patching_mode=getattr(o, "patching_mode", None), + patching_start_time=getattr(o, "patching_start_time", None), + patching_status=getattr(o, "patching_status", None), + peer_maintenance_run_id=getattr(o, "peer_maintenance_run_id", None), + target_db_server_version=getattr(o, "target_db_server_version", None), + target_resource_id=getattr(o, "target_resource_id", None), + target_resource_type=getattr(o, "target_resource_type", None), + target_storage_server_version=getattr( + o, "target_storage_server_version", None + ), + time_ended=getattr(o, "time_ended", None), + time_scheduled=getattr(o, "time_scheduled", None), + time_started=getattr(o, "time_started", None), + total_time_taken_in_mins=getattr(o, "total_time_taken_in_mins", None), + ) + + +class OneoffPatchSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.OneoffPatchSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this OneoffPatchSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + db_version: Optional[str] = Field( + None, + description="**[Required]** Gets the db_version of this OneoffPatchSummary. A valid Oracle Database version. For a list of supported versions, use the ListDbVersions operation. This cannot be updated in parallel with any of the following: licenseModel, dbEdition, cpuCoreCount, computeCount, computeModel, adminPassword, whitelistedIps, isMTLSConnectionRequired, openMode, permissionLevel, dbWorkload, privateEndpointLabel, nsgIds, isRefreshable, dbName, scheduledOperations, dbToolsDetails, isLocalDataGuardEnabled, or isFreeTier.", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this OneoffPatchSummary. One-off patch name.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this OneoffPatchSummary. The `OCID`__ of the one-off patch. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Detailed message for the lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this OneoffPatchSummary. The current state of the one-off patch. Allowed values for this property are: "CREATING", "AVAILABLE", "UPDATING", "INACTIVE", "FAILED", "EXPIRED", "DELETING", "DELETED", "TERMINATING", "TERMINATED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + one_off_patches: Optional[str] = Field( + None, description="List of one-off patches for Database Homes." + ) + release_update: Optional[str] = Field( + None, + description="**[Required]** Gets the release_update of this OneoffPatchSummary. The PSU or PBP or Release Updates. To get a list of supported versions, use the :func:`list_db_versions` operation.", + ) + sha256_sum: Optional[str] = Field( + None, description="SHA-256 checksum of the one-off patch." + ) + size_in_kbs: Optional[float] = Field( + None, description="The size of one-off patch in kilobytes." + ) + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this OneoffPatchSummary. The date and time one-off patch was created.", + ) + time_of_expiration: Optional[datetime] = Field( + None, + description="The date and time until which the one-off patch will be available for download.", + ) + time_updated: Optional[datetime] = Field( + None, description="The date and time one-off patch was updated." + ) + + +def map_oneoffpatchsummary( + o: oci.database.models.OneoffPatchSummary, +) -> OneoffPatchSummary | None: + """Map oci.database.models.OneoffPatchSummary → OneoffPatchSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return OneoffPatchSummary(**data) + except Exception: + return OneoffPatchSummary( + compartment_id=getattr(o, "compartment_id", None), + db_version=getattr(o, "db_version", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + one_off_patches=getattr(o, "one_off_patches", None), + release_update=getattr(o, "release_update", None), + sha256_sum=getattr(o, "sha256_sum", None), + size_in_kbs=getattr(o, "size_in_kbs", None), + time_created=getattr(o, "time_created", None), + time_of_expiration=getattr(o, "time_of_expiration", None), + time_updated=getattr(o, "time_updated", None), + ) + + +class PluggableDatabaseSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.PluggableDatabaseSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this PluggableDatabaseSummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + connection_strings: Optional[str] = Field(None, description="") + container_database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the container_database_id of this PluggableDatabaseSummary. The `OCID`__ of the CDB. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this PluggableDatabaseSummary. The `OCID`__ of the pluggable database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_restricted: Optional[bool] = Field( + None, + description="The restricted mode of the pluggable database. If a pluggable database is opened in restricted mode, the user needs both create a session and have restricted session privileges to connect to it.", + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + kms_key_version_id: Optional[str] = Field( + None, + description="The OCID of the key container version that is used in database transparent data encryption (TDE) operations KMS Key can have multiple key versions. If none is specified, the current key version (latest) of the Key Id is used for the operation. Autonomous Database Serverless does not use key versions, hence is not applicable for Autonomous Database Serverless instances.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Detailed message for the lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this PluggableDatabaseSummary. The current state of the pluggable database. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "TERMINATING", "TERMINATED", "UPDATING", "FAILED", "RELOCATING", "RELOCATED", "REFRESHING", "RESTORE_IN_PROGRESS", "RESTORE_FAILED", "BACKUP_IN_PROGRESS", "DISABLED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + open_mode: Optional[str] = Field( + None, + description='**[Required]** Gets the open_mode of this PluggableDatabaseSummary. **Deprecated.** Use :func:`pluggable_database_node_level_details` for OpenMode details. The mode that pluggable database is in. Open mode can only be changed to READ_ONLY or MIGRATE directly from the backend (within the Oracle Database software). Allowed values for this property are: "READ_ONLY", "READ_WRITE", "MOUNTED", "MIGRATE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + pdb_name: Optional[str] = Field( + None, + description="**[Required]** Gets the pdb_name of this PluggableDatabaseSummary. The name for the pluggable database (PDB). The name is unique in the context of a :class:`Database`. The name must begin with an alphabetic character and can contain a maximum of thirty alphanumeric characters. Special characters are not permitted. The pluggable database name should not be same as the container database name.", + ) + pdb_node_level_details: Optional[list[dict]] = Field( + None, + description='Pluggable Database Node Level Details. Example: [{"nodeName" : "node1", "openMode" : "READ_WRITE"}, {"nodeName" : "node2", "openMode" : "READ_ONLY"}]', + ) + pluggable_database_management_config: Optional[dict] = Field(None, description="") + refreshable_clone_config: Optional[dict] = Field(None, description="") + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this PluggableDatabaseSummary. The date and time the pluggable database was created.", + ) + + +def map_pluggabledatabasesummary( + o: oci.database.models.PluggableDatabaseSummary, +) -> PluggableDatabaseSummary | None: + """Map oci.database.models.PluggableDatabaseSummary → PluggableDatabaseSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return PluggableDatabaseSummary(**data) + except Exception: + return PluggableDatabaseSummary( + compartment_id=getattr(o, "compartment_id", None), + connection_strings=getattr(o, "connection_strings", None), + container_database_id=getattr(o, "container_database_id", None), + defined_tags=getattr(o, "defined_tags", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + is_restricted=getattr(o, "is_restricted", None), + kms_key_id=getattr(o, "kms_key_id", None), + kms_key_version_id=getattr(o, "kms_key_version_id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + open_mode=getattr(o, "open_mode", None), + pdb_name=getattr(o, "pdb_name", None), + pdb_node_level_details=getattr(o, "pdb_node_level_details", None), + pluggable_database_management_config=getattr( + o, "pluggable_database_management_config", None + ), + refreshable_clone_config=getattr(o, "refreshable_clone_config", None), + time_created=getattr(o, "time_created", None), + ) + + +class ScheduledActionCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ScheduledActionCollection.""" + + items: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the items of this ScheduledActionCollection. List of Scheduled Action resources.", + ) + + +def map_scheduledactioncollection( + o: oci.database.models.ScheduledActionCollection, +) -> ScheduledActionCollection | None: + """Map oci.database.models.ScheduledActionCollection → ScheduledActionCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ScheduledActionCollection(**data) + except Exception: + return ScheduledActionCollection( + items=getattr(o, "items", None), + ) + + +class SchedulingPlanCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.SchedulingPlanCollection.""" + + items: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the items of this SchedulingPlanCollection. List of Scheduling Plan resources.", + ) + + +def map_schedulingplancollection( + o: oci.database.models.SchedulingPlanCollection, +) -> SchedulingPlanCollection | None: + """Map oci.database.models.SchedulingPlanCollection → SchedulingPlanCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return SchedulingPlanCollection(**data) + except Exception: + return SchedulingPlanCollection( + items=getattr(o, "items", None), + ) + + +class SchedulingPolicySummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.SchedulingPolicySummary.""" + + cadence: Optional[str] = Field( + None, + description='**[Required]** Gets the cadence of this SchedulingPolicySummary. The cadence period. Allowed values for this property are: "HALFYEARLY", "QUARTERLY", "MONTHLY", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + cadence_start_month: Optional[str] = Field( + None, description="Start of the month to be followed during the cadence period." + ) + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this SchedulingPolicySummary. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="**[Required]** Gets the display_name of this SchedulingPolicySummary. The user-friendly name for the Scheduling Policy. The name does not need to be unique.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this SchedulingPolicySummary. The `OCID`__ of the Scheduling Policy. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this SchedulingPolicySummary. The current state of the Scheduling Policy. Valid states are CREATING, NEEDS_ATTENTION, ACTIVE, UPDATING, FAILED, DELETING and DELETED. Allowed values for this property are: "CREATING", "NEEDS_ATTENTION", "AVAILABLE", "UPDATING", "FAILED", "DELETING", "DELETED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the Scheduling Policy was created." + ) + time_next_window_starts: Optional[datetime] = Field( + None, + description="The date and time of the next scheduling window associated with the schedulingPolicy is planned to start.", + ) + time_updated: Optional[datetime] = Field( + None, + description="The last date and time that the Scheduling Policy was updated.", + ) + + +def map_schedulingpolicysummary( + o: oci.database.models.SchedulingPolicySummary, +) -> SchedulingPolicySummary | None: + """Map oci.database.models.SchedulingPolicySummary → SchedulingPolicySummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return SchedulingPolicySummary(**data) + except Exception: + return SchedulingPolicySummary( + cadence=getattr(o, "cadence", None), + cadence_start_month=getattr(o, "cadence_start_month", None), + compartment_id=getattr(o, "compartment_id", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + time_created=getattr(o, "time_created", None), + time_next_window_starts=getattr(o, "time_next_window_starts", None), + time_updated=getattr(o, "time_updated", None), + ) + + +class SchedulingWindowSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.SchedulingWindowSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="The user-friendly name for the Scheduling Window. The name does not need to be unique.", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this SchedulingWindowSummary. The `OCID`__ of the Scheduling Window. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this SchedulingWindowSummary. The current state of the Scheduling Window. Valid states are CREATING, ACTIVE, UPDATING, FAILED, DELETING and DELETED. Allowed values for this property are: "CREATING", "AVAILABLE", "UPDATING", "FAILED", "DELETING", "DELETED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + scheduling_policy_id: Optional[str] = Field( + None, + description="**[Required]** Gets the scheduling_policy_id of this SchedulingWindowSummary. The `OCID`__ of the Scheduling Policy. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + time_created: Optional[datetime] = Field( + None, description="The date and time the Scheduling Window was created." + ) + time_next_scheduling_window_starts: Optional[datetime] = Field( + None, + description="The date and time of the next upcoming window associated within the schedulingWindow is planned to start.", + ) + time_updated: Optional[datetime] = Field( + None, + description="The last date and time that the Scheduling Window was updated.", + ) + window_preference: Optional[str] = Field( + None, + description="**[Required]** Gets the window_preference of this SchedulingWindowSummary.", + ) + + +def map_schedulingwindowsummary( + o: oci.database.models.SchedulingWindowSummary, +) -> SchedulingWindowSummary | None: + """Map oci.database.models.SchedulingWindowSummary → SchedulingWindowSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return SchedulingWindowSummary(**data) + except Exception: + return SchedulingWindowSummary( + compartment_id=getattr(o, "compartment_id", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + scheduling_policy_id=getattr(o, "scheduling_policy_id", None), + time_created=getattr(o, "time_created", None), + time_next_scheduling_window_starts=getattr( + o, "time_next_scheduling_window_starts", None + ), + time_updated=getattr(o, "time_updated", None), + window_preference=getattr(o, "window_preference", None), + ) + + +class SystemVersionCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.SystemVersionCollection.""" + + items: Optional[list[dict]] = Field( + None, + description="**[Required]** Gets the items of this SystemVersionCollection. List of System versions.", + ) + + +def map_systemversioncollection( + o: oci.database.models.SystemVersionCollection, +) -> SystemVersionCollection | None: + """Map oci.database.models.SystemVersionCollection → SystemVersionCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return SystemVersionCollection(**data) + except Exception: + return SystemVersionCollection( + items=getattr(o, "items", None), + ) + + +class VmClusterNetworkSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.VmClusterNetworkSummary.""" + + compartment_id: Optional[str] = Field( + None, + description="The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="The user-friendly name for the VM cluster network. The name does not need to be unique.", + ) + dns: Optional[str] = Field( + None, description="The list of DNS server IP addresses. Maximum of 3 allowed." + ) + dr_scans: Optional[list[dict]] = Field( + None, description="The SCAN details for DR network" + ) + exadata_infrastructure_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Exadata infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="The `OCID`__ of the VM cluster network. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the VM cluster network. CREATING - The resource is being created REQUIRES_VALIDATION - The resource is created and may not be usable until it is validated. VALIDATING - The resource is being validated and not available to use. VALIDATED - The resource is validated and is available for consumption by VM cluster. VALIDATION_FAILED - The resource validation has failed and might require user input to be corrected. UPDATING - The resource is being updated and not available to use. ALLOCATED - The resource is is currently being used by VM cluster. TERMINATING - The resource is being deleted and not available to use. TERMINATED - The resource is deleted and unavailable. FAILED - The resource is in a failed state due to validation or other errors. NEEDS_ATTENTION - The resource is in needs attention state as some of it\'s child nodes are not validated and unusable by VM cluster. Allowed values for this property are: "CREATING", "REQUIRES_VALIDATION", "VALIDATING", "VALIDATED", "VALIDATION_FAILED", "UPDATING", "ALLOCATED", "TERMINATING", "TERMINATED", "FAILED", "NEEDS_ATTENTION", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + ntp: Optional[str] = Field( + None, description="The list of NTP server IP addresses. Maximum of 3 allowed." + ) + scans: Optional[list[dict]] = Field(None, description="The SCAN details.") + time_created: Optional[datetime] = Field( + None, description="The date and time when the VM cluster network was created." + ) + vm_cluster_id: Optional[str] = Field( + None, + description="The `OCID`__ of the associated VM Cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + vm_networks: Optional[list[dict]] = Field( + None, description="Details of the client and backup networks." + ) + + +def map_vmclusternetworksummary( + o: oci.database.models.VmClusterNetworkSummary, +) -> VmClusterNetworkSummary | None: + """Map oci.database.models.VmClusterNetworkSummary → VmClusterNetworkSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return VmClusterNetworkSummary(**data) + except Exception: + return VmClusterNetworkSummary( + compartment_id=getattr(o, "compartment_id", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + dns=getattr(o, "dns", None), + dr_scans=getattr(o, "dr_scans", None), + exadata_infrastructure_id=getattr(o, "exadata_infrastructure_id", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + ntp=getattr(o, "ntp", None), + scans=getattr(o, "scans", None), + time_created=getattr(o, "time_created", None), + vm_cluster_id=getattr(o, "vm_cluster_id", None), + vm_networks=getattr(o, "vm_networks", None), + ) + + +class VmClusterUpdateSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.VmClusterUpdateSummary.""" + + available_actions: Optional[str] = Field( + None, + description='The possible actions that can be performed using this maintenance update. Allowed values for items in this list are: "ROLLING_APPLY", "PRECHECK", "ROLLBACK", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + description: Optional[str] = Field( + None, + description="**[Required]** Gets the description of this VmClusterUpdateSummary. Details of the maintenance update package.", + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this VmClusterUpdateSummary. The `OCID`__ of the maintenance update. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + last_action: Optional[str] = Field( + None, + description='The update action performed most recently using this maintenance update. Allowed values for this property are: "ROLLING_APPLY", "PRECHECK", "ROLLBACK", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + lifecycle_details: Optional[str] = Field( + None, + description="Descriptive text providing additional details about the lifecycle state.", + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the maintenance update. Dependent on value of `lastAction`. Allowed values for this property are: "AVAILABLE", "SUCCESS", "IN_PROGRESS", "FAILED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + time_released: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_released of this VmClusterUpdateSummary. The date and time the maintenance update was released.", + ) + update_type: Optional[str] = Field( + None, + description='**[Required]** Gets the update_type of this VmClusterUpdateSummary. The type of VM cluster maintenance update. Allowed values for this property are: "GI_UPGRADE", "GI_PATCH", "OS_UPDATE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + version: Optional[str] = Field( + None, + description="**[Required]** Gets the version of this VmClusterUpdateSummary. The version of the maintenance update package.", + ) + + +def map_vmclusterupdatesummary( + o: oci.database.models.VmClusterUpdateSummary, +) -> VmClusterUpdateSummary | None: + """Map oci.database.models.VmClusterUpdateSummary → VmClusterUpdateSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return VmClusterUpdateSummary(**data) + except Exception: + return VmClusterUpdateSummary( + available_actions=getattr(o, "available_actions", None), + description=getattr(o, "description", None), + id=getattr(o, "id", None), + last_action=getattr(o, "last_action", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + time_released=getattr(o, "time_released", None), + update_type=getattr(o, "update_type", None), + version=getattr(o, "version", None), + ) + + +class VmClusterSummary(OCIBaseModel): + """Pydantic model mirroring oci.database.models.VmClusterSummary.""" + + availability_domain: Optional[str] = Field( + None, + description="The name of the availability domain that the VM cluster is located in.", + ) + cloud_automation_update_details: Optional[datetime] = Field(None, description="") + compartment_id: Optional[str] = Field( + None, + description="The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + compute_model: Optional[str] = Field( + None, + description="The compute model of the Autonomous Database. This is required if using the `computeCount` parameter. If using `cpuCoreCount` then it is an error to specify `computeModel` to a non-null value. ECPU compute model is the recommended model and OCPU compute model is legacy. Allowed values for this property are: \"ECPU\", \"OCPU\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + cpus_enabled: Optional[int] = Field( + None, description="The number of enabled CPU cores." + ) + data_collection_options: Optional[dict] = Field(None, description="") + data_storage_size_in_gbs: Optional[float] = Field( + None, description="Size of the DATA disk group in GBs." + ) + data_storage_size_in_tbs: Optional[float] = Field( + None, description="Size, in terabytes, of the DATA disk group." + ) + db_node_storage_size_in_gbs: Optional[int] = Field( + None, description="The local node storage allocated in GBs." + ) + db_servers: Optional[str] = Field(None, description="The list of Db server.") + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + display_name: Optional[str] = Field( + None, + description="The user-friendly name for the Exadata Cloud@Customer VM cluster. The name does not need to be unique.", + ) + exadata_infrastructure_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Exadata infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + exascale_db_storage_vault_id: Optional[str] = Field( + None, + description="The `OCID`__ of the Exadata Database Storage Vault. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + file_system_configuration_details: Optional[list[dict]] = Field( + None, description="Details of the file system configuration of the VM cluster." + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + gi_software_image_id: Optional[str] = Field( + None, + description="The `OCID`__ of a grid infrastructure software image. This is a database software image of the type `GRID_IMAGE`. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + gi_version: Optional[str] = Field( + None, + description="The Oracle Grid Infrastructure software version for the VM cluster.", + ) + id: Optional[str] = Field( + None, + description="The `OCID`__ of the VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_local_backup_enabled: Optional[bool] = Field( + None, + description="If true, database backup on local Exadata storage is configured for the VM cluster. If false, database backup on local Exadata storage is not available in the VM cluster.", + ) + is_sparse_diskgroup_enabled: Optional[bool] = Field( + None, + description="If true, sparse disk group is configured for the VM cluster. If false, sparse disk group is not created.", + ) + last_patch_history_entry_id: Optional[str] = Field( + None, + description="The `OCID`__ of the last patch history. This value is updated as soon as a patch operation starts. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + license_model: Optional[str] = Field( + None, + description="The Oracle license model that applies to the VM cluster. The default is LICENSE_INCLUDED. Allowed values for this property are: \"LICENSE_INCLUDED\", \"BRING_YOUR_OWN_LICENSE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Additional information about the current lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='The current state of the VM cluster. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + memory_size_in_gbs: Optional[int] = Field( + None, description="The memory allocated in GBs." + ) + ocpus_enabled: Optional[float] = Field( + None, description="The number of enabled OCPU cores." + ) + shape: Optional[str] = Field( + None, + description="The shape of the Exadata infrastructure. The shape determines the amount of CPU, storage, and memory resources allocated to the instance.", + ) + ssh_public_keys: Optional[str] = Field( + None, + description="The public key portion of one or more key pairs used for SSH access to the VM cluster.", + ) + storage_management_type: Optional[str] = Field( + None, + description="Specifies whether the type of storage management for the VM cluster is ASM or Exascale. Allowed values for this property are: \"ASM\", \"EXASCALE\", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'.", + ) + system_version: Optional[str] = Field( + None, description="Operating system version of the image." + ) + time_created: Optional[datetime] = Field( + None, description="The date and time that the VM cluster was created." + ) + time_zone: Optional[str] = Field( + None, + description="The time zone of the Exadata infrastructure. For details, see `Exadata Infrastructure Time Zones`__. __ https://docs.cloud.oracle.com/Content/Database/References/timezones.htm", + ) + vm_cluster_network_id: Optional[str] = Field( + None, + description="The `OCID`__ of the VM cluster network. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + + +def map_vmclustersummary( + o: oci.database.models.VmClusterSummary, +) -> VmClusterSummary | None: + """Map oci.database.models.VmClusterSummary → VmClusterSummary Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return VmClusterSummary(**data) + except Exception: + return VmClusterSummary( + availability_domain=getattr(o, "availability_domain", None), + cloud_automation_update_details=getattr( + o, "cloud_automation_update_details", None + ), + compartment_id=getattr(o, "compartment_id", None), + compute_model=getattr(o, "compute_model", None), + cpus_enabled=getattr(o, "cpus_enabled", None), + data_collection_options=getattr(o, "data_collection_options", None), + data_storage_size_in_gbs=getattr(o, "data_storage_size_in_gbs", None), + data_storage_size_in_tbs=getattr(o, "data_storage_size_in_tbs", None), + db_node_storage_size_in_gbs=getattr(o, "db_node_storage_size_in_gbs", None), + db_servers=getattr(o, "db_servers", None), + defined_tags=getattr(o, "defined_tags", None), + display_name=getattr(o, "display_name", None), + exadata_infrastructure_id=getattr(o, "exadata_infrastructure_id", None), + exascale_db_storage_vault_id=getattr( + o, "exascale_db_storage_vault_id", None + ), + file_system_configuration_details=getattr( + o, "file_system_configuration_details", None + ), + freeform_tags=getattr(o, "freeform_tags", None), + gi_software_image_id=getattr(o, "gi_software_image_id", None), + gi_version=getattr(o, "gi_version", None), + id=getattr(o, "id", None), + is_local_backup_enabled=getattr(o, "is_local_backup_enabled", None), + is_sparse_diskgroup_enabled=getattr(o, "is_sparse_diskgroup_enabled", None), + last_patch_history_entry_id=getattr(o, "last_patch_history_entry_id", None), + license_model=getattr(o, "license_model", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + memory_size_in_gbs=getattr(o, "memory_size_in_gbs", None), + ocpus_enabled=getattr(o, "ocpus_enabled", None), + shape=getattr(o, "shape", None), + ssh_public_keys=getattr(o, "ssh_public_keys", None), + storage_management_type=getattr(o, "storage_management_type", None), + system_version=getattr(o, "system_version", None), + time_created=getattr(o, "time_created", None), + time_zone=getattr(o, "time_zone", None), + vm_cluster_network_id=getattr(o, "vm_cluster_network_id", None), + ) + + +class ResourcePoolShapeCollection(OCIBaseModel): + """Pydantic model mirroring oci.database.models.ResourcePoolShapeCollection.""" + + items: Optional[list[dict]] = Field( + None, description="List of Autonomous Database resource pools Shapes." + ) + + +def map_resourcepoolshapecollection( + o: oci.database.models.ResourcePoolShapeCollection, +) -> ResourcePoolShapeCollection | None: + """Map oci.database.models.ResourcePoolShapeCollection → ResourcePoolShapeCollection Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return ResourcePoolShapeCollection(**data) + except Exception: + return ResourcePoolShapeCollection( + items=getattr(o, "items", None), + ) + + +class PluggableDatabase(OCIBaseModel): + """Pydantic model mirroring oci.database.models.PluggableDatabase.""" + + compartment_id: Optional[str] = Field( + None, + description="**[Required]** Gets the compartment_id of this PluggableDatabase. The `OCID`__ of the compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + connection_strings: Optional[str] = Field(None, description="") + container_database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the container_database_id of this PluggableDatabase. The `OCID`__ of the CDB. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + id: Optional[str] = Field( + None, + description="**[Required]** Gets the id of this PluggableDatabase. The `OCID`__ of the pluggable database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + is_restricted: Optional[bool] = Field( + None, + description="The restricted mode of the pluggable database. If a pluggable database is opened in restricted mode, the user needs both create a session and have restricted session privileges to connect to it.", + ) + kms_key_id: Optional[str] = Field( + None, + description="The OCID of the key container that is used as the master encryption key in database transparent data encryption (TDE) operations.", + ) + kms_key_version_id: Optional[str] = Field( + None, + description="The OCID of the key container version that is used in database transparent data encryption (TDE) operations KMS Key can have multiple key versions. If none is specified, the current key version (latest) of the Key Id is used for the operation. Autonomous Database Serverless does not use key versions, hence is not applicable for Autonomous Database Serverless instances.", + ) + lifecycle_details: Optional[str] = Field( + None, description="Detailed message for the lifecycle state." + ) + lifecycle_state: Optional[str] = Field( + None, + description='**[Required]** Gets the lifecycle_state of this PluggableDatabase. The current state of the pluggable database. Allowed values for this property are: "PROVISIONING", "AVAILABLE", "TERMINATING", "TERMINATED", "UPDATING", "FAILED", "RELOCATING", "RELOCATED", "REFRESHING", "RESTORE_IN_PROGRESS", "RESTORE_FAILED", "BACKUP_IN_PROGRESS", "DISABLED", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + open_mode: Optional[str] = Field( + None, + description='**[Required]** Gets the open_mode of this PluggableDatabase. **Deprecated.** Use :func:`pluggable_database_node_level_details` for OpenMode details. The mode that pluggable database is in. Open mode can only be changed to READ_ONLY or MIGRATE directly from the backend (within the Oracle Database software). Allowed values for this property are: "READ_ONLY", "READ_WRITE", "MOUNTED", "MIGRATE", \'UNKNOWN_ENUM_VALUE\'. Any unrecognized values returned by a service will be mapped to \'UNKNOWN_ENUM_VALUE\'.', + ) + pdb_name: Optional[str] = Field( + None, + description="**[Required]** Gets the pdb_name of this PluggableDatabase. The name for the pluggable database (PDB). The name is unique in the context of a :class:`Database`. The name must begin with an alphabetic character and can contain a maximum of thirty alphanumeric characters. Special characters are not permitted. The pluggable database name should not be same as the container database name.", + ) + pdb_node_level_details: Optional[list[dict]] = Field( + None, + description='Pluggable Database Node Level Details. Example: [{"nodeName" : "node1", "openMode" : "READ_WRITE"}, {"nodeName" : "node2", "openMode" : "READ_ONLY"}]', + ) + pluggable_database_management_config: Optional[dict] = Field(None, description="") + refreshable_clone_config: Optional[dict] = Field(None, description="") + time_created: Optional[datetime] = Field( + None, + description="**[Required]** Gets the time_created of this PluggableDatabase. The date and time the pluggable database was created.", + ) + + +def map_pluggabledatabase( + o: oci.database.models.PluggableDatabase, +) -> PluggableDatabase | None: + """Map oci.database.models.PluggableDatabase → PluggableDatabase Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return PluggableDatabase(**data) + except Exception: + return PluggableDatabase( + compartment_id=getattr(o, "compartment_id", None), + connection_strings=getattr(o, "connection_strings", None), + container_database_id=getattr(o, "container_database_id", None), + defined_tags=getattr(o, "defined_tags", None), + freeform_tags=getattr(o, "freeform_tags", None), + id=getattr(o, "id", None), + is_restricted=getattr(o, "is_restricted", None), + kms_key_id=getattr(o, "kms_key_id", None), + kms_key_version_id=getattr(o, "kms_key_version_id", None), + lifecycle_details=getattr(o, "lifecycle_details", None), + lifecycle_state=getattr(o, "lifecycle_state", None), + open_mode=getattr(o, "open_mode", None), + pdb_name=getattr(o, "pdb_name", None), + pdb_node_level_details=getattr(o, "pdb_node_level_details", None), + pluggable_database_management_config=getattr( + o, "pluggable_database_management_config", None + ), + refreshable_clone_config=getattr(o, "refreshable_clone_config", None), + time_created=getattr(o, "time_created", None), + ) + + +class CreatePluggableDatabaseDetails(OCIBaseModel): + """Pydantic model mirroring oci.database.models.CreatePluggableDatabaseDetails.""" + + container_database_admin_password: Optional[str] = Field( + None, + description="The DB system administrator password of the Container Database.", + ) + container_database_id: Optional[str] = Field( + None, + description="**[Required]** Gets the container_database_id of this CreatePluggableDatabaseDetails. The `OCID`__ of the CDB __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ) + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + pdb_admin_password: Optional[str] = Field( + None, + description="A strong password for PDB Admin. The password must be at least nine characters and contain at least two uppercase, two lowercase, two numbers, and two special characters. The special characters must be _, \\#, or -.", + ) + pdb_creation_type_details: Optional[dict] = Field(None, description="") + pdb_name: Optional[str] = Field( + None, + description="**[Required]** Gets the pdb_name of this CreatePluggableDatabaseDetails. The name for the pluggable database (PDB). The name is unique in the context of a :class:`Database`. The name must begin with an alphabetic character and can contain a maximum of thirty alphanumeric characters. Special characters are not permitted. The pluggable database name should not be same as the container database name.", + ) + should_create_pdb_backup: Optional[bool] = Field( + None, + description="Indicates whether to take Pluggable Database Backup after the operation.", + ) + should_pdb_admin_account_be_locked: Optional[bool] = Field( + None, + description="The locked mode of the pluggable database admin account. If false, the user needs to provide the PDB Admin Password to connect to it. If true, the pluggable database will be locked and user cannot login to it.", + ) + tde_wallet_password: Optional[str] = Field( + None, description="The existing TDE wallet password of the CDB." + ) + + +def map_createpluggabledatabasedetails( + o: oci.database.models.CreatePluggableDatabaseDetails, +) -> CreatePluggableDatabaseDetails | None: + """Map oci.database.models.CreatePluggableDatabaseDetails → CreatePluggableDatabaseDetails Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return CreatePluggableDatabaseDetails(**data) + except Exception: + return CreatePluggableDatabaseDetails( + container_database_admin_password=getattr( + o, "container_database_admin_password", None + ), + container_database_id=getattr(o, "container_database_id", None), + defined_tags=getattr(o, "defined_tags", None), + freeform_tags=getattr(o, "freeform_tags", None), + pdb_admin_password=getattr(o, "pdb_admin_password", None), + pdb_creation_type_details=getattr(o, "pdb_creation_type_details", None), + pdb_name=getattr(o, "pdb_name", None), + should_create_pdb_backup=getattr(o, "should_create_pdb_backup", None), + should_pdb_admin_account_be_locked=getattr( + o, "should_pdb_admin_account_be_locked", None + ), + tde_wallet_password=getattr(o, "tde_wallet_password", None), + ) + + +class UpdatePluggableDatabaseDetails(OCIBaseModel): + """Pydantic model mirroring oci.database.models.UpdatePluggableDatabaseDetails.""" + + defined_tags: Optional[str] = Field( + None, + description="Defined tags for this resource. Each key is predefined and scoped to a namespace. For more information, see `Resource Tags`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm", + ) + freeform_tags: Optional[str] = Field( + None, + description='Free-form tags for this resource. Each tag is a simple key-value pair with no predefined name, type, or namespace. For more information, see `Resource Tags`__. Example: `{"Department": "Finance"}` __ https://docs.cloud.oracle.com/Content/General/Concepts/resourcetags.htm', + ) + + +def map_updatepluggabledatabasedetails( + o: oci.database.models.UpdatePluggableDatabaseDetails, +) -> UpdatePluggableDatabaseDetails | None: + """Map oci.database.models.UpdatePluggableDatabaseDetails → UpdatePluggableDatabaseDetails Pydantic model.""" + if not o: + return None + try: + data = oci.util.to_dict(o) + return UpdatePluggableDatabaseDetails(**data) + except Exception: + return UpdatePluggableDatabaseDetails( + defined_tags=getattr(o, "defined_tags", None), + freeform_tags=getattr(o, "freeform_tags", None), + ) diff --git a/src/database-mcp-server/oracle/database_mcp_server/server.py b/src/database-mcp-server/oracle/database_mcp_server/server.py new file mode 100644 index 0000000..bb59425 --- /dev/null +++ b/src/database-mcp-server/oracle/database_mcp_server/server.py @@ -0,0 +1,4583 @@ +""" +Copyright (c) 2025, Oracle and/or its affiliates. +Licensed under the Universal Permissive License v1.0 as shown at +https://oss.oracle.com/licenses/upl. +""" + +import json +import os +from logging import Logger +from typing import Annotated, Any, Optional + +import oci +from fastmcp import FastMCP +from oci.database.models import ( + CreatePluggableDatabaseFromLocalCloneDetails, + CreatePluggableDatabaseFromRelocateDetails, + CreatePluggableDatabaseFromRemoteCloneDetails, +) +from oracle.database_mcp_server.models import ( + ApplicationVipSummary, + AutonomousContainerDatabaseDataguardAssociation, + AutonomousContainerDatabaseSummary, + AutonomousContainerDatabaseVersionSummary, + AutonomousDatabaseBackupSummary, + AutonomousDatabaseCharacterSets, + AutonomousDatabaseDataguardAssociation, + AutonomousDatabasePeerCollection, + AutonomousDatabaseSoftwareImageCollection, + AutonomousDatabaseSummary, + AutonomousDbPreviewVersionSummary, + AutonomousDbVersionSummary, + AutonomousPatchSummary, + AutonomousVirtualMachineSummary, + AutonomousVmClusterSummary, + BackupDestinationSummary, + BackupSummary, + CloudAutonomousVmClusterSummary, + CloudExadataInfrastructureSummary, + CloudVmClusterSummary, + ConsoleConnectionSummary, + ConsoleHistoryCollection, + CreatePluggableDatabaseDetails, + DatabaseSoftwareImageSummary, + DatabaseSummary, + DataGuardAssociationSummary, + DbHomeSummary, + DbNodeSummary, + DbServerSummary, + DbSystemComputePerformanceSummary, + DbSystemShapeSummary, + DbSystemStoragePerformanceSummary, + DbSystemSummary, + DbVersionSummary, + ExadataInfrastructureSummary, + ExadbVmClusterSummary, + ExadbVmClusterUpdateSummary, + ExascaleDbStorageVaultSummary, + ExecutionActionSummary, + ExecutionWindowSummary, + ExternalContainerDatabaseSummary, + ExternalDatabaseConnectorSummary, + ExternalNonContainerDatabaseSummary, + ExternalPluggableDatabaseSummary, + FlexComponentCollection, + GiMinorVersionSummary, + GiVersionSummary, + KeyStoreSummary, + MaintenanceRunHistorySummary, + MaintenanceRunSummary, + OneoffPatchSummary, + PatchHistoryEntrySummary, + PatchSummary, + PluggableDatabase, + PluggableDatabaseSummary, + RefreshableCloneCollection, + ResourcePoolShapeCollection, + ScheduledActionCollection, + SchedulingPlanCollection, + SchedulingPolicySummary, + SchedulingWindowSummary, + SystemVersionCollection, + UpdatePluggableDatabaseDetails, + UpdateSummary, + VmClusterNetworkSummary, + VmClusterSummary, + VmClusterUpdateSummary, + map_applicationvipsummary, + map_autonomouscontainerdatabasedataguardassociation, + map_autonomouscontainerdatabasesummary, + map_autonomouscontainerdatabaseversionsummary, + map_autonomousdatabasebackupsummary, + map_autonomousdatabasecharactersets, + map_autonomousdatabasedataguardassociation, + map_autonomousdatabasepeercollection, + map_autonomousdatabasesoftwareimagecollection, + map_autonomousdatabasesummary, + map_autonomousdbpreviewversionsummary, + map_autonomousdbversionsummary, + map_autonomouspatchsummary, + map_autonomousvirtualmachinesummary, + map_autonomousvmclustersummary, + map_backupdestinationsummary, + map_backupsummary, + map_cloudautonomousvmclustersummary, + map_cloudexadatainfrastructuresummary, + map_cloudvmclustersummary, + map_consoleconnectionsummary, + map_consolehistorycollection, + map_databasesoftwareimagesummary, + map_databasesummary, + map_dataguardassociationsummary, + map_dbhomesummary, + map_dbnodesummary, + map_dbserversummary, + map_dbsystemcomputeperformancesummary, + map_dbsystemshapesummary, + map_dbsystemstorageperformancesummary, + map_dbsystemsummary, + map_dbversionsummary, + map_exadatainfrastructuresummary, + map_exadbvmclustersummary, + map_exadbvmclusterupdatesummary, + map_exascaledbstoragevaultsummary, + map_executionactionsummary, + map_executionwindowsummary, + map_externalcontainerdatabasesummary, + map_externaldatabaseconnectorsummary, + map_externalnoncontainerdatabasesummary, + map_externalpluggabledatabasesummary, + map_flexcomponentcollection, + map_giminorversionsummary, + map_giversionsummary, + map_keystoresummary, + map_maintenancerunhistorysummary, + map_maintenancerunsummary, + map_oneoffpatchsummary, + map_patchhistoryentrysummary, + map_patchsummary, + map_pluggabledatabase, + map_pluggabledatabasesummary, + map_refreshableclonecollection, + map_resourcepoolshapecollection, + map_scheduledactioncollection, + map_schedulingplancollection, + map_schedulingpolicysummary, + map_schedulingwindowsummary, + map_systemversioncollection, + map_updatesummary, + map_vmclusternetworksummary, + map_vmclustersummary, + map_vmclusterupdatesummary, +) + +from . import __project__, __version__ + +logger = Logger(__name__, level="INFO") +mcp = FastMCP(name=__project__) + + +def get_database_client(region: str = None): + config = oci.config.from_file( + profile_name=os.getenv("OCI_CONFIG_PROFILE", oci.config.DEFAULT_PROFILE) + ) + user_agent_name = __project__.split("oracle.", 1)[1].split("-server", 1)[0] + config["additional_user_agent"] = f"{user_agent_name}/{__version__}" + private_key = oci.signer.load_private_key_from_file(config["key_file"]) + token_file = config["security_token_file"] + with open(token_file, "r") as f: + token = f.read() + signer = oci.auth.signers.SecurityTokenSigner(token, private_key) + if region is None: + return oci.database.DatabaseClient(config, signer=signer) + regional_config = config.copy() # make a shallow copy + regional_config["region"] = region + return oci.database.DatabaseClient(regional_config, signer=signer) + + +def get_identity_client(): + config = oci.config.from_file( + profile_name=os.getenv("OCI_CONFIG_PROFILE", oci.config.DEFAULT_PROFILE) + ) + user_agent_name = __project__.split("oracle.", 1)[1].split("-server", 1)[0] + config["additional_user_agent"] = f"{user_agent_name}/{__version__}" + private_key = oci.signer.load_private_key_from_file(config["key_file"]) + token_file = config["security_token_file"] + with open(token_file, "r") as f: + token = f.read() + signer = oci.auth.signers.SecurityTokenSigner(token, private_key) + return oci.identity.IdentityClient(config, signer=signer) + + +def call_create_pdb(client, details, opc_retry_token=None, opc_request_id=None): + kwargs = {"create_pluggable_database_details": details} + if opc_retry_token: + kwargs["opc_retry_token"] = opc_retry_token + if opc_request_id: + kwargs["opc_request_id"] = opc_request_id + response = client.create_pluggable_database(**kwargs) + return map_pluggabledatabase(response.data) + + +def get_tenancy(): + config = oci.config.from_file( + profile_name=os.getenv("OCI_CONFIG_PROFILE", oci.config.DEFAULT_PROFILE) + ) + return os.getenv("TENANCY_ID_OVERRIDE", config["tenancy"]) + + +def list_all_compartments_internal(only_one_page: bool, limit=100): + """Internal function to get List all compartments in a tenancy""" + identity_client = get_identity_client() + response = identity_client.list_compartments( + compartment_id=get_tenancy(), + compartment_id_in_subtree=True, + access_level="ACCESSIBLE", + lifecycle_state="ACTIVE", + limit=limit, + ) + compartments = response.data + compartments.append( + identity_client.get_compartment(compartment_id=get_tenancy()).data + ) + if only_one_page: # limiting the number of items returned + return compartments + while response.has_next_page: + response = identity_client.list_compartments( + compartment_id=get_tenancy(), + compartment_id_in_subtree=True, + access_level="ACCESSIBLE", + lifecycle_state="ACTIVE", + page=response.next_page, + limit=limit, + ) + compartments.extend(response.data) + + return compartments + + +def get_compartment_by_name(compartment_name: str): + """Internal function to get compartment by name with caching""" + compartments = list_all_compartments_internal(False) + # Search for the compartment by name + for compartment in compartments: + if compartment.name.lower() == compartment_name.lower(): + return compartment + + return None + + +@mcp.tool() +def get_compartment_by_name_tool(name: str) -> str: + """Return a compartment matching the provided name""" + compartment = get_compartment_by_name(name) + if compartment: + return str(compartment) + else: + return json.dumps({"error": f"Compartment '{name}' not found."}) + + +@mcp.tool() +def list_subscribed_regions_tool() -> str: + """Return a list of all regions the customer (tenancy) is subscribed to""" + try: + identity_client = get_identity_client() + response = identity_client.list_region_subscriptions(tenancy_id=get_tenancy()) + regions = [region.region_name for region in response.data] + return json.dumps({"regions": regions}) + except Exception as e: + return json.dumps({"error": str(e)}) + + +@mcp.tool( + description="Gets a list of application virtual IP (VIP) addresses on a cloud VM cluster." +) +def list_application_vips( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + cloud_vm_cluster_id: Annotated[ + Optional[str], + "The `OCID`__ of the cloud VM cluster associated with the application virtual IP (VIP) address. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "DISPLAYNAME", "TIMECREATED"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "TERMINATING", "TERMINATED", "FAILED"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ApplicationVipSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + kwargs["cloud_vm_cluster_id"] = cloud_vm_cluster_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_order is not None: + kwargs["sort_order"] = sort_order + if sort_by is not None: + kwargs["sort_by"] = sort_by + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + response: oci.response.Response = client.list_application_vips(**kwargs) + return map_applicationvipsummary(response.data) + except Exception as e: + logger.error(f"Error in list_application_vips tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the Autonomous Container Databases with Autonomous Data Guard-enabled associated with the specified Autonomous Container Database." +) +def list_autonomous_container_database_dataguard_associations( + autonomous_container_database_id: Annotated[ + Optional[str], + "The Autonomous Container Database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousContainerDatabaseDataguardAssociation: + try: + client = get_database_client(region) + kwargs = {} + kwargs["autonomous_container_database_id"] = autonomous_container_database_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = ( + client.list_autonomous_container_database_dataguard_associations(**kwargs) + ) + return map_autonomouscontainerdatabasedataguardassociation(response.data) + except Exception as e: + logger.error( + f"Error in list_autonomous_container_database_dataguard_associations tool: {e}" + ) + raise + + +@mcp.tool( + description="Gets a list of supported Autonomous Container Database versions." +) +def list_autonomous_container_database_versions( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + service_component: Annotated[ + Optional[str], + 'The service component to use, either ADBD or EXACC. Allowed values are: "ADBD", "EXACC"', + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousContainerDatabaseVersionSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + kwargs["service_component"] = service_component + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_order is not None: + kwargs["sort_order"] = sort_order + response: oci.response.Response = ( + client.list_autonomous_container_database_versions(**kwargs) + ) + return map_autonomouscontainerdatabaseversionsummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_container_database_versions tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the Autonomous Container Databases in the specified compartment." +) +def list_autonomous_container_databases( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + autonomous_exadata_infrastructure_id: Annotated[ + Optional[str], + "The Autonomous Exadata Infrastructure `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + autonomous_vm_cluster_id: Annotated[ + Optional[str], + "The Autonomous VM Cluster `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + infrastructure_type: Annotated[ + Optional[str], + 'A filter to return only resources that match the given Infrastructure Type. Allowed values are: "CLOUD", "CLOUD_AT_CUSTOMER"', + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. **Note:** If you do not include the availability domain filter, the resources are grouped by availability domain, then sorted. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "BACKUP_IN_PROGRESS", "RESTORING", "RESTORE_FAILED", "RESTARTING", "MAINTENANCE_IN_PROGRESS", "ROLE_CHANGE_IN_PROGRESS", "ENABLING_AUTONOMOUS_DATA_GUARD", "UNAVAILABLE"', + ] = None, + availability_domain: Annotated[ + Optional[str], + "A filter to return only resources that match the given availability domain exactly.", + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + service_level_agreement_type: Annotated[ + Optional[str], + "A filter to return only resources that match the given service-level agreement type exactly.", + ] = None, + cloud_autonomous_vm_cluster_id: Annotated[ + Optional[str], + "The cloud Autonomous VM Cluster `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousContainerDatabaseSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if autonomous_exadata_infrastructure_id is not None: + kwargs["autonomous_exadata_infrastructure_id"] = ( + autonomous_exadata_infrastructure_id + ) + if autonomous_vm_cluster_id is not None: + kwargs["autonomous_vm_cluster_id"] = autonomous_vm_cluster_id + if infrastructure_type is not None: + kwargs["infrastructure_type"] = infrastructure_type + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if availability_domain is not None: + kwargs["availability_domain"] = availability_domain + if display_name is not None: + kwargs["display_name"] = display_name + if service_level_agreement_type is not None: + kwargs["service_level_agreement_type"] = service_level_agreement_type + if cloud_autonomous_vm_cluster_id is not None: + kwargs["cloud_autonomous_vm_cluster_id"] = cloud_autonomous_vm_cluster_id + response: oci.response.Response = client.list_autonomous_container_databases( + **kwargs + ) + return map_autonomouscontainerdatabasesummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_container_databases tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of Autonomous Database backups based on either the `autonomousDatabaseId` or `compartmentId` specified as a query parameter." +) +def list_autonomous_database_backups( + autonomous_database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. **Note:** If you do not include the availability domain filter, the resources are grouped by availability domain, then sorted. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATING", "ACTIVE", "DELETING", "DELETED", "FAILED", "UPDATING"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + type: Annotated[ + Optional[str], + "A filter to return only backups that matches with the given type of Backup.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDatabaseBackupSummary: + try: + client = get_database_client(region) + kwargs = {} + if autonomous_database_id is not None: + kwargs["autonomous_database_id"] = autonomous_database_id + if compartment_id is not None: + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if type is not None: + kwargs["type"] = type + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_autonomous_database_backups( + **kwargs + ) + return map_autonomousdatabasebackupsummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_database_backups tool: {e}") + raise + + +@mcp.tool(description="Gets a list of supported character sets.") +def list_autonomous_database_character_sets( + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + is_shared: Annotated[ + Optional[bool], + "Specifies whether this request is for an Autonomous Database Serverless instance. By default, this request will be for Autonomous Database on Dedicated Exadata Infrastructure.", + ] = None, + is_dedicated: Annotated[ + Optional[bool], + "Specifies if the request is for an Autonomous Database Dedicated instance. The default request is for an Autonomous Database Dedicated instance.", + ] = None, + character_set_type: Annotated[ + Optional[str], + 'Specifies whether this request pertains to database character sets or national character sets. Allowed values are: "DATABASE", "NATIONAL"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDatabaseCharacterSets: + try: + client = get_database_client(region) + kwargs = {} + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if is_shared is not None: + kwargs["is_shared"] = is_shared + if is_dedicated is not None: + kwargs["is_dedicated"] = is_dedicated + if character_set_type is not None: + kwargs["character_set_type"] = character_set_type + response: oci.response.Response = ( + client.list_autonomous_database_character_sets(**kwargs) + ) + return map_autonomousdatabasecharactersets(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_database_character_sets tool: {e}") + raise + + +@mcp.tool( + description="Lists the Autonomous Database clones for the specified Autonomous Database." +) +def list_autonomous_database_clones( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + autonomous_database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "STOPPING", "STOPPED", "STARTING", "TERMINATING", "TERMINATED", "UNAVAILABLE", "RESTORE_IN_PROGRESS", "RESTORE_FAILED", "BACKUP_IN_PROGRESS", "SCALE_IN_PROGRESS", "AVAILABLE_NEEDS_ATTENTION", "UPDATING", "MAINTENANCE_IN_PROGRESS", "RESTARTING", "RECREATING", "ROLE_CHANGE_IN_PROGRESS", "UPGRADING", "INACCESSIBLE", "STANDBY"', + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. **Note:** If you do not include the availability domain filter, the resources are grouped by availability domain, then sorted. Allowed values are: "NONE", "TIMECREATED", "DISPLAYNAME"', + ] = None, + clone_type: Annotated[ + Optional[str], + 'A filter to return only resources that match the given clone type exactly. Allowed values are: "REFRESHABLE_CLONE"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDatabaseSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + kwargs["autonomous_database_id"] = autonomous_database_id + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_order is not None: + kwargs["sort_order"] = sort_order + if display_name is not None: + kwargs["display_name"] = display_name + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if sort_by is not None: + kwargs["sort_by"] = sort_by + if clone_type is not None: + kwargs["clone_type"] = clone_type + response: oci.response.Response = client.list_autonomous_database_clones( + **kwargs + ) + return map_autonomousdatabasesummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_database_clones tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the Autonomous Data Guard-enabled databases associated with the specified Autonomous Database." +) +def list_autonomous_database_dataguard_associations( + autonomous_database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDatabaseDataguardAssociation: + try: + client = get_database_client(region) + kwargs = {} + kwargs["autonomous_database_id"] = autonomous_database_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = ( + client.list_autonomous_database_dataguard_associations(**kwargs) + ) + return map_autonomousdatabasedataguardassociation(response.data) + except Exception as e: + logger.error( + f"Error in list_autonomous_database_dataguard_associations tool: {e}" + ) + raise + + +@mcp.tool( + description="Lists the Autonomous Database peers for the specified Autonomous Database." +) +def list_autonomous_database_peers( + autonomous_database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDatabasePeerCollection: + try: + client = get_database_client(region) + kwargs = {} + kwargs["autonomous_database_id"] = autonomous_database_id + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_autonomous_database_peers( + **kwargs + ) + return map_autonomousdatabasepeercollection(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_database_peers tool: {e}") + raise + + +@mcp.tool( + description="Lists the OCIDs of the Autonomous Database local and connected remote refreshable clones with the region where they exist for the specified source database." +) +def list_autonomous_database_refreshable_clones( + autonomous_database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> RefreshableCloneCollection: + try: + client = get_database_client(region) + kwargs = {} + kwargs["autonomous_database_id"] = autonomous_database_id + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = ( + client.list_autonomous_database_refreshable_clones(**kwargs) + ) + return map_refreshableclonecollection(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_database_refreshable_clones tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the Autonomous Database Software Images in the specified compartment." +) +def list_autonomous_database_software_images( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + image_shape_family: Annotated[ + Optional[str], + 'A filter to return only resources that match the given image shape family exactly. Allowed values are: "EXACC_SHAPE", "EXADATA_SHAPE"', + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + sort_by: Annotated[ + Optional[str], + 'parameter according to which Autonomous Database Software Images will be sorted. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "AVAILABLE", "FAILED", "PROVISIONING", "EXPIRED", "TERMINATED", "TERMINATING", "UPDATING"', + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDatabaseSoftwareImageCollection: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + kwargs["image_shape_family"] = image_shape_family + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_order is not None: + kwargs["sort_order"] = sort_order + if sort_by is not None: + kwargs["sort_by"] = sort_by + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = ( + client.list_autonomous_database_software_images(**kwargs) + ) + return map_autonomousdatabasesoftwareimagecollection(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_database_software_images tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of Autonomous Databases based on the query parameters specified." +) +def list_autonomous_databases( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + autonomous_container_database_id: Annotated[ + Optional[str], + "The Autonomous Container Database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. **Note:** If you do not include the availability domain filter, the resources are grouped by availability domain, then sorted. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + infrastructure_type: Annotated[ + Optional[str], + 'A filter to return only resources that match the given Infrastructure Type. Allowed values are: "CLOUD", "CLOUD_AT_CUSTOMER"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "STOPPING", "STOPPED", "STARTING", "TERMINATING", "TERMINATED", "UNAVAILABLE", "RESTORE_IN_PROGRESS", "RESTORE_FAILED", "BACKUP_IN_PROGRESS", "SCALE_IN_PROGRESS", "AVAILABLE_NEEDS_ATTENTION", "UPDATING", "MAINTENANCE_IN_PROGRESS", "RESTARTING", "RECREATING", "ROLE_CHANGE_IN_PROGRESS", "UPGRADING", "INACCESSIBLE", "STANDBY"', + ] = None, + lifecycle_state_not_equal_to: Annotated[ + Optional[str], + 'A filter to return only resources that not match the given lifecycle state. Allowed values are: "PROVISIONING", "AVAILABLE", "STOPPING", "STOPPED", "STARTING", "TERMINATING", "TERMINATED", "UNAVAILABLE", "RESTORE_IN_PROGRESS", "RESTORE_FAILED", "BACKUP_IN_PROGRESS", "SCALE_IN_PROGRESS", "AVAILABLE_NEEDS_ATTENTION", "UPDATING", "MAINTENANCE_IN_PROGRESS", "RESTARTING", "RECREATING", "ROLE_CHANGE_IN_PROGRESS", "UPGRADING", "INACCESSIBLE", "STANDBY"', + ] = None, + db_workload: Annotated[ + Optional[str], + 'A filter to return only autonomous database resources that match the specified workload type. Allowed values are: "OLTP", "DW", "AJD", "APEX"', + ] = None, + db_version: Annotated[ + Optional[str], + "A filter to return only autonomous database resources that match the specified dbVersion.", + ] = None, + is_free_tier: Annotated[ + Optional[bool], + "Filter on the value of the resource's 'isFreeTier' property. A value of `true` returns only Always Free resources. A value of `false` excludes Always Free resources from the returned results. Omitting this parameter returns both Always Free and paid resources.", + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + is_refreshable_clone: Annotated[ + Optional[bool], + "Filter on the value of the resource's 'isRefreshableClone' property. A value of `true` returns only refreshable clones. A value of `false` excludes refreshable clones from the returned results. Omitting this parameter returns both refreshable clones and databases that are not refreshable clones.", + ] = None, + is_data_guard_enabled: Annotated[ + Optional[bool], + "A filter to return only resources that have Data Guard enabled.", + ] = None, + is_resource_pool_leader: Annotated[ + Optional[bool], + "Filter if the resource is the resource pool leader. A value of `true` returns only resource pool leader.", + ] = None, + resource_pool_leader_id: Annotated[ + Optional[str], + "The database `OCID`__ of the resourcepool Leader Autonomous Database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDatabaseSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if autonomous_container_database_id is not None: + kwargs["autonomous_container_database_id"] = ( + autonomous_container_database_id + ) + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if infrastructure_type is not None: + kwargs["infrastructure_type"] = infrastructure_type + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if lifecycle_state_not_equal_to is not None: + kwargs["lifecycle_state_not_equal_to"] = lifecycle_state_not_equal_to + if db_workload is not None: + kwargs["db_workload"] = db_workload + if db_version is not None: + kwargs["db_version"] = db_version + if is_free_tier is not None: + kwargs["is_free_tier"] = is_free_tier + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if is_refreshable_clone is not None: + kwargs["is_refreshable_clone"] = is_refreshable_clone + if is_data_guard_enabled is not None: + kwargs["is_data_guard_enabled"] = is_data_guard_enabled + if is_resource_pool_leader is not None: + kwargs["is_resource_pool_leader"] = is_resource_pool_leader + if resource_pool_leader_id is not None: + kwargs["resource_pool_leader_id"] = resource_pool_leader_id + response: oci.response.Response = client.list_autonomous_databases(**kwargs) + return map_autonomousdatabasesummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_databases tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of supported Autonomous Database versions. Note that preview version software is only available for" +) +def list_autonomous_db_preview_versions( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for DBWORKLOAD is ascending. **Note:** If you do not include the availability domain filter, the resources are grouped by availability domain, then sorted. Allowed values are: "DBWORKLOAD"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDbPreviewVersionSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + response: oci.response.Response = client.list_autonomous_db_preview_versions( + **kwargs + ) + return map_autonomousdbpreviewversionsummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_db_preview_versions tool: {e}") + raise + + +@mcp.tool(description="Gets a list of supported Autonomous Database versions.") +def list_autonomous_db_versions( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + db_workload: Annotated[ + Optional[str], + 'A filter to return only autonomous database resources that match the specified workload type. Allowed values are: "OLTP", "DW", "AJD", "APEX"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousDbVersionSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if db_workload is not None: + kwargs["db_workload"] = db_workload + if sort_order is not None: + kwargs["sort_order"] = sort_order + response: oci.response.Response = client.list_autonomous_db_versions(**kwargs) + return map_autonomousdbversionsummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_db_versions tool: {e}") + raise + + +@mcp.tool( + description="Lists the Autonomous Virtual Machines in the specified Autonomous VM Cluster and Compartment." +) +def list_autonomous_virtual_machines( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + autonomous_vm_cluster_id: Annotated[ + Optional[str], + "The Autonomous Virtual machine `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousVirtualMachineSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + kwargs["autonomous_vm_cluster_id"] = autonomous_vm_cluster_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + response: oci.response.Response = client.list_autonomous_virtual_machines( + **kwargs + ) + return map_autonomousvirtualmachinesummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_virtual_machines tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of Exadata Cloud@Customer Autonomous VM clusters in the specified compartment. To list Autonomous VM Clusters in the Oracle Cloud, see :func:`list_cloud_autonomous_vm_clusters`." +) +def list_autonomous_vm_clusters( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + exadata_infrastructure_id: Annotated[ + Optional[str], + "If provided, filters the results for the given Exadata Infrastructure.", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousVmClusterSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if exadata_infrastructure_id is not None: + kwargs["exadata_infrastructure_id"] = exadata_infrastructure_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_autonomous_vm_clusters(**kwargs) + return map_autonomousvmclustersummary(response.data) + except Exception as e: + logger.error(f"Error in list_autonomous_vm_clusters tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of backup destinations in the specified compartment." +) +def list_backup_destination( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + type: Annotated[ + Optional[str], + "A filter to return only resources that match the given type of the Backup Destination.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> BackupDestinationSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if type is not None: + kwargs["type"] = type + response: oci.response.Response = client.list_backup_destination(**kwargs) + return map_backupdestinationsummary(response.data) + except Exception as e: + logger.error(f"Error in list_backup_destination tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of backups based on the `databaseId` or `compartmentId` specified. Either one of these query parameters must be provided." +) +def list_backups( + database_id: Annotated[ + Optional[str], + "The `OCID`__ of the database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + shape_family: Annotated[ + Optional[str], + 'If provided, filters the results to the set of database versions which are supported for the given shape family. Allowed values are: "SINGLENODE", "YODA", "VIRTUALMACHINE", "EXADATA", "EXACC", "EXADB_XS"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> BackupSummary: + try: + client = get_database_client(region) + kwargs = {} + if database_id is not None: + kwargs["database_id"] = database_id + if compartment_id is not None: + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if shape_family is not None: + kwargs["shape_family"] = shape_family + response: oci.response.Response = client.list_backups(**kwargs) + return map_backupsummary(response.data) + except Exception as e: + logger.error(f"Error in list_backups tool: {e}") + raise + + +@mcp.tool( + description="Lists Autonomous Exadata VM clusters in the Oracle cloud. For Exadata Cloud@Customer systems, see :func:`list_autonomous_vm_clusters`." +) +def list_cloud_autonomous_vm_clusters( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + cloud_exadata_infrastructure_id: Annotated[ + Optional[str], + "If provided, filters the results for the specified cloud Exadata infrastructure.", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS"', + ] = None, + availability_domain: Annotated[ + Optional[str], + "A filter to return only resources that match the given availability domain exactly.", + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> CloudAutonomousVmClusterSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if cloud_exadata_infrastructure_id is not None: + kwargs["cloud_exadata_infrastructure_id"] = cloud_exadata_infrastructure_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if availability_domain is not None: + kwargs["availability_domain"] = availability_domain + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_cloud_autonomous_vm_clusters( + **kwargs + ) + return map_cloudautonomousvmclustersummary(response.data) + except Exception as e: + logger.error(f"Error in list_cloud_autonomous_vm_clusters tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the cloud Exadata infrastructure resources in the specified compartment. Applies to Exadata Cloud Service instances and Autonomous Database on dedicated Exadata infrastructure only." +) +def list_cloud_exadata_infrastructures( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + cluster_placement_group_id: Annotated[ + Optional[str], + "A filter to return only resources that match the given cluster placement group ID exactly.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> CloudExadataInfrastructureSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if cluster_placement_group_id is not None: + kwargs["cluster_placement_group_id"] = cluster_placement_group_id + response: oci.response.Response = client.list_cloud_exadata_infrastructures( + **kwargs + ) + return map_cloudexadatainfrastructuresummary(response.data) + except Exception as e: + logger.error(f"Error in list_cloud_exadata_infrastructures tool: {e}") + raise + + +@mcp.tool( + description="Lists the maintenance updates that can be applied to the specified cloud VM cluster. Applies to Exadata Cloud Service instances only." +) +def list_cloud_vm_cluster_updates( + cloud_vm_cluster_id: Annotated[ + Optional[str], + "The cloud VM cluster `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + update_type: Annotated[ + Optional[str], + 'A filter to return only resources that match the given update type exactly. Allowed values are: "GI_UPGRADE", "GI_PATCH", "OS_UPDATE"', + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> UpdateSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["cloud_vm_cluster_id"] = cloud_vm_cluster_id + if update_type is not None: + kwargs["update_type"] = update_type + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_cloud_vm_cluster_updates(**kwargs) + return map_updatesummary(response.data) + except Exception as e: + logger.error(f"Error in list_cloud_vm_cluster_updates tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the cloud VM clusters in the specified compartment. Applies to Exadata Cloud Service instances and Autonomous Database on dedicated Exadata infrastructure only." +) +def list_cloud_vm_clusters( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + cloud_exadata_infrastructure_id: Annotated[ + Optional[str], + "If provided, filters the results for the specified cloud Exadata infrastructure.", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only cloud VM clusters that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> CloudVmClusterSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if cloud_exadata_infrastructure_id is not None: + kwargs["cloud_exadata_infrastructure_id"] = cloud_exadata_infrastructure_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_cloud_vm_clusters(**kwargs) + return map_cloudvmclustersummary(response.data) + except Exception as e: + logger.error(f"Error in list_cloud_vm_clusters tool: {e}") + raise + + +@mcp.tool(description="Lists the console connections for the specified database node.") +def list_console_connections( + db_node_id: Annotated[ + Optional[str], + "The database node `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ConsoleConnectionSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["db_node_id"] = db_node_id + response: oci.response.Response = client.list_console_connections(**kwargs) + return map_consoleconnectionsummary(response.data) + except Exception as e: + logger.error(f"Error in list_console_connections tool: {e}") + raise + + +@mcp.tool(description="Lists the console histories for the specified database node.") +def list_console_histories( + db_node_id: Annotated[ + Optional[str], + "The database node `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "REQUESTED", "GETTING_HISTORY", "SUCCEEDED", "FAILED", "DELETED", "DELETING"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ConsoleHistoryCollection: + try: + client = get_database_client(region) + kwargs = {} + kwargs["db_node_id"] = db_node_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_console_histories(**kwargs) + return map_consolehistorycollection(response.data) + except Exception as e: + logger.error(f"Error in list_console_histories tool: {e}") + raise + + +@mcp.tool( + description="Lists the patches applicable to the requested container database." +) +def list_container_database_patches( + autonomous_container_database_id: Annotated[ + Optional[str], + "The Autonomous Container Database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + autonomous_patch_type: Annotated[ + Optional[str], + 'Autonomous patch type, either "QUARTERLY" or "TIMEZONE". Allowed values are: "QUARTERLY", "TIMEZONE"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> AutonomousPatchSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["autonomous_container_database_id"] = autonomous_container_database_id + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if autonomous_patch_type is not None: + kwargs["autonomous_patch_type"] = autonomous_patch_type + response: oci.response.Response = client.list_container_database_patches( + **kwargs + ) + return map_autonomouspatchsummary(response.data) + except Exception as e: + logger.error(f"Error in list_container_database_patches tool: {e}") + raise + + +@mcp.tool(description="Lists all Data Guard associations for the specified database.") +def list_data_guard_associations( + database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DataGuardAssociationSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["database_id"] = database_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_data_guard_associations(**kwargs) + return map_dataguardassociationsummary(response.data) + except Exception as e: + logger.error(f"Error in list_data_guard_associations tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the database software images in the specified compartment." +) +def list_database_software_images( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Default order for PATCHSET is descending. Allowed values are: "TIMECREATED", "DISPLAYNAME", "PATCHSET"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "DELETING", "DELETED", "FAILED", "TERMINATING", "TERMINATED", "UPDATING"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + image_type: Annotated[ + Optional[str], + 'A filter to return only resources that match the given image type exactly. Allowed values are: "GRID_IMAGE", "DATABASE_IMAGE"', + ] = None, + image_shape_family: Annotated[ + Optional[str], + 'A filter to return only resources that match the given image shape family exactly. Allowed values are: "VM_BM_SHAPE", "EXADATA_SHAPE", "EXACC_SHAPE", "EXADBXS_SHAPE"', + ] = None, + patch_set_greater_than_or_equal_to: Annotated[ + Optional[str], + "A filter to return only resources with `patchSet` greater than or equal to given value.", + ] = None, + is_upgrade_supported: Annotated[ + Optional[bool], + "If provided, filters the results to the set of database versions which are supported for Upgrade.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DatabaseSoftwareImageSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if image_type is not None: + kwargs["image_type"] = image_type + if image_shape_family is not None: + kwargs["image_shape_family"] = image_shape_family + if patch_set_greater_than_or_equal_to is not None: + kwargs["patch_set_greater_than_or_equal_to"] = ( + patch_set_greater_than_or_equal_to + ) + if is_upgrade_supported is not None: + kwargs["is_upgrade_supported"] = is_upgrade_supported + response: oci.response.Response = client.list_database_software_images(**kwargs) + return map_databasesoftwareimagesummary(response.data) + except Exception as e: + logger.error(f"Error in list_database_software_images tool: {e}") + raise + + +@mcp.tool(description="Gets a list of the databases in the specified Database Home.") +def list_databases( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + db_home_id: Annotated[ + Optional[str], + "A Database Home `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + system_id: Annotated[ + Optional[str], + "The `OCID`__ of the Exadata DB system that you want to filter the database results by. Applies only to Exadata DB systems. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DBNAME is ascending. The DBNAME sort order is case sensitive. Allowed values are: "DBNAME", "TIMECREATED"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "BACKUP_IN_PROGRESS", "UPGRADING", "CONVERTING", "TERMINATING", "TERMINATED", "RESTORE_FAILED", "FAILED"', + ] = None, + db_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire database name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DatabaseSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if db_home_id is not None: + kwargs["db_home_id"] = db_home_id + if system_id is not None: + kwargs["system_id"] = system_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if db_name is not None: + kwargs["db_name"] = db_name + response: oci.response.Response = client.list_databases(**kwargs) + return map_databasesummary(response.data) + except Exception as e: + logger.error(f"Error in list_databases tool: {e}") + raise + + +@mcp.tool( + description="Lists the history of patch operations on the specified Database Home." +) +def list_db_home_patch_history_entries( + db_home_id: Annotated[ + Optional[str], + "The Database Home `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> PatchHistoryEntrySummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["db_home_id"] = db_home_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_db_home_patch_history_entries( + **kwargs + ) + return map_patchhistoryentrysummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_home_patch_history_entries tool: {e}") + raise + + +@mcp.tool(description="Lists patches applicable to the requested Database Home.") +def list_db_home_patches( + db_home_id: Annotated[ + Optional[str], + "The Database Home `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> PatchSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["db_home_id"] = db_home_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_db_home_patches(**kwargs) + return map_patchsummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_home_patches tool: {e}") + raise + + +@mcp.tool( + description="Lists the Database Homes in the specified DB system and compartment. A Database Home is a directory where Oracle Database software is installed." +) +def list_db_homes( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + db_system_id: Annotated[ + Optional[str], + "The DB system `OCID`__. If provided, filters the results to the set of database versions which are supported for the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + vm_cluster_id: Annotated[ + Optional[str], + "The `OCID`__ of the VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + backup_id: Annotated[ + Optional[str], + "The `OCID`__ of the backup. Specify a backupId to list only the DB systems or DB homes that support creating a database using this backup in this compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + db_version: Annotated[ + Optional[str], + "A filter to return only DB Homes that match the specified dbVersion.", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DbHomeSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if db_system_id is not None: + kwargs["db_system_id"] = db_system_id + if vm_cluster_id is not None: + kwargs["vm_cluster_id"] = vm_cluster_id + if backup_id is not None: + kwargs["backup_id"] = backup_id + if db_version is not None: + kwargs["db_version"] = db_version + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_db_homes(**kwargs) + return map_dbhomesummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_homes tool: {e}") + raise + + +@mcp.tool( + description="Lists the database nodes in the specified DB system and compartment. A database node is a server running database software." +) +def list_db_nodes( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + db_system_id: Annotated[ + Optional[str], + "The DB system `OCID`__. If provided, filters the results to the set of database versions which are supported for the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + vm_cluster_id: Annotated[ + Optional[str], + "The `OCID`__ of the VM cluster. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'Sort by TIMECREATED. Default order for TIMECREATED is descending. Allowed values are: "TIMECREATED"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "STOPPING", "STOPPED", "STARTING", "TERMINATING", "TERMINATED", "FAILED"', + ] = None, + db_server_id: Annotated[ + Optional[str], + "The `OCID`__ of the Exacc Db server. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DbNodeSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if db_system_id is not None: + kwargs["db_system_id"] = db_system_id + if vm_cluster_id is not None: + kwargs["vm_cluster_id"] = vm_cluster_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if db_server_id is not None: + kwargs["db_server_id"] = db_server_id + response: oci.response.Response = client.list_db_nodes(**kwargs) + return map_dbnodesummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_nodes tool: {e}") + raise + + +@mcp.tool( + description="Lists the Exadata DB servers in the ExadataInfrastructureId and specified compartment." +) +def list_db_servers( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + exadata_infrastructure_id: Annotated[ + Optional[str], + "The `OCID`__ of the ExadataInfrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'Sort by TIMECREATED. Default order for TIMECREATED is descending. Allowed values are: "TIMECREATED"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATING", "AVAILABLE", "UNAVAILABLE", "DELETING", "DELETED", "MAINTENANCE_IN_PROGRESS"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DbServerSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + kwargs["exadata_infrastructure_id"] = exadata_infrastructure_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_order is not None: + kwargs["sort_order"] = sort_order + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_db_servers(**kwargs) + return map_dbserversummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_servers tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of expected compute performance parameters for a virtual machine DB system based on system configuration." +) +def list_db_system_compute_performances( + db_system_shape: Annotated[ + Optional[str], + "If provided, filters the results to the set of database versions which are supported for the given shape.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DbSystemComputePerformanceSummary: + try: + client = get_database_client(region) + kwargs = {} + if db_system_shape is not None: + kwargs["db_system_shape"] = db_system_shape + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_db_system_compute_performances( + **kwargs + ) + return map_dbsystemcomputeperformancesummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_system_compute_performances tool: {e}") + raise + + +@mcp.tool(description="Lists the patches applicable to the specified DB system.") +def list_db_system_patches( + db_system_id: Annotated[ + Optional[str], + "The DB system `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> PatchSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["db_system_id"] = db_system_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_db_system_patches(**kwargs) + return map_patchsummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_system_patches tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the shapes that can be used to launch a new DB system. The shape determines resources to allocate to the DB system - CPU cores and memory for VM shapes; CPU cores, memory and storage for non-VM (or bare metal) shapes." +) +def list_db_system_shapes( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + availability_domain: Annotated[ + Optional[str], "The name of the Availability Domain." + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DbSystemShapeSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if availability_domain is not None: + kwargs["availability_domain"] = availability_domain + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_db_system_shapes(**kwargs) + return map_dbsystemshapesummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_system_shapes tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of possible expected storage performance parameters of a VMDB System based on Configuration." +) +def list_db_system_storage_performances( + storage_management: Annotated[ + Optional[str], + 'The DB system storage management option. Used to list database versions available for that storage manager. Valid values are `ASM` and `LVM`. * ASM specifies Oracle Automatic Storage Management * LVM specifies logical volume manager, sometimes called logical disk manager. Allowed values are: "ASM", "LVM"', + ], + shape_type: Annotated[ + Optional[str], "Optional. Filters the performance results by shape type." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DbSystemStoragePerformanceSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["storage_management"] = storage_management + if shape_type is not None: + kwargs["shape_type"] = shape_type + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_db_system_storage_performances( + **kwargs + ) + return map_dbsystemstorageperformancesummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_system_storage_performances tool: {e}") + raise + + +@mcp.tool( + description="Lists the DB systems in the specified compartment. You can specify a `backupId` to list only the DB systems that support creating a database using this backup in this compartment." +) +def list_db_systems( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + backup_id: Annotated[ + Optional[str], + "The `OCID`__ of the backup. Specify a backupId to list only the DB systems or DB homes that support creating a database using this backup in this compartment. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. **Note:** If you do not include the availability domain filter, the resources are grouped by availability domain, then sorted. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MIGRATED", "MAINTENANCE_IN_PROGRESS", "NEEDS_ATTENTION", "UPGRADING"', + ] = None, + availability_domain: Annotated[ + Optional[str], + "A filter to return only resources that match the given availability domain exactly.", + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DbSystemSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if backup_id is not None: + kwargs["backup_id"] = backup_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if availability_domain is not None: + kwargs["availability_domain"] = availability_domain + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_db_systems(**kwargs) + return map_dbsystemsummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_systems tool: {e}") + raise + + +@mcp.tool(description="Gets a list of supported Oracle Database versions.") +def list_db_versions( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + db_system_shape: Annotated[ + Optional[str], + "If provided, filters the results to the set of database versions which are supported for the given shape.", + ] = None, + db_system_id: Annotated[ + Optional[str], + "The DB system `OCID`__. If provided, filters the results to the set of database versions which are supported for the DB system. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + storage_management: Annotated[ + Optional[str], + 'The DB system storage management option. Used to list database versions available for that storage manager. Valid values are `ASM` and `LVM`. * ASM specifies Oracle Automatic Storage Management * LVM specifies logical volume manager, sometimes called logical disk manager. Allowed values are: "ASM", "LVM"', + ] = None, + is_upgrade_supported: Annotated[ + Optional[bool], + "If provided, filters the results to the set of database versions which are supported for Upgrade.", + ] = None, + is_database_software_image_supported: Annotated[ + Optional[bool], + "If true, filters the results to the set of Oracle Database versions that are supported for OCI database software images.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> DbVersionSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if db_system_shape is not None: + kwargs["db_system_shape"] = db_system_shape + if db_system_id is not None: + kwargs["db_system_id"] = db_system_id + if storage_management is not None: + kwargs["storage_management"] = storage_management + if is_upgrade_supported is not None: + kwargs["is_upgrade_supported"] = is_upgrade_supported + if is_database_software_image_supported is not None: + kwargs["is_database_software_image_supported"] = ( + is_database_software_image_supported + ) + response: oci.response.Response = client.list_db_versions(**kwargs) + return map_dbversionsummary(response.data) + except Exception as e: + logger.error(f"Error in list_db_versions tool: {e}") + raise + + +@mcp.tool( + description="Lists the Exadata infrastructure resources in the specified compartment. Applies to Exadata Cloud@Customer instances only." +) +def list_exadata_infrastructures( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATING", "REQUIRES_ACTIVATION", "ACTIVATING", "ACTIVE", "ACTIVATION_FAILED", "FAILED", "UPDATING", "DELETING", "DELETED", "DISCONNECTED", "MAINTENANCE_IN_PROGRESS", "WAITING_FOR_CONNECTIVITY"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + excluded_fields: Annotated[ + Optional[str], + 'If provided, the specified fields will be excluded in the response. Allowed values are: "multiRackConfigurationFile"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExadataInfrastructureSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if excluded_fields is not None: + kwargs["excluded_fields"] = excluded_fields + response: oci.response.Response = client.list_exadata_infrastructures(**kwargs) + return map_exadatainfrastructuresummary(response.data) + except Exception as e: + logger.error(f"Error in list_exadata_infrastructures tool: {e}") + raise + + +@mcp.tool( + description="Lists the maintenance updates that can be applied to the specified Exadata VM cluster on Exascale Infrastructure." +) +def list_exadb_vm_cluster_updates( + exadb_vm_cluster_id: Annotated[ + Optional[str], + "The Exadata VM cluster `OCID`__ on Exascale Infrastructure. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + update_type: Annotated[ + Optional[str], + 'A filter to return only resources that match the given update type exactly. Allowed values are: "GI_UPGRADE", "GI_PATCH", "OS_UPDATE"', + ] = None, + version: Annotated[ + Optional[str], + "A filter to return only resources that match the given update version exactly.", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExadbVmClusterUpdateSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["exadb_vm_cluster_id"] = exadb_vm_cluster_id + if update_type is not None: + kwargs["update_type"] = update_type + if version is not None: + kwargs["version"] = version + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_exadb_vm_cluster_updates(**kwargs) + return map_exadbvmclusterupdatesummary(response.data) + except Exception as e: + logger.error(f"Error in list_exadb_vm_cluster_updates tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the Exadata VM clusters on Exascale Infrastructure in the specified compartment. Applies to Exadata Database Service on Exascale Infrastructure only." +) +def list_exadb_vm_clusters( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only Exadata VM clusters on Exascale Infrastructure that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS"', + ] = None, + exascale_db_storage_vault_id: Annotated[ + Optional[str], + "A filter to return only Exadata VM clusters on Exascale Infrastructure that match the given Exascale Database Storage Vault ID.", + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExadbVmClusterSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if exascale_db_storage_vault_id is not None: + kwargs["exascale_db_storage_vault_id"] = exascale_db_storage_vault_id + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_exadb_vm_clusters(**kwargs) + return map_exadbvmclustersummary(response.data) + except Exception as e: + logger.error(f"Error in list_exadb_vm_clusters tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the Exadata Database Storage Vaults in the specified compartment." +) +def list_exascale_db_storage_vaults( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only Exadata Database Storage Vaults that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + exadata_infrastructure_id: Annotated[ + Optional[str], + "A filter to return only list of Vaults that are linked to the exadata infrastructure Id.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExascaleDbStorageVaultSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if exadata_infrastructure_id is not None: + kwargs["exadata_infrastructure_id"] = exadata_infrastructure_id + response: oci.response.Response = client.list_exascale_db_storage_vaults( + **kwargs + ) + return map_exascaledbstoragevaultsummary(response.data) + except Exception as e: + logger.error(f"Error in list_exascale_db_storage_vaults tool: {e}") + raise + + +@mcp.tool( + description="Lists the execution action resources in the specified compartment." +) +def list_execution_actions( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "SCHEDULED", "IN_PROGRESS", "FAILED", "CANCELED", "UPDATING", "DELETED", "SUCCEEDED", "PARTIAL_SUCCESS"', + ] = None, + execution_window_id: Annotated[ + Optional[str], + "A filter to return only resources that match the given execution wondow id.", + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExecutionActionSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if execution_window_id is not None: + kwargs["execution_window_id"] = execution_window_id + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_execution_actions(**kwargs) + return map_executionactionsummary(response.data) + except Exception as e: + logger.error(f"Error in list_execution_actions tool: {e}") + raise + + +@mcp.tool( + description="Lists the execution window resources in the specified compartment." +) +def list_execution_windows( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + execution_resource_id: Annotated[ + Optional[str], + "A filter to return only resources that match the given resource id exactly.", + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATED", "SCHEDULED", "IN_PROGRESS", "FAILED", "CANCELED", "UPDATING", "DELETED", "SUCCEEDED", "PARTIAL_SUCCESS", "CREATING", "DELETING"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExecutionWindowSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if execution_resource_id is not None: + kwargs["execution_resource_id"] = execution_resource_id + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_execution_windows(**kwargs) + return map_executionwindowsummary(response.data) + except Exception as e: + logger.error(f"Error in list_execution_windows tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the external container databases in the specified compartment." +) +def list_external_container_databases( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "DISPLAYNAME", "TIMECREATED"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the specified lifecycle state. Allowed values are: "PROVISIONING", "NOT_CONNECTED", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExternalContainerDatabaseSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_external_container_databases( + **kwargs + ) + return map_externalcontainerdatabasesummary(response.data) + except Exception as e: + logger.error(f"Error in list_external_container_databases tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the external database connectors in the specified compartment." +) +def list_external_database_connectors( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + external_database_id: Annotated[ + Optional[str], + "The `OCID`__ of the external database whose connectors will be listed. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "DISPLAYNAME", "TIMECREATED"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the specified lifecycle state. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExternalDatabaseConnectorSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + kwargs["external_database_id"] = external_database_id + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_external_database_connectors( + **kwargs + ) + return map_externaldatabaseconnectorsummary(response.data) + except Exception as e: + logger.error(f"Error in list_external_database_connectors tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the ExternalNonContainerDatabases in the specified compartment." +) +def list_external_non_container_databases( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "DISPLAYNAME", "TIMECREATED"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the specified lifecycle state. Allowed values are: "PROVISIONING", "NOT_CONNECTED", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExternalNonContainerDatabaseSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_external_non_container_databases( + **kwargs + ) + return map_externalnoncontainerdatabasesummary(response.data) + except Exception as e: + logger.error(f"Error in list_external_non_container_databases tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the :func:`create_external_pluggable_database_details`" +) +def list_external_pluggable_databases( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + external_container_database_id: Annotated[ + Optional[str], + "The ExternalContainerDatabase `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "DISPLAYNAME", "TIMECREATED"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the specified lifecycle state. Allowed values are: "PROVISIONING", "NOT_CONNECTED", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ExternalPluggableDatabaseSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if external_container_database_id is not None: + kwargs["external_container_database_id"] = external_container_database_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_external_pluggable_databases( + **kwargs + ) + return map_externalpluggabledatabasesummary(response.data) + except Exception as e: + logger.error(f"Error in list_external_pluggable_databases tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the flex components that can be used to launch a new DB system. The flex component determines resources to allocate to the DB system - Database Servers and Storage Servers." +) +def list_flex_components( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire name given. The match is not case sensitive.", + ] = None, + shape: Annotated[ + Optional[str], + "A filter to return only resources that belong to the entire shape name given. The match is not case sensitive.", + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for NAME is ascending. The NAME sort order is case sensitive. Allowed values are: "NAME"', + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> FlexComponentCollection: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if name is not None: + kwargs["name"] = name + if shape is not None: + kwargs["shape"] = shape + if sort_order is not None: + kwargs["sort_order"] = sort_order + if sort_by is not None: + kwargs["sort_by"] = sort_by + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_flex_components(**kwargs) + return map_flexcomponentcollection(response.data) + except Exception as e: + logger.error(f"Error in list_flex_components tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of supported Oracle Grid Infrastructure minor versions for the given major version and shape family." +) +def list_gi_version_minor_versions( + version: Annotated[Optional[str], "The Oracle Grid Infrastructure major version."], + availability_domain: Annotated[ + Optional[str], + "The target availability domain. Only passed if the limit is AD-specific.", + ] = None, + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + shape_family: Annotated[ + Optional[str], + 'If provided, filters the results to the set of database versions which are supported for the given shape family. Allowed values are: "SINGLENODE", "YODA", "VIRTUALMACHINE", "EXADATA", "EXACC", "EXADB_XS"', + ] = None, + is_gi_version_for_provisioning: Annotated[ + Optional[bool], + "If true, returns the Grid Infrastructure versions that can be used for provisioning a cluster", + ] = None, + shape: Annotated[ + Optional[str], "If provided, filters the results for the given shape." + ] = None, + sort_by: Annotated[ + Optional[str], + 'Sort by VERSION. Default order for VERSION is descending. Allowed values are: "VERSION"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> GiMinorVersionSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["version"] = version + if availability_domain is not None: + kwargs["availability_domain"] = availability_domain + if compartment_id is not None: + kwargs["compartment_id"] = compartment_id + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if shape_family is not None: + kwargs["shape_family"] = shape_family + if is_gi_version_for_provisioning is not None: + kwargs["is_gi_version_for_provisioning"] = is_gi_version_for_provisioning + if shape is not None: + kwargs["shape"] = shape + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_gi_version_minor_versions( + **kwargs + ) + return map_giminorversionsummary(response.data) + except Exception as e: + logger.error(f"Error in list_gi_version_minor_versions tool: {e}") + raise + + +@mcp.tool(description="Gets a list of supported GI versions.") +def list_gi_versions( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + shape: Annotated[ + Optional[str], "If provided, filters the results for the given shape." + ] = None, + availability_domain: Annotated[ + Optional[str], + "The target availability domain. Only passed if the limit is AD-specific.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> GiVersionSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_order is not None: + kwargs["sort_order"] = sort_order + if shape is not None: + kwargs["shape"] = shape + if availability_domain is not None: + kwargs["availability_domain"] = availability_domain + response: oci.response.Response = client.list_gi_versions(**kwargs) + return map_giversionsummary(response.data) + except Exception as e: + logger.error(f"Error in list_gi_versions tool: {e}") + raise + + +@mcp.tool(description="Gets a list of key stores in the specified compartment.") +def list_key_stores( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> KeyStoreSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_key_stores(**kwargs) + return map_keystoresummary(response.data) + except Exception as e: + logger.error(f"Error in list_key_stores tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the maintenance run histories in the specified compartment." +) +def list_maintenance_run_history( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + target_resource_id: Annotated[Optional[str], "The target resource ID."] = None, + target_resource_type: Annotated[ + Optional[str], + 'The type of the target resource. Allowed values are: "AUTONOMOUS_EXADATA_INFRASTRUCTURE", "AUTONOMOUS_CONTAINER_DATABASE", "EXADATA_DB_SYSTEM", "CLOUD_EXADATA_INFRASTRUCTURE", "EXACC_INFRASTRUCTURE", "AUTONOMOUS_VM_CLUSTER", "AUTONOMOUS_DATABASE", "CLOUD_AUTONOMOUS_VM_CLUSTER"', + ] = None, + maintenance_type: Annotated[ + Optional[str], + 'The maintenance type. Allowed values are: "PLANNED", "UNPLANNED"', + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIME_SCHEDULED and TIME_ENDED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. **Note:** If you do not include the availability domain filter, the resources are grouped by availability domain, then sorted. Allowed values are: "TIME_SCHEDULED", "TIME_ENDED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'The state of the maintenance run history. Allowed values are: "SCHEDULED", "IN_PROGRESS", "SUCCEEDED", "SKIPPED", "FAILED", "UPDATING", "DELETING", "DELETED", "CANCELED"', + ] = None, + availability_domain: Annotated[ + Optional[str], + "A filter to return only resources that match the given availability domain exactly.", + ] = None, + maintenance_subtype: Annotated[ + Optional[str], + 'The sub-type of the maintenance run. Allowed values are: "QUARTERLY", "HARDWARE", "CRITICAL", "INFRASTRUCTURE", "DATABASE", "ONEOFF", "SECURITY_MONTHLY", "TIMEZONE", "CUSTOM_DATABASE_SOFTWARE_IMAGE"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> MaintenanceRunHistorySummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if target_resource_id is not None: + kwargs["target_resource_id"] = target_resource_id + if target_resource_type is not None: + kwargs["target_resource_type"] = target_resource_type + if maintenance_type is not None: + kwargs["maintenance_type"] = maintenance_type + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if availability_domain is not None: + kwargs["availability_domain"] = availability_domain + if maintenance_subtype is not None: + kwargs["maintenance_subtype"] = maintenance_subtype + response: oci.response.Response = client.list_maintenance_run_history(**kwargs) + return map_maintenancerunhistorysummary(response.data) + except Exception as e: + logger.error(f"Error in list_maintenance_run_history tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the maintenance runs in the specified compartment." +) +def list_maintenance_runs( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + target_resource_id: Annotated[Optional[str], "The target resource ID."] = None, + target_resource_type: Annotated[ + Optional[str], + 'The type of the target resource. Allowed values are: "AUTONOMOUS_EXADATA_INFRASTRUCTURE", "AUTONOMOUS_CONTAINER_DATABASE", "EXADATA_DB_SYSTEM", "CLOUD_EXADATA_INFRASTRUCTURE", "EXACC_INFRASTRUCTURE", "AUTONOMOUS_VM_CLUSTER", "AUTONOMOUS_DATABASE", "CLOUD_AUTONOMOUS_VM_CLUSTER"', + ] = None, + maintenance_type: Annotated[ + Optional[str], + 'The maintenance type. Allowed values are: "PLANNED", "UNPLANNED"', + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIME_SCHEDULED and TIME_ENDED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. **Note:** If you do not include the availability domain filter, the resources are grouped by availability domain, then sorted. Allowed values are: "TIME_SCHEDULED", "TIME_ENDED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "SCHEDULED", "IN_PROGRESS", "SUCCEEDED", "SKIPPED", "FAILED", "UPDATING", "DELETING", "DELETED", "CANCELED"', + ] = None, + availability_domain: Annotated[ + Optional[str], + "A filter to return only resources that match the given availability domain exactly.", + ] = None, + maintenance_subtype: Annotated[ + Optional[str], + 'The sub-type of the maintenance run. Allowed values are: "QUARTERLY", "HARDWARE", "CRITICAL", "INFRASTRUCTURE", "DATABASE", "ONEOFF", "SECURITY_MONTHLY", "TIMEZONE", "CUSTOM_DATABASE_SOFTWARE_IMAGE"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> MaintenanceRunSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if target_resource_id is not None: + kwargs["target_resource_id"] = target_resource_id + if target_resource_type is not None: + kwargs["target_resource_type"] = target_resource_type + if maintenance_type is not None: + kwargs["maintenance_type"] = maintenance_type + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if availability_domain is not None: + kwargs["availability_domain"] = availability_domain + if maintenance_subtype is not None: + kwargs["maintenance_subtype"] = maintenance_subtype + response: oci.response.Response = client.list_maintenance_runs(**kwargs) + return map_maintenancerunsummary(response.data) + except Exception as e: + logger.error(f"Error in list_maintenance_runs tool: {e}") + raise + + +@mcp.tool(description="Lists one-off patches in the specified compartment.") +def list_oneoff_patches( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly Allowed values are: "CREATING", "AVAILABLE", "UPDATING", "INACTIVE", "FAILED", "EXPIRED", "DELETING", "DELETED", "TERMINATING", "TERMINATED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> OneoffPatchSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_oneoff_patches(**kwargs) + return map_oneoffpatchsummary(response.data) + except Exception as e: + logger.error(f"Error in list_oneoff_patches tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the pluggable databases in a database or compartment. You must provide either a `databaseId` or `compartmentId` value." +) +def list_pluggable_databases( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + database_id: Annotated[ + Optional[str], + "The `OCID`__ of the database. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for PDBNAME is ascending. The PDBNAME sort order is case sensitive. Allowed values are: "PDBNAME", "TIMECREATED"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "TERMINATING", "TERMINATED", "UPDATING", "FAILED", "RELOCATING", "RELOCATED", "REFRESHING", "RESTORE_IN_PROGRESS", "RESTORE_FAILED", "BACKUP_IN_PROGRESS", "DISABLED"', + ] = None, + pdb_name: Annotated[ + Optional[str], + "A filter to return only pluggable databases that match the entire name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> PluggableDatabaseSummary: + try: + client = get_database_client(region) + kwargs = {} + if compartment_id is not None: + kwargs["compartment_id"] = compartment_id + if database_id is not None: + kwargs["database_id"] = database_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if pdb_name is not None: + kwargs["pdb_name"] = pdb_name + response: oci.response.Response = client.list_pluggable_databases(**kwargs) + return map_pluggabledatabasesummary(response.data) + except Exception as e: + logger.error(f"Error in list_pluggable_databases tool: {e}") + raise + + +@mcp.tool( + description="Lists the Scheduled Action resources in the specified compartment." +) +def list_scheduled_actions( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + service_type: Annotated[ + Optional[str], + "A filter to return only resources that match the given service type exactly.", + ] = None, + scheduling_plan_id: Annotated[ + Optional[str], + "A filter to return only resources that match the given scheduling policy id exactly.", + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + id: Annotated[ + Optional[str], + "A filter to return only resources that match the given Scheduled Action id exactly.", + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATING", "NEEDS_ATTENTION", "AVAILABLE", "UPDATING", "FAILED", "DELETING", "DELETED"', + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ScheduledActionCollection: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_order is not None: + kwargs["sort_order"] = sort_order + if service_type is not None: + kwargs["service_type"] = service_type + if scheduling_plan_id is not None: + kwargs["scheduling_plan_id"] = scheduling_plan_id + if display_name is not None: + kwargs["display_name"] = display_name + if sort_by is not None: + kwargs["sort_by"] = sort_by + if id is not None: + kwargs["id"] = id + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + response: oci.response.Response = client.list_scheduled_actions(**kwargs) + return map_scheduledactioncollection(response.data) + except Exception as e: + logger.error(f"Error in list_scheduled_actions tool: {e}") + raise + + +@mcp.tool( + description="Lists the Scheduling Plan resources in the specified compartment." +) +def list_scheduling_plans( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATING", "NEEDS_ATTENTION", "AVAILABLE", "UPDATING", "FAILED", "DELETING", "DELETED"', + ] = None, + scheduling_policy_id: Annotated[ + Optional[str], + "A filter to return only resources that match the given scheduling policy id exactly.", + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + resource_id: Annotated[ + Optional[str], + "A filter to return only resources that match the given resource id exactly.", + ] = None, + id: Annotated[ + Optional[str], + "A filter to return only resources that match the given Schedule Plan id exactly.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> SchedulingPlanCollection: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if scheduling_policy_id is not None: + kwargs["scheduling_policy_id"] = scheduling_policy_id + if display_name is not None: + kwargs["display_name"] = display_name + if resource_id is not None: + kwargs["resource_id"] = resource_id + if id is not None: + kwargs["id"] = id + response: oci.response.Response = client.list_scheduling_plans(**kwargs) + return map_schedulingplancollection(response.data) + except Exception as e: + logger.error(f"Error in list_scheduling_plans tool: {e}") + raise + + +@mcp.tool( + description="Lists the Scheduling Policy resources in the specified compartment." +) +def list_scheduling_policies( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATING", "NEEDS_ATTENTION", "AVAILABLE", "UPDATING", "FAILED", "DELETING", "DELETED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> SchedulingPolicySummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_scheduling_policies(**kwargs) + return map_schedulingpolicysummary(response.data) + except Exception as e: + logger.error(f"Error in list_scheduling_policies tool: {e}") + raise + + +@mcp.tool( + description="Lists the Scheduling Window resources in the specified compartment." +) +def list_scheduling_windows( + scheduling_policy_id: Annotated[ + Optional[str], + "The Scheduling Policy `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATING", "AVAILABLE", "UPDATING", "FAILED", "DELETING", "DELETED"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> SchedulingWindowSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["scheduling_policy_id"] = scheduling_policy_id + if compartment_id is not None: + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + response: oci.response.Response = client.list_scheduling_windows(**kwargs) + return map_schedulingwindowsummary(response.data) + except Exception as e: + logger.error(f"Error in list_scheduling_windows tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of supported Exadata system versions for a given shape and GI version." +) +def list_system_versions( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + shape: Annotated[Optional[str], "Specifies shape query parameter."], + gi_version: Annotated[Optional[str], "Specifies gi version query parameter."], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> SystemVersionCollection: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + kwargs["shape"] = shape + kwargs["gi_version"] = gi_version + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_order is not None: + kwargs["sort_order"] = sort_order + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_system_versions(**kwargs) + return map_systemversioncollection(response.data) + except Exception as e: + logger.error(f"Error in list_system_versions tool: {e}") + raise + + +@mcp.tool( + description="Gets a list of the VM cluster networks in the specified compartment. Applies to Exadata Cloud@Customer instances only." +) +def list_vm_cluster_networks( + exadata_infrastructure_id: Annotated[ + Optional[str], + "The Exadata infrastructure `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "CREATING", "REQUIRES_VALIDATION", "VALIDATING", "VALIDATED", "VALIDATION_FAILED", "UPDATING", "ALLOCATED", "TERMINATING", "TERMINATED", "FAILED", "NEEDS_ATTENTION"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> VmClusterNetworkSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["exadata_infrastructure_id"] = exadata_infrastructure_id + kwargs["compartment_id"] = compartment_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_vm_cluster_networks(**kwargs) + return map_vmclusternetworksummary(response.data) + except Exception as e: + logger.error(f"Error in list_vm_cluster_networks tool: {e}") + raise + + +@mcp.tool( + description="Lists the patches applicable to the specified VM cluster in an Exadata Cloud@Customer system." +) +def list_vm_cluster_patches( + vm_cluster_id: Annotated[ + Optional[str], + "The VM cluster `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> PatchSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["vm_cluster_id"] = vm_cluster_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + response: oci.response.Response = client.list_vm_cluster_patches(**kwargs) + return map_patchsummary(response.data) + except Exception as e: + logger.error(f"Error in list_vm_cluster_patches tool: {e}") + raise + + +@mcp.tool( + description="Lists the maintenance updates that can be applied to the specified VM cluster. Applies to Exadata Cloud@Customer instances only." +) +def list_vm_cluster_updates( + vm_cluster_id: Annotated[ + Optional[str], + "The VM cluster `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + update_type: Annotated[ + Optional[str], + 'A filter to return only resources that match the given update type exactly. Allowed values are: "GI_UPGRADE", "GI_PATCH", "OS_UPDATE"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "AVAILABLE", "SUCCESS", "IN_PROGRESS", "FAILED"', + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> VmClusterUpdateSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["vm_cluster_id"] = vm_cluster_id + if update_type is not None: + kwargs["update_type"] = update_type + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_vm_cluster_updates(**kwargs) + return map_vmclusterupdatesummary(response.data) + except Exception as e: + logger.error(f"Error in list_vm_cluster_updates tool: {e}") + raise + + +@mcp.tool( + description="Lists the VM clusters in the specified compartment. Applies to Exadata Cloud@Customer instances only." +) +def list_vm_clusters( + compartment_id: Annotated[ + Optional[str], + "The compartment `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + exadata_infrastructure_id: Annotated[ + Optional[str], + "If provided, filters the results for the given Exadata Infrastructure.", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + sort_by: Annotated[ + Optional[str], + 'The field to sort by. You can provide one sort order (`sortOrder`). Default order for TIMECREATED is descending. Default order for DISPLAYNAME is ascending. The DISPLAYNAME sort order is case sensitive. Allowed values are: "TIMECREATED", "DISPLAYNAME"', + ] = None, + sort_order: Annotated[ + Optional[str], + 'The sort order to use, either ascending (`ASC`) or descending (`DESC`). Allowed values are: "ASC", "DESC"', + ] = None, + lifecycle_state: Annotated[ + Optional[str], + 'A filter to return only resources that match the given lifecycle state exactly. Allowed values are: "PROVISIONING", "AVAILABLE", "UPDATING", "TERMINATING", "TERMINATED", "FAILED", "MAINTENANCE_IN_PROGRESS"', + ] = None, + display_name: Annotated[ + Optional[str], + "A filter to return only resources that match the entire display name given. The match is not case sensitive.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> VmClusterSummary: + try: + client = get_database_client(region) + kwargs = {} + kwargs["compartment_id"] = compartment_id + if exadata_infrastructure_id is not None: + kwargs["exadata_infrastructure_id"] = exadata_infrastructure_id + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if sort_by is not None: + kwargs["sort_by"] = sort_by + if sort_order is not None: + kwargs["sort_order"] = sort_order + if lifecycle_state is not None: + kwargs["lifecycle_state"] = lifecycle_state + if display_name is not None: + kwargs["display_name"] = display_name + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.list_vm_clusters(**kwargs) + return map_vmclustersummary(response.data) + except Exception as e: + logger.error(f"Error in list_vm_clusters tool: {e}") + raise + + +@mcp.tool(description="Lists available resource pools shapes.") +def resource_pool_shapes( + if_match: Annotated[ + Optional[str], + "For optimistic concurrency control. In the PUT or DELETE call for a resource, set the `if-match` parameter to the value of the etag from a previous GET or POST response for that resource. The resource will be updated or deleted only if the etag you provide matches the resource's current etag value.", + ] = None, + opc_retry_token: Annotated[ + Optional[str], + "A token that uniquely identifies a request so it can be retried in case of a timeout or server error without risk of executing that same action again. Retry tokens expire after 24 hours, but can be invalidated before then due to conflicting operations (for example, if a resource has been deleted and purged from the system, then a retry of the original creation request may be rejected).", + ] = None, + limit: Annotated[ + Optional[int], "The maximum number of items to return per page." + ] = None, + page: Annotated[ + Optional[str], "The pagination token to continue listing from." + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> ResourcePoolShapeCollection: + try: + client = get_database_client(region) + kwargs = {} + if if_match is not None: + kwargs["if_match"] = if_match + if opc_retry_token is not None: + kwargs["opc_retry_token"] = opc_retry_token + if limit is not None: + kwargs["limit"] = limit + if page is not None: + kwargs["page"] = page + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.resource_pool_shapes(**kwargs) + return map_resourcepoolshapecollection(response.data) + except Exception as e: + logger.error(f"Error in resource_pool_shapes tool: {e}") + raise + + +@mcp.tool(description="Deletes the specified pluggable database.") +def delete_pluggable_database( + pluggable_database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + if_match: Annotated[ + Optional[str], + "For optimistic concurrency control. In the PUT or DELETE call for a resource, set the `if-match` parameter to the value of the etag from a previous GET or POST response for that resource. The resource will be updated or deleted only if the etag you provide matches the resource's current etag value.", + ] = None, + opc_request_id: Annotated[ + Optional[str], "Unique identifier for the request." + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> Any: + try: + client = get_database_client(region) + kwargs = {} + kwargs["pluggable_database_id"] = pluggable_database_id + if if_match is not None: + kwargs["if_match"] = if_match + if opc_request_id is not None: + kwargs["opc_request_id"] = opc_request_id + response: oci.response.Response = client.delete_pluggable_database(**kwargs) + return oci.util.to_dict(response.data) + except Exception as e: + logger.error(f"Error in delete_pluggable_database tool: {e}") + raise + + +@mcp.tool(description="Gets information about the specified pluggable database.") +def get_pluggable_database( + pluggable_database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> PluggableDatabase: + try: + client = get_database_client(region) + kwargs = {} + kwargs["pluggable_database_id"] = pluggable_database_id + response: oci.response.Response = client.get_pluggable_database(**kwargs) + return map_pluggabledatabase(response.data) + except Exception as e: + logger.error(f"Error in get_pluggable_database tool: {e}") + raise + + +@mcp.tool(description="Updates the specified pluggable database.") +def update_pluggable_database( + pluggable_database_id: Annotated[ + Optional[str], + "The database `OCID`__. __ https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm", + ], + update_pluggable_database_details: Annotated[ + dict | UpdatePluggableDatabaseDetails, + "Request to perform pluggable database update.", + ], + if_match: Annotated[ + Optional[str], + "For optimistic concurrency control. In the PUT or DELETE call for a resource, set the `if-match` parameter to the value of the etag from a previous GET or POST response for that resource. The resource will be updated or deleted only if the etag you provide matches the resource's current etag value.", + ] = None, + region: Annotated[ + str, + "Region to execute the request, if no region is specified then default will be picked", + ] = None, +) -> PluggableDatabase: + try: + client = get_database_client(region) + kwargs = {} + kwargs["pluggable_database_id"] = pluggable_database_id + if isinstance( + update_pluggable_database_details, UpdatePluggableDatabaseDetails + ): + kwargs["update_pluggable_database_details"] = oci.util.to_dict( + update_pluggable_database_details + ) + else: + kwargs["update_pluggable_database_details"] = ( + update_pluggable_database_details + ) + if if_match is not None: + kwargs["if_match"] = if_match + response: oci.response.Response = client.update_pluggable_database(**kwargs) + return map_pluggabledatabase(response.data) + except Exception as e: + logger.error(f"Error in update_pluggable_database tool: {e}") + raise + + +@mcp.tool(description="Create a new pluggable database.") +def create_pluggable_database( + pdb_name: str, + container_database_id: str, + pdb_admin_password: str, + tde_wallet_password: Optional[str] = None, + should_pdb_admin_account_be_locked: Optional[bool] = None, + container_database_admin_password: Optional[str] = None, + should_create_pdb_backup: Optional[bool] = None, + freeform_tags: Optional[dict] = None, + defined_tags: Optional[dict] = None, + opc_retry_token: Optional[str] = None, + opc_request_id: Optional[str] = None, + region: Optional[str] = None, +): + try: + client = get_database_client(region) + + details = oci.database.models.CreatePluggableDatabaseDetails( + pdb_name=pdb_name, + container_database_id=container_database_id, + pdb_admin_password=pdb_admin_password, + tde_wallet_password=tde_wallet_password, + container_database_admin_password=container_database_admin_password, + should_pdb_admin_account_be_locked=should_pdb_admin_account_be_locked, + should_create_pdb_backup=should_create_pdb_backup, + freeform_tags=freeform_tags, + defined_tags=defined_tags, + ) + + kwargs = { + "create_pluggable_database_details": details, + "opc_retry_token": opc_retry_token, + "opc_request_id": opc_request_id, + } + + resp = client.create_pluggable_database(**kwargs) + return map_pluggabledatabase(resp.data) + + except Exception as e: + logger.error(f"Error in create_pdb_new: {e}") + raise + + +@mcp.tool( + description="Create a pluggable database from a local clone (LOCAL_CLONE_PDB)." +) +def create_pluggable_database_from_local_clone( + pdb_name: str, + container_database_id: str, + pdb_admin_password: str, + source_pluggable_database_id: str, + is_thin_clone: Optional[bool] = None, + source_pluggable_database_snapshot_id: Optional[str] = None, + dblink_username: Optional[str] = None, + dblink_user_password: Optional[str] = None, + tde_wallet_password: Optional[str] = None, + container_database_admin_password: Optional[str] = None, + should_pdb_admin_account_be_locked: Optional[bool] = None, + should_create_pdb_backup: Optional[bool] = None, + freeform_tags: Optional[dict] = None, + defined_tags: Optional[dict] = None, + opc_retry_token: Optional[str] = None, + opc_request_id: Optional[str] = None, + region: Optional[str] = None, +): + try: + client = get_database_client(region) + + clone_details = CreatePluggableDatabaseFromLocalCloneDetails( + creation_type="LOCAL_CLONE_PDB", + source_pluggable_database_id=source_pluggable_database_id, + is_thin_clone=is_thin_clone, + source_pluggable_database_snapshot_id=source_pluggable_database_snapshot_id, + dblink_username=dblink_username, + dblink_user_password=dblink_user_password, + ) + + details = CreatePluggableDatabaseDetails( + pdb_name=pdb_name, + container_database_id=container_database_id, + pdb_admin_password=pdb_admin_password, + tde_wallet_password=tde_wallet_password, + container_database_admin_password=container_database_admin_password, + should_pdb_admin_account_be_locked=should_pdb_admin_account_be_locked, + should_create_pdb_backup=should_create_pdb_backup, + freeform_tags=freeform_tags, + defined_tags=defined_tags, + pdb_creation_type_details=clone_details, + ) + + return call_create_pdb(client, details, opc_retry_token, opc_request_id) + + except Exception as e: + logger.error(f"Error in create_pdb_from_local_clone: {e}") + raise + + +# 2) Remote Clone +@mcp.tool( + description="Create a pluggable database by cloning from a remote source CDB (REMOTE_CLONE_PDB)." +) +def create_pluggable_database_from_remote_clone( + pdb_name: str, + container_database_id: str, + pdb_admin_password: str, + source_pluggable_database_id: str, + source_container_database_admin_password: str, + is_thin_clone: Optional[bool] = None, + source_pluggable_database_snapshot_id: Optional[str] = None, + dblink_username: Optional[str] = None, + dblink_user_password: Optional[str] = None, + source_tde_wallet_password: Optional[str] = None, + tde_wallet_password: Optional[str] = None, + container_database_admin_password: Optional[str] = None, + should_pdb_admin_account_be_locked: Optional[bool] = None, + should_create_pdb_backup: Optional[bool] = None, + freeform_tags: Optional[dict] = None, + defined_tags: Optional[dict] = None, + opc_retry_token: Optional[str] = None, + opc_request_id: Optional[str] = None, + region: Optional[str] = None, +): + try: + client = get_database_client(region) + + remote_details = CreatePluggableDatabaseFromRemoteCloneDetails( + creation_type="REMOTE_CLONE_PDB", + source_pluggable_database_id=source_pluggable_database_id, + source_container_database_admin_password=source_container_database_admin_password, + is_thin_clone=is_thin_clone, + source_pluggable_database_snapshot_id=source_pluggable_database_snapshot_id, + dblink_username=dblink_username, + dblink_user_password=dblink_user_password, + source_tde_wallet_password=source_tde_wallet_password, + ) + + details = CreatePluggableDatabaseDetails( + pdb_name=pdb_name, + container_database_id=container_database_id, + pdb_admin_password=pdb_admin_password, + tde_wallet_password=tde_wallet_password, + container_database_admin_password=container_database_admin_password, + should_pdb_admin_account_be_locked=should_pdb_admin_account_be_locked, + should_create_pdb_backup=should_create_pdb_backup, + freeform_tags=freeform_tags, + defined_tags=defined_tags, + pdb_creation_type_details=remote_details, + ) + + return call_create_pdb(client, details, opc_retry_token, opc_request_id) + + except Exception as e: + logger.error(f"Error in create_pdb_from_remote_clone: {e}") + raise + + +@mcp.tool( + description="Relocate (move) a pluggable database from a source CDB into the target CDB (RELOCATE_PDB)." +) +def create_pluggable_database_from_relocate( + pdb_name: str, + container_database_id: str, + pdb_admin_password: str, + source_pluggable_database_id: str, + source_container_database_admin_password: str, + dblink_username: Optional[str] = None, + dblink_user_password: Optional[str] = None, + source_tde_wallet_password: Optional[str] = None, + tde_wallet_password: Optional[str] = None, + container_database_admin_password: Optional[str] = None, + should_pdb_admin_account_be_locked: Optional[bool] = None, + should_create_pdb_backup: Optional[bool] = None, + freeform_tags: Optional[dict] = None, + defined_tags: Optional[dict] = None, + opc_retry_token: Optional[str] = None, + opc_request_id: Optional[str] = None, + region: Optional[str] = None, +): + try: + client = get_database_client(region) + + relocate_details = CreatePluggableDatabaseFromRelocateDetails( + creation_type="RELOCATE_PDB", + source_pluggable_database_id=source_pluggable_database_id, + source_container_database_admin_password=source_container_database_admin_password, + dblink_username=dblink_username, + dblink_user_password=dblink_user_password, + source_tde_wallet_password=source_tde_wallet_password, + ) + + details = CreatePluggableDatabaseDetails( + pdb_name=pdb_name, + container_database_id=container_database_id, + pdb_admin_password=pdb_admin_password, + tde_wallet_password=tde_wallet_password, + container_database_admin_password=container_database_admin_password, + should_pdb_admin_account_be_locked=should_pdb_admin_account_be_locked, + should_create_pdb_backup=should_create_pdb_backup, + freeform_tags=freeform_tags, + defined_tags=defined_tags, + pdb_creation_type_details=relocate_details, + ) + + return call_create_pdb(client, details, opc_retry_token, opc_request_id) + + except Exception as e: + logger.error(f"Error in create_pdb_from_relocate: {e}") + raise + + +def main(): + mcp.run() + + +if __name__ == "__main__": + main() diff --git a/src/database-mcp-server/oracle/database_mcp_server/tests/test_database.py b/src/database-mcp-server/oracle/database_mcp_server/tests/test_database.py new file mode 100644 index 0000000..9c0ca61 --- /dev/null +++ b/src/database-mcp-server/oracle/database_mcp_server/tests/test_database.py @@ -0,0 +1,1518 @@ +from unittest.mock import MagicMock, create_autospec, patch + +import oci +import pytest +from fastmcp import Client +from oracle.database_mcp_server.server import mcp + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_application_vips(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_application_vips.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_application_vips", + { + "compartment_id": "ocid1.compartment.sampleCompartmentId", + "cloud_vm_cluster_id": "sampleValue", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_application_vips.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_container_database_dataguard_associations( + mock_get_client, +): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_container_database_dataguard_associations.return_value = ( + mock_response + ) + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_container_database_dataguard_associations", + { + "autonomous_container_database_id": "ocid1.autonomouscontainer.sampleDatabaseId" + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_container_database_dataguard_associations.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_container_database_versions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_container_database_versions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_container_database_versions", + { + "compartment_id": "ocid1.compartment.sampleCompartmentId", + "service_component": "sampleValue", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_container_database_versions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_container_databases(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_container_databases.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_container_databases", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_container_databases.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_database_backups(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_database_backups.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_database_backups", + {}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_database_backups.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_database_character_sets(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_database_character_sets.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_database_character_sets", + {}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_database_character_sets.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_database_clones(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_database_clones.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_database_clones", + { + "compartment_id": "ocid1.compartment.sampleCompartmentId", + "autonomous_database_id": "ocid1.autonomous.sampleDatabaseId", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_database_clones.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_database_dataguard_associations(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_database_dataguard_associations.return_value = ( + mock_response + ) + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_database_dataguard_associations", + {"autonomous_database_id": "ocid1.autonomous.sampleDatabaseId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_database_dataguard_associations.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_database_peers(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_database_peers.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_database_peers", + {"autonomous_database_id": "ocid1.autonomous.sampleDatabaseId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_database_peers.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_database_refreshable_clones(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_database_refreshable_clones.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_database_refreshable_clones", + {"autonomous_database_id": "ocid1.autonomous.sampleDatabaseId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_database_refreshable_clones.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_database_software_images(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_database_software_images.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_database_software_images", + { + "compartment_id": "ocid1.compartment.sampleCompartmentId", + "image_shape_family": "sampleValue", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_database_software_images.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_databases(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_databases.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_databases", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_databases.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_db_preview_versions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_db_preview_versions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_db_preview_versions", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_db_preview_versions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_db_versions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_db_versions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_db_versions", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_db_versions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_virtual_machines(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_virtual_machines.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_virtual_machines", + { + "compartment_id": "ocid1.compartment.sampleCompartmentId", + "autonomous_vm_cluster_id": "sampleValue", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_virtual_machines.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_autonomous_vm_clusters(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_autonomous_vm_clusters.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_autonomous_vm_clusters", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_autonomous_vm_clusters.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_backup_destination(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_backup_destination.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_backup_destination", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_backup_destination.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_backups(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_backups.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_backups", + {}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_backups.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_cloud_autonomous_vm_clusters(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_cloud_autonomous_vm_clusters.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_cloud_autonomous_vm_clusters", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_cloud_autonomous_vm_clusters.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_cloud_exadata_infrastructures(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_cloud_exadata_infrastructures.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_cloud_exadata_infrastructures", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_cloud_exadata_infrastructures.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_cloud_vm_cluster_updates(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_cloud_vm_cluster_updates.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_cloud_vm_cluster_updates", + {"cloud_vm_cluster_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_cloud_vm_cluster_updates.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_cloud_vm_clusters(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_cloud_vm_clusters.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_cloud_vm_clusters", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_cloud_vm_clusters.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_console_connections(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_console_connections.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_console_connections", + {"db_node_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_console_connections.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_console_histories(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_console_histories.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_console_histories", + {"db_node_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_console_histories.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_container_database_patches(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_container_database_patches.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_container_database_patches", + { + "autonomous_container_database_id": "ocid1.autonomouscontainer.sampleDatabaseId", + "compartment_id": "ocid1.compartment.sampleCompartmentId", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_container_database_patches.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_data_guard_associations(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_data_guard_associations.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_data_guard_associations", + {"database_id": "ocid1.database.sampleDatabaseId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_data_guard_associations.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_database_software_images(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_database_software_images.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_database_software_images", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_database_software_images.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_databases(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_databases.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_databases", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_databases.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_home_patch_history_entries(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_home_patch_history_entries.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_home_patch_history_entries", + {"db_home_id": "ocid1.dbhome.sampleDatabaseId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_home_patch_history_entries.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_home_patches(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_home_patches.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_home_patches", + {"db_home_id": "ocid1.dbhome.sampleDatabaseId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_home_patches.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_homes(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_homes.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_homes", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_homes.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_nodes(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_nodes.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_nodes", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_nodes.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_servers(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_servers.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_servers", + { + "compartment_id": "ocid1.compartment.sampleCompartmentId", + "exadata_infrastructure_id": "sampleValue", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_servers.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_system_compute_performances(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_system_compute_performances.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_system_compute_performances", + {}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_system_compute_performances.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_system_patches(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_system_patches.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_system_patches", + {"db_system_id": "ocid1.dbsystem.sampleDatabaseId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_system_patches.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_system_shapes(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_system_shapes.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_system_shapes", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_system_shapes.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_system_storage_performances(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_system_storage_performances.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_system_storage_performances", + {"storage_management": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_system_storage_performances.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_systems(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_systems.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_systems", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_systems.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_db_versions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_db_versions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_db_versions", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_db_versions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_exadata_infrastructures(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_exadata_infrastructures.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_exadata_infrastructures", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_exadata_infrastructures.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_exadb_vm_cluster_updates(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_exadb_vm_cluster_updates.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_exadb_vm_cluster_updates", + {"exadb_vm_cluster_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_exadb_vm_cluster_updates.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_exadb_vm_clusters(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_exadb_vm_clusters.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_exadb_vm_clusters", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_exadb_vm_clusters.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_exascale_db_storage_vaults(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_exascale_db_storage_vaults.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_exascale_db_storage_vaults", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_exascale_db_storage_vaults.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_execution_actions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_execution_actions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_execution_actions", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_execution_actions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_execution_windows(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_execution_windows.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_execution_windows", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_execution_windows.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_external_container_databases(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_external_container_databases.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_external_container_databases", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_external_container_databases.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_external_database_connectors(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_external_database_connectors.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_external_database_connectors", + { + "compartment_id": "ocid1.compartment.sampleCompartmentId", + "external_database_id": "sampleValue", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_external_database_connectors.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_external_non_container_databases(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_external_non_container_databases.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_external_non_container_databases", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_external_non_container_databases.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_external_pluggable_databases(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_external_pluggable_databases.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_external_pluggable_databases", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_external_pluggable_databases.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_flex_components(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_flex_components.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_flex_components", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_flex_components.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_gi_version_minor_versions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_gi_version_minor_versions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_gi_version_minor_versions", + {"version": "19c"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_gi_version_minor_versions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_gi_versions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_gi_versions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_gi_versions", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_gi_versions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_key_stores(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_key_stores.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_key_stores", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_key_stores.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_maintenance_run_history(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_maintenance_run_history.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_maintenance_run_history", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_maintenance_run_history.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_maintenance_runs(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_maintenance_runs.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_maintenance_runs", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_maintenance_runs.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_oneoff_patches(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_oneoff_patches.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_oneoff_patches", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_oneoff_patches.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_pluggable_databases(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_pluggable_databases.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_pluggable_databases", + {}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_pluggable_databases.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_scheduled_actions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_scheduled_actions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_scheduled_actions", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_scheduled_actions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_scheduling_plans(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_scheduling_plans.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_scheduling_plans", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_scheduling_plans.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_scheduling_policies(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_scheduling_policies.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_scheduling_policies", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_scheduling_policies.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_scheduling_windows(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_scheduling_windows.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_scheduling_windows", + {"scheduling_policy_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_scheduling_windows.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_system_versions(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_system_versions.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_system_versions", + { + "compartment_id": "ocid1.compartment.sampleCompartmentId", + "shape": "VM.Standard2.1", + "gi_version": "sampleValue", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_system_versions.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_vm_cluster_networks(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_vm_cluster_networks.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_vm_cluster_networks", + { + "exadata_infrastructure_id": "sampleValue", + "compartment_id": "ocid1.compartment.sampleCompartmentId", + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_vm_cluster_networks.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_vm_cluster_patches(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_vm_cluster_patches.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_vm_cluster_patches", + {"vm_cluster_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_vm_cluster_patches.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_vm_cluster_updates(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_vm_cluster_updates.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_vm_cluster_updates", + {"vm_cluster_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_vm_cluster_updates.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_list_vm_clusters(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.list_vm_clusters.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "list_vm_clusters", + {"compartment_id": "ocid1.compartment.sampleCompartmentId"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.list_vm_clusters.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_resource_pool_shapes(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.resource_pool_shapes.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "resource_pool_shapes", + {}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.resource_pool_shapes.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_delete_pluggable_database(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.delete_pluggable_database.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "delete_pluggable_database", + {"pluggable_database_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.delete_pluggable_database.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_get_pluggable_database(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.get_pluggable_database.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "get_pluggable_database", + {"pluggable_database_id": "sampleValue"}, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.get_pluggable_database.assert_called_once() + + +@pytest.mark.asyncio +@patch("oracle.database_mcp_server.server.get_database_client") +async def test_update_pluggable_database(mock_get_client): + mock_client = MagicMock() + mock_get_client.return_value = mock_client + + mock_response = create_autospec(oci.response.Response) + mock_response.data = {"id": "sampleId"} + mock_client.update_pluggable_database.return_value = mock_response + + async with Client(mcp) as client: + response = await client.call_tool( + "update_pluggable_database", + { + "pluggable_database_id": "sampleValue", + "update_pluggable_database_details": {}, + }, + ) + + result = response.structured_content + assert isinstance(result, dict) + mock_client.update_pluggable_database.assert_called_once() diff --git a/src/database-mcp-server/pyproject.toml b/src/database-mcp-server/pyproject.toml new file mode 100644 index 0000000..a86f2ef --- /dev/null +++ b/src/database-mcp-server/pyproject.toml @@ -0,0 +1,39 @@ +[project] +name = "oracle.database-mcp-server" +version = "1.0.1" +description = "OCI Database Service MCP server" +readme = "README.md" +requires-python = ">=3.13" +license = "UPL-1.0" +license-files = ["LICENSE.txt"] +authors = [ + {name = "Oracle MCP", email = "237432095+oracle-mcp@users.noreply.github.com"}, +] +dependencies = [ + "fastmcp==2.12.2", + "oci==2.160.0", + "mcp>=1.0.0", +] + +classifiers = [ + "License :: OSI Approved :: Universal Permissive License (UPL)", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3.13", +] + +[project.scripts] +"oracle.database-mcp-server" = "oracle.database_mcp_server.server:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["oracle"] + +[dependency-groups] +dev = [ + "pytest>=8.4.2", + "pytest-asyncio>=1.2.0", +] diff --git a/src/database-mcp-server/uv.lock b/src/database-mcp-server/uv.lock new file mode 100644 index 0000000..1c05053 --- /dev/null +++ b/src/database-mcp-server/uv.lock @@ -0,0 +1,1073 @@ +version = 1 +revision = 3 +requires-python = ">=3.13" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "authlib" +version = "1.6.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/bb/73a1f1c64ee527877f64122422dafe5b87a846ccf4ac933fe21bcbb8fee8/authlib-1.6.4.tar.gz", hash = "sha256:104b0442a43061dc8bc23b133d1d06a2b0a9c2e3e33f34c4338929e816287649", size = 164046, upload-time = "2025-09-17T09:59:23.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/aa/91355b5f539caf1b94f0e66ff1e4ee39373b757fce08204981f7829ede51/authlib-1.6.4-py2.py3-none-any.whl", hash = "sha256:39313d2a2caac3ecf6d8f95fbebdfd30ae6ea6ae6a6db794d976405fdd9aa796", size = 243076, upload-time = "2025-09-17T09:59:22.259Z" }, +] + +[[package]] +name = "certifi" +version = "2025.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, +] + +[[package]] +name = "circuitbreaker" +version = "2.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/ac/de7a92c4ed39cba31fe5ad9203b76a25ca67c530797f6bb420fff5f65ccb/circuitbreaker-2.1.3.tar.gz", hash = "sha256:1a4baee510f7bea3c91b194dcce7c07805fe96c4423ed5594b75af438531d084", size = 10787, upload-time = "2025-03-31T08:12:08.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/34/15f08edd4628f65217de1fc3c1a27c82e46fe357d60c217fc9881e12ebcc/circuitbreaker-2.1.3-py3-none-any.whl", hash = "sha256:87ba6a3ed03fdc7032bc175561c2b04d52ade9d5faf94ca2b035fbdc5e6b1dd1", size = 7737, upload-time = "2025-03-31T08:12:07.802Z" }, +] + +[[package]] +name = "click" +version = "8.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cryptography" +version = "44.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/d6/1411ab4d6108ab167d06254c5be517681f1e331f90edf1379895bcb87020/cryptography-44.0.3.tar.gz", hash = "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053", size = 711096, upload-time = "2025-05-02T19:36:04.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/53/c776d80e9d26441bb3868457909b4e74dd9ccabd182e10b2b0ae7a07e265/cryptography-44.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88", size = 6670281, upload-time = "2025-05-02T19:34:50.665Z" }, + { url = "https://files.pythonhosted.org/packages/6a/06/af2cf8d56ef87c77319e9086601bef621bedf40f6f59069e1b6d1ec498c5/cryptography-44.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137", size = 3959305, upload-time = "2025-05-02T19:34:53.042Z" }, + { url = "https://files.pythonhosted.org/packages/ae/01/80de3bec64627207d030f47bf3536889efee8913cd363e78ca9a09b13c8e/cryptography-44.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c", size = 4171040, upload-time = "2025-05-02T19:34:54.675Z" }, + { url = "https://files.pythonhosted.org/packages/bd/48/bb16b7541d207a19d9ae8b541c70037a05e473ddc72ccb1386524d4f023c/cryptography-44.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76", size = 3963411, upload-time = "2025-05-02T19:34:56.61Z" }, + { url = "https://files.pythonhosted.org/packages/42/b2/7d31f2af5591d217d71d37d044ef5412945a8a8e98d5a2a8ae4fd9cd4489/cryptography-44.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359", size = 3689263, upload-time = "2025-05-02T19:34:58.591Z" }, + { url = "https://files.pythonhosted.org/packages/25/50/c0dfb9d87ae88ccc01aad8eb93e23cfbcea6a6a106a9b63a7b14c1f93c75/cryptography-44.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43", size = 4196198, upload-time = "2025-05-02T19:35:00.988Z" }, + { url = "https://files.pythonhosted.org/packages/66/c9/55c6b8794a74da652690c898cb43906310a3e4e4f6ee0b5f8b3b3e70c441/cryptography-44.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01", size = 3966502, upload-time = "2025-05-02T19:35:03.091Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f7/7cb5488c682ca59a02a32ec5f975074084db4c983f849d47b7b67cc8697a/cryptography-44.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d", size = 4196173, upload-time = "2025-05-02T19:35:05.018Z" }, + { url = "https://files.pythonhosted.org/packages/d2/0b/2f789a8403ae089b0b121f8f54f4a3e5228df756e2146efdf4a09a3d5083/cryptography-44.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904", size = 4087713, upload-time = "2025-05-02T19:35:07.187Z" }, + { url = "https://files.pythonhosted.org/packages/1d/aa/330c13655f1af398fc154089295cf259252f0ba5df93b4bc9d9c7d7f843e/cryptography-44.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44", size = 4299064, upload-time = "2025-05-02T19:35:08.879Z" }, + { url = "https://files.pythonhosted.org/packages/10/a8/8c540a421b44fd267a7d58a1fd5f072a552d72204a3f08194f98889de76d/cryptography-44.0.3-cp37-abi3-win32.whl", hash = "sha256:3be3f649d91cb182c3a6bd336de8b61a0a71965bd13d1a04a0e15b39c3d5809d", size = 2773887, upload-time = "2025-05-02T19:35:10.41Z" }, + { url = "https://files.pythonhosted.org/packages/b9/0d/c4b1657c39ead18d76bbd122da86bd95bdc4095413460d09544000a17d56/cryptography-44.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:3883076d5c4cc56dbef0b898a74eb6992fdac29a7b9013870b34efe4ddb39a0d", size = 3209737, upload-time = "2025-05-02T19:35:12.12Z" }, + { url = "https://files.pythonhosted.org/packages/34/a3/ad08e0bcc34ad436013458d7528e83ac29910943cea42ad7dd4141a27bbb/cryptography-44.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f", size = 6673501, upload-time = "2025-05-02T19:35:13.775Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f0/7491d44bba8d28b464a5bc8cc709f25a51e3eac54c0a4444cf2473a57c37/cryptography-44.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759", size = 3960307, upload-time = "2025-05-02T19:35:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/f7/c8/e5c5d0e1364d3346a5747cdcd7ecbb23ca87e6dea4f942a44e88be349f06/cryptography-44.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645", size = 4170876, upload-time = "2025-05-02T19:35:18.138Z" }, + { url = "https://files.pythonhosted.org/packages/73/96/025cb26fc351d8c7d3a1c44e20cf9a01e9f7cf740353c9c7a17072e4b264/cryptography-44.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2", size = 3964127, upload-time = "2025-05-02T19:35:19.864Z" }, + { url = "https://files.pythonhosted.org/packages/01/44/eb6522db7d9f84e8833ba3bf63313f8e257729cf3a8917379473fcfd6601/cryptography-44.0.3-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54", size = 3689164, upload-time = "2025-05-02T19:35:21.449Z" }, + { url = "https://files.pythonhosted.org/packages/68/fb/d61a4defd0d6cee20b1b8a1ea8f5e25007e26aeb413ca53835f0cae2bcd1/cryptography-44.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93", size = 4198081, upload-time = "2025-05-02T19:35:23.187Z" }, + { url = "https://files.pythonhosted.org/packages/1b/50/457f6911d36432a8811c3ab8bd5a6090e8d18ce655c22820994913dd06ea/cryptography-44.0.3-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c", size = 3967716, upload-time = "2025-05-02T19:35:25.426Z" }, + { url = "https://files.pythonhosted.org/packages/35/6e/dca39d553075980ccb631955c47b93d87d27f3596da8d48b1ae81463d915/cryptography-44.0.3-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f", size = 4197398, upload-time = "2025-05-02T19:35:27.678Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/d1f2fe681eabc682067c66a74addd46c887ebacf39038ba01f8860338d3d/cryptography-44.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5", size = 4087900, upload-time = "2025-05-02T19:35:29.312Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f5/3599e48c5464580b73b236aafb20973b953cd2e7b44c7c2533de1d888446/cryptography-44.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b", size = 4301067, upload-time = "2025-05-02T19:35:31.547Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6c/d2c48c8137eb39d0c193274db5c04a75dab20d2f7c3f81a7dcc3a8897701/cryptography-44.0.3-cp39-abi3-win32.whl", hash = "sha256:c138abae3a12a94c75c10499f1cbae81294a6f983b3af066390adee73f433028", size = 2775467, upload-time = "2025-05-02T19:35:33.805Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ad/51f212198681ea7b0deaaf8846ee10af99fba4e894f67b353524eab2bbe5/cryptography-44.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:5d186f32e52e66994dce4f766884bcb9c68b8da62d61d9d215bfe5fb56d21334", size = 3210375, upload-time = "2025-05-02T19:35:35.369Z" }, +] + +[[package]] +name = "cyclopts" +version = "3.24.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "docstring-parser", marker = "python_full_version < '4'" }, + { name = "rich" }, + { name = "rich-rst" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/ca/7782da3b03242d5f0a16c20371dff99d4bd1fedafe26bc48ff82e42be8c9/cyclopts-3.24.0.tar.gz", hash = "sha256:de6964a041dfb3c57bf043b41e68c43548227a17de1bad246e3a0bfc5c4b7417", size = 76131, upload-time = "2025-09-08T15:40:57.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/8b/2c95f0645c6f40211896375e6fa51f504b8ccb29c21f6ae661fe87ab044e/cyclopts-3.24.0-py3-none-any.whl", hash = "sha256:809d04cde9108617106091140c3964ee6fceb33cecdd537f7ffa360bde13ed71", size = 86154, upload-time = "2025-09-08T15:40:56.41Z" }, +] + +[[package]] +name = "dnspython" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, +] + +[[package]] +name = "docutils" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/d869000fb74438584858acc628a364b277fc012695f0dfd513cb10f99768/docutils-0.22.1.tar.gz", hash = "sha256:d2fb50923a313532b6d41a77776d24cb459a594be9b7e4afa1fbcb5bda1893e6", size = 2291655, upload-time = "2025-09-17T17:58:45.409Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/dc/1948b90c5d9dbfa4d1fd3991013a042ba3ac62ebd3afdcb3fac08366e755/docutils-0.22.1-py3-none-any.whl", hash = "sha256:806e896f256a17466426544038f30cb860a99f5d4af640e36c284bfcb1824512", size = 638455, upload-time = "2025-09-17T17:58:42.498Z" }, +] + +[[package]] +name = "email-validator" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, +] + +[[package]] +name = "fastmcp" +version = "2.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "authlib" }, + { name = "cyclopts" }, + { name = "exceptiongroup" }, + { name = "httpx" }, + { name = "mcp" }, + { name = "openapi-core" }, + { name = "openapi-pydantic" }, + { name = "pydantic", extra = ["email"] }, + { name = "pyperclip" }, + { name = "python-dotenv" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/8a/c46759bb41a53187191e5b3d963c0bde54783ecc89186a93c4947607b8e4/fastmcp-2.12.2.tar.gz", hash = "sha256:6d13e2f9be57b99763fc22485f9f603daa23bfbca35a8172baa43b283d6fc1ff", size = 5244547, upload-time = "2025-09-03T21:28:09.869Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/0a/7a8d564b1b9909dbfc36eb93d76410a4acfada6b1e13ee451a753bb6dbc2/fastmcp-2.12.2-py3-none-any.whl", hash = "sha256:0b58d68e819c82078d1fd51989d3d81f2be7382d527308b06df55f4d0a4ec94f", size = 312029, upload-time = "2025-09-03T21:28:08.62Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fa/66bd985dd0b7c109a3bcb89272ee0bfb7e2b4d06309ad7b38ff866734b2a/httpx_sse-0.4.1.tar.gz", hash = "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e", size = 12998, upload-time = "2025-06-24T13:21:05.71Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/0a/6269e3473b09aed2dab8aa1a600c70f31f00ae1349bee30658f7e358a159/httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37", size = 8054, upload-time = "2025-06-24T13:21:04.772Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, +] + +[[package]] +name = "jsonschema-path" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pathable" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/45/41ebc679c2a4fced6a722f624c18d658dee42612b83ea24c1caf7c0eb3a8/jsonschema_path-0.3.4.tar.gz", hash = "sha256:8365356039f16cc65fddffafda5f58766e34bebab7d6d105616ab52bc4297001", size = 11159, upload-time = "2025-01-24T14:33:16.547Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/58/3485da8cb93d2f393bce453adeef16896751f14ba3e2024bc21dc9597646/jsonschema_path-0.3.4-py3-none-any.whl", hash = "sha256:f502191fdc2b22050f9a81c9237be9d27145b9001c55842bece5e94e382e52f8", size = 14810, upload-time = "2025-01-24T14:33:14.652Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "lazy-object-proxy" +version = "1.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/a2/69df9c6ba6d316cfd81fe2381e464db3e6de5db45f8c43c6a23504abf8cb/lazy_object_proxy-1.12.0.tar.gz", hash = "sha256:1f5a462d92fd0cfb82f1fab28b51bfb209fabbe6aabf7f0d51472c0c124c0c61", size = 43681, upload-time = "2025-08-22T13:50:06.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/26/b74c791008841f8ad896c7f293415136c66cc27e7c7577de4ee68040c110/lazy_object_proxy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:86fd61cb2ba249b9f436d789d1356deae69ad3231dc3c0f17293ac535162672e", size = 26745, upload-time = "2025-08-22T13:42:44.982Z" }, + { url = "https://files.pythonhosted.org/packages/9b/52/641870d309e5d1fb1ea7d462a818ca727e43bfa431d8c34b173eb090348c/lazy_object_proxy-1.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:81d1852fb30fab81696f93db1b1e55a5d1ff7940838191062f5f56987d5fcc3e", size = 71537, upload-time = "2025-08-22T13:42:46.141Z" }, + { url = "https://files.pythonhosted.org/packages/47/b6/919118e99d51c5e76e8bf5a27df406884921c0acf2c7b8a3b38d847ab3e9/lazy_object_proxy-1.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be9045646d83f6c2664c1330904b245ae2371b5c57a3195e4028aedc9f999655", size = 71141, upload-time = "2025-08-22T13:42:47.375Z" }, + { url = "https://files.pythonhosted.org/packages/e5/47/1d20e626567b41de085cf4d4fb3661a56c159feaa73c825917b3b4d4f806/lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:67f07ab742f1adfb3966c40f630baaa7902be4222a17941f3d85fd1dae5565ff", size = 69449, upload-time = "2025-08-22T13:42:48.49Z" }, + { url = "https://files.pythonhosted.org/packages/58/8d/25c20ff1a1a8426d9af2d0b6f29f6388005fc8cd10d6ee71f48bff86fdd0/lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ba769017b944fcacbf6a80c18b2761a1795b03f8899acdad1f1c39db4409be", size = 70744, upload-time = "2025-08-22T13:42:49.608Z" }, + { url = "https://files.pythonhosted.org/packages/c0/67/8ec9abe15c4f8a4bcc6e65160a2c667240d025cbb6591b879bea55625263/lazy_object_proxy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:7b22c2bbfb155706b928ac4d74c1a63ac8552a55ba7fff4445155523ea4067e1", size = 26568, upload-time = "2025-08-22T13:42:57.719Z" }, + { url = "https://files.pythonhosted.org/packages/23/12/cd2235463f3469fd6c62d41d92b7f120e8134f76e52421413a0ad16d493e/lazy_object_proxy-1.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4a79b909aa16bde8ae606f06e6bbc9d3219d2e57fb3e0076e17879072b742c65", size = 27391, upload-time = "2025-08-22T13:42:50.62Z" }, + { url = "https://files.pythonhosted.org/packages/60/9e/f1c53e39bbebad2e8609c67d0830cc275f694d0ea23d78e8f6db526c12d3/lazy_object_proxy-1.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:338ab2f132276203e404951205fe80c3fd59429b3a724e7b662b2eb539bb1be9", size = 80552, upload-time = "2025-08-22T13:42:51.731Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b6/6c513693448dcb317d9d8c91d91f47addc09553613379e504435b4cc8b3e/lazy_object_proxy-1.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c40b3c9faee2e32bfce0df4ae63f4e73529766893258eca78548bac801c8f66", size = 82857, upload-time = "2025-08-22T13:42:53.225Z" }, + { url = "https://files.pythonhosted.org/packages/12/1c/d9c4aaa4c75da11eb7c22c43d7c90a53b4fca0e27784a5ab207768debea7/lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:717484c309df78cedf48396e420fa57fc8a2b1f06ea889df7248fdd156e58847", size = 80833, upload-time = "2025-08-22T13:42:54.391Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ae/29117275aac7d7d78ae4f5a4787f36ff33262499d486ac0bf3e0b97889f6/lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a6b7ea5ea1ffe15059eb44bcbcb258f97bcb40e139b88152c40d07b1a1dfc9ac", size = 79516, upload-time = "2025-08-22T13:42:55.812Z" }, + { url = "https://files.pythonhosted.org/packages/19/40/b4e48b2c38c69392ae702ae7afa7b6551e0ca5d38263198b7c79de8b3bdf/lazy_object_proxy-1.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:08c465fb5cd23527512f9bd7b4c7ba6cec33e28aad36fbbe46bf7b858f9f3f7f", size = 27656, upload-time = "2025-08-22T13:42:56.793Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3a/277857b51ae419a1574557c0b12e0d06bf327b758ba94cafc664cb1e2f66/lazy_object_proxy-1.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c9defba70ab943f1df98a656247966d7729da2fe9c2d5d85346464bf320820a3", size = 26582, upload-time = "2025-08-22T13:49:49.366Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b6/c5e0fa43535bb9c87880e0ba037cdb1c50e01850b0831e80eb4f4762f270/lazy_object_proxy-1.12.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6763941dbf97eea6b90f5b06eb4da9418cc088fce0e3883f5816090f9afcde4a", size = 71059, upload-time = "2025-08-22T13:49:50.488Z" }, + { url = "https://files.pythonhosted.org/packages/06/8a/7dcad19c685963c652624702f1a968ff10220b16bfcc442257038216bf55/lazy_object_proxy-1.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fdc70d81235fc586b9e3d1aeef7d1553259b62ecaae9db2167a5d2550dcc391a", size = 71034, upload-time = "2025-08-22T13:49:54.224Z" }, + { url = "https://files.pythonhosted.org/packages/12/ac/34cbfb433a10e28c7fd830f91c5a348462ba748413cbb950c7f259e67aa7/lazy_object_proxy-1.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0a83c6f7a6b2bfc11ef3ed67f8cbe99f8ff500b05655d8e7df9aab993a6abc95", size = 69529, upload-time = "2025-08-22T13:49:55.29Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6a/11ad7e349307c3ca4c0175db7a77d60ce42a41c60bcb11800aabd6a8acb8/lazy_object_proxy-1.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:256262384ebd2a77b023ad02fbcc9326282bcfd16484d5531154b02bc304f4c5", size = 70391, upload-time = "2025-08-22T13:49:56.35Z" }, + { url = "https://files.pythonhosted.org/packages/59/97/9b410ed8fbc6e79c1ee8b13f8777a80137d4bc189caf2c6202358e66192c/lazy_object_proxy-1.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:7601ec171c7e8584f8ff3f4e440aa2eebf93e854f04639263875b8c2971f819f", size = 26988, upload-time = "2025-08-22T13:49:57.302Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, +] + +[[package]] +name = "mcp" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/e9/242096400d702924b49f8d202c6ded7efb8841cacba826b5d2e6183aef7b/mcp-1.14.1.tar.gz", hash = "sha256:31c4406182ba15e8f30a513042719c3f0a38c615e76188ee5a736aaa89e20134", size = 454944, upload-time = "2025-09-18T13:37:19.971Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/11/d334fbb7c2aeddd2e762b86d7a619acffae012643a5738e698f975a2a9e2/mcp-1.14.1-py3-none-any.whl", hash = "sha256:3b7a479e8e5cbf5361bdc1da8bc6d500d795dc3aff44b44077a363a7f7e945a4", size = 163809, upload-time = "2025-09-18T13:37:18.165Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "more-itertools" +version = "10.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, +] + +[[package]] +name = "oci" +version = "2.160.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "circuitbreaker" }, + { name = "cryptography" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, +] + +[[package]] +name = "openapi-core" +version = "0.19.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "isodate" }, + { name = "jsonschema" }, + { name = "jsonschema-path" }, + { name = "more-itertools" }, + { name = "openapi-schema-validator" }, + { name = "openapi-spec-validator" }, + { name = "parse" }, + { name = "typing-extensions" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/35/1acaa5f2fcc6e54eded34a2ec74b479439c4e469fc4e8d0e803fda0234db/openapi_core-0.19.5.tar.gz", hash = "sha256:421e753da56c391704454e66afe4803a290108590ac8fa6f4a4487f4ec11f2d3", size = 103264, upload-time = "2025-03-20T20:17:28.193Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/6f/83ead0e2e30a90445ee4fc0135f43741aebc30cca5b43f20968b603e30b6/openapi_core-0.19.5-py3-none-any.whl", hash = "sha256:ef7210e83a59394f46ce282639d8d26ad6fc8094aa904c9c16eb1bac8908911f", size = 106595, upload-time = "2025-03-20T20:17:26.77Z" }, +] + +[[package]] +name = "openapi-pydantic" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" }, +] + +[[package]] +name = "openapi-schema-validator" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jsonschema-specifications" }, + { name = "rfc3339-validator" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/f3/5507ad3325169347cd8ced61c232ff3df70e2b250c49f0fe140edb4973c6/openapi_schema_validator-0.6.3.tar.gz", hash = "sha256:f37bace4fc2a5d96692f4f8b31dc0f8d7400fd04f3a937798eaf880d425de6ee", size = 11550, upload-time = "2025-01-10T18:08:22.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/c6/ad0fba32775ae749016829dace42ed80f4407b171da41313d1a3a5f102e4/openapi_schema_validator-0.6.3-py3-none-any.whl", hash = "sha256:f3b9870f4e556b5a62a1c39da72a6b4b16f3ad9c73dc80084b1b11e74ba148a3", size = 8755, upload-time = "2025-01-10T18:08:19.758Z" }, +] + +[[package]] +name = "openapi-spec-validator" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jsonschema-path" }, + { name = "lazy-object-proxy" }, + { name = "openapi-schema-validator" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/af/fe2d7618d6eae6fb3a82766a44ed87cd8d6d82b4564ed1c7cfb0f6378e91/openapi_spec_validator-0.7.2.tar.gz", hash = "sha256:cc029309b5c5dbc7859df0372d55e9d1ff43e96d678b9ba087f7c56fc586f734", size = 36855, upload-time = "2025-06-07T14:48:56.299Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/dd/b3fd642260cb17532f66cc1e8250f3507d1e580483e209dc1e9d13bd980d/openapi_spec_validator-0.7.2-py3-none-any.whl", hash = "sha256:4bbdc0894ec85f1d1bea1d6d9c8b2c3c8d7ccaa13577ef40da9c006c9fd0eb60", size = 39713, upload-time = "2025-06-07T14:48:54.077Z" }, +] + +[[package]] +name = "oracle-database-mcp-server" +version = "1.0.1" +source = { editable = "." } +dependencies = [ + { name = "fastmcp" }, + { name = "mcp" }, + { name = "oci" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, +] + +[package.metadata] +requires-dist = [ + { name = "fastmcp", specifier = "==2.12.2" }, + { name = "mcp", specifier = ">=1.0.0" }, + { name = "oci", specifier = "==2.160.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "pytest", specifier = ">=8.4.2" }, + { name = "pytest-asyncio", specifier = ">=1.2.0" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "parse" +version = "1.20.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/78/d9b09ba24bb36ef8b83b71be547e118d46214735b6dfb39e4bfde0e9b9dd/parse-1.20.2.tar.gz", hash = "sha256:b41d604d16503c79d81af5165155c0b20f6c8d6c559efa66b4b695c3e5a0a0ce", size = 29391, upload-time = "2024-06-11T04:41:57.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/31/ba45bf0b2aa7898d81cbbfac0e88c267befb59ad91a19e36e1bc5578ddb1/parse-1.20.2-py2.py3-none-any.whl", hash = "sha256:967095588cb802add9177d0c0b6133b5ba33b1ea9007ca800e526f42a85af558", size = 20126, upload-time = "2024-06-11T04:41:55.057Z" }, +] + +[[package]] +name = "pathable" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/67/93/8f2c2075b180c12c1e9f6a09d1a985bc2036906b13dff1d8917e395f2048/pathable-0.4.4.tar.gz", hash = "sha256:6905a3cd17804edfac7875b5f6c9142a218c7caef78693c2dbbbfbac186d88b2", size = 8124, upload-time = "2025-01-10T18:43:13.247Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592, upload-time = "2025-01-10T18:43:11.88Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pydantic" +version = "2.11.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495, upload-time = "2025-09-13T11:26:39.325Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855, upload-time = "2025-09-13T11:26:36.909Z" }, +] + +[package.optional-dependencies] +email = [ + { name = "email-validator" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyopenssl" +version = "24.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/d4/1067b82c4fc674d6f6e9e8d26b3dff978da46d351ca3bac171544693e085/pyopenssl-24.3.0.tar.gz", hash = "sha256:49f7a019577d834746bc55c5fce6ecbcec0f2b4ec5ce1cf43a9a173b8138bb36", size = 178944, upload-time = "2024-11-27T20:43:12.755Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/22/40f9162e943f86f0fc927ebc648078be87def360d9d8db346619fb97df2b/pyOpenSSL-24.3.0-py3-none-any.whl", hash = "sha256:e474f5a473cd7f92221cc04976e48f4d11502804657a08a989fb3be5514c904a", size = 56111, upload-time = "2024-11-27T20:43:21.112Z" }, +] + +[[package]] +name = "pyperclip" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/99/25f4898cf420efb6f45f519de018f4faea5391114a8618b16736ef3029f1/pyperclip-1.10.0.tar.gz", hash = "sha256:180c8346b1186921c75dfd14d9048a6b5d46bfc499778811952c6dd6eb1ca6be", size = 12193, upload-time = "2025-09-18T00:54:00.384Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/bc/22540e73c5f5ae18f02924cd3954a6c9a4aa6b713c841a94c98335d333a1/pyperclip-1.10.0-py3-none-any.whl", hash = "sha256:596fbe55dc59263bff26e61d2afbe10223e2fccb5210c9c96a28d6887cfcc7ec", size = 11062, upload-time = "2025-09-18T00:53:59.252Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/86/9e3c5f48f7b7b638b216e4b9e645f54d199d7abbbab7a64a13b4e12ba10f/pytest_asyncio-1.2.0.tar.gz", hash = "sha256:c609a64a2a8768462d0c99811ddb8bd2583c33fd33cf7f21af1c142e824ffb57", size = 50119, upload-time = "2025-09-12T07:33:53.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/93/2fa34714b7a4ae72f2f8dad66ba17dd9a2c793220719e736dda28b7aec27/pytest_asyncio-1.2.0-py3-none-any.whl", hash = "sha256:8e17ae5e46d8e7efe51ab6494dd2010f4ca8dae51652aa3c8d55acf50bfb2e99", size = 15095, upload-time = "2025-09-12T07:33:52.639Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rich" +version = "14.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" }, +] + +[[package]] +name = "rich-rst" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/69/5514c3a87b5f10f09a34bb011bc0927bc12c596c8dae5915604e71abc386/rich_rst-1.3.1.tar.gz", hash = "sha256:fad46e3ba42785ea8c1785e2ceaa56e0ffa32dbe5410dec432f37e4107c4f383", size = 13839, upload-time = "2024-04-30T04:40:38.125Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/bc/cc4e3dbc5e7992398dcb7a8eda0cbcf4fb792a0cdb93f857b478bf3cf884/rich_rst-1.3.1-py3-none-any.whl", hash = "sha256:498a74e3896507ab04492d326e794c3ef76e7cda078703aa592d1853d91098c1", size = 11621, upload-time = "2024-04-30T04:40:32.619Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, + { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, + { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, + { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, + { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, + { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, + { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, + { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, + { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, + { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, + { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, + { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, + { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, + { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, + { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, + { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, + { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, + { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, + { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, + { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, + { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/6f/22ed6e33f8a9e76ca0a412405f31abb844b779d52c5f96660766edcd737c/sse_starlette-3.0.2.tar.gz", hash = "sha256:ccd60b5765ebb3584d0de2d7a6e4f745672581de4f5005ab31c3a25d10b52b3a", size = 20985, upload-time = "2025-07-27T09:07:44.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/10/c78f463b4ef22eef8491f218f692be838282cd65480f6e423d7730dfd1fb/sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a", size = 11297, upload-time = "2025-07-27T09:07:43.268Z" }, +] + +[[package]] +name = "starlette" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/a5/d6f429d43394057b67a6b5bbe6eae2f77a6bf7459d961fdb224bf206eee6/starlette-0.48.0.tar.gz", hash = "sha256:7e8cee469a8ab2352911528110ce9088fdc6a37d9876926e73da7ce4aa4c7a46", size = 2652949, upload-time = "2025-09-13T08:41:05.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.36.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/5e/f0cd46063a02fd8515f0e880c37d2657845b7306c16ce6c4ffc44afd9036/uvicorn-0.36.0.tar.gz", hash = "sha256:527dc68d77819919d90a6b267be55f0e76704dca829d34aea9480be831a9b9d9", size = 80032, upload-time = "2025-09-20T01:07:14.418Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/af/d4502dc713b4ccea7175d764718d5183caf8d0867a4f0190d5d4a45cea49/werkzeug-3.1.1.tar.gz", hash = "sha256:8cd39dfbdfc1e051965f156163e2974e52c210f130810e9ad36858f0fd3edad4", size = 806453, upload-time = "2024-11-01T16:40:45.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/ea/c67e1dee1ba208ed22c06d1d547ae5e293374bfc43e0eb0ef5e262b68561/werkzeug-3.1.1-py3-none-any.whl", hash = "sha256:a71124d1ef06008baafa3d266c02f56e1836a5984afd6dd6c9230669d60d9fb5", size = 224371, upload-time = "2024-11-01T16:40:43.994Z" }, +] diff --git a/tox.ini b/tox.ini index 69461bd..7cbcef4 100644 --- a/tox.ini +++ b/tox.ini @@ -19,6 +19,7 @@ extend-exclude = src/mysql-mcp-server, src/oci-pricing-mcp-server, src/oracle-db-doc-mcp-server + src/database-mcp-server [testenv] deps =