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/1196235

Change-Id: I4589721f3d9fa76509d2931b351c5517c06df334
Signed-off-by: Dudi Maroshi <d...@redhat.com>
---
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
6 files changed, 41 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/17/39317/1

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 150fece..0e583a7 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
@@ -691,6 +691,9 @@
                 getVmId()))) {
             return false;
         }
+        if (getParameters().getVm().getMigrationSupport() == 
MigrationSupport.PINNED_TO_HOST &&
+                
!validate(VmHandler.checkVmNumaNodesIntegrity(getParameters().getVm(), 
getVm())))
+            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 f097aca..b2a7b37 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
@@ -860,8 +860,34 @@
     }
 
     /**
-     * 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 then vm CPU cores
+     */
+    public static ValidationResult checkVmNumaNodesIntegrity(VM paramsVm, VM 
actualVm) {
+        List<VmNumaNode> vmNumaNodes = paramsVm.getvNumaNodeList();
+        if (vmNumaNodes == null || vmNumaNodes.isEmpty()){ // no NUMA nodes 
from parameters (empty parameter)
+            // try getting the actual vm NUMA nodes from database
+            vmNumaNodes = 
DbFacade.getInstance().getVmNumaNodeDAO().getAllVmNumaNodeByVmId(actualVm.getId());
+        }
+
+        if (vmNumaNodes == null || vmNumaNodes.isEmpty()) // no NUMA nodes
+            return ValidationResult.VALID;
+
+        int cpuCount = paramsVm.getNumOfCpus();
+        if (cpuCount == 0) // no CPU count from parameters (empty parameter)
+            cpuCount = actualVm.getNumOfCpus();
+
+        if (cpuCount < vmNumaNodes.size()) {
+            return new 
ValidationResult(VdcBllMessages.VM_NUMA_NODE_MORE_NODES_THEN_CPUS,
+                    String.format("$numaNodes %d", vmNumaNodes.size()),
+                    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 65f70b2..cdbf5f6 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
@@ -417,6 +417,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_THEN_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),
@@ -1181,7 +1182,7 @@
 
     private ErrorType messageType;
 
-            VdcBllMessages() {
+    VdcBllMessages() {
         this.messageType = null;
     }
 
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 80a75a1..990aa8e 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -746,6 +746,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_THEN_CPUS=Cannot ${action} ${type}. Assigned 
${numaNodes} NUMA nodes for ${cpus} CPU cores. Cannot assign more NUMA nodes 
then 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 58a9e8a..0feacba 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
@@ -3208,6 +3208,7 @@
 
     @DefaultStringValue("Cannot ${action} ${type}. Geo-replication session is 
paused.")
     String ACTION_TYPE_FAILED_GEOREP_SESSION_ALREADY_PAUSED();
+
     @DefaultStringValue("Cannot ${action} ${type}. Cannot set the 
configuration.")
     String ACTION_TYPE_FAILED_GLUSTER_GEOREP_CONFIG_SET();
 
@@ -3514,6 +3515,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 then CPU cores.")
+    String VM_NUMA_NODE_MORE_NODES_THEN_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 c8925a2..eb3db5d 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
@@ -1329,3 +1329,6 @@
 ACTION_TYPE_FAILED_PROVIDER_NOT_SUPPORTED=Cannot ${action} ${type}. The 
current type ${providerType} is not supported.
 ACTION_TYPE_FAILED_CINDER=Cannot ${action} ${type}. An error occurred on 
Cinder - '${cinderException}'.
 CANNOT_ADD_CINDER_DISK_VOLUME_LIMIT_EXCEEDED=Cannot ${action} ${type}. Maximum 
number of volumes allowed (${maxTotalVolumes}) exceeded - could not create 
Cinder disk ${diskAlias}.
+
+VM_NUMA_NODE_MORE_NODES_THEN_CPUS=Cannot ${action} ${type}. Assigned 
${numaNodes} NUMA nodes for ${cpus} CPU cores. Cannot assign more NUMA nodes 
then CPU cores.
+


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4589721f3d9fa76509d2931b351c5517c06df334
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
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