Source code for simple_aws_redshift.redshift.model

# -*- coding: utf-8 -*-

"""
Data models for AWS Redshift Cluster resources.

Ref:

- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/redshift-serverless.html
"""

import typing as T
import datetime
import dataclasses

from func_args.api import T_KWARGS, REQ
from enum_mate.api import BetterStrEnum
from iterproxy import IterProxy

from ..model import Base

if T.TYPE_CHECKING:  # pragma: no cover
    from mypy_boto3_redshift.type_defs import (
        ClusterTypeDef,
        ClusterSecurityGroupMembershipTypeDef,
        VpcSecurityGroupMembershipTypeDef,
        ClusterParameterGroupStatusTypeDef,
        PendingModifiedValuesTypeDef,
        RestoreStatusTypeDef,
        DataTransferProgressTypeDef,
        HsmStatusTypeDef,
        ClusterSnapshotCopyStatusTypeDef,
        ClusterNodeTypeDef,
        ElasticIpStatusTypeDef,
        EndpointTypeDef,
        ClusterIamRoleTypeDef,
        DeferredMaintenanceWindowTypeDef,
        ScheduleStateType,
        AquaConfigurationTypeDef,
        ReservedNodeExchangeStatusTypeDef,
        SecondaryClusterInfoTypeDef,
        ResizeInfoTypeDef,
    )
    from mypy_boto3_redshift.client import RedshiftClient


[docs] class ClusterStatus(BetterStrEnum): """ Enum for Redshift cluster status. """ AVAILABLE = "available" AVAILABLE_PREP_FOR_RESIZE = "available, prep-for-resize" AVAILABLE_RESIZE_CLEANUP = "available, resize-cleanup" CANCELLING_RESIZE = "cancelling-resize" CREATING = "creating" DELETING = "deleting" FINAL_SNAPSHOT = "final-snapshot" HARDWARE_FAILURE = "hardware-failure" INCOMPATIBLE_HSM = "incompatible-hsm" INCOMPATIBLE_NETWORK = "incompatible-network" INCOMPATIBLE_PARAMETERS = "incompatible-parameters" INCOMPATIBLE_RESTORE = "incompatible-restore" MODIFYING = "modifying" PAUSED = "paused" REBOOTING = "rebooting" RENAMING = "renaming" RESIZING = "resizing" ROTATING_KEYS = "rotating-keys" STORAGE_FULL = "storage-full" UPDATING_HSM = "updating-hsm"
[docs] class ClusterAvailabilityStatus(BetterStrEnum): """ Enum for Redshift cluster availability status. """ AVAILABLE = "Available" UNAVAILABLE = "Unavailable" MAINTENANCE = "Maintenance" MODIFYING = "Modifying" FAILED = "Failed"
[docs] @dataclasses.dataclass class RedshiftCluster(Base): """ Redshift Cluster object. Ref: - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/redshift/client/describe_clusters.html - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/redshift/paginator/DescribeClusters.html """ raw_data: "ClusterTypeDef" = dataclasses.field(default=REQ) @property def allow_version_upgrade(self) -> T.Optional[bool]: return self.raw_data.get("AllowVersionUpgrade") @property def automated_snapshot_retention_period(self) -> T.Optional[int]: return self.raw_data.get("AutomatedSnapshotRetentionPeriod") @property def availability_zone(self) -> T.Optional[str]: return self.raw_data.get("AvailabilityZone") @property def availability_zone_relocation_status(self) -> T.Optional[str]: return self.raw_data.get("AvailabilityZoneRelocationStatus") @property def cluster_availability_status(self) -> T.Optional[str]: return self.raw_data.get("ClusterAvailabilityStatus") @property def cluster_create_time(self) -> T.Optional[datetime.datetime]: return self.raw_data.get("ClusterCreateTime") @property def cluster_identifier(self) -> T.Optional[str]: return self.raw_data.get("ClusterIdentifier") @property def cluster_namespace_arn(self) -> T.Optional[str]: return self.raw_data.get("ClusterNamespaceArn") @property def cluster_nodes(self) -> T.Optional[T.List["ClusterNodeTypeDef"]]: return self.raw_data.get("ClusterNodes") @property def cluster_parameter_groups( self, ) -> T.Optional[T.List["ClusterParameterGroupStatusTypeDef"]]: return self.raw_data.get("ClusterParameterGroups") @property def cluster_public_key(self) -> T.Optional[str]: return self.raw_data.get("ClusterPublicKey") @property def cluster_revision_number(self) -> T.Optional[str]: return self.raw_data.get("ClusterRevisionNumber") @property def cluster_security_groups( self, ) -> T.Optional[T.List["ClusterSecurityGroupMembershipTypeDef"]]: return self.raw_data.get("ClusterSecurityGroups") @property def cluster_snapshot_copy_status( self, ) -> T.Optional["ClusterSnapshotCopyStatusTypeDef"]: return self.raw_data.get("ClusterSnapshotCopyStatus") @property def cluster_status(self) -> T.Optional[str]: return self.raw_data.get("ClusterStatus") @property def cluster_subnet_group_name(self) -> T.Optional[str]: return self.raw_data.get("ClusterSubnetGroupName") @property def cluster_version(self) -> T.Optional[str]: return self.raw_data.get("ClusterVersion") @property def custom_domain_certificate_arn(self) -> T.Optional[str]: return self.raw_data.get("CustomDomainCertificateArn") @property def custom_domain_certificate_expiry_date(self) -> T.Optional[datetime.datetime]: return self.raw_data.get("CustomDomainCertificateExpiryDate") @property def custom_domain_name(self) -> T.Optional[str]: return self.raw_data.get("CustomDomainName") @property def data_transfer_progress(self) -> T.Optional["DataTransferProgressTypeDef"]: return self.raw_data.get("DataTransferProgress") @property def db_name(self) -> T.Optional[str]: return self.raw_data.get("DBName") @property def default_iam_role_arn(self) -> T.Optional[str]: return self.raw_data.get("DefaultIamRoleArn") @property def deferred_maintenance_windows( self, ) -> T.Optional[T.List["DeferredMaintenanceWindowTypeDef"]]: return self.raw_data.get("DeferredMaintenanceWindows") @property def elastic_ip_status(self) -> T.Optional["ElasticIpStatusTypeDef"]: return self.raw_data.get("ElasticIpStatus") @property def elastic_resize_number_of_node_options(self) -> T.Optional[str]: return self.raw_data.get("ElasticResizeNumberOfNodeOptions") @property def encrypted(self) -> T.Optional[bool]: return self.raw_data.get("Encrypted") @property def endpoint(self) -> T.Optional["EndpointTypeDef"]: return self.raw_data.get("Endpoint") @property def enhanced_vpc_routing(self) -> T.Optional[bool]: return self.raw_data.get("EnhancedVpcRouting") @property def expected_next_snapshot_schedule_time(self) -> T.Optional[datetime.datetime]: return self.raw_data.get("ExpectedNextSnapshotScheduleTime") @property def expected_next_snapshot_schedule_time_status(self) -> T.Optional[str]: return self.raw_data.get("ExpectedNextSnapshotScheduleTimeStatus") @property def hsm_status(self) -> T.Optional["HsmStatusTypeDef"]: return self.raw_data.get("HsmStatus") @property def iam_roles(self) -> T.Optional[T.List["ClusterIamRoleTypeDef"]]: return self.raw_data.get("IamRoles") @property def ip_address_type(self) -> T.Optional[str]: return self.raw_data.get("IpAddressType") @property def kms_key_id(self) -> T.Optional[str]: return self.raw_data.get("KmsKeyId") @property def maintenance_track_name(self) -> T.Optional[str]: return self.raw_data.get("MaintenanceTrackName") @property def manual_snapshot_retention_period(self) -> T.Optional[int]: return self.raw_data.get("ManualSnapshotRetentionPeriod") @property def master_password_secret_arn(self) -> T.Optional[str]: return self.raw_data.get("MasterPasswordSecretArn") @property def master_password_secret_kms_key_id(self) -> T.Optional[str]: return self.raw_data.get("MasterPasswordSecretKmsKeyId") @property def master_username(self) -> T.Optional[str]: return self.raw_data.get("MasterUsername") @property def modify_status(self) -> T.Optional[str]: return self.raw_data.get("ModifyStatus") @property def multi_az(self) -> T.Optional[str]: return self.raw_data.get("MultiAZ") @property def multi_az_secondary(self) -> T.Optional["SecondaryClusterInfoTypeDef"]: return self.raw_data.get("MultiAZSecondary") @property def next_maintenance_window_start_time(self) -> T.Optional[datetime.datetime]: return self.raw_data.get("NextMaintenanceWindowStartTime") @property def node_type(self) -> T.Optional[str]: return self.raw_data.get("NodeType") @property def number_of_nodes(self) -> T.Optional[int]: return self.raw_data.get("NumberOfNodes") @property def pending_actions(self) -> T.Optional[T.List[str]]: return self.raw_data.get("PendingActions") @property def pending_modified_values(self) -> T.Optional["PendingModifiedValuesTypeDef"]: return self.raw_data.get("PendingModifiedValues") @property def preferred_maintenance_window(self) -> T.Optional[str]: return self.raw_data.get("PreferredMaintenanceWindow") @property def publicly_accessible(self) -> T.Optional[bool]: return self.raw_data.get("PubliclyAccessible") @property def reserved_node_exchange_status( self, ) -> T.Optional["ReservedNodeExchangeStatusTypeDef"]: return self.raw_data.get("ReservedNodeExchangeStatus") @property def resize_info(self) -> T.Optional["ResizeInfoTypeDef"]: return self.raw_data.get("ResizeInfo") @property def restore_status(self) -> T.Optional["RestoreStatusTypeDef"]: return self.raw_data.get("RestoreStatus") @property def snapshot_schedule_identifier(self) -> T.Optional[str]: return self.raw_data.get("SnapshotScheduleIdentifier") @property def snapshot_schedule_state(self) -> T.Optional[str]: return self.raw_data.get("SnapshotScheduleState") @property def tags(self) -> T.Optional[T.List[T.Dict[str, str]]]: return self.raw_data.get("Tags") @property def total_storage_capacity_in_mega_bytes(self) -> T.Optional[int]: return self.raw_data.get("TotalStorageCapacityInMegaBytes") @property def vpc_id(self) -> T.Optional[str]: return self.raw_data.get("VpcId") @property def vpc_security_groups( self, ) -> T.Optional[T.List["VpcSecurityGroupMembershipTypeDef"]]: return self.raw_data.get("VpcSecurityGroups") @property def core_data(self) -> T_KWARGS: return { "cluster_identifier": self.cluster_identifier, "cluster_namespace_arn": self.cluster_namespace_arn, "cluster_status": self.cluster_status, "cluster_availability_status": self.cluster_availability_status, "node_type": self.node_type, "number_of_nodes": self.number_of_nodes, "cluster_create_time": self.cluster_create_time, "db_name": self.db_name, } @property def is_available(self) -> bool: return self.cluster_status == ClusterStatus.AVAILABLE.value @property def is_creating(self) -> bool: return self.cluster_status == ClusterStatus.CREATING.value @property def is_deleting(self) -> bool: return self.cluster_status == ClusterStatus.DELETING.value @property def is_modifying(self) -> bool: return self.cluster_status == ClusterStatus.MODIFYING.value @property def is_paused(self) -> bool: return self.cluster_status == ClusterStatus.PAUSED.value @property def is_rebooting(self) -> bool: return self.cluster_status == ClusterStatus.REBOOTING.value @property def is_resizing(self) -> bool: return self.cluster_status == ClusterStatus.RESIZING.value @property def endpoint_address(self) -> T.Optional[str]: if self.endpoint: # pragma: no cover return self.endpoint.get("Address") return None @property def endpoint_port(self) -> T.Optional[int]: if self.endpoint: # pragma: no cover return self.endpoint.get("Port") return None
[docs] class RedshiftClusterIterProxy(IterProxy[RedshiftCluster]): """ Iterator proxy for :class:`RedshiftCluster`. """