Пример #1
0
def restore_disks(cmd,
                  client,
                  resource_group_name,
                  vault_name,
                  container_name,
                  item_name,
                  rp_name,
                  storage_account,
                  restore_to_staging_storage_account=None):
    item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx),
                     resource_group_name, vault_name, container_name,
                     item_name, "AzureIaasVM", "VM")
    _validate_item(item)
    recovery_point = show_recovery_point(cmd, recovery_points_cf(cmd.cli_ctx),
                                         resource_group_name, vault_name,
                                         container_name, item_name, rp_name,
                                         "AzureIaasVM", "VM")
    vault = vaults_cf(cmd.cli_ctx).get(resource_group_name, vault_name)
    vault_location = vault.location

    # Get container and item URIs
    container_uri = _get_protection_container_uri_from_id(item.id)
    item_uri = _get_protected_item_uri_from_id(item.id)

    # Original Storage Account Restore Logic
    use_original_storage_account = _should_use_original_storage_account(
        recovery_point, restore_to_staging_storage_account)
    if use_original_storage_account:
        logger.warning("""
            The disks will be restored to their original storage accounts. The VM config file will be uploaded to given
            storage account.
            """)

    # Construct trigger restore request object
    sa_name, sa_rg = _get_resource_name_and_rg(resource_group_name,
                                               storage_account)
    _storage_account_id = _get_storage_account_id(cmd.cli_ctx, sa_name, sa_rg)
    _source_resource_id = item.properties.source_resource_id
    trigger_restore_properties = IaasVMRestoreRequest(
        create_new_cloud_service=True,
        recovery_point_id=rp_name,
        recovery_type='RestoreDisks',
        region=vault_location,
        storage_account_id=_storage_account_id,
        source_resource_id=_source_resource_id,
        original_storage_account_option=use_original_storage_account)
    trigger_restore_request = RestoreRequestResource(
        properties=trigger_restore_properties)

    # Trigger restore
    result = client.trigger(vault_name,
                            resource_group_name,
                            fabric_name,
                            container_uri,
                            item_uri,
                            rp_name,
                            trigger_restore_request,
                            raw=True)
    return _track_backup_job(cmd.cli_ctx, result, vault_name,
                             resource_group_name)
Пример #2
0
    def trigger_restore(self, container_name, protected_item_name, recovery_point_name, source_resource_id, storage_account_id):
        restore_request = RestoreRequestResource(
            properties=IaasVMRestoreRequest(
                recovery_point_id=recovery_point_name,
                recovery_type=RecoveryType.restore_disks,
                source_resource_id=source_resource_id,
                storage_account_id=storage_account_id,
                region=self.test_definition.location,
                create_new_cloud_service=False,
                )
            )

        response = self.backup_client.restores.trigger(self.vault_name, self.resource_group, self.fabric_name, container_name, protected_item_name,
                                                       recovery_point_name, restore_request, raw=True)
        self._validate_operation_response(response)

        job_response = self._get_operation_response(
            response,
            lambda operation_id: self.backup_client.protected_item_operation_results.get(
                self.vault_name, self.resource_group, self.test_definition.fabric_name, container_name, protected_item_name, operation_id, raw=True,
                ),
            lambda operation_id: self.backup_client.protected_item_operation_statuses.get(
                self.vault_name, self.resource_group, self.test_definition.fabric_name, container_name, protected_item_name, operation_id,
                ),
            )

        self.context.assertIsNotNone(job_response.job_id)
        return job_response.job_id
Пример #3
0
def restore_AzureFileShare(cmd,
                           client,
                           resource_group_name,
                           vault_name,
                           rp_name,
                           item,
                           restore_mode,
                           resolve_conflict,
                           restore_request_type,
                           source_file_type=None,
                           source_file_path=None,
                           target_storage_account_name=None,
                           target_file_share_name=None,
                           target_folder=None):

    container_uri = helper.get_protection_container_uri_from_id(item.id)
    item_uri = helper.get_protected_item_uri_from_id(item.id)

    sa_name = item.properties.container_name
    source_resource_id = _get_storage_account_id(cmd.cli_ctx,
                                                 sa_name.split(';')[-1],
                                                 sa_name.split(';')[-2])
    target_resource_id = None

    afs_restore_request = AzureFileShareRestoreRequest()
    target_details = None

    afs_restore_request.copy_options = resolve_conflict
    afs_restore_request.recovery_type = restore_mode
    afs_restore_request.source_resource_id = source_resource_id
    afs_restore_request.restore_request_type = restore_request_type

    restore_file_specs = [
        RestoreFileSpecs(path=source_file_path,
                         file_spec_type=source_file_type,
                         target_folder_path=target_folder)
    ]

    if restore_mode == "AlternateLocation":
        target_resource_id = _get_storage_account_id(
            cmd.cli_ctx, target_storage_account_name, resource_group_name)
        target_details = TargetAFSRestoreInfo()
        target_details.name = target_file_share_name
        target_details.target_resource_id = target_resource_id
        afs_restore_request.target_details = target_details

    afs_restore_request.restore_file_specs = restore_file_specs

    trigger_restore_request = RestoreRequestResource(
        properties=afs_restore_request)

    result = sdk_no_wait(True, client.trigger, vault_name, resource_group_name,
                         fabric_name, container_uri, item_uri, rp_name,
                         trigger_restore_request)

    return helper.track_backup_job(cmd.cli_ctx, result, vault_name,
                                   resource_group_name)
Пример #4
0
def restore_azure_wl(cmd, client, resource_group_name, vault_name,
                     recovery_config):
    recovery_config_object = cust_help.get_or_read_json(recovery_config)
    restore_mode = recovery_config_object['restore_mode']
    container_uri = recovery_config_object['container_uri']
    item_uri = recovery_config_object['item_uri']
    recovery_point_id = recovery_config_object['recovery_point_id']
    log_point_in_time = recovery_config_object['log_point_in_time']
    item_type = recovery_config_object['item_type']
    source_resource_id = recovery_config_object['source_resource_id']
    database_name = recovery_config_object['database_name']
    container_id = recovery_config_object['container_id']
    alternate_directory_paths = recovery_config_object[
        'alternate_directory_paths']

    # Construct trigger restore request object
    trigger_restore_properties = _get_restore_request_instance(
        item_type, log_point_in_time)
    trigger_restore_properties.recovery_type = restore_mode

    if restore_mode == 'AlternateLocation':
        setattr(trigger_restore_properties, 'source_resource_id',
                source_resource_id)
        setattr(
            trigger_restore_properties, 'target_info',
            TargetRestoreInfo(overwrite_option='Overwrite',
                              database_name=database_name,
                              container_id=container_id))
        if 'sql' in item_type.lower():
            directory_map = []
            for i in alternate_directory_paths:
                directory_map.append(
                    SQLDataDirectoryMapping(mapping_type=i[0],
                                            source_path=i[1],
                                            source_logical_name=i[2],
                                            target_path=i[3]))
            setattr(trigger_restore_properties, 'alternate_directory_paths',
                    directory_map)

    if log_point_in_time is not None:
        setattr(trigger_restore_properties, 'point_in_time',
                datetime_type(log_point_in_time))

    if 'sql' in item_type.lower():
        setattr(trigger_restore_properties,
                'should_use_alternate_target_location', True)
        setattr(trigger_restore_properties, 'is_non_recoverable', False)
    trigger_restore_request = RestoreRequestResource(
        properties=trigger_restore_properties)
    # Trigger restore and wait for completion
    result = sdk_no_wait(True, client.trigger, vault_name, resource_group_name,
                         fabric_name, container_uri, item_uri,
                         recovery_point_id, trigger_restore_request)
    return cust_help.track_backup_job(cmd.cli_ctx, result, vault_name,
                                      resource_group_name)
Пример #5
0
def restore_disks(client, resource_group_name, vault_name, container_name,
                  item_name, rp_name, storage_account):
    item = show_item(backup_protected_items_cf(None), resource_group_name,
                     vault_name, container_name, item_name, "AzureIaasVM",
                     "VM")
    vault = vaults_cf(None).get(resource_group_name,
                                vault_name,
                                custom_headers=_get_custom_headers())
    vault_location = vault.location

    # Get container and item URIs
    container_uri = _get_protection_container_uri_from_id(item.id)
    item_uri = _get_protected_item_uri_from_id(item.id)

    # Construct trigger restore request object
    sa_name, sa_rg = _get_resource_name_and_rg(resource_group_name,
                                               storage_account)
    _storage_account_id = _get_storage_account_id(sa_name, sa_rg)
    _source_resource_id = item.properties.source_resource_id
    trigger_restore_properties = IaasVMRestoreRequest(
        create_new_cloud_service=True,
        recovery_point_id=rp_name,
        recovery_type='RestoreDisks',
        region=vault_location,
        storage_account_id=_storage_account_id,
        source_resource_id=_source_resource_id)
    trigger_restore_request = RestoreRequestResource(
        properties=trigger_restore_properties)

    # Trigger restore
    result = client.trigger(vault_name,
                            resource_group_name,
                            fabric_name,
                            container_uri,
                            item_uri,
                            rp_name,
                            trigger_restore_request,
                            raw=True,
                            custom_headers=_get_custom_headers())
    return _track_backup_job(result, vault_name, resource_group_name)
Пример #6
0
def restore_disks(cmd,
                  client,
                  resource_group_name,
                  vault_name,
                  container_name,
                  item_name,
                  rp_name,
                  storage_account,
                  target_resource_group=None,
                  restore_to_staging_storage_account=None,
                  restore_only_osdisk=None,
                  diskslist=None,
                  restore_as_unmanaged_disks=None):
    item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx),
                     resource_group_name, vault_name, container_name,
                     item_name, "AzureIaasVM", "VM")
    _validate_item(item)
    recovery_point = show_recovery_point(cmd, recovery_points_cf(cmd.cli_ctx),
                                         resource_group_name, vault_name,
                                         container_name, item_name, rp_name,
                                         "AzureIaasVM", "VM")
    vault = vaults_cf(cmd.cli_ctx).get(resource_group_name, vault_name)
    vault_location = vault.location

    # Get container and item URIs
    container_uri = _get_protection_container_uri_from_id(item.id)
    item_uri = _get_protected_item_uri_from_id(item.id)

    # Original Storage Account Restore Logic
    use_original_storage_account = _should_use_original_storage_account(
        recovery_point, restore_to_staging_storage_account)
    if use_original_storage_account:
        logger.warning("""
            The disks will be restored to their original storage accounts. The VM config file will be uploaded to given
            storage account.
            """)

    # Construct trigger restore request object
    sa_name, sa_rg = _get_resource_name_and_rg(resource_group_name,
                                               storage_account)
    _storage_account_id = _get_storage_account_id(cmd.cli_ctx, sa_name, sa_rg)
    _source_resource_id = item.properties.source_resource_id
    target_rg_id = None

    if restore_as_unmanaged_disks and target_resource_group is not None:
        raise CLIError("""
            Both restore_as_unmanaged_disks and target_resource_group can't be spceified.
            Please give Only one parameter and retry.
            """)

    if recovery_point.properties.is_managed_virtual_machine:
        if target_resource_group is not None:
            target_rg_id = '/'.join(_source_resource_id.split('/')
                                    [:4]) + "/" + target_resource_group
        if not restore_as_unmanaged_disks:
            logger.warning("""
                The disks of the managed VM will be restored as unmanaged since targetRG parameter is not provided.
                This will NOT leverage the instant restore functionality.
                Hence it can be significantly slow based on given storage account.
                To leverage instant restore, provide the target RG parameter.
                Otherwise, provide the intent next time by passing the --restore-as-unmanaged-disks parameter
                """)

    _validate_restore_disk_parameters(restore_only_osdisk, diskslist)
    restore_disk_lun_list = None
    if restore_only_osdisk:
        restore_disk_lun_list = []

    if diskslist:
        restore_disk_lun_list = diskslist

    trigger_restore_properties = IaasVMRestoreRequest(
        create_new_cloud_service=True,
        recovery_point_id=rp_name,
        recovery_type='RestoreDisks',
        region=vault_location,
        storage_account_id=_storage_account_id,
        source_resource_id=_source_resource_id,
        target_resource_group_id=target_rg_id,
        original_storage_account_option=use_original_storage_account,
        restore_disk_lun_list=restore_disk_lun_list)
    trigger_restore_request = RestoreRequestResource(
        properties=trigger_restore_properties)

    # Trigger restore
    result = sdk_no_wait(True, client.trigger, vault_name, resource_group_name,
                         fabric_name, container_uri, item_uri, rp_name,
                         trigger_restore_request)
    return _track_backup_job(cmd.cli_ctx, result, vault_name,
                             resource_group_name)
Пример #7
0
def restore_disks(cmd,
                  client,
                  resource_group_name,
                  vault_name,
                  container_name,
                  item_name,
                  rp_name,
                  storage_account,
                  target_resource_group=None,
                  restore_to_staging_storage_account=None,
                  restore_only_osdisk=None,
                  diskslist=None):
    item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx),
                     resource_group_name, vault_name, container_name,
                     item_name, "AzureIaasVM", "VM")
    _validate_item(item)
    recovery_point = show_recovery_point(cmd, recovery_points_cf(cmd.cli_ctx),
                                         resource_group_name, vault_name,
                                         container_name, item_name, rp_name,
                                         "AzureIaasVM", "VM")
    vault = vaults_cf(cmd.cli_ctx).get(resource_group_name, vault_name)
    vault_location = vault.location

    # Get container and item URIs
    container_uri = _get_protection_container_uri_from_id(item.id)
    item_uri = _get_protected_item_uri_from_id(item.id)

    # Original Storage Account Restore Logic
    use_original_storage_account = _should_use_original_storage_account(
        recovery_point, restore_to_staging_storage_account)
    if use_original_storage_account:
        logger.warning("""
            The disks will be restored to their original storage accounts. The VM config file will be uploaded to given
            storage account.
            """)

    # Construct trigger restore request object
    sa_name, sa_rg = _get_resource_name_and_rg(resource_group_name,
                                               storage_account)
    _storage_account_id = _get_storage_account_id(cmd.cli_ctx, sa_name, sa_rg)
    _source_resource_id = item.properties.source_resource_id
    target_rg_id = None
    if recovery_point.properties.is_managed_virtual_machine and target_resource_group is not None:
        target_rg_id = '/'.join(
            _source_resource_id.split('/')[:4]) + "/" + target_resource_group

    _validate_restore_disk_parameters(restore_only_osdisk, diskslist)
    restore_disk_lun_list = None
    if restore_only_osdisk:
        restore_disk_lun_list = []

    if diskslist:
        restore_disk_lun_list = diskslist

    trigger_restore_properties = IaasVMRestoreRequest(
        create_new_cloud_service=True,
        recovery_point_id=rp_name,
        recovery_type='RestoreDisks',
        region=vault_location,
        storage_account_id=_storage_account_id,
        source_resource_id=_source_resource_id,
        target_resource_group_id=target_rg_id,
        original_storage_account_option=use_original_storage_account,
        restore_disk_lun_list=restore_disk_lun_list)
    trigger_restore_request = RestoreRequestResource(
        properties=trigger_restore_properties)

    # Trigger restore
    result = sdk_no_wait(True, client.trigger, vault_name, resource_group_name,
                         fabric_name, container_uri, item_uri, rp_name,
                         trigger_restore_request)
    return _track_backup_job(cmd.cli_ctx, result, vault_name,
                             resource_group_name)
Пример #8
0
def restore_azure_wl(cmd,
                     client,
                     resource_group_name,
                     vault_name,
                     recovery_config,
                     rehydration_duration=15,
                     rehydration_priority=None,
                     use_secondary_region=None):

    recovery_config_object = cust_help.get_or_read_json(recovery_config)
    restore_mode = recovery_config_object['restore_mode']
    container_uri = recovery_config_object['container_uri']
    item_uri = recovery_config_object['item_uri']
    recovery_point_id = recovery_config_object['recovery_point_id']
    log_point_in_time = recovery_config_object['log_point_in_time']
    item_type = recovery_config_object['item_type']
    workload_type = recovery_config_object['workload_type']
    source_resource_id = recovery_config_object['source_resource_id']
    database_name = recovery_config_object['database_name']
    container_id = recovery_config_object['container_id']
    alternate_directory_paths = recovery_config_object[
        'alternate_directory_paths']
    recovery_mode = recovery_config_object['recovery_mode']
    filepath = recovery_config_object['filepath']

    trigger_restore_properties = _get_restore_request_instance(
        item_type, log_point_in_time, None)
    if log_point_in_time is None:
        recovery_point = common.show_recovery_point(
            cmd, recovery_points_cf(cmd.cli_ctx), resource_group_name,
            vault_name, container_uri, item_uri, recovery_point_id,
            workload_type, "AzureWorkload", use_secondary_region)

        if recovery_point is None:
            raise InvalidArgumentValueError("""
            Specified recovery point not found. Please check the recovery config file
            or try removing --use-secondary-region if provided""")

        rp_list = [recovery_point]
        common.fetch_tier(rp_list)

        if (rp_list[0].properties.recovery_point_tier_details is not None
                and rp_list[0].tier_type == 'VaultArchive'
                and rehydration_priority is None):
            raise InvalidArgumentValueError(
                """The selected recovery point is in archive tier, provide additional
            parameters of rehydration duration and rehydration priority.""")

        if rp_list[
                0].properties.recovery_point_tier_details is not None and rp_list[
                    0].tier_type == 'VaultArchive':
            # normal rehydrated restore
            trigger_restore_properties = _get_restore_request_instance(
                item_type, log_point_in_time, rehydration_priority)

            rehyd_duration = 'P' + str(rehydration_duration) + 'D'
            rehydration_info = RecoveryPointRehydrationInfo(
                rehydration_retention_duration=rehyd_duration,
                rehydration_priority=rehydration_priority)

            trigger_restore_properties.recovery_point_rehydration_info = rehydration_info

    trigger_restore_properties.recovery_type = restore_mode

    # Get target vm id
    if container_id is not None:
        target_container_name = cust_help.get_protection_container_uri_from_id(
            container_id)
        target_resource_group = cust_help.get_resource_group_from_id(
            container_id)
        target_vault_name = cust_help.get_vault_from_arm_id(container_id)
        target_container = common.show_container(
            cmd, backup_protection_containers_cf(cmd.cli_ctx),
            target_container_name, target_resource_group, target_vault_name,
            'AzureWorkload')
        setattr(trigger_restore_properties, 'target_virtual_machine_id',
                target_container.properties.source_resource_id)

    if restore_mode == 'AlternateLocation':
        if recovery_mode != "FileRecovery":
            setattr(trigger_restore_properties, 'source_resource_id',
                    source_resource_id)
            setattr(
                trigger_restore_properties, 'target_info',
                TargetRestoreInfo(overwrite_option='Overwrite',
                                  database_name=database_name,
                                  container_id=container_id))
            if 'sql' in item_type.lower():
                directory_map = []
                for i in alternate_directory_paths:
                    directory_map.append(
                        SQLDataDirectoryMapping(mapping_type=i[0],
                                                source_path=i[1],
                                                source_logical_name=i[2],
                                                target_path=i[3]))
                setattr(trigger_restore_properties,
                        'alternate_directory_paths', directory_map)
        else:
            target_info = TargetRestoreInfo(
                overwrite_option='Overwrite',
                container_id=container_id,
                target_directory_for_file_restore=filepath)
            setattr(trigger_restore_properties, 'target_info', target_info)
            trigger_restore_properties.recovery_mode = recovery_mode

    if log_point_in_time is not None:
        setattr(trigger_restore_properties, 'point_in_time',
                datetime_type(log_point_in_time))

    if 'sql' in item_type.lower():
        setattr(trigger_restore_properties,
                'should_use_alternate_target_location', True)
        setattr(trigger_restore_properties, 'is_non_recoverable', False)

    trigger_restore_request = RestoreRequestResource(
        properties=trigger_restore_properties)

    if use_secondary_region:
        if rehydration_priority is not None:
            raise MutuallyExclusiveArgumentError(
                "Archive restore isn't supported for secondary region.")
        vault = vaults_cf(cmd.cli_ctx).get(resource_group_name, vault_name)
        vault_location = vault.location
        azure_region = custom.secondary_region_map[vault_location]
        aad_client = aad_properties_cf(cmd.cli_ctx)
        filter_string = cust_help.get_filter_string(
            {'backupManagementType': 'AzureWorkload'})
        aad_result = aad_client.get(azure_region, filter_string)
        rp_client = recovery_points_cf(cmd.cli_ctx)
        crr_access_token = rp_client.get_access_token(
            vault_name, resource_group_name, fabric_name, container_uri,
            item_uri, recovery_point_id, aad_result).properties
        crr_client = cross_region_restore_cf(cmd.cli_ctx)
        trigger_restore_properties.region = azure_region
        result = crr_client.trigger(azure_region,
                                    crr_access_token,
                                    trigger_restore_properties,
                                    raw=True,
                                    polling=False).result()
        return cust_help.track_backup_crr_job(cmd.cli_ctx, result,
                                              azure_region, vault.id)

    # Trigger restore and wait for completion
    result = client.trigger(vault_name,
                            resource_group_name,
                            fabric_name,
                            container_uri,
                            item_uri,
                            recovery_point_id,
                            trigger_restore_request,
                            raw=True,
                            polling=False).result()
    return cust_help.track_backup_job(cmd.cli_ctx, result, vault_name,
                                      resource_group_name)
Пример #9
0
def restore_azure_wl(cmd, client, resource_group_name, vault_name, recovery_config, rehydration_duration=15,
                     rehydration_priority=None):

    recovery_config_object = cust_help.get_or_read_json(recovery_config)
    restore_mode = recovery_config_object['restore_mode']
    container_uri = recovery_config_object['container_uri']
    item_uri = recovery_config_object['item_uri']
    recovery_point_id = recovery_config_object['recovery_point_id']
    log_point_in_time = recovery_config_object['log_point_in_time']
    item_type = recovery_config_object['item_type']
    source_resource_id = recovery_config_object['source_resource_id']
    database_name = recovery_config_object['database_name']
    container_id = recovery_config_object['container_id']
    alternate_directory_paths = recovery_config_object['alternate_directory_paths']
    recovery_mode = recovery_config_object['recovery_mode']
    filepath = recovery_config_object['filepath']

    recovery_point = common.show_recovery_point(cmd, recovery_points_cf(cmd.cli_ctx), resource_group_name,
                                                vault_name, container_uri, item_uri, recovery_point_id, item_type,
                                                backup_management_type="AzureWorkload")

    rp_list = [recovery_point]
    common.fetch_tier(rp_list)

    if (rp_list[0].properties.recovery_point_tier_details is not None and rp_list[0].tier_type == 'VaultArchive' and
            rehydration_priority is None):
        raise InvalidArgumentValueError("""The selected recovery point is in archive tier, provide additional
        parameters of rehydration duration and rehydration priority.""")

    if rp_list[0].properties.recovery_point_tier_details is not None and rp_list[0].tier_type == 'VaultArchive':
        # Construct trigger restore request object
        trigger_restore_properties = _get_restore_request_instance(item_type, log_point_in_time, rehydration_priority)

        rehyd_duration = 'P' + str(rehydration_duration) + 'D'
        rehydration_info = RecoveryPointRehydrationInfo(rehydration_retention_duration=rehyd_duration,
                                                        rehydration_priority=rehydration_priority)

        trigger_restore_properties.recovery_point_rehydration_info = rehydration_info

    else:
        trigger_restore_properties = _get_restore_request_instance(item_type, log_point_in_time, None)

    trigger_restore_properties.recovery_type = restore_mode

    # Get target vm id
    if container_id is not None:
        target_container_name = cust_help.get_protection_container_uri_from_id(container_id)
        target_resource_group = cust_help.get_resource_group_from_id(container_id)
        target_vault_name = cust_help.get_vault_from_arm_id(container_id)
        target_container = common.show_container(cmd, backup_protection_containers_cf(cmd.cli_ctx),
                                                 target_container_name, target_resource_group, target_vault_name,
                                                 'AzureWorkload')
        setattr(trigger_restore_properties, 'target_virtual_machine_id', target_container.properties.source_resource_id)

    if restore_mode == 'AlternateLocation':
        if recovery_mode != "FileRecovery":
            setattr(trigger_restore_properties, 'source_resource_id', source_resource_id)
            setattr(trigger_restore_properties, 'target_info', TargetRestoreInfo(overwrite_option='Overwrite',
                                                                                 database_name=database_name,
                                                                                 container_id=container_id))
            if 'sql' in item_type.lower():
                directory_map = []
                for i in alternate_directory_paths:
                    directory_map.append(SQLDataDirectoryMapping(mapping_type=i[0], source_path=i[1],
                                                                 source_logical_name=i[2], target_path=i[3]))
                setattr(trigger_restore_properties, 'alternate_directory_paths', directory_map)
        else:
            target_info = TargetRestoreInfo(overwrite_option='Overwrite', container_id=container_id,
                                            target_directory_for_file_restore=filepath)
            setattr(trigger_restore_properties, 'target_info', target_info)
            trigger_restore_properties.recovery_mode = recovery_mode

    if log_point_in_time is not None:
        setattr(trigger_restore_properties, 'point_in_time', datetime_type(log_point_in_time))

    if 'sql' in item_type.lower():
        setattr(trigger_restore_properties, 'should_use_alternate_target_location', True)
        setattr(trigger_restore_properties, 'is_non_recoverable', False)

    trigger_restore_request = RestoreRequestResource(properties=trigger_restore_properties)

    # Trigger restore and wait for completion
    result = client.trigger(vault_name, resource_group_name, fabric_name, container_uri,
                            item_uri, recovery_point_id, trigger_restore_request, raw=True, polling=False).result()
    return cust_help.track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)