This is an automated email from the ASF dual-hosted git repository.

nvazquez pushed a commit to branch 4.15
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.15 by this push:
     new e968f3b  server: detach data disks before destroying vms (#5356)
e968f3b is described below

commit e968f3b16a8f73715f2017f30ce91599e37c568a
Author: Wei Zhou <57355700+weizhouapa...@users.noreply.github.com>
AuthorDate: Sat Aug 28 06:00:04 2021 +0200

    server: detach data disks before destroying vms (#5356)
---
 server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 4c615df..af28648 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -2985,7 +2985,9 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
 
         stopVirtualMachine(vmId, VmDestroyForcestop.value());
 
-        detachVolumesFromVm(volumesToBeDeleted);
+        // Detach all data disks from VM
+        List<VolumeVO> dataVols = _volsDao.findByInstanceAndType(vmId, 
Volume.Type.DATADISK);
+        detachVolumesFromVm(dataVols);
 
         UserVm destroyedVm = destroyVm(vmId, expunge);
         if (expunge) {
@@ -2994,7 +2996,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
             }
         }
 
-        deleteVolumesFromVm(volumesToBeDeleted);
+        deleteVolumesFromVm(volumesToBeDeleted, expunge);
 
         return destroyedVm;
     }
@@ -7322,13 +7324,13 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
         StringBuilder sb = new StringBuilder();
 
         for (VolumeVO volume : volumes) {
-            if (volume.getInstanceId() == null || vmId != 
volume.getInstanceId()) {
+            if (volume.getInstanceId() == null || vmId != 
volume.getInstanceId() || volume.getVolumeType() != Volume.Type.DATADISK) {
                 sb.append(volume.toString() + "; ");
             }
         }
 
         if (!StringUtils.isEmpty(sb.toString())) {
-            throw new InvalidParameterValueException("The following supplied 
volumes are not attached to the VM: " + sb.toString());
+            throw new InvalidParameterValueException("The following supplied 
volumes are not DATADISK attached to the VM: " + sb.toString());
         }
     }
 
@@ -7353,13 +7355,13 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
         }
     }
 
-    private void deleteVolumesFromVm(List<VolumeVO> volumes) {
+    private void deleteVolumesFromVm(List<VolumeVO> volumes, boolean expunge) {
 
         for (VolumeVO volume : volumes) {
 
-            boolean deleteResult = _volumeService.deleteVolume(volume.getId(), 
CallContext.current().getCallingAccount());
+            Volume result = _volumeService.destroyVolume(volume.getId(), 
CallContext.current().getCallingAccount(), expunge, false);
 
-            if (!deleteResult) {
+            if (result == null) {
                 s_logger.error("DestroyVM remove volume - failed to delete 
volume " + volume.getInstanceId() + " from instance " + volume.getId());
             }
         }

Reply via email to