From 7e0eb9105837ccbc570471c8579a04f97a7509c0 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Tue, 24 Aug 2021 10:17:49 +0200 Subject: [PATCH 1/2] server: allow destroy volumes which attach to a expunged vm --- .../src/main/java/com/cloud/storage/VolumeApiServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 9791267f4984..daca84b3f503 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -1364,7 +1364,7 @@ protected VolumeVO retrieveAndValidateVolume(long volumeId, Account caller) { if (!_snapshotMgr.canOperateOnVolume(volume)) { throw new InvalidParameterValueException("There are snapshot operations in progress on the volume, unable to delete it"); } - if (volume.getInstanceId() != null && volume.getState() != Volume.State.Expunged) { + if (volume.getInstanceId() != null && _vmInstanceDao.findById(volume.getInstanceId()) != null && volume.getState() != Volume.State.Expunged) { throw new InvalidParameterValueException("Please specify a volume that is not attached to any VM."); } if (volume.getState() == Volume.State.UploadOp) { From 059936398d722fdf4b02e7bf20f890d9c41d2dea Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Tue, 24 Aug 2021 11:06:22 +0200 Subject: [PATCH 2/2] server: recover volume which is attached to a removed vm --- server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index daca84b3f503..abb8265f20f5 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -1520,6 +1520,7 @@ public Volume recoverVolume(long volumeId) { } try { + _volsDao.detachVolume(volume.getId()); stateTransitTo(volume, Volume.Event.RecoverRequested); } catch (NoTransitionException e) { s_logger.debug("Failed to recover volume" + volume.getId(), e);