From a55ba2b8e3047a1888ab7eb37761e67050136a4c Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Tue, 16 Jun 2020 07:55:59 +0000 Subject: [PATCH 1/2] server: Do not resize volume of running vm on KVM host if host is not Up or not Enabled --- .../java/com/cloud/storage/VolumeApiServiceImpl.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index e60225135081..d069ffa92b47 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -109,11 +109,13 @@ import com.cloud.exception.StorageUnavailableException; import com.cloud.gpu.GPU; import com.cloud.host.HostVO; +import com.cloud.host.Status; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.HypervisorCapabilitiesVO; import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao; import com.cloud.org.Grouping; +import com.cloud.resource.ResourceState; import com.cloud.serializer.GsonHelper; import com.cloud.server.ResourceTag; import com.cloud.server.TaggedResourceService; @@ -1187,6 +1189,16 @@ private VolumeVO orchestrateResizeVolume(long volumeId, long currentSize, long n if (currentSize != newSize && _volsDao.getHypervisorType(volume.getId()) == HypervisorType.XenServer && !userVm.getState().equals(State.Stopped)) { throw new InvalidParameterValueException(errorMsg); } + + /* Do not resize volume of running vm on KVM host if host is not Up or not Enabled */ + if (currentSize != newSize && userVm.getState() == State.Running && userVm.getHypervisorType() == HypervisorType.KVM) { + HostVO host = _hostDao.findById(userVm.getHostId()); + if (host.getStatus() != Status.Up) { + throw new InvalidParameterValueException("The KVM host where vm is running is not Up"); + } else if (host.getResourceState() != ResourceState.Enabled) { + throw new InvalidParameterValueException("The KVM host where vm is running is not Enabled"); + } + } } ResizeVolumePayload payload = new ResizeVolumePayload(newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve, shrinkOk, instanceName, hosts, isManaged); From f5309aa008dfb0ce24202592251495cb345b92c9 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 19 Jun 2020 19:01:28 +0000 Subject: [PATCH 2/2] add null check for PR 4148 --- .../main/java/com/cloud/storage/VolumeApiServiceImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 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 d069ffa92b47..ec24719105ad 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -1192,8 +1192,13 @@ private VolumeVO orchestrateResizeVolume(long volumeId, long currentSize, long n /* Do not resize volume of running vm on KVM host if host is not Up or not Enabled */ if (currentSize != newSize && userVm.getState() == State.Running && userVm.getHypervisorType() == HypervisorType.KVM) { + if (userVm.getHostId() == null) { + throw new InvalidParameterValueException("Cannot find the hostId of running vm " + userVm.getUuid()); + } HostVO host = _hostDao.findById(userVm.getHostId()); - if (host.getStatus() != Status.Up) { + if (host == null) { + throw new InvalidParameterValueException("The KVM host where vm is running does not exist"); + } else if (host.getStatus() != Status.Up) { throw new InvalidParameterValueException("The KVM host where vm is running is not Up"); } else if (host.getResourceState() != ResourceState.Enabled) { throw new InvalidParameterValueException("The KVM host where vm is running is not Enabled");