from moto.core.responses import BaseResponse from .models import neptune_backends, NeptuneBackend class NeptuneResponse(BaseResponse): """Handler for Neptune requests and responses.""" def __init__(self) -> None: super().__init__(service_name="neptune") @property def neptune_backend(self) -> NeptuneBackend: """Return backend instance specific for this region.""" return neptune_backends[self.current_account][self.region] @property def global_backend(self) -> NeptuneBackend: """Return backend instance of the region that stores Global Clusters""" return neptune_backends[self.current_account]["us-east-1"] def create_db_cluster(self) -> str: params = self._get_params() availability_zones = params.get("AvailabilityZones") backup_retention_period = params.get("BackupRetentionPeriod") character_set_name = params.get("CharacterSetName") copy_tags_to_snapshot = params.get("CopyTagsToSnapshot") database_name = params.get("DatabaseName") db_cluster_identifier = params.get("DBClusterIdentifier") db_cluster_parameter_group_name = params.get("DBClusterParameterGroupName") vpc_security_group_ids = params.get("VpcSecurityGroupIds") db_subnet_group_name = params.get("DBSubnetGroupName") engine = params.get("Engine") engine_version = params.get("EngineVersion") port = params.get("Port") master_username = params.get("MasterUsername") master_user_password = params.get("MasterUserPassword") option_group_name = params.get("OptionGroupName") preferred_backup_window = params.get("PreferredBackupWindow") preferred_maintenance_window = params.get("PreferredMaintenanceWindow") replication_source_identifier = params.get("ReplicationSourceIdentifier") tags = (self._get_multi_param_dict("Tags") or {}).get("Tag", []) storage_encrypted = params.get("StorageEncrypted", "") kms_key_id = params.get("KmsKeyId") pre_signed_url = params.get("PreSignedUrl") enable_iam_database_authentication = params.get( "EnableIAMDatabaseAuthentication" ) enable_cloudwatch_logs_exports = params.get("EnableCloudwatchLogsExports") deletion_protection = params.get("DeletionProtection") serverless_v2_scaling_configuration = params.get( "ServerlessV2ScalingConfiguration" ) global_cluster_identifier = params.get("GlobalClusterIdentifier") source_region = params.get("SourceRegion") db_cluster = self.neptune_backend.create_db_cluster( availability_zones=availability_zones, backup_retention_period=backup_retention_period, character_set_name=character_set_name, copy_tags_to_snapshot=copy_tags_to_snapshot, database_name=database_name, db_cluster_identifier=db_cluster_identifier, db_cluster_parameter_group_name=db_cluster_parameter_group_name, vpc_security_group_ids=vpc_security_group_ids, db_subnet_group_name=db_subnet_group_name, engine=engine, engine_version=engine_version, port=port, master_username=master_username, master_user_password=master_user_password, option_group_name=option_group_name, preferred_backup_window=preferred_backup_window, preferred_maintenance_window=preferred_maintenance_window, replication_source_identifier=replication_source_identifier, tags=tags, storage_encrypted=storage_encrypted, kms_key_id=kms_key_id, pre_signed_url=pre_signed_url, enable_iam_database_authentication=enable_iam_database_authentication, enable_cloudwatch_logs_exports=enable_cloudwatch_logs_exports, deletion_protection=deletion_protection, serverless_v2_scaling_configuration=serverless_v2_scaling_configuration, global_cluster_identifier=global_cluster_identifier, source_region=source_region, ) template = self.response_template(CREATE_DB_CLUSTER_TEMPLATE) return template.render(cluster=db_cluster) def describe_db_clusters(self) -> str: params = self._get_params() db_cluster_identifier = params["DBClusterIdentifier"] db_clusters = self.neptune_backend.describe_db_clusters( db_cluster_identifier=db_cluster_identifier ) template = self.response_template(DESCRIBE_DB_CLUSTERS_TEMPLATE) return template.render(db_clusters=db_clusters) def describe_global_clusters(self) -> str: clusters = self.global_backend.describe_global_clusters() template = self.response_template(DESCRIBE_GLOBAL_CLUSTERS_TEMPLATE) return template.render(clusters=clusters) def create_global_cluster(self) -> str: params = self._get_params() cluster = self.global_backend.create_global_cluster( global_cluster_identifier=params["GlobalClusterIdentifier"], engine=params.get("Engine"), engine_version=params.get("EngineVersion"), storage_encrypted=params.get("StorageEncrypted"), deletion_protection=params.get("DeletionProtection"), ) template = self.response_template(CREATE_GLOBAL_CLUSTER_TEMPLATE) return template.render(cluster=cluster) def delete_global_cluster(self) -> str: params = self._get_params() cluster = self.global_backend.delete_global_cluster( global_cluster_identifier=params["GlobalClusterIdentifier"], ) template = self.response_template(DELETE_GLOBAL_CLUSTER_TEMPLATE) return template.render(cluster=cluster) CREATE_DB_CLUSTER_TEMPLATE = """ 1549581b-12b7-11e3-895e-1334aEXAMPLE {{ cluster.to_xml() }} """ DESCRIBE_DB_CLUSTERS_TEMPLATE = """ 1549581b-12b7-11e3-895e-1334aEXAMPLE {% for cluster in db_clusters %} {{ cluster.to_xml() }} {% endfor %} """ CREATE_GLOBAL_CLUSTER_TEMPLATE = """ 1549581b-12b7-11e3-895e-1334aEXAMPLE {{ cluster.to_xml() }} """ DELETE_GLOBAL_CLUSTER_TEMPLATE = """ 1549581b-12b7-11e3-895e-1334aEXAMPLE {{ cluster.to_xml() }} """ DESCRIBE_GLOBAL_CLUSTERS_TEMPLATE = """ 1549581b-12b7-11e3-895e-1334aEXAMPLE {% for cluster in clusters %} {{ cluster.to_xml() }} {% endfor %} """