private boolean removeVm() { final List<DiskImage> diskImages = DisksFilter.filterImageDisks(getVm().getDiskList(), ONLY_NOT_SHAREABLE, ONLY_ACTIVE); final List<LunDisk> lunDisks = DisksFilter.filterLunDisks(getVm().getDiskMap().values(), ONLY_NOT_SHAREABLE); for (VmNic nic : getInterfaces()) { new ExternalNetworkManager(nic).deallocateIfExternal(); } removeMemoryVolumes(); TransactionSupport.executeInNewTransaction( () -> { removeVmFromDb(); if (getParameters().isRemoveDisks()) { for (DiskImage image : diskImages) { getCompensationContext().snapshotEntityStatus(image.getImage(), ImageStatus.ILLEGAL); ImagesHandler.updateImageStatus(image.getImage().getId(), ImageStatus.LOCKED); } for (LunDisk lunDisk : lunDisks) { ImagesHandler.removeLunDisk(lunDisk); } getCompensationContext().stateChanged(); } else { for (DiskImage image : diskImages) { imageDao.updateImageVmSnapshotId(image.getImageId(), null); } } return null; }); Collection<DiskImage> unremovedDisks = Collections.emptyList(); if (getParameters().isRemoveDisks()) { if (!diskImages.isEmpty()) { unremovedDisks = removeVmImages(diskImages).getActionReturnValue(); } unremovedDisks.addAll(removeCinderDisks()); if (!unremovedDisks.isEmpty()) { processUnremovedDisks(unremovedDisks); return false; } } vmDeleted.fire(getVmId()); return true; }
private List<CinderDisk> getCinderDisks() { if (cinderDisks == null) { cinderDisks = DisksFilter.filterCinderDisks(getVm().getDiskMap().values()); } return cinderDisks; }
@Override protected boolean validate() { if (getVm() == null) { return failValidation(EngineMessage.ACTION_TYPE_FAILED_VM_NOT_FOUND); } if (!canRunActionOnNonManagedVm()) { return false; } if (getVm().isDeleteProtected()) { return failValidation(EngineMessage.ACTION_TYPE_FAILED_DELETE_PROTECTION_ENABLED); } vmHandler.updateDisksFromDb(getVm()); getParameters() .setUseCinderCommandCallback( getParameters().isRemoveDisks() && !getCinderDisks().isEmpty()); if (!getParameters().isRemoveDisks() && !canRemoveVmWithDetachDisks()) { return false; } switch (getVm().getStatus()) { case Unassigned: case Down: case ImageIllegal: case ImageLocked: break; case Suspended: return failValidation(EngineMessage.VM_CANNOT_REMOVE_VM_WHEN_STATUS_IS_NOT_DOWN); default: return (getVm().isHostedEngine() && isInternalExecution()) || failValidation(EngineMessage.ACTION_TYPE_FAILED_VM_IS_RUNNING); } if (getVm().getVmPoolId() != null) { return failValidation(EngineMessage.ACTION_TYPE_FAILED_VM_ATTACHED_TO_POOL); } // enable to remove vms without images SnapshotsValidator snapshotsValidator = new SnapshotsValidator(); if (!validate(snapshotsValidator.vmNotDuringSnapshot(getVmId()))) { return false; } if (!getVm().getDiskMap().isEmpty() && !validate(new StoragePoolValidator(getStoragePool()).isUp())) { return false; } Collection<Disk> vmDisks = getVm().getDiskMap().values(); List<DiskImage> vmImages = DisksFilter.filterImageDisks(vmDisks, ONLY_NOT_SHAREABLE, ONLY_ACTIVE); vmImages.addAll(DisksFilter.filterCinderDisks(vmDisks)); if (!vmImages.isEmpty()) { Set<Guid> storageIds = ImagesHandler.getAllStorageIdsForImageIds(vmImages); MultipleStorageDomainsValidator storageValidator = new MultipleStorageDomainsValidator(getVm().getStoragePoolId(), storageIds); if (!validate(storageValidator.allDomainsExistAndActive())) { return false; } DiskImagesValidator diskImagesValidator = new DiskImagesValidator(vmImages); if (!getParameters().getForce() && !validate(diskImagesValidator.diskImagesNotLocked())) { return false; } } // Handle VM status with ImageLocked VmValidator vmValidator = new VmValidator(getVm()); ValidationResult vmLockedValidatorResult = vmValidator.vmNotLocked(); if (!vmLockedValidatorResult.isValid()) { // without force remove, we can't remove the VM if (!getParameters().getForce()) { return failValidation(vmLockedValidatorResult.getMessages()); } // If it is force, we cannot remove if there are task if (CommandCoordinatorUtil.hasTasksByStoragePoolId(getVm().getStoragePoolId())) { return failValidation(EngineMessage.VM_CANNOT_REMOVE_HAS_RUNNING_TASKS); } } if (getParameters().isRemoveDisks() && !validate(vmValidator.vmNotHavingDeviceSnapshotsAttachedToOtherVms(false))) { return false; } return true; }