mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-02 11:52:28 +01:00
CLOUDSTACK-9182: Some running VMs turned off on manual migration when auto migration failed while host preparing for maintenance. (#1252)
Fix: Block VMOperations if Host in PrepareForMaintenance mode. VM operations (Stop, Reboot, Destroy, Migrate to host) are not allowed when Host in PrepareForMaintenance mode.
This commit is contained in:
parent
3f69c83f96
commit
f2584bb9e7
@ -159,6 +159,7 @@ import com.cloud.offering.DiskOfferingInfo;
|
||||
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;
|
||||
@ -1531,6 +1532,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
|
||||
_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);
|
||||
|
||||
14
server/src/com/cloud/vm/UserVmManagerImpl.java
Executable file → Normal file
14
server/src/com/cloud/vm/UserVmManagerImpl.java
Executable file → Normal file
@ -2636,6 +2636,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
|
||||
_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);
|
||||
@ -4845,6 +4847,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
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");
|
||||
}
|
||||
@ -4938,6 +4942,16 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user