'Determine if differential restore is possible and restore point.
Determine whether a differential restore is possible/allowed,
and find out the restore point if backup base is diff-format.
In order for a differential restore to be performed we need:
* destination volume must be RBD
* destination volume must have zero extents
* backup base image must exist
* backup must have a restore point
* target volume is different from source volume of backup
Returns True if differential restore is allowed, False otherwise.
Return the restore point if back base is diff-format.'

def _diff_restore_allowed(self, base_name, backup, volume, volume_file, rados_client):

    (rbd_exists, base_name) = self._rbd_image_exists(base_name, backup.volume_id, rados_client)
    if (not rbd_exists):
        return (False, None)
    restore_point = self._get_restore_point(base_name, backup.id)
    if restore_point:
        if self._file_is_rbd(volume_file):
            LOG.debug('Volume    file    is    RBD.')
            if (volume.id == backup.volume_id):
                LOG.debug('Destination    volume    is    same    as    backup    source    volume    %s    -    forcing    full    copy.', volume.id)
                return (False, restore_point)
            if self._rbd_has_extents(volume_file.rbd_image):
                LOG.debug('Destination    has    extents    -    forcing    full    copy')
                return (False, restore_point)
            return (True, restore_point)
        else:
            LOG.debug('Volume    file    is    NOT    RBD.')
    else:
        LOG.info("No    restore    point    found    for    backup='%(backup)s'    of    volume    %(volume)s    although    base    image    is    found    -    forcing    full    copy.", {'backup': backup.id, 'volume': backup.volume_id})
    return (False, restore_point)
