Skip to content

Commit 8b22f42

Browse files
committed
Revert "NAS 백업 deviceID로 정렬 및 cloudstack merge 추가"
This reverts commit 37de3db.
1 parent 37de3db commit 8b22f42

File tree

3 files changed

+39
-44
lines changed

3 files changed

+39
-44
lines changed

plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import java.text.SimpleDateFormat;
5252
import java.util.ArrayList;
5353
import java.util.Collections;
54-
import java.util.Comparator;
5554
import java.util.Date;
5655
import java.util.List;
5756
import java.util.Locale;
@@ -163,7 +162,6 @@ public boolean takeBackup(final VirtualMachine vm) {
163162

164163
if (VirtualMachine.State.Stopped.equals(vm.getState())) {
165164
List<VolumeVO> vmVolumes = volumeDao.findByInstance(vm.getId());
166-
vmVolumes.sort(Comparator.comparing(Volume::getDeviceId));
167165
List<String> volumePaths = getVolumePaths(vmVolumes);
168166
command.setVolumePaths(volumePaths);
169167
}
@@ -214,10 +212,7 @@ private BackupVO createBackupObject(VirtualMachine vm, String backupPath) {
214212
@Override
215213
public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) {
216214
List<Backup.VolumeInfo> backedVolumes = backup.getBackedUpVolumes();
217-
List<VolumeVO> volumes = backedVolumes.stream()
218-
.map(volume -> volumeDao.findByUuid(volume.getUuid()))
219-
.sorted((v1, v2) -> Long.compare(v1.getDeviceId(), v2.getDeviceId()))
220-
.collect(Collectors.toList());
215+
List<VolumeVO> volumes = backedVolumes.stream().map(volume -> volumeDao.findByUuid(volume.getUuid())).collect(Collectors.toList());
221216

222217
LOG.debug("Restoring vm {} from backup {} on the NAS Backup Provider", vm, backup);
223218
BackupRepository backupRepository = getBackupRepository(vm, backup);

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRestoreBackupCommandWrapper.java

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -62,25 +62,16 @@ public Answer execute(RestoreBackupCommand command, LibvirtComputingResource ser
6262
String restoreVolumeUuid = command.getRestoreVolumeUUID();
6363

6464
String newVolumeId = null;
65-
try {
66-
if (Objects.isNull(vmExists)) {
67-
String volumePath = volumePaths.get(0);
68-
int lastIndex = volumePath.lastIndexOf("/");
69-
newVolumeId = volumePath.substring(lastIndex + 1);
70-
restoreVolume(backupPath, backupRepoType, backupRepoAddress, volumePath, diskType, restoreVolumeUuid,
71-
new Pair<>(vmName, command.getVmState()), mountOptions);
72-
} else if (Boolean.TRUE.equals(vmExists)) {
73-
restoreVolumesOfExistingVM(volumePaths, backupPath, backupRepoType, backupRepoAddress, mountOptions);
74-
} else {
75-
restoreVolumesOfDestroyedVMs(volumePaths, vmName, backupPath, backupRepoType, backupRepoAddress, mountOptions);
76-
}
77-
} catch (CloudRuntimeException e) {
78-
String errorMessage = "Failed to restore backup for VM: " + vmName + ".";
79-
if (e.getMessage() != null && !e.getMessage().isEmpty()) {
80-
errorMessage += " Details: " + e.getMessage();
81-
}
82-
logger.error(errorMessage);
83-
return new BackupAnswer(command, false, errorMessage);
65+
if (Objects.isNull(vmExists)) {
66+
String volumePath = volumePaths.get(0);
67+
int lastIndex = volumePath.lastIndexOf("/");
68+
newVolumeId = volumePath.substring(lastIndex + 1);
69+
restoreVolume(backupPath, backupRepoType, backupRepoAddress, volumePath, diskType, restoreVolumeUuid,
70+
new Pair<>(vmName, command.getVmState()), mountOptions);
71+
} else if (Boolean.TRUE.equals(vmExists)) {
72+
restoreVolumesOfExistingVM(volumePaths, backupPath, backupRepoType, backupRepoAddress, mountOptions);
73+
} else {
74+
restoreVolumesOfDestroyedVMs(volumePaths, vmName, backupPath, backupRepoType, backupRepoAddress, mountOptions);
8475
}
8576

8677
return new BackupAnswer(command, true, newVolumeId);
@@ -95,8 +86,10 @@ private void restoreVolumesOfExistingVM(List<String> volumePaths, String backupP
9586
String volumePath = volumePaths.get(idx);
9687
Pair<String, String> bkpPathAndVolUuid = getBackupPath(mountDirectory, volumePath, backupPath, diskType, null);
9788
diskType = "datadisk";
98-
if (!replaceVolumeWithBackup(volumePath, bkpPathAndVolUuid.first())) {
99-
throw new CloudRuntimeException(String.format("Unable to restore backup for volume [%s].", bkpPathAndVolUuid.second()));
89+
try {
90+
replaceVolumeWithBackup(volumePath, bkpPathAndVolUuid.first());
91+
} catch (IOException e) {
92+
throw new CloudRuntimeException(String.format("Unable to revert backup for volume [%s] due to [%s].", bkpPathAndVolUuid.second(), e.getMessage()), e);
10093
}
10194
}
10295
} finally {
@@ -115,8 +108,10 @@ private void restoreVolumesOfDestroyedVMs(List<String> volumePaths, String vmNam
115108
String volumePath = volumePaths.get(i);
116109
Pair<String, String> bkpPathAndVolUuid = getBackupPath(mountDirectory, volumePath, backupPath, diskType, null);
117110
diskType = "datadisk";
118-
if (!replaceVolumeWithBackup(volumePath, bkpPathAndVolUuid.first())) {
119-
throw new CloudRuntimeException(String.format("Unable to restore backup for volume [%s].", bkpPathAndVolUuid.second()));
111+
try {
112+
replaceVolumeWithBackup(volumePath, bkpPathAndVolUuid.first());
113+
} catch (IOException e) {
114+
throw new CloudRuntimeException(String.format("Unable to revert backup for volume [%s] due to [%s].", bkpPathAndVolUuid.second(), e.getMessage()), e);
120115
}
121116
}
122117
} finally {
@@ -131,13 +126,15 @@ private void restoreVolume(String backupPath, String backupRepoType, String back
131126
Pair<String, String> bkpPathAndVolUuid;
132127
try {
133128
bkpPathAndVolUuid = getBackupPath(mountDirectory, volumePath, backupPath, diskType, volumeUUID);
134-
if (!replaceVolumeWithBackup(volumePath, bkpPathAndVolUuid.first())) {
135-
throw new CloudRuntimeException(String.format("Unable to restore backup for volume [%s].", bkpPathAndVolUuid.second()));
136-
}
137-
if (VirtualMachine.State.Running.equals(vmNameAndState.second())) {
138-
if (!attachVolumeToVm(vmNameAndState.first(), volumePath)) {
139-
throw new CloudRuntimeException(String.format("Failed to attach volume to VM: %s", vmNameAndState.first()));
129+
try {
130+
replaceVolumeWithBackup(volumePath, bkpPathAndVolUuid.first());
131+
if (VirtualMachine.State.Running.equals(vmNameAndState.second())) {
132+
if (!attachVolumeToVm(vmNameAndState.first(), volumePath)) {
133+
throw new CloudRuntimeException(String.format("Failed to attach volume to VM: %s", vmNameAndState.first()));
134+
}
140135
}
136+
} catch (IOException e) {
137+
throw new CloudRuntimeException(String.format("Unable to revert backup for volume [%s] due to [%s].", bkpPathAndVolUuid.second(), e.getMessage()), e);
141138
}
142139
} catch (Exception e) {
143140
throw new CloudRuntimeException("Failed to restore volume", e);
@@ -197,9 +194,8 @@ private Pair<String, String> getBackupPath(String mountDirectory, String volumeP
197194
return new Pair<>(bkpPath, volUuid);
198195
}
199196

200-
private boolean replaceVolumeWithBackup(String volumePath, String backupPath) {
201-
int exitValue = Script.runSimpleBashScriptForExitValue(String.format(RSYNC_COMMAND, backupPath, volumePath));
202-
return exitValue == 0;
197+
private void replaceVolumeWithBackup(String volumePath, String backupPath) throws IOException {
198+
Script.runSimpleBashScript(String.format(RSYNC_COMMAND, backupPath, volumePath));
203199
}
204200

205201
private boolean attachVolumeToVm(String vmName, String volumePath) {

server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2595,9 +2595,7 @@ public Volume attachVolumeToVM(Long vmId, Long volumeId, Long deviceId, Boolean
25952595

25962596
excludeLocalStorageIfNeeded(volumeToAttach);
25972597

2598-
checkForVMSnapshots(vmId, vm);
2599-
2600-
checkForBackups(vm, true);
2598+
checkForDevicesInCopies(vmId, vm);
26012599

26022600
checkRightsToAttach(caller, volumeToAttach, vm);
26032601

@@ -2699,12 +2697,18 @@ private void checkRightsToAttach(Account caller, VolumeInfo volumeToAttach, User
26992697
}
27002698
}
27012699

2702-
private void checkForVMSnapshots(Long vmId, UserVmVO vm) {
2700+
private void checkForDevicesInCopies(Long vmId, UserVmVO vm) {
27032701
// if target VM has associated VM snapshots
27042702
List<VMSnapshotVO> vmSnapshots = _vmSnapshotDao.findByVm(vmId);
27052703
if (vmSnapshots.size() > 0) {
27062704
throw new InvalidParameterValueException(String.format("Unable to attach volume to VM %s/%s, please specify a VM that does not have VM snapshots", vm.getName(), vm.getUuid()));
27072705
}
2706+
2707+
// if target VM has backups
2708+
List<Backup> backups = backupDao.listByVmId(vm.getDataCenterId(), vm.getId());
2709+
if (vm.getBackupOfferingId() != null && !backups.isEmpty()) {
2710+
throw new InvalidParameterValueException(String.format("Unable to attach volume to VM %s/%s, please specify a VM that does not have any backups", vm.getName(), vm.getUuid()));
2711+
}
27082712
}
27092713

27102714
/**
@@ -2807,7 +2811,7 @@ private void checkDeviceId(Long deviceId, VolumeInfo volumeToAttach, UserVmVO vm
28072811
return volumeToAttach;
28082812
}
28092813

2810-
protected void checkForBackups(UserVmVO vm, boolean attach) {
2814+
protected void validateIfVmHasBackups(UserVmVO vm, boolean attach) {
28112815
if ((vm.getBackupOfferingId() == null || CollectionUtils.isEmpty(vm.getBackupVolumeList())) || BooleanUtils.isTrue(BackupManager.BackupEnableAttachDetachVolumes.value())) {
28122816
return;
28132817
}
@@ -3046,7 +3050,7 @@ public Volume detachVolumeFromVM(DetachVolumeCmd cmmd) {
30463050
throw new InvalidParameterValueException("Unable to detach volume, please specify a VM that does not have VM snapshots");
30473051
}
30483052

3049-
checkForBackups(vm, false);
3053+
validateIfVmHasBackups(vm, false);
30503054

30513055
AsyncJobExecutionContext asyncExecutionContext = AsyncJobExecutionContext.getCurrentExecutionContext();
30523056
if (asyncExecutionContext != null) {

0 commit comments

Comments
 (0)