Dudi Maroshi has uploaded a new change for review.

Change subject: engine: validate (vm NUMA nodes) <= (vm CPU cores)
......................................................................

engine: validate (vm NUMA nodes) <= (vm CPU cores)

Add validation in canDoAction(), in UpdateVmCommand.
Validate (vm NUMA nodes> <= (vm CPU cores), even if called from REST api

Generate a detailed error message:
[Cannot edit VM. Assigned 2 NUMA nodes for 1 CPU cores. Cannot assign
more NUMA nodes then CPU cores.]
Bug-Url: https://bugzilla.redhat.com/1220122

Change-Id: I4589721f3d9fa76509d2931b351c5517c06df334
Signed-off-by: Dudi Maroshi <d...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
M 
frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
7 files changed, 66 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/25/40825/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
index 5a39cc2..0d4d44d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
@@ -637,6 +637,14 @@
             return false;
         }
 
+        // validate NUMA nodes count not more then CPUs
+        if (getParameters().getVm().getMigrationSupport() == 
MigrationSupport.PINNED_TO_HOST &&
+                
!validate(VmHandler.checkVmNumaNodesIntegrity(getParameters().getVm(),
+                        getParameters().getVm(),
+                        getParameters().isUpdateNuma()))) {
+            return false;
+        }
+
         return true;
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
index 8d2ae81..fbdf0e8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
@@ -635,6 +635,12 @@
                 getVmId()))) {
             return false;
         }
+        if (getParameters().getVm().getMigrationSupport() == 
MigrationSupport.PINNED_TO_HOST &&
+                
!validate(VmHandler.checkVmNumaNodesIntegrity(getParameters().getVm(),
+                        getVm(),
+                        getParameters().isUpdateNuma()))) {
+            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 91f3709..dd14e75 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
@@ -873,8 +873,52 @@
     }
 
     /**
-     * preferred supports single pinned vnuma node (without that VM fails to 
run in libvirt).
-     * used by add/update VM commands
+     * Cannot have more vm NUMA nodes than vm CPU core
+     *
+     * @param isNumaChanged
+     */
+    public static ValidationResult checkVmNumaNodesIntegrity(VM paramsVm, VM 
actualVm, boolean isNumaChanged) {
+        /* calculate the actual NUMA nodes */
+        List<VmNumaNode> paramVmNumaNodes = paramsVm.getvNumaNodeList();
+        boolean emptyParamVmNumaNodes = (paramVmNumaNodes == null) || 
(paramVmNumaNodes.isEmpty());
+        /* origVmNumaNodes = NUMA nodes list prior to update. */
+        List<VmNumaNode> origVmNumaNodes =
+                
DbFacade.getInstance().getVmNumaNodeDAO().getAllVmNumaNodeByVmId(actualVm.getId());
+        boolean emptyOrigVmNumaNodes = (origVmNumaNodes == null) || 
(origVmNumaNodes.isEmpty());
+
+        int NUMAnodesCount = 0;
+
+        /* return valid if no NUMA nodes */
+        if (emptyParamVmNumaNodes && emptyOrigVmNumaNodes) {
+            return ValidationResult.VALID;
+        }
+        /* if no NUMA nodes in parameters, but there are NUMA nodes in 
previous vm */
+        if (emptyParamVmNumaNodes && !emptyOrigVmNumaNodes) {
+            /* REST-api always provide emptyParamVmNumaNodes */
+            /* REST-api modifies NUMA nodes via: 
addVmNumaNodeCommand/updateVmNumaNodeCommand */
+            /* count NUMA nodes in previous vm, by default */
+            NUMAnodesCount = origVmNumaNodes.size();
+            /* if GUI update to reset NUMA nodes */
+            if (isNumaChanged == true)
+                return ValidationResult.VALID; // no NUMA nodes.
+        }
+        if (!emptyParamVmNumaNodes) {// An update to NUMA nodes
+            NUMAnodesCount = paramVmNumaNodes.size();
+        }
+
+        int cpuCount = paramsVm.getNumOfCpus(); // REST-api assigns cpuCount 
to parameters.
+        if (cpuCount < NUMAnodesCount) {
+            return new 
ValidationResult(VdcBllMessages.VM_NUMA_NODE_MORE_NODES_THAN_CPUS,
+                    String.format("$numaNodes %d", NUMAnodesCount),
+                    String.format("$cpus %d", cpuCount));
+        }
+
+        return ValidationResult.VALID;
+    }
+
+    /**
+     * preferred supports single pinned vnuma node (without that VM fails to 
run in libvirt). used by add/update VM
+     * commands
      */
     public static ValidationResult checkNumaPreferredTuneMode(NumaTuneMode 
numaTuneMode,
             List<VmNumaNode> vmNumaNodes,
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index 61e6c9a..bea7b2f 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -395,6 +395,7 @@
     VM_NUMA_NODE_PINNED_INDEX_ERROR(ErrorType.BAD_PARAMETERS),
     VM_NUMA_NODE_MEMRORY_ERROR(ErrorType.BAD_PARAMETERS),
     VM_NUMA_NODE_PREFERRED_NOT_PINNED_TO_SINGLE_NODE(ErrorType.BAD_PARAMETERS),
+    VM_NUMA_NODE_MORE_NODES_THAN_CPUS(ErrorType.BAD_PARAMETERS),
     CANNOT_PREVIEW_ACTIVE_SNAPSHOT(ErrorType.BAD_PARAMETERS),
     VM_CANNOT_SUSPENDE_HAS_RUNNING_TASKS(ErrorType.CONFLICT),
     VM_CANNOT_REMOVE_HAS_RUNNING_TASKS(ErrorType.CONFLICT),
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
index ece031f..2b4553f 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -719,6 +719,7 @@
 VM_NUMA_NODE_PINNED_INDEX_ERROR=NUMA node pinned index error.
 VM_NUMA_NODE_MEMRORY_ERROR=NUMA node memory error.
 VM_NUMA_NODE_PREFERRED_NOT_PINNED_TO_SINGLE_NODE=Preferred NUMA tune mode is 
allowed for a single pinned Virtual NUMA Node.
+VM_NUMA_NODE_MORE_NODES_THAN_CPUS=Cannot ${action} ${type}. Assigned 
${numaNodes} NUMA nodes for ${cpus} CPU cores. Cannot assign more NUMA nodes 
than CPU cores.
 ACTION_TYPE_FAILED_TEMPLATE_NOT_FOUND_ON_EXPORT_DOMAIN=Cannot export VM. 
Template ${TemplateName} does not exist on the export domain. if you want to 
export VM without its Template please use TemplateMustExists=false
 ACTION_TYPE_FAILED_VM_NOT_FOUND_ON_EXPORT_DOMAIN=Cannot delete VM, VM not 
exists in export domain
 ACTION_NOT_SUPPORTED_FOR_CLUSTER_POOL_LEVEL=The Action ${action} ${type} is 
not supported for this Cluster or Data Center compatibility version
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
index 667bfd3..7a73682 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
@@ -3294,6 +3294,9 @@
     @DefaultStringValue("Preferred NUMA tune mode is allowed for a single 
pinned Virtual NUMA Node.")
     String VM_NUMA_NODE_PREFERRED_NOT_PINNED_TO_SINGLE_NODE();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Assigned ${numaNodes} NUMA 
nodes for ${cpus} CPU cores. Cannot assign more NUMA nodes than CPU cores.")
+    String VM_NUMA_NODE_MORE_NODES_THAN_CPUS();
+
     @DefaultStringValue("$detailMessage it is not a Hosted Engine host.")
     String VAR__DETAIL__NOT_HE_HOST();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
index 8a761d7..a2bbcb2 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
+++ 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
@@ -1250,3 +1250,4 @@
 CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS=The guest OS doesn't support the 
following CPUs: ${unsupportedCpus}. Its possible to change the cluster cpu or 
set a different one per VM
 
 BALLOON_REQUESTED_ON_NOT_SUPPORTED_ARCH=Cannot ${action} ${type}. Balloon is 
not supported on '${clusterArch}' architecture.
+VM_NUMA_NODE_MORE_NODES_THAN_CPUS=Cannot ${action} ${type}. Assigned 
${numaNodes} NUMA nodes for ${cpus} CPU cores. Cannot assign more NUMA nodes 
than CPU cores.


-- 
To view, visit https://gerrit.ovirt.org/40825
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4589721f3d9fa76509d2931b351c5517c06df334
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5.3
Gerrit-Owner: Dudi Maroshi <d...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to