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 9b5672e228fc..8254be4f8ea7 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 @@ -164,7 +164,7 @@ public boolean takeBackup(final VirtualMachine vm) { if (VirtualMachine.State.Stopped.equals(vm.getState())) { List vmVolumes = volumeDao.findByInstance(vm.getId()); vmVolumes.sort(Comparator.comparing(Volume::getDeviceId)); - List volumePaths = getVolumePaths(vmVolumes); + List volumePaths = getVolumePaths(vmVolumes, Collections.emptyList()); command.setVolumePaths(volumePaths); } @@ -229,7 +229,7 @@ public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) { restoreCommand.setBackupRepoAddress(backupRepository.getAddress()); restoreCommand.setMountOptions(backupRepository.getMountOptions()); restoreCommand.setVmName(vm.getName()); - restoreCommand.setVolumePaths(getVolumePaths(volumes)); + restoreCommand.setVolumePaths(getVolumePaths(volumes, backedVolumes)); restoreCommand.setVmExists(vm.getRemoved() == null); restoreCommand.setVmState(vm.getState()); @@ -244,7 +244,7 @@ public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) { return answer.getResult(); } - private List getVolumePaths(List volumes) { + private List getVolumePaths(List volumes, List backedVolumes) { List volumePaths = new ArrayList<>(); for (VolumeVO volume : volumes) { StoragePoolVO storagePool = primaryDataStoreDao.findById(volume.getPoolId()); @@ -259,8 +259,24 @@ private List getVolumePaths(List volumes) { } else { volumePathPrefix = String.format("/mnt/%s", storagePool.getUuid()); } + boolean hasBackedVolumes = backedVolumes != null && !backedVolumes.isEmpty(); + if (hasBackedVolumes) { + Optional opt = backedVolumes.stream() + .filter(bv -> bv.getUuid().equals(volume.getUuid())).findFirst(); + if (opt.isPresent()) { + Backup.VolumeInfo backedVolume = opt.get(); + if (backedVolume.getPath() != null && !backedVolume.getPath().isEmpty()) { + volumePaths.add(String.format("%s/%s", volumePathPrefix, backedVolume.getPath())); + } else { + volumePaths.add(String.format("%s/%s", volumePathPrefix, volume.getPath())); + } + continue; + } + } + volumePaths.add(String.format("%s/%s", volumePathPrefix, volume.getPath())); } + return volumePaths; }