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

Reply via email to