From bb630e7f3ee472fdb45ca0ab536698fd0907a212 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Wed, 16 Dec 2015 18:01:30 +0530 Subject: [PATCH] CLOUDSTACK-9182: Some running VMs turned off on manual migration when auto migration failed while host preparing for maintenance. Fix: Block VMOperations if Host in PrepareForMaintenance mode. VM operations (Stop, Reboot, Destroy, Migrate to host) are not allowed when Host in PrepareForMaintenance mode. --- .../com/cloud/vm/VirtualMachineManagerImpl.java | 7 +++++++ server/src/com/cloud/vm/UserVmManagerImpl.java | 14 ++++++++++++++ 2 files changed, 21 insertions(+) mode change 100755 => 100644 server/src/com/cloud/vm/UserVmManagerImpl.java diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 8cc8de12433e..100d566c78a8 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -155,6 +155,7 @@ import com.cloud.offering.ServiceOffering; import com.cloud.org.Cluster; import com.cloud.resource.ResourceManager; +import com.cloud.resource.ResourceState; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; @@ -1505,6 +1506,12 @@ private void advanceStop(final VMInstanceVO vm, final boolean cleanUpEvenIfUnabl _workDao.update(work.getId(), work); } return; + } else { + HostVO host = _hostDao.findById(hostId); + if (!cleanUpEvenIfUnableToStop && vm.getState() == State.Running && host.getResourceState() == ResourceState.PrepareForMaintenance) { + s_logger.debug("Host is in PrepareForMaintenance state - Stop VM operation on the VM id: " + vm.getId() + " is not allowed"); + throw new CloudRuntimeException("Stop VM operation on the VM id: " + vm.getId() + " is not allowed as host is preparing for maintenance mode"); + } } final VirtualMachineGuru vmGuru = getVmGuru(vm); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java old mode 100755 new mode 100644 index 3a47f3810785..a29d1f31a5a4 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2616,6 +2616,8 @@ public UserVm rebootVirtualMachine(RebootVMCmd cmd) throws InsufficientCapacityE _accountMgr.checkAccess(caller, null, true, vmInstance); + checkIfHostOfVMIsInPrepareForMaintenanceState(vmInstance.getHostId(), vmId, "Reboot"); + // If the VM is Volatile in nature, on reboot discard the VM's root disk and create a new root disk for it: by calling restoreVM long serviceOfferingId = vmInstance.getServiceOfferingId(); ServiceOfferingVO offering = _serviceOfferingDao.findById(vmInstance.getId(), serviceOfferingId); @@ -4678,6 +4680,8 @@ public VirtualMachine migrateVirtualMachine(Long vmId, Host destinationHost) thr throw ex; } + checkIfHostOfVMIsInPrepareForMaintenanceState(vm.getHostId(), vmId, "Migrate"); + if(serviceOfferingDetailsDao.findDetail(vm.getServiceOfferingId(), GPU.Keys.pciDevice.toString()) != null) { throw new InvalidParameterValueException("Live Migration of GPU enabled VM is not supported"); } @@ -4770,6 +4774,16 @@ private boolean checkIfHostIsDedicated(HostVO host) { } } + private void checkIfHostOfVMIsInPrepareForMaintenanceState(Long hostId, Long vmId, String operation) { + HostVO host = _hostDao.findById(hostId); + if (host.getResourceState() != ResourceState.PrepareForMaintenance) { + return; + } + + s_logger.debug("Host is in PrepareForMaintenance state - " + operation + " VM operation on the VM id: " + vmId + " is not allowed"); + throw new InvalidParameterValueException(operation + " VM operation on the VM id: " + vmId + " is not allowed as host is preparing for maintenance mode"); + } + private Long accountOfDedicatedHost(HostVO host) { long hostId = host.getId(); DedicatedResourceVO dedicatedHost = _dedicatedDao.findByHostId(hostId);