Gilad Chaplik has uploaded a new change for review. Change subject: core: clean-up RunVmCommand.CanDoAction (2/X) ......................................................................
core: clean-up RunVmCommand.CanDoAction (2/X) better readability. Change-Id: I87ce576fbf82ad5b1f677d3cef7113b4cb9fd1e1 Signed-off-by: Gilad Chaplik <gchap...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java 2 files changed, 118 insertions(+), 134 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/12/13112/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java index cba41fb..9dd650a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java @@ -684,160 +684,139 @@ if (vm.getStatus() == VMStatus.Paused) { return true; } - /********* VmRunHandler.canRunVm START **********/ ArrayList<String> messages = getReturnValue().getCanDoActionMessages(); - boolean canDoAction = true; - List<VmPropertiesUtils.ValidationError> validationErrors = getVmPropertiesUtils().validateVMProperties( + // custom properties: + if (VmHandler.handleCustomPropertiesError(getVmPropertiesUtils().validateVMProperties( vm.getVdsGroupCompatibilityVersion(), - vm.getStaticData()); - - if (!validationErrors.isEmpty()) { - VmHandler.handleCustomPropertiesError(validationErrors, messages); + vm.getStaticData()), messages)) { return false; - } else { - BootSequence boot_sequence = (getParameters().getBootSequence() != null) ? - getParameters().getBootSequence() : vm.getDefaultBootSequence(); - Guid storagePoolId = vm.getStoragePoolId(); - // Block from running a VM with no HDD when its first boot device is - // HD and no other boot devices are configured - List<Disk> vmDisks = getVmRunHandler().getPluggedDisks(vm); - if (boot_sequence == BootSequence.C && vmDisks.size() == 0) { - String messageStr = !vmDisks.isEmpty() ? - VdcBllMessages.VM_CANNOT_RUN_FROM_DISK_WITHOUT_PLUGGED_DISK.toString() : - VdcBllMessages.VM_CANNOT_RUN_FROM_DISK_WITHOUT_DISK.toString(); + } + // boot sequence: + BootSequence boot_sequence = (getParameters().getBootSequence() != null) ? + getParameters().getBootSequence() : vm.getDefaultBootSequence(); + Guid storagePoolId = vm.getStoragePoolId(); + // Block from running a VM with no HDD when its first boot device is + // HD and no other boot devices are configured + List<Disk> vmDisks = getVmRunHandler().getPluggedDisks(vm); + if (boot_sequence == BootSequence.C && vmDisks.size() == 0) { + return failCanDoAction(!vmDisks.isEmpty() ? + VdcBllMessages.VM_CANNOT_RUN_FROM_DISK_WITHOUT_PLUGGED_DISK : + VdcBllMessages.VM_CANNOT_RUN_FROM_DISK_WITHOUT_DISK); + } + // If CD appears as first and there is no ISO in storage + // pool/ISO inactive - + // you cannot run this VM - messages.add(messageStr); - canDoAction = false; - } else { - // If CD appears as first and there is no ISO in storage - // pool/ISO inactive - - // you cannot run this VM + if (boot_sequence == BootSequence.CD && getVmRunHandler().findActiveISODomain(storagePoolId) == null) { + return failCanDoAction(VdcBllMessages.VM_CANNOT_RUN_FROM_CD_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO); + } - if (boot_sequence == BootSequence.CD && getVmRunHandler().findActiveISODomain(storagePoolId) == null) { - messages.add(VdcBllMessages.VM_CANNOT_RUN_FROM_CD_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO.toString()); - canDoAction = false; - } else { - // if there is network in the boot sequence, check that the - // vm has network, - // otherwise the vm cannot be run in vdsm - if (boot_sequence == BootSequence.N - && DbFacade.getInstance().getVmNetworkInterfaceDao().getAllForVm(vm.getId()).size() == 0) { - messages.add(VdcBllMessages.VM_CANNOT_RUN_FROM_NETWORK_WITHOUT_NETWORK.toString()); - canDoAction = false; - } + // if there is network in the boot sequence, check that the + // vm has network, + // otherwise the vm cannot be run in vdsm + if (boot_sequence == BootSequence.N + && DbFacade.getInstance().getVmNetworkInterfaceDao().getAllForVm(vm.getId()).size() == 0) { + return failCanDoAction(VdcBllMessages.VM_CANNOT_RUN_FROM_NETWORK_WITHOUT_NETWORK); + } - if (canDoAction) { - ValidationResult vmNotLockedResult = new VmValidator(vm).vmNotLocked(); - if (!vmNotLockedResult.isValid()) { - messages.add(vmNotLockedResult.getMessage().name()); - canDoAction = false; - } - } + ValidationResult vmNotLockedResult = new VmValidator(vm).vmNotLocked(); + if (!vmNotLockedResult.isValid()) { + return failCanDoAction(vmNotLockedResult.getMessage()); + } - if (canDoAction) { - ValidationResult vmDuringSnapshotResult = - getSnapshotsValidator().vmNotDuringSnapshot(vm.getId()); - if (!vmDuringSnapshotResult.isValid()) { - messages.add(vmDuringSnapshotResult.getMessage().name()); - canDoAction = false; - } - } + ValidationResult vmDuringSnapshotResult = + getSnapshotsValidator().vmNotDuringSnapshot(vm.getId()); + if (!vmDuringSnapshotResult.isValid()) { + return failCanDoAction(vmDuringSnapshotResult.getMessage()); + } - List<DiskImage> vmImages = ImagesHandler.filterImageDisks(vmDisks, true, false); - if (canDoAction && !vmImages.isEmpty()) { - storage_pool sp = getStoragePoolDAO().get(vm.getStoragePoolId()); - ValidationResult spUpResult = new StoragePoolValidator(sp).isUp(); - if (!spUpResult.isValid()) { - messages.add(spUpResult.getMessage().name()); - canDoAction = false; - } + List<DiskImage> vmImages = ImagesHandler.filterImageDisks(vmDisks, true, false); + if (!ImagesHandler.filterImageDisks(vmDisks, true, false).isEmpty()) { + storage_pool sp = getStoragePoolDAO().get(vm.getStoragePoolId()); + ValidationResult spUpResult = new StoragePoolValidator(sp).isUp(); + if (!spUpResult.isValid()) { + return failCanDoAction(spUpResult.getMessage()); + } - if (canDoAction) { - canDoAction = performImageChecksForRunningVm(vm, messages, getParameters(), vmImages); - } - - // Check if iso and floppy path exists - if (canDoAction && !vm.isAutoStartup() - && !validateIsoPath(getVmRunHandler().findActiveISODomain(vm.getStoragePoolId()), - getParameters(), - messages)) { - canDoAction = false; - } else if (canDoAction) { - boolean isVmDuringInit = ((Boolean) getBackend() - .getResourceManager() - .RunVdsCommand(VDSCommandType.IsVmDuringInitiating, - new IsVmDuringInitiatingVDSCommandParameters(vm.getId())) - .getReturnValue()).booleanValue(); - if (vm.isRunning() || (vm.getStatus() == VMStatus.NotResponding) || isVmDuringInit) { - canDoAction = false; - messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_RUNNING.toString()); - } else if (vm.getStatus() == VMStatus.Paused && vm.getRunOnVds() != null) { - VDS vds = DbFacade.getInstance().getVdsDao().get( - new Guid(vm.getRunOnVds().toString())); - if (vds.getStatus() != VDSStatus.Up) { - canDoAction = false; - messages.add(VdcBllMessages.VAR__HOST_STATUS__UP.toString()); - messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_STATUS_ILLEGAL.toString()); - } - } - - boolean isStatelessVm = shouldVmRunAsStateless(getParameters(), vm); - - if (canDoAction && isStatelessVm - && !getSnapshotsValidator().vmNotInPreview(vm.getId()).isValid()) { - canDoAction = false; - messages.add(VdcBllMessages.VM_CANNOT_RUN_STATELESS_WHILE_IN_PREVIEW.toString()); - } - - // if the VM itself is stateless or run once as stateless - if (canDoAction && isStatelessVm && vm.isAutoStartup()) { - canDoAction = false; - messages.add(VdcBllMessages.VM_CANNOT_RUN_STATELESS_HA.toString()); - } - - if (canDoAction && isStatelessVm && !hasSpaceForSnapshots(vm, messages)) { - return false; - } - } - } - - canDoAction = - canDoAction == false ? canDoAction : getVdsSelector().canFindVdsToRunOn(messages, false); - - /** - * only if can do action ok then check with actions matrix that status is valid for this - * action - */ - if (canDoAction - && !VdcActionUtils.CanExecute(Arrays.asList(vm), VM.class, - VdcActionType.RunVm)) { - canDoAction = false; - messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VM_STATUS_ILLEGAL.toString()); - } - } + if (!performImageChecksForRunningVm(vm, messages, getParameters(), vmImages)) { + return false; } } - /********* VmRunHandler.canRunVm END **********/ - canDoAction &= validateNetworkInterfaces(); + // Check if iso and floppy path exists + if (!vm.isAutoStartup() + && !validateIsoPath(getVmRunHandler().findActiveISODomain(vm.getStoragePoolId()), + getParameters(), + messages)) { + return false; + } + boolean isVmDuringInit = ((Boolean) getBackend() + .getResourceManager() + .RunVdsCommand(VDSCommandType.IsVmDuringInitiating, + new IsVmDuringInitiatingVDSCommandParameters(vm.getId())) + .getReturnValue()).booleanValue(); + if (vm.isRunning() || (vm.getStatus() == VMStatus.NotResponding) || isVmDuringInit) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_RUNNING); + } + if (vm.getStatus() == VMStatus.Paused && vm.getRunOnVds() != null) { + VDS vds = DbFacade.getInstance().getVdsDao().get( + new Guid(vm.getRunOnVds().toString())); + if (vds.getStatus() != VDSStatus.Up) { + messages.add(VdcBllMessages.VAR__HOST_STATUS__UP.toString()); + messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_STATUS_ILLEGAL.toString()); + return false; + } + } + + boolean isStatelessVm = shouldVmRunAsStateless(getParameters(), vm); + + if (isStatelessVm + && !getSnapshotsValidator().vmNotInPreview(vm.getId()).isValid()) { + return failCanDoAction(VdcBllMessages.VM_CANNOT_RUN_STATELESS_WHILE_IN_PREVIEW); + } + + // if the VM itself is stateless or run once as stateless + if (isStatelessVm && vm.isAutoStartup()) { + return failCanDoAction(VdcBllMessages.VM_CANNOT_RUN_STATELESS_HA); + } + + if (isStatelessVm && !hasSpaceForSnapshots(vm, messages)) { + return false; + } + + /** + * only if can do action ok then check with actions matrix that status is valid for this + * action + */ + if (!VdcActionUtils.CanExecute(Arrays.asList(vm), VM.class, + VdcActionType.RunVm)) { + messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VM_STATUS_ILLEGAL.toString()); + return false; + } + + if (!validateNetworkInterfaces()) { + return false; + } // check for Vm Payload - if (canDoAction && getParameters().getVmPayload() != null) { - canDoAction = checkPayload(getParameters().getVmPayload(), - getParameters().getDiskPath()); - - if (canDoAction && !StringUtils.isEmpty(getParameters().getFloppyPath()) && + if (getParameters().getVmPayload() != null) { + if (checkPayload(getParameters().getVmPayload(), + getParameters().getDiskPath()) && !StringUtils.isEmpty(getParameters().getFloppyPath()) && getParameters().getVmPayload().getType() == VmDeviceType.FLOPPY) { - addCanDoActionMessage(VdcBllMessages.VMPAYLOAD_FLOPPY_EXCEEDED); - canDoAction = false; + return failCanDoAction(VdcBllMessages.VMPAYLOAD_FLOPPY_EXCEEDED); } else { - getVm().setVmPayload(getParameters().getVmPayload()); + vm.setVmPayload(getParameters().getVmPayload()); } } - return canDoAction; + // last validation: host selection + if (!getVdsSelector().canFindVdsToRunOn(messages, false)) { + return false; + } + + return true; } /** diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java index 68d996a..f3f0cc0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java @@ -453,13 +453,18 @@ return retVal; } - protected static void handleCustomPropertiesError(List<ValidationError> validationErrors, ArrayList<String> message) { + protected static boolean handleCustomPropertiesError(List<ValidationError> validationErrors, + ArrayList<String> message) { + if (validationErrors == null || validationErrors.size() == 0) { + return false; + } String invalidSyntaxMsg = VdcBllMessages.ACTION_TYPE_FAILED_INVALID_CUSTOM_VM_PROPERTIES_INVALID_SYNTAX.name(); List<String> errorMessages = VmPropertiesUtils.getInstance().generateErrorMessages(validationErrors, invalidSyntaxMsg, failureReasonsToVdcBllMessagesMap, failureReasonsToFormatMessages); message.addAll(errorMessages); + return true; } public static void updateImportedVmUsbPolicy(VmBase vmBase) { -- To view, visit http://gerrit.ovirt.org/13112 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I87ce576fbf82ad5b1f677d3cef7113b4cb9fd1e1 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Gilad Chaplik <gchap...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches