complete poc

Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
Rohit Yadav 2024-08-02 13:38:54 +05:30
parent 97ce34ce2b
commit 0b9db75c4f
3 changed files with 32 additions and 10 deletions

View File

@ -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<VolumeVO> 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,

View File

@ -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<TakeBackupCo
return new BackupAnswer(command, false, result.second());
}
BackupAnswer answer = new BackupAnswer(command, true, null);
answer.setSize(Long.parseLong(result.second().trim()));
List<String> 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;
}
}

View File

@ -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 "<domainbackup mode='push'><disks>" > $dest/backup.xml
for disk in $(virsh -c qemu:///system domblklist $vm --details 2>/dev/null | awk '/disk/{print$3}'); do
echo "<disk name='$disk' backup='yes' type='file' backupmode='full'><driver type='qcow2'/><target file='$dest/$disk' /></disk>" >> $dest/backup.xml
echo "<disk name='$disk' backup='yes' type='file' backupmode='full'><driver type='qcow2'/><target file='$dest/$deviceId.$name.$disk' /></disk>" >> $dest/backup.xml
deviceId=$((devideId+1))
name="datadisk"
done
echo "</disks></domainbackup>" >> $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
}