diff --git a/plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java b/plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java index 0e6b3122a3a..83c55f62512 100644 --- a/plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java +++ b/plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java @@ -46,6 +46,7 @@ import org.apache.logging.log4j.LogManager; import javax.inject.Inject; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Map; @@ -157,7 +158,13 @@ public class NASBackupProvider extends AdapterBase implements BackupProvider, Co backup.setType("FULL"); backup.setDate(new Date()); backup.setSize(answer.getSize()); - backup.setProtectedSize(answer.getVirtualSize()); + Long virtualSize = 0L; + for (final Volume volume: volumeDao.findByInstance(vm.getId())) { + if (Volume.State.Ready.equals(volume.getState())) { + virtualSize += volume.getSize(); + } + } + backup.setProtectedSize(virtualSize); backup.setStatus(Backup.Status.BackedUp); backup.setBackupOfferingId(vm.getBackupOfferingId()); backup.setAccountId(vm.getAccountId()); @@ -173,6 +180,10 @@ public class NASBackupProvider extends AdapterBase implements BackupProvider, Co public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) { final Long zoneId = backup.getZoneId(); + List volumes = volumeDao.findByInstance(vm.getId()); + volumes.removeIf(x -> !Volume.State.Ready.equals(x.getState())); + volumes.sort(Comparator.comparing(VolumeVO::getDeviceId)); + LOG.debug("Restoring vm " + vm.getUuid() + "from backup " + backup.getUuid() + " on the NAS Backup Provider"); // Find where the VM was last running @@ -192,6 +203,7 @@ public class NASBackupProvider extends AdapterBase implements BackupProvider, Co final Long zoneId = backup.getZoneId(); // TODO: Find volume from backup volumes + volume.getDeviceId(); // restore by device ID VolumeVO restoredVolume = new VolumeVO(Volume.Type.DATADISK, null, backup.getZoneId(), backup.getDomainId(), backup.getAccountId(), 0, null, diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtTakeBackupCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtTakeBackupCommandWrapper.java index 30f530ffd8a..d228c48296a 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtTakeBackupCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtTakeBackupCommandWrapper.java @@ -28,10 +28,8 @@ import com.cloud.utils.script.Script; import org.apache.cloudstack.backup.BackupAnswer; import org.apache.cloudstack.backup.TakeBackupCommand; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @ResourceWrapper(handles = TakeBackupCommand.class) @@ -64,8 +62,14 @@ public class LibvirtTakeBackupCommandWrapper extends CommandWrapper outputLines = Arrays.asList(result.second().trim().split("\n")); + Long backupSize = 0L; + if (outputLines.size() > 0) { + backupSize = Long.parseLong(outputLines.get(outputLines.size()-1).trim()); + } + + BackupAnswer answer = new BackupAnswer(command, true, result.second()); + answer.setSize(backupSize); return answer; } } diff --git a/scripts/vm/hypervisor/kvm/nasbackup.sh b/scripts/vm/hypervisor/kvm/nasbackup.sh index 5c6cbc5476a..ae21255dc78 100755 --- a/scripts/vm/hypervisor/kvm/nasbackup.sh +++ b/scripts/vm/hypervisor/kvm/nasbackup.sh @@ -40,23 +40,29 @@ backup_vm() { mount -t ${NAS_TYPE} ${NAS_ADDRESS} ${mount_point} $([[ ! -z "${MOUNT_OPTS}" ]] && echo -o ${MOUNT_OPTS}) mkdir -p $dest + deviceId=0 + name="root" echo "" > $dest/backup.xml for disk in $(virsh -c qemu:///system domblklist $vm --details 2>/dev/null | awk '/disk/{print$3}'); do - echo "" >> $dest/backup.xml + echo "" >> $dest/backup.xml + deviceId=$((devideId+1)) + name="datadisk" done echo "" >> $dest/backup.xml virsh -c qemu:///system backup-begin --domain $vm --backupxml $dest/backup.xml > /dev/null 2>/dev/null virsh -c qemu:///system dumpxml $vm > $dest/domain-$vm.xml 2>/dev/null - until virsh -c qemu:///system domjobinfo $vm --completed 2>/dev/null | grep "Completed" > /dev/null; do + until virsh -c qemu:///system domjobinfo $vm --completed --keep-completed 2>/dev/null | grep "Completed" > /dev/null; do sleep 5 done rm -f $dest/backup.xml - - # Print directory size sync + + # Print statistics + virsh -c qemu:///system domjobinfo $vm --completed du -sb $dest | cut -f1 + umount $mount_point rmdir $mount_point }