import datetime
from typing import Optional, List, Any, Union
from enum import Enum
from .. import serde


class TransferType(str, Enum):
    """
    The link used to transfer data in CRR
    """

    INTERNAL = 'internal'
    OSS_ACC = 'oss_acc'


class StatusType(str, Enum):
    """
    A short description of Status
    """

    ENABLED = 'Enabled'
    DISABLED = 'Disabled'


class HistoricalObjectReplicationType(str, Enum):
    """
    Specify whether to copy historical data.
    """

    ENABLED = 'enabled'
    DISABLED = 'disabled'


class TransferTypes(serde.Model):
    """
    The container that stores the transfer type.
    """

    _attribute_map = { 
        'types': {'tag': 'xml', 'rename': 'Type', 'type': '[str]'},
    }

    _xml_map = {
        'name': 'TransferTypes'
    }

    def __init__(
        self,
        types: Optional[List[str]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            types (List[str], optional): The data transfer type that is used to transfer data in data replication. Valid values:*   internal (default): the default data transfer link used in OSS.*   oss_acc: the link in which data transmission is accelerated. You can set TransferType to oss_acc only when you create CRR rules.
        """
        super().__init__(**kwargs)
        self.types = types


class ReplicationProgressInformation(serde.Model):
    """
    The container that stores the progress of the data replication task. This parameter is returned only when the data replication task is in the doing state.
    """

    _attribute_map = { 
        'historical_object': {'tag': 'xml', 'rename': 'HistoricalObject', 'type': 'str'},
        'new_object': {'tag': 'xml', 'rename': 'NewObject', 'type': 'str'},
    }

    _xml_map = {
        'name': 'Progress'
    }

    def __init__(
        self,
        historical_object: Optional[str] = None,
        new_object: Optional[str] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            historical_object (str, optional): The percentage of the replicated historical data. This parameter is valid only when HistoricalObjectReplication is set to enabled.
            new_object (str, optional): The time used to determine whether data is replicated to the destination bucket. Data that is written to the source bucket before the time is replicated to the destination bucket. The value of this parameter is in the GMT format. Example: Thu, 24 Sep 2015 15:39:18 GMT.
        """
        super().__init__(**kwargs)
        self.historical_object = historical_object
        self.new_object = new_object


class ReplicationPrefixSet(serde.Model):
    """
    The container that stores prefixes. You can specify up to 10 prefixes in each data replication rule.
    """

    _attribute_map = { 
        'prefixs': {'tag': 'xml', 'rename': 'Prefix', 'type': '[str]'},
    }

    _xml_map = {
        'name': 'PrefixSet'
    }

    def __init__(
        self,
        prefixs: Optional[List[str]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            prefixs (List[str], optional): The prefix that is used to specify the object that you want to replicate. Only objects whose names contain the specified prefix are replicated to the destination bucket.*   The value of the Prefix parameter can be up to 1,023 characters in length.*   If you specify the Prefix parameter in a data replication rule, OSS synchronizes new data and historical data based on the value of the Prefix parameter.
        """
        super().__init__(**kwargs)
        self.prefixs = prefixs


class ReplicationRules(serde.Model):
    """
    The container that stores the data replication rule that you want to delete.
    """

    _attribute_map = { 
        'ids': {'tag': 'xml', 'rename': 'ID', 'type': '[str]'},
    }

    _xml_map = {
        'name': 'ReplicationRules'
    }

    def __init__(
        self,
        ids: Optional[List[str]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            ids (List[str], optional): The ID of data replication rules that you want to delete. You can call the GetBucketReplication operation to obtain the ID.
        """
        super().__init__(**kwargs)
        self.ids = ids


class LocationRTCConstraint(serde.Model):
    """
    The container that stores regions in which the RTC can be enabled.
    """

    _attribute_map = { 
        'locations': {'tag': 'xml', 'rename': 'Location', 'type': '[str]'},
    }

    _xml_map = {
        'name': 'LocationRTCConstraint'
    }

    def __init__(
        self,
        locations: Optional[List[str]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            locations (List[str], optional): The regions where RTC is supported.
        """
        super().__init__(**kwargs)
        self.locations = locations


class ReplicationDestination(serde.Model):
    """
    The container that stores the information about the destination bucket.
    """

    _attribute_map = { 
        'bucket': {'tag': 'xml', 'rename': 'Bucket', 'type': 'str'},
        'location': {'tag': 'xml', 'rename': 'Location', 'type': 'str'},
        'transfer_type': {'tag': 'xml', 'rename': 'TransferType', 'type': 'str'},
    }

    _xml_map = {
        'name': 'Destination'
    }

    def __init__(
        self,
        bucket: Optional[str] = None,
        location: Optional[str] = None,
        transfer_type: Optional[Union[str, TransferType]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            bucket (str, optional): The destination bucket to which data is replicated.
            location (str, optional): The region in which the destination bucket is located.
            transfer_type (str | TransferType, optional): The link that is used to transfer data during data replication. Valid values:*   internal (default): the default data transfer link used in OSS.*   oss_acc: the transfer acceleration link. You can set TransferType to oss_acc only when you create CRR rules.
        """
        super().__init__(**kwargs)
        self.bucket = bucket
        self.location = location
        self.transfer_type = transfer_type


class ReplicationTimeControl(serde.Model):
    """
    The container that stores information about the Replication Time Control (RTC) status.
    """

    _attribute_map = { 
        'status': {'tag': 'xml', 'rename': 'Status', 'type': 'str'},
    }

    _xml_map = {
        'name': 'RTC'
    }

    def __init__(
        self,
        status: Optional[str] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            status (str, optional): Specifies whether to enable RTC.Valid values:*   disabled            *   enabled
        """
        super().__init__(**kwargs)
        self.status = status


class LocationTransferType(serde.Model):
    """
    The container that stores regions in which the destination bucket can be located with the TransferType information.
    """

    _attribute_map = {
        'location': {'tag': 'xml', 'rename': 'Location', 'type': 'str'},
        'transfer_types': {'tag': 'xml', 'rename': 'TransferTypes', 'type': 'TransferTypes'},
    }

    _xml_map = {
        'name': 'LocationTransferType'
    }

    _dependency_map = {
        'TransferTypes': {'new': lambda: TransferTypes()},
    }

    def __init__(
        self,
        location: Optional[str] = None,
        transfer_types: Optional[TransferTypes] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            location (str, optional): The regions in which the destination bucket can be located.
            transfer_types (TransferTypes, optional): The container that stores the transfer type.
        """
        super().__init__(**kwargs)
        self.location = location
        self.transfer_types = transfer_types

class SseKmsEncryptedObjects(serde.Model):
    """
    The container that is used to filter the source objects that are encrypted by using SSE-KMS. This parameter must be specified if the SourceSelectionCriteria parameter is specified in the data replication rule.
    """

    _attribute_map = { 
        'status': {'tag': 'xml', 'rename': 'Status', 'type': 'str'},
    }

    _xml_map = {
        'name': 'SseKmsEncryptedObjects'
    }

    def __init__(
        self,
        status: Optional[Union[str, StatusType]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            status (str | StatusType, optional): Specifies whether to replicate objects that are encrypted by using SSE-KMS. Valid values:*   Enabled*   Disabled
        """
        super().__init__(**kwargs)
        self.status = status


class ReplicationEncryptionConfiguration(serde.Model):
    """
    
    """

    _attribute_map = { 
        'replica_kms_key_id': {'tag': 'xml', 'rename': 'ReplicaKmsKeyID', 'type': 'str'},
    }

    _xml_map = {
        'name': 'EncryptionConfiguration'
    }

    def __init__(
        self,
        replica_kms_key_id: Optional[str] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            replica_kms_key_id (str, optional):
        """
        super().__init__(**kwargs)
        self.replica_kms_key_id = replica_kms_key_id


class LocationTransferTypeConstraint(serde.Model):
    """
    The container that stores regions in which the destination bucket can be located with TransferType specified.
    """

    _attribute_map = { 
        'location_transfer_types': {'tag': 'xml', 'rename': 'LocationTransferType', 'type': '[LocationTransferType]'},
    }

    _xml_map = {
        'name': 'LocationTransferTypeConstraint'
    }

    _dependency_map = { 
        'LocationTransferType': {'new': lambda: LocationTransferType()},
    }

    def __init__(
        self,
        location_transfer_types: Optional[List[LocationTransferType]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            location_transfer_types (List[LocationTransferType], optional): The container that stores regions in which the destination bucket can be located with the TransferType information.
        """
        super().__init__(**kwargs)
        self.location_transfer_types = location_transfer_types


class RtcConfiguration(serde.Model):
    """
    The container that stores Replication Time Control (RTC) configurations.
    """

    _attribute_map = { 
        'rtc': {'tag': 'xml', 'rename': 'RTC', 'type': 'RTC'},
        'id': {'tag': 'xml', 'rename': 'ID', 'type': 'str'},
    }

    _xml_map = {
        'name': 'RtcConfiguration'
    }

    _dependency_map = { 
        'RTC': {'new': lambda: ReplicationTimeControl()},
    }

    def __init__(
        self,
        rtc: Optional[ReplicationTimeControl] = None,
        id: Optional[str] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            rtc (RTC, optional): The container that stores the status of RTC.
            id (str, optional): The ID of the data replication rule for which you want to configure RTC.
        """
        super().__init__(**kwargs)
        self.rtc = rtc
        self.id = id


class ReplicationProgressRule(serde.Model):
    """
    Information about the progress of the data replication task.
    """

    _attribute_map = {
        'historical_object_replication': {'tag': 'xml', 'rename': 'HistoricalObjectReplication', 'type': 'str'},
        'progress': {'tag': 'xml', 'rename': 'Progress', 'type': 'Progress'},
        'id': {'tag': 'xml', 'rename': 'ID', 'type': 'str'},
        'prefix_set': {'tag': 'xml', 'rename': 'PrefixSet', 'type': 'ReplicationPrefixSet'},
        'action': {'tag': 'xml', 'rename': 'Action', 'type': 'str'},
        'destination': {'tag': 'xml', 'rename': 'Destination', 'type': 'ReplicationDestination'},
        'status': {'tag': 'xml', 'rename': 'Status', 'type': 'str'},
    }

    _xml_map = {
        'name': 'ReplicationProgressRule'
    }

    _dependency_map = {
        'Progress': {'new': lambda: ReplicationProgressInformation()},
        'PrefixSet': {'new': lambda: ReplicationPrefixSet()},
        'Destination': {'new': lambda: ReplicationDestination()},
    }

    def __init__(
        self,
        historical_object_replication: Optional[str] = None,
        progress: Optional[ReplicationProgressInformation] = None,
        id: Optional[str] = None,
        prefix_set: Optional[ReplicationPrefixSet] = None,
        action: Optional[str] = None,
        destination: Optional[ReplicationDestination] = None,
        status: Optional[str] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            historical_object_replication (str, optional): Specifies whether to replicate historical data that exists before data replication is enabled from the source bucket to the destination bucket.*   enabled (default): replicates historical data to the destination bucket.*   disabled: ignores historical data and replicates only data uploaded to the source bucket after data replication is enabled for the source bucket.
            progress (Progress, optional): The container that stores the progress of the data replication task. This parameter is returned only when the data replication task is in the doing state.
            id (str, optional): The ID of the data replication rule.
            prefix_set (ReplicationPrefixSet, optional): The container that stores prefixes. You can specify up to 10 prefixes in each data replication rule.
            action (str, optional): The operations that are synchronized to the destination bucket.*   ALL: PUT, DELETE, and ABORT operations are synchronized to the destination bucket.*   PUT: Write operations are synchronized to the destination bucket, including PutObject, PostObject, AppendObject, CopyObject, PutObjectACL, InitiateMultipartUpload, UploadPart, UploadPartCopy, and CompleteMultipartUpload.
            destination (ReplicationDestination, optional): The container that stores the information about the destination bucket.
            status (str, optional): The status of the data replication task. Valid values:*   starting: OSS creates a data replication task after a data replication rule is configured.*   doing: The replication rule is effective and the replication task is in progress.*   closing: OSS clears a data replication task after the corresponding data replication rule is deleted.
        """
        super().__init__(**kwargs)
        self.historical_object_replication = historical_object_replication
        self.progress = progress
        self.id = id
        self.prefix_set = prefix_set
        self.action = action
        self.destination = destination
        self.status = status


class ReplicationSourceSelectionCriteria(serde.Model):
    """
    The container that specifies other conditions used to filter the source objects that you want to replicate. Filter conditions can be specified only for source objects encrypted by using SSE-KMS.
    """

    _attribute_map = {
        'sse_kms_encrypted_objects': {'tag': 'xml', 'rename': 'SseKmsEncryptedObjects', 'type': 'SseKmsEncryptedObjects'},
    }

    _xml_map = {
        'name': 'SourceSelectionCriteria'
    }

    _dependency_map = {
        'SseKmsEncryptedObjects': {'new': lambda: SseKmsEncryptedObjects()},
    }

    def __init__(
        self,
        sse_kms_encrypted_objects: Optional[SseKmsEncryptedObjects] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            sse_kms_encrypted_objects (SseKmsEncryptedObjects, optional): The container that is used to filter the source objects that are encrypted by using SSE-KMS. This parameter must be specified if the SourceSelectionCriteria parameter is specified in the data replication rule.
        """
        super().__init__(**kwargs)
        self.sse_kms_encrypted_objects = sse_kms_encrypted_objects


class ReplicationRule(serde.Model):
    """
    The data replication rule configuration.
    """

    _attribute_map = {
        'source_selection_criteria': {'tag': 'xml', 'rename': 'SourceSelectionCriteria', 'type': 'ReplicationSourceSelectionCriteria'},
        'rtc': {'tag': 'xml', 'rename': 'RTC', 'type': 'RTC'},
        'destination': {'tag': 'xml', 'rename': 'Destination', 'type': 'ReplicationDestination'},
        'historical_object_replication': {'tag': 'xml', 'rename': 'HistoricalObjectReplication', 'type': 'str'},
        'sync_role': {'tag': 'xml', 'rename': 'SyncRole', 'type': 'str'},
        'status': {'tag': 'xml', 'rename': 'Status', 'type': 'str'},
        'encryption_configuration': {'tag': 'xml', 'rename': 'EncryptionConfiguration', 'type': 'ReplicationEncryptionConfiguration'},
        'id': {'tag': 'xml', 'rename': 'ID', 'type': 'str'},
        'prefix_set': {'tag': 'xml', 'rename': 'PrefixSet', 'type': 'ReplicationPrefixSet'},
        'action': {'tag': 'xml', 'rename': 'Action', 'type': 'str'},
    }

    _xml_map = {
        'name': 'Rule'
    }

    _dependency_map = {
        'SourceSelectionCriteria': {'new': lambda: ReplicationSourceSelectionCriteria()},
        'RTC': {'new': lambda: ReplicationTimeControl()},
        'Destination': {'new': lambda: ReplicationDestination()},
        'EncryptionConfiguration': {'new': lambda: ReplicationEncryptionConfiguration()},
        'PrefixSet': {'new': lambda: ReplicationPrefixSet()},
    }

    def __init__(
        self,
        source_selection_criteria: Optional[ReplicationSourceSelectionCriteria] = None,
        rtc: Optional[ReplicationTimeControl] = None,
        destination: Optional[ReplicationDestination] = None,
        historical_object_replication: Optional[Union[str, HistoricalObjectReplicationType]] = None,
        sync_role: Optional[str] = None,
        status: Optional[str] = None,
        encryption_configuration: Optional[ReplicationEncryptionConfiguration] = None,
        id: Optional[str] = None,
        prefix_set: Optional[ReplicationPrefixSet] = None,
        action: Optional[str] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            source_selection_criteria (ReplicationSourceSelectionCriteria, optional): The container that specifies other conditions used to filter the source objects that you want to replicate. Filter conditions can be specified only for source objects encrypted by using SSE-KMS.
            rtc (RTC, optional): The container that stores the status of the RTC feature.
            destination (ReplicationDestination, optional): The container that stores the information about the destination bucket.
            historical_object_replication (str | HistoricalObjectReplicationType, optional): Specifies whether to replicate historical data that exists before data replication is enabled from the source bucket to the destination bucket. Valid values:*   enabled (default): replicates historical data to the destination bucket.*   disabled: does not replicate historical data to the destination bucket. Only data uploaded to the source bucket after data replication is enabled for the source bucket is replicated.
            sync_role (str, optional): The role that you want to authorize OSS to use to replicate data. If you want to use SSE-KMS to encrypt the objects that are replicated to the destination bucket, you must specify this parameter.
            status (str, optional): The status of the data replication task. Valid values:*   starting: OSS creates a data replication task after a data replication rule is configured.*   doing: The replication rule is effective and the replication task is in progress.*   closing: OSS clears a data replication task after the corresponding data replication rule is deleted.
            encryption_configuration (ReplicationEncryptionConfiguration, optional): The encryption configuration for the objects replicated to the destination bucket. If the Status parameter is set to Enabled, you must specify this parameter.
            id (str, optional): The ID of the rule.
            prefix_set (ReplicationPrefixSet, optional): The container that stores prefixes. You can specify up to 10 prefixes in each data replication rule.
            action (str, optional): The operations that can be synchronized to the destination bucket. If you configure Action in a data replication rule, OSS synchronizes new data and historical data based on the specified value of Action. You can set Action to one or more of the following operation types. Valid values:*   ALL (default): PUT, DELETE, and ABORT operations are synchronized to the destination bucket.*   PUT: Write operations are synchronized to the destination bucket, including PutObject, PostObject, AppendObject, CopyObject, PutObjectACL, InitiateMultipartUpload, UploadPart, UploadPartCopy, and CompleteMultipartUpload.
        """
        super().__init__(**kwargs)
        self.source_selection_criteria = source_selection_criteria
        self.rtc = rtc
        self.destination = destination
        self.historical_object_replication = historical_object_replication
        self.sync_role = sync_role
        self.status = status
        self.encryption_configuration = encryption_configuration
        self.id = id
        self.prefix_set = prefix_set
        self.action = action


class ReplicationConfiguration(serde.Model):
    """
    The container that stores data replication configurations.
    """

    _attribute_map = { 
        'rules': {'tag': 'xml', 'rename': 'Rule', 'type': '[ReplicationRule]'},
    }

    _xml_map = {
        'name': 'ReplicationConfiguration'
    }

    _dependency_map = { 
        'Rule': {'new': lambda: ReplicationRule()},
    }

    def __init__(
        self,
        rules: Optional[List[ReplicationRule]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            rules (List[ReplicationRule], optional): The container that stores the data replication rules.
        """
        super().__init__(**kwargs)
        self.rules = rules


class ReplicationProgress(serde.Model):
    """
    The container that is used to store the progress of data replication tasks.
    """

    _attribute_map = { 
        'rules': {'tag': 'xml', 'rename': 'Rule', 'type': '[ReplicationProgressRule]'},
    }

    _xml_map = {
        'name': 'ReplicationProgress'
    }

    _dependency_map = { 
        'ReplicationProgressRule': {'new': lambda: ReplicationProgressRule()},
    }

    def __init__(
        self,
        rules: Optional[List[ReplicationProgressRule]] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            rules (List[ReplicationProgressRule], optional): The container that stores the progress of the data replication task corresponding to each data replication rule.
        """
        super().__init__(**kwargs)
        self.rules = rules


class ReplicationLocation(serde.Model):
    """
    The container that stores the region in which the destination bucket can be located.
    """

    _attribute_map = { 
        'locations': {'tag': 'xml', 'rename': 'Location', 'type': '[str]'},
        'location_transfer_type_constraint': {'tag': 'xml', 'rename': 'LocationTransferTypeConstraint', 'type': 'LocationTransferTypeConstraint'},
        'locationrtc_constraint': {'tag': 'xml', 'rename': 'LocationRTCConstraint', 'type': 'LocationRTCConstraint'},
    }

    _xml_map = {
        'name': 'ReplicationLocation'
    }

    _dependency_map = { 
        'LocationTransferTypeConstraint': {'new': lambda: LocationTransferTypeConstraint()},
        'LocationRTCConstraint': {'new': lambda: LocationRTCConstraint()},
    }

    def __init__(
        self,
        locations: Optional[List[str]] = None,
        location_transfer_type_constraint: Optional[LocationTransferTypeConstraint] = None,
        locationrtc_constraint: Optional[LocationRTCConstraint] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            locations (List[str], optional): The regions in which the destination bucket can be located.
            location_transfer_type_constraint (LocationTransferTypeConstraint, optional): The container that stores regions in which the destination bucket can be located with TransferType specified.
            locationrtc_constraint (LocationRTCConstraint, optional): The container that stores regions in which the RTC can be enabled.
        """
        super().__init__(**kwargs)
        self.locations = locations
        self.location_transfer_type_constraint = location_transfer_type_constraint
        self.locationrtc_constraint = locationrtc_constraint


class PutBucketRtcRequest(serde.RequestModel):
    """
    The request for the PutBucketRtc operation.
    """

    _attribute_map = { 
        'bucket': {'tag': 'input', 'position': 'host', 'rename': 'bucket', 'type': 'str', 'required': True},
        'rtc_configuration': {'tag': 'input', 'position': 'body', 'rename': 'ReplicationRule', 'type': 'xml'},
    }

    def __init__(
        self,
        bucket: str = None,
        rtc_configuration: Optional[RtcConfiguration] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            bucket (str, required): The name of the bucket.
            rtc_configuration (RtcConfiguration, optional): The container of the request body.
        """
        super().__init__(**kwargs)
        self.bucket = bucket
        self.rtc_configuration = rtc_configuration


class PutBucketRtcResult(serde.ResultModel):
    """
    The request for the PutBucketRtc operation.
    """

class PutBucketReplicationRequest(serde.RequestModel):
    """
    The request for the PutBucketReplication operation.
    """

    _attribute_map = { 
        'bucket': {'tag': 'input', 'position': 'host', 'rename': 'bucket', 'type': 'str', 'required': True},
        'replication_configuration': {'tag': 'input', 'position': 'body', 'rename': 'ReplicationConfiguration', 'type': 'xml'},
    }

    def __init__(
        self,
        bucket: str = None,
        replication_configuration: Optional[ReplicationConfiguration] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            bucket (str, required): The name of the bucket.
            replication_configuration (ReplicationConfiguration, optional): The container of the request body.
        """
        super().__init__(**kwargs)
        self.bucket = bucket
        self.replication_configuration = replication_configuration


class PutBucketReplicationResult(serde.ResultModel):
    """
    The request for the PutBucketReplication operation.
    """

    _attribute_map = { 
        'replication_rule_id': {'tag': 'output', 'position': 'header', 'rename': 'x-oss-replication-rule-id', 'type': 'str'},
    }

    def __init__(
        self,
        replication_rule_id: Optional[str] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            replication_rule_id (str, optional): <no value>
        """
        super().__init__(**kwargs)
        self.replication_rule_id = replication_rule_id

class GetBucketReplicationRequest(serde.RequestModel):
    """
    The request for the GetBucketReplication operation.
    """

    _attribute_map = { 
        'bucket': {'tag': 'input', 'position': 'host', 'rename': 'bucket', 'type': 'str', 'required': True},
    }

    def __init__(
        self,
        bucket: str = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            bucket (str, required): The name of the bucket.
        """
        super().__init__(**kwargs)
        self.bucket = bucket


class GetBucketReplicationResult(serde.ResultModel):
    """
    The request for the GetBucketReplication operation.
    """

    _attribute_map = { 
        'replication_configuration': {'tag': 'output', 'position': 'body', 'rename': 'ReplicationConfiguration', 'type': 'ReplicationConfiguration,xml'},
    }

    _dependency_map = { 
        'ReplicationConfiguration': {'new': lambda: ReplicationConfiguration()},
    }

    def __init__(
        self,
        replication_configuration: Optional[ReplicationConfiguration] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            replication_configuration (ReplicationConfiguration, optional): The container that stores data replication configurations.
        """
        super().__init__(**kwargs)
        self.replication_configuration = replication_configuration

class GetBucketReplicationLocationRequest(serde.RequestModel):
    """
    The request for the GetBucketReplicationLocation operation.
    """

    _attribute_map = { 
        'bucket': {'tag': 'input', 'position': 'host', 'rename': 'bucket', 'type': 'str', 'required': True},
    }

    def __init__(
        self,
        bucket: str = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            bucket (str, required): The name of the bucket.
        """
        super().__init__(**kwargs)
        self.bucket = bucket


class GetBucketReplicationLocationResult(serde.ResultModel):
    """
    The request for the GetBucketReplicationLocation operation.
    """

    _attribute_map = { 
        'replication_location': {'tag': 'output', 'position': 'body', 'rename': 'ReplicationLocation', 'type': 'ReplicationLocation,xml'},
    }

    _dependency_map = { 
        'ReplicationLocation': {'new': lambda: ReplicationLocation()},
    }

    def __init__(
        self,
        replication_location: Optional[ReplicationLocation] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            replication_location (ReplicationLocation, optional): The container that stores the region in which the destination bucket can be located.
        """
        super().__init__(**kwargs)
        self.replication_location = replication_location

class GetBucketReplicationProgressRequest(serde.RequestModel):
    """
    The request for the GetBucketReplicationProgress operation.
    """

    _attribute_map = { 
        'bucket': {'tag': 'input', 'position': 'host', 'rename': 'bucket', 'type': 'str', 'required': True},
        'rule_id': {'tag': 'input', 'position': 'query', 'rename': 'rule-id', 'type': 'str', 'required': True},
    }

    def __init__(
        self,
        bucket: str = None,
        rule_id: str = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            bucket (str, required): The name of the bucket.
            rule_id (str, required): The ID of the data replication rule. You can call the GetBucketReplication operation to query the ID.
        """
        super().__init__(**kwargs)
        self.bucket = bucket
        self.rule_id = rule_id


class GetBucketReplicationProgressResult(serde.ResultModel):
    """
    The request for the GetBucketReplicationProgress operation.
    """

    _attribute_map = { 
        'replication_progress': {'tag': 'output', 'position': 'body', 'rename': 'ReplicationProgress', 'type': 'ReplicationProgress,xml'},
    }

    _dependency_map = { 
        'ReplicationProgress': {'new': lambda: ReplicationProgress()},
    }

    def __init__(
        self,
        replication_progress: Optional[ReplicationProgress] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            replication_progress (ReplicationProgress, optional): The container that is used to store the progress of data replication tasks.
        """
        super().__init__(**kwargs)
        self.replication_progress = replication_progress

class DeleteBucketReplicationRequest(serde.RequestModel):
    """
    The request for the DeleteBucketReplication operation.
    """

    _attribute_map = { 
        'bucket': {'tag': 'input', 'position': 'host', 'rename': 'bucket', 'type': 'str', 'required': True},
        'replication_rules': {'tag': 'input', 'position': 'body', 'rename': 'ReplicationRules', 'type': 'xml'},
    }

    def __init__(
        self,
        bucket: str = None,
        replication_rules: Optional[ReplicationRules] = None,
        **kwargs: Any
    ) -> None:
        """
        Args:
            bucket (str, required): The name of the bucket.
            replication_rules (ReplicationRules, optional): The container of the request body.
        """
        super().__init__(**kwargs)
        self.bucket = bucket
        self.replication_rules = replication_rules


class DeleteBucketReplicationResult(serde.ResultModel):
    """
    The request for the DeleteBucketReplication operation.
    """
