# pylint: disable=line-too-long,useless-suppression,too-many-lines
# coding=utf-8
# --------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# Code generated by Microsoft (R) Python Code Generator.
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
# --------------------------------------------------------------------------
# pylint: disable=useless-super-delegation

import datetime
from typing import Any, Literal, Mapping, Optional, TYPE_CHECKING, Union, overload

from .._utils.model_base import Model as _Model, rest_discriminator, rest_field
from ._enums import BackupEngineType, ProtectableContainerType, ProtectionIntentItemType

if TYPE_CHECKING:
    from .. import models as _models


class ArmErrorDetail(_Model):
    """The error detail.

    :ivar code: The error code.
    :vartype code: str
    :ivar message: The error message.
    :vartype message: str
    :ivar target: The error target.
    :vartype target: str
    :ivar details: The error details.
    :vartype details: list[~azure.mgmt.recoveryservicesbackup.models.ArmErrorDetail]
    :ivar additional_info: The error additional info.
    :vartype additional_info: list[~azure.mgmt.recoveryservicesbackup.models.ErrorAdditionalInfo]
    """

    code: Optional[str] = rest_field(visibility=["read"])
    """The error code."""
    message: Optional[str] = rest_field(visibility=["read"])
    """The error message."""
    target: Optional[str] = rest_field(visibility=["read"])
    """The error target."""
    details: Optional[list["_models.ArmErrorDetail"]] = rest_field(visibility=["read"])
    """The error details."""
    additional_info: Optional[list["_models.ErrorAdditionalInfo"]] = rest_field(
        name="additionalInfo", visibility=["read"]
    )
    """The error additional info."""


class FeatureSupportRequest(_Model):
    """Base class for feature request.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureBackupGoalFeatureSupportRequest, AzureVMResourceFeatureSupportRequest

    :ivar feature_type: backup support feature type. Required. Default value is None.
    :vartype feature_type: str
    """

    __mapping__: dict[str, _Model] = {}
    feature_type: str = rest_discriminator(
        name="featureType", visibility=["read", "create", "update", "delete", "query"]
    )
    """backup support feature type. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        feature_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureBackupGoalFeatureSupportRequest(FeatureSupportRequest, discriminator="AzureBackupGoals"):
    """Azure backup goal feature specific request.

    :ivar feature_type: backup support feature type. Required. Default value is "AzureBackupGoals".
    :vartype feature_type: str
    """

    feature_type: Literal["AzureBackupGoals"] = rest_discriminator(name="featureType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup support feature type. Required. Default value is \"AzureBackupGoals\"."""

    @overload
    def __init__(
        self,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.feature_type = "AzureBackupGoals"  # type: ignore


class ProtectionContainer(_Model):
    """Base class for container with backup items. Containers with specific workloads are derived from
    this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureBackupServerContainer, AzureSqlContainer, AzureWorkloadContainer, DpmContainer,
    GenericContainer, IaaSVMContainer, AzureIaaSClassicComputeVMContainer,
    AzureIaaSComputeVMContainer, AzureSQLAGWorkloadContainerProtectionContainer,
    AzureStorageContainer, AzureVMAppContainerProtectionContainer, MabContainer

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. Known values are: "Invalid", "Unknown",
     "IaasVMContainer", "IaasVMServiceContainer", "DPMContainer", "AzureBackupServerContainer",
     "MABContainer", "Cluster", "AzureSqlContainer", "Windows", "VCenter", "VMAppContainer",
     "SQLAGWorkLoadContainer", "StorageContainer", "GenericContainer",
     "Microsoft.ClassicCompute/virtualMachines", "Microsoft.Compute/virtualMachines", and
     "AzureWorkloadContainer".
    :vartype container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectableContainerType
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the container."""
    backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = rest_field(
        name="backupManagementType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup management for the container. Known values are: \"Invalid\", \"AzureIaasVM\",
     \"MAB\", \"DPM\", \"AzureBackupServer\", \"AzureSql\", \"AzureStorage\", \"AzureWorkload\", and
     \"DefaultBackup\"."""
    registration_status: Optional[str] = rest_field(
        name="registrationStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Status of registration of the container with the Recovery Services Vault."""
    health_status: Optional[str] = rest_field(
        name="healthStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Status of health of the container."""
    container_type: str = rest_discriminator(
        name="containerType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. Known values are: \"Invalid\", \"Unknown\",
     \"IaasVMContainer\", \"IaasVMServiceContainer\", \"DPMContainer\",
     \"AzureBackupServerContainer\", \"MABContainer\", \"Cluster\", \"AzureSqlContainer\",
     \"Windows\", \"VCenter\", \"VMAppContainer\", \"SQLAGWorkLoadContainer\", \"StorageContainer\",
     \"GenericContainer\", \"Microsoft.ClassicCompute/virtualMachines\",
     \"Microsoft.Compute/virtualMachines\", and \"AzureWorkloadContainer\"."""
    protectable_object_type: Optional[str] = rest_field(
        name="protectableObjectType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the protectable object associated with this container."""

    @overload
    def __init__(
        self,
        *,
        container_type: str,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DpmContainer(ProtectionContainer, discriminator="DPMContainer"):
    """DPM workload-specific protection container.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureBackupServerContainer

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. DPM_CONTAINER.
    :vartype container_type: str or ~azure.mgmt.recoveryservicesbackup.models.DPM_CONTAINER
    :ivar can_re_register: Specifies whether the container is re-registrable.
    :vartype can_re_register: bool
    :ivar container_id: ID of container.
    :vartype container_id: str
    :ivar protected_item_count: Number of protected items in the BackupEngine.
    :vartype protected_item_count: int
    :ivar dpm_agent_version: Backup engine Agent version.
    :vartype dpm_agent_version: str
    :ivar dpm_servers: List of BackupEngines protecting the container.
    :vartype dpm_servers: list[str]
    :ivar upgrade_available: To check if upgrade available.
    :vartype upgrade_available: bool
    :ivar protection_status: Protection status of the container.
    :vartype protection_status: str
    :ivar extended_info: Extended Info of the container.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.DPMContainerExtendedInfo
    """

    __mapping__: dict[str, _Model] = {}
    container_type: Literal[ProtectableContainerType.DPM_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. DPM_CONTAINER."""
    can_re_register: Optional[bool] = rest_field(
        name="canReRegister", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies whether the container is re-registrable."""
    container_id: Optional[str] = rest_field(
        name="containerId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ID of container."""
    protected_item_count: Optional[int] = rest_field(
        name="protectedItemCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of protected items in the BackupEngine."""
    dpm_agent_version: Optional[str] = rest_field(
        name="dpmAgentVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup engine Agent version."""
    dpm_servers: Optional[list[str]] = rest_field(
        name="dpmServers", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of BackupEngines protecting the container."""
    upgrade_available: Optional[bool] = rest_field(
        name="upgradeAvailable", visibility=["read", "create", "update", "delete", "query"]
    )
    """To check if upgrade available."""
    protection_status: Optional[str] = rest_field(
        name="protectionStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protection status of the container."""
    extended_info: Optional["_models.DPMContainerExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Extended Info of the container."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        can_re_register: Optional[bool] = None,
        container_id: Optional[str] = None,
        protected_item_count: Optional[int] = None,
        dpm_agent_version: Optional[str] = None,
        dpm_servers: Optional[list[str]] = None,
        upgrade_available: Optional[bool] = None,
        protection_status: Optional[str] = None,
        extended_info: Optional["_models.DPMContainerExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.DPM_CONTAINER  # type: ignore


class AzureBackupServerContainer(DpmContainer, discriminator="AzureBackupServerContainer"):
    """AzureBackupServer (DPMVenus) workload-specific protection container.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar can_re_register: Specifies whether the container is re-registrable.
    :vartype can_re_register: bool
    :ivar container_id: ID of container.
    :vartype container_id: str
    :ivar protected_item_count: Number of protected items in the BackupEngine.
    :vartype protected_item_count: int
    :ivar dpm_agent_version: Backup engine Agent version.
    :vartype dpm_agent_version: str
    :ivar dpm_servers: List of BackupEngines protecting the container.
    :vartype dpm_servers: list[str]
    :ivar upgrade_available: To check if upgrade available.
    :vartype upgrade_available: bool
    :ivar protection_status: Protection status of the container.
    :vartype protection_status: str
    :ivar extended_info: Extended Info of the container.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.DPMContainerExtendedInfo
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. AZURE_BACKUP_SERVER_CONTAINER.
    :vartype container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.AZURE_BACKUP_SERVER_CONTAINER
    """

    container_type: Literal[ProtectableContainerType.AZURE_BACKUP_SERVER_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. AZURE_BACKUP_SERVER_CONTAINER."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        can_re_register: Optional[bool] = None,
        container_id: Optional[str] = None,
        protected_item_count: Optional[int] = None,
        dpm_agent_version: Optional[str] = None,
        dpm_servers: Optional[list[str]] = None,
        upgrade_available: Optional[bool] = None,
        protection_status: Optional[str] = None,
        extended_info: Optional["_models.DPMContainerExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.AZURE_BACKUP_SERVER_CONTAINER  # type: ignore


class BackupEngineBase(_Model):
    """The base backup engine class. All workload specific backup engines derive from this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureBackupServerEngine, DpmBackupEngine

    :ivar friendly_name: Friendly name of the backup engine.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the backup engine. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Registration status of the backup engine with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar backup_engine_state: Status of the backup engine with the Recovery Services Vault. =
     {Active/Deleting/DeleteFailed}.
    :vartype backup_engine_state: str
    :ivar health_status: Backup status of the backup engine.
    :vartype health_status: str
    :ivar backup_engine_type: Type of the backup engine. Required. Known values are: "Invalid",
     "DpmBackupEngine", and "AzureBackupServerEngine".
    :vartype backup_engine_type: str or ~azure.mgmt.recoveryservicesbackup.models.BackupEngineType
    :ivar can_re_register: Flag indicating if the backup engine be registered, once already
     registered.
    :vartype can_re_register: bool
    :ivar backup_engine_id: ID of the backup engine.
    :vartype backup_engine_id: str
    :ivar dpm_version: Backup engine version.
    :vartype dpm_version: str
    :ivar azure_backup_agent_version: Backup agent version.
    :vartype azure_backup_agent_version: str
    :ivar is_azure_backup_agent_upgrade_available: To check if backup agent upgrade available.
    :vartype is_azure_backup_agent_upgrade_available: bool
    :ivar is_dpm_upgrade_available: To check if backup engine upgrade available.
    :vartype is_dpm_upgrade_available: bool
    :ivar extended_info: Extended info of the backupengine.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.BackupEngineExtendedInfo
    """

    __mapping__: dict[str, _Model] = {}
    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the backup engine."""
    backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = rest_field(
        name="backupManagementType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup management for the backup engine. Known values are: \"Invalid\",
     \"AzureIaasVM\", \"MAB\", \"DPM\", \"AzureBackupServer\", \"AzureSql\", \"AzureStorage\",
     \"AzureWorkload\", and \"DefaultBackup\"."""
    registration_status: Optional[str] = rest_field(
        name="registrationStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Registration status of the backup engine with the Recovery Services Vault."""
    backup_engine_state: Optional[str] = rest_field(
        name="backupEngineState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Status of the backup engine with the Recovery Services Vault. = {Active/Deleting/DeleteFailed}."""
    health_status: Optional[str] = rest_field(
        name="healthStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup status of the backup engine."""
    backup_engine_type: str = rest_discriminator(
        name="backupEngineType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the backup engine. Required. Known values are: \"Invalid\", \"DpmBackupEngine\", and
     \"AzureBackupServerEngine\"."""
    can_re_register: Optional[bool] = rest_field(
        name="canReRegister", visibility=["read", "create", "update", "delete", "query"]
    )
    """Flag indicating if the backup engine be registered, once already registered."""
    backup_engine_id: Optional[str] = rest_field(
        name="backupEngineId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ID of the backup engine."""
    dpm_version: Optional[str] = rest_field(
        name="dpmVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup engine version."""
    azure_backup_agent_version: Optional[str] = rest_field(
        name="azureBackupAgentVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup agent version."""
    is_azure_backup_agent_upgrade_available: Optional[bool] = rest_field(
        name="isAzureBackupAgentUpgradeAvailable", visibility=["read", "create", "update", "delete", "query"]
    )
    """To check if backup agent upgrade available."""
    is_dpm_upgrade_available: Optional[bool] = rest_field(
        name="isDpmUpgradeAvailable", visibility=["read", "create", "update", "delete", "query"]
    )
    """To check if backup engine upgrade available."""
    extended_info: Optional["_models.BackupEngineExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Extended info of the backupengine."""

    @overload
    def __init__(
        self,
        *,
        backup_engine_type: str,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        backup_engine_state: Optional[str] = None,
        health_status: Optional[str] = None,
        can_re_register: Optional[bool] = None,
        backup_engine_id: Optional[str] = None,
        dpm_version: Optional[str] = None,
        azure_backup_agent_version: Optional[str] = None,
        is_azure_backup_agent_upgrade_available: Optional[bool] = None,
        is_dpm_upgrade_available: Optional[bool] = None,
        extended_info: Optional["_models.BackupEngineExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureBackupServerEngine(BackupEngineBase, discriminator="AzureBackupServerEngine"):
    """Backup engine type when Azure Backup Server is used to manage the backups.

    :ivar friendly_name: Friendly name of the backup engine.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the backup engine. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Registration status of the backup engine with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar backup_engine_state: Status of the backup engine with the Recovery Services Vault. =
     {Active/Deleting/DeleteFailed}.
    :vartype backup_engine_state: str
    :ivar health_status: Backup status of the backup engine.
    :vartype health_status: str
    :ivar can_re_register: Flag indicating if the backup engine be registered, once already
     registered.
    :vartype can_re_register: bool
    :ivar backup_engine_id: ID of the backup engine.
    :vartype backup_engine_id: str
    :ivar dpm_version: Backup engine version.
    :vartype dpm_version: str
    :ivar azure_backup_agent_version: Backup agent version.
    :vartype azure_backup_agent_version: str
    :ivar is_azure_backup_agent_upgrade_available: To check if backup agent upgrade available.
    :vartype is_azure_backup_agent_upgrade_available: bool
    :ivar is_dpm_upgrade_available: To check if backup engine upgrade available.
    :vartype is_dpm_upgrade_available: bool
    :ivar extended_info: Extended info of the backupengine.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.BackupEngineExtendedInfo
    :ivar backup_engine_type: Type of the backup engine. Required. AZURE_BACKUP_SERVER_ENGINE.
    :vartype backup_engine_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.AZURE_BACKUP_SERVER_ENGINE
    """

    backup_engine_type: Literal[BackupEngineType.AZURE_BACKUP_SERVER_ENGINE] = rest_discriminator(name="backupEngineType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup engine. Required. AZURE_BACKUP_SERVER_ENGINE."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        backup_engine_state: Optional[str] = None,
        health_status: Optional[str] = None,
        can_re_register: Optional[bool] = None,
        backup_engine_id: Optional[str] = None,
        dpm_version: Optional[str] = None,
        azure_backup_agent_version: Optional[str] = None,
        is_azure_backup_agent_upgrade_available: Optional[bool] = None,
        is_dpm_upgrade_available: Optional[bool] = None,
        extended_info: Optional["_models.BackupEngineExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.backup_engine_type = BackupEngineType.AZURE_BACKUP_SERVER_ENGINE  # type: ignore


class BackupRequest(_Model):
    """Base class for backup request. Workload-specific backup requests are derived from this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureFileShareBackupRequest, AzureWorkloadBackupRequest, IaasVMBackupRequest

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureFileShareBackupRequest(BackupRequest, discriminator="AzureFileShareBackupRequest"):
    """AzureFileShare workload-specific backup request.

    :ivar recovery_point_expiry_time_in_utc: Backup copy will expire after the time specified
     (UTC).
    :vartype recovery_point_expiry_time_in_utc: ~datetime.datetime
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureFileShareBackupRequest".
    :vartype object_type: str
    """

    recovery_point_expiry_time_in_utc: Optional[datetime.datetime] = rest_field(
        name="recoveryPointExpiryTimeInUTC",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """Backup copy will expire after the time specified (UTC)."""
    object_type: Literal["AzureFileShareBackupRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureFileShareBackupRequest\"."""

    @overload
    def __init__(
        self,
        *,
        recovery_point_expiry_time_in_utc: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureFileShareBackupRequest"  # type: ignore


class WorkloadProtectableItem(_Model):
    """Base class for backup item. Workload-specific backup items are derived from this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureFileShareProtectableItem, AzureVmWorkloadProtectableItem,
    AzureVmWorkloadSAPHanaHSRProtectableItem, AzureVmWorkloadSAPHanaScaleoutProtectableItem,
    IaaSVMProtectableItem, AzureIaaSClassicComputeVMProtectableItem,
    AzureIaaSComputeVMProtectableItem, AzureVmWorkloadSAPAseDatabaseProtectableItem,
    AzureVmWorkloadSAPAseSystemProtectableItem, AzureVmWorkloadSAPHanaDBInstance,
    AzureVmWorkloadSAPHanaDatabaseProtectableItem, AzureVmWorkloadSAPHanaSystemProtectableItem,
    AzureVmWorkloadSQLAvailabilityGroupProtectableItem, AzureVmWorkloadSQLDatabaseProtectableItem,
    AzureVmWorkloadSQLInstanceProtectableItem

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar protectable_item_type: Type of the backup item. Required. Default value is None.
    :vartype protectable_item_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    """

    __mapping__: dict[str, _Model] = {}
    backup_management_type: Optional[str] = rest_field(
        name="backupManagementType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup management to backup an item."""
    workload_type: Optional[str] = rest_field(
        name="workloadType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of workload for the backup management."""
    protectable_item_type: str = rest_discriminator(
        name="protectableItemType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the backup item. Required. Default value is None."""
    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the backup item."""
    protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """State of the back up item. Known values are: \"Invalid\", \"NotProtected\", \"Protecting\",
     \"Protected\", and \"ProtectionFailed\"."""

    @overload
    def __init__(
        self,
        *,
        protectable_item_type: str,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureFileShareProtectableItem(WorkloadProtectableItem, discriminator="AzureFileShare"):
    """Protectable item for Azure Fileshare workloads.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_container_fabric_id: Full Fabric ID of container to which this protectable item
     belongs. For example, ARM ID.
    :vartype parent_container_fabric_id: str
    :ivar parent_container_friendly_name: Friendly name of container to which this protectable item
     belongs.
    :vartype parent_container_friendly_name: str
    :ivar azure_file_share_type: File Share type XSync or XSMB. Known values are: "Invalid",
     "XSMB", and "XSync".
    :vartype azure_file_share_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.AzureFileShareType
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "AzureFileShare".
    :vartype protectable_item_type: str
    """

    parent_container_fabric_id: Optional[str] = rest_field(
        name="parentContainerFabricId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Full Fabric ID of container to which this protectable item belongs. For example, ARM ID."""
    parent_container_friendly_name: Optional[str] = rest_field(
        name="parentContainerFriendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of container to which this protectable item belongs."""
    azure_file_share_type: Optional[Union[str, "_models.AzureFileShareType"]] = rest_field(
        name="azureFileShareType", visibility=["read", "create", "update", "delete", "query"]
    )
    """File Share type XSync or XSMB. Known values are: \"Invalid\", \"XSMB\", and \"XSync\"."""
    protectable_item_type: Literal["AzureFileShare"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"AzureFileShare\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_container_fabric_id: Optional[str] = None,
        parent_container_friendly_name: Optional[str] = None,
        azure_file_share_type: Optional[Union[str, "_models.AzureFileShareType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "AzureFileShare"  # type: ignore


class ProtectedItem(_Model):
    """Base class for backup items.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureFileshareProtectedItem, AzureIaaSVMProtectedItem, AzureVmWorkloadProtectedItem,
    AzureVmWorkloadSAPAseDatabaseProtectedItem, AzureVmWorkloadSAPHanaDBInstanceProtectedItem,
    AzureVmWorkloadSAPHanaDatabaseProtectedItem, AzureVmWorkloadSQLDatabaseProtectedItem,
    AzureVmWorkloadSQLInstanceProtectedItem, DPMProtectedItem, GenericProtectedItem,
    MabFileFolderProtectedItem, AzureIaaSClassicComputeVMProtectedItem,
    AzureIaaSComputeVMProtectedItem, AzureSqlProtectedItem

    :ivar protected_item_type: backup item type. Required. Default value is None.
    :vartype protected_item_type: str
    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    """

    __mapping__: dict[str, _Model] = {}
    protected_item_type: str = rest_discriminator(
        name="protectedItemType", visibility=["read", "create", "update", "delete", "query"]
    )
    """backup item type. Required. Default value is None."""
    backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = rest_field(
        name="backupManagementType", visibility=["read"]
    )
    """Type of backup management for the backed up item. Known values are: \"Invalid\",
     \"AzureIaasVM\", \"MAB\", \"DPM\", \"AzureBackupServer\", \"AzureSql\", \"AzureStorage\",
     \"AzureWorkload\", and \"DefaultBackup\"."""
    workload_type: Optional[Union[str, "_models.DataSourceType"]] = rest_field(name="workloadType", visibility=["read"])
    """Type of workload this item represents. Known values are: \"Invalid\", \"VM\", \"FileFolder\",
     \"AzureSqlDb\", \"SQLDB\", \"Exchange\", \"Sharepoint\", \"VMwareVM\", \"SystemState\",
     \"Client\", \"GenericDataSource\", \"SQLDataBase\", \"AzureFileShare\", \"SAPHanaDatabase\",
     \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""
    container_name: Optional[str] = rest_field(
        name="containerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Unique name of container."""
    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ARM ID of the resource to be backed up."""
    policy_id: Optional[str] = rest_field(name="policyId", visibility=["read", "create", "update", "delete", "query"])
    """ID of the backup policy with which this item is backed up."""
    last_recovery_point: Optional[datetime.datetime] = rest_field(
        name="lastRecoveryPoint", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Timestamp when the last (latest) backup copy was created for this backup item."""
    backup_set_name: Optional[str] = rest_field(
        name="backupSetName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of the backup set the backup item belongs to."""
    create_mode: Optional[Union[str, "_models.CreateMode"]] = rest_field(
        name="createMode", visibility=["read", "create", "update", "delete", "query"]
    )
    """Create mode to indicate recovery of existing soft deleted data source or creation of new data
     source. Known values are: \"Invalid\", \"Default\", and \"Recover\"."""
    deferred_delete_time_in_utc: Optional[datetime.datetime] = rest_field(
        name="deferredDeleteTimeInUTC", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Time for deferred deletion in UTC."""
    is_scheduled_for_deferred_delete: Optional[bool] = rest_field(
        name="isScheduledForDeferredDelete", visibility=["read", "create", "update", "delete", "query"]
    )
    """Flag to identify whether the DS is scheduled for deferred delete."""
    deferred_delete_time_remaining: Optional[str] = rest_field(
        name="deferredDeleteTimeRemaining", visibility=["read", "create", "update", "delete", "query"]
    )
    """Time remaining before the DS marked for deferred delete is permanently deleted."""
    is_deferred_delete_schedule_upcoming: Optional[bool] = rest_field(
        name="isDeferredDeleteScheduleUpcoming", visibility=["read", "create", "update", "delete", "query"]
    )
    """Flag to identify whether the deferred deleted DS is to be purged soon."""
    is_rehydrate: Optional[bool] = rest_field(
        name="isRehydrate", visibility=["read", "create", "update", "delete", "query"]
    )
    """Flag to identify that deferred deleted DS is to be moved into Pause state."""
    resource_guard_operation_requests: Optional[list[str]] = rest_field(
        name="resourceGuardOperationRequests", visibility=["read", "create", "update", "delete", "query"]
    )
    """ResourceGuardOperationRequests on which LAC check will be performed."""
    is_archive_enabled: Optional[bool] = rest_field(
        name="isArchiveEnabled", visibility=["read", "create", "update", "delete", "query"]
    )
    """Flag to identify whether datasource is protected in archive."""
    policy_name: Optional[str] = rest_field(
        name="policyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of the policy used for protection."""
    soft_delete_retention_period_in_days: Optional[int] = rest_field(
        name="softDeleteRetentionPeriodInDays", visibility=["read", "create", "update", "delete", "query"]
    )
    """Soft delete retention period in days."""
    vault_id: Optional[str] = rest_field(name="vaultId", visibility=["read"])
    """ID of the vault which protects this item."""
    source_side_scan_info: Optional["_models.SourceSideScanInfo"] = rest_field(
        name="sourceSideScanInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source side threat information."""

    @overload
    def __init__(
        self,
        *,
        protected_item_type: str,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureFileshareProtectedItem(ProtectedItem, discriminator="AzureFileShareProtectedItem"):
    """Azure File Share workload-specific backup item.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the fileshare represented by this backup item.
    :vartype friendly_name: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar last_backup_status: Last backup operation status. Possible values: Healthy, Unhealthy.
    :vartype last_backup_status: str
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar extended_info: Additional information with this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureFileshareProtectedItemExtendedInfo
    :ivar protected_item_type: backup item type. Required. Default value is
     "AzureFileShareProtectedItem".
    :vartype protected_item_type: str
    """

    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the fileshare represented by this backup item."""
    protection_status: Optional[str] = rest_field(
        name="protectionStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup status of this backup item."""
    protection_state: Optional[Union[str, "_models.ProtectionState"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup state of this backup item. Known values are: \"Invalid\", \"IRPending\", \"Protected\",
     \"ProtectionError\", \"ProtectionStopped\", \"ProtectionPaused\", and \"BackupsSuspended\"."""
    last_backup_status: Optional[str] = rest_field(
        name="lastBackupStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Last backup operation status. Possible values: Healthy, Unhealthy."""
    last_backup_time: Optional[datetime.datetime] = rest_field(
        name="lastBackupTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Timestamp of the last backup operation on this backup item."""
    kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = rest_field(
        name="kpisHealths", visibility=["read", "create", "update", "delete", "query"]
    )
    """Health details of different KPIs."""
    extended_info: Optional["_models.AzureFileshareProtectedItemExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information with this backup item."""
    protected_item_type: Literal["AzureFileShareProtectedItem"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"AzureFileShareProtectedItem\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        friendly_name: Optional[str] = None,
        protection_status: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        last_backup_status: Optional[str] = None,
        last_backup_time: Optional[datetime.datetime] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        extended_info: Optional["_models.AzureFileshareProtectedItemExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "AzureFileShareProtectedItem"  # type: ignore


class AzureFileshareProtectedItemExtendedInfo(_Model):
    """Additional information about Azure File Share backup item.

    :ivar oldest_recovery_point: The oldest backup copy available for this item in the service.
    :vartype oldest_recovery_point: ~datetime.datetime
    :ivar recovery_point_count: Number of available backup copies associated with this backup item.
    :vartype recovery_point_count: int
    :ivar policy_state: Indicates consistency of policy object and policy applied to this backup
     item.
    :vartype policy_state: str
    :ivar resource_state: Indicates the state of this resource. Possible values are from enum
     ResourceState {Invalid, Active, SoftDeleted, Deleted}.
    :vartype resource_state: str
    :ivar resource_state_sync_time: The resource state sync time for this backup item.
    :vartype resource_state_sync_time: ~datetime.datetime
    """

    oldest_recovery_point: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPoint", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The oldest backup copy available for this item in the service."""
    recovery_point_count: Optional[int] = rest_field(
        name="recoveryPointCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of available backup copies associated with this backup item."""
    policy_state: Optional[str] = rest_field(
        name="policyState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates consistency of policy object and policy applied to this backup item."""
    resource_state: Optional[str] = rest_field(name="resourceState", visibility=["read"])
    """Indicates the state of this resource. Possible values are from enum ResourceState {Invalid,
     Active, SoftDeleted, Deleted}."""
    resource_state_sync_time: Optional[datetime.datetime] = rest_field(
        name="resourceStateSyncTime", visibility=["read"], format="rfc3339"
    )
    """The resource state sync time for this backup item."""

    @overload
    def __init__(
        self,
        *,
        oldest_recovery_point: Optional[datetime.datetime] = None,
        recovery_point_count: Optional[int] = None,
        policy_state: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ProtectionPolicy(_Model):
    """Base class for backup policy. Workload-specific backup policies are derived from this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureIaaSVMProtectionPolicy, AzureSqlProtectionPolicy, AzureFileShareProtectionPolicy,
    AzureVmWorkloadProtectionPolicy, GenericProtectionPolicy, MabProtectionPolicy

    :ivar protected_items_count: Number of items associated with this policy.
    :vartype protected_items_count: int
    :ivar backup_management_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is None.
    :vartype backup_management_type: str
    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    """

    __mapping__: dict[str, _Model] = {}
    protected_items_count: Optional[int] = rest_field(
        name="protectedItemsCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of items associated with this policy."""
    backup_management_type: str = rest_discriminator(
        name="backupManagementType", visibility=["read", "create", "update", "delete", "query"]
    )
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""
    resource_guard_operation_requests: Optional[list[str]] = rest_field(
        name="resourceGuardOperationRequests", visibility=["read", "create", "update", "delete", "query"]
    )
    """ResourceGuard Operation Requests."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: str,
        protected_items_count: Optional[int] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureFileShareProtectionPolicy(ProtectionPolicy, discriminator="AzureStorage"):
    """AzureStorage backup policy.

    :ivar protected_items_count: Number of items associated with this policy.
    :vartype protected_items_count: int
    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    :ivar work_load_type: Type of workload for the backup management. Known values are: "Invalid",
     "VM", "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype work_load_type: str or ~azure.mgmt.recoveryservicesbackup.models.WorkloadType
    :ivar schedule_policy: Backup schedule specified as part of backup policy.
    :vartype schedule_policy: ~azure.mgmt.recoveryservicesbackup.models.SchedulePolicy
    :ivar retention_policy: Retention policy with the details on backup copy retention ranges.
    :vartype retention_policy: ~azure.mgmt.recoveryservicesbackup.models.RetentionPolicy
    :ivar vault_retention_policy: Retention policy with the details on hardened backup copy
     retention ranges.
    :vartype vault_retention_policy: ~azure.mgmt.recoveryservicesbackup.models.VaultRetentionPolicy
    :ivar time_zone: TimeZone optional input as string. For example: TimeZone = "Pacific Standard
     Time".
    :vartype time_zone: str
    :ivar backup_management_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is "AzureStorage".
    :vartype backup_management_type: str
    """

    work_load_type: Optional[Union[str, "_models.WorkloadType"]] = rest_field(
        name="workLoadType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of workload for the backup management. Known values are: \"Invalid\", \"VM\",
     \"FileFolder\", \"AzureSqlDb\", \"SQLDB\", \"Exchange\", \"Sharepoint\", \"VMwareVM\",
     \"SystemState\", \"Client\", \"GenericDataSource\", \"SQLDataBase\", \"AzureFileShare\",
     \"SAPHanaDatabase\", \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""
    schedule_policy: Optional["_models.SchedulePolicy"] = rest_field(
        name="schedulePolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup schedule specified as part of backup policy."""
    retention_policy: Optional["_models.RetentionPolicy"] = rest_field(
        name="retentionPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention policy with the details on backup copy retention ranges."""
    vault_retention_policy: Optional["_models.VaultRetentionPolicy"] = rest_field(
        name="vaultRetentionPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention policy with the details on hardened backup copy retention ranges."""
    time_zone: Optional[str] = rest_field(name="timeZone", visibility=["read", "create", "update", "delete", "query"])
    """TimeZone optional input as string. For example: TimeZone = \"Pacific Standard Time\"."""
    backup_management_type: Literal["AzureStorage"] = rest_discriminator(name="backupManagementType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureStorage\"."""

    @overload
    def __init__(
        self,
        *,
        protected_items_count: Optional[int] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        work_load_type: Optional[Union[str, "_models.WorkloadType"]] = None,
        schedule_policy: Optional["_models.SchedulePolicy"] = None,
        retention_policy: Optional["_models.RetentionPolicy"] = None,
        vault_retention_policy: Optional["_models.VaultRetentionPolicy"] = None,
        time_zone: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.backup_management_type = "AzureStorage"  # type: ignore


class ILRRequest(_Model):
    """Parameters to Provision ILR API.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureFileShareProvisionILRRequest, IaasVMILRRegistrationRequest

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureFileShareProvisionILRRequest(ILRRequest, discriminator="AzureFileShareProvisionILRRequest"):
    """Update snapshot Uri with the correct friendly Name of the source Azure file share.

    :ivar recovery_point_id: Recovery point ID.
    :vartype recovery_point_id: str
    :ivar source_resource_id: Source Storage account ARM Id.
    :vartype source_resource_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureFileShareProvisionILRRequest".
    :vartype object_type: str
    """

    recovery_point_id: Optional[str] = rest_field(
        name="recoveryPointId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Recovery point ID."""
    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source Storage account ARM Id."""
    object_type: Literal["AzureFileShareProvisionILRRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureFileShareProvisionILRRequest\"."""

    @overload
    def __init__(
        self,
        *,
        recovery_point_id: Optional[str] = None,
        source_resource_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureFileShareProvisionILRRequest"  # type: ignore


class RecoveryPoint(_Model):
    """Base class for backup copies. Workload-specific backup copies are derived from this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureFileShareRecoveryPoint, AzureWorkloadPointInTimeRecoveryPoint, AzureWorkloadRecoveryPoint,
    AzureWorkloadSAPAsePointInTimeRecoveryPoint, AzureWorkloadSAPAseRecoveryPoint,
    AzureWorkloadSAPHanaPointInTimeRecoveryPoint, AzureWorkloadSAPHanaRecoveryPoint,
    AzureWorkloadSQLPointInTimeRecoveryPoint, AzureWorkloadSQLRecoveryPoint, GenericRecoveryPoint,
    IaasVMRecoveryPoint

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""
    threat_status: Optional[Union[str, "_models.ThreatStatus"]] = rest_field(
        name="threatStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Threat status of the recovery point. Known values are: \"Unknown\", \"Healthy\", \"UnHealthy\",
     \"Warning\", and \"NotAvailable\"."""
    threat_info: Optional[list["_models.ThreatInfo"]] = rest_field(
        name="threatInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Recovery point threat information."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureFileShareRecoveryPoint(RecoveryPoint, discriminator="AzureFileShareRecoveryPoint"):
    """Azure File Share workload specific backup copy.

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar recovery_point_type: Type of the backup copy. Specifies whether it is a crash consistent
     backup or app consistent.
    :vartype recovery_point_type: str
    :ivar recovery_point_time: Time at which this backup copy was created.
    :vartype recovery_point_time: ~datetime.datetime
    :ivar file_share_snapshot_uri: Contains Url to the snapshot of fileshare, if applicable.
    :vartype file_share_snapshot_uri: str
    :ivar recovery_point_size_in_gb: Contains recovery point size.
    :vartype recovery_point_size_in_gb: int
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    :ivar recovery_point_tier_details: Recovery point tier information.
    :vartype recovery_point_tier_details:
     list[~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierInformation]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureFileShareRecoveryPoint".
    :vartype object_type: str
    """

    recovery_point_type: Optional[str] = rest_field(
        name="recoveryPointType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the backup copy. Specifies whether it is a crash consistent backup or app consistent."""
    recovery_point_time: Optional[datetime.datetime] = rest_field(
        name="recoveryPointTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Time at which this backup copy was created."""
    file_share_snapshot_uri: Optional[str] = rest_field(
        name="fileShareSnapshotUri", visibility=["read", "create", "update", "delete", "query"]
    )
    """Contains Url to the snapshot of fileshare, if applicable."""
    recovery_point_size_in_gb: Optional[int] = rest_field(
        name="recoveryPointSizeInGB", visibility=["read", "create", "update", "delete", "query"]
    )
    """Contains recovery point size."""
    recovery_point_properties: Optional["_models.RecoveryPointProperties"] = rest_field(
        name="recoveryPointProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """Properties of Recovery Point."""
    recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformation"]] = rest_field(
        name="recoveryPointTierDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Recovery point tier information."""
    object_type: Literal["AzureFileShareRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureFileShareRecoveryPoint\"."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        recovery_point_type: Optional[str] = None,
        recovery_point_time: Optional[datetime.datetime] = None,
        file_share_snapshot_uri: Optional[str] = None,
        recovery_point_size_in_gb: Optional[int] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
        recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformation"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureFileShareRecoveryPoint"  # type: ignore


class RestoreRequest(_Model):
    """Base class for restore request. Workload-specific restore requests are derived from this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureFileShareRestoreRequest, AzureWorkloadPointInTimeRestoreRequest,
    AzureWorkloadRestoreRequest, AzureWorkloadSAPAsePointInTimeRestoreRequest,
    AzureWorkloadSAPAseRestoreRequest, AzureWorkloadSAPHanaPointInTimeRestoreRequest,
    AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest, AzureWorkloadSAPHanaRestoreRequest,
    AzureWorkloadSAPHanaRestoreWithRehydrateRequest, AzureWorkloadSQLPointInTimeRestoreRequest,
    AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest, AzureWorkloadSQLRestoreRequest,
    AzureWorkloadSQLRestoreWithRehydrateRequest, IaasVMRestoreRequest,
    IaasVMRestoreWithRehydrationRequest

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""
    resource_guard_operation_requests: Optional[list[str]] = rest_field(
        name="resourceGuardOperationRequests", visibility=["read", "create", "update", "delete", "query"]
    )
    """ResourceGuardOperationRequests on which LAC check will be performed."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
        resource_guard_operation_requests: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureFileShareRestoreRequest(RestoreRequest, discriminator="AzureFileShareRestoreRequest"):
    """AzureFileShare Restore Request.

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Source storage account ARM Id.
    :vartype source_resource_id: str
    :ivar copy_options: Options to resolve copy conflicts. Known values are: "Invalid",
     "CreateCopy", "Skip", "Overwrite", and "FailOnConflict".
    :vartype copy_options: str or ~azure.mgmt.recoveryservicesbackup.models.CopyOptions
    :ivar restore_request_type: Restore Type (FullShareRestore or ItemLevelRestore). Known values
     are: "Invalid", "FullShareRestore", and "ItemLevelRestore".
    :vartype restore_request_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RestoreRequestType
    :ivar restore_file_specs: List of Source Files/Folders(which need to recover) and
     TargetFolderPath details.
    :vartype restore_file_specs: list[~azure.mgmt.recoveryservicesbackup.models.RestoreFileSpecs]
    :ivar target_details: Target File Share Details.
    :vartype target_details: ~azure.mgmt.recoveryservicesbackup.models.TargetAFSRestoreInfo
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureFileShareRestoreRequest".
    :vartype object_type: str
    """

    recovery_type: Optional[Union[str, "_models.RecoveryType"]] = rest_field(
        name="recoveryType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of this recovery. Known values are: \"Invalid\", \"OriginalLocation\",
     \"AlternateLocation\", \"RestoreDisks\", and \"Offline\"."""
    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source storage account ARM Id."""
    copy_options: Optional[Union[str, "_models.CopyOptions"]] = rest_field(
        name="copyOptions", visibility=["read", "create", "update", "delete", "query"]
    )
    """Options to resolve copy conflicts. Known values are: \"Invalid\", \"CreateCopy\", \"Skip\",
     \"Overwrite\", and \"FailOnConflict\"."""
    restore_request_type: Optional[Union[str, "_models.RestoreRequestType"]] = rest_field(
        name="restoreRequestType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Restore Type (FullShareRestore or ItemLevelRestore). Known values are: \"Invalid\",
     \"FullShareRestore\", and \"ItemLevelRestore\"."""
    restore_file_specs: Optional[list["_models.RestoreFileSpecs"]] = rest_field(
        name="restoreFileSpecs", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of Source Files/Folders(which need to recover) and TargetFolderPath details."""
    target_details: Optional["_models.TargetAFSRestoreInfo"] = rest_field(
        name="targetDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target File Share Details."""
    object_type: Literal["AzureFileShareRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureFileShareRestoreRequest\"."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        copy_options: Optional[Union[str, "_models.CopyOptions"]] = None,
        restore_request_type: Optional[Union[str, "_models.RestoreRequestType"]] = None,
        restore_file_specs: Optional[list["_models.RestoreFileSpecs"]] = None,
        target_details: Optional["_models.TargetAFSRestoreInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureFileShareRestoreRequest"  # type: ignore


class IaaSVMContainer(ProtectionContainer, discriminator="IaasVMContainer"):
    """IaaS VM workload-specific container.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureIaaSClassicComputeVMContainer, AzureIaaSComputeVMContainer

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. IAAS_VM_CONTAINER.
    :vartype container_type: str or ~azure.mgmt.recoveryservicesbackup.models.IAAS_VM_CONTAINER
    :ivar virtual_machine_id: Fully qualified ARM url of the virtual machine represented by this
     Azure IaaS VM container.
    :vartype virtual_machine_id: str
    :ivar virtual_machine_version: Specifies whether the container represents a Classic or an Azure
     Resource Manager VM.
    :vartype virtual_machine_version: str
    :ivar resource_group: Resource group name of Recovery Services Vault.
    :vartype resource_group: str
    """

    __mapping__: dict[str, _Model] = {}
    container_type: Literal[ProtectableContainerType.IAAS_VM_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. IAAS_VM_CONTAINER."""
    virtual_machine_id: Optional[str] = rest_field(
        name="virtualMachineId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM url of the virtual machine represented by this Azure IaaS VM container."""
    virtual_machine_version: Optional[str] = rest_field(
        name="virtualMachineVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies whether the container represents a Classic or an Azure Resource Manager VM."""
    resource_group: Optional[str] = rest_field(
        name="resourceGroup", visibility=["read", "create", "update", "delete", "query"]
    )
    """Resource group name of Recovery Services Vault."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        virtual_machine_id: Optional[str] = None,
        virtual_machine_version: Optional[str] = None,
        resource_group: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.IAAS_VM_CONTAINER  # type: ignore


class AzureIaaSClassicComputeVMContainer(IaaSVMContainer, discriminator="Microsoft.ClassicCompute/virtualMachines"):
    """IaaS VM workload-specific backup item representing a classic virtual machine.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar virtual_machine_id: Fully qualified ARM url of the virtual machine represented by this
     Azure IaaS VM container.
    :vartype virtual_machine_id: str
    :ivar virtual_machine_version: Specifies whether the container represents a Classic or an Azure
     Resource Manager VM.
    :vartype virtual_machine_version: str
    :ivar resource_group: Resource group name of Recovery Services Vault.
    :vartype resource_group: str
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. MICROSOFT_CLASSIC_COMPUTE_VIRTUAL_MACHINES.
    :vartype container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.MICROSOFT_CLASSIC_COMPUTE_VIRTUAL_MACHINES
    """

    container_type: Literal[ProtectableContainerType.MICROSOFT_CLASSIC_COMPUTE_VIRTUAL_MACHINES] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. MICROSOFT_CLASSIC_COMPUTE_VIRTUAL_MACHINES."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        virtual_machine_id: Optional[str] = None,
        virtual_machine_version: Optional[str] = None,
        resource_group: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.MICROSOFT_CLASSIC_COMPUTE_VIRTUAL_MACHINES  # type: ignore


class IaaSVMProtectableItem(WorkloadProtectableItem, discriminator="IaaSVMProtectableItem"):
    """IaaS VM workload-specific backup item.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureIaaSClassicComputeVMProtectableItem, AzureIaaSComputeVMProtectableItem

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "IaaSVMProtectableItem".
    :vartype protectable_item_type: str
    :ivar virtual_machine_id: Fully qualified ARM ID of the virtual machine.
    :vartype virtual_machine_id: str
    :ivar virtual_machine_version: Specifies whether the container represents a Classic or an Azure
     Resource Manager VM.
    :vartype virtual_machine_version: str
    :ivar resource_group: Resource group name of Recovery Services Vault.
    :vartype resource_group: str
    """

    __mapping__: dict[str, _Model] = {}
    protectable_item_type: Literal["IaaSVMProtectableItem"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"IaaSVMProtectableItem\"."""
    virtual_machine_id: Optional[str] = rest_field(
        name="virtualMachineId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM ID of the virtual machine."""
    virtual_machine_version: Optional[str] = rest_field(
        name="virtualMachineVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies whether the container represents a Classic or an Azure Resource Manager VM."""
    resource_group: Optional[str] = rest_field(
        name="resourceGroup", visibility=["read", "create", "update", "delete", "query"]
    )
    """Resource group name of Recovery Services Vault."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        virtual_machine_id: Optional[str] = None,
        virtual_machine_version: Optional[str] = None,
        resource_group: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "IaaSVMProtectableItem"  # type: ignore


class AzureIaaSClassicComputeVMProtectableItem(
    IaaSVMProtectableItem, discriminator="Microsoft.ClassicCompute/virtualMachines"
):
    """IaaS VM workload-specific backup item representing the Classic Compute VM.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar virtual_machine_id: Fully qualified ARM ID of the virtual machine.
    :vartype virtual_machine_id: str
    :ivar virtual_machine_version: Specifies whether the container represents a Classic or an Azure
     Resource Manager VM.
    :vartype virtual_machine_version: str
    :ivar resource_group: Resource group name of Recovery Services Vault.
    :vartype resource_group: str
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "Microsoft.ClassicCompute/virtualMachines".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["Microsoft.ClassicCompute/virtualMachines"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is
     \"Microsoft.ClassicCompute/virtualMachines\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        virtual_machine_id: Optional[str] = None,
        virtual_machine_version: Optional[str] = None,
        resource_group: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "Microsoft.ClassicCompute/virtualMachines"  # type: ignore


class AzureIaaSVMProtectedItem(ProtectedItem, discriminator="AzureIaaSVMProtectedItem"):
    """IaaS VM workload-specific backup item.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureIaaSClassicComputeVMProtectedItem, AzureIaaSComputeVMProtectedItem

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar protected_item_type: backup item type. Required. Default value is
     "AzureIaaSVMProtectedItem".
    :vartype protected_item_type: str
    :ivar friendly_name: Friendly name of the VM represented by this backup item.
    :vartype friendly_name: str
    :ivar virtual_machine_id: Fully qualified ARM ID of the virtual machine represented by this
     item.
    :vartype virtual_machine_id: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar health_status: Health status of protected item. Known values are: "Passed",
     "ActionRequired", "ActionSuggested", and "Invalid".
    :vartype health_status: str or ~azure.mgmt.recoveryservicesbackup.models.HealthStatus
    :ivar health_details: Health details on this backup item.
    :vartype health_details:
     list[~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMHealthDetails]
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar last_backup_status: Last backup operation status.
    :vartype last_backup_status: str
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar protected_item_data_id: Data ID of the protected item.
    :vartype protected_item_data_id: str
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMProtectedItemExtendedInfo
    :ivar extended_properties: Extended Properties for Azure IaasVM Backup.
    :vartype extended_properties: ~azure.mgmt.recoveryservicesbackup.models.ExtendedProperties
    :ivar policy_type: Type of the policy used for protection.
    :vartype policy_type: str
    """

    __mapping__: dict[str, _Model] = {}
    protected_item_type: Literal["AzureIaaSVMProtectedItem"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"AzureIaaSVMProtectedItem\"."""
    friendly_name: Optional[str] = rest_field(name="friendlyName", visibility=["read"])
    """Friendly name of the VM represented by this backup item."""
    virtual_machine_id: Optional[str] = rest_field(name="virtualMachineId", visibility=["read"])
    """Fully qualified ARM ID of the virtual machine represented by this item."""
    protection_status: Optional[str] = rest_field(
        name="protectionStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup status of this backup item."""
    protection_state: Optional[Union[str, "_models.ProtectionState"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup state of this backup item. Known values are: \"Invalid\", \"IRPending\", \"Protected\",
     \"ProtectionError\", \"ProtectionStopped\", \"ProtectionPaused\", and \"BackupsSuspended\"."""
    health_status: Optional[Union[str, "_models.HealthStatus"]] = rest_field(name="healthStatus", visibility=["read"])
    """Health status of protected item. Known values are: \"Passed\", \"ActionRequired\",
     \"ActionSuggested\", and \"Invalid\"."""
    health_details: Optional[list["_models.AzureIaaSVMHealthDetails"]] = rest_field(
        name="healthDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Health details on this backup item."""
    kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = rest_field(
        name="kpisHealths", visibility=["read", "create", "update", "delete", "query"]
    )
    """Health details of different KPIs."""
    last_backup_status: Optional[str] = rest_field(
        name="lastBackupStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Last backup operation status."""
    last_backup_time: Optional[datetime.datetime] = rest_field(
        name="lastBackupTime", visibility=["read"], format="rfc3339"
    )
    """Timestamp of the last backup operation on this backup item."""
    protected_item_data_id: Optional[str] = rest_field(name="protectedItemDataId", visibility=["read"])
    """Data ID of the protected item."""
    extended_info: Optional["_models.AzureIaaSVMProtectedItemExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information for this backup item."""
    extended_properties: Optional["_models.ExtendedProperties"] = rest_field(
        name="extendedProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """Extended Properties for Azure IaasVM Backup."""
    policy_type: Optional[str] = rest_field(name="policyType", visibility=["read"])
    """Type of the policy used for protection."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        protection_status: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        health_details: Optional[list["_models.AzureIaaSVMHealthDetails"]] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        last_backup_status: Optional[str] = None,
        extended_info: Optional["_models.AzureIaaSVMProtectedItemExtendedInfo"] = None,
        extended_properties: Optional["_models.ExtendedProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "AzureIaaSVMProtectedItem"  # type: ignore


class AzureIaaSClassicComputeVMProtectedItem(
    AzureIaaSVMProtectedItem, discriminator="Microsoft.ClassicCompute/virtualMachines"
):
    """IaaS VM workload-specific backup item representing the Classic Compute VM.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the VM represented by this backup item.
    :vartype friendly_name: str
    :ivar virtual_machine_id: Fully qualified ARM ID of the virtual machine represented by this
     item.
    :vartype virtual_machine_id: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar health_status: Health status of protected item. Known values are: "Passed",
     "ActionRequired", "ActionSuggested", and "Invalid".
    :vartype health_status: str or ~azure.mgmt.recoveryservicesbackup.models.HealthStatus
    :ivar health_details: Health details on this backup item.
    :vartype health_details:
     list[~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMHealthDetails]
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar last_backup_status: Last backup operation status.
    :vartype last_backup_status: str
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar protected_item_data_id: Data ID of the protected item.
    :vartype protected_item_data_id: str
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMProtectedItemExtendedInfo
    :ivar extended_properties: Extended Properties for Azure IaasVM Backup.
    :vartype extended_properties: ~azure.mgmt.recoveryservicesbackup.models.ExtendedProperties
    :ivar policy_type: Type of the policy used for protection.
    :vartype policy_type: str
    :ivar protected_item_type: backup item type. Required. Default value is
     "Microsoft.ClassicCompute/virtualMachines".
    :vartype protected_item_type: str
    """

    protected_item_type: Literal["Microsoft.ClassicCompute/virtualMachines"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"Microsoft.ClassicCompute/virtualMachines\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        protection_status: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        health_details: Optional[list["_models.AzureIaaSVMHealthDetails"]] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        last_backup_status: Optional[str] = None,
        extended_info: Optional["_models.AzureIaaSVMProtectedItemExtendedInfo"] = None,
        extended_properties: Optional["_models.ExtendedProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "Microsoft.ClassicCompute/virtualMachines"  # type: ignore


class AzureIaaSComputeVMContainer(IaaSVMContainer, discriminator="Microsoft.Compute/virtualMachines"):
    """IaaS VM workload-specific backup item representing an Azure Resource Manager virtual machine.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar virtual_machine_id: Fully qualified ARM url of the virtual machine represented by this
     Azure IaaS VM container.
    :vartype virtual_machine_id: str
    :ivar virtual_machine_version: Specifies whether the container represents a Classic or an Azure
     Resource Manager VM.
    :vartype virtual_machine_version: str
    :ivar resource_group: Resource group name of Recovery Services Vault.
    :vartype resource_group: str
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. MICROSOFT_COMPUTE_VIRTUAL_MACHINES.
    :vartype container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.MICROSOFT_COMPUTE_VIRTUAL_MACHINES
    """

    container_type: Literal[ProtectableContainerType.MICROSOFT_COMPUTE_VIRTUAL_MACHINES] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. MICROSOFT_COMPUTE_VIRTUAL_MACHINES."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        virtual_machine_id: Optional[str] = None,
        virtual_machine_version: Optional[str] = None,
        resource_group: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.MICROSOFT_COMPUTE_VIRTUAL_MACHINES  # type: ignore


class AzureIaaSComputeVMProtectableItem(IaaSVMProtectableItem, discriminator="Microsoft.Compute/virtualMachines"):
    """IaaS VM workload-specific backup item representing the Azure Resource Manager VM.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar virtual_machine_id: Fully qualified ARM ID of the virtual machine.
    :vartype virtual_machine_id: str
    :ivar virtual_machine_version: Specifies whether the container represents a Classic or an Azure
     Resource Manager VM.
    :vartype virtual_machine_version: str
    :ivar resource_group: Resource group name of Recovery Services Vault.
    :vartype resource_group: str
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "Microsoft.Compute/virtualMachines".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["Microsoft.Compute/virtualMachines"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"Microsoft.Compute/virtualMachines\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        virtual_machine_id: Optional[str] = None,
        virtual_machine_version: Optional[str] = None,
        resource_group: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "Microsoft.Compute/virtualMachines"  # type: ignore


class AzureIaaSComputeVMProtectedItem(AzureIaaSVMProtectedItem, discriminator="Microsoft.Compute/virtualMachines"):
    """IaaS VM workload-specific backup item representing the Azure Resource Manager VM.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the VM represented by this backup item.
    :vartype friendly_name: str
    :ivar virtual_machine_id: Fully qualified ARM ID of the virtual machine represented by this
     item.
    :vartype virtual_machine_id: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar health_status: Health status of protected item. Known values are: "Passed",
     "ActionRequired", "ActionSuggested", and "Invalid".
    :vartype health_status: str or ~azure.mgmt.recoveryservicesbackup.models.HealthStatus
    :ivar health_details: Health details on this backup item.
    :vartype health_details:
     list[~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMHealthDetails]
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar last_backup_status: Last backup operation status.
    :vartype last_backup_status: str
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar protected_item_data_id: Data ID of the protected item.
    :vartype protected_item_data_id: str
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMProtectedItemExtendedInfo
    :ivar extended_properties: Extended Properties for Azure IaasVM Backup.
    :vartype extended_properties: ~azure.mgmt.recoveryservicesbackup.models.ExtendedProperties
    :ivar policy_type: Type of the policy used for protection.
    :vartype policy_type: str
    :ivar protected_item_type: backup item type. Required. Default value is
     "Microsoft.Compute/virtualMachines".
    :vartype protected_item_type: str
    """

    protected_item_type: Literal["Microsoft.Compute/virtualMachines"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"Microsoft.Compute/virtualMachines\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        protection_status: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        health_details: Optional[list["_models.AzureIaaSVMHealthDetails"]] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        last_backup_status: Optional[str] = None,
        extended_info: Optional["_models.AzureIaaSVMProtectedItemExtendedInfo"] = None,
        extended_properties: Optional["_models.ExtendedProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "Microsoft.Compute/virtualMachines"  # type: ignore


class AzureIaaSVMErrorInfo(_Model):
    """Azure IaaS VM workload-specific error information.

    :ivar error_code: Error code.
    :vartype error_code: int
    :ivar error_title: Title: Typically, the entity that the error pertains to.
    :vartype error_title: str
    :ivar error_string: Localized error string.
    :vartype error_string: str
    :ivar recommendations: List of localized recommendations for above error code.
    :vartype recommendations: list[str]
    """

    error_code: Optional[int] = rest_field(name="errorCode", visibility=["read"])
    """Error code."""
    error_title: Optional[str] = rest_field(name="errorTitle", visibility=["read"])
    """Title: Typically, the entity that the error pertains to."""
    error_string: Optional[str] = rest_field(name="errorString", visibility=["read"])
    """Localized error string."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read"])
    """List of localized recommendations for above error code."""


class ResourceHealthDetails(_Model):
    """Health Details for backup items.

    :ivar code: Health Code.
    :vartype code: int
    :ivar title: Health Title.
    :vartype title: str
    :ivar message: Health Message.
    :vartype message: str
    :ivar recommendations: Health Recommended Actions.
    :vartype recommendations: list[str]
    """

    code: Optional[int] = rest_field(visibility=["read"])
    """Health Code."""
    title: Optional[str] = rest_field(visibility=["read"])
    """Health Title."""
    message: Optional[str] = rest_field(visibility=["read"])
    """Health Message."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read"])
    """Health Recommended Actions."""


class AzureIaaSVMHealthDetails(ResourceHealthDetails):
    """Azure IaaS VM workload-specific Health Details.

    :ivar code: Health Code.
    :vartype code: int
    :ivar title: Health Title.
    :vartype title: str
    :ivar message: Health Message.
    :vartype message: str
    :ivar recommendations: Health Recommended Actions.
    :vartype recommendations: list[str]
    """


class Job(_Model):
    """Defines workload agnostic properties for a job.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureIaaSVMJob, AzureIaaSVMJobV2, AzureStorageJob, AzureWorkloadJob, DpmJob, MabJob, VaultJob

    :ivar entity_friendly_name: Friendly name of the entity on which the current job is executing.
    :vartype entity_friendly_name: str
    :ivar backup_management_type: Backup management type to execute the current job. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar operation: The operation name.
    :vartype operation: str
    :ivar status: Job status.
    :vartype status: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar activity_id: ActivityId of job.
    :vartype activity_id: str
    :ivar job_type: This property will be used as the discriminator for deciding the specific types
     in the polymorphic chain of types. Required. Default value is None.
    :vartype job_type: str
    """

    __mapping__: dict[str, _Model] = {}
    entity_friendly_name: Optional[str] = rest_field(
        name="entityFriendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the entity on which the current job is executing."""
    backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = rest_field(
        name="backupManagementType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup management type to execute the current job. Known values are: \"Invalid\",
     \"AzureIaasVM\", \"MAB\", \"DPM\", \"AzureBackupServer\", \"AzureSql\", \"AzureStorage\",
     \"AzureWorkload\", and \"DefaultBackup\"."""
    operation: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """The operation name."""
    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Job status."""
    start_time: Optional[datetime.datetime] = rest_field(
        name="startTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The start time."""
    end_time: Optional[datetime.datetime] = rest_field(
        name="endTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The end time."""
    activity_id: Optional[str] = rest_field(
        name="activityId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ActivityId of job."""
    job_type: str = rest_discriminator(name="jobType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        job_type: str,
        entity_friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        operation: Optional[str] = None,
        status: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        activity_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureIaaSVMJob(Job, discriminator="AzureIaaSVMJob"):
    """Azure IaaS VM workload-specific job object.

    :ivar entity_friendly_name: Friendly name of the entity on which the current job is executing.
    :vartype entity_friendly_name: str
    :ivar backup_management_type: Backup management type to execute the current job. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar operation: The operation name.
    :vartype operation: str
    :ivar status: Job status.
    :vartype status: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar activity_id: ActivityId of job.
    :vartype activity_id: str
    :ivar duration: Time elapsed during the execution of this job.
    :vartype duration: ~datetime.timedelta
    :ivar actions_info: Gets or sets the state/actions applicable on this job like cancel/retry.
    :vartype actions_info: list[str or
     ~azure.mgmt.recoveryservicesbackup.models.JobSupportedAction]
    :ivar error_details: Error details on execution of this job.
    :vartype error_details: list[~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMErrorInfo]
    :ivar virtual_machine_version: Specifies whether the backup item is a Classic or an Azure
     Resource Manager VM.
    :vartype virtual_machine_version: str
    :ivar extended_info: Additional information for this job.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMJobExtendedInfo
    :ivar container_name: Container name of the entity on which the current job is executing.
    :vartype container_name: str
    :ivar is_user_triggered: Indicated that whether the job is adhoc(true) or scheduled(false).
    :vartype is_user_triggered: bool
    :ivar job_type: This property will be used as the discriminator for deciding the specific types
     in the polymorphic chain of types. Required. Default value is "AzureIaaSVMJob".
    :vartype job_type: str
    """

    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed during the execution of this job."""
    actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = rest_field(
        name="actionsInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets the state/actions applicable on this job like cancel/retry."""
    error_details: Optional[list["_models.AzureIaaSVMErrorInfo"]] = rest_field(
        name="errorDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error details on execution of this job."""
    virtual_machine_version: Optional[str] = rest_field(
        name="virtualMachineVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies whether the backup item is a Classic or an Azure Resource Manager VM."""
    extended_info: Optional["_models.AzureIaaSVMJobExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information for this job."""
    container_name: Optional[str] = rest_field(
        name="containerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Container name of the entity on which the current job is executing."""
    is_user_triggered: Optional[bool] = rest_field(
        name="isUserTriggered", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicated that whether the job is adhoc(true) or scheduled(false)."""
    job_type: Literal["AzureIaaSVMJob"] = rest_discriminator(name="jobType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureIaaSVMJob\"."""

    @overload
    def __init__(
        self,
        *,
        entity_friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        operation: Optional[str] = None,
        status: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        activity_id: Optional[str] = None,
        duration: Optional[datetime.timedelta] = None,
        actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = None,
        error_details: Optional[list["_models.AzureIaaSVMErrorInfo"]] = None,
        virtual_machine_version: Optional[str] = None,
        extended_info: Optional["_models.AzureIaaSVMJobExtendedInfo"] = None,
        container_name: Optional[str] = None,
        is_user_triggered: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.job_type = "AzureIaaSVMJob"  # type: ignore


class AzureIaaSVMJobExtendedInfo(_Model):
    """Azure IaaS VM workload-specific additional information for job.

    :ivar tasks_list: List of tasks associated with this job.
    :vartype tasks_list: list[~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMJobTaskDetails]
    :ivar property_bag: Job properties.
    :vartype property_bag: dict[str, str]
    :ivar internal_property_bag: Job internal properties.
    :vartype internal_property_bag: dict[str, str]
    :ivar progress_percentage: Indicates progress of the job. Null if it has not started or
     completed.
    :vartype progress_percentage: float
    :ivar estimated_remaining_duration: Time remaining for execution of this job.
    :vartype estimated_remaining_duration: str
    :ivar dynamic_error_message: Non localized error message on job execution.
    :vartype dynamic_error_message: str
    """

    tasks_list: Optional[list["_models.AzureIaaSVMJobTaskDetails"]] = rest_field(
        name="tasksList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of tasks associated with this job."""
    property_bag: Optional[dict[str, str]] = rest_field(
        name="propertyBag", visibility=["read", "create", "update", "delete", "query"]
    )
    """Job properties."""
    internal_property_bag: Optional[dict[str, str]] = rest_field(
        name="internalPropertyBag", visibility=["read", "create", "update", "delete", "query"]
    )
    """Job internal properties."""
    progress_percentage: Optional[float] = rest_field(
        name="progressPercentage", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates progress of the job. Null if it has not started or completed."""
    estimated_remaining_duration: Optional[str] = rest_field(
        name="estimatedRemainingDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """Time remaining for execution of this job."""
    dynamic_error_message: Optional[str] = rest_field(
        name="dynamicErrorMessage", visibility=["read", "create", "update", "delete", "query"]
    )
    """Non localized error message on job execution."""

    @overload
    def __init__(
        self,
        *,
        tasks_list: Optional[list["_models.AzureIaaSVMJobTaskDetails"]] = None,
        property_bag: Optional[dict[str, str]] = None,
        internal_property_bag: Optional[dict[str, str]] = None,
        progress_percentage: Optional[float] = None,
        estimated_remaining_duration: Optional[str] = None,
        dynamic_error_message: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureIaaSVMJobTaskDetails(_Model):
    """Azure IaaS VM workload-specific job task details.

    :ivar task_id: The task display name.
    :vartype task_id: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar instance_id: The instanceId.
    :vartype instance_id: str
    :ivar duration: Time elapsed for task.
    :vartype duration: ~datetime.timedelta
    :ivar status: The status.
    :vartype status: str
    :ivar progress_percentage: Progress of the task.
    :vartype progress_percentage: float
    :ivar task_execution_details: Details about execution of the task. eg: number of bytes
     transferred etc.
    :vartype task_execution_details: str
    """

    task_id: Optional[str] = rest_field(name="taskId", visibility=["read", "create", "update", "delete", "query"])
    """The task display name."""
    start_time: Optional[datetime.datetime] = rest_field(
        name="startTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The start time."""
    end_time: Optional[datetime.datetime] = rest_field(
        name="endTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The end time."""
    instance_id: Optional[str] = rest_field(
        name="instanceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """The instanceId."""
    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed for task."""
    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """The status."""
    progress_percentage: Optional[float] = rest_field(
        name="progressPercentage", visibility=["read", "create", "update", "delete", "query"]
    )
    """Progress of the task."""
    task_execution_details: Optional[str] = rest_field(
        name="taskExecutionDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Details about execution of the task. eg: number of bytes transferred etc."""

    @overload
    def __init__(
        self,
        *,
        task_id: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        instance_id: Optional[str] = None,
        duration: Optional[datetime.timedelta] = None,
        status: Optional[str] = None,
        progress_percentage: Optional[float] = None,
        task_execution_details: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureIaaSVMJobV2(Job, discriminator="AzureIaaSVMJobV2"):
    """Azure IaaS VM workload-specific job object.

    :ivar entity_friendly_name: Friendly name of the entity on which the current job is executing.
    :vartype entity_friendly_name: str
    :ivar backup_management_type: Backup management type to execute the current job. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar operation: The operation name.
    :vartype operation: str
    :ivar status: Job status.
    :vartype status: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar activity_id: ActivityId of job.
    :vartype activity_id: str
    :ivar actions_info: Gets or sets the state/actions applicable on this job like cancel/retry.
    :vartype actions_info: list[str or
     ~azure.mgmt.recoveryservicesbackup.models.JobSupportedAction]
    :ivar container_name: Container name of the entity on which the current job is executing.
    :vartype container_name: str
    :ivar duration: Time elapsed during the execution of this job.
    :vartype duration: ~datetime.timedelta
    :ivar error_details: Error details on execution of this job.
    :vartype error_details: list[~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMErrorInfo]
    :ivar virtual_machine_version: Specifies whether the backup item is a Classic or an Azure
     Resource Manager VM.
    :vartype virtual_machine_version: str
    :ivar extended_info: Additional information for this job.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.AzureIaaSVMJobExtendedInfo
    :ivar job_type: This property will be used as the discriminator for deciding the specific types
     in the polymorphic chain of types. Required. Default value is "AzureIaaSVMJobV2".
    :vartype job_type: str
    """

    actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = rest_field(
        name="actionsInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets the state/actions applicable on this job like cancel/retry."""
    container_name: Optional[str] = rest_field(
        name="containerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Container name of the entity on which the current job is executing."""
    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed during the execution of this job."""
    error_details: Optional[list["_models.AzureIaaSVMErrorInfo"]] = rest_field(
        name="errorDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error details on execution of this job."""
    virtual_machine_version: Optional[str] = rest_field(
        name="virtualMachineVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies whether the backup item is a Classic or an Azure Resource Manager VM."""
    extended_info: Optional["_models.AzureIaaSVMJobExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information for this job."""
    job_type: Literal["AzureIaaSVMJobV2"] = rest_discriminator(name="jobType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureIaaSVMJobV2\"."""

    @overload
    def __init__(
        self,
        *,
        entity_friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        operation: Optional[str] = None,
        status: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        activity_id: Optional[str] = None,
        actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = None,
        container_name: Optional[str] = None,
        duration: Optional[datetime.timedelta] = None,
        error_details: Optional[list["_models.AzureIaaSVMErrorInfo"]] = None,
        virtual_machine_version: Optional[str] = None,
        extended_info: Optional["_models.AzureIaaSVMJobExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.job_type = "AzureIaaSVMJobV2"  # type: ignore


class AzureIaaSVMProtectedItemExtendedInfo(_Model):
    """Additional information on Azure IaaS VM specific backup item.

    :ivar oldest_recovery_point: The oldest backup copy available for this backup item across all
     tiers.
    :vartype oldest_recovery_point: ~datetime.datetime
    :ivar oldest_recovery_point_in_vault: The oldest backup copy available for this backup item in
     vault tier.
    :vartype oldest_recovery_point_in_vault: ~datetime.datetime
    :ivar oldest_recovery_point_in_archive: The oldest backup copy available for this backup item
     in archive tier.
    :vartype oldest_recovery_point_in_archive: ~datetime.datetime
    :ivar newest_recovery_point_in_archive: The latest backup copy available for this backup item
     in archive tier.
    :vartype newest_recovery_point_in_archive: ~datetime.datetime
    :ivar recovery_point_count: Number of backup copies available for this backup item.
    :vartype recovery_point_count: int
    :ivar policy_inconsistent: Specifies if backup policy associated with the backup item is
     inconsistent.
    :vartype policy_inconsistent: bool
    """

    oldest_recovery_point: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPoint", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The oldest backup copy available for this backup item across all tiers."""
    oldest_recovery_point_in_vault: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPointInVault", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The oldest backup copy available for this backup item in vault tier."""
    oldest_recovery_point_in_archive: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPointInArchive",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """The oldest backup copy available for this backup item in archive tier."""
    newest_recovery_point_in_archive: Optional[datetime.datetime] = rest_field(
        name="newestRecoveryPointInArchive",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """The latest backup copy available for this backup item in archive tier."""
    recovery_point_count: Optional[int] = rest_field(
        name="recoveryPointCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of backup copies available for this backup item."""
    policy_inconsistent: Optional[bool] = rest_field(
        name="policyInconsistent", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies if backup policy associated with the backup item is inconsistent."""

    @overload
    def __init__(
        self,
        *,
        oldest_recovery_point: Optional[datetime.datetime] = None,
        oldest_recovery_point_in_vault: Optional[datetime.datetime] = None,
        oldest_recovery_point_in_archive: Optional[datetime.datetime] = None,
        newest_recovery_point_in_archive: Optional[datetime.datetime] = None,
        recovery_point_count: Optional[int] = None,
        policy_inconsistent: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureIaaSVMProtectionPolicy(ProtectionPolicy, discriminator="AzureIaasVM"):
    """IaaS VM workload-specific backup policy.

    :ivar protected_items_count: Number of items associated with this policy.
    :vartype protected_items_count: int
    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    :ivar instant_rp_details:
    :vartype instant_rp_details:
     ~azure.mgmt.recoveryservicesbackup.models.InstantRPAdditionalDetails
    :ivar schedule_policy: Backup schedule specified as part of backup policy.
    :vartype schedule_policy: ~azure.mgmt.recoveryservicesbackup.models.SchedulePolicy
    :ivar retention_policy: Retention policy with the details on backup copy retention ranges.
    :vartype retention_policy: ~azure.mgmt.recoveryservicesbackup.models.RetentionPolicy
    :ivar tiering_policy: Tiering policy to automatically move RPs to another tier Key is Target
     Tier, defined in RecoveryPointTierType enum. Tiering policy specifies the criteria to move RP
     to the target tier.
    :vartype tiering_policy: dict[str, ~azure.mgmt.recoveryservicesbackup.models.TieringPolicy]
    :ivar instant_rp_retention_range_in_days: Instant RP retention policy range in days.
    :vartype instant_rp_retention_range_in_days: int
    :ivar time_zone: TimeZone optional input as string. For example: TimeZone = "Pacific Standard
     Time".
    :vartype time_zone: str
    :ivar policy_type: Known values are: "Invalid", "V1", and "V2".
    :vartype policy_type: str or ~azure.mgmt.recoveryservicesbackup.models.IAASVMPolicyType
    :ivar snapshot_consistency_type: "OnlyCrashConsistent"
    :vartype snapshot_consistency_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.IaasVMSnapshotConsistencyType
    :ivar backup_management_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is "AzureIaasVM".
    :vartype backup_management_type: str
    """

    instant_rp_details: Optional["_models.InstantRPAdditionalDetails"] = rest_field(
        name="instantRPDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    schedule_policy: Optional["_models.SchedulePolicy"] = rest_field(
        name="schedulePolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup schedule specified as part of backup policy."""
    retention_policy: Optional["_models.RetentionPolicy"] = rest_field(
        name="retentionPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention policy with the details on backup copy retention ranges."""
    tiering_policy: Optional[dict[str, "_models.TieringPolicy"]] = rest_field(
        name="tieringPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Tiering policy to automatically move RPs to another tier Key is Target Tier, defined in
     RecoveryPointTierType enum. Tiering policy specifies the criteria to move RP to the target
     tier."""
    instant_rp_retention_range_in_days: Optional[int] = rest_field(
        name="instantRpRetentionRangeInDays", visibility=["read", "create", "update", "delete", "query"]
    )
    """Instant RP retention policy range in days."""
    time_zone: Optional[str] = rest_field(name="timeZone", visibility=["read", "create", "update", "delete", "query"])
    """TimeZone optional input as string. For example: TimeZone = \"Pacific Standard Time\"."""
    policy_type: Optional[Union[str, "_models.IAASVMPolicyType"]] = rest_field(
        name="policyType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Known values are: \"Invalid\", \"V1\", and \"V2\"."""
    snapshot_consistency_type: Optional[Union[str, "_models.IaasVMSnapshotConsistencyType"]] = rest_field(
        name="snapshotConsistencyType", visibility=["read", "create", "update", "delete", "query"]
    )
    """\"OnlyCrashConsistent\""""
    backup_management_type: Literal["AzureIaasVM"] = rest_discriminator(name="backupManagementType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureIaasVM\"."""

    @overload
    def __init__(
        self,
        *,
        protected_items_count: Optional[int] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        instant_rp_details: Optional["_models.InstantRPAdditionalDetails"] = None,
        schedule_policy: Optional["_models.SchedulePolicy"] = None,
        retention_policy: Optional["_models.RetentionPolicy"] = None,
        tiering_policy: Optional[dict[str, "_models.TieringPolicy"]] = None,
        instant_rp_retention_range_in_days: Optional[int] = None,
        time_zone: Optional[str] = None,
        policy_type: Optional[Union[str, "_models.IAASVMPolicyType"]] = None,
        snapshot_consistency_type: Optional[Union[str, "_models.IaasVMSnapshotConsistencyType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.backup_management_type = "AzureIaasVM"  # type: ignore


class ProtectionIntent(_Model):
    """Base class for backup ProtectionIntent.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureResourceProtectionIntent, AzureWorkloadAutoProtectionIntent,
    AzureWorkloadContainerAutoProtectionIntent, AzureWorkloadSQLAutoProtectionIntent,
    AzureRecoveryServiceVaultProtectionIntent

    :ivar protection_intent_item_type: backup protectionIntent type. Required. Known values are:
     "Invalid", "AzureResourceItem", "RecoveryServiceVaultItem",
     "AzureWorkloadContainerAutoProtectionIntent", "AzureWorkloadAutoProtectionIntent", and
     "AzureWorkloadSQLAutoProtectionIntent".
    :vartype protection_intent_item_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectionIntentItemType
    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar item_id: ID of the item which is getting protected, In case of Azure Vm , it is
     ProtectedItemId.
    :vartype item_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "NotProtected", "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    """

    __mapping__: dict[str, _Model] = {}
    protection_intent_item_type: str = rest_discriminator(
        name="protectionIntentItemType", visibility=["read", "create", "update", "delete", "query"]
    )
    """backup protectionIntent type. Required. Known values are: \"Invalid\", \"AzureResourceItem\",
     \"RecoveryServiceVaultItem\", \"AzureWorkloadContainerAutoProtectionIntent\",
     \"AzureWorkloadAutoProtectionIntent\", and \"AzureWorkloadSQLAutoProtectionIntent\"."""
    backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = rest_field(
        name="backupManagementType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup management for the backed up item. Known values are: \"Invalid\",
     \"AzureIaasVM\", \"MAB\", \"DPM\", \"AzureBackupServer\", \"AzureSql\", \"AzureStorage\",
     \"AzureWorkload\", and \"DefaultBackup\"."""
    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ARM ID of the resource to be backed up."""
    item_id: Optional[str] = rest_field(name="itemId", visibility=["read", "create", "update", "delete", "query"])
    """ID of the item which is getting protected, In case of Azure Vm , it is ProtectedItemId."""
    policy_id: Optional[str] = rest_field(name="policyId", visibility=["read", "create", "update", "delete", "query"])
    """ID of the backup policy with which this item is backed up."""
    protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup state of this backup item. Known values are: \"Invalid\", \"NotProtected\",
     \"Protecting\", \"Protected\", and \"ProtectionFailed\"."""

    @overload
    def __init__(
        self,
        *,
        protection_intent_item_type: str,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        source_resource_id: Optional[str] = None,
        item_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureRecoveryServiceVaultProtectionIntent(
    ProtectionIntent, discriminator="RecoveryServiceVaultItem"
):  # pylint: disable=name-too-long
    """Azure Recovery Services Vault specific protection intent item.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadAutoProtectionIntent, AzureWorkloadSQLAutoProtectionIntent

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar item_id: ID of the item which is getting protected, In case of Azure Vm , it is
     ProtectedItemId.
    :vartype item_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "NotProtected", "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar protection_intent_item_type: backup protectionIntent type. Required.
     RECOVERY_SERVICE_VAULT_ITEM.
    :vartype protection_intent_item_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RECOVERY_SERVICE_VAULT_ITEM
    """

    __mapping__: dict[str, _Model] = {}
    protection_intent_item_type: Literal[ProtectionIntentItemType.RECOVERY_SERVICE_VAULT_ITEM] = rest_discriminator(name="protectionIntentItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup protectionIntent type. Required. RECOVERY_SERVICE_VAULT_ITEM."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        source_resource_id: Optional[str] = None,
        item_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protection_intent_item_type = ProtectionIntentItemType.RECOVERY_SERVICE_VAULT_ITEM  # type: ignore


class AzureResourceProtectionIntent(ProtectionIntent, discriminator="AzureResourceItem"):
    """IaaS VM specific backup protection intent item.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar item_id: ID of the item which is getting protected, In case of Azure Vm , it is
     ProtectedItemId.
    :vartype item_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "NotProtected", "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar friendly_name: Friendly name of the VM represented by this backup item.
    :vartype friendly_name: str
    :ivar protection_intent_item_type: backup protectionIntent type. Required. AZURE_RESOURCE_ITEM.
    :vartype protection_intent_item_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.AZURE_RESOURCE_ITEM
    """

    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the VM represented by this backup item."""
    protection_intent_item_type: Literal[ProtectionIntentItemType.AZURE_RESOURCE_ITEM] = rest_discriminator(name="protectionIntentItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup protectionIntent type. Required. AZURE_RESOURCE_ITEM."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        source_resource_id: Optional[str] = None,
        item_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        friendly_name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protection_intent_item_type = ProtectionIntentItemType.AZURE_RESOURCE_ITEM  # type: ignore


class AzureWorkloadContainer(ProtectionContainer, discriminator="AzureWorkloadContainer"):
    """Container for the workloads running inside Azure Compute or Classic Compute.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureSQLAGWorkloadContainerProtectionContainer, AzureVMAppContainerProtectionContainer

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. AZURE_WORKLOAD_CONTAINER.
    :vartype container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.AZURE_WORKLOAD_CONTAINER
    :ivar source_resource_id: ARM ID of the virtual machine represented by this Azure Workload
     Container.
    :vartype source_resource_id: str
    :ivar last_updated_time: Time stamp when this container was updated.
    :vartype last_updated_time: ~datetime.datetime
    :ivar extended_info: Additional details of a workload container.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureWorkloadContainerExtendedInfo
    :ivar workload_type: Workload type for which registration was sent. Known values are:
     "Invalid", "VM", "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM",
     "SystemState", "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare",
     "SAPHanaDatabase", "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.WorkloadType
    :ivar operation_type: Re-Do Operation. Known values are: "Invalid", "Register", "Reregister",
     and "Rehydrate".
    :vartype operation_type: str or ~azure.mgmt.recoveryservicesbackup.models.OperationType
    """

    __mapping__: dict[str, _Model] = {}
    container_type: Literal[ProtectableContainerType.AZURE_WORKLOAD_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. AZURE_WORKLOAD_CONTAINER."""
    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ARM ID of the virtual machine represented by this Azure Workload Container."""
    last_updated_time: Optional[datetime.datetime] = rest_field(
        name="lastUpdatedTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Time stamp when this container was updated."""
    extended_info: Optional["_models.AzureWorkloadContainerExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional details of a workload container."""
    workload_type: Optional[Union[str, "_models.WorkloadType"]] = rest_field(
        name="workloadType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Workload type for which registration was sent. Known values are: \"Invalid\", \"VM\",
     \"FileFolder\", \"AzureSqlDb\", \"SQLDB\", \"Exchange\", \"Sharepoint\", \"VMwareVM\",
     \"SystemState\", \"Client\", \"GenericDataSource\", \"SQLDataBase\", \"AzureFileShare\",
     \"SAPHanaDatabase\", \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""
    operation_type: Optional[Union[str, "_models.OperationType"]] = rest_field(
        name="operationType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Re-Do Operation. Known values are: \"Invalid\", \"Register\", \"Reregister\", and
     \"Rehydrate\"."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        last_updated_time: Optional[datetime.datetime] = None,
        extended_info: Optional["_models.AzureWorkloadContainerExtendedInfo"] = None,
        workload_type: Optional[Union[str, "_models.WorkloadType"]] = None,
        operation_type: Optional[Union[str, "_models.OperationType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.AZURE_WORKLOAD_CONTAINER  # type: ignore


class AzureSQLAGWorkloadContainerProtectionContainer(
    AzureWorkloadContainer, discriminator="SQLAGWorkLoadContainer"
):  # pylint: disable=name-too-long
    """Container for SQL workloads under SQL Availability Group.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar source_resource_id: ARM ID of the virtual machine represented by this Azure Workload
     Container.
    :vartype source_resource_id: str
    :ivar last_updated_time: Time stamp when this container was updated.
    :vartype last_updated_time: ~datetime.datetime
    :ivar extended_info: Additional details of a workload container.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureWorkloadContainerExtendedInfo
    :ivar workload_type: Workload type for which registration was sent. Known values are:
     "Invalid", "VM", "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM",
     "SystemState", "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare",
     "SAPHanaDatabase", "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.WorkloadType
    :ivar operation_type: Re-Do Operation. Known values are: "Invalid", "Register", "Reregister",
     and "Rehydrate".
    :vartype operation_type: str or ~azure.mgmt.recoveryservicesbackup.models.OperationType
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. SQLAG_WORK_LOAD_CONTAINER.
    :vartype container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.SQLAG_WORK_LOAD_CONTAINER
    """

    container_type: Literal[ProtectableContainerType.SQLAG_WORK_LOAD_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. SQLAG_WORK_LOAD_CONTAINER."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        last_updated_time: Optional[datetime.datetime] = None,
        extended_info: Optional["_models.AzureWorkloadContainerExtendedInfo"] = None,
        workload_type: Optional[Union[str, "_models.WorkloadType"]] = None,
        operation_type: Optional[Union[str, "_models.OperationType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.SQLAG_WORK_LOAD_CONTAINER  # type: ignore


class AzureSqlContainer(ProtectionContainer, discriminator="AzureSqlContainer"):
    """Azure Sql workload-specific container.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. AZURE_SQL_CONTAINER.
    :vartype container_type: str or ~azure.mgmt.recoveryservicesbackup.models.AZURE_SQL_CONTAINER
    """

    container_type: Literal[ProtectableContainerType.AZURE_SQL_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. AZURE_SQL_CONTAINER."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.AZURE_SQL_CONTAINER  # type: ignore


class AzureSqlProtectedItem(ProtectedItem, discriminator="Microsoft.Sql/servers/databases"):
    """Azure SQL workload-specific backup item.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar protected_item_data_id: Internal ID of a backup item. Used by Azure SQL Backup engine to
     contact Recovery Services.
    :vartype protected_item_data_id: str
    :ivar protection_state: Backup state of the backed up item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectedItemState
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureSqlProtectedItemExtendedInfo
    :ivar protected_item_type: backup item type. Required. Default value is
     "Microsoft.Sql/servers/databases".
    :vartype protected_item_type: str
    """

    protected_item_data_id: Optional[str] = rest_field(
        name="protectedItemDataId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Internal ID of a backup item. Used by Azure SQL Backup engine to contact Recovery Services."""
    protection_state: Optional[Union[str, "_models.ProtectedItemState"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup state of the backed up item. Known values are: \"Invalid\", \"IRPending\",
     \"Protected\", \"ProtectionError\", \"ProtectionStopped\", \"ProtectionPaused\", and
     \"BackupsSuspended\"."""
    extended_info: Optional["_models.AzureSqlProtectedItemExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information for this backup item."""
    protected_item_type: Literal["Microsoft.Sql/servers/databases"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"Microsoft.Sql/servers/databases\"."""

    @overload
    def __init__(
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        protected_item_data_id: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectedItemState"]] = None,
        extended_info: Optional["_models.AzureSqlProtectedItemExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "Microsoft.Sql/servers/databases"  # type: ignore


class AzureSqlProtectedItemExtendedInfo(_Model):
    """Additional information on Azure Sql specific protected item.

    :ivar oldest_recovery_point: The oldest backup copy available for this item in the service.
    :vartype oldest_recovery_point: ~datetime.datetime
    :ivar recovery_point_count: Number of available backup copies associated with this backup item.
    :vartype recovery_point_count: int
    :ivar policy_state: State of the backup policy associated with this backup item.
    :vartype policy_state: str
    """

    oldest_recovery_point: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPoint", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The oldest backup copy available for this item in the service."""
    recovery_point_count: Optional[int] = rest_field(
        name="recoveryPointCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of available backup copies associated with this backup item."""
    policy_state: Optional[str] = rest_field(
        name="policyState", visibility=["read", "create", "update", "delete", "query"]
    )
    """State of the backup policy associated with this backup item."""

    @overload
    def __init__(
        self,
        *,
        oldest_recovery_point: Optional[datetime.datetime] = None,
        recovery_point_count: Optional[int] = None,
        policy_state: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureSqlProtectionPolicy(ProtectionPolicy, discriminator="AzureSql"):
    """Azure SQL workload-specific backup policy.

    :ivar protected_items_count: Number of items associated with this policy.
    :vartype protected_items_count: int
    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    :ivar retention_policy: Retention policy details.
    :vartype retention_policy: ~azure.mgmt.recoveryservicesbackup.models.RetentionPolicy
    :ivar backup_management_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is "AzureSql".
    :vartype backup_management_type: str
    """

    retention_policy: Optional["_models.RetentionPolicy"] = rest_field(
        name="retentionPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention policy details."""
    backup_management_type: Literal["AzureSql"] = rest_discriminator(name="backupManagementType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureSql\"."""

    @overload
    def __init__(
        self,
        *,
        protected_items_count: Optional[int] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        retention_policy: Optional["_models.RetentionPolicy"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.backup_management_type = "AzureSql"  # type: ignore


class AzureStorageContainer(ProtectionContainer, discriminator="StorageContainer"):
    """Azure Storage Account workload-specific container.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar source_resource_id: Fully qualified ARM url.
    :vartype source_resource_id: str
    :ivar storage_account_version: Storage account version.
    :vartype storage_account_version: str
    :ivar resource_group: Resource group name of Recovery Services Vault.
    :vartype resource_group: str
    :ivar protected_item_count: Number of items backed up in this container.
    :vartype protected_item_count: int
    :ivar acquire_storage_account_lock: Whether storage account lock is to be acquired for this
     container or not. Known values are: "Acquire" and "NotAcquire".
    :vartype acquire_storage_account_lock: str or
     ~azure.mgmt.recoveryservicesbackup.models.AcquireStorageAccountLock
    :ivar operation_type: Re-Do Operation. Known values are: "Invalid", "Register", "Reregister",
     and "Rehydrate".
    :vartype operation_type: str or ~azure.mgmt.recoveryservicesbackup.models.OperationType
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. STORAGE_CONTAINER.
    :vartype container_type: str or ~azure.mgmt.recoveryservicesbackup.models.STORAGE_CONTAINER
    """

    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM url."""
    storage_account_version: Optional[str] = rest_field(
        name="storageAccountVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Storage account version."""
    resource_group: Optional[str] = rest_field(
        name="resourceGroup", visibility=["read", "create", "update", "delete", "query"]
    )
    """Resource group name of Recovery Services Vault."""
    protected_item_count: Optional[int] = rest_field(
        name="protectedItemCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of items backed up in this container."""
    acquire_storage_account_lock: Optional[Union[str, "_models.AcquireStorageAccountLock"]] = rest_field(
        name="acquireStorageAccountLock", visibility=["read", "create", "update", "delete", "query"]
    )
    """Whether storage account lock is to be acquired for this container or not. Known values are:
     \"Acquire\" and \"NotAcquire\"."""
    operation_type: Optional[Union[str, "_models.OperationType"]] = rest_field(
        name="operationType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Re-Do Operation. Known values are: \"Invalid\", \"Register\", \"Reregister\", and
     \"Rehydrate\"."""
    container_type: Literal[ProtectableContainerType.STORAGE_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. STORAGE_CONTAINER."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        storage_account_version: Optional[str] = None,
        resource_group: Optional[str] = None,
        protected_item_count: Optional[int] = None,
        acquire_storage_account_lock: Optional[Union[str, "_models.AcquireStorageAccountLock"]] = None,
        operation_type: Optional[Union[str, "_models.OperationType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.STORAGE_CONTAINER  # type: ignore


class AzureStorageErrorInfo(_Model):
    """Azure storage specific error information.

    :ivar error_code: Error code.
    :vartype error_code: int
    :ivar error_string: Localized error string.
    :vartype error_string: str
    :ivar recommendations: List of localized recommendations for above error code.
    :vartype recommendations: list[str]
    """

    error_code: Optional[int] = rest_field(name="errorCode", visibility=["read", "create", "update", "delete", "query"])
    """Error code."""
    error_string: Optional[str] = rest_field(
        name="errorString", visibility=["read", "create", "update", "delete", "query"]
    )
    """Localized error string."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """List of localized recommendations for above error code."""

    @overload
    def __init__(
        self,
        *,
        error_code: Optional[int] = None,
        error_string: Optional[str] = None,
        recommendations: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureStorageJob(Job, discriminator="AzureStorageJob"):
    """Azure storage specific job.

    :ivar entity_friendly_name: Friendly name of the entity on which the current job is executing.
    :vartype entity_friendly_name: str
    :ivar backup_management_type: Backup management type to execute the current job. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar operation: The operation name.
    :vartype operation: str
    :ivar status: Job status.
    :vartype status: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar activity_id: ActivityId of job.
    :vartype activity_id: str
    :ivar duration: Time elapsed during the execution of this job.
    :vartype duration: ~datetime.timedelta
    :ivar actions_info: Gets or sets the state/actions applicable on this job like cancel/retry.
    :vartype actions_info: list[str or
     ~azure.mgmt.recoveryservicesbackup.models.JobSupportedAction]
    :ivar error_details: Error details on execution of this job.
    :vartype error_details: list[~azure.mgmt.recoveryservicesbackup.models.AzureStorageErrorInfo]
    :ivar storage_account_name: Specifies friendly name of the storage account.
    :vartype storage_account_name: str
    :ivar storage_account_version: Specifies whether the Storage account is a Classic or an Azure
     Resource Manager Storage account.
    :vartype storage_account_version: str
    :ivar extended_info: Additional information about the job.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.AzureStorageJobExtendedInfo
    :ivar is_user_triggered: Indicated that whether the job is adhoc(true) or scheduled(false).
    :vartype is_user_triggered: bool
    :ivar job_type: This property will be used as the discriminator for deciding the specific types
     in the polymorphic chain of types. Required. Default value is "AzureStorageJob".
    :vartype job_type: str
    """

    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed during the execution of this job."""
    actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = rest_field(
        name="actionsInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets the state/actions applicable on this job like cancel/retry."""
    error_details: Optional[list["_models.AzureStorageErrorInfo"]] = rest_field(
        name="errorDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error details on execution of this job."""
    storage_account_name: Optional[str] = rest_field(
        name="storageAccountName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies friendly name of the storage account."""
    storage_account_version: Optional[str] = rest_field(
        name="storageAccountVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies whether the Storage account is a Classic or an Azure Resource Manager Storage
     account."""
    extended_info: Optional["_models.AzureStorageJobExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information about the job."""
    is_user_triggered: Optional[bool] = rest_field(
        name="isUserTriggered", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicated that whether the job is adhoc(true) or scheduled(false)."""
    job_type: Literal["AzureStorageJob"] = rest_discriminator(name="jobType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureStorageJob\"."""

    @overload
    def __init__(
        self,
        *,
        entity_friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        operation: Optional[str] = None,
        status: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        activity_id: Optional[str] = None,
        duration: Optional[datetime.timedelta] = None,
        actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = None,
        error_details: Optional[list["_models.AzureStorageErrorInfo"]] = None,
        storage_account_name: Optional[str] = None,
        storage_account_version: Optional[str] = None,
        extended_info: Optional["_models.AzureStorageJobExtendedInfo"] = None,
        is_user_triggered: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.job_type = "AzureStorageJob"  # type: ignore


class AzureStorageJobExtendedInfo(_Model):
    """Azure Storage workload-specific additional information for job.

    :ivar tasks_list: List of tasks for this job.
    :vartype tasks_list: list[~azure.mgmt.recoveryservicesbackup.models.AzureStorageJobTaskDetails]
    :ivar property_bag: Job properties.
    :vartype property_bag: dict[str, str]
    :ivar dynamic_error_message: Non localized error message on job execution.
    :vartype dynamic_error_message: str
    """

    tasks_list: Optional[list["_models.AzureStorageJobTaskDetails"]] = rest_field(
        name="tasksList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of tasks for this job."""
    property_bag: Optional[dict[str, str]] = rest_field(
        name="propertyBag", visibility=["read", "create", "update", "delete", "query"]
    )
    """Job properties."""
    dynamic_error_message: Optional[str] = rest_field(
        name="dynamicErrorMessage", visibility=["read", "create", "update", "delete", "query"]
    )
    """Non localized error message on job execution."""

    @overload
    def __init__(
        self,
        *,
        tasks_list: Optional[list["_models.AzureStorageJobTaskDetails"]] = None,
        property_bag: Optional[dict[str, str]] = None,
        dynamic_error_message: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureStorageJobTaskDetails(_Model):
    """Azure storage workload specific job task details.

    :ivar task_id: The task display name.
    :vartype task_id: str
    :ivar status: The status.
    :vartype status: str
    """

    task_id: Optional[str] = rest_field(name="taskId", visibility=["read", "create", "update", "delete", "query"])
    """The task display name."""
    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """The status."""

    @overload
    def __init__(
        self,
        *,
        task_id: Optional[str] = None,
        status: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ProtectableContainer(_Model):
    """Protectable Container Class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureStorageProtectableContainer, AzureVMAppContainerProtectableContainer

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar protectable_container_type: Type of the container. The value of this property for

     1. Compute Azure VM is Microsoft.Compute/virtualMachines
     2. Classic Compute Azure VM is Microsoft.ClassicCompute/virtualMachines. Required. Known values
     are: "Invalid", "Unknown", "IaasVMContainer", "IaasVMServiceContainer", "DPMContainer",
     "AzureBackupServerContainer", "MABContainer", "Cluster", "AzureSqlContainer", "Windows",
     "VCenter", "VMAppContainer", "SQLAGWorkLoadContainer", "StorageContainer", "GenericContainer",
     "Microsoft.ClassicCompute/virtualMachines", "Microsoft.Compute/virtualMachines", and
     "AzureWorkloadContainer".
    :vartype protectable_container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectableContainerType
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar container_id: Fabric Id of the container such as ARM Id.
    :vartype container_id: str
    """

    __mapping__: dict[str, _Model] = {}
    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the container."""
    backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = rest_field(
        name="backupManagementType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup management for the container. Known values are: \"Invalid\", \"AzureIaasVM\",
     \"MAB\", \"DPM\", \"AzureBackupServer\", \"AzureSql\", \"AzureStorage\", \"AzureWorkload\", and
     \"DefaultBackup\"."""
    protectable_container_type: str = rest_discriminator(
        name="protectableContainerType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the container. The value of this property for
     
     1. Compute Azure VM is Microsoft.Compute/virtualMachines
     2. Classic Compute Azure VM is Microsoft.ClassicCompute/virtualMachines. Required. Known values
     are: \"Invalid\", \"Unknown\", \"IaasVMContainer\", \"IaasVMServiceContainer\",
     \"DPMContainer\", \"AzureBackupServerContainer\", \"MABContainer\", \"Cluster\",
     \"AzureSqlContainer\", \"Windows\", \"VCenter\", \"VMAppContainer\",
     \"SQLAGWorkLoadContainer\", \"StorageContainer\", \"GenericContainer\",
     \"Microsoft.ClassicCompute/virtualMachines\", \"Microsoft.Compute/virtualMachines\", and
     \"AzureWorkloadContainer\"."""
    health_status: Optional[str] = rest_field(
        name="healthStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Status of health of the container."""
    container_id: Optional[str] = rest_field(
        name="containerId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fabric Id of the container such as ARM Id."""

    @overload
    def __init__(
        self,
        *,
        protectable_container_type: str,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        health_status: Optional[str] = None,
        container_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureStorageProtectableContainer(ProtectableContainer, discriminator="StorageContainer"):
    """Azure Storage-specific protectable containers.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar container_id: Fabric Id of the container such as ARM Id.
    :vartype container_id: str
    :ivar protectable_container_type: Type of the container. The value of this property for

     1. Compute Azure VM is Microsoft.Compute/virtualMachines
     2. Classic Compute Azure VM is Microsoft.ClassicCompute/virtualMachines. Required.
     STORAGE_CONTAINER.
    :vartype protectable_container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.STORAGE_CONTAINER
    """

    protectable_container_type: Literal[ProtectableContainerType.STORAGE_CONTAINER] = rest_discriminator(name="protectableContainerType", visibility=["read"])  # type: ignore
    """Type of the container. The value of this property for
     
     1. Compute Azure VM is Microsoft.Compute/virtualMachines
     2. Classic Compute Azure VM is Microsoft.ClassicCompute/virtualMachines. Required.
     STORAGE_CONTAINER."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        health_status: Optional[str] = None,
        container_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_container_type = ProtectableContainerType.STORAGE_CONTAINER  # type: ignore


class AzureVMAppContainerProtectableContainer(ProtectableContainer, discriminator="VMAppContainer"):
    """Azure workload-specific container.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar container_id: Fabric Id of the container such as ARM Id.
    :vartype container_id: str
    :ivar protectable_container_type: Type of the container. The value of this property for

     1. Compute Azure VM is Microsoft.Compute/virtualMachines
     2. Classic Compute Azure VM is Microsoft.ClassicCompute/virtualMachines. Required.
     VM_APP_CONTAINER.
    :vartype protectable_container_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.VM_APP_CONTAINER
    """

    protectable_container_type: Literal[ProtectableContainerType.VM_APP_CONTAINER] = rest_discriminator(name="protectableContainerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for
     
     1. Compute Azure VM is Microsoft.Compute/virtualMachines
     2. Classic Compute Azure VM is Microsoft.ClassicCompute/virtualMachines. Required.
     VM_APP_CONTAINER."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        health_status: Optional[str] = None,
        container_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_container_type = ProtectableContainerType.VM_APP_CONTAINER  # type: ignore


class AzureVMAppContainerProtectionContainer(AzureWorkloadContainer, discriminator="VMAppContainer"):
    """Container for SQL workloads under Azure Virtual Machines.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar source_resource_id: ARM ID of the virtual machine represented by this Azure Workload
     Container.
    :vartype source_resource_id: str
    :ivar last_updated_time: Time stamp when this container was updated.
    :vartype last_updated_time: ~datetime.datetime
    :ivar extended_info: Additional details of a workload container.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureWorkloadContainerExtendedInfo
    :ivar workload_type: Workload type for which registration was sent. Known values are:
     "Invalid", "VM", "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM",
     "SystemState", "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare",
     "SAPHanaDatabase", "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.WorkloadType
    :ivar operation_type: Re-Do Operation. Known values are: "Invalid", "Register", "Reregister",
     and "Rehydrate".
    :vartype operation_type: str or ~azure.mgmt.recoveryservicesbackup.models.OperationType
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. VM_APP_CONTAINER.
    :vartype container_type: str or ~azure.mgmt.recoveryservicesbackup.models.VM_APP_CONTAINER
    """

    container_type: Literal[ProtectableContainerType.VM_APP_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. VM_APP_CONTAINER."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        last_updated_time: Optional[datetime.datetime] = None,
        extended_info: Optional["_models.AzureWorkloadContainerExtendedInfo"] = None,
        workload_type: Optional[Union[str, "_models.WorkloadType"]] = None,
        operation_type: Optional[Union[str, "_models.OperationType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.VM_APP_CONTAINER  # type: ignore


class AzureVMResourceFeatureSupportRequest(FeatureSupportRequest, discriminator="AzureVMResourceBackup"):
    """AzureResource(IaaS VM) Specific feature support request.

    :ivar vm_size: Size of the resource: VM size(A/D series etc) in case of IaasVM.
    :vartype vm_size: str
    :ivar vm_sku: SKUs (Premium/Managed etc) in case of IaasVM.
    :vartype vm_sku: str
    :ivar feature_type: backup support feature type. Required. Default value is
     "AzureVMResourceBackup".
    :vartype feature_type: str
    """

    vm_size: Optional[str] = rest_field(name="vmSize", visibility=["read", "create", "update", "delete", "query"])
    """Size of the resource: VM size(A/D series etc) in case of IaasVM."""
    vm_sku: Optional[str] = rest_field(name="vmSku", visibility=["read", "create", "update", "delete", "query"])
    """SKUs (Premium/Managed etc) in case of IaasVM."""
    feature_type: Literal["AzureVMResourceBackup"] = rest_discriminator(name="featureType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup support feature type. Required. Default value is \"AzureVMResourceBackup\"."""

    @overload
    def __init__(
        self,
        *,
        vm_size: Optional[str] = None,
        vm_sku: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.feature_type = "AzureVMResourceBackup"  # type: ignore


class AzureVMResourceFeatureSupportResponse(_Model):
    """Response for feature support requests for Azure IaasVm.

    :ivar support_status: Support status of feature. Known values are: "Invalid", "Supported",
     "DefaultOFF", "DefaultON", and "NotSupported".
    :vartype support_status: str or ~azure.mgmt.recoveryservicesbackup.models.SupportStatus
    """

    support_status: Optional[Union[str, "_models.SupportStatus"]] = rest_field(
        name="supportStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Support status of feature. Known values are: \"Invalid\", \"Supported\", \"DefaultOFF\",
     \"DefaultON\", and \"NotSupported\"."""

    @overload
    def __init__(
        self,
        *,
        support_status: Optional[Union[str, "_models.SupportStatus"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class WorkloadItem(_Model):
    """Base class for backup item. Workload-specific backup items are derived from this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureVmWorkloadItem, AzureVmWorkloadSAPAseDatabaseWorkloadItem,
    AzureVmWorkloadSAPAseSystemWorkloadItem, AzureVmWorkloadSAPHanaDatabaseWorkloadItem,
    AzureVmWorkloadSAPHanaSystemWorkloadItem, AzureVmWorkloadSQLDatabaseWorkloadItem,
    AzureVmWorkloadSQLInstanceWorkloadItem

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar workload_item_type: Type of the backup item. Required. Default value is None.
    :vartype workload_item_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    """

    __mapping__: dict[str, _Model] = {}
    backup_management_type: Optional[str] = rest_field(
        name="backupManagementType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup management to backup an item."""
    workload_type: Optional[str] = rest_field(
        name="workloadType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of workload for the backup management."""
    workload_item_type: str = rest_discriminator(
        name="workloadItemType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the backup item. Required. Default value is None."""
    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the backup item."""
    protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """State of the back up item. Known values are: \"Invalid\", \"NotProtected\", \"Protecting\",
     \"Protected\", and \"ProtectionFailed\"."""

    @overload
    def __init__(
        self,
        *,
        workload_item_type: str,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureVmWorkloadItem(WorkloadItem, discriminator="AzureVmWorkloadItem"):
    """Azure VM workload-specific workload item.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureVmWorkloadSAPAseDatabaseWorkloadItem, AzureVmWorkloadSAPAseSystemWorkloadItem,
    AzureVmWorkloadSAPHanaDatabaseWorkloadItem, AzureVmWorkloadSAPHanaSystemWorkloadItem,
    AzureVmWorkloadSQLDatabaseWorkloadItem, AzureVmWorkloadSQLInstanceWorkloadItem

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar workload_item_type: Type of the backup item. Required. Default value is
     "AzureVmWorkloadItem".
    :vartype workload_item_type: str
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if workload item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar sub_workload_item_count: For instance or AG, indicates number of DB's to be protected.
    :vartype sub_workload_item_count: int
    """

    __mapping__: dict[str, _Model] = {}
    workload_item_type: Literal["AzureVmWorkloadItem"] = rest_discriminator(name="workloadItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"AzureVmWorkloadItem\"."""
    parent_name: Optional[str] = rest_field(
        name="parentName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name for instance or AG."""
    server_name: Optional[str] = rest_field(
        name="serverName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Host/Cluster Name for instance or AG."""
    is_auto_protectable: Optional[bool] = rest_field(
        name="isAutoProtectable", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates if workload item is auto-protectable."""
    subinquireditemcount: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """For instance or AG, indicates number of DB's present."""
    sub_workload_item_count: Optional[int] = rest_field(
        name="subWorkloadItemCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """For instance or AG, indicates number of DB's to be protected."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        sub_workload_item_count: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.workload_item_type = "AzureVmWorkloadItem"  # type: ignore


class AzureVmWorkloadProtectableItem(WorkloadProtectableItem, discriminator="AzureVmWorkloadProtectableItem"):
    """Azure VM workload-specific protectable item.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureVmWorkloadSAPHanaHSRProtectableItem, AzureVmWorkloadSAPHanaScaleoutProtectableItem,
    AzureVmWorkloadSAPAseDatabaseProtectableItem, AzureVmWorkloadSAPAseSystemProtectableItem,
    AzureVmWorkloadSAPHanaDBInstance, AzureVmWorkloadSAPHanaDatabaseProtectableItem,
    AzureVmWorkloadSAPHanaSystemProtectableItem,
    AzureVmWorkloadSQLAvailabilityGroupProtectableItem, AzureVmWorkloadSQLDatabaseProtectableItem,
    AzureVmWorkloadSQLInstanceProtectableItem

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "AzureVmWorkloadProtectableItem".
    :vartype protectable_item_type: str
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    """

    __mapping__: dict[str, _Model] = {}
    protectable_item_type: Literal["AzureVmWorkloadProtectableItem"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"AzureVmWorkloadProtectableItem\"."""
    parent_name: Optional[str] = rest_field(
        name="parentName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name for instance or AG."""
    parent_unique_name: Optional[str] = rest_field(
        name="parentUniqueName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Parent Unique Name is added to provide the service formatted URI Name of the Parent Only
     Applicable for data bases where the parent would be either Instance or a SQL AG."""
    server_name: Optional[str] = rest_field(
        name="serverName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Host/Cluster Name for instance or AG."""
    is_auto_protectable: Optional[bool] = rest_field(
        name="isAutoProtectable", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates if protectable item is auto-protectable."""
    is_auto_protected: Optional[bool] = rest_field(
        name="isAutoProtected", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates if protectable item is auto-protected."""
    subinquireditemcount: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """For instance or AG, indicates number of DB's present."""
    subprotectableitemcount: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """For instance or AG, indicates number of DB's to be protected."""
    prebackupvalidation: Optional["_models.PreBackupValidation"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Pre-backup validation for protectable objects."""
    is_protectable: Optional[bool] = rest_field(
        name="isProtectable", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates if item is protectable."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "AzureVmWorkloadProtectableItem"  # type: ignore


class AzureVmWorkloadProtectedItem(ProtectedItem, discriminator="AzureVmWorkloadProtectedItem"):
    """Azure VM workload-specific protected item.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureVmWorkloadSAPAseDatabaseProtectedItem, AzureVmWorkloadSAPHanaDBInstanceProtectedItem,
    AzureVmWorkloadSAPHanaDatabaseProtectedItem, AzureVmWorkloadSQLDatabaseProtectedItem,
    AzureVmWorkloadSQLInstanceProtectedItem

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar protected_item_type: backup item type. Required. Default value is
     "AzureVmWorkloadProtectedItem".
    :vartype protected_item_type: str
    :ivar friendly_name: Friendly name of the DB represented by this backup item.
    :vartype friendly_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar parent_name: Parent name of the DB such as Instance or Availability Group.
    :vartype parent_name: str
    :ivar parent_type: Parent type of protected item, example: for a DB, standalone server or
     distributed.
    :vartype parent_type: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar last_backup_status: Last backup operation status. Possible values: Healthy, Unhealthy.
     Known values are: "Invalid", "Healthy", "Unhealthy", and "IRPending".
    :vartype last_backup_status: str or ~azure.mgmt.recoveryservicesbackup.models.LastBackupStatus
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar last_backup_error_detail: Error details in last backup.
    :vartype last_backup_error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar protected_item_data_source_id: Data ID of the protected item.
    :vartype protected_item_data_source_id: str
    :ivar protected_item_health_status: Health status of the backup item, evaluated based on last
     heartbeat received. Known values are: "Invalid", "Healthy", "Unhealthy", "NotReachable", and
     "IRPending".
    :vartype protected_item_health_status: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectedItemHealthStatus
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureVmWorkloadProtectedItemExtendedInfo
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar nodes_list: List of the nodes in case of distributed container.
    :vartype nodes_list: list[~azure.mgmt.recoveryservicesbackup.models.DistributedNodesInfo]
    """

    __mapping__: dict[str, _Model] = {}
    protected_item_type: Literal["AzureVmWorkloadProtectedItem"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"AzureVmWorkloadProtectedItem\"."""
    friendly_name: Optional[str] = rest_field(name="friendlyName", visibility=["read"])
    """Friendly name of the DB represented by this backup item."""
    server_name: Optional[str] = rest_field(
        name="serverName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Host/Cluster Name for instance or AG."""
    parent_name: Optional[str] = rest_field(
        name="parentName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Parent name of the DB such as Instance or Availability Group."""
    parent_type: Optional[str] = rest_field(
        name="parentType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Parent type of protected item, example: for a DB, standalone server or distributed."""
    protection_status: Optional[str] = rest_field(name="protectionStatus", visibility=["read"])
    """Backup status of this backup item."""
    protection_state: Optional[Union[str, "_models.ProtectionState"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup state of this backup item. Known values are: \"Invalid\", \"IRPending\", \"Protected\",
     \"ProtectionError\", \"ProtectionStopped\", \"ProtectionPaused\", and \"BackupsSuspended\"."""
    last_backup_status: Optional[Union[str, "_models.LastBackupStatus"]] = rest_field(
        name="lastBackupStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Last backup operation status. Possible values: Healthy, Unhealthy. Known values are:
     \"Invalid\", \"Healthy\", \"Unhealthy\", and \"IRPending\"."""
    last_backup_time: Optional[datetime.datetime] = rest_field(
        name="lastBackupTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Timestamp of the last backup operation on this backup item."""
    last_backup_error_detail: Optional["_models.ErrorDetail"] = rest_field(
        name="lastBackupErrorDetail", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error details in last backup."""
    protected_item_data_source_id: Optional[str] = rest_field(
        name="protectedItemDataSourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Data ID of the protected item."""
    protected_item_health_status: Optional[Union[str, "_models.ProtectedItemHealthStatus"]] = rest_field(
        name="protectedItemHealthStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Health status of the backup item, evaluated based on last heartbeat received. Known values are:
     \"Invalid\", \"Healthy\", \"Unhealthy\", \"NotReachable\", and \"IRPending\"."""
    extended_info: Optional["_models.AzureVmWorkloadProtectedItemExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information for this backup item."""
    kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = rest_field(
        name="kpisHealths", visibility=["read", "create", "update", "delete", "query"]
    )
    """Health details of different KPIs."""
    nodes_list: Optional[list["_models.DistributedNodesInfo"]] = rest_field(
        name="nodesList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of the nodes in case of distributed container."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        server_name: Optional[str] = None,
        parent_name: Optional[str] = None,
        parent_type: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        last_backup_status: Optional[Union[str, "_models.LastBackupStatus"]] = None,
        last_backup_time: Optional[datetime.datetime] = None,
        last_backup_error_detail: Optional["_models.ErrorDetail"] = None,
        protected_item_data_source_id: Optional[str] = None,
        protected_item_health_status: Optional[Union[str, "_models.ProtectedItemHealthStatus"]] = None,
        extended_info: Optional["_models.AzureVmWorkloadProtectedItemExtendedInfo"] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        nodes_list: Optional[list["_models.DistributedNodesInfo"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "AzureVmWorkloadProtectedItem"  # type: ignore


class AzureVmWorkloadProtectedItemExtendedInfo(_Model):
    """Additional information on Azure Workload for SQL specific backup item.

    :ivar oldest_recovery_point: The oldest backup copy available for this backup item across all
     tiers.
    :vartype oldest_recovery_point: ~datetime.datetime
    :ivar oldest_recovery_point_in_vault: The oldest backup copy available for this backup item in
     vault tier.
    :vartype oldest_recovery_point_in_vault: ~datetime.datetime
    :ivar oldest_recovery_point_in_archive: The oldest backup copy available for this backup item
     in archive tier.
    :vartype oldest_recovery_point_in_archive: ~datetime.datetime
    :ivar newest_recovery_point_in_archive: The latest backup copy available for this backup item
     in archive tier.
    :vartype newest_recovery_point_in_archive: ~datetime.datetime
    :ivar recovery_point_count: Number of backup copies available for this backup item.
    :vartype recovery_point_count: int
    :ivar policy_state: Indicates consistency of policy object and policy applied to this backup
     item.
    :vartype policy_state: str
    :ivar recovery_model: Indicates consistency of policy object and policy applied to this backup
     item.
    :vartype recovery_model: str
    """

    oldest_recovery_point: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPoint", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The oldest backup copy available for this backup item across all tiers."""
    oldest_recovery_point_in_vault: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPointInVault", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The oldest backup copy available for this backup item in vault tier."""
    oldest_recovery_point_in_archive: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPointInArchive",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """The oldest backup copy available for this backup item in archive tier."""
    newest_recovery_point_in_archive: Optional[datetime.datetime] = rest_field(
        name="newestRecoveryPointInArchive",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """The latest backup copy available for this backup item in archive tier."""
    recovery_point_count: Optional[int] = rest_field(
        name="recoveryPointCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of backup copies available for this backup item."""
    policy_state: Optional[str] = rest_field(
        name="policyState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates consistency of policy object and policy applied to this backup item."""
    recovery_model: Optional[str] = rest_field(
        name="recoveryModel", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates consistency of policy object and policy applied to this backup item."""

    @overload
    def __init__(
        self,
        *,
        oldest_recovery_point: Optional[datetime.datetime] = None,
        oldest_recovery_point_in_vault: Optional[datetime.datetime] = None,
        oldest_recovery_point_in_archive: Optional[datetime.datetime] = None,
        newest_recovery_point_in_archive: Optional[datetime.datetime] = None,
        recovery_point_count: Optional[int] = None,
        policy_state: Optional[str] = None,
        recovery_model: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureVmWorkloadProtectionPolicy(ProtectionPolicy, discriminator="AzureWorkload"):
    """Azure VM (Mercury) workload-specific backup policy.

    :ivar protected_items_count: Number of items associated with this policy.
    :vartype protected_items_count: int
    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    :ivar work_load_type: Type of workload for the backup management. Known values are: "Invalid",
     "VM", "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype work_load_type: str or ~azure.mgmt.recoveryservicesbackup.models.WorkloadType
    :ivar vm_workload_policy_type: Type of the protection policy. Known values are: "Invalid",
     "SnapshotV1", "SnapshotV2", and "Streaming".
    :vartype vm_workload_policy_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.VMWorkloadPolicyType
    :ivar settings: Common settings for the backup management.
    :vartype settings: ~azure.mgmt.recoveryservicesbackup.models.Settings
    :ivar sub_protection_policy: List of sub-protection policies which includes schedule and
     retention.
    :vartype sub_protection_policy:
     list[~azure.mgmt.recoveryservicesbackup.models.SubProtectionPolicy]
    :ivar make_policy_consistent: Fix the policy inconsistency.
    :vartype make_policy_consistent: bool
    :ivar backup_management_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is "AzureWorkload".
    :vartype backup_management_type: str
    """

    work_load_type: Optional[Union[str, "_models.WorkloadType"]] = rest_field(
        name="workLoadType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of workload for the backup management. Known values are: \"Invalid\", \"VM\",
     \"FileFolder\", \"AzureSqlDb\", \"SQLDB\", \"Exchange\", \"Sharepoint\", \"VMwareVM\",
     \"SystemState\", \"Client\", \"GenericDataSource\", \"SQLDataBase\", \"AzureFileShare\",
     \"SAPHanaDatabase\", \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""
    vm_workload_policy_type: Optional[Union[str, "_models.VMWorkloadPolicyType"]] = rest_field(
        name="vmWorkloadPolicyType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the protection policy. Known values are: \"Invalid\", \"SnapshotV1\", \"SnapshotV2\",
     and \"Streaming\"."""
    settings: Optional["_models.Settings"] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Common settings for the backup management."""
    sub_protection_policy: Optional[list["_models.SubProtectionPolicy"]] = rest_field(
        name="subProtectionPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of sub-protection policies which includes schedule and retention."""
    make_policy_consistent: Optional[bool] = rest_field(
        name="makePolicyConsistent", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fix the policy inconsistency."""
    backup_management_type: Literal["AzureWorkload"] = rest_discriminator(name="backupManagementType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkload\"."""

    @overload
    def __init__(
        self,
        *,
        protected_items_count: Optional[int] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        work_load_type: Optional[Union[str, "_models.WorkloadType"]] = None,
        vm_workload_policy_type: Optional[Union[str, "_models.VMWorkloadPolicyType"]] = None,
        settings: Optional["_models.Settings"] = None,
        sub_protection_policy: Optional[list["_models.SubProtectionPolicy"]] = None,
        make_policy_consistent: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.backup_management_type = "AzureWorkload"  # type: ignore


class AzureVmWorkloadSAPAseDatabaseProtectableItem(
    AzureVmWorkloadProtectableItem, discriminator="SAPAseDatabase"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protectable item representing SAP ASE Database.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "SAPAseDatabase".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["SAPAseDatabase"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPAseDatabase\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "SAPAseDatabase"  # type: ignore


class AzureVmWorkloadSAPAseDatabaseProtectedItem(
    AzureVmWorkloadProtectedItem, discriminator="AzureVmWorkloadSAPAseDatabase"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protected item representing SAP ASE Database.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the DB represented by this backup item.
    :vartype friendly_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar parent_name: Parent name of the DB such as Instance or Availability Group.
    :vartype parent_name: str
    :ivar parent_type: Parent type of protected item, example: for a DB, standalone server or
     distributed.
    :vartype parent_type: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar last_backup_status: Last backup operation status. Possible values: Healthy, Unhealthy.
     Known values are: "Invalid", "Healthy", "Unhealthy", and "IRPending".
    :vartype last_backup_status: str or ~azure.mgmt.recoveryservicesbackup.models.LastBackupStatus
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar last_backup_error_detail: Error details in last backup.
    :vartype last_backup_error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar protected_item_data_source_id: Data ID of the protected item.
    :vartype protected_item_data_source_id: str
    :ivar protected_item_health_status: Health status of the backup item, evaluated based on last
     heartbeat received. Known values are: "Invalid", "Healthy", "Unhealthy", "NotReachable", and
     "IRPending".
    :vartype protected_item_health_status: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectedItemHealthStatus
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureVmWorkloadProtectedItemExtendedInfo
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar nodes_list: List of the nodes in case of distributed container.
    :vartype nodes_list: list[~azure.mgmt.recoveryservicesbackup.models.DistributedNodesInfo]
    :ivar protected_item_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "AzureVmWorkloadSAPAseDatabase".
    :vartype protected_item_type: str
    """

    protected_item_type: Literal["AzureVmWorkloadSAPAseDatabase"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureVmWorkloadSAPAseDatabase\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        server_name: Optional[str] = None,
        parent_name: Optional[str] = None,
        parent_type: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        last_backup_status: Optional[Union[str, "_models.LastBackupStatus"]] = None,
        last_backup_time: Optional[datetime.datetime] = None,
        last_backup_error_detail: Optional["_models.ErrorDetail"] = None,
        protected_item_data_source_id: Optional[str] = None,
        protected_item_health_status: Optional[Union[str, "_models.ProtectedItemHealthStatus"]] = None,
        extended_info: Optional["_models.AzureVmWorkloadProtectedItemExtendedInfo"] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        nodes_list: Optional[list["_models.DistributedNodesInfo"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "AzureVmWorkloadSAPAseDatabase"  # type: ignore


class AzureVmWorkloadSAPAseDatabaseWorkloadItem(
    AzureVmWorkloadItem, discriminator="SAPAseDatabase"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific workload item representing SAP ASE Database.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if workload item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar sub_workload_item_count: For instance or AG, indicates number of DB's to be protected.
    :vartype sub_workload_item_count: int
    :ivar workload_item_type: Type of the backup item. Required. Default value is "SAPAseDatabase".
    :vartype workload_item_type: str
    """

    workload_item_type: Literal["SAPAseDatabase"] = rest_discriminator(name="workloadItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPAseDatabase\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        sub_workload_item_count: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.workload_item_type = "SAPAseDatabase"  # type: ignore


class AzureVmWorkloadSAPAseSystemProtectableItem(
    AzureVmWorkloadProtectableItem, discriminator="SAPAseSystem"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protectable item representing SAP ASE System.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "SAPAseSystem".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["SAPAseSystem"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPAseSystem\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "SAPAseSystem"  # type: ignore


class AzureVmWorkloadSAPAseSystemWorkloadItem(AzureVmWorkloadItem, discriminator="SAPAseSystem"):
    """Azure VM workload-specific workload item representing SAP ASE System.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if workload item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar sub_workload_item_count: For instance or AG, indicates number of DB's to be protected.
    :vartype sub_workload_item_count: int
    :ivar workload_item_type: Type of the backup item. Required. Default value is "SAPAseSystem".
    :vartype workload_item_type: str
    """

    workload_item_type: Literal["SAPAseSystem"] = rest_discriminator(name="workloadItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPAseSystem\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        sub_workload_item_count: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.workload_item_type = "SAPAseSystem"  # type: ignore


class AzureVmWorkloadSAPHanaDatabaseProtectableItem(
    AzureVmWorkloadProtectableItem, discriminator="SAPHanaDatabase"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protectable item representing SAP HANA Database.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "SAPHanaDatabase".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["SAPHanaDatabase"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPHanaDatabase\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "SAPHanaDatabase"  # type: ignore


class AzureVmWorkloadSAPHanaDatabaseProtectedItem(
    AzureVmWorkloadProtectedItem, discriminator="AzureVmWorkloadSAPHanaDatabase"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protected item representing SAP HANA Database.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the DB represented by this backup item.
    :vartype friendly_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar parent_name: Parent name of the DB such as Instance or Availability Group.
    :vartype parent_name: str
    :ivar parent_type: Parent type of protected item, example: for a DB, standalone server or
     distributed.
    :vartype parent_type: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar last_backup_status: Last backup operation status. Possible values: Healthy, Unhealthy.
     Known values are: "Invalid", "Healthy", "Unhealthy", and "IRPending".
    :vartype last_backup_status: str or ~azure.mgmt.recoveryservicesbackup.models.LastBackupStatus
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar last_backup_error_detail: Error details in last backup.
    :vartype last_backup_error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar protected_item_data_source_id: Data ID of the protected item.
    :vartype protected_item_data_source_id: str
    :ivar protected_item_health_status: Health status of the backup item, evaluated based on last
     heartbeat received. Known values are: "Invalid", "Healthy", "Unhealthy", "NotReachable", and
     "IRPending".
    :vartype protected_item_health_status: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectedItemHealthStatus
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureVmWorkloadProtectedItemExtendedInfo
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar nodes_list: List of the nodes in case of distributed container.
    :vartype nodes_list: list[~azure.mgmt.recoveryservicesbackup.models.DistributedNodesInfo]
    :ivar protected_item_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "AzureVmWorkloadSAPHanaDatabase".
    :vartype protected_item_type: str
    """

    protected_item_type: Literal["AzureVmWorkloadSAPHanaDatabase"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureVmWorkloadSAPHanaDatabase\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        server_name: Optional[str] = None,
        parent_name: Optional[str] = None,
        parent_type: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        last_backup_status: Optional[Union[str, "_models.LastBackupStatus"]] = None,
        last_backup_time: Optional[datetime.datetime] = None,
        last_backup_error_detail: Optional["_models.ErrorDetail"] = None,
        protected_item_data_source_id: Optional[str] = None,
        protected_item_health_status: Optional[Union[str, "_models.ProtectedItemHealthStatus"]] = None,
        extended_info: Optional["_models.AzureVmWorkloadProtectedItemExtendedInfo"] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        nodes_list: Optional[list["_models.DistributedNodesInfo"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "AzureVmWorkloadSAPHanaDatabase"  # type: ignore


class AzureVmWorkloadSAPHanaDatabaseWorkloadItem(
    AzureVmWorkloadItem, discriminator="SAPHanaDatabase"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific workload item representing SAP HANA Database.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if workload item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar sub_workload_item_count: For instance or AG, indicates number of DB's to be protected.
    :vartype sub_workload_item_count: int
    :ivar workload_item_type: Type of the backup item. Required. Default value is
     "SAPHanaDatabase".
    :vartype workload_item_type: str
    """

    workload_item_type: Literal["SAPHanaDatabase"] = rest_discriminator(name="workloadItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPHanaDatabase\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        sub_workload_item_count: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.workload_item_type = "SAPHanaDatabase"  # type: ignore


class AzureVmWorkloadSAPHanaDBInstance(AzureVmWorkloadProtectableItem, discriminator="SAPHanaDBInstance"):
    """Azure VM workload-specific protectable item representing SAP HANA Dbinstance.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "SAPHanaDBInstance".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["SAPHanaDBInstance"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPHanaDBInstance\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "SAPHanaDBInstance"  # type: ignore


class AzureVmWorkloadSAPHanaDBInstanceProtectedItem(
    AzureVmWorkloadProtectedItem, discriminator="AzureVmWorkloadSAPHanaDBInstance"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protected item representing SAP HANA DBInstance.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the DB represented by this backup item.
    :vartype friendly_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar parent_name: Parent name of the DB such as Instance or Availability Group.
    :vartype parent_name: str
    :ivar parent_type: Parent type of protected item, example: for a DB, standalone server or
     distributed.
    :vartype parent_type: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar last_backup_status: Last backup operation status. Possible values: Healthy, Unhealthy.
     Known values are: "Invalid", "Healthy", "Unhealthy", and "IRPending".
    :vartype last_backup_status: str or ~azure.mgmt.recoveryservicesbackup.models.LastBackupStatus
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar last_backup_error_detail: Error details in last backup.
    :vartype last_backup_error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar protected_item_data_source_id: Data ID of the protected item.
    :vartype protected_item_data_source_id: str
    :ivar protected_item_health_status: Health status of the backup item, evaluated based on last
     heartbeat received. Known values are: "Invalid", "Healthy", "Unhealthy", "NotReachable", and
     "IRPending".
    :vartype protected_item_health_status: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectedItemHealthStatus
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureVmWorkloadProtectedItemExtendedInfo
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar nodes_list: List of the nodes in case of distributed container.
    :vartype nodes_list: list[~azure.mgmt.recoveryservicesbackup.models.DistributedNodesInfo]
    :ivar protected_item_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "AzureVmWorkloadSAPHanaDBInstance".
    :vartype protected_item_type: str
    """

    protected_item_type: Literal["AzureVmWorkloadSAPHanaDBInstance"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureVmWorkloadSAPHanaDBInstance\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        server_name: Optional[str] = None,
        parent_name: Optional[str] = None,
        parent_type: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        last_backup_status: Optional[Union[str, "_models.LastBackupStatus"]] = None,
        last_backup_time: Optional[datetime.datetime] = None,
        last_backup_error_detail: Optional["_models.ErrorDetail"] = None,
        protected_item_data_source_id: Optional[str] = None,
        protected_item_health_status: Optional[Union[str, "_models.ProtectedItemHealthStatus"]] = None,
        extended_info: Optional["_models.AzureVmWorkloadProtectedItemExtendedInfo"] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        nodes_list: Optional[list["_models.DistributedNodesInfo"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "AzureVmWorkloadSAPHanaDBInstance"  # type: ignore


class AzureVmWorkloadSAPHanaHSRProtectableItem(AzureVmWorkloadProtectableItem, discriminator="HanaHSRContainer"):
    """Azure VM workload-specific protectable item representing HANA HSR.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "HanaHSRContainer".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["HanaHSRContainer"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"HanaHSRContainer\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "HanaHSRContainer"  # type: ignore


class AzureVmWorkloadSAPHanaScaleoutProtectableItem(
    AzureVmWorkloadProtectableItem, discriminator="HanaScaleoutContainer"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protectable item representing HANA scale out.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "HanaScaleoutContainer".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["HanaScaleoutContainer"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"HanaScaleoutContainer\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "HanaScaleoutContainer"  # type: ignore


class AzureVmWorkloadSAPHanaSystemProtectableItem(
    AzureVmWorkloadProtectableItem, discriminator="SAPHanaSystem"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protectable item representing SAP HANA System.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "SAPHanaSystem".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["SAPHanaSystem"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPHanaSystem\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "SAPHanaSystem"  # type: ignore


class AzureVmWorkloadSAPHanaSystemWorkloadItem(AzureVmWorkloadItem, discriminator="SAPHanaSystem"):
    """Azure VM workload-specific workload item representing SAP HANA System.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if workload item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar sub_workload_item_count: For instance or AG, indicates number of DB's to be protected.
    :vartype sub_workload_item_count: int
    :ivar workload_item_type: Type of the backup item. Required. Default value is "SAPHanaSystem".
    :vartype workload_item_type: str
    """

    workload_item_type: Literal["SAPHanaSystem"] = rest_discriminator(name="workloadItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SAPHanaSystem\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        sub_workload_item_count: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.workload_item_type = "SAPHanaSystem"  # type: ignore


class AzureVmWorkloadSQLAvailabilityGroupProtectableItem(
    AzureVmWorkloadProtectableItem, discriminator="SQLAvailabilityGroupContainer"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protectable item representing SQL Availability Group.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is
     "SQLAvailabilityGroupContainer".
    :vartype protectable_item_type: str
    :ivar nodes_list: List of the nodes in case of distributed container.
    :vartype nodes_list: list[~azure.mgmt.recoveryservicesbackup.models.DistributedNodesInfo]
    """

    protectable_item_type: Literal["SQLAvailabilityGroupContainer"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SQLAvailabilityGroupContainer\"."""
    nodes_list: Optional[list["_models.DistributedNodesInfo"]] = rest_field(
        name="nodesList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of the nodes in case of distributed container."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
        nodes_list: Optional[list["_models.DistributedNodesInfo"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "SQLAvailabilityGroupContainer"  # type: ignore


class AzureVmWorkloadSQLDatabaseProtectableItem(
    AzureVmWorkloadProtectableItem, discriminator="SQLDataBase"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protectable item representing SQL Database.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is "SQLDataBase".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["SQLDataBase"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SQLDataBase\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "SQLDataBase"  # type: ignore


class AzureVmWorkloadSQLDatabaseProtectedItem(AzureVmWorkloadProtectedItem, discriminator="AzureVmWorkloadSQLDatabase"):
    """Azure VM workload-specific protected item representing SQL Database.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the DB represented by this backup item.
    :vartype friendly_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar parent_name: Parent name of the DB such as Instance or Availability Group.
    :vartype parent_name: str
    :ivar parent_type: Parent type of protected item, example: for a DB, standalone server or
     distributed.
    :vartype parent_type: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar last_backup_status: Last backup operation status. Possible values: Healthy, Unhealthy.
     Known values are: "Invalid", "Healthy", "Unhealthy", and "IRPending".
    :vartype last_backup_status: str or ~azure.mgmt.recoveryservicesbackup.models.LastBackupStatus
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar last_backup_error_detail: Error details in last backup.
    :vartype last_backup_error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar protected_item_data_source_id: Data ID of the protected item.
    :vartype protected_item_data_source_id: str
    :ivar protected_item_health_status: Health status of the backup item, evaluated based on last
     heartbeat received. Known values are: "Invalid", "Healthy", "Unhealthy", "NotReachable", and
     "IRPending".
    :vartype protected_item_health_status: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectedItemHealthStatus
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureVmWorkloadProtectedItemExtendedInfo
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar nodes_list: List of the nodes in case of distributed container.
    :vartype nodes_list: list[~azure.mgmt.recoveryservicesbackup.models.DistributedNodesInfo]
    :ivar protected_item_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "AzureVmWorkloadSQLDatabase".
    :vartype protected_item_type: str
    :ivar parent_protected_item: Name of the parent protected item (e.g., SQL Instance name) when
     this database is protected as part of a parent.
    :vartype parent_protected_item: str
    :ivar protection_level: Protection type in case protected as part of a parent. Known values
     are: "Database" and "DatabaseUnderInstance".
    :vartype protection_level: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionLevel
    """

    protected_item_type: Literal["AzureVmWorkloadSQLDatabase"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureVmWorkloadSQLDatabase\"."""
    parent_protected_item: Optional[str] = rest_field(
        name="parentProtectedItem", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of the parent protected item (e.g., SQL Instance name) when this database is protected as
     part of a parent."""
    protection_level: Optional[Union[str, "_models.ProtectionLevel"]] = rest_field(
        name="protectionLevel", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protection type in case protected as part of a parent. Known values are: \"Database\" and
     \"DatabaseUnderInstance\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        server_name: Optional[str] = None,
        parent_name: Optional[str] = None,
        parent_type: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        last_backup_status: Optional[Union[str, "_models.LastBackupStatus"]] = None,
        last_backup_time: Optional[datetime.datetime] = None,
        last_backup_error_detail: Optional["_models.ErrorDetail"] = None,
        protected_item_data_source_id: Optional[str] = None,
        protected_item_health_status: Optional[Union[str, "_models.ProtectedItemHealthStatus"]] = None,
        extended_info: Optional["_models.AzureVmWorkloadProtectedItemExtendedInfo"] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        nodes_list: Optional[list["_models.DistributedNodesInfo"]] = None,
        parent_protected_item: Optional[str] = None,
        protection_level: Optional[Union[str, "_models.ProtectionLevel"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "AzureVmWorkloadSQLDatabase"  # type: ignore


class AzureVmWorkloadSQLDatabaseWorkloadItem(AzureVmWorkloadItem, discriminator="SQLDataBase"):
    """Azure VM workload-specific workload item representing SQL Database.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if workload item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar sub_workload_item_count: For instance or AG, indicates number of DB's to be protected.
    :vartype sub_workload_item_count: int
    :ivar workload_item_type: Type of the backup item. Required. Default value is "SQLDataBase".
    :vartype workload_item_type: str
    """

    workload_item_type: Literal["SQLDataBase"] = rest_discriminator(name="workloadItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SQLDataBase\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        sub_workload_item_count: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.workload_item_type = "SQLDataBase"  # type: ignore


class AzureVmWorkloadSQLInstanceProtectableItem(
    AzureVmWorkloadProtectableItem, discriminator="SQLInstance"
):  # pylint: disable=name-too-long
    """Azure VM workload-specific protectable item representing SQL Instance.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar parent_unique_name: Parent Unique Name is added to provide the service formatted URI Name
     of the Parent Only Applicable for data bases where the parent would be either Instance or a SQL
     AG.
    :vartype parent_unique_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if protectable item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar is_auto_protected: Indicates if protectable item is auto-protected.
    :vartype is_auto_protected: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar subprotectableitemcount: For instance or AG, indicates number of DB's to be protected.
    :vartype subprotectableitemcount: int
    :ivar prebackupvalidation: Pre-backup validation for protectable objects.
    :vartype prebackupvalidation: ~azure.mgmt.recoveryservicesbackup.models.PreBackupValidation
    :ivar is_protectable: Indicates if item is protectable.
    :vartype is_protectable: bool
    :ivar protectable_item_type: Type of the backup item. Required. Default value is "SQLInstance".
    :vartype protectable_item_type: str
    """

    protectable_item_type: Literal["SQLInstance"] = rest_discriminator(name="protectableItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SQLInstance\"."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        parent_unique_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        is_auto_protected: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        subprotectableitemcount: Optional[int] = None,
        prebackupvalidation: Optional["_models.PreBackupValidation"] = None,
        is_protectable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protectable_item_type = "SQLInstance"  # type: ignore


class AzureVmWorkloadSQLInstanceProtectedItem(AzureVmWorkloadProtectedItem, discriminator="AzureVmWorkloadSQLInstance"):
    """Azure VM workload-specific protected item representing SQL Instance.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the DB represented by this backup item.
    :vartype friendly_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar parent_name: Parent name of the DB such as Instance or Availability Group.
    :vartype parent_name: str
    :ivar parent_type: Parent type of protected item, example: for a DB, standalone server or
     distributed.
    :vartype parent_type: str
    :ivar protection_status: Backup status of this backup item.
    :vartype protection_status: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar last_backup_status: Last backup operation status. Possible values: Healthy, Unhealthy.
     Known values are: "Invalid", "Healthy", "Unhealthy", and "IRPending".
    :vartype last_backup_status: str or ~azure.mgmt.recoveryservicesbackup.models.LastBackupStatus
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar last_backup_error_detail: Error details in last backup.
    :vartype last_backup_error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar protected_item_data_source_id: Data ID of the protected item.
    :vartype protected_item_data_source_id: str
    :ivar protected_item_health_status: Health status of the backup item, evaluated based on last
     heartbeat received. Known values are: "Invalid", "Healthy", "Unhealthy", "NotReachable", and
     "IRPending".
    :vartype protected_item_health_status: str or
     ~azure.mgmt.recoveryservicesbackup.models.ProtectedItemHealthStatus
    :ivar extended_info: Additional information for this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureVmWorkloadProtectedItemExtendedInfo
    :ivar kpis_healths: Health details of different KPIs.
    :vartype kpis_healths: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.KPIResourceHealthDetails]
    :ivar nodes_list: List of the nodes in case of distributed container.
    :vartype nodes_list: list[~azure.mgmt.recoveryservicesbackup.models.DistributedNodesInfo]
    :ivar protected_item_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "AzureVmWorkloadSQLInstance".
    :vartype protected_item_type: str
    :ivar child_db_names: Name of Child Dbs protected under this parent.
    :vartype child_db_names: list[str]
    :ivar instance_protection_readiness: The state of instance protection. Known values are:
     "Unknown", "Ready", "ScheduleDisabled", "PartialProtection", and "ProtectionError".
    :vartype instance_protection_readiness: str or
     ~azure.mgmt.recoveryservicesbackup.models.InstanceProtectionReadiness
    """

    protected_item_type: Literal["AzureVmWorkloadSQLInstance"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureVmWorkloadSQLInstance\"."""
    child_db_names: Optional[list[str]] = rest_field(
        name="childDBNames", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of Child Dbs protected under this parent."""
    instance_protection_readiness: Optional[Union[str, "_models.InstanceProtectionReadiness"]] = rest_field(
        name="instanceProtectionReadiness", visibility=["read", "create", "update", "delete", "query"]
    )
    """The state of instance protection. Known values are: \"Unknown\", \"Ready\",
     \"ScheduleDisabled\", \"PartialProtection\", and \"ProtectionError\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        server_name: Optional[str] = None,
        parent_name: Optional[str] = None,
        parent_type: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        last_backup_status: Optional[Union[str, "_models.LastBackupStatus"]] = None,
        last_backup_time: Optional[datetime.datetime] = None,
        last_backup_error_detail: Optional["_models.ErrorDetail"] = None,
        protected_item_data_source_id: Optional[str] = None,
        protected_item_health_status: Optional[Union[str, "_models.ProtectedItemHealthStatus"]] = None,
        extended_info: Optional["_models.AzureVmWorkloadProtectedItemExtendedInfo"] = None,
        kpis_healths: Optional[dict[str, "_models.KPIResourceHealthDetails"]] = None,
        nodes_list: Optional[list["_models.DistributedNodesInfo"]] = None,
        child_db_names: Optional[list[str]] = None,
        instance_protection_readiness: Optional[Union[str, "_models.InstanceProtectionReadiness"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "AzureVmWorkloadSQLInstance"  # type: ignore


class AzureVmWorkloadSQLInstanceWorkloadItem(AzureVmWorkloadItem, discriminator="SQLInstance"):
    """Azure VM workload-specific workload item representing SQL Instance.

    :ivar backup_management_type: Type of backup management to backup an item.
    :vartype backup_management_type: str
    :ivar workload_type: Type of workload for the backup management.
    :vartype workload_type: str
    :ivar friendly_name: Friendly name of the backup item.
    :vartype friendly_name: str
    :ivar protection_state: State of the back up item. Known values are: "Invalid", "NotProtected",
     "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar parent_name: Name for instance or AG.
    :vartype parent_name: str
    :ivar server_name: Host/Cluster Name for instance or AG.
    :vartype server_name: str
    :ivar is_auto_protectable: Indicates if workload item is auto-protectable.
    :vartype is_auto_protectable: bool
    :ivar subinquireditemcount: For instance or AG, indicates number of DB's present.
    :vartype subinquireditemcount: int
    :ivar sub_workload_item_count: For instance or AG, indicates number of DB's to be protected.
    :vartype sub_workload_item_count: int
    :ivar workload_item_type: Type of the backup item. Required. Default value is "SQLInstance".
    :vartype workload_item_type: str
    :ivar data_directory_paths: Data Directory Paths for default directories.
    :vartype data_directory_paths: list[~azure.mgmt.recoveryservicesbackup.models.SQLDataDirectory]
    """

    workload_item_type: Literal["SQLInstance"] = rest_discriminator(name="workloadItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup item. Required. Default value is \"SQLInstance\"."""
    data_directory_paths: Optional[list["_models.SQLDataDirectory"]] = rest_field(
        name="dataDirectoryPaths", visibility=["read", "create", "update", "delete", "query"]
    )
    """Data Directory Paths for default directories."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        friendly_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        parent_name: Optional[str] = None,
        server_name: Optional[str] = None,
        is_auto_protectable: Optional[bool] = None,
        subinquireditemcount: Optional[int] = None,
        sub_workload_item_count: Optional[int] = None,
        data_directory_paths: Optional[list["_models.SQLDataDirectory"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.workload_item_type = "SQLInstance"  # type: ignore


class AzureWorkloadAutoProtectionIntent(
    AzureRecoveryServiceVaultProtectionIntent, discriminator="AzureWorkloadAutoProtectionIntent"
):
    """Azure Recovery Services Vault specific protection intent item.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadSQLAutoProtectionIntent

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar item_id: ID of the item which is getting protected, In case of Azure Vm , it is
     ProtectedItemId.
    :vartype item_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "NotProtected", "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar protection_intent_item_type: backup protectionIntent type. Required.
     AZURE_WORKLOAD_AUTO_PROTECTION_INTENT.
    :vartype protection_intent_item_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.AZURE_WORKLOAD_AUTO_PROTECTION_INTENT
    """

    __mapping__: dict[str, _Model] = {}
    protection_intent_item_type: Literal[ProtectionIntentItemType.AZURE_WORKLOAD_AUTO_PROTECTION_INTENT] = rest_discriminator(name="protectionIntentItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup protectionIntent type. Required. AZURE_WORKLOAD_AUTO_PROTECTION_INTENT."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        source_resource_id: Optional[str] = None,
        item_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protection_intent_item_type = ProtectionIntentItemType.AZURE_WORKLOAD_AUTO_PROTECTION_INTENT  # type: ignore


class AzureWorkloadBackupRequest(BackupRequest, discriminator="AzureWorkloadBackupRequest"):
    """AzureWorkload workload-specific backup request.

    :ivar backup_type: Type of backup, viz. Full, Differential, Log or CopyOnlyFull. Known values
     are: "Invalid", "Full", "Differential", "Log", "CopyOnlyFull", "Incremental", "SnapshotFull",
     and "SnapshotCopyOnlyFull".
    :vartype backup_type: str or ~azure.mgmt.recoveryservicesbackup.models.BackupType
    :ivar enable_compression: Bool for Compression setting.
    :vartype enable_compression: bool
    :ivar recovery_point_expiry_time_in_utc: Backup copy will expire after the time specified
     (UTC).
    :vartype recovery_point_expiry_time_in_utc: ~datetime.datetime
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadBackupRequest".
    :vartype object_type: str
    """

    backup_type: Optional[Union[str, "_models.BackupType"]] = rest_field(
        name="backupType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup, viz. Full, Differential, Log or CopyOnlyFull. Known values are: \"Invalid\",
     \"Full\", \"Differential\", \"Log\", \"CopyOnlyFull\", \"Incremental\", \"SnapshotFull\", and
     \"SnapshotCopyOnlyFull\"."""
    enable_compression: Optional[bool] = rest_field(
        name="enableCompression", visibility=["read", "create", "update", "delete", "query"]
    )
    """Bool for Compression setting."""
    recovery_point_expiry_time_in_utc: Optional[datetime.datetime] = rest_field(
        name="recoveryPointExpiryTimeInUTC",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """Backup copy will expire after the time specified (UTC)."""
    object_type: Literal["AzureWorkloadBackupRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadBackupRequest\"."""

    @overload
    def __init__(
        self,
        *,
        backup_type: Optional[Union[str, "_models.BackupType"]] = None,
        enable_compression: Optional[bool] = None,
        recovery_point_expiry_time_in_utc: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadBackupRequest"  # type: ignore


class AzureWorkloadContainerAutoProtectionIntent(
    ProtectionIntent, discriminator="AzureWorkloadContainerAutoProtectionIntent"
):  # pylint: disable=name-too-long
    """Azure workload specific protection intent item.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar item_id: ID of the item which is getting protected, In case of Azure Vm , it is
     ProtectedItemId.
    :vartype item_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "NotProtected", "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar protection_intent_item_type: backup protectionIntent type. Required.
     AZURE_WORKLOAD_CONTAINER_AUTO_PROTECTION_INTENT.
    :vartype protection_intent_item_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.AZURE_WORKLOAD_CONTAINER_AUTO_PROTECTION_INTENT
    """

    protection_intent_item_type: Literal[ProtectionIntentItemType.AZURE_WORKLOAD_CONTAINER_AUTO_PROTECTION_INTENT] = rest_discriminator(name="protectionIntentItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup protectionIntent type. Required. AZURE_WORKLOAD_CONTAINER_AUTO_PROTECTION_INTENT."""

    @overload
    def __init__(
        self,
        *,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        source_resource_id: Optional[str] = None,
        item_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionStatus"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protection_intent_item_type = ProtectionIntentItemType.AZURE_WORKLOAD_CONTAINER_AUTO_PROTECTION_INTENT  # type: ignore


class AzureWorkloadContainerExtendedInfo(_Model):
    """Extended information of the container.

    :ivar host_server_name: Host Os Name in case of Stand Alone and Cluster Name in case of
     distributed container.
    :vartype host_server_name: str
    :ivar inquiry_info: Inquiry Status for the container.
    :vartype inquiry_info: ~azure.mgmt.recoveryservicesbackup.models.InquiryInfo
    :ivar nodes_list: List of the nodes in case of distributed container.
    :vartype nodes_list: list[~azure.mgmt.recoveryservicesbackup.models.DistributedNodesInfo]
    """

    host_server_name: Optional[str] = rest_field(
        name="hostServerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Host Os Name in case of Stand Alone and Cluster Name in case of distributed container."""
    inquiry_info: Optional["_models.InquiryInfo"] = rest_field(
        name="inquiryInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Inquiry Status for the container."""
    nodes_list: Optional[list["_models.DistributedNodesInfo"]] = rest_field(
        name="nodesList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of the nodes in case of distributed container."""

    @overload
    def __init__(
        self,
        *,
        host_server_name: Optional[str] = None,
        inquiry_info: Optional["_models.InquiryInfo"] = None,
        nodes_list: Optional[list["_models.DistributedNodesInfo"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureWorkloadErrorInfo(_Model):
    """Azure storage specific error information.

    :ivar error_code: Error code.
    :vartype error_code: int
    :ivar error_string: Localized error string.
    :vartype error_string: str
    :ivar error_title: Title: Typically, the entity that the error pertains to.
    :vartype error_title: str
    :ivar recommendations: List of localized recommendations for above error code.
    :vartype recommendations: list[str]
    :ivar additional_details: Additional details for above error code.
    :vartype additional_details: str
    """

    error_code: Optional[int] = rest_field(name="errorCode", visibility=["read", "create", "update", "delete", "query"])
    """Error code."""
    error_string: Optional[str] = rest_field(
        name="errorString", visibility=["read", "create", "update", "delete", "query"]
    )
    """Localized error string."""
    error_title: Optional[str] = rest_field(
        name="errorTitle", visibility=["read", "create", "update", "delete", "query"]
    )
    """Title: Typically, the entity that the error pertains to."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """List of localized recommendations for above error code."""
    additional_details: Optional[str] = rest_field(
        name="additionalDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional details for above error code."""

    @overload
    def __init__(
        self,
        *,
        error_code: Optional[int] = None,
        error_string: Optional[str] = None,
        error_title: Optional[str] = None,
        recommendations: Optional[list[str]] = None,
        additional_details: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureWorkloadJob(Job, discriminator="AzureWorkloadJob"):
    """Azure storage specific job.

    :ivar entity_friendly_name: Friendly name of the entity on which the current job is executing.
    :vartype entity_friendly_name: str
    :ivar backup_management_type: Backup management type to execute the current job. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar operation: The operation name.
    :vartype operation: str
    :ivar status: Job status.
    :vartype status: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar activity_id: ActivityId of job.
    :vartype activity_id: str
    :ivar workload_type: Workload type of the job.
    :vartype workload_type: str
    :ivar duration: Time elapsed during the execution of this job.
    :vartype duration: ~datetime.timedelta
    :ivar actions_info: Gets or sets the state/actions applicable on this job like cancel/retry.
    :vartype actions_info: list[str or
     ~azure.mgmt.recoveryservicesbackup.models.JobSupportedAction]
    :ivar error_details: Error details on execution of this job.
    :vartype error_details: list[~azure.mgmt.recoveryservicesbackup.models.AzureWorkloadErrorInfo]
    :ivar extended_info: Additional information about the job.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.AzureWorkloadJobExtendedInfo
    :ivar job_type: This property will be used as the discriminator for deciding the specific types
     in the polymorphic chain of types. Required. Default value is "AzureWorkloadJob".
    :vartype job_type: str
    """

    workload_type: Optional[str] = rest_field(
        name="workloadType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Workload type of the job."""
    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed during the execution of this job."""
    actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = rest_field(
        name="actionsInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets the state/actions applicable on this job like cancel/retry."""
    error_details: Optional[list["_models.AzureWorkloadErrorInfo"]] = rest_field(
        name="errorDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error details on execution of this job."""
    extended_info: Optional["_models.AzureWorkloadJobExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information about the job."""
    job_type: Literal["AzureWorkloadJob"] = rest_discriminator(name="jobType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadJob\"."""

    @overload
    def __init__(
        self,
        *,
        entity_friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        operation: Optional[str] = None,
        status: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        activity_id: Optional[str] = None,
        workload_type: Optional[str] = None,
        duration: Optional[datetime.timedelta] = None,
        actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = None,
        error_details: Optional[list["_models.AzureWorkloadErrorInfo"]] = None,
        extended_info: Optional["_models.AzureWorkloadJobExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.job_type = "AzureWorkloadJob"  # type: ignore


class AzureWorkloadJobExtendedInfo(_Model):
    """Azure VM workload-specific additional information for job.

    :ivar tasks_list: List of tasks for this job.
    :vartype tasks_list:
     list[~azure.mgmt.recoveryservicesbackup.models.AzureWorkloadJobTaskDetails]
    :ivar property_bag: Job properties.
    :vartype property_bag: dict[str, str]
    :ivar dynamic_error_message: Non localized error message on job execution.
    :vartype dynamic_error_message: str
    """

    tasks_list: Optional[list["_models.AzureWorkloadJobTaskDetails"]] = rest_field(
        name="tasksList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of tasks for this job."""
    property_bag: Optional[dict[str, str]] = rest_field(
        name="propertyBag", visibility=["read", "create", "update", "delete", "query"]
    )
    """Job properties."""
    dynamic_error_message: Optional[str] = rest_field(
        name="dynamicErrorMessage", visibility=["read", "create", "update", "delete", "query"]
    )
    """Non localized error message on job execution."""

    @overload
    def __init__(
        self,
        *,
        tasks_list: Optional[list["_models.AzureWorkloadJobTaskDetails"]] = None,
        property_bag: Optional[dict[str, str]] = None,
        dynamic_error_message: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureWorkloadJobTaskDetails(_Model):
    """Azure VM workload specific job task details.

    :ivar task_id: The task display name.
    :vartype task_id: str
    :ivar status: The status.
    :vartype status: str
    """

    task_id: Optional[str] = rest_field(name="taskId", visibility=["read", "create", "update", "delete", "query"])
    """The task display name."""
    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """The status."""

    @overload
    def __init__(
        self,
        *,
        task_id: Optional[str] = None,
        status: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureWorkloadRecoveryPoint(RecoveryPoint, discriminator="AzureWorkloadRecoveryPoint"):
    """Workload specific recovery point, specifically encapsulates full/diff recovery point.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadPointInTimeRecoveryPoint, AzureWorkloadSAPAsePointInTimeRecoveryPoint,
    AzureWorkloadSAPAseRecoveryPoint, AzureWorkloadSAPHanaPointInTimeRecoveryPoint,
    AzureWorkloadSAPHanaRecoveryPoint, AzureWorkloadSQLPointInTimeRecoveryPoint,
    AzureWorkloadSQLRecoveryPoint

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadRecoveryPoint".
    :vartype object_type: str
    :ivar recovery_point_time_in_utc: UTC time at which recovery point was created.
    :vartype recovery_point_time_in_utc: ~datetime.datetime
    :ivar type: Type of restore point. Known values are: "Invalid", "Full", "Log", "Differential",
     "Incremental", "SnapshotFull", and "SnapshotCopyOnlyFull".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.RestorePointType
    :ivar recovery_point_tier_details: Recovery point tier information.
    :vartype recovery_point_tier_details:
     list[~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierInformationV2]
    :ivar recovery_point_move_readiness_info: Eligibility of RP to be moved to another tier.
    :vartype recovery_point_move_readiness_info: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointMoveReadinessInfo]
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadRecoveryPoint\"."""
    recovery_point_time_in_utc: Optional[datetime.datetime] = rest_field(
        name="recoveryPointTimeInUTC", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """UTC time at which recovery point was created."""
    type: Optional[Union[str, "_models.RestorePointType"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of restore point. Known values are: \"Invalid\", \"Full\", \"Log\", \"Differential\",
     \"Incremental\", \"SnapshotFull\", and \"SnapshotCopyOnlyFull\"."""
    recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = rest_field(
        name="recoveryPointTierDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Recovery point tier information."""
    recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = rest_field(
        name="recoveryPointMoveReadinessInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Eligibility of RP to be moved to another tier."""
    recovery_point_properties: Optional["_models.RecoveryPointProperties"] = rest_field(
        name="recoveryPointProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """Properties of Recovery Point."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        recovery_point_time_in_utc: Optional[datetime.datetime] = None,
        type: Optional[Union[str, "_models.RestorePointType"]] = None,
        recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = None,
        recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadRecoveryPoint"  # type: ignore


class AzureWorkloadPointInTimeRecoveryPoint(
    AzureWorkloadRecoveryPoint, discriminator="AzureWorkloadPointInTimeRecoveryPoint"
):
    """Recovery point specific to PointInTime.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadSAPAsePointInTimeRecoveryPoint, AzureWorkloadSAPHanaPointInTimeRecoveryPoint

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar recovery_point_time_in_utc: UTC time at which recovery point was created.
    :vartype recovery_point_time_in_utc: ~datetime.datetime
    :ivar type: Type of restore point. Known values are: "Invalid", "Full", "Log", "Differential",
     "Incremental", "SnapshotFull", and "SnapshotCopyOnlyFull".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.RestorePointType
    :ivar recovery_point_tier_details: Recovery point tier information.
    :vartype recovery_point_tier_details:
     list[~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierInformationV2]
    :ivar recovery_point_move_readiness_info: Eligibility of RP to be moved to another tier.
    :vartype recovery_point_move_readiness_info: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointMoveReadinessInfo]
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadPointInTimeRecoveryPoint".
    :vartype object_type: str
    :ivar time_ranges: List of log ranges.
    :vartype time_ranges: list[~azure.mgmt.recoveryservicesbackup.models.PointInTimeRange]
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadPointInTimeRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadPointInTimeRecoveryPoint\"."""
    time_ranges: Optional[list["_models.PointInTimeRange"]] = rest_field(
        name="timeRanges", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of log ranges."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        recovery_point_time_in_utc: Optional[datetime.datetime] = None,
        type: Optional[Union[str, "_models.RestorePointType"]] = None,
        recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = None,
        recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
        time_ranges: Optional[list["_models.PointInTimeRange"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadPointInTimeRecoveryPoint"  # type: ignore


class AzureWorkloadRestoreRequest(RestoreRequest, discriminator="AzureWorkloadRestoreRequest"):
    """AzureWorkload-specific restore.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadPointInTimeRestoreRequest, AzureWorkloadSAPAsePointInTimeRestoreRequest,
    AzureWorkloadSAPAseRestoreRequest, AzureWorkloadSAPHanaPointInTimeRestoreRequest,
    AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest, AzureWorkloadSAPHanaRestoreRequest,
    AzureWorkloadSAPHanaRestoreWithRehydrateRequest, AzureWorkloadSQLPointInTimeRestoreRequest,
    AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest, AzureWorkloadSQLRestoreRequest,
    AzureWorkloadSQLRestoreWithRehydrateRequest

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadRestoreRequest".
    :vartype object_type: str
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadRestoreRequest\"."""
    recovery_type: Optional[Union[str, "_models.RecoveryType"]] = rest_field(
        name="recoveryType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of this recovery. Known values are: \"Invalid\", \"OriginalLocation\",
     \"AlternateLocation\", \"RestoreDisks\", and \"Offline\"."""
    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM ID of the VM on which workload that was running is being recovered."""
    property_bag: Optional[dict[str, str]] = rest_field(
        name="propertyBag", visibility=["read", "create", "update", "delete", "query"]
    )
    """Workload specific property bag."""
    target_info: Optional["_models.TargetRestoreInfo"] = rest_field(
        name="targetInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Details of target database."""
    recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = rest_field(
        name="recoveryMode", visibility=["read", "create", "update", "delete", "query"]
    )
    """Defines whether the current recovery mode is file restore or database restore. Known values
     are: \"Invalid\", \"FileRecovery\", \"WorkloadRecovery\", \"SnapshotAttach\",
     \"RecoveryUsingSnapshot\", and \"SnapshotAttachAndRecover\"."""
    target_resource_group_name: Optional[str] = rest_field(
        name="targetResourceGroupName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Defines the Resource group of the Target VM."""
    user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = rest_field(
        name="userAssignedManagedIdentityDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """User Assigned managed identity details Currently used for snapshot."""
    snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = rest_field(
        name="snapshotRestoreParameters", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional details for snapshot recovery Currently used for snapshot for SAP Hana."""
    target_virtual_machine_id: Optional[str] = rest_field(
        name="targetVirtualMachineId", visibility=["read", "create", "update", "delete", "query"]
    )
    """This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadRestoreRequest"  # type: ignore


class AzureWorkloadPointInTimeRestoreRequest(
    AzureWorkloadRestoreRequest, discriminator="AzureWorkloadPointInTimeRestoreRequest"
):
    """AzureWorkload SAP Hana -specific restore. Specifically for PointInTime/Log restore.

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadPointInTimeRestoreRequest".
    :vartype object_type: str
    :ivar point_in_time: PointInTime value.
    :vartype point_in_time: ~datetime.datetime
    """

    object_type: Literal["AzureWorkloadPointInTimeRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadPointInTimeRestoreRequest\"."""
    point_in_time: Optional[datetime.datetime] = rest_field(
        name="pointInTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """PointInTime value."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
        point_in_time: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadPointInTimeRestoreRequest"  # type: ignore


class AzureWorkloadSAPAsePointInTimeRecoveryPoint(
    AzureWorkloadPointInTimeRecoveryPoint, discriminator="AzureWorkloadSAPAsePointInTimeRecoveryPoint"
):  # pylint: disable=name-too-long
    """Recovery point specific to PointInTime in SAPAse.

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPAsePointInTimeRecoveryPoint".
    :vartype object_type: str
    """

    object_type: Literal["AzureWorkloadSAPAsePointInTimeRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSAPAsePointInTimeRecoveryPoint\"."""

    @overload
    def __init__(
        self,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPAsePointInTimeRecoveryPoint"  # type: ignore


class AzureWorkloadSAPAseRestoreRequest(AzureWorkloadRestoreRequest, discriminator="AzureWorkloadSAPAseRestoreRequest"):
    """AzureWorkload SAP Ase-specific restore.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadSAPAsePointInTimeRestoreRequest

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPAseRestoreRequest".
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadSAPAseRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadSAPAseRestoreRequest\"."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPAseRestoreRequest"  # type: ignore


class AzureWorkloadSAPAsePointInTimeRestoreRequest(
    AzureWorkloadSAPAseRestoreRequest, discriminator="AzureWorkloadSAPAsePointInTimeRestoreRequest"
):  # pylint: disable=name-too-long
    """AzureWorkload SAP Ase-specific restore. Specifically for PointInTime/Log restore.

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPAsePointInTimeRestoreRequest".
    :vartype object_type: str
    :ivar point_in_time: PointInTime value.
    :vartype point_in_time: ~datetime.datetime
    """

    object_type: Literal["AzureWorkloadSAPAsePointInTimeRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSAPAsePointInTimeRestoreRequest\"."""
    point_in_time: Optional[datetime.datetime] = rest_field(
        name="pointInTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """PointInTime value."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
        point_in_time: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPAsePointInTimeRestoreRequest"  # type: ignore


class AzureWorkloadSAPAseRecoveryPoint(AzureWorkloadRecoveryPoint, discriminator="AzureWorkloadSAPAseRecoveryPoint"):
    """SAPAse specific recoverypoint, specifically encapsulates full/diff recoverypoints.

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar recovery_point_time_in_utc: UTC time at which recovery point was created.
    :vartype recovery_point_time_in_utc: ~datetime.datetime
    :ivar type: Type of restore point. Known values are: "Invalid", "Full", "Log", "Differential",
     "Incremental", "SnapshotFull", and "SnapshotCopyOnlyFull".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.RestorePointType
    :ivar recovery_point_tier_details: Recovery point tier information.
    :vartype recovery_point_tier_details:
     list[~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierInformationV2]
    :ivar recovery_point_move_readiness_info: Eligibility of RP to be moved to another tier.
    :vartype recovery_point_move_readiness_info: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointMoveReadinessInfo]
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPAseRecoveryPoint".
    :vartype object_type: str
    """

    object_type: Literal["AzureWorkloadSAPAseRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadSAPAseRecoveryPoint\"."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        recovery_point_time_in_utc: Optional[datetime.datetime] = None,
        type: Optional[Union[str, "_models.RestorePointType"]] = None,
        recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = None,
        recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPAseRecoveryPoint"  # type: ignore


class AzureWorkloadSAPHanaPointInTimeRecoveryPoint(
    AzureWorkloadPointInTimeRecoveryPoint, discriminator="AzureWorkloadSAPHanaPointInTimeRecoveryPoint"
):  # pylint: disable=name-too-long
    """Recovery point specific to PointInTime in SAPHana.

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPHanaPointInTimeRecoveryPoint".
    :vartype object_type: str
    """

    object_type: Literal["AzureWorkloadSAPHanaPointInTimeRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSAPHanaPointInTimeRecoveryPoint\"."""

    @overload
    def __init__(
        self,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPHanaPointInTimeRecoveryPoint"  # type: ignore


class AzureWorkloadSAPHanaRestoreRequest(
    AzureWorkloadRestoreRequest, discriminator="AzureWorkloadSAPHanaRestoreRequest"
):
    """AzureWorkload SAP Hana-specific restore.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadSAPHanaPointInTimeRestoreRequest,
    AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest,
    AzureWorkloadSAPHanaRestoreWithRehydrateRequest

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPHanaRestoreRequest".
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadSAPHanaRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadSAPHanaRestoreRequest\"."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPHanaRestoreRequest"  # type: ignore


class AzureWorkloadSAPHanaPointInTimeRestoreRequest(
    AzureWorkloadSAPHanaRestoreRequest, discriminator="AzureWorkloadSAPHanaPointInTimeRestoreRequest"
):  # pylint: disable=name-too-long
    """AzureWorkload SAP Hana -specific restore. Specifically for PointInTime/Log restore.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPHanaPointInTimeRestoreRequest".
    :vartype object_type: str
    :ivar point_in_time: PointInTime value.
    :vartype point_in_time: ~datetime.datetime
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadSAPHanaPointInTimeRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSAPHanaPointInTimeRestoreRequest\"."""
    point_in_time: Optional[datetime.datetime] = rest_field(
        name="pointInTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """PointInTime value."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
        point_in_time: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPHanaPointInTimeRestoreRequest"  # type: ignore


class AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest(
    AzureWorkloadSAPHanaPointInTimeRestoreRequest,
    discriminator="AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest",
):  # pylint: disable=name-too-long
    """AzureWorkload SAP Hana-specific restore with integrated rehydration of recovery point.

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest".
    :vartype object_type: str
    :ivar recovery_point_rehydration_info: RP Rehydration Info.
    :vartype recovery_point_rehydration_info:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointRehydrationInfo
    """

    object_type: Literal["AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest\"."""
    recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = rest_field(
        name="recoveryPointRehydrationInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """RP Rehydration Info."""

    @overload
    def __init__(
        self,
        *,
        recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPHanaPointInTimeRestoreWithRehydrateRequest"  # type: ignore


class AzureWorkloadSAPHanaRecoveryPoint(AzureWorkloadRecoveryPoint, discriminator="AzureWorkloadSAPHanaRecoveryPoint"):
    """SAPHana specific recoverypoint, specifically encapsulates full/diff recoverypoints.

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar recovery_point_time_in_utc: UTC time at which recovery point was created.
    :vartype recovery_point_time_in_utc: ~datetime.datetime
    :ivar type: Type of restore point. Known values are: "Invalid", "Full", "Log", "Differential",
     "Incremental", "SnapshotFull", and "SnapshotCopyOnlyFull".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.RestorePointType
    :ivar recovery_point_tier_details: Recovery point tier information.
    :vartype recovery_point_tier_details:
     list[~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierInformationV2]
    :ivar recovery_point_move_readiness_info: Eligibility of RP to be moved to another tier.
    :vartype recovery_point_move_readiness_info: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointMoveReadinessInfo]
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPHanaRecoveryPoint".
    :vartype object_type: str
    """

    object_type: Literal["AzureWorkloadSAPHanaRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadSAPHanaRecoveryPoint\"."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        recovery_point_time_in_utc: Optional[datetime.datetime] = None,
        type: Optional[Union[str, "_models.RestorePointType"]] = None,
        recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = None,
        recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPHanaRecoveryPoint"  # type: ignore


class AzureWorkloadSAPHanaRestoreWithRehydrateRequest(
    AzureWorkloadSAPHanaRestoreRequest, discriminator="AzureWorkloadSAPHanaRestoreWithRehydrateRequest"
):  # pylint: disable=name-too-long
    """AzureWorkload SAP Hana-specific restore with integrated rehydration of recovery point.

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSAPHanaRestoreWithRehydrateRequest".
    :vartype object_type: str
    :ivar recovery_point_rehydration_info: RP Rehydration Info.
    :vartype recovery_point_rehydration_info:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointRehydrationInfo
    """

    object_type: Literal["AzureWorkloadSAPHanaRestoreWithRehydrateRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSAPHanaRestoreWithRehydrateRequest\"."""
    recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = rest_field(
        name="recoveryPointRehydrationInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """RP Rehydration Info."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
        recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSAPHanaRestoreWithRehydrateRequest"  # type: ignore


class AzureWorkloadSQLAutoProtectionIntent(
    AzureWorkloadAutoProtectionIntent, discriminator="AzureWorkloadSQLAutoProtectionIntent"
):
    """Azure Workload SQL Auto Protection intent item.

    :ivar protection_intent_item_type: backup protectionIntent type. Required.
     AZURE_WORKLOAD_SQL_AUTO_PROTECTION_INTENT.
    :vartype protection_intent_item_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.AZURE_WORKLOAD_SQL_AUTO_PROTECTION_INTENT
    :ivar workload_item_type: Workload item type of the item for which intent is to be set. Known
     values are: "Invalid", "SQLInstance", "SQLDataBase", "SAPHanaSystem", "SAPHanaDatabase",
     "SAPAseSystem", "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_item_type: str or ~azure.mgmt.recoveryservicesbackup.models.WorkloadItemType
    """

    protection_intent_item_type: Literal[ProtectionIntentItemType.AZURE_WORKLOAD_SQL_AUTO_PROTECTION_INTENT] = rest_discriminator(name="protectionIntentItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup protectionIntent type. Required. AZURE_WORKLOAD_SQL_AUTO_PROTECTION_INTENT."""
    workload_item_type: Optional[Union[str, "_models.WorkloadItemType"]] = rest_field(
        name="workloadItemType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Workload item type of the item for which intent is to be set. Known values are: \"Invalid\",
     \"SQLInstance\", \"SQLDataBase\", \"SAPHanaSystem\", \"SAPHanaDatabase\", \"SAPAseSystem\",
     \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""

    @overload
    def __init__(
        self,
        *,
        workload_item_type: Optional[Union[str, "_models.WorkloadItemType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protection_intent_item_type = ProtectionIntentItemType.AZURE_WORKLOAD_SQL_AUTO_PROTECTION_INTENT  # type: ignore


class AzureWorkloadSQLRecoveryPoint(AzureWorkloadRecoveryPoint, discriminator="AzureWorkloadSQLRecoveryPoint"):
    """SQL specific recoverypoint, specifically encapsulates full/diff recoverypoint along with
    extended info.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadSQLPointInTimeRecoveryPoint

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar recovery_point_time_in_utc: UTC time at which recovery point was created.
    :vartype recovery_point_time_in_utc: ~datetime.datetime
    :ivar type: Type of restore point. Known values are: "Invalid", "Full", "Log", "Differential",
     "Incremental", "SnapshotFull", and "SnapshotCopyOnlyFull".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.RestorePointType
    :ivar recovery_point_tier_details: Recovery point tier information.
    :vartype recovery_point_tier_details:
     list[~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierInformationV2]
    :ivar recovery_point_move_readiness_info: Eligibility of RP to be moved to another tier.
    :vartype recovery_point_move_readiness_info: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointMoveReadinessInfo]
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSQLRecoveryPoint".
    :vartype object_type: str
    :ivar extended_info: Extended Info that provides data directory details. Will be populated in
     two cases: When a specific recovery point is accessed using GetRecoveryPoint Or when
     ListRecoveryPoints is called for Log RP only with ExtendedInfo query filter.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureWorkloadSQLRecoveryPointExtendedInfo
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadSQLRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadSQLRecoveryPoint\"."""
    extended_info: Optional["_models.AzureWorkloadSQLRecoveryPointExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Extended Info that provides data directory details. Will be populated in two cases: When a
     specific recovery point is accessed using GetRecoveryPoint Or when ListRecoveryPoints is called
     for Log RP only with ExtendedInfo query filter."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        recovery_point_time_in_utc: Optional[datetime.datetime] = None,
        type: Optional[Union[str, "_models.RestorePointType"]] = None,
        recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = None,
        recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
        extended_info: Optional["_models.AzureWorkloadSQLRecoveryPointExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSQLRecoveryPoint"  # type: ignore


class AzureWorkloadSQLPointInTimeRecoveryPoint(
    AzureWorkloadSQLRecoveryPoint, discriminator="AzureWorkloadSQLPointInTimeRecoveryPoint"
):
    """Recovery point specific to PointInTime.

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar recovery_point_time_in_utc: UTC time at which recovery point was created.
    :vartype recovery_point_time_in_utc: ~datetime.datetime
    :ivar type: Type of restore point. Known values are: "Invalid", "Full", "Log", "Differential",
     "Incremental", "SnapshotFull", and "SnapshotCopyOnlyFull".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.RestorePointType
    :ivar recovery_point_tier_details: Recovery point tier information.
    :vartype recovery_point_tier_details:
     list[~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierInformationV2]
    :ivar recovery_point_move_readiness_info: Eligibility of RP to be moved to another tier.
    :vartype recovery_point_move_readiness_info: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointMoveReadinessInfo]
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    :ivar extended_info: Extended Info that provides data directory details. Will be populated in
     two cases: When a specific recovery point is accessed using GetRecoveryPoint Or when
     ListRecoveryPoints is called for Log RP only with ExtendedInfo query filter.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.AzureWorkloadSQLRecoveryPointExtendedInfo
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSQLPointInTimeRecoveryPoint".
    :vartype object_type: str
    :ivar time_ranges: List of log ranges.
    :vartype time_ranges: list[~azure.mgmt.recoveryservicesbackup.models.PointInTimeRange]
    """

    object_type: Literal["AzureWorkloadSQLPointInTimeRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSQLPointInTimeRecoveryPoint\"."""
    time_ranges: Optional[list["_models.PointInTimeRange"]] = rest_field(
        name="timeRanges", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of log ranges."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        recovery_point_time_in_utc: Optional[datetime.datetime] = None,
        type: Optional[Union[str, "_models.RestorePointType"]] = None,
        recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = None,
        recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
        extended_info: Optional["_models.AzureWorkloadSQLRecoveryPointExtendedInfo"] = None,
        time_ranges: Optional[list["_models.PointInTimeRange"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSQLPointInTimeRecoveryPoint"  # type: ignore


class AzureWorkloadSQLRestoreRequest(AzureWorkloadRestoreRequest, discriminator="AzureWorkloadSQLRestoreRequest"):
    """AzureWorkload SQL -specific restore. Specifically for full/diff restore.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadSQLPointInTimeRestoreRequest,
    AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest,
    AzureWorkloadSQLRestoreWithRehydrateRequest

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSQLRestoreRequest".
    :vartype object_type: str
    :ivar should_use_alternate_target_location: Default option set to true. If this is set to
     false, alternate data directory must be provided.
    :vartype should_use_alternate_target_location: bool
    :ivar is_non_recoverable: SQL specific property where user can chose to set no-recovery when
     restore operation is tried.
    :vartype is_non_recoverable: bool
    :ivar alternate_directory_paths: Data directory details.
    :vartype alternate_directory_paths:
     list[~azure.mgmt.recoveryservicesbackup.models.SQLDataDirectoryMapping]
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadSQLRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"AzureWorkloadSQLRestoreRequest\"."""
    should_use_alternate_target_location: Optional[bool] = rest_field(
        name="shouldUseAlternateTargetLocation", visibility=["read", "create", "update", "delete", "query"]
    )
    """Default option set to true. If this is set to false, alternate data directory must be provided."""
    is_non_recoverable: Optional[bool] = rest_field(
        name="isNonRecoverable", visibility=["read", "create", "update", "delete", "query"]
    )
    """SQL specific property where user can chose to set no-recovery when restore operation is tried."""
    alternate_directory_paths: Optional[list["_models.SQLDataDirectoryMapping"]] = rest_field(
        name="alternateDirectoryPaths", visibility=["read", "create", "update", "delete", "query"]
    )
    """Data directory details."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
        should_use_alternate_target_location: Optional[bool] = None,
        is_non_recoverable: Optional[bool] = None,
        alternate_directory_paths: Optional[list["_models.SQLDataDirectoryMapping"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSQLRestoreRequest"  # type: ignore


class AzureWorkloadSQLPointInTimeRestoreRequest(
    AzureWorkloadSQLRestoreRequest, discriminator="AzureWorkloadSQLPointInTimeRestoreRequest"
):  # pylint: disable=name-too-long
    """AzureWorkload SQL -specific restore. Specifically for PointInTime/Log restore.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar should_use_alternate_target_location: Default option set to true. If this is set to
     false, alternate data directory must be provided.
    :vartype should_use_alternate_target_location: bool
    :ivar is_non_recoverable: SQL specific property where user can chose to set no-recovery when
     restore operation is tried.
    :vartype is_non_recoverable: bool
    :ivar alternate_directory_paths: Data directory details.
    :vartype alternate_directory_paths:
     list[~azure.mgmt.recoveryservicesbackup.models.SQLDataDirectoryMapping]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSQLPointInTimeRestoreRequest".
    :vartype object_type: str
    :ivar point_in_time: PointInTime value.
    :vartype point_in_time: ~datetime.datetime
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["AzureWorkloadSQLPointInTimeRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSQLPointInTimeRestoreRequest\"."""
    point_in_time: Optional[datetime.datetime] = rest_field(
        name="pointInTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """PointInTime value."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
        should_use_alternate_target_location: Optional[bool] = None,
        is_non_recoverable: Optional[bool] = None,
        alternate_directory_paths: Optional[list["_models.SQLDataDirectoryMapping"]] = None,
        point_in_time: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSQLPointInTimeRestoreRequest"  # type: ignore


class AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest(
    AzureWorkloadSQLPointInTimeRestoreRequest, discriminator="AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest"
):  # pylint: disable=name-too-long
    """AzureWorkload SQL-specific restore with integrated rehydration of recovery point.

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest".
    :vartype object_type: str
    :ivar recovery_point_rehydration_info: RP Rehydration Info.
    :vartype recovery_point_rehydration_info:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointRehydrationInfo
    """

    object_type: Literal["AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest\"."""
    recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = rest_field(
        name="recoveryPointRehydrationInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """RP Rehydration Info."""

    @overload
    def __init__(
        self,
        *,
        recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSQLPointInTimeRestoreWithRehydrateRequest"  # type: ignore


class AzureWorkloadSQLRecoveryPointExtendedInfo(_Model):  # pylint: disable=name-too-long
    """Extended info class details.

    :ivar data_directory_time_in_utc: UTC time at which data directory info was captured.
    :vartype data_directory_time_in_utc: ~datetime.datetime
    :ivar data_directory_paths: List of data directory paths during restore operation.
    :vartype data_directory_paths: list[~azure.mgmt.recoveryservicesbackup.models.SQLDataDirectory]
    :ivar included_databases: List of databases included in recovery point.
    :vartype included_databases: list[~azure.mgmt.recoveryservicesbackup.models.DatabaseInRP]
    """

    data_directory_time_in_utc: Optional[datetime.datetime] = rest_field(
        name="dataDirectoryTimeInUTC", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """UTC time at which data directory info was captured."""
    data_directory_paths: Optional[list["_models.SQLDataDirectory"]] = rest_field(
        name="dataDirectoryPaths", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of data directory paths during restore operation."""
    included_databases: Optional[list["_models.DatabaseInRP"]] = rest_field(
        name="includedDatabases", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of databases included in recovery point."""

    @overload
    def __init__(
        self,
        *,
        data_directory_time_in_utc: Optional[datetime.datetime] = None,
        data_directory_paths: Optional[list["_models.SQLDataDirectory"]] = None,
        included_databases: Optional[list["_models.DatabaseInRP"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class AzureWorkloadSQLRestoreWithRehydrateRequest(
    AzureWorkloadSQLRestoreRequest, discriminator="AzureWorkloadSQLRestoreWithRehydrateRequest"
):  # pylint: disable=name-too-long
    """AzureWorkload SQL-specific restore with integrated rehydration of recovery point.

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM on which workload that was running
     is being recovered.
    :vartype source_resource_id: str
    :ivar property_bag: Workload specific property bag.
    :vartype property_bag: dict[str, str]
    :ivar target_info: Details of target database.
    :vartype target_info: ~azure.mgmt.recoveryservicesbackup.models.TargetRestoreInfo
    :ivar recovery_mode: Defines whether the current recovery mode is file restore or database
     restore. Known values are: "Invalid", "FileRecovery", "WorkloadRecovery", "SnapshotAttach",
     "RecoveryUsingSnapshot", and "SnapshotAttachAndRecover".
    :vartype recovery_mode: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryMode
    :ivar target_resource_group_name: Defines the Resource group of the Target VM.
    :vartype target_resource_group_name: str
    :ivar user_assigned_managed_identity_details: User Assigned managed identity details Currently
     used for snapshot.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    :ivar snapshot_restore_parameters: Additional details for snapshot recovery Currently used for
     snapshot for SAP Hana.
    :vartype snapshot_restore_parameters:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotRestoreParameters
    :ivar target_virtual_machine_id: This is the complete ARM Id of the target VM For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar should_use_alternate_target_location: Default option set to true. If this is set to
     false, alternate data directory must be provided.
    :vartype should_use_alternate_target_location: bool
    :ivar is_non_recoverable: SQL specific property where user can chose to set no-recovery when
     restore operation is tried.
    :vartype is_non_recoverable: bool
    :ivar alternate_directory_paths: Data directory details.
    :vartype alternate_directory_paths:
     list[~azure.mgmt.recoveryservicesbackup.models.SQLDataDirectoryMapping]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "AzureWorkloadSQLRestoreWithRehydrateRequest".
    :vartype object_type: str
    :ivar recovery_point_rehydration_info: RP Rehydration Info.
    :vartype recovery_point_rehydration_info:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointRehydrationInfo
    """

    object_type: Literal["AzureWorkloadSQLRestoreWithRehydrateRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"AzureWorkloadSQLRestoreWithRehydrateRequest\"."""
    recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = rest_field(
        name="recoveryPointRehydrationInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """RP Rehydration Info."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        property_bag: Optional[dict[str, str]] = None,
        target_info: Optional["_models.TargetRestoreInfo"] = None,
        recovery_mode: Optional[Union[str, "_models.RecoveryMode"]] = None,
        target_resource_group_name: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
        snapshot_restore_parameters: Optional["_models.SnapshotRestoreParameters"] = None,
        target_virtual_machine_id: Optional[str] = None,
        should_use_alternate_target_location: Optional[bool] = None,
        is_non_recoverable: Optional[bool] = None,
        alternate_directory_paths: Optional[list["_models.SQLDataDirectoryMapping"]] = None,
        recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "AzureWorkloadSQLRestoreWithRehydrateRequest"  # type: ignore


class Resource(_Model):
    """Resource.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    """

    id: Optional[str] = rest_field(visibility=["read"])
    """Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}."""
    name: Optional[str] = rest_field(visibility=["read"])
    """The name of the resource."""
    type: Optional[str] = rest_field(visibility=["read"])
    """The type of the resource. E.g. \"Microsoft.Compute/virtualMachines\" or
     \"Microsoft.Storage/storageAccounts\"."""
    system_data: Optional["_models.SystemData"] = rest_field(name="systemData", visibility=["read"])
    """Azure Resource Manager metadata containing createdBy and modifiedBy information."""


class ProxyResource(Resource):
    """Proxy Resource.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    """


class BackupEngineBaseResource(ProxyResource):
    """The base backup engine class. All workload specific backup engines derive from this class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: BackupEngineBaseResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.BackupEngineBase
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.BackupEngineBase"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """BackupEngineBaseResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.BackupEngineBase"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupEngineExtendedInfo(_Model):
    """Additional information on backup engine.

    :ivar database_name: Database name of backup engine.
    :vartype database_name: str
    :ivar protected_items_count: Number of protected items in the backup engine.
    :vartype protected_items_count: int
    :ivar protected_servers_count: Number of protected servers in the backup engine.
    :vartype protected_servers_count: int
    :ivar disk_count: Number of disks in the backup engine.
    :vartype disk_count: int
    :ivar used_disk_space: Disk space used in the backup engine.
    :vartype used_disk_space: float
    :ivar available_disk_space: Disk space currently available in the backup engine.
    :vartype available_disk_space: float
    :ivar refreshed_at: Last refresh time in the backup engine.
    :vartype refreshed_at: ~datetime.datetime
    :ivar azure_protected_instances: Protected instances in the backup engine.
    :vartype azure_protected_instances: int
    """

    database_name: Optional[str] = rest_field(
        name="databaseName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Database name of backup engine."""
    protected_items_count: Optional[int] = rest_field(
        name="protectedItemsCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of protected items in the backup engine."""
    protected_servers_count: Optional[int] = rest_field(
        name="protectedServersCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of protected servers in the backup engine."""
    disk_count: Optional[int] = rest_field(name="diskCount", visibility=["read", "create", "update", "delete", "query"])
    """Number of disks in the backup engine."""
    used_disk_space: Optional[float] = rest_field(
        name="usedDiskSpace", visibility=["read", "create", "update", "delete", "query"]
    )
    """Disk space used in the backup engine."""
    available_disk_space: Optional[float] = rest_field(
        name="availableDiskSpace", visibility=["read", "create", "update", "delete", "query"]
    )
    """Disk space currently available in the backup engine."""
    refreshed_at: Optional[datetime.datetime] = rest_field(
        name="refreshedAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Last refresh time in the backup engine."""
    azure_protected_instances: Optional[int] = rest_field(
        name="azureProtectedInstances", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protected instances in the backup engine."""

    @overload
    def __init__(
        self,
        *,
        database_name: Optional[str] = None,
        protected_items_count: Optional[int] = None,
        protected_servers_count: Optional[int] = None,
        disk_count: Optional[int] = None,
        used_disk_space: Optional[float] = None,
        available_disk_space: Optional[float] = None,
        refreshed_at: Optional[datetime.datetime] = None,
        azure_protected_instances: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupManagementUsage(_Model):
    """Backup management usages of a vault.

    :ivar unit: Unit of the usage. Known values are: "Count", "Bytes", "Seconds", "Percent",
     "CountPerSecond", and "BytesPerSecond".
    :vartype unit: str or ~azure.mgmt.recoveryservicesbackup.models.UsagesUnit
    :ivar quota_period: Quota period of usage.
    :vartype quota_period: str
    :ivar next_reset_time: Next reset time of usage.
    :vartype next_reset_time: ~datetime.datetime
    :ivar current_value: Current value of usage.
    :vartype current_value: int
    :ivar limit: Limit of usage.
    :vartype limit: int
    :ivar name: Name of usage.
    :vartype name: ~azure.mgmt.recoveryservicesbackup.models.NameInfo
    """

    unit: Optional[Union[str, "_models.UsagesUnit"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Unit of the usage. Known values are: \"Count\", \"Bytes\", \"Seconds\", \"Percent\",
     \"CountPerSecond\", and \"BytesPerSecond\"."""
    quota_period: Optional[str] = rest_field(
        name="quotaPeriod", visibility=["read", "create", "update", "delete", "query"]
    )
    """Quota period of usage."""
    next_reset_time: Optional[datetime.datetime] = rest_field(
        name="nextResetTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Next reset time of usage."""
    current_value: Optional[int] = rest_field(
        name="currentValue", visibility=["read", "create", "update", "delete", "query"]
    )
    """Current value of usage."""
    limit: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Limit of usage."""
    name: Optional["_models.NameInfo"] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Name of usage."""

    @overload
    def __init__(
        self,
        *,
        unit: Optional[Union[str, "_models.UsagesUnit"]] = None,
        quota_period: Optional[str] = None,
        next_reset_time: Optional[datetime.datetime] = None,
        current_value: Optional[int] = None,
        limit: Optional[int] = None,
        name: Optional["_models.NameInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupRequestResource(Resource):
    """Base class for backup request. Workload-specific backup requests are derived from this class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar location: Resource location.
    :vartype location: str
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    :ivar properties: BackupRequestResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.BackupRequest
    """

    location: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource location."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""
    properties: Optional["_models.BackupRequest"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """BackupRequestResource properties."""

    @overload
    def __init__(
        self,
        *,
        location: Optional[str] = None,
        tags: Optional[dict[str, str]] = None,
        e_tag: Optional[str] = None,
        properties: Optional["_models.BackupRequest"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupResourceConfig(_Model):
    """The resource storage details.

    :ivar storage_model_type: Storage type. Known values are: "Invalid", "GeoRedundant",
     "LocallyRedundant", "ZoneRedundant", and "ReadAccessGeoZoneRedundant".
    :vartype storage_model_type: str or ~azure.mgmt.recoveryservicesbackup.models.StorageType
    :ivar storage_type: Storage type. Known values are: "Invalid", "GeoRedundant",
     "LocallyRedundant", "ZoneRedundant", and "ReadAccessGeoZoneRedundant".
    :vartype storage_type: str or ~azure.mgmt.recoveryservicesbackup.models.StorageType
    :ivar storage_type_state: Locked or Unlocked. Once a machine is registered against a resource,
     the storageTypeState is always Locked. Known values are: "Invalid", "Locked", and "Unlocked".
    :vartype storage_type_state: str or ~azure.mgmt.recoveryservicesbackup.models.StorageTypeState
    :ivar cross_region_restore_flag: Opt in details of Cross Region Restore feature.
    :vartype cross_region_restore_flag: bool
    :ivar dedup_state: Vault Dedup state. Known values are: "Invalid", "Enabled", and "Disabled".
    :vartype dedup_state: str or ~azure.mgmt.recoveryservicesbackup.models.DedupState
    :ivar xcool_state: Vault x-cool state. Known values are: "Invalid", "Enabled", and "Disabled".
    :vartype xcool_state: str or ~azure.mgmt.recoveryservicesbackup.models.XcoolState
    """

    storage_model_type: Optional[Union[str, "_models.StorageType"]] = rest_field(
        name="storageModelType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Storage type. Known values are: \"Invalid\", \"GeoRedundant\", \"LocallyRedundant\",
     \"ZoneRedundant\", and \"ReadAccessGeoZoneRedundant\"."""
    storage_type: Optional[Union[str, "_models.StorageType"]] = rest_field(
        name="storageType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Storage type. Known values are: \"Invalid\", \"GeoRedundant\", \"LocallyRedundant\",
     \"ZoneRedundant\", and \"ReadAccessGeoZoneRedundant\"."""
    storage_type_state: Optional[Union[str, "_models.StorageTypeState"]] = rest_field(
        name="storageTypeState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Locked or Unlocked. Once a machine is registered against a resource, the storageTypeState is
     always Locked. Known values are: \"Invalid\", \"Locked\", and \"Unlocked\"."""
    cross_region_restore_flag: Optional[bool] = rest_field(
        name="crossRegionRestoreFlag", visibility=["read", "create", "update", "delete", "query"]
    )
    """Opt in details of Cross Region Restore feature."""
    dedup_state: Optional[Union[str, "_models.DedupState"]] = rest_field(
        name="dedupState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Vault Dedup state. Known values are: \"Invalid\", \"Enabled\", and \"Disabled\"."""
    xcool_state: Optional[Union[str, "_models.XcoolState"]] = rest_field(
        name="xcoolState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Vault x-cool state. Known values are: \"Invalid\", \"Enabled\", and \"Disabled\"."""

    @overload
    def __init__(
        self,
        *,
        storage_model_type: Optional[Union[str, "_models.StorageType"]] = None,
        storage_type: Optional[Union[str, "_models.StorageType"]] = None,
        storage_type_state: Optional[Union[str, "_models.StorageTypeState"]] = None,
        cross_region_restore_flag: Optional[bool] = None,
        dedup_state: Optional[Union[str, "_models.DedupState"]] = None,
        xcool_state: Optional[Union[str, "_models.XcoolState"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupResourceConfigResource(ProxyResource):
    """The resource storage details.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: BackupResourceConfigResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.BackupResourceConfig
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.BackupResourceConfig"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """BackupResourceConfigResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.BackupResourceConfig"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupResourceEncryptionConfig(_Model):
    """BackupResourceEncryptionConfig.

    :ivar encryption_at_rest_type: Encryption At Rest Type. Known values are: "Invalid",
     "MicrosoftManaged", and "CustomerManaged".
    :vartype encryption_at_rest_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.EncryptionAtRestType
    :ivar key_uri: Key Vault Key URI.
    :vartype key_uri: str
    :ivar subscription_id: Key Vault Subscription Id.
    :vartype subscription_id: str
    :ivar last_update_status: Known values are: "Invalid", "NotEnabled", "PartiallySucceeded",
     "PartiallyFailed", "Failed", "Succeeded", "Initialized", and "FirstInitialization".
    :vartype last_update_status: str or ~azure.mgmt.recoveryservicesbackup.models.LastUpdateStatus
    :ivar infrastructure_encryption_state: Known values are: "Invalid", "Disabled", and "Enabled".
    :vartype infrastructure_encryption_state: str or
     ~azure.mgmt.recoveryservicesbackup.models.InfrastructureEncryptionState
    """

    encryption_at_rest_type: Optional[Union[str, "_models.EncryptionAtRestType"]] = rest_field(
        name="encryptionAtRestType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Encryption At Rest Type. Known values are: \"Invalid\", \"MicrosoftManaged\", and
     \"CustomerManaged\"."""
    key_uri: Optional[str] = rest_field(name="keyUri", visibility=["read", "create", "update", "delete", "query"])
    """Key Vault Key URI."""
    subscription_id: Optional[str] = rest_field(
        name="subscriptionId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Key Vault Subscription Id."""
    last_update_status: Optional[Union[str, "_models.LastUpdateStatus"]] = rest_field(
        name="lastUpdateStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Known values are: \"Invalid\", \"NotEnabled\", \"PartiallySucceeded\", \"PartiallyFailed\",
     \"Failed\", \"Succeeded\", \"Initialized\", and \"FirstInitialization\"."""
    infrastructure_encryption_state: Optional[Union[str, "_models.InfrastructureEncryptionState"]] = rest_field(
        name="infrastructureEncryptionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Known values are: \"Invalid\", \"Disabled\", and \"Enabled\"."""

    @overload
    def __init__(
        self,
        *,
        encryption_at_rest_type: Optional[Union[str, "_models.EncryptionAtRestType"]] = None,
        key_uri: Optional[str] = None,
        subscription_id: Optional[str] = None,
        last_update_status: Optional[Union[str, "_models.LastUpdateStatus"]] = None,
        infrastructure_encryption_state: Optional[Union[str, "_models.InfrastructureEncryptionState"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupResourceEncryptionConfigExtended(BackupResourceEncryptionConfig):
    """BackupResourceEncryptionConfigExtended.

    :ivar encryption_at_rest_type: Encryption At Rest Type. Known values are: "Invalid",
     "MicrosoftManaged", and "CustomerManaged".
    :vartype encryption_at_rest_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.EncryptionAtRestType
    :ivar key_uri: Key Vault Key URI.
    :vartype key_uri: str
    :ivar subscription_id: Key Vault Subscription Id.
    :vartype subscription_id: str
    :ivar last_update_status: Known values are: "Invalid", "NotEnabled", "PartiallySucceeded",
     "PartiallyFailed", "Failed", "Succeeded", "Initialized", and "FirstInitialization".
    :vartype last_update_status: str or ~azure.mgmt.recoveryservicesbackup.models.LastUpdateStatus
    :ivar infrastructure_encryption_state: Known values are: "Invalid", "Disabled", and "Enabled".
    :vartype infrastructure_encryption_state: str or
     ~azure.mgmt.recoveryservicesbackup.models.InfrastructureEncryptionState
    :ivar user_assigned_identity: User Assigned Identity Id.
    :vartype user_assigned_identity: str
    :ivar use_system_assigned_identity: bool to indicate whether to use system Assigned Identity or
     not.
    :vartype use_system_assigned_identity: bool
    """

    user_assigned_identity: Optional[str] = rest_field(
        name="userAssignedIdentity", visibility=["read", "create", "update", "delete", "query"]
    )
    """User Assigned Identity Id."""
    use_system_assigned_identity: Optional[bool] = rest_field(
        name="useSystemAssignedIdentity", visibility=["read", "create", "update", "delete", "query"]
    )
    """bool to indicate whether to use system Assigned Identity or not."""

    @overload
    def __init__(
        self,
        *,
        encryption_at_rest_type: Optional[Union[str, "_models.EncryptionAtRestType"]] = None,
        key_uri: Optional[str] = None,
        subscription_id: Optional[str] = None,
        last_update_status: Optional[Union[str, "_models.LastUpdateStatus"]] = None,
        infrastructure_encryption_state: Optional[Union[str, "_models.InfrastructureEncryptionState"]] = None,
        user_assigned_identity: Optional[str] = None,
        use_system_assigned_identity: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupResourceEncryptionConfigExtendedResource(ProxyResource):  # pylint: disable=name-too-long
    """BackupResourceEncryptionConfigExtendedResource.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: The properties of the backup resource encryption config extended resource.
    :vartype properties:
     ~azure.mgmt.recoveryservicesbackup.models.BackupResourceEncryptionConfigExtended
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.BackupResourceEncryptionConfigExtended"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """The properties of the backup resource encryption config extended resource."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.BackupResourceEncryptionConfigExtended"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupResourceEncryptionConfigResource(Resource):
    """BackupResourceEncryptionConfigResource.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: The properties of the backup resource encryption config.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.BackupResourceEncryptionConfig
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.BackupResourceEncryptionConfig"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """The properties of the backup resource encryption config."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.BackupResourceEncryptionConfig"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupResourceVaultConfig(_Model):
    """Backup resource vault config details.

    :ivar storage_model_type: Storage type. Known values are: "Invalid", "GeoRedundant",
     "LocallyRedundant", "ZoneRedundant", and "ReadAccessGeoZoneRedundant".
    :vartype storage_model_type: str or ~azure.mgmt.recoveryservicesbackup.models.StorageType
    :ivar storage_type: Storage type. Known values are: "Invalid", "GeoRedundant",
     "LocallyRedundant", "ZoneRedundant", and "ReadAccessGeoZoneRedundant".
    :vartype storage_type: str or ~azure.mgmt.recoveryservicesbackup.models.StorageType
    :ivar storage_type_state: Locked or Unlocked. Once a machine is registered against a resource,
     the storageTypeState is always Locked. Known values are: "Invalid", "Locked", and "Unlocked".
    :vartype storage_type_state: str or ~azure.mgmt.recoveryservicesbackup.models.StorageTypeState
    :ivar enhanced_security_state: Enabled or Disabled. Known values are: "Invalid", "Enabled", and
     "Disabled".
    :vartype enhanced_security_state: str or
     ~azure.mgmt.recoveryservicesbackup.models.EnhancedSecurityState
    :ivar soft_delete_feature_state: Soft Delete feature state. Known values are: "Invalid",
     "Enabled", "Disabled", and "AlwaysON".
    :vartype soft_delete_feature_state: str or
     ~azure.mgmt.recoveryservicesbackup.models.SoftDeleteFeatureState
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_soft_delete_feature_state_editable: This flag is no longer in use. Please use
     'softDeleteFeatureState' to set the soft delete state for the vault.
    :vartype is_soft_delete_feature_state_editable: bool
    """

    storage_model_type: Optional[Union[str, "_models.StorageType"]] = rest_field(
        name="storageModelType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Storage type. Known values are: \"Invalid\", \"GeoRedundant\", \"LocallyRedundant\",
     \"ZoneRedundant\", and \"ReadAccessGeoZoneRedundant\"."""
    storage_type: Optional[Union[str, "_models.StorageType"]] = rest_field(
        name="storageType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Storage type. Known values are: \"Invalid\", \"GeoRedundant\", \"LocallyRedundant\",
     \"ZoneRedundant\", and \"ReadAccessGeoZoneRedundant\"."""
    storage_type_state: Optional[Union[str, "_models.StorageTypeState"]] = rest_field(
        name="storageTypeState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Locked or Unlocked. Once a machine is registered against a resource, the storageTypeState is
     always Locked. Known values are: \"Invalid\", \"Locked\", and \"Unlocked\"."""
    enhanced_security_state: Optional[Union[str, "_models.EnhancedSecurityState"]] = rest_field(
        name="enhancedSecurityState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Enabled or Disabled. Known values are: \"Invalid\", \"Enabled\", and \"Disabled\"."""
    soft_delete_feature_state: Optional[Union[str, "_models.SoftDeleteFeatureState"]] = rest_field(
        name="softDeleteFeatureState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Soft Delete feature state. Known values are: \"Invalid\", \"Enabled\", \"Disabled\", and
     \"AlwaysON\"."""
    soft_delete_retention_period_in_days: Optional[int] = rest_field(
        name="softDeleteRetentionPeriodInDays", visibility=["read", "create", "update", "delete", "query"]
    )
    """Soft delete retention period in days."""
    resource_guard_operation_requests: Optional[list[str]] = rest_field(
        name="resourceGuardOperationRequests", visibility=["read", "create", "update", "delete", "query"]
    )
    """ResourceGuard Operation Requests."""
    is_soft_delete_feature_state_editable: Optional[bool] = rest_field(
        name="isSoftDeleteFeatureStateEditable", visibility=["read", "create", "update", "delete", "query"]
    )
    """This flag is no longer in use. Please use 'softDeleteFeatureState' to set the soft delete state
     for the vault."""

    @overload
    def __init__(
        self,
        *,
        storage_model_type: Optional[Union[str, "_models.StorageType"]] = None,
        storage_type: Optional[Union[str, "_models.StorageType"]] = None,
        storage_type_state: Optional[Union[str, "_models.StorageTypeState"]] = None,
        enhanced_security_state: Optional[Union[str, "_models.EnhancedSecurityState"]] = None,
        soft_delete_feature_state: Optional[Union[str, "_models.SoftDeleteFeatureState"]] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_soft_delete_feature_state_editable: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupResourceVaultConfigResource(ProxyResource):
    """Backup resource vault config details.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: BackupResourceVaultConfigResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.BackupResourceVaultConfig
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.BackupResourceVaultConfig"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """BackupResourceVaultConfigResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.BackupResourceVaultConfig"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupStatusRequest(_Model):
    """BackupStatus request.

    :ivar resource_type: Container Type - VM, SQLPaaS, DPM, AzureFileShare... Known values are:
     "Invalid", "VM", "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM",
     "SystemState", "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare",
     "SAPHanaDatabase", "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype resource_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar resource_id: Entire ARM resource id of the resource.
    :vartype resource_id: str
    :ivar po_logical_name: Protectable Item Logical Name.
    :vartype po_logical_name: str
    """

    resource_type: Optional[Union[str, "_models.DataSourceType"]] = rest_field(
        name="resourceType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Container Type - VM, SQLPaaS, DPM, AzureFileShare... Known values are: \"Invalid\", \"VM\",
     \"FileFolder\", \"AzureSqlDb\", \"SQLDB\", \"Exchange\", \"Sharepoint\", \"VMwareVM\",
     \"SystemState\", \"Client\", \"GenericDataSource\", \"SQLDataBase\", \"AzureFileShare\",
     \"SAPHanaDatabase\", \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""
    resource_id: Optional[str] = rest_field(
        name="resourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Entire ARM resource id of the resource."""
    po_logical_name: Optional[str] = rest_field(
        name="poLogicalName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protectable Item Logical Name."""

    @overload
    def __init__(
        self,
        *,
        resource_type: Optional[Union[str, "_models.DataSourceType"]] = None,
        resource_id: Optional[str] = None,
        po_logical_name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BackupStatusResponse(_Model):
    """BackupStatus response.

    :ivar protection_status: Specifies whether the container is registered or not. Known values
     are: "Invalid", "NotProtected", "Protecting", "Protected", and "ProtectionFailed".
    :vartype protection_status: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionStatus
    :ivar vault_id: Specifies the arm resource id of the vault.
    :vartype vault_id: str
    :ivar fabric_name: Specifies the fabric name - Azure or AD. Known values are: "Invalid" and
     "Azure".
    :vartype fabric_name: str or ~azure.mgmt.recoveryservicesbackup.models.FabricName
    :ivar container_name: Specifies the product specific container name. E.g.
     iaasvmcontainer;iaasvmcontainer;csname;vmname.
    :vartype container_name: str
    :ivar protected_item_name: Specifies the product specific ds name. E.g.
     vm;iaasvmcontainer;csname;vmname.
    :vartype protected_item_name: str
    :ivar error_code: ErrorCode in case of intent failed.
    :vartype error_code: str
    :ivar error_message: ErrorMessage in case of intent failed.
    :vartype error_message: str
    :ivar policy_name: Specifies the policy name which is used for protection.
    :vartype policy_name: str
    :ivar registration_status: Container registration status.
    :vartype registration_status: str
    :ivar protected_items_count: Number of protected items.
    :vartype protected_items_count: int
    :ivar acquire_storage_account_lock: Specifies whether the storage account lock has been
     acquired or not. Known values are: "Acquire" and "NotAcquire".
    :vartype acquire_storage_account_lock: str or
     ~azure.mgmt.recoveryservicesbackup.models.AcquireStorageAccountLock
    """

    protection_status: Optional[Union[str, "_models.ProtectionStatus"]] = rest_field(
        name="protectionStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies whether the container is registered or not. Known values are: \"Invalid\",
     \"NotProtected\", \"Protecting\", \"Protected\", and \"ProtectionFailed\"."""
    vault_id: Optional[str] = rest_field(name="vaultId", visibility=["read", "create", "update", "delete", "query"])
    """Specifies the arm resource id of the vault."""
    fabric_name: Optional[Union[str, "_models.FabricName"]] = rest_field(
        name="fabricName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies the fabric name - Azure or AD. Known values are: \"Invalid\" and \"Azure\"."""
    container_name: Optional[str] = rest_field(
        name="containerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies the product specific container name. E.g.
     iaasvmcontainer;iaasvmcontainer;csname;vmname."""
    protected_item_name: Optional[str] = rest_field(
        name="protectedItemName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies the product specific ds name. E.g. vm;iaasvmcontainer;csname;vmname."""
    error_code: Optional[str] = rest_field(name="errorCode", visibility=["read", "create", "update", "delete", "query"])
    """ErrorCode in case of intent failed."""
    error_message: Optional[str] = rest_field(
        name="errorMessage", visibility=["read", "create", "update", "delete", "query"]
    )
    """ErrorMessage in case of intent failed."""
    policy_name: Optional[str] = rest_field(
        name="policyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies the policy name which is used for protection."""
    registration_status: Optional[str] = rest_field(
        name="registrationStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Container registration status."""
    protected_items_count: Optional[int] = rest_field(
        name="protectedItemsCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of protected items."""
    acquire_storage_account_lock: Optional[Union[str, "_models.AcquireStorageAccountLock"]] = rest_field(
        name="acquireStorageAccountLock", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies whether the storage account lock has been acquired or not. Known values are:
     \"Acquire\" and \"NotAcquire\"."""

    @overload
    def __init__(
        self,
        *,
        protection_status: Optional[Union[str, "_models.ProtectionStatus"]] = None,
        vault_id: Optional[str] = None,
        fabric_name: Optional[Union[str, "_models.FabricName"]] = None,
        container_name: Optional[str] = None,
        protected_item_name: Optional[str] = None,
        error_code: Optional[str] = None,
        error_message: Optional[str] = None,
        policy_name: Optional[str] = None,
        registration_status: Optional[str] = None,
        protected_items_count: Optional[int] = None,
        acquire_storage_account_lock: Optional[Union[str, "_models.AcquireStorageAccountLock"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class BEKDetails(_Model):
    """BEK is bitlocker encryption key.

    :ivar secret_url: Secret is BEK.
    :vartype secret_url: str
    :ivar secret_vault_id: ID of the Key Vault where this Secret is stored.
    :vartype secret_vault_id: str
    :ivar secret_data: BEK data.
    :vartype secret_data: str
    """

    secret_url: Optional[str] = rest_field(name="secretUrl", visibility=["read", "create", "update", "delete", "query"])
    """Secret is BEK."""
    secret_vault_id: Optional[str] = rest_field(
        name="secretVaultId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ID of the Key Vault where this Secret is stored."""
    secret_data: Optional[str] = rest_field(
        name="secretData", visibility=["read", "create", "update", "delete", "query"]
    )
    """BEK data."""

    @overload
    def __init__(
        self,
        *,
        secret_url: Optional[str] = None,
        secret_vault_id: Optional[str] = None,
        secret_data: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ClientDiscoveryDisplay(_Model):
    """Localized display information of an operation.

    :ivar provider: Name of the provider for display purposes.
    :vartype provider: str
    :ivar resource: ResourceType for which this Operation can be performed.
    :vartype resource: str
    :ivar operation: Operations Name itself.
    :vartype operation: str
    :ivar description: Description of the operation having details of what operation is about.
    :vartype description: str
    """

    provider: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Name of the provider for display purposes."""
    resource: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """ResourceType for which this Operation can be performed."""
    operation: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Operations Name itself."""
    description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Description of the operation having details of what operation is about."""

    @overload
    def __init__(
        self,
        *,
        provider: Optional[str] = None,
        resource: Optional[str] = None,
        operation: Optional[str] = None,
        description: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ClientDiscoveryForLogSpecification(_Model):
    """Class to represent shoebox log specification in json client discovery.

    :ivar name: Name for shoebox log specification.
    :vartype name: str
    :ivar display_name: Localized display name.
    :vartype display_name: str
    :ivar blob_duration: blob duration of shoebox log specification.
    :vartype blob_duration: str
    """

    name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Name for shoebox log specification."""
    display_name: Optional[str] = rest_field(
        name="displayName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Localized display name."""
    blob_duration: Optional[str] = rest_field(
        name="blobDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """blob duration of shoebox log specification."""

    @overload
    def __init__(
        self,
        *,
        name: Optional[str] = None,
        display_name: Optional[str] = None,
        blob_duration: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ClientDiscoveryForProperties(_Model):
    """Class to represent shoebox properties in json client discovery.

    :ivar service_specification: Operation properties.
    :vartype service_specification:
     ~azure.mgmt.recoveryservicesbackup.models.ClientDiscoveryForServiceSpecification
    """

    service_specification: Optional["_models.ClientDiscoveryForServiceSpecification"] = rest_field(
        name="serviceSpecification", visibility=["read", "create", "update", "delete", "query"]
    )
    """Operation properties."""

    @overload
    def __init__(
        self,
        *,
        service_specification: Optional["_models.ClientDiscoveryForServiceSpecification"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ClientDiscoveryForServiceSpecification(_Model):
    """Class to represent shoebox service specification in json client discovery.

    :ivar log_specifications: List of log specifications of this operation.
    :vartype log_specifications:
     list[~azure.mgmt.recoveryservicesbackup.models.ClientDiscoveryForLogSpecification]
    """

    log_specifications: Optional[list["_models.ClientDiscoveryForLogSpecification"]] = rest_field(
        name="logSpecifications", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of log specifications of this operation."""

    @overload
    def __init__(
        self,
        *,
        log_specifications: Optional[list["_models.ClientDiscoveryForLogSpecification"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ClientDiscoveryValueForSingleApi(_Model):
    """Available operation details.

    :ivar name: Name of the Operation.
    :vartype name: str
    :ivar display: Contains the localized display information for this particular operation.
    :vartype display: ~azure.mgmt.recoveryservicesbackup.models.ClientDiscoveryDisplay
    :ivar origin: The intended executor of the operation;governs the display of the operation in
     the RBAC UX and the audit logs UX.
    :vartype origin: str
    :ivar properties: ShoeBox properties for the given operation.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ClientDiscoveryForProperties
    """

    name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Name of the Operation."""
    display: Optional["_models.ClientDiscoveryDisplay"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Contains the localized display information for this particular operation."""
    origin: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """The intended executor of the operation;governs the display of the operation in the RBAC UX and
     the audit logs UX."""
    properties: Optional["_models.ClientDiscoveryForProperties"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """ShoeBox properties for the given operation."""

    @overload
    def __init__(
        self,
        *,
        name: Optional[str] = None,
        display: Optional["_models.ClientDiscoveryDisplay"] = None,
        origin: Optional[str] = None,
        properties: Optional["_models.ClientDiscoveryForProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ClientScriptForConnect(_Model):
    """Client script details for file / folder restore.

    :ivar script_content: File content of the client script for file / folder restore.
    :vartype script_content: str
    :ivar script_extension: File extension of the client script for file / folder restore - .ps1 ,
     .sh , etc.
    :vartype script_extension: str
    :ivar os_type: OS type - Windows, Linux etc. for which this file / folder restore client script
     works.
    :vartype os_type: str
    :ivar url: URL of Executable from where to source the content. If this is not null then
     ScriptContent should not be used.
    :vartype url: str
    :ivar script_name_suffix: Mandatory suffix that should be added to the name of script that is
     given for download to user. If its null or empty then , ignore it.
    :vartype script_name_suffix: str
    """

    script_content: Optional[str] = rest_field(
        name="scriptContent", visibility=["read", "create", "update", "delete", "query"]
    )
    """File content of the client script for file / folder restore."""
    script_extension: Optional[str] = rest_field(
        name="scriptExtension", visibility=["read", "create", "update", "delete", "query"]
    )
    """File extension of the client script for file / folder restore - .ps1 , .sh , etc."""
    os_type: Optional[str] = rest_field(name="osType", visibility=["read", "create", "update", "delete", "query"])
    """OS type - Windows, Linux etc. for which this file / folder restore client script works."""
    url: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """URL of Executable from where to source the content. If this is not null then ScriptContent
     should not be used."""
    script_name_suffix: Optional[str] = rest_field(
        name="scriptNameSuffix", visibility=["read", "create", "update", "delete", "query"]
    )
    """Mandatory suffix that should be added to the name of script that is given for download to user.
     If its null or empty then , ignore it."""

    @overload
    def __init__(
        self,
        *,
        script_content: Optional[str] = None,
        script_extension: Optional[str] = None,
        os_type: Optional[str] = None,
        url: Optional[str] = None,
        script_name_suffix: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ContainerIdentityInfo(_Model):
    """Container identity information.

    :ivar unique_name: Unique name of the container.
    :vartype unique_name: str
    :ivar aad_tenant_id: Protection container identity - AAD Tenant.
    :vartype aad_tenant_id: str
    :ivar service_principal_client_id: Protection container identity - AAD Service Principal.
    :vartype service_principal_client_id: str
    :ivar audience: Protection container identity - Audience.
    :vartype audience: str
    """

    unique_name: Optional[str] = rest_field(
        name="uniqueName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Unique name of the container."""
    aad_tenant_id: Optional[str] = rest_field(
        name="aadTenantId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protection container identity - AAD Tenant."""
    service_principal_client_id: Optional[str] = rest_field(
        name="servicePrincipalClientId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protection container identity - AAD Service Principal."""
    audience: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Protection container identity - Audience."""

    @overload
    def __init__(
        self,
        *,
        unique_name: Optional[str] = None,
        aad_tenant_id: Optional[str] = None,
        service_principal_client_id: Optional[str] = None,
        audience: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DailyRetentionFormat(_Model):
    """Daily retention format.

    :ivar days_of_the_month: List of days of the month.
    :vartype days_of_the_month: list[~azure.mgmt.recoveryservicesbackup.models.Day]
    """

    days_of_the_month: Optional[list["_models.Day"]] = rest_field(
        name="daysOfTheMonth", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of days of the month."""

    @overload
    def __init__(
        self,
        *,
        days_of_the_month: Optional[list["_models.Day"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DailyRetentionSchedule(_Model):
    """Daily retention schedule.

    :ivar retention_times: Retention times of retention policy.
    :vartype retention_times: list[~datetime.datetime]
    :ivar retention_duration: Retention duration of retention Policy.
    :vartype retention_duration: ~azure.mgmt.recoveryservicesbackup.models.RetentionDuration
    """

    retention_times: Optional[list[datetime.datetime]] = rest_field(
        name="retentionTimes", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Retention times of retention policy."""
    retention_duration: Optional["_models.RetentionDuration"] = rest_field(
        name="retentionDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention duration of retention Policy."""

    @overload
    def __init__(
        self,
        *,
        retention_times: Optional[list[datetime.datetime]] = None,
        retention_duration: Optional["_models.RetentionDuration"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DailySchedule(_Model):
    """DailySchedule.

    :ivar schedule_run_times: List of times of day this schedule has to be run.
    :vartype schedule_run_times: list[~datetime.datetime]
    """

    schedule_run_times: Optional[list[datetime.datetime]] = rest_field(
        name="scheduleRunTimes", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """List of times of day this schedule has to be run."""

    @overload
    def __init__(
        self,
        *,
        schedule_run_times: Optional[list[datetime.datetime]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DatabaseInRP(_Model):
    """Database included in RP.

    :ivar datasource_id: Datasource Id for the database.
    :vartype datasource_id: str
    :ivar datasource_name: Datasource name for the database.
    :vartype datasource_name: str
    """

    datasource_id: Optional[str] = rest_field(
        name="datasourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Datasource Id for the database."""
    datasource_name: Optional[str] = rest_field(
        name="datasourceName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Datasource name for the database."""

    @overload
    def __init__(
        self,
        *,
        datasource_id: Optional[str] = None,
        datasource_name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class Day(_Model):
    """Day of the week.

    :ivar date: Date of the month.
    :vartype date: int
    :ivar is_last: Whether Date is last date of month.
    :vartype is_last: bool
    """

    date: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Date of the month."""
    is_last: Optional[bool] = rest_field(name="isLast", visibility=["read", "create", "update", "delete", "query"])
    """Whether Date is last date of month."""

    @overload
    def __init__(
        self,
        *,
        date: Optional[int] = None,
        is_last: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DiskExclusionProperties(_Model):
    """DiskExclusionProperties.

    :ivar disk_lun_list: List of Disks' Logical Unit Numbers (LUN) to be used for VM Protection.
    :vartype disk_lun_list: list[int]
    :ivar is_inclusion_list: Flag to indicate whether DiskLunList is to be included/ excluded from
     backup.
    :vartype is_inclusion_list: bool
    """

    disk_lun_list: Optional[list[int]] = rest_field(
        name="diskLunList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of Disks' Logical Unit Numbers (LUN) to be used for VM Protection."""
    is_inclusion_list: Optional[bool] = rest_field(
        name="isInclusionList", visibility=["read", "create", "update", "delete", "query"]
    )
    """Flag to indicate whether DiskLunList is to be included/ excluded from backup."""

    @overload
    def __init__(
        self,
        *,
        disk_lun_list: Optional[list[int]] = None,
        is_inclusion_list: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DiskInformation(_Model):
    """Disk information.

    :ivar lun:
    :vartype lun: int
    :ivar name:
    :vartype name: str
    """

    lun: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])

    @overload
    def __init__(
        self,
        *,
        lun: Optional[int] = None,
        name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DistributedNodesInfo(_Model):
    """This is used to represent the various nodes of the distributed container.

    :ivar node_name: Name of the node under a distributed container.
    :vartype node_name: str
    :ivar status: Status of this Node. Failed | Succeeded.
    :vartype status: str
    :ivar error_detail: Error Details if the Status is non-success.
    :vartype error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar source_resource_id: ARM resource id of the node.
    :vartype source_resource_id: str
    """

    node_name: Optional[str] = rest_field(name="nodeName", visibility=["read", "create", "update", "delete", "query"])
    """Name of the node under a distributed container."""
    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Status of this Node. Failed | Succeeded."""
    error_detail: Optional["_models.ErrorDetail"] = rest_field(
        name="errorDetail", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error Details if the Status is non-success."""
    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ARM resource id of the node."""

    @overload
    def __init__(
        self,
        *,
        node_name: Optional[str] = None,
        status: Optional[str] = None,
        error_detail: Optional["_models.ErrorDetail"] = None,
        source_resource_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DpmBackupEngine(BackupEngineBase, discriminator="DpmBackupEngine"):
    """Data Protection Manager (DPM) specific backup engine.

    :ivar friendly_name: Friendly name of the backup engine.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the backup engine. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Registration status of the backup engine with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar backup_engine_state: Status of the backup engine with the Recovery Services Vault. =
     {Active/Deleting/DeleteFailed}.
    :vartype backup_engine_state: str
    :ivar health_status: Backup status of the backup engine.
    :vartype health_status: str
    :ivar can_re_register: Flag indicating if the backup engine be registered, once already
     registered.
    :vartype can_re_register: bool
    :ivar backup_engine_id: ID of the backup engine.
    :vartype backup_engine_id: str
    :ivar dpm_version: Backup engine version.
    :vartype dpm_version: str
    :ivar azure_backup_agent_version: Backup agent version.
    :vartype azure_backup_agent_version: str
    :ivar is_azure_backup_agent_upgrade_available: To check if backup agent upgrade available.
    :vartype is_azure_backup_agent_upgrade_available: bool
    :ivar is_dpm_upgrade_available: To check if backup engine upgrade available.
    :vartype is_dpm_upgrade_available: bool
    :ivar extended_info: Extended info of the backupengine.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.BackupEngineExtendedInfo
    :ivar backup_engine_type: Type of the backup engine. Required. DPM_BACKUP_ENGINE.
    :vartype backup_engine_type: str or ~azure.mgmt.recoveryservicesbackup.models.DPM_BACKUP_ENGINE
    """

    backup_engine_type: Literal[BackupEngineType.DPM_BACKUP_ENGINE] = rest_discriminator(name="backupEngineType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the backup engine. Required. DPM_BACKUP_ENGINE."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        backup_engine_state: Optional[str] = None,
        health_status: Optional[str] = None,
        can_re_register: Optional[bool] = None,
        backup_engine_id: Optional[str] = None,
        dpm_version: Optional[str] = None,
        azure_backup_agent_version: Optional[str] = None,
        is_azure_backup_agent_upgrade_available: Optional[bool] = None,
        is_dpm_upgrade_available: Optional[bool] = None,
        extended_info: Optional["_models.BackupEngineExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.backup_engine_type = BackupEngineType.DPM_BACKUP_ENGINE  # type: ignore


class DPMContainerExtendedInfo(_Model):
    """Additional information of the DPMContainer.

    :ivar last_refreshed_at: Last refresh time of the DPMContainer.
    :vartype last_refreshed_at: ~datetime.datetime
    """

    last_refreshed_at: Optional[datetime.datetime] = rest_field(
        name="lastRefreshedAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Last refresh time of the DPMContainer."""

    @overload
    def __init__(
        self,
        *,
        last_refreshed_at: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DpmErrorInfo(_Model):
    """DPM workload-specific error information.

    :ivar error_string: Localized error string.
    :vartype error_string: str
    :ivar recommendations: List of localized recommendations for above error code.
    :vartype recommendations: list[str]
    """

    error_string: Optional[str] = rest_field(
        name="errorString", visibility=["read", "create", "update", "delete", "query"]
    )
    """Localized error string."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """List of localized recommendations for above error code."""

    @overload
    def __init__(
        self,
        *,
        error_string: Optional[str] = None,
        recommendations: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DpmJob(Job, discriminator="DpmJob"):
    """DPM workload-specific job object.

    :ivar entity_friendly_name: Friendly name of the entity on which the current job is executing.
    :vartype entity_friendly_name: str
    :ivar backup_management_type: Backup management type to execute the current job. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar operation: The operation name.
    :vartype operation: str
    :ivar status: Job status.
    :vartype status: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar activity_id: ActivityId of job.
    :vartype activity_id: str
    :ivar duration: Time elapsed for job.
    :vartype duration: ~datetime.timedelta
    :ivar dpm_server_name: DPM server name managing the backup item or backup job.
    :vartype dpm_server_name: str
    :ivar container_name: Name of cluster/server protecting current backup item, if any.
    :vartype container_name: str
    :ivar container_type: Type of container.
    :vartype container_type: str
    :ivar workload_type: Type of backup item.
    :vartype workload_type: str
    :ivar actions_info: The state/actions applicable on this job like cancel/retry.
    :vartype actions_info: list[str or
     ~azure.mgmt.recoveryservicesbackup.models.JobSupportedAction]
    :ivar error_details: The errors.
    :vartype error_details: list[~azure.mgmt.recoveryservicesbackup.models.DpmErrorInfo]
    :ivar extended_info: Additional information for this job.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.DpmJobExtendedInfo
    :ivar job_type: This property will be used as the discriminator for deciding the specific types
     in the polymorphic chain of types. Required. Default value is "DpmJob".
    :vartype job_type: str
    """

    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed for job."""
    dpm_server_name: Optional[str] = rest_field(
        name="dpmServerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """DPM server name managing the backup item or backup job."""
    container_name: Optional[str] = rest_field(
        name="containerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of cluster/server protecting current backup item, if any."""
    container_type: Optional[str] = rest_field(
        name="containerType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of container."""
    workload_type: Optional[str] = rest_field(
        name="workloadType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup item."""
    actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = rest_field(
        name="actionsInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """The state/actions applicable on this job like cancel/retry."""
    error_details: Optional[list["_models.DpmErrorInfo"]] = rest_field(
        name="errorDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """The errors."""
    extended_info: Optional["_models.DpmJobExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information for this job."""
    job_type: Literal["DpmJob"] = rest_discriminator(name="jobType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"DpmJob\"."""

    @overload
    def __init__(
        self,
        *,
        entity_friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        operation: Optional[str] = None,
        status: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        activity_id: Optional[str] = None,
        duration: Optional[datetime.timedelta] = None,
        dpm_server_name: Optional[str] = None,
        container_name: Optional[str] = None,
        container_type: Optional[str] = None,
        workload_type: Optional[str] = None,
        actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = None,
        error_details: Optional[list["_models.DpmErrorInfo"]] = None,
        extended_info: Optional["_models.DpmJobExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.job_type = "DpmJob"  # type: ignore


class DpmJobExtendedInfo(_Model):
    """Additional information on the DPM workload-specific job.

    :ivar tasks_list: List of tasks associated with this job.
    :vartype tasks_list: list[~azure.mgmt.recoveryservicesbackup.models.DpmJobTaskDetails]
    :ivar property_bag: The job properties.
    :vartype property_bag: dict[str, str]
    :ivar dynamic_error_message: Non localized error message on job execution.
    :vartype dynamic_error_message: str
    """

    tasks_list: Optional[list["_models.DpmJobTaskDetails"]] = rest_field(
        name="tasksList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of tasks associated with this job."""
    property_bag: Optional[dict[str, str]] = rest_field(
        name="propertyBag", visibility=["read", "create", "update", "delete", "query"]
    )
    """The job properties."""
    dynamic_error_message: Optional[str] = rest_field(
        name="dynamicErrorMessage", visibility=["read", "create", "update", "delete", "query"]
    )
    """Non localized error message on job execution."""

    @overload
    def __init__(
        self,
        *,
        tasks_list: Optional[list["_models.DpmJobTaskDetails"]] = None,
        property_bag: Optional[dict[str, str]] = None,
        dynamic_error_message: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DpmJobTaskDetails(_Model):
    """DPM workload-specific job task details.

    :ivar task_id: The task display name.
    :vartype task_id: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar duration: Time elapsed for task.
    :vartype duration: ~datetime.timedelta
    :ivar status: The status.
    :vartype status: str
    """

    task_id: Optional[str] = rest_field(name="taskId", visibility=["read", "create", "update", "delete", "query"])
    """The task display name."""
    start_time: Optional[datetime.datetime] = rest_field(
        name="startTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The start time."""
    end_time: Optional[datetime.datetime] = rest_field(
        name="endTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The end time."""
    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed for task."""
    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """The status."""

    @overload
    def __init__(
        self,
        *,
        task_id: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        duration: Optional[datetime.timedelta] = None,
        status: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class DPMProtectedItem(ProtectedItem, discriminator="DPMProtectedItem"):
    """Additional information on Backup engine specific backup item.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the managed item.
    :vartype friendly_name: str
    :ivar backup_engine_name: Backup Management server protecting this backup item.
    :vartype backup_engine_name: str
    :ivar protection_state: Protection state of the backup engine. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectedItemState
    :ivar extended_info: Extended info of the backup item.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.DPMProtectedItemExtendedInfo
    :ivar protected_item_type: backup item type. Required. Default value is "DPMProtectedItem".
    :vartype protected_item_type: str
    """

    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the managed item."""
    backup_engine_name: Optional[str] = rest_field(
        name="backupEngineName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup Management server protecting this backup item."""
    protection_state: Optional[Union[str, "_models.ProtectedItemState"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protection state of the backup engine. Known values are: \"Invalid\", \"IRPending\",
     \"Protected\", \"ProtectionError\", \"ProtectionStopped\", \"ProtectionPaused\", and
     \"BackupsSuspended\"."""
    extended_info: Optional["_models.DPMProtectedItemExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Extended info of the backup item."""
    protected_item_type: Literal["DPMProtectedItem"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"DPMProtectedItem\"."""

    @overload
    def __init__(
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        friendly_name: Optional[str] = None,
        backup_engine_name: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectedItemState"]] = None,
        extended_info: Optional["_models.DPMProtectedItemExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "DPMProtectedItem"  # type: ignore


class DPMProtectedItemExtendedInfo(_Model):
    """Additional information of DPM Protected item.

    :ivar protectable_object_load_path: Attribute to provide information on various DBs.
    :vartype protectable_object_load_path: dict[str, str]
    :ivar protected: To check if backup item is disk protected.
    :vartype protected: bool
    :ivar is_present_on_cloud: To check if backup item is cloud protected.
    :vartype is_present_on_cloud: bool
    :ivar last_backup_status: Last backup status information on backup item.
    :vartype last_backup_status: str
    :ivar last_refreshed_at: Last refresh time on backup item.
    :vartype last_refreshed_at: ~datetime.datetime
    :ivar oldest_recovery_point: Oldest cloud recovery point time.
    :vartype oldest_recovery_point: ~datetime.datetime
    :ivar recovery_point_count: cloud recovery point count.
    :vartype recovery_point_count: int
    :ivar on_premise_oldest_recovery_point: Oldest disk recovery point time.
    :vartype on_premise_oldest_recovery_point: ~datetime.datetime
    :ivar on_premise_latest_recovery_point: latest disk recovery point time.
    :vartype on_premise_latest_recovery_point: ~datetime.datetime
    :ivar on_premise_recovery_point_count: disk recovery point count.
    :vartype on_premise_recovery_point_count: int
    :ivar is_collocated: To check if backup item is collocated.
    :vartype is_collocated: bool
    :ivar protection_group_name: Protection group name of the backup item.
    :vartype protection_group_name: str
    :ivar disk_storage_used_in_bytes: Used Disk storage in bytes.
    :vartype disk_storage_used_in_bytes: str
    :ivar total_disk_storage_size_in_bytes: total Disk storage in bytes.
    :vartype total_disk_storage_size_in_bytes: str
    """

    protectable_object_load_path: Optional[dict[str, str]] = rest_field(
        name="protectableObjectLoadPath", visibility=["read", "create", "update", "delete", "query"]
    )
    """Attribute to provide information on various DBs."""
    protected: Optional[bool] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """To check if backup item is disk protected."""
    is_present_on_cloud: Optional[bool] = rest_field(
        name="isPresentOnCloud", visibility=["read", "create", "update", "delete", "query"]
    )
    """To check if backup item is cloud protected."""
    last_backup_status: Optional[str] = rest_field(
        name="lastBackupStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Last backup status information on backup item."""
    last_refreshed_at: Optional[datetime.datetime] = rest_field(
        name="lastRefreshedAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Last refresh time on backup item."""
    oldest_recovery_point: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPoint", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Oldest cloud recovery point time."""
    recovery_point_count: Optional[int] = rest_field(
        name="recoveryPointCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """cloud recovery point count."""
    on_premise_oldest_recovery_point: Optional[datetime.datetime] = rest_field(
        name="onPremiseOldestRecoveryPoint",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """Oldest disk recovery point time."""
    on_premise_latest_recovery_point: Optional[datetime.datetime] = rest_field(
        name="onPremiseLatestRecoveryPoint",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """latest disk recovery point time."""
    on_premise_recovery_point_count: Optional[int] = rest_field(
        name="onPremiseRecoveryPointCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """disk recovery point count."""
    is_collocated: Optional[bool] = rest_field(
        name="isCollocated", visibility=["read", "create", "update", "delete", "query"]
    )
    """To check if backup item is collocated."""
    protection_group_name: Optional[str] = rest_field(
        name="protectionGroupName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protection group name of the backup item."""
    disk_storage_used_in_bytes: Optional[str] = rest_field(
        name="diskStorageUsedInBytes", visibility=["read", "create", "update", "delete", "query"]
    )
    """Used Disk storage in bytes."""
    total_disk_storage_size_in_bytes: Optional[str] = rest_field(
        name="totalDiskStorageSizeInBytes", visibility=["read", "create", "update", "delete", "query"]
    )
    """total Disk storage in bytes."""

    @overload
    def __init__(
        self,
        *,
        protectable_object_load_path: Optional[dict[str, str]] = None,
        protected: Optional[bool] = None,
        is_present_on_cloud: Optional[bool] = None,
        last_backup_status: Optional[str] = None,
        last_refreshed_at: Optional[datetime.datetime] = None,
        oldest_recovery_point: Optional[datetime.datetime] = None,
        recovery_point_count: Optional[int] = None,
        on_premise_oldest_recovery_point: Optional[datetime.datetime] = None,
        on_premise_latest_recovery_point: Optional[datetime.datetime] = None,
        on_premise_recovery_point_count: Optional[int] = None,
        is_collocated: Optional[bool] = None,
        protection_group_name: Optional[str] = None,
        disk_storage_used_in_bytes: Optional[str] = None,
        total_disk_storage_size_in_bytes: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class EncryptionDetails(_Model):
    """Details needed if the VM was encrypted at the time of backup.

    :ivar encryption_enabled: Identifies whether this backup copy represents an encrypted VM at the
     time of backup.
    :vartype encryption_enabled: bool
    :ivar kek_url: Key Url.
    :vartype kek_url: str
    :ivar secret_key_url: Secret Url.
    :vartype secret_key_url: str
    :ivar kek_vault_id: ID of Key Vault where KEK is stored.
    :vartype kek_vault_id: str
    :ivar secret_key_vault_id: ID of Key Vault where Secret is stored.
    :vartype secret_key_vault_id: str
    """

    encryption_enabled: Optional[bool] = rest_field(
        name="encryptionEnabled", visibility=["read", "create", "update", "delete", "query"]
    )
    """Identifies whether this backup copy represents an encrypted VM at the time of backup."""
    kek_url: Optional[str] = rest_field(name="kekUrl", visibility=["read", "create", "update", "delete", "query"])
    """Key Url."""
    secret_key_url: Optional[str] = rest_field(
        name="secretKeyUrl", visibility=["read", "create", "update", "delete", "query"]
    )
    """Secret Url."""
    kek_vault_id: Optional[str] = rest_field(
        name="kekVaultId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ID of Key Vault where KEK is stored."""
    secret_key_vault_id: Optional[str] = rest_field(
        name="secretKeyVaultId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ID of Key Vault where Secret is stored."""

    @overload
    def __init__(
        self,
        *,
        encryption_enabled: Optional[bool] = None,
        kek_url: Optional[str] = None,
        secret_key_url: Optional[str] = None,
        kek_vault_id: Optional[str] = None,
        secret_key_vault_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ErrorAdditionalInfo(_Model):
    """The resource management error additional info.

    :ivar type: The additional info type.
    :vartype type: str
    :ivar info: The additional info.
    :vartype info: any
    """

    type: Optional[str] = rest_field(visibility=["read"])
    """The additional info type."""
    info: Optional[Any] = rest_field(visibility=["read"])
    """The additional info."""


class ErrorDetail(_Model):
    """Error Detail class which encapsulates Code, Message and Recommendations.

    :ivar code: Error code.
    :vartype code: str
    :ivar message: Error Message related to the Code.
    :vartype message: str
    :ivar recommendations: List of recommendation strings.
    :vartype recommendations: list[str]
    """

    code: Optional[str] = rest_field(visibility=["read"])
    """Error code."""
    message: Optional[str] = rest_field(visibility=["read"])
    """Error Message related to the Code."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read"])
    """List of recommendation strings."""


class ErrorResponse(_Model):
    """Error response.

    :ivar error: The error object.
    :vartype error: ~azure.mgmt.recoveryservicesbackup.models.ArmErrorDetail
    """

    error: Optional["_models.ArmErrorDetail"] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """The error object."""

    @overload
    def __init__(
        self,
        *,
        error: Optional["_models.ArmErrorDetail"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class OperationResultInfoBase(_Model):
    """Base class for operation result info.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    ExportJobsOperationResultInfo, OperationResultInfo

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ExportJobsOperationResultInfo(OperationResultInfoBase, discriminator="ExportJobsOperationResultInfo"):
    """This class is used to send blob details after exporting jobs.

    :ivar blob_url: URL of the blob into which the serialized string of list of jobs is exported.
    :vartype blob_url: str
    :ivar blob_sas_key: SAS key to access the blob. It expires in 15 mins.
    :vartype blob_sas_key: str
    :ivar excel_file_blob_url: URL of the blob into which the ExcelFile is uploaded.
    :vartype excel_file_blob_url: str
    :ivar excel_file_blob_sas_key: SAS key to access the blob. It expires in 15 mins.
    :vartype excel_file_blob_sas_key: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "ExportJobsOperationResultInfo".
    :vartype object_type: str
    """

    blob_url: Optional[str] = rest_field(name="blobUrl", visibility=["read", "create", "update", "delete", "query"])
    """URL of the blob into which the serialized string of list of jobs is exported."""
    blob_sas_key: Optional[str] = rest_field(
        name="blobSasKey", visibility=["read", "create", "update", "delete", "query"]
    )
    """SAS key to access the blob. It expires in 15 mins."""
    excel_file_blob_url: Optional[str] = rest_field(
        name="excelFileBlobUrl", visibility=["read", "create", "update", "delete", "query"]
    )
    """URL of the blob into which the ExcelFile is uploaded."""
    excel_file_blob_sas_key: Optional[str] = rest_field(
        name="excelFileBlobSasKey", visibility=["read", "create", "update", "delete", "query"]
    )
    """SAS key to access the blob. It expires in 15 mins."""
    object_type: Literal["ExportJobsOperationResultInfo"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"ExportJobsOperationResultInfo\"."""

    @overload
    def __init__(
        self,
        *,
        blob_url: Optional[str] = None,
        blob_sas_key: Optional[str] = None,
        excel_file_blob_url: Optional[str] = None,
        excel_file_blob_sas_key: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "ExportJobsOperationResultInfo"  # type: ignore


class ExtendedLocation(_Model):
    """The extended location of Recovery point where VM was present.

    :ivar name: Name of the extended location.
    :vartype name: str
    :ivar type: Type of the extended location. Possible values include: 'EdgeZone'.
    :vartype type: str
    """

    name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Name of the extended location."""
    type: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Type of the extended location. Possible values include: 'EdgeZone'."""

    @overload
    def __init__(
        self,
        *,
        name: Optional[str] = None,
        type: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ExtendedProperties(_Model):
    """Extended Properties for Azure IaasVM Backup.

    :ivar disk_exclusion_properties: Extended Properties for Disk Exclusion.
    :vartype disk_exclusion_properties:
     ~azure.mgmt.recoveryservicesbackup.models.DiskExclusionProperties
    :ivar linux_vm_application_name: Linux VM name.
    :vartype linux_vm_application_name: str
    """

    disk_exclusion_properties: Optional["_models.DiskExclusionProperties"] = rest_field(
        name="diskExclusionProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """Extended Properties for Disk Exclusion."""
    linux_vm_application_name: Optional[str] = rest_field(
        name="linuxVmApplicationName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Linux VM name."""

    @overload
    def __init__(
        self,
        *,
        disk_exclusion_properties: Optional["_models.DiskExclusionProperties"] = None,
        linux_vm_application_name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class FetchTieringCostInfoRequest(_Model):
    """Base class for tiering cost request. Specific cost request types are derived from this class.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    FetchTieringCostInfoForRehydrationRequest, FetchTieringCostSavingsInfoForPolicyRequest,
    FetchTieringCostSavingsInfoForProtectedItemRequest, FetchTieringCostSavingsInfoForVaultRequest

    :ivar source_tier_type: Source tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype source_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar target_tier_type: target tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype target_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    source_tier_type: Union[str, "_models.RecoveryPointTierType"] = rest_field(
        name="sourceTierType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source tier for the request. Required. Known values are: \"Invalid\", \"InstantRP\",
     \"HardenedRP\", and \"ArchivedRP\"."""
    target_tier_type: Union[str, "_models.RecoveryPointTierType"] = rest_field(
        name="targetTierType", visibility=["read", "create", "update", "delete", "query"]
    )
    """target tier for the request. Required. Known values are: \"Invalid\", \"InstantRP\",
     \"HardenedRP\", and \"ArchivedRP\"."""
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        source_tier_type: Union[str, "_models.RecoveryPointTierType"],
        target_tier_type: Union[str, "_models.RecoveryPointTierType"],
        object_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class FetchTieringCostInfoForRehydrationRequest(
    FetchTieringCostInfoRequest, discriminator="FetchTieringCostInfoForRehydrationRequest"
):  # pylint: disable=name-too-long
    """Request parameters for fetching cost info of rehydration.

    :ivar source_tier_type: Source tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype source_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar target_tier_type: target tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype target_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar container_name: Name of the protected item container. Required.
    :vartype container_name: str
    :ivar protected_item_name: Name of the protectedItemName. Required.
    :vartype protected_item_name: str
    :ivar recovery_point_id: ID of the backup copy for rehydration cost info needs to be fetched.
     Required.
    :vartype recovery_point_id: str
    :ivar rehydration_priority: Rehydration Priority. Required. Known values are: "Standard" and
     "High".
    :vartype rehydration_priority: str or
     ~azure.mgmt.recoveryservicesbackup.models.RehydrationPriority
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "FetchTieringCostInfoForRehydrationRequest".
    :vartype object_type: str
    """

    container_name: str = rest_field(name="containerName", visibility=["read", "create", "update", "delete", "query"])
    """Name of the protected item container. Required."""
    protected_item_name: str = rest_field(
        name="protectedItemName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of the protectedItemName. Required."""
    recovery_point_id: str = rest_field(
        name="recoveryPointId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ID of the backup copy for rehydration cost info needs to be fetched. Required."""
    rehydration_priority: Union[str, "_models.RehydrationPriority"] = rest_field(
        name="rehydrationPriority", visibility=["read", "create", "update", "delete", "query"]
    )
    """Rehydration Priority. Required. Known values are: \"Standard\" and \"High\"."""
    object_type: Literal["FetchTieringCostInfoForRehydrationRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"FetchTieringCostInfoForRehydrationRequest\"."""

    @overload
    def __init__(
        self,
        *,
        source_tier_type: Union[str, "_models.RecoveryPointTierType"],
        target_tier_type: Union[str, "_models.RecoveryPointTierType"],
        container_name: str,
        protected_item_name: str,
        recovery_point_id: str,
        rehydration_priority: Union[str, "_models.RehydrationPriority"],
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "FetchTieringCostInfoForRehydrationRequest"  # type: ignore


class FetchTieringCostSavingsInfoForPolicyRequest(
    FetchTieringCostInfoRequest, discriminator="FetchTieringCostSavingsInfoForPolicyRequest"
):  # pylint: disable=name-too-long
    """Request parameters for tiering cost info for policy.

    :ivar source_tier_type: Source tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype source_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar target_tier_type: target tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype target_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar policy_name: Name of the backup policy for which the cost savings information is
     requested. Required.
    :vartype policy_name: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "FetchTieringCostSavingsInfoForPolicyRequest".
    :vartype object_type: str
    """

    policy_name: str = rest_field(name="policyName", visibility=["read", "create", "update", "delete", "query"])
    """Name of the backup policy for which the cost savings information is requested. Required."""
    object_type: Literal["FetchTieringCostSavingsInfoForPolicyRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"FetchTieringCostSavingsInfoForPolicyRequest\"."""

    @overload
    def __init__(
        self,
        *,
        source_tier_type: Union[str, "_models.RecoveryPointTierType"],
        target_tier_type: Union[str, "_models.RecoveryPointTierType"],
        policy_name: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "FetchTieringCostSavingsInfoForPolicyRequest"  # type: ignore


class FetchTieringCostSavingsInfoForProtectedItemRequest(
    FetchTieringCostInfoRequest, discriminator="FetchTieringCostSavingsInfoForProtectedItemRequest"
):  # pylint: disable=name-too-long
    """Request parameters for tiering cost info for protected item.

    :ivar source_tier_type: Source tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype source_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar target_tier_type: target tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype target_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar container_name: Name of the protected item container. Required.
    :vartype container_name: str
    :ivar protected_item_name: Name of the protectedItemName. Required.
    :vartype protected_item_name: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "FetchTieringCostSavingsInfoForProtectedItemRequest".
    :vartype object_type: str
    """

    container_name: str = rest_field(name="containerName", visibility=["read", "create", "update", "delete", "query"])
    """Name of the protected item container. Required."""
    protected_item_name: str = rest_field(
        name="protectedItemName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of the protectedItemName. Required."""
    object_type: Literal["FetchTieringCostSavingsInfoForProtectedItemRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"FetchTieringCostSavingsInfoForProtectedItemRequest\"."""

    @overload
    def __init__(
        self,
        *,
        source_tier_type: Union[str, "_models.RecoveryPointTierType"],
        target_tier_type: Union[str, "_models.RecoveryPointTierType"],
        container_name: str,
        protected_item_name: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "FetchTieringCostSavingsInfoForProtectedItemRequest"  # type: ignore


class FetchTieringCostSavingsInfoForVaultRequest(
    FetchTieringCostInfoRequest, discriminator="FetchTieringCostSavingsInfoForVaultRequest"
):  # pylint: disable=name-too-long
    """Request parameters for tiering cost info for vault.

    :ivar source_tier_type: Source tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype source_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar target_tier_type: target tier for the request. Required. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype target_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "FetchTieringCostSavingsInfoForVaultRequest".
    :vartype object_type: str
    """

    object_type: Literal["FetchTieringCostSavingsInfoForVaultRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"FetchTieringCostSavingsInfoForVaultRequest\"."""

    @overload
    def __init__(
        self,
        *,
        source_tier_type: Union[str, "_models.RecoveryPointTierType"],
        target_tier_type: Union[str, "_models.RecoveryPointTierType"],
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "FetchTieringCostSavingsInfoForVaultRequest"  # type: ignore


class GenericContainer(ProtectionContainer, discriminator="GenericContainer"):
    """Base class for generic container of backup items.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar fabric_name: Name of the container's fabric.
    :vartype fabric_name: str
    :ivar extended_information: Extended information (not returned in List container API calls).
    :vartype extended_information:
     ~azure.mgmt.recoveryservicesbackup.models.GenericContainerExtendedInfo
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. GENERIC_CONTAINER.
    :vartype container_type: str or ~azure.mgmt.recoveryservicesbackup.models.GENERIC_CONTAINER
    """

    fabric_name: Optional[str] = rest_field(
        name="fabricName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of the container's fabric."""
    extended_information: Optional["_models.GenericContainerExtendedInfo"] = rest_field(
        name="extendedInformation", visibility=["read", "create", "update", "delete", "query"]
    )
    """Extended information (not returned in List container API calls)."""
    container_type: Literal[ProtectableContainerType.GENERIC_CONTAINER] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. GENERIC_CONTAINER."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        fabric_name: Optional[str] = None,
        extended_information: Optional["_models.GenericContainerExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.GENERIC_CONTAINER  # type: ignore


class GenericContainerExtendedInfo(_Model):
    """Container extended information.

    :ivar raw_cert_data: Public key of container cert.
    :vartype raw_cert_data: str
    :ivar container_identity_info: Container identity information.
    :vartype container_identity_info:
     ~azure.mgmt.recoveryservicesbackup.models.ContainerIdentityInfo
    :ivar service_endpoints: Azure Backup Service Endpoints for the container.
    :vartype service_endpoints: dict[str, str]
    """

    raw_cert_data: Optional[str] = rest_field(
        name="rawCertData", visibility=["read", "create", "update", "delete", "query"]
    )
    """Public key of container cert."""
    container_identity_info: Optional["_models.ContainerIdentityInfo"] = rest_field(
        name="containerIdentityInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Container identity information."""
    service_endpoints: Optional[dict[str, str]] = rest_field(
        name="serviceEndpoints", visibility=["read", "create", "update", "delete", "query"]
    )
    """Azure Backup Service Endpoints for the container."""

    @overload
    def __init__(
        self,
        *,
        raw_cert_data: Optional[str] = None,
        container_identity_info: Optional["_models.ContainerIdentityInfo"] = None,
        service_endpoints: Optional[dict[str, str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class GenericProtectedItem(ProtectedItem, discriminator="GenericProtectedItem"):
    """Base class for backup items.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar policy_state: Indicates consistency of policy object and policy applied to this backup
     item.
    :vartype policy_state: str
    :ivar protection_state: Backup state of this backup item. Known values are: "Invalid",
     "IRPending", "Protected", "ProtectionError", "ProtectionStopped", "ProtectionPaused", and
     "BackupsSuspended".
    :vartype protection_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProtectionState
    :ivar protected_item_id: Data Plane Service ID of the protected item.
    :vartype protected_item_id: int
    :ivar source_associations: Loosely coupled (type, value) associations (example - parent of a
     protected item).
    :vartype source_associations: dict[str, str]
    :ivar fabric_name: Name of this backup item's fabric.
    :vartype fabric_name: str
    :ivar protected_item_type: backup item type. Required. Default value is "GenericProtectedItem".
    :vartype protected_item_type: str
    """

    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the container."""
    policy_state: Optional[str] = rest_field(
        name="policyState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates consistency of policy object and policy applied to this backup item."""
    protection_state: Optional[Union[str, "_models.ProtectionState"]] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup state of this backup item. Known values are: \"Invalid\", \"IRPending\", \"Protected\",
     \"ProtectionError\", \"ProtectionStopped\", \"ProtectionPaused\", and \"BackupsSuspended\"."""
    protected_item_id: Optional[int] = rest_field(
        name="protectedItemId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Data Plane Service ID of the protected item."""
    source_associations: Optional[dict[str, str]] = rest_field(
        name="sourceAssociations", visibility=["read", "create", "update", "delete", "query"]
    )
    """Loosely coupled (type, value) associations (example - parent of a protected item)."""
    fabric_name: Optional[str] = rest_field(
        name="fabricName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of this backup item's fabric."""
    protected_item_type: Literal["GenericProtectedItem"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"GenericProtectedItem\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        friendly_name: Optional[str] = None,
        policy_state: Optional[str] = None,
        protection_state: Optional[Union[str, "_models.ProtectionState"]] = None,
        protected_item_id: Optional[int] = None,
        source_associations: Optional[dict[str, str]] = None,
        fabric_name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "GenericProtectedItem"  # type: ignore


class GenericProtectionPolicy(ProtectionPolicy, discriminator="GenericProtectionPolicy"):
    """Azure VM (Mercury) workload-specific backup policy.

    :ivar protected_items_count: Number of items associated with this policy.
    :vartype protected_items_count: int
    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    :ivar sub_protection_policy: List of sub-protection policies which includes schedule and
     retention.
    :vartype sub_protection_policy:
     list[~azure.mgmt.recoveryservicesbackup.models.SubProtectionPolicy]
    :ivar time_zone: TimeZone optional input as string. For example: TimeZone = "Pacific Standard
     Time".
    :vartype time_zone: str
    :ivar fabric_name: Name of this policy's fabric.
    :vartype fabric_name: str
    :ivar backup_management_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "GenericProtectionPolicy".
    :vartype backup_management_type: str
    """

    sub_protection_policy: Optional[list["_models.SubProtectionPolicy"]] = rest_field(
        name="subProtectionPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of sub-protection policies which includes schedule and retention."""
    time_zone: Optional[str] = rest_field(name="timeZone", visibility=["read", "create", "update", "delete", "query"])
    """TimeZone optional input as string. For example: TimeZone = \"Pacific Standard Time\"."""
    fabric_name: Optional[str] = rest_field(
        name="fabricName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of this policy's fabric."""
    backup_management_type: Literal["GenericProtectionPolicy"] = rest_discriminator(name="backupManagementType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"GenericProtectionPolicy\"."""

    @overload
    def __init__(
        self,
        *,
        protected_items_count: Optional[int] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        sub_protection_policy: Optional[list["_models.SubProtectionPolicy"]] = None,
        time_zone: Optional[str] = None,
        fabric_name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.backup_management_type = "GenericProtectionPolicy"  # type: ignore


class GenericRecoveryPoint(RecoveryPoint, discriminator="GenericRecoveryPoint"):
    """Generic backup copy.

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar friendly_name: Friendly name of the backup copy.
    :vartype friendly_name: str
    :ivar recovery_point_type: Type of the backup copy.
    :vartype recovery_point_type: str
    :ivar recovery_point_time: Time at which this backup copy was created.
    :vartype recovery_point_time: ~datetime.datetime
    :ivar recovery_point_additional_info: Additional information associated with this backup copy.
    :vartype recovery_point_additional_info: str
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is "GenericRecoveryPoint".
    :vartype object_type: str
    """

    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of the backup copy."""
    recovery_point_type: Optional[str] = rest_field(
        name="recoveryPointType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the backup copy."""
    recovery_point_time: Optional[datetime.datetime] = rest_field(
        name="recoveryPointTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Time at which this backup copy was created."""
    recovery_point_additional_info: Optional[str] = rest_field(
        name="recoveryPointAdditionalInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information associated with this backup copy."""
    recovery_point_properties: Optional["_models.RecoveryPointProperties"] = rest_field(
        name="recoveryPointProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """Properties of Recovery Point."""
    object_type: Literal["GenericRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"GenericRecoveryPoint\"."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        friendly_name: Optional[str] = None,
        recovery_point_type: Optional[str] = None,
        recovery_point_time: Optional[datetime.datetime] = None,
        recovery_point_additional_info: Optional[str] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "GenericRecoveryPoint"  # type: ignore


class HourlySchedule(_Model):
    """HourlySchedule.

    :ivar interval: Interval at which backup needs to be triggered. For hourly the value can be
     4/6/8/12.
    :vartype interval: int
    :ivar schedule_window_start_time: To specify start time of the backup window.
    :vartype schedule_window_start_time: ~datetime.datetime
    :ivar schedule_window_duration: To specify duration of the backup window.
    :vartype schedule_window_duration: int
    """

    interval: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Interval at which backup needs to be triggered. For hourly the value can be 4/6/8/12."""
    schedule_window_start_time: Optional[datetime.datetime] = rest_field(
        name="scheduleWindowStartTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """To specify start time of the backup window."""
    schedule_window_duration: Optional[int] = rest_field(
        name="scheduleWindowDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """To specify duration of the backup window."""

    @overload
    def __init__(
        self,
        *,
        interval: Optional[int] = None,
        schedule_window_start_time: Optional[datetime.datetime] = None,
        schedule_window_duration: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class IaasVMBackupRequest(BackupRequest, discriminator="IaasVMBackupRequest"):
    """IaaS VM workload-specific backup request.

    :ivar recovery_point_expiry_time_in_utc: Backup copy will expire after the time specified
     (UTC).
    :vartype recovery_point_expiry_time_in_utc: ~datetime.datetime
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is "IaasVMBackupRequest".
    :vartype object_type: str
    """

    recovery_point_expiry_time_in_utc: Optional[datetime.datetime] = rest_field(
        name="recoveryPointExpiryTimeInUTC",
        visibility=["read", "create", "update", "delete", "query"],
        format="rfc3339",
    )
    """Backup copy will expire after the time specified (UTC)."""
    object_type: Literal["IaasVMBackupRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"IaasVMBackupRequest\"."""

    @overload
    def __init__(
        self,
        *,
        recovery_point_expiry_time_in_utc: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "IaasVMBackupRequest"  # type: ignore


class IaasVMILRRegistrationRequest(ILRRequest, discriminator="IaasVMILRRegistrationRequest"):
    """Restore files/folders from a backup copy of IaaS VM.

    :ivar recovery_point_id: ID of the IaaS VM backup copy from where the files/folders have to be
     restored.
    :vartype recovery_point_id: str
    :ivar virtual_machine_id: Fully qualified ARM ID of the virtual machine whose the files /
     folders have to be restored.
    :vartype virtual_machine_id: str
    :ivar initiator_name: iSCSI initiator name.
    :vartype initiator_name: str
    :ivar renew_existing_registration: Whether to renew existing registration with the iSCSI
     server.
    :vartype renew_existing_registration: bool
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "IaasVMILRRegistrationRequest".
    :vartype object_type: str
    """

    recovery_point_id: Optional[str] = rest_field(
        name="recoveryPointId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ID of the IaaS VM backup copy from where the files/folders have to be restored."""
    virtual_machine_id: Optional[str] = rest_field(
        name="virtualMachineId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM ID of the virtual machine whose the files / folders have to be restored."""
    initiator_name: Optional[str] = rest_field(
        name="initiatorName", visibility=["read", "create", "update", "delete", "query"]
    )
    """iSCSI initiator name."""
    renew_existing_registration: Optional[bool] = rest_field(
        name="renewExistingRegistration", visibility=["read", "create", "update", "delete", "query"]
    )
    """Whether to renew existing registration with the iSCSI server."""
    object_type: Literal["IaasVMILRRegistrationRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"IaasVMILRRegistrationRequest\"."""

    @overload
    def __init__(
        self,
        *,
        recovery_point_id: Optional[str] = None,
        virtual_machine_id: Optional[str] = None,
        initiator_name: Optional[str] = None,
        renew_existing_registration: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "IaasVMILRRegistrationRequest"  # type: ignore


class IaasVMRecoveryPoint(RecoveryPoint, discriminator="IaasVMRecoveryPoint"):
    """IaaS VM workload specific backup copy.

    :ivar threat_status: Threat status of the recovery point. Known values are: "Unknown",
     "Healthy", "UnHealthy", "Warning", and "NotAvailable".
    :vartype threat_status: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatStatus
    :ivar threat_info: Recovery point threat information.
    :vartype threat_info: list[~azure.mgmt.recoveryservicesbackup.models.ThreatInfo]
    :ivar recovery_point_type: Type of the backup copy.
    :vartype recovery_point_type: str
    :ivar recovery_point_time: Time at which this backup copy was created.
    :vartype recovery_point_time: ~datetime.datetime
    :ivar recovery_point_additional_info: Additional information associated with this backup copy.
    :vartype recovery_point_additional_info: str
    :ivar source_vm_storage_type: Storage type of the VM whose backup copy is created.
    :vartype source_vm_storage_type: str
    :ivar is_source_vm_encrypted: Identifies whether the VM was encrypted when the backup copy is
     created.
    :vartype is_source_vm_encrypted: bool
    :ivar key_and_secret: Required details for recovering an encrypted VM. Applicable only when
     IsSourceVMEncrypted is true.
    :vartype key_and_secret: ~azure.mgmt.recoveryservicesbackup.models.KeyAndSecretDetails
    :ivar is_instant_ilr_session_active: Is the session to recover items from this backup copy
     still active.
    :vartype is_instant_ilr_session_active: bool
    :ivar recovery_point_tier_details: Recovery point tier information.
    :vartype recovery_point_tier_details:
     list[~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierInformationV2]
    :ivar is_managed_virtual_machine: Whether VM is with Managed Disks.
    :vartype is_managed_virtual_machine: bool
    :ivar virtual_machine_size: Virtual Machine Size.
    :vartype virtual_machine_size: str
    :ivar original_storage_account_option: Original Storage Account Option.
    :vartype original_storage_account_option: bool
    :ivar os_type: OS type.
    :vartype os_type: str
    :ivar recovery_point_disk_configuration: Disk configuration.
    :vartype recovery_point_disk_configuration:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointDiskConfiguration
    :ivar zones: Identifies the zone of the VM at the time of backup. Applicable only for
     zone-pinned Vms.
    :vartype zones: list[str]
    :ivar recovery_point_move_readiness_info: Eligibility of RP to be moved to another tier.
    :vartype recovery_point_move_readiness_info: dict[str,
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointMoveReadinessInfo]
    :ivar security_type: Security Type of the Disk.
    :vartype security_type: str
    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointProperties
    :ivar is_private_access_enabled_on_any_disk: This flag denotes if any of the disks in the VM
     are using Private access network setting.
    :vartype is_private_access_enabled_on_any_disk: bool
    :ivar extended_location: Extended location of the VM recovery point, should be null if VM is in
     public cloud.
    :vartype extended_location: ~azure.mgmt.recoveryservicesbackup.models.ExtendedLocation
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is "IaasVMRecoveryPoint".
    :vartype object_type: str
    """

    recovery_point_type: Optional[str] = rest_field(
        name="recoveryPointType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of the backup copy."""
    recovery_point_time: Optional[datetime.datetime] = rest_field(
        name="recoveryPointTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Time at which this backup copy was created."""
    recovery_point_additional_info: Optional[str] = rest_field(
        name="recoveryPointAdditionalInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information associated with this backup copy."""
    source_vm_storage_type: Optional[str] = rest_field(
        name="sourceVMStorageType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Storage type of the VM whose backup copy is created."""
    is_source_vm_encrypted: Optional[bool] = rest_field(
        name="isSourceVMEncrypted", visibility=["read", "create", "update", "delete", "query"]
    )
    """Identifies whether the VM was encrypted when the backup copy is created."""
    key_and_secret: Optional["_models.KeyAndSecretDetails"] = rest_field(
        name="keyAndSecret", visibility=["read", "create", "update", "delete", "query"]
    )
    """Required details for recovering an encrypted VM. Applicable only when IsSourceVMEncrypted is
     true."""
    is_instant_ilr_session_active: Optional[bool] = rest_field(
        name="isInstantIlrSessionActive", visibility=["read", "create", "update", "delete", "query"]
    )
    """Is the session to recover items from this backup copy still active."""
    recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = rest_field(
        name="recoveryPointTierDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Recovery point tier information."""
    is_managed_virtual_machine: Optional[bool] = rest_field(
        name="isManagedVirtualMachine", visibility=["read", "create", "update", "delete", "query"]
    )
    """Whether VM is with Managed Disks."""
    virtual_machine_size: Optional[str] = rest_field(
        name="virtualMachineSize", visibility=["read", "create", "update", "delete", "query"]
    )
    """Virtual Machine Size."""
    original_storage_account_option: Optional[bool] = rest_field(
        name="originalStorageAccountOption", visibility=["read", "create", "update", "delete", "query"]
    )
    """Original Storage Account Option."""
    os_type: Optional[str] = rest_field(name="osType", visibility=["read", "create", "update", "delete", "query"])
    """OS type."""
    recovery_point_disk_configuration: Optional["_models.RecoveryPointDiskConfiguration"] = rest_field(
        name="recoveryPointDiskConfiguration", visibility=["read", "create", "update", "delete", "query"]
    )
    """Disk configuration."""
    zones: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Identifies the zone of the VM at the time of backup. Applicable only for zone-pinned Vms."""
    recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = rest_field(
        name="recoveryPointMoveReadinessInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Eligibility of RP to be moved to another tier."""
    security_type: Optional[str] = rest_field(
        name="securityType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Security Type of the Disk."""
    recovery_point_properties: Optional["_models.RecoveryPointProperties"] = rest_field(
        name="recoveryPointProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """Properties of Recovery Point."""
    is_private_access_enabled_on_any_disk: Optional[bool] = rest_field(
        name="isPrivateAccessEnabledOnAnyDisk", visibility=["read", "create", "update", "delete", "query"]
    )
    """This flag denotes if any of the disks in the VM are using Private access network setting."""
    extended_location: Optional["_models.ExtendedLocation"] = rest_field(
        name="extendedLocation", visibility=["read", "create", "update", "delete", "query"]
    )
    """Extended location of the VM recovery point, should be null if VM is in public cloud."""
    object_type: Literal["IaasVMRecoveryPoint"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"IaasVMRecoveryPoint\"."""

    @overload
    def __init__(
        self,
        *,
        threat_status: Optional[Union[str, "_models.ThreatStatus"]] = None,
        threat_info: Optional[list["_models.ThreatInfo"]] = None,
        recovery_point_type: Optional[str] = None,
        recovery_point_time: Optional[datetime.datetime] = None,
        recovery_point_additional_info: Optional[str] = None,
        source_vm_storage_type: Optional[str] = None,
        is_source_vm_encrypted: Optional[bool] = None,
        key_and_secret: Optional["_models.KeyAndSecretDetails"] = None,
        is_instant_ilr_session_active: Optional[bool] = None,
        recovery_point_tier_details: Optional[list["_models.RecoveryPointTierInformationV2"]] = None,
        is_managed_virtual_machine: Optional[bool] = None,
        virtual_machine_size: Optional[str] = None,
        original_storage_account_option: Optional[bool] = None,
        os_type: Optional[str] = None,
        recovery_point_disk_configuration: Optional["_models.RecoveryPointDiskConfiguration"] = None,
        zones: Optional[list[str]] = None,
        recovery_point_move_readiness_info: Optional[dict[str, "_models.RecoveryPointMoveReadinessInfo"]] = None,
        security_type: Optional[str] = None,
        recovery_point_properties: Optional["_models.RecoveryPointProperties"] = None,
        is_private_access_enabled_on_any_disk: Optional[bool] = None,
        extended_location: Optional["_models.ExtendedLocation"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "IaasVMRecoveryPoint"  # type: ignore


class IaasVMRestoreRequest(RestoreRequest, discriminator="IaasVMRestoreRequest"):
    """IaaS VM workload-specific restore.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    IaasVMRestoreWithRehydrationRequest

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is "IaasVMRestoreRequest".
    :vartype object_type: str
    :ivar recovery_point_id: ID of the backup copy to be recovered.
    :vartype recovery_point_id: str
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM which is being recovered.
    :vartype source_resource_id: str
    :ivar target_virtual_machine_id: This is the complete ARM Id of the VM that will be created.
     For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar target_resource_group_id: This is the ARM Id of the resource group that you want to
     create for this Virtual machine and other artifacts. For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}.
    :vartype target_resource_group_id: str
    :ivar storage_account_id: Fully qualified ARM ID of the storage account to which the VM has to
     be restored.
    :vartype storage_account_id: str
    :ivar virtual_network_id: This is the virtual network Id of the vnet that will be attached to
     the virtual machine. User will be validated for join action permissions in the linked access.
    :vartype virtual_network_id: str
    :ivar subnet_id: Subnet ID, is the subnet ID associated with the to be restored VM. For Classic
     VMs it would be {VnetID}/Subnet/{SubnetName} and, for the Azure Resource Manager VMs it would
     be ARM resource ID used to represent the subnet.
    :vartype subnet_id: str
    :ivar target_domain_name_id: Fully qualified ARM ID of the domain name to be associated to the
     VM being restored. This applies only to Classic Virtual Machines.
    :vartype target_domain_name_id: str
    :ivar region: Region in which the virtual machine is restored.
    :vartype region: str
    :ivar affinity_group: Affinity group associated to VM to be restored. Used only for Classic
     Compute Virtual Machines.
    :vartype affinity_group: str
    :ivar create_new_cloud_service: Should a new cloud service be created while restoring the VM.
     If this is false, VM will be restored to the same cloud service as it was at the time of
     backup.
    :vartype create_new_cloud_service: bool
    :ivar original_storage_account_option: Original Storage Account Option.
    :vartype original_storage_account_option: bool
    :ivar encryption_details: Details needed if the VM was encrypted at the time of backup.
    :vartype encryption_details: ~azure.mgmt.recoveryservicesbackup.models.EncryptionDetails
    :ivar restore_disk_lun_list: List of Disk LUNs for partial restore.
    :vartype restore_disk_lun_list: list[int]
    :ivar restore_with_managed_disks: Flag to denote of an Unmanaged disk VM should be restored
     with Managed disks.
    :vartype restore_with_managed_disks: bool
    :ivar disk_encryption_set_id: DiskEncryptionSet's ID - needed if the VM needs to be encrypted
     at rest during restore with customer managed key.
    :vartype disk_encryption_set_id: str
    :ivar zones: Target zone where the VM and its disks should be restored.
    :vartype zones: list[str]
    :ivar identity_info: Managed Identity information required to access customer storage account.
    :vartype identity_info: ~azure.mgmt.recoveryservicesbackup.models.IdentityInfo
    :ivar identity_based_restore_details: IaaS VM workload specific restore details for restores
     using managed identity.
    :vartype identity_based_restore_details:
     ~azure.mgmt.recoveryservicesbackup.models.IdentityBasedRestoreDetails
    :ivar extended_location: Target extended location where the VM should be restored, should be
     null if restore is to be done in public cloud.
    :vartype extended_location: ~azure.mgmt.recoveryservicesbackup.models.ExtendedLocation
    :ivar secured_vm_details: Stores Secured VM Details.
    :vartype secured_vm_details: ~azure.mgmt.recoveryservicesbackup.models.SecuredVMDetails
    :ivar target_disk_network_access_settings: Specifies target network access settings for disks
     of VM to be restored,.
    :vartype target_disk_network_access_settings:
     ~azure.mgmt.recoveryservicesbackup.models.TargetDiskNetworkAccessSettings
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["IaasVMRestoreRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"IaasVMRestoreRequest\"."""
    recovery_point_id: Optional[str] = rest_field(
        name="recoveryPointId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ID of the backup copy to be recovered."""
    recovery_type: Optional[Union[str, "_models.RecoveryType"]] = rest_field(
        name="recoveryType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of this recovery. Known values are: \"Invalid\", \"OriginalLocation\",
     \"AlternateLocation\", \"RestoreDisks\", and \"Offline\"."""
    source_resource_id: Optional[str] = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM ID of the VM which is being recovered."""
    target_virtual_machine_id: Optional[str] = rest_field(
        name="targetVirtualMachineId", visibility=["read", "create", "update", "delete", "query"]
    )
    """This is the complete ARM Id of the VM that will be created. For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}."""
    target_resource_group_id: Optional[str] = rest_field(
        name="targetResourceGroupId", visibility=["read", "create", "update", "delete", "query"]
    )
    """This is the ARM Id of the resource group that you want to create for this Virtual machine and
     other artifacts. For e.g. /subscriptions/{subId}/resourcegroups/{rg}."""
    storage_account_id: Optional[str] = rest_field(
        name="storageAccountId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM ID of the storage account to which the VM has to be restored."""
    virtual_network_id: Optional[str] = rest_field(
        name="virtualNetworkId", visibility=["read", "create", "update", "delete", "query"]
    )
    """This is the virtual network Id of the vnet that will be attached to the virtual machine. User
     will be validated for join action permissions in the linked access."""
    subnet_id: Optional[str] = rest_field(name="subnetId", visibility=["read", "create", "update", "delete", "query"])
    """Subnet ID, is the subnet ID associated with the to be restored VM. For Classic VMs it would be
     {VnetID}/Subnet/{SubnetName} and, for the Azure Resource Manager VMs it would be ARM resource
     ID used to represent the subnet."""
    target_domain_name_id: Optional[str] = rest_field(
        name="targetDomainNameId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM ID of the domain name to be associated to the VM being restored. This
     applies only to Classic Virtual Machines."""
    region: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Region in which the virtual machine is restored."""
    affinity_group: Optional[str] = rest_field(
        name="affinityGroup", visibility=["read", "create", "update", "delete", "query"]
    )
    """Affinity group associated to VM to be restored. Used only for Classic Compute Virtual Machines."""
    create_new_cloud_service: Optional[bool] = rest_field(
        name="createNewCloudService", visibility=["read", "create", "update", "delete", "query"]
    )
    """Should a new cloud service be created while restoring the VM. If this is false, VM will be
     restored to the same cloud service as it was at the time of backup."""
    original_storage_account_option: Optional[bool] = rest_field(
        name="originalStorageAccountOption", visibility=["read", "create", "update", "delete", "query"]
    )
    """Original Storage Account Option."""
    encryption_details: Optional["_models.EncryptionDetails"] = rest_field(
        name="encryptionDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Details needed if the VM was encrypted at the time of backup."""
    restore_disk_lun_list: Optional[list[int]] = rest_field(
        name="restoreDiskLunList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of Disk LUNs for partial restore."""
    restore_with_managed_disks: Optional[bool] = rest_field(
        name="restoreWithManagedDisks", visibility=["read", "create", "update", "delete", "query"]
    )
    """Flag to denote of an Unmanaged disk VM should be restored with Managed disks."""
    disk_encryption_set_id: Optional[str] = rest_field(
        name="diskEncryptionSetId", visibility=["read", "create", "update", "delete", "query"]
    )
    """DiskEncryptionSet's ID - needed if the VM needs to be encrypted at rest during restore with
     customer managed key."""
    zones: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Target zone where the VM and its disks should be restored."""
    identity_info: Optional["_models.IdentityInfo"] = rest_field(
        name="identityInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Managed Identity information required to access customer storage account."""
    identity_based_restore_details: Optional["_models.IdentityBasedRestoreDetails"] = rest_field(
        name="identityBasedRestoreDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """IaaS VM workload specific restore details for restores using managed identity."""
    extended_location: Optional["_models.ExtendedLocation"] = rest_field(
        name="extendedLocation", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target extended location where the VM should be restored, should be null if restore is to be
     done in public cloud."""
    secured_vm_details: Optional["_models.SecuredVMDetails"] = rest_field(
        name="securedVMDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Stores Secured VM Details."""
    target_disk_network_access_settings: Optional["_models.TargetDiskNetworkAccessSettings"] = rest_field(
        name="targetDiskNetworkAccessSettings", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies target network access settings for disks of VM to be restored,."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_point_id: Optional[str] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        target_virtual_machine_id: Optional[str] = None,
        target_resource_group_id: Optional[str] = None,
        storage_account_id: Optional[str] = None,
        virtual_network_id: Optional[str] = None,
        subnet_id: Optional[str] = None,
        target_domain_name_id: Optional[str] = None,
        region: Optional[str] = None,
        affinity_group: Optional[str] = None,
        create_new_cloud_service: Optional[bool] = None,
        original_storage_account_option: Optional[bool] = None,
        encryption_details: Optional["_models.EncryptionDetails"] = None,
        restore_disk_lun_list: Optional[list[int]] = None,
        restore_with_managed_disks: Optional[bool] = None,
        disk_encryption_set_id: Optional[str] = None,
        zones: Optional[list[str]] = None,
        identity_info: Optional["_models.IdentityInfo"] = None,
        identity_based_restore_details: Optional["_models.IdentityBasedRestoreDetails"] = None,
        extended_location: Optional["_models.ExtendedLocation"] = None,
        secured_vm_details: Optional["_models.SecuredVMDetails"] = None,
        target_disk_network_access_settings: Optional["_models.TargetDiskNetworkAccessSettings"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "IaasVMRestoreRequest"  # type: ignore


class IaasVMRestoreWithRehydrationRequest(IaasVMRestoreRequest, discriminator="IaasVMRestoreWithRehydrationRequest"):
    """IaaS VM workload-specific restore with integrated rehydration of recovery point.

    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar recovery_point_id: ID of the backup copy to be recovered.
    :vartype recovery_point_id: str
    :ivar recovery_type: Type of this recovery. Known values are: "Invalid", "OriginalLocation",
     "AlternateLocation", "RestoreDisks", and "Offline".
    :vartype recovery_type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryType
    :ivar source_resource_id: Fully qualified ARM ID of the VM which is being recovered.
    :vartype source_resource_id: str
    :ivar target_virtual_machine_id: This is the complete ARM Id of the VM that will be created.
     For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}/provider/Microsoft.Compute/virtualmachines/{vm}.
    :vartype target_virtual_machine_id: str
    :ivar target_resource_group_id: This is the ARM Id of the resource group that you want to
     create for this Virtual machine and other artifacts. For e.g.
     /subscriptions/{subId}/resourcegroups/{rg}.
    :vartype target_resource_group_id: str
    :ivar storage_account_id: Fully qualified ARM ID of the storage account to which the VM has to
     be restored.
    :vartype storage_account_id: str
    :ivar virtual_network_id: This is the virtual network Id of the vnet that will be attached to
     the virtual machine. User will be validated for join action permissions in the linked access.
    :vartype virtual_network_id: str
    :ivar subnet_id: Subnet ID, is the subnet ID associated with the to be restored VM. For Classic
     VMs it would be {VnetID}/Subnet/{SubnetName} and, for the Azure Resource Manager VMs it would
     be ARM resource ID used to represent the subnet.
    :vartype subnet_id: str
    :ivar target_domain_name_id: Fully qualified ARM ID of the domain name to be associated to the
     VM being restored. This applies only to Classic Virtual Machines.
    :vartype target_domain_name_id: str
    :ivar region: Region in which the virtual machine is restored.
    :vartype region: str
    :ivar affinity_group: Affinity group associated to VM to be restored. Used only for Classic
     Compute Virtual Machines.
    :vartype affinity_group: str
    :ivar create_new_cloud_service: Should a new cloud service be created while restoring the VM.
     If this is false, VM will be restored to the same cloud service as it was at the time of
     backup.
    :vartype create_new_cloud_service: bool
    :ivar original_storage_account_option: Original Storage Account Option.
    :vartype original_storage_account_option: bool
    :ivar encryption_details: Details needed if the VM was encrypted at the time of backup.
    :vartype encryption_details: ~azure.mgmt.recoveryservicesbackup.models.EncryptionDetails
    :ivar restore_disk_lun_list: List of Disk LUNs for partial restore.
    :vartype restore_disk_lun_list: list[int]
    :ivar restore_with_managed_disks: Flag to denote of an Unmanaged disk VM should be restored
     with Managed disks.
    :vartype restore_with_managed_disks: bool
    :ivar disk_encryption_set_id: DiskEncryptionSet's ID - needed if the VM needs to be encrypted
     at rest during restore with customer managed key.
    :vartype disk_encryption_set_id: str
    :ivar zones: Target zone where the VM and its disks should be restored.
    :vartype zones: list[str]
    :ivar identity_info: Managed Identity information required to access customer storage account.
    :vartype identity_info: ~azure.mgmt.recoveryservicesbackup.models.IdentityInfo
    :ivar identity_based_restore_details: IaaS VM workload specific restore details for restores
     using managed identity.
    :vartype identity_based_restore_details:
     ~azure.mgmt.recoveryservicesbackup.models.IdentityBasedRestoreDetails
    :ivar extended_location: Target extended location where the VM should be restored, should be
     null if restore is to be done in public cloud.
    :vartype extended_location: ~azure.mgmt.recoveryservicesbackup.models.ExtendedLocation
    :ivar secured_vm_details: Stores Secured VM Details.
    :vartype secured_vm_details: ~azure.mgmt.recoveryservicesbackup.models.SecuredVMDetails
    :ivar target_disk_network_access_settings: Specifies target network access settings for disks
     of VM to be restored,.
    :vartype target_disk_network_access_settings:
     ~azure.mgmt.recoveryservicesbackup.models.TargetDiskNetworkAccessSettings
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "IaasVMRestoreWithRehydrationRequest".
    :vartype object_type: str
    :ivar recovery_point_rehydration_info: RP Rehydration Info.
    :vartype recovery_point_rehydration_info:
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointRehydrationInfo
    """

    object_type: Literal["IaasVMRestoreWithRehydrationRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"IaasVMRestoreWithRehydrationRequest\"."""
    recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = rest_field(
        name="recoveryPointRehydrationInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """RP Rehydration Info."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        recovery_point_id: Optional[str] = None,
        recovery_type: Optional[Union[str, "_models.RecoveryType"]] = None,
        source_resource_id: Optional[str] = None,
        target_virtual_machine_id: Optional[str] = None,
        target_resource_group_id: Optional[str] = None,
        storage_account_id: Optional[str] = None,
        virtual_network_id: Optional[str] = None,
        subnet_id: Optional[str] = None,
        target_domain_name_id: Optional[str] = None,
        region: Optional[str] = None,
        affinity_group: Optional[str] = None,
        create_new_cloud_service: Optional[bool] = None,
        original_storage_account_option: Optional[bool] = None,
        encryption_details: Optional["_models.EncryptionDetails"] = None,
        restore_disk_lun_list: Optional[list[int]] = None,
        restore_with_managed_disks: Optional[bool] = None,
        disk_encryption_set_id: Optional[str] = None,
        zones: Optional[list[str]] = None,
        identity_info: Optional["_models.IdentityInfo"] = None,
        identity_based_restore_details: Optional["_models.IdentityBasedRestoreDetails"] = None,
        extended_location: Optional["_models.ExtendedLocation"] = None,
        secured_vm_details: Optional["_models.SecuredVMDetails"] = None,
        target_disk_network_access_settings: Optional["_models.TargetDiskNetworkAccessSettings"] = None,
        recovery_point_rehydration_info: Optional["_models.RecoveryPointRehydrationInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "IaasVMRestoreWithRehydrationRequest"  # type: ignore


class IdentityBasedRestoreDetails(_Model):
    """IaaS VM workload specific restore details for restores using managed identity.

    :ivar object_type: Gets the class type.
    :vartype object_type: str
    :ivar target_storage_account_id: Fully qualified ARM ID of the target storage account.
    :vartype target_storage_account_id: str
    """

    object_type: Optional[str] = rest_field(
        name="objectType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets the class type."""
    target_storage_account_id: Optional[str] = rest_field(
        name="targetStorageAccountId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Fully qualified ARM ID of the target storage account."""

    @overload
    def __init__(
        self,
        *,
        object_type: Optional[str] = None,
        target_storage_account_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class IdentityInfo(_Model):
    """Encapsulates Managed Identity related information.

    :ivar is_system_assigned_identity: To differentiate if the managed identity is system assigned
     or user assigned.
    :vartype is_system_assigned_identity: bool
    :ivar managed_identity_resource_id: Managed Identity Resource Id Optional: Might not be
     required in the case of system assigned managed identity.
    :vartype managed_identity_resource_id: str
    """

    is_system_assigned_identity: Optional[bool] = rest_field(
        name="isSystemAssignedIdentity", visibility=["read", "create", "update", "delete", "query"]
    )
    """To differentiate if the managed identity is system assigned or user assigned."""
    managed_identity_resource_id: Optional[str] = rest_field(
        name="managedIdentityResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Managed Identity Resource Id Optional: Might not be required in the case of system assigned
     managed identity."""

    @overload
    def __init__(
        self,
        *,
        is_system_assigned_identity: Optional[bool] = None,
        managed_identity_resource_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ILRRequestResource(Resource):
    """Parameters to Provision ILR API.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar location: Resource location.
    :vartype location: str
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    :ivar properties: ILRRequestResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ILRRequest
    """

    location: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource location."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""
    properties: Optional["_models.ILRRequest"] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """ILRRequestResource properties."""

    @overload
    def __init__(
        self,
        *,
        location: Optional[str] = None,
        tags: Optional[dict[str, str]] = None,
        e_tag: Optional[str] = None,
        properties: Optional["_models.ILRRequest"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class InquiryInfo(_Model):
    """Details about inquired protectable items under a given container.

    :ivar status: Inquiry Status for this container such as InProgress | Failed | Succeeded.
    :vartype status: str
    :ivar error_detail: Error Details if the Status is non-success.
    :vartype error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar inquiry_details: Inquiry Details which will have workload specific details. For e.g. -
     For SQL and oracle this will contain different details.
    :vartype inquiry_details:
     list[~azure.mgmt.recoveryservicesbackup.models.WorkloadInquiryDetails]
    """

    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Inquiry Status for this container such as InProgress | Failed | Succeeded."""
    error_detail: Optional["_models.ErrorDetail"] = rest_field(
        name="errorDetail", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error Details if the Status is non-success."""
    inquiry_details: Optional[list["_models.WorkloadInquiryDetails"]] = rest_field(
        name="inquiryDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Inquiry Details which will have workload specific details. For e.g. - For SQL and oracle this
     will contain different details."""

    @overload
    def __init__(
        self,
        *,
        status: Optional[str] = None,
        error_detail: Optional["_models.ErrorDetail"] = None,
        inquiry_details: Optional[list["_models.WorkloadInquiryDetails"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class InquiryValidation(_Model):
    """Validation for inquired protectable items under a given container.

    :ivar status: Status for the Inquiry Validation.
    :vartype status: str
    :ivar error_detail: Error Detail in case the status is non-success.
    :vartype error_detail: ~azure.mgmt.recoveryservicesbackup.models.ErrorDetail
    :ivar additional_detail: Error Additional Detail in case the status is non-success.
    :vartype additional_detail: str
    :ivar protectable_item_count: Dictionary to store the count of ProtectableItems with key
     POType.
    :vartype protectable_item_count: any
    """

    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Status for the Inquiry Validation."""
    error_detail: Optional["_models.ErrorDetail"] = rest_field(
        name="errorDetail", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error Detail in case the status is non-success."""
    additional_detail: Optional[str] = rest_field(name="additionalDetail", visibility=["read"])
    """Error Additional Detail in case the status is non-success."""
    protectable_item_count: Optional[Any] = rest_field(name="protectableItemCount", visibility=["read"])
    """Dictionary to store the count of ProtectableItems with key POType."""

    @overload
    def __init__(
        self,
        *,
        status: Optional[str] = None,
        error_detail: Optional["_models.ErrorDetail"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class InstantItemRecoveryTarget(_Model):
    """Target details for file / folder restore.

    :ivar client_scripts: List of client scripts.
    :vartype client_scripts: list[~azure.mgmt.recoveryservicesbackup.models.ClientScriptForConnect]
    """

    client_scripts: Optional[list["_models.ClientScriptForConnect"]] = rest_field(
        name="clientScripts", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of client scripts."""

    @overload
    def __init__(
        self,
        *,
        client_scripts: Optional[list["_models.ClientScriptForConnect"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class InstantRPAdditionalDetails(_Model):
    """InstantRPAdditionalDetails.

    :ivar azure_backup_rg_name_prefix:
    :vartype azure_backup_rg_name_prefix: str
    :ivar azure_backup_rg_name_suffix:
    :vartype azure_backup_rg_name_suffix: str
    """

    azure_backup_rg_name_prefix: Optional[str] = rest_field(
        name="azureBackupRGNamePrefix", visibility=["read", "create", "update", "delete", "query"]
    )
    azure_backup_rg_name_suffix: Optional[str] = rest_field(
        name="azureBackupRGNameSuffix", visibility=["read", "create", "update", "delete", "query"]
    )

    @overload
    def __init__(
        self,
        *,
        azure_backup_rg_name_prefix: Optional[str] = None,
        azure_backup_rg_name_suffix: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class JobResource(ProxyResource):
    """Defines workload agnostic properties for a job.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: JobResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.Job
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.Job"] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """JobResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.Job"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class KEKDetails(_Model):
    """KEK is encryption key for BEK.

    :ivar key_url: Key is KEK.
    :vartype key_url: str
    :ivar key_vault_id: Key Vault ID where this Key is stored.
    :vartype key_vault_id: str
    :ivar key_backup_data: KEK data.
    :vartype key_backup_data: str
    """

    key_url: Optional[str] = rest_field(name="keyUrl", visibility=["read", "create", "update", "delete", "query"])
    """Key is KEK."""
    key_vault_id: Optional[str] = rest_field(
        name="keyVaultId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Key Vault ID where this Key is stored."""
    key_backup_data: Optional[str] = rest_field(
        name="keyBackupData", visibility=["read", "create", "update", "delete", "query"]
    )
    """KEK data."""

    @overload
    def __init__(
        self,
        *,
        key_url: Optional[str] = None,
        key_vault_id: Optional[str] = None,
        key_backup_data: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class KeyAndSecretDetails(_Model):
    """BEK is bitlocker key.
    KEK is encryption key for BEK
    If the VM was encrypted then we will store following details :

    1. Secret(BEK) - Url + Backup Data + vaultId.
    2. Key(KEK) - Url + Backup Data + vaultId.
    3. EncryptionMechanism
    BEK and KEK can potentially have different vault ids.

    :ivar kek_details: KEK is encryption key for BEK.
    :vartype kek_details: ~azure.mgmt.recoveryservicesbackup.models.KEKDetails
    :ivar bek_details: BEK is bitlocker encryption key.
    :vartype bek_details: ~azure.mgmt.recoveryservicesbackup.models.BEKDetails
    :ivar encryption_mechanism: Encryption mechanism: None/ SinglePass/ DoublePass.
    :vartype encryption_mechanism: str
    """

    kek_details: Optional["_models.KEKDetails"] = rest_field(
        name="kekDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """KEK is encryption key for BEK."""
    bek_details: Optional["_models.BEKDetails"] = rest_field(
        name="bekDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """BEK is bitlocker encryption key."""
    encryption_mechanism: Optional[str] = rest_field(
        name="encryptionMechanism", visibility=["read", "create", "update", "delete", "query"]
    )
    """Encryption mechanism: None/ SinglePass/ DoublePass."""

    @overload
    def __init__(
        self,
        *,
        kek_details: Optional["_models.KEKDetails"] = None,
        bek_details: Optional["_models.BEKDetails"] = None,
        encryption_mechanism: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class KPIResourceHealthDetails(_Model):
    """KPI Resource Health Details.

    :ivar resource_health_status: Resource Health Status. Known values are: "Healthy",
     "TransientDegraded", "PersistentDegraded", "TransientUnhealthy", "PersistentUnhealthy", and
     "Invalid".
    :vartype resource_health_status: str or
     ~azure.mgmt.recoveryservicesbackup.models.ResourceHealthStatus
    :ivar resource_health_details: Resource Health Status.
    :vartype resource_health_details:
     list[~azure.mgmt.recoveryservicesbackup.models.ResourceHealthDetails]
    """

    resource_health_status: Optional[Union[str, "_models.ResourceHealthStatus"]] = rest_field(
        name="resourceHealthStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Resource Health Status. Known values are: \"Healthy\", \"TransientDegraded\",
     \"PersistentDegraded\", \"TransientUnhealthy\", \"PersistentUnhealthy\", and \"Invalid\"."""
    resource_health_details: Optional[list["_models.ResourceHealthDetails"]] = rest_field(
        name="resourceHealthDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Resource Health Status."""

    @overload
    def __init__(
        self,
        *,
        resource_health_status: Optional[Union[str, "_models.ResourceHealthStatus"]] = None,
        resource_health_details: Optional[list["_models.ResourceHealthDetails"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ListRecoveryPointsRecommendedForMoveRequest(_Model):  # pylint: disable=name-too-long
    """ListRecoveryPointsRecommendedForMoveRequest Request.

    :ivar object_type: Gets the class type.
    :vartype object_type: str
    :ivar excluded_rp_list: List of Recovery Points excluded from Move.
    :vartype excluded_rp_list: list[str]
    """

    object_type: Optional[str] = rest_field(
        name="objectType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets the class type."""
    excluded_rp_list: Optional[list[str]] = rest_field(
        name="excludedRPList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of Recovery Points excluded from Move."""

    @overload
    def __init__(
        self,
        *,
        object_type: Optional[str] = None,
        excluded_rp_list: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SchedulePolicy(_Model):
    """Base class for backup schedule.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    LogSchedulePolicy, LongTermSchedulePolicy, SimpleSchedulePolicy, SimpleSchedulePolicyV2

    :ivar schedule_policy_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is None.
    :vartype schedule_policy_type: str
    """

    __mapping__: dict[str, _Model] = {}
    schedule_policy_type: str = rest_discriminator(
        name="schedulePolicyType", visibility=["read", "create", "update", "delete", "query"]
    )
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        schedule_policy_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class LogSchedulePolicy(SchedulePolicy, discriminator="LogSchedulePolicy"):
    """Log policy schedule.

    :ivar schedule_frequency_in_mins: Frequency of the log schedule operation of this policy in
     minutes.
    :vartype schedule_frequency_in_mins: int
    :ivar schedule_policy_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "LogSchedulePolicy".
    :vartype schedule_policy_type: str
    """

    schedule_frequency_in_mins: Optional[int] = rest_field(
        name="scheduleFrequencyInMins", visibility=["read", "create", "update", "delete", "query"]
    )
    """Frequency of the log schedule operation of this policy in minutes."""
    schedule_policy_type: Literal["LogSchedulePolicy"] = rest_discriminator(name="schedulePolicyType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"LogSchedulePolicy\"."""

    @overload
    def __init__(
        self,
        *,
        schedule_frequency_in_mins: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.schedule_policy_type = "LogSchedulePolicy"  # type: ignore


class RetentionPolicy(_Model):
    """Base class for retention policy.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    LongTermRetentionPolicy, SimpleRetentionPolicy

    :ivar retention_policy_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is None.
    :vartype retention_policy_type: str
    """

    __mapping__: dict[str, _Model] = {}
    retention_policy_type: str = rest_discriminator(
        name="retentionPolicyType", visibility=["read", "create", "update", "delete", "query"]
    )
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        retention_policy_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class LongTermRetentionPolicy(RetentionPolicy, discriminator="LongTermRetentionPolicy"):
    """Long term retention policy.

    :ivar daily_schedule: Daily retention schedule of the protection policy.
    :vartype daily_schedule: ~azure.mgmt.recoveryservicesbackup.models.DailyRetentionSchedule
    :ivar weekly_schedule: Weekly retention schedule of the protection policy.
    :vartype weekly_schedule: ~azure.mgmt.recoveryservicesbackup.models.WeeklyRetentionSchedule
    :ivar monthly_schedule: Monthly retention schedule of the protection policy.
    :vartype monthly_schedule: ~azure.mgmt.recoveryservicesbackup.models.MonthlyRetentionSchedule
    :ivar yearly_schedule: Yearly retention schedule of the protection policy.
    :vartype yearly_schedule: ~azure.mgmt.recoveryservicesbackup.models.YearlyRetentionSchedule
    :ivar retention_policy_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "LongTermRetentionPolicy".
    :vartype retention_policy_type: str
    """

    daily_schedule: Optional["_models.DailyRetentionSchedule"] = rest_field(
        name="dailySchedule", visibility=["read", "create", "update", "delete", "query"]
    )
    """Daily retention schedule of the protection policy."""
    weekly_schedule: Optional["_models.WeeklyRetentionSchedule"] = rest_field(
        name="weeklySchedule", visibility=["read", "create", "update", "delete", "query"]
    )
    """Weekly retention schedule of the protection policy."""
    monthly_schedule: Optional["_models.MonthlyRetentionSchedule"] = rest_field(
        name="monthlySchedule", visibility=["read", "create", "update", "delete", "query"]
    )
    """Monthly retention schedule of the protection policy."""
    yearly_schedule: Optional["_models.YearlyRetentionSchedule"] = rest_field(
        name="yearlySchedule", visibility=["read", "create", "update", "delete", "query"]
    )
    """Yearly retention schedule of the protection policy."""
    retention_policy_type: Literal["LongTermRetentionPolicy"] = rest_discriminator(name="retentionPolicyType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"LongTermRetentionPolicy\"."""

    @overload
    def __init__(
        self,
        *,
        daily_schedule: Optional["_models.DailyRetentionSchedule"] = None,
        weekly_schedule: Optional["_models.WeeklyRetentionSchedule"] = None,
        monthly_schedule: Optional["_models.MonthlyRetentionSchedule"] = None,
        yearly_schedule: Optional["_models.YearlyRetentionSchedule"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.retention_policy_type = "LongTermRetentionPolicy"  # type: ignore


class LongTermSchedulePolicy(SchedulePolicy, discriminator="LongTermSchedulePolicy"):
    """Long term policy schedule.

    :ivar schedule_policy_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "LongTermSchedulePolicy".
    :vartype schedule_policy_type: str
    """

    schedule_policy_type: Literal["LongTermSchedulePolicy"] = rest_discriminator(name="schedulePolicyType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"LongTermSchedulePolicy\"."""

    @overload
    def __init__(
        self,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.schedule_policy_type = "LongTermSchedulePolicy"  # type: ignore


class MabContainer(ProtectionContainer, discriminator="Windows"):
    """Container with items backed up using MAB backup engine.

    :ivar friendly_name: Friendly name of the container.
    :vartype friendly_name: str
    :ivar backup_management_type: Type of backup management for the container. Known values are:
     "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar registration_status: Status of registration of the container with the Recovery Services
     Vault.
    :vartype registration_status: str
    :ivar health_status: Status of health of the container.
    :vartype health_status: str
    :ivar protectable_object_type: Type of the protectable object associated with this container.
    :vartype protectable_object_type: str
    :ivar can_re_register: Can the container be registered one more time.
    :vartype can_re_register: bool
    :ivar container_id: ContainerID represents the container.
    :vartype container_id: int
    :ivar protected_item_count: Number of items backed up in this container.
    :vartype protected_item_count: int
    :ivar agent_version: Agent version of this container.
    :vartype agent_version: str
    :ivar extended_info: Additional information for this container.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.MabContainerExtendedInfo
    :ivar mab_container_health_details: Health details on this mab container.
    :vartype mab_container_health_details:
     list[~azure.mgmt.recoveryservicesbackup.models.MABContainerHealthDetails]
    :ivar container_health_state: Health state of mab container.
    :vartype container_health_state: str
    :ivar container_type: Type of the container. The value of this property for: 1. Compute Azure
     VM is Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. WINDOWS.
    :vartype container_type: str or ~azure.mgmt.recoveryservicesbackup.models.WINDOWS
    """

    can_re_register: Optional[bool] = rest_field(
        name="canReRegister", visibility=["read", "create", "update", "delete", "query"]
    )
    """Can the container be registered one more time."""
    container_id: Optional[int] = rest_field(
        name="containerId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ContainerID represents the container."""
    protected_item_count: Optional[int] = rest_field(
        name="protectedItemCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of items backed up in this container."""
    agent_version: Optional[str] = rest_field(
        name="agentVersion", visibility=["read", "create", "update", "delete", "query"]
    )
    """Agent version of this container."""
    extended_info: Optional["_models.MabContainerExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information for this container."""
    mab_container_health_details: Optional[list["_models.MABContainerHealthDetails"]] = rest_field(
        name="mabContainerHealthDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Health details on this mab container."""
    container_health_state: Optional[str] = rest_field(
        name="containerHealthState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Health state of mab container."""
    container_type: Literal[ProtectableContainerType.WINDOWS] = rest_discriminator(name="containerType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """Type of the container. The value of this property for: 1. Compute Azure VM is
     Microsoft.Compute/virtualMachines 2. Classic Compute Azure VM is
     Microsoft.ClassicCompute/virtualMachines 3. Windows machines (like MAB, DPM etc) is Windows 4.
     Azure SQL instance is AzureSqlContainer. 5. Storage containers is StorageContainer. 6. Azure
     workload Backup is VMAppContainer. Required. WINDOWS."""

    @overload
    def __init__(
        self,
        *,
        friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        registration_status: Optional[str] = None,
        health_status: Optional[str] = None,
        protectable_object_type: Optional[str] = None,
        can_re_register: Optional[bool] = None,
        container_id: Optional[int] = None,
        protected_item_count: Optional[int] = None,
        agent_version: Optional[str] = None,
        extended_info: Optional["_models.MabContainerExtendedInfo"] = None,
        mab_container_health_details: Optional[list["_models.MABContainerHealthDetails"]] = None,
        container_health_state: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.container_type = ProtectableContainerType.WINDOWS  # type: ignore


class MabContainerExtendedInfo(_Model):
    """Additional information of the container.

    :ivar last_refreshed_at: Time stamp when this container was refreshed.
    :vartype last_refreshed_at: ~datetime.datetime
    :ivar backup_item_type: Type of backup items associated with this container. Known values are:
     "Invalid", "VM", "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM",
     "SystemState", "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare",
     "SAPHanaDatabase", "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype backup_item_type: str or ~azure.mgmt.recoveryservicesbackup.models.BackupItemType
    :ivar backup_items: List of backup items associated with this container.
    :vartype backup_items: list[str]
    :ivar policy_name: Backup policy associated with this container.
    :vartype policy_name: str
    :ivar last_backup_status: Latest backup status of this container.
    :vartype last_backup_status: str
    """

    last_refreshed_at: Optional[datetime.datetime] = rest_field(
        name="lastRefreshedAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Time stamp when this container was refreshed."""
    backup_item_type: Optional[Union[str, "_models.BackupItemType"]] = rest_field(
        name="backupItemType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup items associated with this container. Known values are: \"Invalid\", \"VM\",
     \"FileFolder\", \"AzureSqlDb\", \"SQLDB\", \"Exchange\", \"Sharepoint\", \"VMwareVM\",
     \"SystemState\", \"Client\", \"GenericDataSource\", \"SQLDataBase\", \"AzureFileShare\",
     \"SAPHanaDatabase\", \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""
    backup_items: Optional[list[str]] = rest_field(
        name="backupItems", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of backup items associated with this container."""
    policy_name: Optional[str] = rest_field(
        name="policyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup policy associated with this container."""
    last_backup_status: Optional[str] = rest_field(
        name="lastBackupStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Latest backup status of this container."""

    @overload
    def __init__(
        self,
        *,
        last_refreshed_at: Optional[datetime.datetime] = None,
        backup_item_type: Optional[Union[str, "_models.BackupItemType"]] = None,
        backup_items: Optional[list[str]] = None,
        policy_name: Optional[str] = None,
        last_backup_status: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class MABContainerHealthDetails(_Model):
    """MAB workload-specific Health Details.

    :ivar code: Health Code.
    :vartype code: int
    :ivar title: Health Title.
    :vartype title: str
    :ivar message: Health Message.
    :vartype message: str
    :ivar recommendations: Health Recommended Actions.
    :vartype recommendations: list[str]
    """

    code: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Health Code."""
    title: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Health Title."""
    message: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Health Message."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Health Recommended Actions."""

    @overload
    def __init__(
        self,
        *,
        code: Optional[int] = None,
        title: Optional[str] = None,
        message: Optional[str] = None,
        recommendations: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class MabErrorInfo(_Model):
    """MAB workload-specific error information.

    :ivar error_string: Localized error string.
    :vartype error_string: str
    :ivar recommendations: List of localized recommendations.
    :vartype recommendations: list[str]
    """

    error_string: Optional[str] = rest_field(name="errorString", visibility=["read"])
    """Localized error string."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read"])
    """List of localized recommendations."""


class MabFileFolderProtectedItem(ProtectedItem, discriminator="MabFileFolderProtectedItem"):
    """MAB workload-specific backup item.

    :ivar backup_management_type: Type of backup management for the backed up item. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar workload_type: Type of workload this item represents. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar container_name: Unique name of container.
    :vartype container_name: str
    :ivar source_resource_id: ARM ID of the resource to be backed up.
    :vartype source_resource_id: str
    :ivar policy_id: ID of the backup policy with which this item is backed up.
    :vartype policy_id: str
    :ivar last_recovery_point: Timestamp when the last (latest) backup copy was created for this
     backup item.
    :vartype last_recovery_point: ~datetime.datetime
    :ivar backup_set_name: Name of the backup set the backup item belongs to.
    :vartype backup_set_name: str
    :ivar create_mode: Create mode to indicate recovery of existing soft deleted data source or
     creation of new data source. Known values are: "Invalid", "Default", and "Recover".
    :vartype create_mode: str or ~azure.mgmt.recoveryservicesbackup.models.CreateMode
    :ivar deferred_delete_time_in_utc: Time for deferred deletion in UTC.
    :vartype deferred_delete_time_in_utc: ~datetime.datetime
    :ivar is_scheduled_for_deferred_delete: Flag to identify whether the DS is scheduled for
     deferred delete.
    :vartype is_scheduled_for_deferred_delete: bool
    :ivar deferred_delete_time_remaining: Time remaining before the DS marked for deferred delete
     is permanently deleted.
    :vartype deferred_delete_time_remaining: str
    :ivar is_deferred_delete_schedule_upcoming: Flag to identify whether the deferred deleted DS is
     to be purged soon.
    :vartype is_deferred_delete_schedule_upcoming: bool
    :ivar is_rehydrate: Flag to identify that deferred deleted DS is to be moved into Pause state.
    :vartype is_rehydrate: bool
    :ivar resource_guard_operation_requests: ResourceGuardOperationRequests on which LAC check will
     be performed.
    :vartype resource_guard_operation_requests: list[str]
    :ivar is_archive_enabled: Flag to identify whether datasource is protected in archive.
    :vartype is_archive_enabled: bool
    :ivar policy_name: Name of the policy used for protection.
    :vartype policy_name: str
    :ivar soft_delete_retention_period_in_days: Soft delete retention period in days.
    :vartype soft_delete_retention_period_in_days: int
    :ivar vault_id: ID of the vault which protects this item.
    :vartype vault_id: str
    :ivar source_side_scan_info: Source side threat information.
    :vartype source_side_scan_info: ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanInfo
    :ivar friendly_name: Friendly name of this backup item.
    :vartype friendly_name: str
    :ivar computer_name: Name of the computer associated with this backup item.
    :vartype computer_name: str
    :ivar last_backup_status: Status of last backup operation.
    :vartype last_backup_status: str
    :ivar last_backup_time: Timestamp of the last backup operation on this backup item.
    :vartype last_backup_time: ~datetime.datetime
    :ivar protection_state: Protected, ProtectionStopped, IRPending or ProtectionError.
    :vartype protection_state: str
    :ivar deferred_delete_sync_time_in_utc: Sync time for deferred deletion in UTC.
    :vartype deferred_delete_sync_time_in_utc: int
    :ivar extended_info: Additional information with this backup item.
    :vartype extended_info:
     ~azure.mgmt.recoveryservicesbackup.models.MabFileFolderProtectedItemExtendedInfo
    :ivar protected_item_type: backup item type. Required. Default value is
     "MabFileFolderProtectedItem".
    :vartype protected_item_type: str
    """

    friendly_name: Optional[str] = rest_field(
        name="friendlyName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Friendly name of this backup item."""
    computer_name: Optional[str] = rest_field(
        name="computerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of the computer associated with this backup item."""
    last_backup_status: Optional[str] = rest_field(
        name="lastBackupStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Status of last backup operation."""
    last_backup_time: Optional[datetime.datetime] = rest_field(
        name="lastBackupTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Timestamp of the last backup operation on this backup item."""
    protection_state: Optional[str] = rest_field(
        name="protectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Protected, ProtectionStopped, IRPending or ProtectionError."""
    deferred_delete_sync_time_in_utc: Optional[int] = rest_field(
        name="deferredDeleteSyncTimeInUTC", visibility=["read", "create", "update", "delete", "query"]
    )
    """Sync time for deferred deletion in UTC."""
    extended_info: Optional["_models.MabFileFolderProtectedItemExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information with this backup item."""
    protected_item_type: Literal["MabFileFolderProtectedItem"] = rest_discriminator(name="protectedItemType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """backup item type. Required. Default value is \"MabFileFolderProtectedItem\"."""

    @overload
    def __init__(  # pylint: disable=too-many-locals
        self,
        *,
        container_name: Optional[str] = None,
        source_resource_id: Optional[str] = None,
        policy_id: Optional[str] = None,
        last_recovery_point: Optional[datetime.datetime] = None,
        backup_set_name: Optional[str] = None,
        create_mode: Optional[Union[str, "_models.CreateMode"]] = None,
        deferred_delete_time_in_utc: Optional[datetime.datetime] = None,
        is_scheduled_for_deferred_delete: Optional[bool] = None,
        deferred_delete_time_remaining: Optional[str] = None,
        is_deferred_delete_schedule_upcoming: Optional[bool] = None,
        is_rehydrate: Optional[bool] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        is_archive_enabled: Optional[bool] = None,
        policy_name: Optional[str] = None,
        soft_delete_retention_period_in_days: Optional[int] = None,
        source_side_scan_info: Optional["_models.SourceSideScanInfo"] = None,
        friendly_name: Optional[str] = None,
        computer_name: Optional[str] = None,
        last_backup_status: Optional[str] = None,
        last_backup_time: Optional[datetime.datetime] = None,
        protection_state: Optional[str] = None,
        deferred_delete_sync_time_in_utc: Optional[int] = None,
        extended_info: Optional["_models.MabFileFolderProtectedItemExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.protected_item_type = "MabFileFolderProtectedItem"  # type: ignore


class MabFileFolderProtectedItemExtendedInfo(_Model):
    """Additional information on the backed up item.

    :ivar last_refreshed_at: Last time when the agent data synced to service.
    :vartype last_refreshed_at: ~datetime.datetime
    :ivar oldest_recovery_point: The oldest backup copy available.
    :vartype oldest_recovery_point: ~datetime.datetime
    :ivar recovery_point_count: Number of backup copies associated with the backup item.
    :vartype recovery_point_count: int
    """

    last_refreshed_at: Optional[datetime.datetime] = rest_field(
        name="lastRefreshedAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Last time when the agent data synced to service."""
    oldest_recovery_point: Optional[datetime.datetime] = rest_field(
        name="oldestRecoveryPoint", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The oldest backup copy available."""
    recovery_point_count: Optional[int] = rest_field(
        name="recoveryPointCount", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of backup copies associated with the backup item."""

    @overload
    def __init__(
        self,
        *,
        last_refreshed_at: Optional[datetime.datetime] = None,
        oldest_recovery_point: Optional[datetime.datetime] = None,
        recovery_point_count: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class MabJob(Job, discriminator="MabJob"):
    """MAB workload-specific job.

    :ivar entity_friendly_name: Friendly name of the entity on which the current job is executing.
    :vartype entity_friendly_name: str
    :ivar backup_management_type: Backup management type to execute the current job. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar operation: The operation name.
    :vartype operation: str
    :ivar status: Job status.
    :vartype status: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar activity_id: ActivityId of job.
    :vartype activity_id: str
    :ivar duration: Time taken by job to run.
    :vartype duration: ~datetime.timedelta
    :ivar actions_info: The state/actions applicable on jobs like cancel/retry.
    :vartype actions_info: list[str or
     ~azure.mgmt.recoveryservicesbackup.models.JobSupportedAction]
    :ivar mab_server_name: Name of server protecting the DS.
    :vartype mab_server_name: str
    :ivar mab_server_type: Server type of MAB container. Known values are: "Invalid", "Unknown",
     "IaasVMContainer", "IaasVMServiceContainer", "DPMContainer", "AzureBackupServerContainer",
     "MABContainer", "Cluster", "AzureSqlContainer", "Windows", "VCenter", "VMAppContainer",
     "SQLAGWorkLoadContainer", "StorageContainer", and "GenericContainer".
    :vartype mab_server_type: str or ~azure.mgmt.recoveryservicesbackup.models.MabServerType
    :ivar workload_type: Workload type of backup item. Known values are: "Invalid", "VM",
     "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM", "SystemState",
     "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare", "SAPHanaDatabase",
     "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype workload_type: str or ~azure.mgmt.recoveryservicesbackup.models.WorkloadType
    :ivar error_details: The errors.
    :vartype error_details: list[~azure.mgmt.recoveryservicesbackup.models.MabErrorInfo]
    :ivar extended_info: Additional information on the job.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.MabJobExtendedInfo
    :ivar job_type: This property will be used as the discriminator for deciding the specific types
     in the polymorphic chain of types. Required. Default value is "MabJob".
    :vartype job_type: str
    """

    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time taken by job to run."""
    actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = rest_field(
        name="actionsInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """The state/actions applicable on jobs like cancel/retry."""
    mab_server_name: Optional[str] = rest_field(
        name="mabServerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Name of server protecting the DS."""
    mab_server_type: Optional[Union[str, "_models.MabServerType"]] = rest_field(
        name="mabServerType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Server type of MAB container. Known values are: \"Invalid\", \"Unknown\", \"IaasVMContainer\",
     \"IaasVMServiceContainer\", \"DPMContainer\", \"AzureBackupServerContainer\", \"MABContainer\",
     \"Cluster\", \"AzureSqlContainer\", \"Windows\", \"VCenter\", \"VMAppContainer\",
     \"SQLAGWorkLoadContainer\", \"StorageContainer\", and \"GenericContainer\"."""
    workload_type: Optional[Union[str, "_models.WorkloadType"]] = rest_field(
        name="workloadType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Workload type of backup item. Known values are: \"Invalid\", \"VM\", \"FileFolder\",
     \"AzureSqlDb\", \"SQLDB\", \"Exchange\", \"Sharepoint\", \"VMwareVM\", \"SystemState\",
     \"Client\", \"GenericDataSource\", \"SQLDataBase\", \"AzureFileShare\", \"SAPHanaDatabase\",
     \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""
    error_details: Optional[list["_models.MabErrorInfo"]] = rest_field(
        name="errorDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """The errors."""
    extended_info: Optional["_models.MabJobExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information on the job."""
    job_type: Literal["MabJob"] = rest_discriminator(name="jobType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"MabJob\"."""

    @overload
    def __init__(
        self,
        *,
        entity_friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        operation: Optional[str] = None,
        status: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        activity_id: Optional[str] = None,
        duration: Optional[datetime.timedelta] = None,
        actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = None,
        mab_server_name: Optional[str] = None,
        mab_server_type: Optional[Union[str, "_models.MabServerType"]] = None,
        workload_type: Optional[Union[str, "_models.WorkloadType"]] = None,
        error_details: Optional[list["_models.MabErrorInfo"]] = None,
        extended_info: Optional["_models.MabJobExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.job_type = "MabJob"  # type: ignore


class MabJobExtendedInfo(_Model):
    """Additional information for the MAB workload-specific job.

    :ivar tasks_list: List of tasks for this job.
    :vartype tasks_list: list[~azure.mgmt.recoveryservicesbackup.models.MabJobTaskDetails]
    :ivar property_bag: The job properties.
    :vartype property_bag: dict[str, str]
    :ivar dynamic_error_message: Non localized error message specific to this job.
    :vartype dynamic_error_message: str
    """

    tasks_list: Optional[list["_models.MabJobTaskDetails"]] = rest_field(
        name="tasksList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of tasks for this job."""
    property_bag: Optional[dict[str, str]] = rest_field(
        name="propertyBag", visibility=["read", "create", "update", "delete", "query"]
    )
    """The job properties."""
    dynamic_error_message: Optional[str] = rest_field(
        name="dynamicErrorMessage", visibility=["read", "create", "update", "delete", "query"]
    )
    """Non localized error message specific to this job."""

    @overload
    def __init__(
        self,
        *,
        tasks_list: Optional[list["_models.MabJobTaskDetails"]] = None,
        property_bag: Optional[dict[str, str]] = None,
        dynamic_error_message: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class MabJobTaskDetails(_Model):
    """MAB workload-specific job task details.

    :ivar task_id: The task display name.
    :vartype task_id: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar duration: Time elapsed for task.
    :vartype duration: ~datetime.timedelta
    :ivar status: The status.
    :vartype status: str
    """

    task_id: Optional[str] = rest_field(name="taskId", visibility=["read", "create", "update", "delete", "query"])
    """The task display name."""
    start_time: Optional[datetime.datetime] = rest_field(
        name="startTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The start time."""
    end_time: Optional[datetime.datetime] = rest_field(
        name="endTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The end time."""
    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed for task."""
    status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """The status."""

    @overload
    def __init__(
        self,
        *,
        task_id: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        duration: Optional[datetime.timedelta] = None,
        status: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class MabProtectionPolicy(ProtectionPolicy, discriminator="MAB"):
    """Mab container-specific backup policy.

    :ivar protected_items_count: Number of items associated with this policy.
    :vartype protected_items_count: int
    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    :ivar schedule_policy: Backup schedule of backup policy.
    :vartype schedule_policy: ~azure.mgmt.recoveryservicesbackup.models.SchedulePolicy
    :ivar retention_policy: Retention policy details.
    :vartype retention_policy: ~azure.mgmt.recoveryservicesbackup.models.RetentionPolicy
    :ivar backup_management_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is "MAB".
    :vartype backup_management_type: str
    """

    schedule_policy: Optional["_models.SchedulePolicy"] = rest_field(
        name="schedulePolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup schedule of backup policy."""
    retention_policy: Optional["_models.RetentionPolicy"] = rest_field(
        name="retentionPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention policy details."""
    backup_management_type: Literal["MAB"] = rest_discriminator(name="backupManagementType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"MAB\"."""

    @overload
    def __init__(
        self,
        *,
        protected_items_count: Optional[int] = None,
        resource_guard_operation_requests: Optional[list[str]] = None,
        schedule_policy: Optional["_models.SchedulePolicy"] = None,
        retention_policy: Optional["_models.RetentionPolicy"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.backup_management_type = "MAB"  # type: ignore


class MonthlyRetentionSchedule(_Model):
    """Monthly retention schedule.

    :ivar retention_schedule_format_type: Retention schedule format type for monthly retention
     policy. Known values are: "Invalid", "Daily", and "Weekly".
    :vartype retention_schedule_format_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RetentionScheduleFormat
    :ivar retention_schedule_daily: Daily retention format for monthly retention policy.
    :vartype retention_schedule_daily:
     ~azure.mgmt.recoveryservicesbackup.models.DailyRetentionFormat
    :ivar retention_schedule_weekly: Weekly retention format for monthly retention policy.
    :vartype retention_schedule_weekly:
     ~azure.mgmt.recoveryservicesbackup.models.WeeklyRetentionFormat
    :ivar retention_times: Retention times of retention policy.
    :vartype retention_times: list[~datetime.datetime]
    :ivar retention_duration: Retention duration of retention Policy.
    :vartype retention_duration: ~azure.mgmt.recoveryservicesbackup.models.RetentionDuration
    """

    retention_schedule_format_type: Optional[Union[str, "_models.RetentionScheduleFormat"]] = rest_field(
        name="retentionScheduleFormatType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention schedule format type for monthly retention policy. Known values are: \"Invalid\",
     \"Daily\", and \"Weekly\"."""
    retention_schedule_daily: Optional["_models.DailyRetentionFormat"] = rest_field(
        name="retentionScheduleDaily", visibility=["read", "create", "update", "delete", "query"]
    )
    """Daily retention format for monthly retention policy."""
    retention_schedule_weekly: Optional["_models.WeeklyRetentionFormat"] = rest_field(
        name="retentionScheduleWeekly", visibility=["read", "create", "update", "delete", "query"]
    )
    """Weekly retention format for monthly retention policy."""
    retention_times: Optional[list[datetime.datetime]] = rest_field(
        name="retentionTimes", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Retention times of retention policy."""
    retention_duration: Optional["_models.RetentionDuration"] = rest_field(
        name="retentionDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention duration of retention Policy."""

    @overload
    def __init__(
        self,
        *,
        retention_schedule_format_type: Optional[Union[str, "_models.RetentionScheduleFormat"]] = None,
        retention_schedule_daily: Optional["_models.DailyRetentionFormat"] = None,
        retention_schedule_weekly: Optional["_models.WeeklyRetentionFormat"] = None,
        retention_times: Optional[list[datetime.datetime]] = None,
        retention_duration: Optional["_models.RetentionDuration"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class MoveRPAcrossTiersRequest(_Model):
    """MoveRPAcrossTiersRequest.

    :ivar object_type: Gets the class type.
    :vartype object_type: str
    :ivar source_tier_type: Source tier from where RP needs to be moved. Known values are:
     "Invalid", "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype source_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar target_tier_type: Target tier where RP needs to be moved. Known values are: "Invalid",
     "InstantRP", "HardenedRP", and "ArchivedRP".
    :vartype target_tier_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    """

    object_type: Optional[str] = rest_field(
        name="objectType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets the class type."""
    source_tier_type: Optional[Union[str, "_models.RecoveryPointTierType"]] = rest_field(
        name="sourceTierType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source tier from where RP needs to be moved. Known values are: \"Invalid\", \"InstantRP\",
     \"HardenedRP\", and \"ArchivedRP\"."""
    target_tier_type: Optional[Union[str, "_models.RecoveryPointTierType"]] = rest_field(
        name="targetTierType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target tier where RP needs to be moved. Known values are: \"Invalid\", \"InstantRP\",
     \"HardenedRP\", and \"ArchivedRP\"."""

    @overload
    def __init__(
        self,
        *,
        object_type: Optional[str] = None,
        source_tier_type: Optional[Union[str, "_models.RecoveryPointTierType"]] = None,
        target_tier_type: Optional[Union[str, "_models.RecoveryPointTierType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class NameInfo(_Model):
    """The name of usage.

    :ivar value: Value of usage.
    :vartype value: str
    :ivar localized_value: Localized value of usage.
    :vartype localized_value: str
    """

    value: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Value of usage."""
    localized_value: Optional[str] = rest_field(
        name="localizedValue", visibility=["read", "create", "update", "delete", "query"]
    )
    """Localized value of usage."""

    @overload
    def __init__(
        self,
        *,
        value: Optional[str] = None,
        localized_value: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class OperationResultInfo(OperationResultInfoBase, discriminator="OperationResultInfo"):
    """Operation result info.

    :ivar job_list: List of jobs created by this operation.
    :vartype job_list: list[str]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is "OperationResultInfo".
    :vartype object_type: str
    """

    job_list: Optional[list[str]] = rest_field(
        name="jobList", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of jobs created by this operation."""
    object_type: Literal["OperationResultInfo"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"OperationResultInfo\"."""

    @overload
    def __init__(
        self,
        *,
        job_list: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "OperationResultInfo"  # type: ignore


class OperationWorkerResponse(_Model):
    """This is the base class for operation result responses.

    :ivar status_code: HTTP Status Code of the operation. Known values are: "Continue",
     "SwitchingProtocols", "OK", "Created", "Accepted", "NonAuthoritativeInformation", "NoContent",
     "ResetContent", "PartialContent", "MultipleChoices", "Ambiguous", "MovedPermanently", "Moved",
     "Found", "Redirect", "SeeOther", "RedirectMethod", "NotModified", "UseProxy", "Unused",
     "TemporaryRedirect", "RedirectKeepVerb", "BadRequest", "Unauthorized", "PaymentRequired",
     "Forbidden", "NotFound", "MethodNotAllowed", "NotAcceptable", "ProxyAuthenticationRequired",
     "RequestTimeout", "Conflict", "Gone", "LengthRequired", "PreconditionFailed",
     "RequestEntityTooLarge", "RequestUriTooLong", "UnsupportedMediaType",
     "RequestedRangeNotSatisfiable", "ExpectationFailed", "UpgradeRequired", "InternalServerError",
     "NotImplemented", "BadGateway", "ServiceUnavailable", "GatewayTimeout", and
     "HttpVersionNotSupported".
    :vartype status_code: str or ~azure.mgmt.recoveryservicesbackup.models.HttpStatusCode
    :ivar headers: HTTP headers associated with this operation.
    :vartype headers: dict[str, list[str]]
    """

    status_code: Optional[Union[str, "_models.HttpStatusCode"]] = rest_field(
        name="statusCode", visibility=["read", "create", "update", "delete", "query"]
    )
    """HTTP Status Code of the operation. Known values are: \"Continue\", \"SwitchingProtocols\",
     \"OK\", \"Created\", \"Accepted\", \"NonAuthoritativeInformation\", \"NoContent\",
     \"ResetContent\", \"PartialContent\", \"MultipleChoices\", \"Ambiguous\", \"MovedPermanently\",
     \"Moved\", \"Found\", \"Redirect\", \"SeeOther\", \"RedirectMethod\", \"NotModified\",
     \"UseProxy\", \"Unused\", \"TemporaryRedirect\", \"RedirectKeepVerb\", \"BadRequest\",
     \"Unauthorized\", \"PaymentRequired\", \"Forbidden\", \"NotFound\", \"MethodNotAllowed\",
     \"NotAcceptable\", \"ProxyAuthenticationRequired\", \"RequestTimeout\", \"Conflict\", \"Gone\",
     \"LengthRequired\", \"PreconditionFailed\", \"RequestEntityTooLarge\", \"RequestUriTooLong\",
     \"UnsupportedMediaType\", \"RequestedRangeNotSatisfiable\", \"ExpectationFailed\",
     \"UpgradeRequired\", \"InternalServerError\", \"NotImplemented\", \"BadGateway\",
     \"ServiceUnavailable\", \"GatewayTimeout\", and \"HttpVersionNotSupported\"."""
    headers: Optional[dict[str, list[str]]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """HTTP headers associated with this operation."""

    @overload
    def __init__(
        self,
        *,
        status_code: Optional[Union[str, "_models.HttpStatusCode"]] = None,
        headers: Optional[dict[str, list[str]]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class OperationResultInfoBaseResource(OperationWorkerResponse):
    """Base class for operation result info.

    :ivar status_code: HTTP Status Code of the operation. Known values are: "Continue",
     "SwitchingProtocols", "OK", "Created", "Accepted", "NonAuthoritativeInformation", "NoContent",
     "ResetContent", "PartialContent", "MultipleChoices", "Ambiguous", "MovedPermanently", "Moved",
     "Found", "Redirect", "SeeOther", "RedirectMethod", "NotModified", "UseProxy", "Unused",
     "TemporaryRedirect", "RedirectKeepVerb", "BadRequest", "Unauthorized", "PaymentRequired",
     "Forbidden", "NotFound", "MethodNotAllowed", "NotAcceptable", "ProxyAuthenticationRequired",
     "RequestTimeout", "Conflict", "Gone", "LengthRequired", "PreconditionFailed",
     "RequestEntityTooLarge", "RequestUriTooLong", "UnsupportedMediaType",
     "RequestedRangeNotSatisfiable", "ExpectationFailed", "UpgradeRequired", "InternalServerError",
     "NotImplemented", "BadGateway", "ServiceUnavailable", "GatewayTimeout", and
     "HttpVersionNotSupported".
    :vartype status_code: str or ~azure.mgmt.recoveryservicesbackup.models.HttpStatusCode
    :ivar headers: HTTP headers associated with this operation.
    :vartype headers: dict[str, list[str]]
    :ivar operation: OperationResultInfoBaseResource operation.
    :vartype operation: ~azure.mgmt.recoveryservicesbackup.models.OperationResultInfoBase
    """

    operation: Optional["_models.OperationResultInfoBase"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """OperationResultInfoBaseResource operation."""

    @overload
    def __init__(
        self,
        *,
        status_code: Optional[Union[str, "_models.HttpStatusCode"]] = None,
        headers: Optional[dict[str, list[str]]] = None,
        operation: Optional["_models.OperationResultInfoBase"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class OperationStatus(_Model):
    """Operation status.

    :ivar id: ID of the operation.
    :vartype id: str
    :ivar name: Name of the operation.
    :vartype name: str
    :ivar status: Operation status. Known values are: "Invalid", "InProgress", "Succeeded",
     "Failed", and "Canceled".
    :vartype status: str or ~azure.mgmt.recoveryservicesbackup.models.OperationStatusValues
    :ivar start_time: Operation start time. Format: ISO-8601.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: Operation end time. Format: ISO-8601.
    :vartype end_time: ~datetime.datetime
    :ivar error: Error information related to this operation.
    :vartype error: ~azure.mgmt.recoveryservicesbackup.models.OperationStatusError
    :ivar properties: Additional information associated with this operation.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.OperationStatusExtendedInfo
    """

    id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """ID of the operation."""
    name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Name of the operation."""
    status: Optional[Union[str, "_models.OperationStatusValues"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Operation status. Known values are: \"Invalid\", \"InProgress\", \"Succeeded\", \"Failed\", and
     \"Canceled\"."""
    start_time: Optional[datetime.datetime] = rest_field(
        name="startTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Operation start time. Format: ISO-8601."""
    end_time: Optional[datetime.datetime] = rest_field(
        name="endTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Operation end time. Format: ISO-8601."""
    error: Optional["_models.OperationStatusError"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Error information related to this operation."""
    properties: Optional["_models.OperationStatusExtendedInfo"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information associated with this operation."""

    @overload
    def __init__(
        self,
        *,
        id: Optional[str] = None,  # pylint: disable=redefined-builtin
        name: Optional[str] = None,
        status: Optional[Union[str, "_models.OperationStatusValues"]] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        error: Optional["_models.OperationStatusError"] = None,
        properties: Optional["_models.OperationStatusExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class OperationStatusError(_Model):
    """Error information associated with operation status call.

    :ivar code: Error code of the operation failure.
    :vartype code: str
    :ivar message: Error message displayed if the operation failure.
    :vartype message: str
    """

    code: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Error code of the operation failure."""
    message: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Error message displayed if the operation failure."""

    @overload
    def __init__(
        self,
        *,
        code: Optional[str] = None,
        message: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class OperationStatusExtendedInfo(_Model):
    """Base class for additional information of operation status.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    OperationStatusJobExtendedInfo, OperationStatusJobsExtendedInfo,
    OperationStatusProvisionILRExtendedInfo, OperationStatusValidateOperationExtendedInfo

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class OperationStatusJobExtendedInfo(OperationStatusExtendedInfo, discriminator="OperationStatusJobExtendedInfo"):
    """Operation status job extended info.

    :ivar job_id: ID of the job created for this protected item.
    :vartype job_id: str
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "OperationStatusJobExtendedInfo".
    :vartype object_type: str
    """

    job_id: Optional[str] = rest_field(name="jobId", visibility=["read", "create", "update", "delete", "query"])
    """ID of the job created for this protected item."""
    object_type: Literal["OperationStatusJobExtendedInfo"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"OperationStatusJobExtendedInfo\"."""

    @overload
    def __init__(
        self,
        *,
        job_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "OperationStatusJobExtendedInfo"  # type: ignore


class OperationStatusJobsExtendedInfo(OperationStatusExtendedInfo, discriminator="OperationStatusJobsExtendedInfo"):
    """Operation status extended info for list of jobs.

    :ivar job_ids: IDs of the jobs created for the protected item.
    :vartype job_ids: list[str]
    :ivar failed_jobs_error: Stores all the failed jobs along with the corresponding error codes.
    :vartype failed_jobs_error: dict[str, str]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "OperationStatusJobsExtendedInfo".
    :vartype object_type: str
    """

    job_ids: Optional[list[str]] = rest_field(name="jobIds", visibility=["read", "create", "update", "delete", "query"])
    """IDs of the jobs created for the protected item."""
    failed_jobs_error: Optional[dict[str, str]] = rest_field(
        name="failedJobsError", visibility=["read", "create", "update", "delete", "query"]
    )
    """Stores all the failed jobs along with the corresponding error codes."""
    object_type: Literal["OperationStatusJobsExtendedInfo"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"OperationStatusJobsExtendedInfo\"."""

    @overload
    def __init__(
        self,
        *,
        job_ids: Optional[list[str]] = None,
        failed_jobs_error: Optional[dict[str, str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "OperationStatusJobsExtendedInfo"  # type: ignore


class OperationStatusProvisionILRExtendedInfo(
    OperationStatusExtendedInfo, discriminator="OperationStatusProvisionILRExtendedInfo"
):
    """Operation status extended info for ILR provision action.

    :ivar recovery_target: Target details for file / folder restore.
    :vartype recovery_target: ~azure.mgmt.recoveryservicesbackup.models.InstantItemRecoveryTarget
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "OperationStatusProvisionILRExtendedInfo".
    :vartype object_type: str
    """

    recovery_target: Optional["_models.InstantItemRecoveryTarget"] = rest_field(
        name="recoveryTarget", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target details for file / folder restore."""
    object_type: Literal["OperationStatusProvisionILRExtendedInfo"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"OperationStatusProvisionILRExtendedInfo\"."""

    @overload
    def __init__(
        self,
        *,
        recovery_target: Optional["_models.InstantItemRecoveryTarget"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "OperationStatusProvisionILRExtendedInfo"  # type: ignore


class OperationStatusValidateOperationExtendedInfo(
    OperationStatusExtendedInfo, discriminator="OperationStatusValidateOperationExtendedInfo"
):  # pylint: disable=name-too-long
    """Operation status extended info for ValidateOperation action.

    :ivar validate_operation_response: Gets the validation operation response.
    :vartype validate_operation_response:
     ~azure.mgmt.recoveryservicesbackup.models.ValidateOperationResponse
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "OperationStatusValidateOperationExtendedInfo".
    :vartype object_type: str
    """

    validate_operation_response: Optional["_models.ValidateOperationResponse"] = rest_field(
        name="validateOperationResponse", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets the validation operation response."""
    object_type: Literal["OperationStatusValidateOperationExtendedInfo"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"OperationStatusValidateOperationExtendedInfo\"."""

    @overload
    def __init__(
        self,
        *,
        validate_operation_response: Optional["_models.ValidateOperationResponse"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "OperationStatusValidateOperationExtendedInfo"  # type: ignore


class PatchRecoveryPointInput(_Model):
    """Recovery Point Contract for Update Recovery Point API.

    :ivar recovery_point_properties: Properties of Recovery Point.
    :vartype recovery_point_properties:
     ~azure.mgmt.recoveryservicesbackup.models.PatchRecoveryPointPropertiesInput
    """

    recovery_point_properties: Optional["_models.PatchRecoveryPointPropertiesInput"] = rest_field(
        name="recoveryPointProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """Properties of Recovery Point."""

    @overload
    def __init__(
        self,
        *,
        recovery_point_properties: Optional["_models.PatchRecoveryPointPropertiesInput"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PatchRecoveryPointPropertiesInput(_Model):
    """Recovery Point Properties Contract for Update Recovery Point API.

    :ivar expiry_time: Expiry time of Recovery Point in UTC.
    :vartype expiry_time: ~datetime.datetime
    """

    expiry_time: Optional[datetime.datetime] = rest_field(
        name="expiryTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Expiry time of Recovery Point in UTC."""

    @overload
    def __init__(
        self,
        *,
        expiry_time: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PointInTimeRange(_Model):
    """Provides details for log ranges.

    :ivar start_time: Start time of the time range for log recovery.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: End time of the time range for log recovery.
    :vartype end_time: ~datetime.datetime
    """

    start_time: Optional[datetime.datetime] = rest_field(
        name="startTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Start time of the time range for log recovery."""
    end_time: Optional[datetime.datetime] = rest_field(
        name="endTime", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """End time of the time range for log recovery."""

    @overload
    def __init__(
        self,
        *,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PreBackupValidation(_Model):
    """Pre-backup validation for Azure VM Workload provider.

    :ivar status: Status of protectable item, i.e. InProgress,Succeeded,Failed. Known values are:
     "Invalid", "Success", and "Failed".
    :vartype status: str or ~azure.mgmt.recoveryservicesbackup.models.InquiryStatus
    :ivar code: Error code of protectable item.
    :vartype code: str
    :ivar message: Message corresponding to the error code for the protectable item.
    :vartype message: str
    """

    status: Optional[Union[str, "_models.InquiryStatus"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Status of protectable item, i.e. InProgress,Succeeded,Failed. Known values are: \"Invalid\",
     \"Success\", and \"Failed\"."""
    code: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Error code of protectable item."""
    message: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Message corresponding to the error code for the protectable item."""

    @overload
    def __init__(
        self,
        *,
        status: Optional[Union[str, "_models.InquiryStatus"]] = None,
        code: Optional[str] = None,
        message: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PrepareDataMoveRequest(_Model):
    """Prepare DataMove Request.

    :ivar target_resource_id: ARM Id of target vault. Required.
    :vartype target_resource_id: str
    :ivar target_region: Target Region. Required.
    :vartype target_region: str
    :ivar data_move_level: DataMove Level. Required. Known values are: "Invalid", "Vault", and
     "Container".
    :vartype data_move_level: str or ~azure.mgmt.recoveryservicesbackup.models.DataMoveLevel
    :ivar source_container_arm_ids: Source Container ArmIds This needs to be populated only if
     DataMoveLevel is set to container.
    :vartype source_container_arm_ids: list[str]
    :ivar ignore_moved: Ignore the artifacts which are already moved.
    :vartype ignore_moved: bool
    """

    target_resource_id: str = rest_field(
        name="targetResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ARM Id of target vault. Required."""
    target_region: str = rest_field(name="targetRegion", visibility=["read", "create", "update", "delete", "query"])
    """Target Region. Required."""
    data_move_level: Union[str, "_models.DataMoveLevel"] = rest_field(
        name="dataMoveLevel", visibility=["read", "create", "update", "delete", "query"]
    )
    """DataMove Level. Required. Known values are: \"Invalid\", \"Vault\", and \"Container\"."""
    source_container_arm_ids: Optional[list[str]] = rest_field(
        name="sourceContainerArmIds", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source Container ArmIds This needs to be populated only if DataMoveLevel is set to container."""
    ignore_moved: Optional[bool] = rest_field(
        name="ignoreMoved", visibility=["read", "create", "update", "delete", "query"]
    )
    """Ignore the artifacts which are already moved."""

    @overload
    def __init__(
        self,
        *,
        target_resource_id: str,
        target_region: str,
        data_move_level: Union[str, "_models.DataMoveLevel"],
        source_container_arm_ids: Optional[list[str]] = None,
        ignore_moved: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class VaultStorageConfigOperationResultResponse(_Model):  # pylint: disable=name-too-long
    """Operation result response for Vault Storage Config.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    PrepareDataMoveResponse

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PrepareDataMoveResponse(VaultStorageConfigOperationResultResponse, discriminator="PrepareDataMoveResponse"):
    """Prepare DataMove Response.

    :ivar correlation_id: Co-relationId for move operation.
    :vartype correlation_id: str
    :ivar source_vault_properties: Source Vault Properties.
    :vartype source_vault_properties: dict[str, str]
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is "PrepareDataMoveResponse".
    :vartype object_type: str
    """

    correlation_id: Optional[str] = rest_field(
        name="correlationId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Co-relationId for move operation."""
    source_vault_properties: Optional[dict[str, str]] = rest_field(
        name="sourceVaultProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source Vault Properties."""
    object_type: Literal["PrepareDataMoveResponse"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"PrepareDataMoveResponse\"."""

    @overload
    def __init__(
        self,
        *,
        correlation_id: Optional[str] = None,
        source_vault_properties: Optional[dict[str, str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "PrepareDataMoveResponse"  # type: ignore


class PreValidateEnableBackupRequest(_Model):
    """Contract to validate if backup can be enabled on the given resource in a given vault and given
    configuration.
    It will validate followings

    1. Vault capacity
    2. VM is already protected
    3. Any VM related configuration passed in properties.

    :ivar resource_type: ProtectedItem Type- VM, SqlDataBase, AzureFileShare etc. Known values are:
     "Invalid", "VM", "FileFolder", "AzureSqlDb", "SQLDB", "Exchange", "Sharepoint", "VMwareVM",
     "SystemState", "Client", "GenericDataSource", "SQLDataBase", "AzureFileShare",
     "SAPHanaDatabase", "SAPAseDatabase", and "SAPHanaDBInstance".
    :vartype resource_type: str or ~azure.mgmt.recoveryservicesbackup.models.DataSourceType
    :ivar resource_id: ARM Virtual Machine Id.
    :vartype resource_id: str
    :ivar vault_id: ARM id of the Recovery Services Vault.
    :vartype vault_id: str
    :ivar properties: Configuration of VM if any needs to be validated like OS type etc.
    :vartype properties: str
    """

    resource_type: Optional[Union[str, "_models.DataSourceType"]] = rest_field(
        name="resourceType", visibility=["read", "create", "update", "delete", "query"]
    )
    """ProtectedItem Type- VM, SqlDataBase, AzureFileShare etc. Known values are: \"Invalid\", \"VM\",
     \"FileFolder\", \"AzureSqlDb\", \"SQLDB\", \"Exchange\", \"Sharepoint\", \"VMwareVM\",
     \"SystemState\", \"Client\", \"GenericDataSource\", \"SQLDataBase\", \"AzureFileShare\",
     \"SAPHanaDatabase\", \"SAPAseDatabase\", and \"SAPHanaDBInstance\"."""
    resource_id: Optional[str] = rest_field(
        name="resourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ARM Virtual Machine Id."""
    vault_id: Optional[str] = rest_field(name="vaultId", visibility=["read", "create", "update", "delete", "query"])
    """ARM id of the Recovery Services Vault."""
    properties: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Configuration of VM if any needs to be validated like OS type etc."""

    @overload
    def __init__(
        self,
        *,
        resource_type: Optional[Union[str, "_models.DataSourceType"]] = None,
        resource_id: Optional[str] = None,
        vault_id: Optional[str] = None,
        properties: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PreValidateEnableBackupResponse(_Model):
    """Response contract for enable backup validation request.

    :ivar status: Validation Status. Known values are: "Invalid", "Succeeded", and "Failed".
    :vartype status: str or ~azure.mgmt.recoveryservicesbackup.models.ValidationStatus
    :ivar error_code: Response error code.
    :vartype error_code: str
    :ivar error_message: Response error message.
    :vartype error_message: str
    :ivar recommendation: Recommended action for user.
    :vartype recommendation: str
    :ivar container_name: Specifies the product specific container name. E.g.
     iaasvmcontainer;iaasvmcontainer;rgname;vmname. This is required for portal.
    :vartype container_name: str
    :ivar protected_item_name: Specifies the product specific ds name. E.g.
     vm;iaasvmcontainer;rgname;vmname. This is required for portal.
    :vartype protected_item_name: str
    """

    status: Optional[Union[str, "_models.ValidationStatus"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Validation Status. Known values are: \"Invalid\", \"Succeeded\", and \"Failed\"."""
    error_code: Optional[str] = rest_field(name="errorCode", visibility=["read", "create", "update", "delete", "query"])
    """Response error code."""
    error_message: Optional[str] = rest_field(
        name="errorMessage", visibility=["read", "create", "update", "delete", "query"]
    )
    """Response error message."""
    recommendation: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Recommended action for user."""
    container_name: Optional[str] = rest_field(
        name="containerName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies the product specific container name. E.g.
     iaasvmcontainer;iaasvmcontainer;rgname;vmname. This is required for portal."""
    protected_item_name: Optional[str] = rest_field(
        name="protectedItemName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Specifies the product specific ds name. E.g. vm;iaasvmcontainer;rgname;vmname. This is required
     for portal."""

    @overload
    def __init__(
        self,
        *,
        status: Optional[Union[str, "_models.ValidationStatus"]] = None,
        error_code: Optional[str] = None,
        error_message: Optional[str] = None,
        recommendation: Optional[str] = None,
        container_name: Optional[str] = None,
        protected_item_name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PrivateEndpoint(_Model):
    """The Private Endpoint network resource that is linked to the Private Endpoint connection.

    :ivar id: Gets or sets id.
    :vartype id: str
    """

    id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Gets or sets id."""

    @overload
    def __init__(
        self,
        *,
        id: Optional[str] = None,  # pylint: disable=redefined-builtin
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PrivateEndpointConnection(_Model):
    """Private Endpoint Connection Response Properties.

    :ivar provisioning_state: Gets or sets provisioning state of the private endpoint connection.
     Known values are: "Succeeded", "Deleting", "Failed", and "Pending".
    :vartype provisioning_state: str or ~azure.mgmt.recoveryservicesbackup.models.ProvisioningState
    :ivar private_endpoint: Gets or sets private endpoint associated with the private endpoint
     connection.
    :vartype private_endpoint: ~azure.mgmt.recoveryservicesbackup.models.PrivateEndpoint
    :ivar group_ids: Group Ids for the Private Endpoint.
    :vartype group_ids: list[str or ~azure.mgmt.recoveryservicesbackup.models.VaultSubResourceType]
    :ivar private_link_service_connection_state: Gets or sets private link service connection
     state.
    :vartype private_link_service_connection_state:
     ~azure.mgmt.recoveryservicesbackup.models.PrivateLinkServiceConnectionState
    """

    provisioning_state: Optional[Union[str, "_models.ProvisioningState"]] = rest_field(
        name="provisioningState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets provisioning state of the private endpoint connection. Known values are:
     \"Succeeded\", \"Deleting\", \"Failed\", and \"Pending\"."""
    private_endpoint: Optional["_models.PrivateEndpoint"] = rest_field(
        name="privateEndpoint", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets private endpoint associated with the private endpoint connection."""
    group_ids: Optional[list[Union[str, "_models.VaultSubResourceType"]]] = rest_field(
        name="groupIds", visibility=["read", "create", "update", "delete", "query"]
    )
    """Group Ids for the Private Endpoint."""
    private_link_service_connection_state: Optional["_models.PrivateLinkServiceConnectionState"] = rest_field(
        name="privateLinkServiceConnectionState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets private link service connection state."""

    @overload
    def __init__(
        self,
        *,
        provisioning_state: Optional[Union[str, "_models.ProvisioningState"]] = None,
        private_endpoint: Optional["_models.PrivateEndpoint"] = None,
        group_ids: Optional[list[Union[str, "_models.VaultSubResourceType"]]] = None,
        private_link_service_connection_state: Optional["_models.PrivateLinkServiceConnectionState"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PrivateEndpointConnectionResource(ProxyResource):
    """Private Endpoint Connection Response Properties.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: PrivateEndpointConnectionResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.PrivateEndpointConnection
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.PrivateEndpointConnection"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """PrivateEndpointConnectionResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.PrivateEndpointConnection"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class PrivateLinkServiceConnectionState(_Model):
    """Private Link Service Connection State.

    :ivar status: Gets or sets the status. Known values are: "Pending", "Approved", "Rejected", and
     "Disconnected".
    :vartype status: str or
     ~azure.mgmt.recoveryservicesbackup.models.PrivateEndpointConnectionStatus
    :ivar description: Gets or sets description.
    :vartype description: str
    :ivar actions_required: Gets or sets actions required.
    :vartype actions_required: str
    """

    status: Optional[Union[str, "_models.PrivateEndpointConnectionStatus"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets the status. Known values are: \"Pending\", \"Approved\", \"Rejected\", and
     \"Disconnected\"."""
    description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Gets or sets description."""
    actions_required: Optional[str] = rest_field(
        name="actionsRequired", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets actions required."""

    @overload
    def __init__(
        self,
        *,
        status: Optional[Union[str, "_models.PrivateEndpointConnectionStatus"]] = None,
        description: Optional[str] = None,
        actions_required: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ProtectableContainerResource(Resource):
    """Protectable Container Class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar location: Resource location.
    :vartype location: str
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    :ivar properties: ProtectableContainerResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ProtectableContainer
    """

    location: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource location."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""
    properties: Optional["_models.ProtectableContainer"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """ProtectableContainerResource properties."""

    @overload
    def __init__(
        self,
        *,
        location: Optional[str] = None,
        tags: Optional[dict[str, str]] = None,
        e_tag: Optional[str] = None,
        properties: Optional["_models.ProtectableContainer"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ProtectedItemResource(ProxyResource):
    """Base class for backup items.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: ProtectedItemResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ProtectedItem
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.ProtectedItem"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """ProtectedItemResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.ProtectedItem"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ProtectionContainerResource(ProxyResource):
    """Base class for container with backup items. Containers with specific workloads are derived from
    this class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: ProtectionContainerResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ProtectionContainer
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.ProtectionContainer"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """ProtectionContainerResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.ProtectionContainer"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ProtectionIntentResource(ProxyResource):
    """Base class for backup ProtectionIntent.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: ProtectionIntentResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ProtectionIntent
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.ProtectionIntent"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """ProtectionIntentResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.ProtectionIntent"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ProtectionPolicyResource(ProxyResource):
    """Base class for backup policy. Workload-specific backup policies are derived from this class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: ProtectionPolicyResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ProtectionPolicy
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.ProtectionPolicy"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """ProtectionPolicyResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.ProtectionPolicy"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RecoveryPointDiskConfiguration(_Model):
    """Disk configuration.

    :ivar number_of_disks_included_in_backup: Number of disks included in backup.
    :vartype number_of_disks_included_in_backup: int
    :ivar number_of_disks_attached_to_vm: Number of disks attached to the VM.
    :vartype number_of_disks_attached_to_vm: int
    :ivar included_disk_list: Information of disks included in backup.
    :vartype included_disk_list: list[~azure.mgmt.recoveryservicesbackup.models.DiskInformation]
    :ivar excluded_disk_list: Information of disks excluded from backup.
    :vartype excluded_disk_list: list[~azure.mgmt.recoveryservicesbackup.models.DiskInformation]
    """

    number_of_disks_included_in_backup: Optional[int] = rest_field(
        name="numberOfDisksIncludedInBackup", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of disks included in backup."""
    number_of_disks_attached_to_vm: Optional[int] = rest_field(
        name="numberOfDisksAttachedToVm", visibility=["read", "create", "update", "delete", "query"]
    )
    """Number of disks attached to the VM."""
    included_disk_list: Optional[list["_models.DiskInformation"]] = rest_field(
        name="includedDiskList", visibility=["read", "create", "update", "delete", "query"]
    )
    """Information of disks included in backup."""
    excluded_disk_list: Optional[list["_models.DiskInformation"]] = rest_field(
        name="excludedDiskList", visibility=["read", "create", "update", "delete", "query"]
    )
    """Information of disks excluded from backup."""

    @overload
    def __init__(
        self,
        *,
        number_of_disks_included_in_backup: Optional[int] = None,
        number_of_disks_attached_to_vm: Optional[int] = None,
        included_disk_list: Optional[list["_models.DiskInformation"]] = None,
        excluded_disk_list: Optional[list["_models.DiskInformation"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RecoveryPointMoveReadinessInfo(_Model):
    """RecoveryPointMoveReadinessInfo.

    :ivar is_ready_for_move:
    :vartype is_ready_for_move: bool
    :ivar additional_info:
    :vartype additional_info: str
    """

    is_ready_for_move: Optional[bool] = rest_field(
        name="isReadyForMove", visibility=["read", "create", "update", "delete", "query"]
    )
    additional_info: Optional[str] = rest_field(
        name="additionalInfo", visibility=["read", "create", "update", "delete", "query"]
    )

    @overload
    def __init__(
        self,
        *,
        is_ready_for_move: Optional[bool] = None,
        additional_info: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RecoveryPointProperties(_Model):
    """Properties of Recovery Point.

    :ivar expiry_time: Expiry time of Recovery Point in UTC.
    :vartype expiry_time: str
    :ivar rule_name: Rule name tagged on Recovery Point that governs life cycle.
    :vartype rule_name: str
    :ivar is_soft_deleted: Bool to indicate whether RP is in soft delete state or not.
    :vartype is_soft_deleted: bool
    """

    expiry_time: Optional[str] = rest_field(
        name="expiryTime", visibility=["read", "create", "update", "delete", "query"]
    )
    """Expiry time of Recovery Point in UTC."""
    rule_name: Optional[str] = rest_field(name="ruleName", visibility=["read", "create", "update", "delete", "query"])
    """Rule name tagged on Recovery Point that governs life cycle."""
    is_soft_deleted: Optional[bool] = rest_field(
        name="isSoftDeleted", visibility=["read", "create", "update", "delete", "query"]
    )
    """Bool to indicate whether RP is in soft delete state or not."""

    @overload
    def __init__(
        self,
        *,
        expiry_time: Optional[str] = None,
        rule_name: Optional[str] = None,
        is_soft_deleted: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RecoveryPointRehydrationInfo(_Model):
    """RP Rehydration Info.

    :ivar rehydration_retention_duration: How long the rehydrated RP should be kept Should be
     ISO8601 Duration format e.g. "P7D".
    :vartype rehydration_retention_duration: str
    :ivar rehydration_priority: Rehydration Priority. Known values are: "Standard" and "High".
    :vartype rehydration_priority: str or
     ~azure.mgmt.recoveryservicesbackup.models.RehydrationPriority
    """

    rehydration_retention_duration: Optional[str] = rest_field(
        name="rehydrationRetentionDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """How long the rehydrated RP should be kept Should be ISO8601 Duration format e.g. \"P7D\"."""
    rehydration_priority: Optional[Union[str, "_models.RehydrationPriority"]] = rest_field(
        name="rehydrationPriority", visibility=["read", "create", "update", "delete", "query"]
    )
    """Rehydration Priority. Known values are: \"Standard\" and \"High\"."""

    @overload
    def __init__(
        self,
        *,
        rehydration_retention_duration: Optional[str] = None,
        rehydration_priority: Optional[Union[str, "_models.RehydrationPriority"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RecoveryPointResource(ProxyResource):
    """Base class for backup copies. Workload-specific backup copies are derived from this class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: RecoveryPointResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.RecoveryPoint
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.RecoveryPoint"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """RecoveryPointResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.RecoveryPoint"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RecoveryPointTierInformation(_Model):
    """Recovery point tier information.

    :ivar type: Recovery point tier type. Known values are: "Invalid", "InstantRP", "HardenedRP",
     and "ArchivedRP".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar status: Recovery point tier status. Known values are: "Invalid", "Valid", "Disabled",
     "Deleted", and "Rehydrated".
    :vartype status: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierStatus
    :ivar extended_info: Recovery point tier status.
    :vartype extended_info: dict[str, str]
    """

    type: Optional[Union[str, "_models.RecoveryPointTierType"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Recovery point tier type. Known values are: \"Invalid\", \"InstantRP\", \"HardenedRP\", and
     \"ArchivedRP\"."""
    status: Optional[Union[str, "_models.RecoveryPointTierStatus"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Recovery point tier status. Known values are: \"Invalid\", \"Valid\", \"Disabled\",
     \"Deleted\", and \"Rehydrated\"."""
    extended_info: Optional[dict[str, str]] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Recovery point tier status."""

    @overload
    def __init__(
        self,
        *,
        type: Optional[Union[str, "_models.RecoveryPointTierType"]] = None,
        status: Optional[Union[str, "_models.RecoveryPointTierStatus"]] = None,
        extended_info: Optional[dict[str, str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RecoveryPointTierInformationV2(RecoveryPointTierInformation):
    """RecoveryPoint Tier Information V2.

    :ivar extended_info: Recovery point tier status.
    :vartype extended_info: dict[str, str]
    :ivar type: Recovery point tier type. Known values are: "Invalid", "InstantRP", "HardenedRP",
     and "ArchivedRP".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierType
    :ivar status: Recovery point tier status. Known values are: "Invalid", "Valid", "Disabled",
     "Deleted", and "Rehydrated".
    :vartype status: str or ~azure.mgmt.recoveryservicesbackup.models.RecoveryPointTierStatus
    """

    @overload
    def __init__(
        self,
        *,
        extended_info: Optional[dict[str, str]] = None,
        type: Optional[Union[str, "_models.RecoveryPointTierType"]] = None,
        status: Optional[Union[str, "_models.RecoveryPointTierStatus"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ResourceGuardOperationDetail(_Model):
    """ResourceGuardOperationDetail.

    :ivar vault_critical_operation:
    :vartype vault_critical_operation: str
    :ivar default_resource_request:
    :vartype default_resource_request: str
    """

    vault_critical_operation: Optional[str] = rest_field(
        name="vaultCriticalOperation", visibility=["read", "create", "update", "delete", "query"]
    )
    default_resource_request: Optional[str] = rest_field(
        name="defaultResourceRequest", visibility=["read", "create", "update", "delete", "query"]
    )

    @overload
    def __init__(
        self,
        *,
        vault_critical_operation: Optional[str] = None,
        default_resource_request: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ResourceGuardProxyBase(_Model):
    """ResourceGuardProxyBase.

    :ivar resource_guard_resource_id: Required.
    :vartype resource_guard_resource_id: str
    :ivar resource_guard_operation_details:
    :vartype resource_guard_operation_details:
     list[~azure.mgmt.recoveryservicesbackup.models.ResourceGuardOperationDetail]
    :ivar last_updated_time:
    :vartype last_updated_time: str
    :ivar description:
    :vartype description: str
    """

    resource_guard_resource_id: str = rest_field(
        name="resourceGuardResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Required."""
    resource_guard_operation_details: Optional[list["_models.ResourceGuardOperationDetail"]] = rest_field(
        name="resourceGuardOperationDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    last_updated_time: Optional[str] = rest_field(
        name="lastUpdatedTime", visibility=["read", "create", "update", "delete", "query"]
    )
    description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])

    @overload
    def __init__(
        self,
        *,
        resource_guard_resource_id: str,
        resource_guard_operation_details: Optional[list["_models.ResourceGuardOperationDetail"]] = None,
        last_updated_time: Optional[str] = None,
        description: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ResourceGuardProxyBaseResource(ProxyResource):
    """ResourceGuardProxyBaseResource.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar properties: ResourceGuardProxyBaseResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ResourceGuardProxyBase
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar location: The geo-location where the resource lives.
    :vartype location: str
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    """

    properties: Optional["_models.ResourceGuardProxyBase"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """ResourceGuardProxyBaseResource properties."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    location: Optional[str] = rest_field(visibility=["read", "create"])
    """The geo-location where the resource lives."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.ResourceGuardProxyBase"] = None,
        tags: Optional[dict[str, str]] = None,
        location: Optional[str] = None,
        e_tag: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ResourceList(_Model):
    """Base for all lists of resources.

    :ivar next_link: The URI to fetch the next page of resources, with each API call returning up
     to 200 resources per page. Use ListNext() to fetch the next page if the total number of
     resources exceeds 200.
    :vartype next_link: str
    """

    next_link: Optional[str] = rest_field(name="nextLink", visibility=["read", "create", "update", "delete", "query"])
    """The URI to fetch the next page of resources, with each API call returning up to 200 resources
     per page. Use ListNext() to fetch the next page if the total number of resources exceeds 200."""

    @overload
    def __init__(
        self,
        *,
        next_link: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RestoreFileSpecs(_Model):
    """Restore file specs like file path, type and target folder path info.

    :ivar path: Source File/Folder path.
    :vartype path: str
    :ivar file_spec_type: Indicates what the Path variable stands for.
    :vartype file_spec_type: str
    :ivar target_folder_path: Destination folder path in target FileShare.
    :vartype target_folder_path: str
    """

    path: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Source File/Folder path."""
    file_spec_type: Optional[str] = rest_field(
        name="fileSpecType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Indicates what the Path variable stands for."""
    target_folder_path: Optional[str] = rest_field(
        name="targetFolderPath", visibility=["read", "create", "update", "delete", "query"]
    )
    """Destination folder path in target FileShare."""

    @overload
    def __init__(
        self,
        *,
        path: Optional[str] = None,
        file_spec_type: Optional[str] = None,
        target_folder_path: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RestoreRequestResource(Resource):
    """Base class for restore request. Workload-specific restore requests are derived from this class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar location: Resource location.
    :vartype location: str
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    :ivar properties: RestoreRequestResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.RestoreRequest
    """

    location: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource location."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""
    properties: Optional["_models.RestoreRequest"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """RestoreRequestResource properties."""

    @overload
    def __init__(
        self,
        *,
        location: Optional[str] = None,
        tags: Optional[dict[str, str]] = None,
        e_tag: Optional[str] = None,
        properties: Optional["_models.RestoreRequest"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class RetentionDuration(_Model):
    """Retention duration.

    :ivar count: Count of duration types. Retention duration is obtained by the counting the
     duration type Count times. For example, when Count = 3 and DurationType = Weeks, retention
     duration will be three weeks.
    :vartype count: int
    :ivar duration_type: Retention duration type of retention policy. Known values are: "Invalid",
     "Days", "Weeks", "Months", and "Years".
    :vartype duration_type: str or ~azure.mgmt.recoveryservicesbackup.models.RetentionDurationType
    """

    count: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Count of duration types. Retention duration is obtained by the counting the duration type Count
     times. For example, when Count = 3 and DurationType = Weeks, retention duration will be three
     weeks."""
    duration_type: Optional[Union[str, "_models.RetentionDurationType"]] = rest_field(
        name="durationType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention duration type of retention policy. Known values are: \"Invalid\", \"Days\",
     \"Weeks\", \"Months\", and \"Years\"."""

    @overload
    def __init__(
        self,
        *,
        count: Optional[int] = None,
        duration_type: Optional[Union[str, "_models.RetentionDurationType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SecuredVMDetails(_Model):
    """Restore request parameters for Secured VMs.

    :ivar secured_vmos_disk_encryption_set_id: Gets or Sets Disk Encryption Set Id for Secured VM
     OS Disk.
    :vartype secured_vmos_disk_encryption_set_id: str
    """

    secured_vmos_disk_encryption_set_id: Optional[str] = rest_field(
        name="securedVMOsDiskEncryptionSetId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or Sets Disk Encryption Set Id for Secured VM OS Disk."""

    @overload
    def __init__(
        self,
        *,
        secured_vmos_disk_encryption_set_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SecurityPinBase(_Model):
    """Base class for get security pin request body.

    :ivar resource_guard_operation_requests: ResourceGuard Operation Requests.
    :vartype resource_guard_operation_requests: list[str]
    """

    resource_guard_operation_requests: Optional[list[str]] = rest_field(
        name="resourceGuardOperationRequests", visibility=["read", "create", "update", "delete", "query"]
    )
    """ResourceGuard Operation Requests."""

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class Settings(_Model):
    """Common settings field for backup management.

    :ivar time_zone: TimeZone optional input as string. For example: TimeZone = "Pacific Standard
     Time".
    :vartype time_zone: str
    :ivar issqlcompression: SQL compression flag.
    :vartype issqlcompression: bool
    :ivar is_compression: Workload compression flag. This has been added so that 'isSqlCompression'
     will be deprecated once clients upgrade to consider this flag.
    :vartype is_compression: bool
    """

    time_zone: Optional[str] = rest_field(name="timeZone", visibility=["read", "create", "update", "delete", "query"])
    """TimeZone optional input as string. For example: TimeZone = \"Pacific Standard Time\"."""
    issqlcompression: Optional[bool] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """SQL compression flag."""
    is_compression: Optional[bool] = rest_field(
        name="isCompression", visibility=["read", "create", "update", "delete", "query"]
    )
    """Workload compression flag. This has been added so that 'isSqlCompression' will be deprecated
     once clients upgrade to consider this flag."""

    @overload
    def __init__(
        self,
        *,
        time_zone: Optional[str] = None,
        issqlcompression: Optional[bool] = None,
        is_compression: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SimpleRetentionPolicy(RetentionPolicy, discriminator="SimpleRetentionPolicy"):
    """Simple policy retention.

    :ivar retention_duration: Retention duration of the protection policy.
    :vartype retention_duration: ~azure.mgmt.recoveryservicesbackup.models.RetentionDuration
    :ivar retention_policy_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "SimpleRetentionPolicy".
    :vartype retention_policy_type: str
    """

    retention_duration: Optional["_models.RetentionDuration"] = rest_field(
        name="retentionDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention duration of the protection policy."""
    retention_policy_type: Literal["SimpleRetentionPolicy"] = rest_discriminator(name="retentionPolicyType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"SimpleRetentionPolicy\"."""

    @overload
    def __init__(
        self,
        *,
        retention_duration: Optional["_models.RetentionDuration"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.retention_policy_type = "SimpleRetentionPolicy"  # type: ignore


class SimpleSchedulePolicy(SchedulePolicy, discriminator="SimpleSchedulePolicy"):
    """Simple policy schedule.

    :ivar schedule_run_frequency: Frequency of the schedule operation of this policy. Known values
     are: "Invalid", "Daily", "Weekly", and "Hourly".
    :vartype schedule_run_frequency: str or
     ~azure.mgmt.recoveryservicesbackup.models.ScheduleRunType
    :ivar schedule_run_days: List of days of week this schedule has to be run.
    :vartype schedule_run_days: list[str or ~azure.mgmt.recoveryservicesbackup.models.DayOfWeek]
    :ivar schedule_run_times: List of times of day this schedule has to be run.
    :vartype schedule_run_times: list[~datetime.datetime]
    :ivar hourly_schedule: Hourly Schedule of this Policy.
    :vartype hourly_schedule: ~azure.mgmt.recoveryservicesbackup.models.HourlySchedule
    :ivar schedule_weekly_frequency: At every number weeks this schedule has to be run.
    :vartype schedule_weekly_frequency: int
    :ivar schedule_policy_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "SimpleSchedulePolicy".
    :vartype schedule_policy_type: str
    """

    schedule_run_frequency: Optional[Union[str, "_models.ScheduleRunType"]] = rest_field(
        name="scheduleRunFrequency", visibility=["read", "create", "update", "delete", "query"]
    )
    """Frequency of the schedule operation of this policy. Known values are: \"Invalid\", \"Daily\",
     \"Weekly\", and \"Hourly\"."""
    schedule_run_days: Optional[list[Union[str, "_models.DayOfWeek"]]] = rest_field(
        name="scheduleRunDays", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of days of week this schedule has to be run."""
    schedule_run_times: Optional[list[datetime.datetime]] = rest_field(
        name="scheduleRunTimes", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """List of times of day this schedule has to be run."""
    hourly_schedule: Optional["_models.HourlySchedule"] = rest_field(
        name="hourlySchedule", visibility=["read", "create", "update", "delete", "query"]
    )
    """Hourly Schedule of this Policy."""
    schedule_weekly_frequency: Optional[int] = rest_field(
        name="scheduleWeeklyFrequency", visibility=["read", "create", "update", "delete", "query"]
    )
    """At every number weeks this schedule has to be run."""
    schedule_policy_type: Literal["SimpleSchedulePolicy"] = rest_discriminator(name="schedulePolicyType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"SimpleSchedulePolicy\"."""

    @overload
    def __init__(
        self,
        *,
        schedule_run_frequency: Optional[Union[str, "_models.ScheduleRunType"]] = None,
        schedule_run_days: Optional[list[Union[str, "_models.DayOfWeek"]]] = None,
        schedule_run_times: Optional[list[datetime.datetime]] = None,
        hourly_schedule: Optional["_models.HourlySchedule"] = None,
        schedule_weekly_frequency: Optional[int] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.schedule_policy_type = "SimpleSchedulePolicy"  # type: ignore


class SimpleSchedulePolicyV2(SchedulePolicy, discriminator="SimpleSchedulePolicyV2"):
    """The V2 policy schedule for IaaS that supports hourly backups.

    :ivar schedule_run_frequency: Frequency of the schedule operation of this policy. Known values
     are: "Invalid", "Daily", "Weekly", and "Hourly".
    :vartype schedule_run_frequency: str or
     ~azure.mgmt.recoveryservicesbackup.models.ScheduleRunType
    :ivar hourly_schedule: hourly schedule of this policy.
    :vartype hourly_schedule: ~azure.mgmt.recoveryservicesbackup.models.HourlySchedule
    :ivar daily_schedule: Daily schedule of this policy.
    :vartype daily_schedule: ~azure.mgmt.recoveryservicesbackup.models.DailySchedule
    :ivar weekly_schedule: Weekly schedule of this policy.
    :vartype weekly_schedule: ~azure.mgmt.recoveryservicesbackup.models.WeeklySchedule
    :ivar schedule_policy_type: This property will be used as the discriminator for deciding the
     specific types in the polymorphic chain of types. Required. Default value is
     "SimpleSchedulePolicyV2".
    :vartype schedule_policy_type: str
    """

    schedule_run_frequency: Optional[Union[str, "_models.ScheduleRunType"]] = rest_field(
        name="scheduleRunFrequency", visibility=["read", "create", "update", "delete", "query"]
    )
    """Frequency of the schedule operation of this policy. Known values are: \"Invalid\", \"Daily\",
     \"Weekly\", and \"Hourly\"."""
    hourly_schedule: Optional["_models.HourlySchedule"] = rest_field(
        name="hourlySchedule", visibility=["read", "create", "update", "delete", "query"]
    )
    """hourly schedule of this policy."""
    daily_schedule: Optional["_models.DailySchedule"] = rest_field(
        name="dailySchedule", visibility=["read", "create", "update", "delete", "query"]
    )
    """Daily schedule of this policy."""
    weekly_schedule: Optional["_models.WeeklySchedule"] = rest_field(
        name="weeklySchedule", visibility=["read", "create", "update", "delete", "query"]
    )
    """Weekly schedule of this policy."""
    schedule_policy_type: Literal["SimpleSchedulePolicyV2"] = rest_discriminator(name="schedulePolicyType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"SimpleSchedulePolicyV2\"."""

    @overload
    def __init__(
        self,
        *,
        schedule_run_frequency: Optional[Union[str, "_models.ScheduleRunType"]] = None,
        hourly_schedule: Optional["_models.HourlySchedule"] = None,
        daily_schedule: Optional["_models.DailySchedule"] = None,
        weekly_schedule: Optional["_models.WeeklySchedule"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.schedule_policy_type = "SimpleSchedulePolicyV2"  # type: ignore


class SnapshotBackupAdditionalDetails(_Model):
    """Snapshot Backup related fields for WorkloadType SaPHanaSystem.

    :ivar instant_rp_retention_range_in_days:
    :vartype instant_rp_retention_range_in_days: int
    :ivar instant_rp_details:
    :vartype instant_rp_details: str
    :ivar user_assigned_managed_identity_details: User assigned managed identity details.
    :vartype user_assigned_managed_identity_details:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedManagedIdentityDetails
    """

    instant_rp_retention_range_in_days: Optional[int] = rest_field(
        name="instantRpRetentionRangeInDays", visibility=["read", "create", "update", "delete", "query"]
    )
    instant_rp_details: Optional[str] = rest_field(
        name="instantRPDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = rest_field(
        name="userAssignedManagedIdentityDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """User assigned managed identity details."""

    @overload
    def __init__(
        self,
        *,
        instant_rp_retention_range_in_days: Optional[int] = None,
        instant_rp_details: Optional[str] = None,
        user_assigned_managed_identity_details: Optional["_models.UserAssignedManagedIdentityDetails"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SnapshotRestoreParameters(_Model):
    """Encapsulates information regarding snapshot recovery for SAP Hana.

    :ivar skip_attach_and_mount:
    :vartype skip_attach_and_mount: bool
    :ivar log_point_in_time_for_db_recovery:
    :vartype log_point_in_time_for_db_recovery: str
    """

    skip_attach_and_mount: Optional[bool] = rest_field(
        name="skipAttachAndMount", visibility=["read", "create", "update", "delete", "query"]
    )
    log_point_in_time_for_db_recovery: Optional[str] = rest_field(
        name="logPointInTimeForDBRecovery", visibility=["read", "create", "update", "delete", "query"]
    )

    @overload
    def __init__(
        self,
        *,
        skip_attach_and_mount: Optional[bool] = None,
        log_point_in_time_for_db_recovery: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SourceSideScanInfo(_Model):
    """Source side threat information.

    :ivar source_side_scan_status: Threat status of the container. Known values are: "Configured",
     "NotConfigured", and "NotApplicable".
    :vartype source_side_scan_status: str or
     ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanStatus
    :ivar source_side_scan_summary: Threat summary for the container. Known values are: "Unknown",
     "NotApplicable", "Suspicious", and "Healthy".
    :vartype source_side_scan_summary: str or
     ~azure.mgmt.recoveryservicesbackup.models.SourceSideScanSummary
    """

    source_side_scan_status: Optional[Union[str, "_models.SourceSideScanStatus"]] = rest_field(
        name="sourceSideScanStatus", visibility=["read", "create", "update", "delete", "query"]
    )
    """Threat status of the container. Known values are: \"Configured\", \"NotConfigured\", and
     \"NotApplicable\"."""
    source_side_scan_summary: Optional[Union[str, "_models.SourceSideScanSummary"]] = rest_field(
        name="sourceSideScanSummary", visibility=["read", "create", "update", "delete", "query"]
    )
    """Threat summary for the container. Known values are: \"Unknown\", \"NotApplicable\",
     \"Suspicious\", and \"Healthy\"."""

    @overload
    def __init__(
        self,
        *,
        source_side_scan_status: Optional[Union[str, "_models.SourceSideScanStatus"]] = None,
        source_side_scan_summary: Optional[Union[str, "_models.SourceSideScanSummary"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SQLDataDirectory(_Model):
    """SQLDataDirectory info.

    :ivar type: Type of data directory mapping. Known values are: "Invalid", "Data", and "Log".
    :vartype type: str or ~azure.mgmt.recoveryservicesbackup.models.SQLDataDirectoryType
    :ivar path: File path.
    :vartype path: str
    :ivar logical_name: Logical name of the file.
    :vartype logical_name: str
    """

    type: Optional[Union[str, "_models.SQLDataDirectoryType"]] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of data directory mapping. Known values are: \"Invalid\", \"Data\", and \"Log\"."""
    path: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """File path."""
    logical_name: Optional[str] = rest_field(
        name="logicalName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Logical name of the file."""

    @overload
    def __init__(
        self,
        *,
        type: Optional[Union[str, "_models.SQLDataDirectoryType"]] = None,
        path: Optional[str] = None,
        logical_name: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SQLDataDirectoryMapping(_Model):
    """Encapsulates information regarding data directory.

    :ivar mapping_type: Type of data directory mapping. Known values are: "Invalid", "Data", and
     "Log".
    :vartype mapping_type: str or ~azure.mgmt.recoveryservicesbackup.models.SQLDataDirectoryType
    :ivar source_logical_name: Restore source logical name path.
    :vartype source_logical_name: str
    :ivar source_path: Restore source path.
    :vartype source_path: str
    :ivar target_path: Target path.
    :vartype target_path: str
    """

    mapping_type: Optional[Union[str, "_models.SQLDataDirectoryType"]] = rest_field(
        name="mappingType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of data directory mapping. Known values are: \"Invalid\", \"Data\", and \"Log\"."""
    source_logical_name: Optional[str] = rest_field(
        name="sourceLogicalName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Restore source logical name path."""
    source_path: Optional[str] = rest_field(
        name="sourcePath", visibility=["read", "create", "update", "delete", "query"]
    )
    """Restore source path."""
    target_path: Optional[str] = rest_field(
        name="targetPath", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target path."""

    @overload
    def __init__(
        self,
        *,
        mapping_type: Optional[Union[str, "_models.SQLDataDirectoryType"]] = None,
        source_logical_name: Optional[str] = None,
        source_path: Optional[str] = None,
        target_path: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SubProtectionPolicy(_Model):
    """Sub-protection policy which includes schedule and retention.

    :ivar policy_type: Type of backup policy type. Known values are: "Invalid", "Full",
     "Differential", "Log", "CopyOnlyFull", "Incremental", "SnapshotFull", and
     "SnapshotCopyOnlyFull".
    :vartype policy_type: str or ~azure.mgmt.recoveryservicesbackup.models.PolicyType
    :ivar schedule_policy: Backup schedule specified as part of backup policy.
    :vartype schedule_policy: ~azure.mgmt.recoveryservicesbackup.models.SchedulePolicy
    :ivar retention_policy: Retention policy with the details on backup copy retention ranges.
    :vartype retention_policy: ~azure.mgmt.recoveryservicesbackup.models.RetentionPolicy
    :ivar tiering_policy: Tiering policy to automatically move RPs to another tier. Key is Target
     Tier, defined in RecoveryPointTierType enum. Tiering policy specifies the criteria to move RP
     to the target tier.
    :vartype tiering_policy: dict[str, ~azure.mgmt.recoveryservicesbackup.models.TieringPolicy]
    :ivar snapshot_backup_additional_details: Snapshot Backup related fields for WorkloadType
     SaPHanaSystem.
    :vartype snapshot_backup_additional_details:
     ~azure.mgmt.recoveryservicesbackup.models.SnapshotBackupAdditionalDetails
    """

    policy_type: Optional[Union[str, "_models.PolicyType"]] = rest_field(
        name="policyType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Type of backup policy type. Known values are: \"Invalid\", \"Full\", \"Differential\", \"Log\",
     \"CopyOnlyFull\", \"Incremental\", \"SnapshotFull\", and \"SnapshotCopyOnlyFull\"."""
    schedule_policy: Optional["_models.SchedulePolicy"] = rest_field(
        name="schedulePolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Backup schedule specified as part of backup policy."""
    retention_policy: Optional["_models.RetentionPolicy"] = rest_field(
        name="retentionPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention policy with the details on backup copy retention ranges."""
    tiering_policy: Optional[dict[str, "_models.TieringPolicy"]] = rest_field(
        name="tieringPolicy", visibility=["read", "create", "update", "delete", "query"]
    )
    """Tiering policy to automatically move RPs to another tier. Key is Target Tier, defined in
     RecoveryPointTierType enum. Tiering policy specifies the criteria to move RP to the target
     tier."""
    snapshot_backup_additional_details: Optional["_models.SnapshotBackupAdditionalDetails"] = rest_field(
        name="snapshotBackupAdditionalDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Snapshot Backup related fields for WorkloadType SaPHanaSystem."""

    @overload
    def __init__(
        self,
        *,
        policy_type: Optional[Union[str, "_models.PolicyType"]] = None,
        schedule_policy: Optional["_models.SchedulePolicy"] = None,
        retention_policy: Optional["_models.RetentionPolicy"] = None,
        tiering_policy: Optional[dict[str, "_models.TieringPolicy"]] = None,
        snapshot_backup_additional_details: Optional["_models.SnapshotBackupAdditionalDetails"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class SystemData(_Model):
    """Metadata pertaining to creation and last modification of the resource.

    :ivar created_by: The identity that created the resource.
    :vartype created_by: str
    :ivar created_by_type: The type of identity that created the resource. Known values are:
     "User", "Application", "ManagedIdentity", and "Key".
    :vartype created_by_type: str or ~azure.mgmt.recoveryservicesbackup.models.CreatedByType
    :ivar created_at: The timestamp of resource creation (UTC).
    :vartype created_at: ~datetime.datetime
    :ivar last_modified_by: The identity that last modified the resource.
    :vartype last_modified_by: str
    :ivar last_modified_by_type: The type of identity that last modified the resource. Known values
     are: "User", "Application", "ManagedIdentity", and "Key".
    :vartype last_modified_by_type: str or ~azure.mgmt.recoveryservicesbackup.models.CreatedByType
    :ivar last_modified_at: The timestamp of resource last modification (UTC).
    :vartype last_modified_at: ~datetime.datetime
    """

    created_by: Optional[str] = rest_field(name="createdBy", visibility=["read", "create", "update", "delete", "query"])
    """The identity that created the resource."""
    created_by_type: Optional[Union[str, "_models.CreatedByType"]] = rest_field(
        name="createdByType", visibility=["read", "create", "update", "delete", "query"]
    )
    """The type of identity that created the resource. Known values are: \"User\", \"Application\",
     \"ManagedIdentity\", and \"Key\"."""
    created_at: Optional[datetime.datetime] = rest_field(
        name="createdAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The timestamp of resource creation (UTC)."""
    last_modified_by: Optional[str] = rest_field(
        name="lastModifiedBy", visibility=["read", "create", "update", "delete", "query"]
    )
    """The identity that last modified the resource."""
    last_modified_by_type: Optional[Union[str, "_models.CreatedByType"]] = rest_field(
        name="lastModifiedByType", visibility=["read", "create", "update", "delete", "query"]
    )
    """The type of identity that last modified the resource. Known values are: \"User\",
     \"Application\", \"ManagedIdentity\", and \"Key\"."""
    last_modified_at: Optional[datetime.datetime] = rest_field(
        name="lastModifiedAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """The timestamp of resource last modification (UTC)."""

    @overload
    def __init__(
        self,
        *,
        created_by: Optional[str] = None,
        created_by_type: Optional[Union[str, "_models.CreatedByType"]] = None,
        created_at: Optional[datetime.datetime] = None,
        last_modified_by: Optional[str] = None,
        last_modified_by_type: Optional[Union[str, "_models.CreatedByType"]] = None,
        last_modified_at: Optional[datetime.datetime] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class TargetAFSRestoreInfo(_Model):
    """Target Azure File Share Info.

    :ivar name: File share name.
    :vartype name: str
    :ivar target_resource_id: Target file share resource ARM ID.
    :vartype target_resource_id: str
    """

    name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """File share name."""
    target_resource_id: Optional[str] = rest_field(
        name="targetResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target file share resource ARM ID."""

    @overload
    def __init__(
        self,
        *,
        name: Optional[str] = None,
        target_resource_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class TargetDiskNetworkAccessSettings(_Model):
    """Specifies target network access settings for disks of VM to be restored.

    :ivar target_disk_network_access_option: Network access settings to be used for restored disks.
     Known values are: "SameAsOnSourceDisks", "EnablePrivateAccessForAllDisks", and
     "EnablePublicAccessForAllDisks".
    :vartype target_disk_network_access_option: str or
     ~azure.mgmt.recoveryservicesbackup.models.TargetDiskNetworkAccessOption
    :ivar target_disk_access_id: Gets or sets the ARM resource ID of the target disk access to be
     used when TargetDiskNetworkAccessOption is set to TargetDiskNetworkAccessOption.UseNew.
    :vartype target_disk_access_id: str
    """

    target_disk_network_access_option: Optional[Union[str, "_models.TargetDiskNetworkAccessOption"]] = rest_field(
        name="targetDiskNetworkAccessOption", visibility=["read", "create", "update", "delete", "query"]
    )
    """Network access settings to be used for restored disks. Known values are:
     \"SameAsOnSourceDisks\", \"EnablePrivateAccessForAllDisks\", and
     \"EnablePublicAccessForAllDisks\"."""
    target_disk_access_id: Optional[str] = rest_field(
        name="targetDiskAccessId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets the ARM resource ID of the target disk access to be used when
     TargetDiskNetworkAccessOption is set to TargetDiskNetworkAccessOption.UseNew."""

    @overload
    def __init__(
        self,
        *,
        target_disk_network_access_option: Optional[Union[str, "_models.TargetDiskNetworkAccessOption"]] = None,
        target_disk_access_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class TargetRestoreInfo(_Model):
    """Details about target workload during restore operation.

    :ivar overwrite_option: Can Overwrite if Target DataBase already exists. Known values are:
     "Invalid", "FailOnConflict", and "Overwrite".
    :vartype overwrite_option: str or ~azure.mgmt.recoveryservicesbackup.models.OverwriteOptions
    :ivar container_id: Resource Id name of the container in which Target DataBase resides.
    :vartype container_id: str
    :ivar database_name: Database name InstanceName/DataBaseName for SQL or System/DbName for SAP
     Hana.
    :vartype database_name: str
    :ivar target_directory_for_file_restore: Target directory location for restore as files.
    :vartype target_directory_for_file_restore: str
    """

    overwrite_option: Optional[Union[str, "_models.OverwriteOptions"]] = rest_field(
        name="overwriteOption", visibility=["read", "create", "update", "delete", "query"]
    )
    """Can Overwrite if Target DataBase already exists. Known values are: \"Invalid\",
     \"FailOnConflict\", and \"Overwrite\"."""
    container_id: Optional[str] = rest_field(
        name="containerId", visibility=["read", "create", "update", "delete", "query"]
    )
    """Resource Id name of the container in which Target DataBase resides."""
    database_name: Optional[str] = rest_field(
        name="databaseName", visibility=["read", "create", "update", "delete", "query"]
    )
    """Database name InstanceName/DataBaseName for SQL or System/DbName for SAP Hana."""
    target_directory_for_file_restore: Optional[str] = rest_field(
        name="targetDirectoryForFileRestore", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target directory location for restore as files."""

    @overload
    def __init__(
        self,
        *,
        overwrite_option: Optional[Union[str, "_models.OverwriteOptions"]] = None,
        container_id: Optional[str] = None,
        database_name: Optional[str] = None,
        target_directory_for_file_restore: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ThreatInfo(_Model):
    """Recovery Point Threat information.

    :ivar threat_title: Threat Subject.
    :vartype threat_title: str
    :ivar threat_description: Threat Description.
    :vartype threat_description: str
    :ivar last_updated_time: Timestamp when the last (latest)threat information was sent.
    :vartype last_updated_time: ~datetime.datetime
    :ivar threat_state: Threat Status Types. Known values are: "Active", "InProgress", "Ignored",
     and "Resolved".
    :vartype threat_state: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatState
    :ivar threat_start_time: Start timestamp of the threat.
    :vartype threat_start_time: ~datetime.datetime
    :ivar threat_end_time: End timestamp of the threat.
    :vartype threat_end_time: ~datetime.datetime
    :ivar threat_uri: threat details link.
    :vartype threat_uri: str
    :ivar threat_severity: Threat Severity Types. Known values are: "Critical", "High", "Warning",
     and "Informational".
    :vartype threat_severity: str or ~azure.mgmt.recoveryservicesbackup.models.ThreatSeverity
    """

    threat_title: Optional[str] = rest_field(name="threatTitle", visibility=["read"])
    """Threat Subject."""
    threat_description: Optional[str] = rest_field(name="threatDescription", visibility=["read"])
    """Threat Description."""
    last_updated_time: Optional[datetime.datetime] = rest_field(
        name="lastUpdatedTime", visibility=["read"], format="rfc3339"
    )
    """Timestamp when the last (latest)threat information was sent."""
    threat_state: Optional[Union[str, "_models.ThreatState"]] = rest_field(
        name="threatState", visibility=["read", "create", "update", "delete", "query"]
    )
    """Threat Status Types. Known values are: \"Active\", \"InProgress\", \"Ignored\", and
     \"Resolved\"."""
    threat_start_time: Optional[datetime.datetime] = rest_field(
        name="threatStartTime", visibility=["read"], format="rfc3339"
    )
    """Start timestamp of the threat."""
    threat_end_time: Optional[datetime.datetime] = rest_field(
        name="threatEndTime", visibility=["read"], format="rfc3339"
    )
    """End timestamp of the threat."""
    threat_uri: Optional[str] = rest_field(name="threatURI", visibility=["read"])
    """threat details link."""
    threat_severity: Optional[Union[str, "_models.ThreatSeverity"]] = rest_field(
        name="threatSeverity", visibility=["read", "create", "update", "delete", "query"]
    )
    """Threat Severity Types. Known values are: \"Critical\", \"High\", \"Warning\", and
     \"Informational\"."""

    @overload
    def __init__(
        self,
        *,
        threat_state: Optional[Union[str, "_models.ThreatState"]] = None,
        threat_severity: Optional[Union[str, "_models.ThreatSeverity"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class TieringCostInfo(_Model):
    """Base class for tiering cost response.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    TieringCostRehydrationInfo, TieringCostSavingInfo

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class TieringCostRehydrationInfo(TieringCostInfo, discriminator="TieringCostRehydrationInfo"):
    """Response parameters for tiering cost info for rehydration.

    :ivar rehydration_size_in_bytes: Rehydration size in bytes. Required.
    :vartype rehydration_size_in_bytes: int
    :ivar retail_rehydration_cost_per_gb_per_month: Source tier to target tier rehydration cost per
     GB per month. Required.
    :vartype retail_rehydration_cost_per_gb_per_month: float
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "TieringCostRehydrationInfo".
    :vartype object_type: str
    """

    rehydration_size_in_bytes: int = rest_field(
        name="rehydrationSizeInBytes", visibility=["read", "create", "update", "delete", "query"]
    )
    """Rehydration size in bytes. Required."""
    retail_rehydration_cost_per_gb_per_month: float = rest_field(
        name="retailRehydrationCostPerGBPerMonth", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source tier to target tier rehydration cost per GB per month. Required."""
    object_type: Literal["TieringCostRehydrationInfo"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"TieringCostRehydrationInfo\"."""

    @overload
    def __init__(
        self,
        *,
        rehydration_size_in_bytes: int,
        retail_rehydration_cost_per_gb_per_month: float,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "TieringCostRehydrationInfo"  # type: ignore


class TieringCostSavingInfo(TieringCostInfo, discriminator="TieringCostSavingInfo"):
    """Response parameters for tiering cost info for savings.

    :ivar source_tier_size_reduction_in_bytes: Source tier size reduction in bytes after moving all
     the recommended backup points to target tier. Required.
    :vartype source_tier_size_reduction_in_bytes: int
    :ivar target_tier_size_increase_in_bytes: Target tier size increase in bytes after moving all
     the recommended backup points to target tier. Required.
    :vartype target_tier_size_increase_in_bytes: int
    :ivar retail_source_tier_cost_per_gb_per_month: Source tier retail cost per GB per month.
     Required.
    :vartype retail_source_tier_cost_per_gb_per_month: float
    :ivar retail_target_tier_cost_per_gb_per_month: Target tier retail cost per GB per month.
     Required.
    :vartype retail_target_tier_cost_per_gb_per_month: float
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is "TieringCostSavingInfo".
    :vartype object_type: str
    """

    source_tier_size_reduction_in_bytes: int = rest_field(
        name="sourceTierSizeReductionInBytes", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source tier size reduction in bytes after moving all the recommended backup points to target
     tier. Required."""
    target_tier_size_increase_in_bytes: int = rest_field(
        name="targetTierSizeIncreaseInBytes", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target tier size increase in bytes after moving all the recommended backup points to target
     tier. Required."""
    retail_source_tier_cost_per_gb_per_month: float = rest_field(
        name="retailSourceTierCostPerGBPerMonth", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source tier retail cost per GB per month. Required."""
    retail_target_tier_cost_per_gb_per_month: float = rest_field(
        name="retailTargetTierCostPerGBPerMonth", visibility=["read", "create", "update", "delete", "query"]
    )
    """Target tier retail cost per GB per month. Required."""
    object_type: Literal["TieringCostSavingInfo"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"TieringCostSavingInfo\"."""

    @overload
    def __init__(
        self,
        *,
        source_tier_size_reduction_in_bytes: int,
        target_tier_size_increase_in_bytes: int,
        retail_source_tier_cost_per_gb_per_month: float,
        retail_target_tier_cost_per_gb_per_month: float,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "TieringCostSavingInfo"  # type: ignore


class TieringPolicy(_Model):
    """Tiering Policy for a target tier. If the policy is not specified for a given target tier,
    service retains the existing configured tiering policy for that tier.

    :ivar tiering_mode: Tiering Mode to control automatic tiering of recovery points. Supported
     values are:

     1. TierRecommended: Tier all recovery points recommended to be tiered
     2. TierAfter: Tier all recovery points after a fixed period, as specified in duration +
     durationType below.
     3. DoNotTier: Do not tier any recovery points. Known values are: "Invalid", "TierRecommended",
     "TierAfter", and "DoNotTier".
    :vartype tiering_mode: str or ~azure.mgmt.recoveryservicesbackup.models.TieringMode
    :ivar duration: Number of days/weeks/months/years to retain backups in current tier before
     tiering. Used only if TieringMode is set to TierAfter.
    :vartype duration: int
    :ivar duration_type: Retention duration type: days/weeks/months/years Used only if TieringMode
     is set to TierAfter. Known values are: "Invalid", "Days", "Weeks", "Months", and "Years".
    :vartype duration_type: str or ~azure.mgmt.recoveryservicesbackup.models.RetentionDurationType
    """

    tiering_mode: Optional[Union[str, "_models.TieringMode"]] = rest_field(
        name="tieringMode", visibility=["read", "create", "update", "delete", "query"]
    )
    """Tiering Mode to control automatic tiering of recovery points. Supported values are:
     
     1. TierRecommended: Tier all recovery points recommended to be tiered
     2. TierAfter: Tier all recovery points after a fixed period, as specified in duration +
     durationType below.
     3. DoNotTier: Do not tier any recovery points. Known values are: \"Invalid\",
     \"TierRecommended\", \"TierAfter\", and \"DoNotTier\"."""
    duration: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Number of days/weeks/months/years to retain backups in current tier before tiering. Used only
     if TieringMode is set to TierAfter."""
    duration_type: Optional[Union[str, "_models.RetentionDurationType"]] = rest_field(
        name="durationType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention duration type: days/weeks/months/years Used only if TieringMode is set to TierAfter.
     Known values are: \"Invalid\", \"Days\", \"Weeks\", \"Months\", and \"Years\"."""

    @overload
    def __init__(
        self,
        *,
        tiering_mode: Optional[Union[str, "_models.TieringMode"]] = None,
        duration: Optional[int] = None,
        duration_type: Optional[Union[str, "_models.RetentionDurationType"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class TokenInformation(_Model):
    """The token information details.

    :ivar token: Token value.
    :vartype token: str
    :ivar expiry_time_in_utc_ticks: Expiry time of token.
    :vartype expiry_time_in_utc_ticks: int
    :ivar security_pin: Security PIN.
    :vartype security_pin: str
    """

    token: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Token value."""
    expiry_time_in_utc_ticks: Optional[int] = rest_field(
        name="expiryTimeInUtcTicks", visibility=["read", "create", "update", "delete", "query"]
    )
    """Expiry time of token."""
    security_pin: Optional[str] = rest_field(
        name="securityPIN", visibility=["read", "create", "update", "delete", "query"]
    )
    """Security PIN."""

    @overload
    def __init__(
        self,
        *,
        token: Optional[str] = None,
        expiry_time_in_utc_ticks: Optional[int] = None,
        security_pin: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class TriggerDataMoveRequest(_Model):
    """Trigger DataMove Request.

    :ivar source_resource_id: ARM Id of source vault. Required.
    :vartype source_resource_id: str
    :ivar source_region: Source Region. Required.
    :vartype source_region: str
    :ivar data_move_level: DataMove Level. Required. Known values are: "Invalid", "Vault", and
     "Container".
    :vartype data_move_level: str or ~azure.mgmt.recoveryservicesbackup.models.DataMoveLevel
    :ivar correlation_id: Correlation Id. Required.
    :vartype correlation_id: str
    :ivar source_container_arm_ids: Source Container ArmIds.
    :vartype source_container_arm_ids: list[str]
    :ivar pause_gc: Pause GC.
    :vartype pause_gc: bool
    """

    source_resource_id: str = rest_field(
        name="sourceResourceId", visibility=["read", "create", "update", "delete", "query"]
    )
    """ARM Id of source vault. Required."""
    source_region: str = rest_field(name="sourceRegion", visibility=["read", "create", "update", "delete", "query"])
    """Source Region. Required."""
    data_move_level: Union[str, "_models.DataMoveLevel"] = rest_field(
        name="dataMoveLevel", visibility=["read", "create", "update", "delete", "query"]
    )
    """DataMove Level. Required. Known values are: \"Invalid\", \"Vault\", and \"Container\"."""
    correlation_id: str = rest_field(name="correlationId", visibility=["read", "create", "update", "delete", "query"])
    """Correlation Id. Required."""
    source_container_arm_ids: Optional[list[str]] = rest_field(
        name="sourceContainerArmIds", visibility=["read", "create", "update", "delete", "query"]
    )
    """Source Container ArmIds."""
    pause_gc: Optional[bool] = rest_field(name="pauseGC", visibility=["read", "create", "update", "delete", "query"])
    """Pause GC."""

    @overload
    def __init__(
        self,
        *,
        source_resource_id: str,
        source_region: str,
        data_move_level: Union[str, "_models.DataMoveLevel"],
        correlation_id: str,
        source_container_arm_ids: Optional[list[str]] = None,
        pause_gc: Optional[bool] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class UnlockDeleteRequest(_Model):
    """Request body of unlock delete API.

    :ivar resource_guard_operation_requests:
    :vartype resource_guard_operation_requests: list[str]
    :ivar resource_to_be_deleted:
    :vartype resource_to_be_deleted: str
    """

    resource_guard_operation_requests: Optional[list[str]] = rest_field(
        name="resourceGuardOperationRequests", visibility=["read", "create", "update", "delete", "query"]
    )
    resource_to_be_deleted: Optional[str] = rest_field(
        name="resourceToBeDeleted", visibility=["read", "create", "update", "delete", "query"]
    )

    @overload
    def __init__(
        self,
        *,
        resource_guard_operation_requests: Optional[list[str]] = None,
        resource_to_be_deleted: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class UnlockDeleteResponse(_Model):
    """Response of Unlock Delete API.

    :ivar unlock_delete_expiry_time: This is the time when unlock delete privileges will get
     expired.
    :vartype unlock_delete_expiry_time: str
    """

    unlock_delete_expiry_time: Optional[str] = rest_field(
        name="unlockDeleteExpiryTime", visibility=["read", "create", "update", "delete", "query"]
    )
    """This is the time when unlock delete privileges will get expired."""

    @overload
    def __init__(
        self,
        *,
        unlock_delete_expiry_time: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class UpdateRecoveryPointRequest(_Model):
    """Patch Request content to update recovery point for given RecoveryPointId.

    :ivar properties: Resource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.PatchRecoveryPointInput
    """

    properties: Optional["_models.PatchRecoveryPointInput"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """Resource properties."""

    @overload
    def __init__(
        self,
        *,
        properties: Optional["_models.PatchRecoveryPointInput"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class UserAssignedIdentityProperties(_Model):
    """User assigned managed identity properties.

    :ivar client_id: The client ID of the assigned identity.
    :vartype client_id: str
    :ivar principal_id: The principal ID of the assigned identity.
    :vartype principal_id: str
    """

    client_id: Optional[str] = rest_field(name="clientId", visibility=["read", "create", "update", "delete", "query"])
    """The client ID of the assigned identity."""
    principal_id: Optional[str] = rest_field(
        name="principalId", visibility=["read", "create", "update", "delete", "query"]
    )
    """The principal ID of the assigned identity."""

    @overload
    def __init__(
        self,
        *,
        client_id: Optional[str] = None,
        principal_id: Optional[str] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class UserAssignedManagedIdentityDetails(_Model):
    """User assigned managed identity details.

    :ivar identity_arm_id: The ARM id of the assigned identity.
    :vartype identity_arm_id: str
    :ivar identity_name: The name of the assigned identity.
    :vartype identity_name: str
    :ivar user_assigned_identity_properties: User assigned managed identity properties.
    :vartype user_assigned_identity_properties:
     ~azure.mgmt.recoveryservicesbackup.models.UserAssignedIdentityProperties
    """

    identity_arm_id: Optional[str] = rest_field(
        name="identityArmId", visibility=["read", "create", "update", "delete", "query"]
    )
    """The ARM id of the assigned identity."""
    identity_name: Optional[str] = rest_field(
        name="identityName", visibility=["read", "create", "update", "delete", "query"]
    )
    """The name of the assigned identity."""
    user_assigned_identity_properties: Optional["_models.UserAssignedIdentityProperties"] = rest_field(
        name="userAssignedIdentityProperties", visibility=["read", "create", "update", "delete", "query"]
    )
    """User assigned managed identity properties."""

    @overload
    def __init__(
        self,
        *,
        identity_arm_id: Optional[str] = None,
        identity_name: Optional[str] = None,
        user_assigned_identity_properties: Optional["_models.UserAssignedIdentityProperties"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ValidateOperationRequest(_Model):
    """Base class for validate operation request.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    ValidateIaasVMRestoreOperationRequest, ValidateRestoreOperationRequest

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is None.
    :vartype object_type: str
    """

    __mapping__: dict[str, _Model] = {}
    object_type: str = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is None."""

    @overload
    def __init__(
        self,
        *,
        object_type: str,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ValidateRestoreOperationRequest(ValidateOperationRequest, discriminator="ValidateRestoreOperationRequest"):
    """AzureRestoreValidation request.

    You probably want to use the sub-classes and not this class directly. Known sub-classes are:
    ValidateIaasVMRestoreOperationRequest

    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "ValidateRestoreOperationRequest".
    :vartype object_type: str
    :ivar restore_request: Sets restore request to be validated.
    :vartype restore_request: ~azure.mgmt.recoveryservicesbackup.models.RestoreRequest
    """

    __mapping__: dict[str, _Model] = {}
    object_type: Literal["ValidateRestoreOperationRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"ValidateRestoreOperationRequest\"."""
    restore_request: Optional["_models.RestoreRequest"] = rest_field(
        name="restoreRequest", visibility=["read", "create", "update", "delete", "query"]
    )
    """Sets restore request to be validated."""

    @overload
    def __init__(
        self,
        *,
        restore_request: Optional["_models.RestoreRequest"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "ValidateRestoreOperationRequest"  # type: ignore


class ValidateIaasVMRestoreOperationRequest(
    ValidateRestoreOperationRequest, discriminator="ValidateIaasVMRestoreOperationRequest"
):
    """AzureRestoreValidation request.

    :ivar restore_request: Sets restore request to be validated.
    :vartype restore_request: ~azure.mgmt.recoveryservicesbackup.models.RestoreRequest
    :ivar object_type: This property will be used as the discriminator for deciding the specific
     types in the polymorphic chain of types. Required. Default value is
     "ValidateIaasVMRestoreOperationRequest".
    :vartype object_type: str
    """

    object_type: Literal["ValidateIaasVMRestoreOperationRequest"] = rest_discriminator(name="objectType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is
     \"ValidateIaasVMRestoreOperationRequest\"."""

    @overload
    def __init__(
        self,
        *,
        restore_request: Optional["_models.RestoreRequest"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.object_type = "ValidateIaasVMRestoreOperationRequest"  # type: ignore


class ValidateOperationRequestResource(_Model):
    """Base class for validate operation request.

    :ivar id: Recovery point ID. Required.
    :vartype id: str
    :ivar properties: ValidateOperationRequestResource properties. Required.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.ValidateOperationRequest
    """

    id: str = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Recovery point ID. Required."""
    properties: "_models.ValidateOperationRequest" = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """ValidateOperationRequestResource properties. Required."""

    @overload
    def __init__(
        self,
        *,
        id: str,  # pylint: disable=redefined-builtin
        properties: "_models.ValidateOperationRequest",
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ValidateOperationResponse(_Model):
    """Base class for validate operation response.

    :ivar validation_results: Gets the validation result.
    :vartype validation_results: list[~azure.mgmt.recoveryservicesbackup.models.ErrorDetail]
    """

    validation_results: Optional[list["_models.ErrorDetail"]] = rest_field(
        name="validationResults", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets the validation result."""

    @overload
    def __init__(
        self,
        *,
        validation_results: Optional[list["_models.ErrorDetail"]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class ValidateOperationsResponse(_Model):
    """ValidateOperationsResponse.

    :ivar validate_operation_response: Base class for validate operation response.
    :vartype validate_operation_response:
     ~azure.mgmt.recoveryservicesbackup.models.ValidateOperationResponse
    """

    validate_operation_response: Optional["_models.ValidateOperationResponse"] = rest_field(
        name="validateOperationResponse", visibility=["read", "create", "update", "delete", "query"]
    )
    """Base class for validate operation response."""

    @overload
    def __init__(
        self,
        *,
        validate_operation_response: Optional["_models.ValidateOperationResponse"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class VaultJob(Job, discriminator="VaultJob"):
    """Vault level Job.

    :ivar entity_friendly_name: Friendly name of the entity on which the current job is executing.
    :vartype entity_friendly_name: str
    :ivar backup_management_type: Backup management type to execute the current job. Known values
     are: "Invalid", "AzureIaasVM", "MAB", "DPM", "AzureBackupServer", "AzureSql", "AzureStorage",
     "AzureWorkload", and "DefaultBackup".
    :vartype backup_management_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.BackupManagementType
    :ivar operation: The operation name.
    :vartype operation: str
    :ivar status: Job status.
    :vartype status: str
    :ivar start_time: The start time.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: The end time.
    :vartype end_time: ~datetime.datetime
    :ivar activity_id: ActivityId of job.
    :vartype activity_id: str
    :ivar duration: Time elapsed during the execution of this job.
    :vartype duration: ~datetime.timedelta
    :ivar actions_info: Gets or sets the state/actions applicable on this job like cancel/retry.
    :vartype actions_info: list[str or
     ~azure.mgmt.recoveryservicesbackup.models.JobSupportedAction]
    :ivar error_details: Error details on execution of this job.
    :vartype error_details: list[~azure.mgmt.recoveryservicesbackup.models.VaultJobErrorInfo]
    :ivar extended_info: Additional information about the job.
    :vartype extended_info: ~azure.mgmt.recoveryservicesbackup.models.VaultJobExtendedInfo
    :ivar job_type: This property will be used as the discriminator for deciding the specific types
     in the polymorphic chain of types. Required. Default value is "VaultJob".
    :vartype job_type: str
    """

    duration: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Time elapsed during the execution of this job."""
    actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = rest_field(
        name="actionsInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Gets or sets the state/actions applicable on this job like cancel/retry."""
    error_details: Optional[list["_models.VaultJobErrorInfo"]] = rest_field(
        name="errorDetails", visibility=["read", "create", "update", "delete", "query"]
    )
    """Error details on execution of this job."""
    extended_info: Optional["_models.VaultJobExtendedInfo"] = rest_field(
        name="extendedInfo", visibility=["read", "create", "update", "delete", "query"]
    )
    """Additional information about the job."""
    job_type: Literal["VaultJob"] = rest_discriminator(name="jobType", visibility=["read", "create", "update", "delete", "query"])  # type: ignore
    """This property will be used as the discriminator for deciding the specific types in the
     polymorphic chain of types. Required. Default value is \"VaultJob\"."""

    @overload
    def __init__(
        self,
        *,
        entity_friendly_name: Optional[str] = None,
        backup_management_type: Optional[Union[str, "_models.BackupManagementType"]] = None,
        operation: Optional[str] = None,
        status: Optional[str] = None,
        start_time: Optional[datetime.datetime] = None,
        end_time: Optional[datetime.datetime] = None,
        activity_id: Optional[str] = None,
        duration: Optional[datetime.timedelta] = None,
        actions_info: Optional[list[Union[str, "_models.JobSupportedAction"]]] = None,
        error_details: Optional[list["_models.VaultJobErrorInfo"]] = None,
        extended_info: Optional["_models.VaultJobExtendedInfo"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        self.job_type = "VaultJob"  # type: ignore


class VaultJobErrorInfo(_Model):
    """Vault Job specific error information.

    :ivar error_code: Error code.
    :vartype error_code: int
    :ivar error_string: Localized error string.
    :vartype error_string: str
    :ivar recommendations: List of localized recommendations for above error code.
    :vartype recommendations: list[str]
    """

    error_code: Optional[int] = rest_field(name="errorCode", visibility=["read", "create", "update", "delete", "query"])
    """Error code."""
    error_string: Optional[str] = rest_field(
        name="errorString", visibility=["read", "create", "update", "delete", "query"]
    )
    """Localized error string."""
    recommendations: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """List of localized recommendations for above error code."""

    @overload
    def __init__(
        self,
        *,
        error_code: Optional[int] = None,
        error_string: Optional[str] = None,
        recommendations: Optional[list[str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class VaultJobExtendedInfo(_Model):
    """Vault Job for CMK - has CMK specific info.

    :ivar property_bag: Job properties.
    :vartype property_bag: dict[str, str]
    """

    property_bag: Optional[dict[str, str]] = rest_field(
        name="propertyBag", visibility=["read", "create", "update", "delete", "query"]
    )
    """Job properties."""

    @overload
    def __init__(
        self,
        *,
        property_bag: Optional[dict[str, str]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class VaultRetentionPolicy(_Model):
    """Vault retention policy for AzureFileShare.

    :ivar vault_retention: Base class for retention policy. Required.
    :vartype vault_retention: ~azure.mgmt.recoveryservicesbackup.models.RetentionPolicy
    :ivar snapshot_retention_in_days: Required.
    :vartype snapshot_retention_in_days: int
    """

    vault_retention: "_models.RetentionPolicy" = rest_field(
        name="vaultRetention", visibility=["read", "create", "update", "delete", "query"]
    )
    """Base class for retention policy. Required."""
    snapshot_retention_in_days: int = rest_field(
        name="snapshotRetentionInDays", visibility=["read", "create", "update", "delete", "query"]
    )
    """Required."""

    @overload
    def __init__(
        self,
        *,
        vault_retention: "_models.RetentionPolicy",
        snapshot_retention_in_days: int,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class WeeklyRetentionFormat(_Model):
    """Weekly retention format.

    :ivar days_of_the_week: List of days of the week.
    :vartype days_of_the_week: list[str or ~azure.mgmt.recoveryservicesbackup.models.DayOfWeek]
    :ivar weeks_of_the_month: List of weeks of month.
    :vartype weeks_of_the_month: list[str or ~azure.mgmt.recoveryservicesbackup.models.WeekOfMonth]
    """

    days_of_the_week: Optional[list[Union[str, "_models.DayOfWeek"]]] = rest_field(
        name="daysOfTheWeek", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of days of the week."""
    weeks_of_the_month: Optional[list[Union[str, "_models.WeekOfMonth"]]] = rest_field(
        name="weeksOfTheMonth", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of weeks of month."""

    @overload
    def __init__(
        self,
        *,
        days_of_the_week: Optional[list[Union[str, "_models.DayOfWeek"]]] = None,
        weeks_of_the_month: Optional[list[Union[str, "_models.WeekOfMonth"]]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class WeeklyRetentionSchedule(_Model):
    """Weekly retention schedule.

    :ivar days_of_the_week: List of days of week for weekly retention policy.
    :vartype days_of_the_week: list[str or ~azure.mgmt.recoveryservicesbackup.models.DayOfWeek]
    :ivar retention_times: Retention times of retention policy.
    :vartype retention_times: list[~datetime.datetime]
    :ivar retention_duration: Retention duration of retention Policy.
    :vartype retention_duration: ~azure.mgmt.recoveryservicesbackup.models.RetentionDuration
    """

    days_of_the_week: Optional[list[Union[str, "_models.DayOfWeek"]]] = rest_field(
        name="daysOfTheWeek", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of days of week for weekly retention policy."""
    retention_times: Optional[list[datetime.datetime]] = rest_field(
        name="retentionTimes", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Retention times of retention policy."""
    retention_duration: Optional["_models.RetentionDuration"] = rest_field(
        name="retentionDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention duration of retention Policy."""

    @overload
    def __init__(
        self,
        *,
        days_of_the_week: Optional[list[Union[str, "_models.DayOfWeek"]]] = None,
        retention_times: Optional[list[datetime.datetime]] = None,
        retention_duration: Optional["_models.RetentionDuration"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class WeeklySchedule(_Model):
    """WeeklySchedule.

    :ivar schedule_run_days:
    :vartype schedule_run_days: list[str or ~azure.mgmt.recoveryservicesbackup.models.DayOfWeek]
    :ivar schedule_run_times: List of times of day this schedule has to be run.
    :vartype schedule_run_times: list[~datetime.datetime]
    """

    schedule_run_days: Optional[list[Union[str, "_models.DayOfWeek"]]] = rest_field(
        name="scheduleRunDays", visibility=["read", "create", "update", "delete", "query"]
    )
    schedule_run_times: Optional[list[datetime.datetime]] = rest_field(
        name="scheduleRunTimes", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """List of times of day this schedule has to be run."""

    @overload
    def __init__(
        self,
        *,
        schedule_run_days: Optional[list[Union[str, "_models.DayOfWeek"]]] = None,
        schedule_run_times: Optional[list[datetime.datetime]] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class WorkloadInquiryDetails(_Model):
    """Details of an inquired protectable item.

    :ivar type: Type of the Workload such as SQL, Oracle etc.
    :vartype type: str
    :ivar item_count: Contains the protectable item Count inside this Container.
    :vartype item_count: int
    :ivar inquiry_validation: Inquiry validation such as permissions and other backup validations.
    :vartype inquiry_validation: ~azure.mgmt.recoveryservicesbackup.models.InquiryValidation
    """

    type: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Type of the Workload such as SQL, Oracle etc."""
    item_count: Optional[int] = rest_field(name="itemCount", visibility=["read", "create", "update", "delete", "query"])
    """Contains the protectable item Count inside this Container."""
    inquiry_validation: Optional["_models.InquiryValidation"] = rest_field(
        name="inquiryValidation", visibility=["read", "create", "update", "delete", "query"]
    )
    """Inquiry validation such as permissions and other backup validations."""

    @overload
    def __init__(
        self,
        *,
        type: Optional[str] = None,
        item_count: Optional[int] = None,
        inquiry_validation: Optional["_models.InquiryValidation"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class WorkloadItemResource(Resource):
    """Base class for backup item. Workload-specific backup items are derived from this class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar location: Resource location.
    :vartype location: str
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    :ivar properties: WorkloadItemResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.WorkloadItem
    """

    location: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource location."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""
    properties: Optional["_models.WorkloadItem"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """WorkloadItemResource properties."""

    @overload
    def __init__(
        self,
        *,
        location: Optional[str] = None,
        tags: Optional[dict[str, str]] = None,
        e_tag: Optional[str] = None,
        properties: Optional["_models.WorkloadItem"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class WorkloadProtectableItemResource(Resource):
    """Base class for backup item. Workload-specific backup items are derived from this class.

    :ivar id: Fully qualified resource ID for the resource. Ex -
     /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}.
    :vartype id: str
    :ivar name: The name of the resource.
    :vartype name: str
    :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or
     "Microsoft.Storage/storageAccounts".
    :vartype type: str
    :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy
     information.
    :vartype system_data: ~azure.mgmt.recoveryservicesbackup.models.SystemData
    :ivar location: Resource location.
    :vartype location: str
    :ivar tags: Resource tags.
    :vartype tags: dict[str, str]
    :ivar e_tag: Optional ETag.
    :vartype e_tag: str
    :ivar properties: WorkloadProtectableItemResource properties.
    :vartype properties: ~azure.mgmt.recoveryservicesbackup.models.WorkloadProtectableItem
    """

    location: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource location."""
    tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"])
    """Resource tags."""
    e_tag: Optional[str] = rest_field(name="eTag", visibility=["read", "create", "update", "delete", "query"])
    """Optional ETag."""
    properties: Optional["_models.WorkloadProtectableItem"] = rest_field(
        visibility=["read", "create", "update", "delete", "query"]
    )
    """WorkloadProtectableItemResource properties."""

    @overload
    def __init__(
        self,
        *,
        location: Optional[str] = None,
        tags: Optional[dict[str, str]] = None,
        e_tag: Optional[str] = None,
        properties: Optional["_models.WorkloadProtectableItem"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)


class YearlyRetentionSchedule(_Model):
    """Yearly retention schedule.

    :ivar retention_schedule_format_type: Retention schedule format for yearly retention policy.
     Known values are: "Invalid", "Daily", and "Weekly".
    :vartype retention_schedule_format_type: str or
     ~azure.mgmt.recoveryservicesbackup.models.RetentionScheduleFormat
    :ivar months_of_year: List of months of year of yearly retention policy.
    :vartype months_of_year: list[str or ~azure.mgmt.recoveryservicesbackup.models.MonthOfYear]
    :ivar retention_schedule_daily: Daily retention format for yearly retention policy.
    :vartype retention_schedule_daily:
     ~azure.mgmt.recoveryservicesbackup.models.DailyRetentionFormat
    :ivar retention_schedule_weekly: Weekly retention format for yearly retention policy.
    :vartype retention_schedule_weekly:
     ~azure.mgmt.recoveryservicesbackup.models.WeeklyRetentionFormat
    :ivar retention_times: Retention times of retention policy.
    :vartype retention_times: list[~datetime.datetime]
    :ivar retention_duration: Retention duration of retention Policy.
    :vartype retention_duration: ~azure.mgmt.recoveryservicesbackup.models.RetentionDuration
    """

    retention_schedule_format_type: Optional[Union[str, "_models.RetentionScheduleFormat"]] = rest_field(
        name="retentionScheduleFormatType", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention schedule format for yearly retention policy. Known values are: \"Invalid\",
     \"Daily\", and \"Weekly\"."""
    months_of_year: Optional[list[Union[str, "_models.MonthOfYear"]]] = rest_field(
        name="monthsOfYear", visibility=["read", "create", "update", "delete", "query"]
    )
    """List of months of year of yearly retention policy."""
    retention_schedule_daily: Optional["_models.DailyRetentionFormat"] = rest_field(
        name="retentionScheduleDaily", visibility=["read", "create", "update", "delete", "query"]
    )
    """Daily retention format for yearly retention policy."""
    retention_schedule_weekly: Optional["_models.WeeklyRetentionFormat"] = rest_field(
        name="retentionScheduleWeekly", visibility=["read", "create", "update", "delete", "query"]
    )
    """Weekly retention format for yearly retention policy."""
    retention_times: Optional[list[datetime.datetime]] = rest_field(
        name="retentionTimes", visibility=["read", "create", "update", "delete", "query"], format="rfc3339"
    )
    """Retention times of retention policy."""
    retention_duration: Optional["_models.RetentionDuration"] = rest_field(
        name="retentionDuration", visibility=["read", "create", "update", "delete", "query"]
    )
    """Retention duration of retention Policy."""

    @overload
    def __init__(
        self,
        *,
        retention_schedule_format_type: Optional[Union[str, "_models.RetentionScheduleFormat"]] = None,
        months_of_year: Optional[list[Union[str, "_models.MonthOfYear"]]] = None,
        retention_schedule_daily: Optional["_models.DailyRetentionFormat"] = None,
        retention_schedule_weekly: Optional["_models.WeeklyRetentionFormat"] = None,
        retention_times: Optional[list[datetime.datetime]] = None,
        retention_duration: Optional["_models.RetentionDuration"] = None,
    ) -> None: ...

    @overload
    def __init__(self, mapping: Mapping[str, Any]) -> None:
        """
        :param mapping: raw JSON to initialize the model.
        :type mapping: Mapping[str, Any]
        """

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
