'Perform a full backup of src volume.
First creates a base backup image in our backup location then performs
an chunked copy of all data from source volume to a new backup rbd
image.'

def _full_backup(self, backup, src_volume, src_name, length):

    volume_id = backup.volume_id
    backup_name = self._get_backup_base_name(volume_id, backup.id)
    with rbd_driver.RADOSClient(self, backup.container) as client:
        (old_format, features) = self._get_rbd_support()
        LOG.debug("Creating    backup    base    image='%(name)s'    for    volume    %(volume)s.", {'name': backup_name, 'volume': volume_id})
        self.rbd.RBD().create(ioctx=client.ioctx, name=backup_name, size=length, old_format=old_format, features=features, stripe_unit=self.rbd_stripe_unit, stripe_count=self.rbd_stripe_count)
        LOG.debug('Copying    data    from    volume    %s.', volume_id)
        dest_rbd = self.rbd.Image(client.ioctx, backup_name)
        try:
            rbd_meta = linuxrbd.RBDImageMetadata(dest_rbd, backup.container, self._ceph_backup_user, self._ceph_backup_conf)
            rbd_fd = linuxrbd.RBDVolumeIOWrapper(rbd_meta)
            self._transfer_data(src_volume, src_name, rbd_fd, backup_name, length)
        finally:
            dest_rbd.close()
