Martin Sivák has uploaded a new change for review.

Change subject: engine: Improve messages in scheduling
......................................................................

engine: Improve messages in scheduling

Add a way of adding more detailed explanations to the host
was filtered out messages.

Also change the message for the situation where no host
was available from the beginning.

Change-Id: I0d3c4d50c3a7a8cd11b46b19c1167daace8461be
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1077627
Signed-off-by: Martin Sivak <msi...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CPUPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CpuLevelFilterPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/HostedEngineHAClusterFilterPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MigrationPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PinToHostPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityFilterPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityWeightPolicyUnit.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PerHostMessages.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.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/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
M 
frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
18 files changed, 192 insertions(+), 51 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/20/26620/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java
index be1ae71..9d9b5dd 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java
@@ -29,6 +29,7 @@
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 import org.ovirt.engine.core.common.scheduling.PolicyUnitType;
 import org.ovirt.engine.core.common.utils.Pair;
@@ -118,7 +119,7 @@
         this.policyUnit = policyUnit;
     }
 
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, PerHostMessages messages) {
         log.error("policy unit:" + getPolicyUnit().getName() + "filter is not 
implemented");
         return hosts;
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
index 550d65e..d6c0909 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java
@@ -33,6 +33,7 @@
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.scheduling.ClusterPolicy;
 import org.ovirt.engine.core.common.scheduling.OptimizationType;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.compat.Guid;
@@ -182,12 +183,14 @@
     private static class SchedulingResult {
         Map<Guid, Pair<VdcBllMessages, String>> filteredOutReasons;
         Map<Guid, String> hostNames;
+        PerHostMessages details;
         String message;
         Guid vdsSelected = null;
 
         public SchedulingResult() {
-            filteredOutReasons = new HashMap<Guid, Pair<VdcBllMessages, 
String>>();
+            filteredOutReasons = new HashMap<>();
             hostNames = new HashMap<>();
+            details = new PerHostMessages();
         }
 
         public Guid getVdsSelected() {
@@ -199,7 +202,7 @@
         }
 
         public void addReason(Guid id, String hostName, VdcBllMessages 
filterType, String filterName) {
-            filteredOutReasons.put(id, new Pair<VdcBllMessages, 
String>(filterType, filterName));
+            filteredOutReasons.put(id, new Pair<>(filterType, filterName));
             hostNames.put(id, hostName);
         }
 
@@ -214,10 +217,22 @@
                 lines.add(line.getValue().getFirst().name());
                 lines.add(String.format("$%1$s %2$s", "hostName", 
hostNames.get(line.getKey())));
                 lines.add(String.format("$%1$s %2$s", "filterName", 
line.getValue().getSecond()));
-                
lines.add(VdcBllMessages.SCHEDULING_HOST_FILTERED_REASON.name());
+
+                final List<String> detailMessages = 
details.getMessages(line.getKey());
+                if (detailMessages == null || detailMessages.isEmpty()) {
+                    
lines.add(VdcBllMessages.SCHEDULING_HOST_FILTERED_REASON.name());
+                }
+                else {
+                    lines.addAll(detailMessages);
+                    
lines.add(VdcBllMessages.SCHEDULING_HOST_FILTERED_REASON_WITH_DETAIL.name());
+                }
             }
 
             return lines;
+        }
+
+        private PerHostMessages getDetails() {
+            return details;
         }
 
         public String getMessage() {
@@ -450,8 +465,15 @@
             }
         }
 
+        /* Short circuit filters if there are no hosts at all */
+        if (hostList == null || hostList.isEmpty()) {
+            messages.add(VdcBllMessages.SCHEDULING_NO_HOSTS.name());
+            messages.addAll(result.getReasonMessages());
+            return hostList;
+        }
+
         hostList =
-                runInternalFilters(internalFilters, hostList, vm, parameters, 
filterPositionMap, messages,
+                runInternalFilters(internalFilters, hostList, vm, parameters, 
filterPositionMap,
                         memoryChecker, correlationId, result);
 
         if (shouldRunExternalFilters
@@ -470,12 +492,12 @@
     }
 
     private List<VDS> runInternalFilters(ArrayList<PolicyUnitImpl> filters,
-            List<VDS> hostList,
-            VM vm,
-            Map<String, String> parameters,
-            Map<Guid, Integer> filterPositionMap,
-            List<String> messages, VdsFreeMemoryChecker memoryChecker,
-            String correlationId, SchedulingResult result) {
+                                         List<VDS> hostList,
+                                         VM vm,
+                                         Map<String, String> parameters,
+                                         Map<Guid, Integer> filterPositionMap,
+                                         VdsFreeMemoryChecker memoryChecker,
+                                         String correlationId, 
SchedulingResult result) {
         if (filters != null) {
             for (PolicyUnitImpl filterPolicyUnit : filters) {
                 if (hostList == null || hostList.isEmpty()) {
@@ -483,7 +505,7 @@
                 }
                 filterPolicyUnit.setMemoryChecker(memoryChecker);
                 List<VDS> currentHostList = new ArrayList<VDS>(hostList);
-                hostList = filterPolicyUnit.filter(hostList, vm, parameters, 
messages);
+                hostList = filterPolicyUnit.filter(hostList, vm, parameters, 
result.getDetails());
                 logFilterActions(currentHostList,
                         toIdSet(hostList),
                         VdcBllMessages.VAR__FILTERTYPE__INTERNAL,
@@ -506,11 +528,11 @@
     }
 
     private void logFilterActions(List<VDS> oldList,
-            Set<Guid> newSet,
-            VdcBllMessages actionName,
-            String filterName,
-            SchedulingResult result,
-            String correlationId) {
+                                  Set<Guid> newSet,
+                                  VdcBllMessages actionName,
+                                  String filterName,
+                                  SchedulingResult result,
+                                  String correlationId) {
         for (VDS host: oldList) {
             if (!newSet.contains(host.getId())) {
                 String reason =
@@ -519,11 +541,11 @@
                                 host.getId().toString(),
                                 actionName.name(),
                                 filterName);
+                result.addReason(host.getId(), host.getName(), actionName, 
filterName);
                 if (!StringUtils.isEmpty(correlationId)) {
                     reason = String.format("%s (correlation id: %s)", reason, 
correlationId);
                 }
                 log.info(reason);
-                result.addReason(host.getId(), host.getName(), actionName, 
filterName);
             }
         }
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CPUPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CPUPolicyUnit.java
index 6f85709..bcf9f74 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CPUPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CPUPolicyUnit.java
@@ -9,6 +9,7 @@
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 
 public class CPUPolicyUnit extends PolicyUnitImpl {
@@ -18,12 +19,12 @@
     }
 
     @Override
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, PerHostMessages messages) {
         List<VDS> list = new ArrayList<VDS>();
         for (VDS vds : hosts) {
             Integer cores = 
SlaValidator.getInstance().getEffectiveCpuCores(vds);
             if (cores != null && vm.getNumOfCpus() > cores) {
-                
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_CPUS.toString());
+                messages.addMessage(vds.getId(), 
VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_CPUS.toString());
                 log.debugFormat("host {0} has less cores ({1}) than vm cores 
({2})",
                         vds.getName(),
                         cores,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CpuLevelFilterPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CpuLevelFilterPolicyUnit.java
index 68cf380..989fd13 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CpuLevelFilterPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/CpuLevelFilterPolicyUnit.java
@@ -6,6 +6,7 @@
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 
 import java.util.ArrayList;
@@ -18,7 +19,8 @@
     }
 
     @Override
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters,
+                            PerHostMessages messages) {
         boolean filteredOutHosts = false;
         if (StringUtils.isNotEmpty(vm.getCpuName())) {
             List<VDS> hostsToRunOn = new ArrayList<VDS>();
@@ -37,13 +39,11 @@
                                 host.getName(),
                                 hostCpuName,
                                 vm.getCpuName());
-                        filteredOutHosts = true;
+                        messages.addMessage(host.getId(), 
String.format("$hostCPULevel %1$s", hostCpuName));
+                        messages.addMessage(host.getId(), 
String.format("$vmCPULevel %1$s", vm.getCpuName()));
+                        messages.addMessage(host.getId(), 
VdcBllMessages.VAR__DETAIL__LOW_CPU_LEVEL.toString());
                     }
                 }
-            }
-
-            if (filteredOutHosts) {
-                
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_CPU_LEVEL.toString());
             }
 
             return hostsToRunOn;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/HostedEngineHAClusterFilterPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/HostedEngineHAClusterFilterPolicyUnit.java
index ef3e95f..3fd0429 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/HostedEngineHAClusterFilterPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/HostedEngineHAClusterFilterPolicyUnit.java
@@ -4,6 +4,7 @@
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 
 import java.util.ArrayList;
@@ -16,7 +17,7 @@
     }
 
     @Override
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, PerHostMessages messages) {
 
         // The filter is relevant only for Hosted Engine VM
         if (vm.isHostedEngine()) {
@@ -31,11 +32,8 @@
                             haScore);
                 } else {
                     log.debugFormat("Host {0} was filtered out as it doesn't 
have a positive score (the score is {1})", host.getName(), haScore);
+                    messages.addMessage(host.getId(), 
VdcBllMessages.ACTION_TYPE_FAILED_NO_HA_VDS.name());
                 }
-            }
-
-            if (hostsToRunOn.isEmpty()) {
-                
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_NO_HA_VDS.name());
             }
 
             return hostsToRunOn;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
index cc1e5b9..208c6b7 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
@@ -11,6 +11,7 @@
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 
 public class MemoryPolicyUnit extends PolicyUnitImpl {
@@ -20,7 +21,7 @@
     }
 
     @Override
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, PerHostMessages messages) {
         List<VDS> list = new ArrayList<>();
         // If Vm in Paused mode - no additional memory allocation needed
         if (vm.getStatus() == VMStatus.Paused) {
@@ -29,12 +30,12 @@
         for (VDS vds : hosts) {
             if (!isVMSwapValueLegal(vds)) {
                 log.debugFormat("host '{0}' swap value is illegal", 
vds.getName());
-                
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_SWAP.toString());
+                messages.addMessage(vds.getId(), 
VdcBllMessages.VAR__DETAIL__SWAP_VALUE_ILLEGAL.toString());
                 continue;
             }
             if (!memoryChecker.evaluate(vds, vm)) {
                 log.debugFormat("host '{0}' has insufficient memory to run the 
VM", vds.getName());
-                
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_MEMORY.toString());
+                messages.addMessage(vds.getId(), 
VdcBllMessages.VAR__DETAIL__NOT_ENOUGH_MEMORY.toString());
                 continue;
             }
             list.add(vds);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MigrationPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MigrationPolicyUnit.java
index e6012fb..1b184a4 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MigrationPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MigrationPolicyUnit.java
@@ -6,6 +6,7 @@
 import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 
 public class MigrationPolicyUnit extends PolicyUnitImpl {
@@ -15,7 +16,7 @@
     }
 
     @Override
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, PerHostMessages messages) {
         if (vm.getRunOnVds() != null) {
             for (VDS host : hosts) {
                 if (host.getId().equals(vm.getRunOnVds())) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
index dd9788c..a9c5391 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
@@ -18,6 +18,7 @@
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
@@ -32,7 +33,7 @@
     }
 
     @Override
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, PerHostMessages messages) {
         if (hosts == null || hosts.isEmpty()) {
             return null;
         }
@@ -47,6 +48,7 @@
         Map<Guid, VdsNetworkInterface> hostDisplayNics = 
getDisplayNics(displayNetwork);
 
         for (VDS host : hosts) {
+            List<String> missingIfs = new ArrayList<>();
             ValidationResult result =
                     validateRequiredNetworksAvailable(host,
                             vm,
@@ -54,15 +56,14 @@
                             displayNetwork,
                             networksByName,
                             hostNics.get(host.getId()),
-                            hostDisplayNics.get(host.getId()));
+                            hostDisplayNics.get(host.getId()),
+                            missingIfs);
 
             if (!result.isValid()) {
-                messages.add(result.getMessage().name());
-                if (result.getVariableReplacements() != null) {
-                    messages.addAll(result.getVariableReplacements());
-                }
-
                 toRemoveHostList.add(host);
+                String nics = StringUtils.join(missingIfs, ", ");
+                messages.addMessage(host.getId(), String.format("$networkNames 
%1$s", nics));
+                messages.addMessage(host.getId(), 
VdcBllMessages.VAR__DETAIL__NETWORK_MISSING.name());
             }
         }
         hosts.removeAll(toRemoveHostList);
@@ -106,7 +107,8 @@
             Network displayNetwork,
             Map<String, Network> networksByName,
             List<String> hostNetworks,
-            VdsNetworkInterface displayNic) {
+            VdsNetworkInterface displayNic,
+            List<String> missingNetworks) {
 
         boolean onlyRequiredNetworks =
                 Config.<Boolean> 
getValue(ConfigValues.OnlyRequiredNetworksMandatoryForVdsSelection);
@@ -125,6 +127,9 @@
                 }
             }
             if (!found) {
+                if (missingNetworks != null) {
+                    missingNetworks.add(vmIf.getNetworkName());
+                }
                 StringBuilder sbBuilder = new StringBuilder();
                 
sbBuilder.append(Entities.vmInterfacesByNetworkName(vmNICs).keySet());
                 log.debugFormat("host {0} is missing networks required by VM 
nics {1}",
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PinToHostPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PinToHostPolicyUnit.java
index a66922d..c9a6eaa 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PinToHostPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PinToHostPolicyUnit.java
@@ -9,6 +9,7 @@
 import org.ovirt.engine.core.common.businessentities.MigrationSupport;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 
 public class PinToHostPolicyUnit extends PolicyUnitImpl {
@@ -18,7 +19,7 @@
     }
 
     @Override
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, PerHostMessages messages) {
         if (vm.getMigrationSupport() == MigrationSupport.PINNED_TO_HOST) {
             // host has been specified for pin to host.
             if(vm.getDedicatedVmForVds() != null) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityFilterPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityFilterPolicyUnit.java
index f514c93..5b2851e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityFilterPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityFilterPolicyUnit.java
@@ -1,6 +1,5 @@
 package org.ovirt.engine.core.bll.scheduling.policyunits;
 
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -8,12 +7,12 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.scheduling.AffinityGroup;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
@@ -27,14 +26,14 @@
     }
 
     @Override
-    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, List<String> messages) {
+    public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> 
parameters, PerHostMessages messages) {
         return getAcceptableHosts(true, hosts, vm, messages);
     }
 
     public static List<VDS> getAcceptableHosts(boolean enforcing,
             List<VDS> hosts,
             VM vm,
-            List<String> messages) {
+            PerHostMessages messages) {
         List<AffinityGroup> affinityGroups = 
getAffinityGroupDao().getAllAffinityGroupsByVmId(vm.getId());
         // no affinity groups found for VM return all hosts
         if (affinityGroups.isEmpty()) {
@@ -44,7 +43,6 @@
         Set<Guid> allVmIdsPositive = new HashSet<>();
         Set<Guid> allVmIdsNegative = new HashSet<>();
 
-        List<String> positiveAffinityGroupNames = new ArrayList<>();
         // Group by all vms in affinity groups per positive or negative
         for (AffinityGroup affinityGroup : affinityGroups) {
             if (affinityGroup.isEnforcing() == enforcing) {
@@ -54,7 +52,6 @@
                         continue;
                     }
                     if (affinityGroup.isPositive()) {
-                        
positiveAffinityGroupNames.add(affinityGroup.getName());
                         allVmIdsPositive.add(entityId);
                     } else {
                         allVmIdsNegative.add(entityId);
@@ -117,6 +114,12 @@
                     vm.getName(), vm.getId());
         }
 
+        // Report hosts that were removed because of violating the positive 
affinity rules
+        for (VDS host : hosts) {
+            if (!acceptableHosts.contains(host.getId())) {
+                messages.addMessage(host.getId(),
+                        String.format("$affinityRules %1$s", "")); // TODO 
compute the affinity rule names
+                messages.addMessage(host.getId(), 
VdcBllMessages.VAR__DETAIL__AFFINITY_FAILED_POSITIVE.toString());
             }
         }
 
@@ -126,6 +129,10 @@
             if (runVm != null && runVm.getRunOnVds() != null
                     && acceptableHosts.contains(runVm.getRunOnVds())) {
                 acceptableHosts.remove(runVm.getRunOnVds());
+                messages.addMessage(runVm.getRunOnVds(),
+                        String.format("$affinityRules %1$s", "")); // TODO 
compute the affinity rule names
+                messages.addMessage(runVm.getRunOnVds(),
+                        
VdcBllMessages.VAR__DETAIL__AFFINITY_FAILED_NEGATIVE.toString());
             }
         }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityWeightPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityWeightPolicyUnit.java
index af94936..a1341b7 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityWeightPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/VmAffinityWeightPolicyUnit.java
@@ -8,6 +8,7 @@
 import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.scheduling.PerHostMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
 import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.compat.Guid;
@@ -24,7 +25,7 @@
                 VmAffinityFilterPolicyUnit.getAcceptableHosts(false,
                         hosts,
                         vm,
-                        new ArrayList<String>());
+                        new PerHostMessages());
         Map<Guid, VDS> acceptableHostsMap = new HashMap<Guid, VDS>();
         if (acceptableHostsList != null) {
             for (VDS acceptableHost : acceptableHostsList) {
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 9ef0f6c..6b14f3c 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
@@ -931,7 +931,15 @@
     // scheduling
     VAR__FILTERTYPE__INTERNAL,
     VAR__FILTERTYPE__EXTERNAL,
+    VAR__DETAIL__NETWORK_MISSING,
+    VAR__DETAIL__AFFINITY_FAILED_POSITIVE,
+    VAR__DETAIL__AFFINITY_FAILED_NEGATIVE,
+    VAR__DETAIL__LOW_CPU_LEVEL,
+    VAR__DETAIL__SWAP_VALUE_ILLEGAL,
+    VAR__DETAIL__NOT_ENOUGH_MEMORY,
+    SCHEDULING_NO_HOSTS,
     SCHEDULING_HOST_FILTERED_REASON,
+    SCHEDULING_HOST_FILTERED_REASON_WITH_DETAIL,
     SCHEDULING_ALL_HOSTS_FILTERED_OUT(ErrorType.CONFLICT),
 
     // memory QOS features
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PerHostMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PerHostMessages.java
new file mode 100644
index 0000000..53e7c04
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PerHostMessages.java
@@ -0,0 +1,46 @@
+package org.ovirt.engine.core.common.scheduling;
+
+import org.ovirt.engine.core.compat.Guid;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PerHostMessages {
+    Map<Guid, List<String>> messages;
+
+    public PerHostMessages() {
+        messages = new HashMap<Guid, List<String>>();
+    }
+
+    public void addMessage(Guid hostId, String message) {
+        ensureHost(hostId);
+        messages.get(hostId).add(message);
+    }
+
+    private void ensureHost(Guid hostId) {
+        if (!messages.containsKey(hostId)) {
+            messages.put(hostId, new ArrayList<String>());
+        }
+    }
+
+    public void addMessages(Guid hostId, Collection<? extends String> message) 
{
+        ensureHost(hostId);
+        messages.get(hostId).addAll(message);
+    }
+
+    public Map<Guid, List<String>> getMessages() {
+        return messages;
+    }
+
+    public List<String> getMessages(Guid hostId) {
+        if (messages.containsKey(hostId)) {
+            return messages.get(hostId);
+        }
+        else {
+            return null;
+        }
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java
index 1583ca6..dbad619 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/scheduling/PolicyUnit.java
@@ -162,4 +162,5 @@
         }
         return true;
     }
+
 }
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 176433d..8ad432a 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -1139,6 +1139,14 @@
 
 SCHEDULING_ALL_HOSTS_FILTERED_OUT=Cannot ${action} ${type}. There is no host 
that satisfies current scheduling constraints. See below for details:
 SCHEDULING_HOST_FILTERED_REASON=The host ${hostName} did not satisfy 
${filterType} filter ${filterName}.
+SCHEDULING_HOST_FILTERED_REASON_WITH_DETAIL=The host ${hostName} did not 
satisfy ${filterType} filter ${filterName} because ${detailMessage}.
+VAR__DETAIL__NETWORK_MISSING=$detailMessage network(s) ${networkNames} are 
missing
+VAR__DETAIL__AFFINITY_FAILED_POSITIVE=$detailMessage it did not match positive 
affinity rules ${affinityRules}
+VAR__DETAIL__AFFINITY_FAILED_NEGATIVE=$detailMessage it matched negative 
affinity rules ${affinityRules}
+VAR__DETAIL__LOW_CPU_LEVEL=$detailMessage its CPU level ${hostCPULevel} is 
lower than the VM requires ${vmCPULevel}
+VAR__DETAIL__SWAP_VALUE_ILLEGAL=$detailMessage its swap value was illegal
+VAR__DETAIL__NOT_ENOUGH_MEMORY=$detailMessage it has insufficient free memory 
to run the VM
+SCHEDULING_NO_HOSTS=There are no hosts to use. Check that the cluster contains 
at least one host in Up state.
 VAR__FILTERTYPE__EXTERNAL=$filterType external
 VAR__FILTERTYPE__INTERNAL=$filterType internal
 POWER_MANAGEMENT_ACTION_ON_ENTITY_ALREADY_IN_PROGRESS=Cannot perform 
${action}. Another power management action is already in progress.
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 b5c1784..e5bcd89 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
@@ -3052,6 +3052,30 @@
     @DefaultStringValue("Cannot ${action} ${type}. There is no host that 
satisfies current scheduling constraints. See below for details:")
     String SCHEDULING_ALL_HOSTS_FILTERED_OUT();
 
+    @DefaultStringValue("The host ${hostName} did not satisfy ${filterType} 
filter ${filterName} because ${detailMessage}.")
+    String SCHEDULING_HOST_FILTERED_REASON_WITH_DETAIL();
+
+    @DefaultStringValue("$detailMessage network(s) ${networkNames} are 
missing")
+    String VAR__DETAIL__NETWORK_MISSING();
+
+    @DefaultStringValue("$detailMessage its CPU level ${hostCPULevel} is lower 
than the VM requires ${vmCPULevel}")
+    String VAR__DETAIL__LOW_CPU_LEVEL();
+
+    @DefaultStringValue("$detailMessage it did not match positive affinity 
rules ${affinityRules}")
+    String VAR__DETAIL__AFFINITY_FAILED_POSITIVE();
+
+    @DefaultStringValue("$detailMessage it matched negative affinity rules 
${affinityRules}")
+    String VAR__DETAIL__AFFINITY_FAILED_NEGATIVE();
+
+    @DefaultStringValue("$detailMessage its swap value was illegal")
+    String VAR__DETAIL__SWAP_VALUE_ILLEGAL();
+
+    @DefaultStringValue("$detailMessage it has insufficient free memory to run 
the VM")
+    String VAR__DETAIL__NOT_ENOUGH_MEMORY();
+
+    @DefaultStringValue("There are no hosts to use. Check that the cluster 
contains at least one host in Up state.")
+    String SCHEDULING_NO_HOSTS();
+
     @DefaultStringValue("Cannot perform ${action}. Another power management 
action is already in progress.")
     String POWER_MANAGEMENT_ACTION_ON_ENTITY_ALREADY_IN_PROGRESS();
 
diff --git 
a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
 
b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
index a2b07da..bc90792 100644
--- 
a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
+++ 
b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
@@ -982,6 +982,14 @@
 
 SCHEDULING_ALL_HOSTS_FILTERED_OUT=Cannot ${action} ${type}. There is no host 
that satisfies current scheduling constraints. See below for details:
 SCHEDULING_HOST_FILTERED_REASON=The host ${hostName} did not satisfy 
${filterType} filter ${filterName}.
+SCHEDULING_HOST_FILTERED_REASON_WITH_DETAIL=The host ${hostName} did not 
satisfy ${filterType} filter ${filterName} because ${detailMessage}.
+VAR__DETAIL__NETWORK_MISSING=$detailMessage network(s) ${networkNames} are 
missing
+VAR__DETAIL__AFFINITY_FAILED_POSITIVE=$detailMessage it did not match positive 
affinity rules ${affinityRules}
+VAR__DETAIL__AFFINITY_FAILED_NEGATIVE=$detailMessage it matched negative 
affinity rules ${affinityRules}
+VAR__DETAIL__LOW_CPU_LEVEL=$detailMessage its CPU level ${hostCPULevel} is 
lower than the VM requires ${vmCPULevel}
+VAR__DETAIL__SWAP_VALUE_ILLEGAL=$detailMessage its swap value was illegal
+VAR__DETAIL__NOT_ENOUGH_MEMORY=$detailMessage it has insufficient free memory 
to run the VM
+SCHEDULING_NO_HOSTS=There are no hosts to use. Check that the cluster contains 
at least one host in Up state.
 VAR__FILTERTYPE__EXTERNAL=$filterType external
 VAR__FILTERTYPE__INTERNAL=$filterType internal
 POWER_MANAGEMENT_ACTION_ON_ENTITY_ALREADY_IN_PROGRESS=Cannot perform 
${action}. Another power management action is already in progress.
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 be68147..a76108a 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
@@ -1110,6 +1110,14 @@
 
 SCHEDULING_ALL_HOSTS_FILTERED_OUT=Cannot ${action} ${type}. There is no host 
that satisfies current scheduling constraints. See below for details:
 SCHEDULING_HOST_FILTERED_REASON=The host ${hostName} did not satisfy 
${filterType} filter ${filterName}.
+SCHEDULING_HOST_FILTERED_REASON_WITH_DETAIL=The host ${hostName} did not 
satisfy ${filterType} filter ${filterName} because ${detailMessage}.
+VAR__DETAIL__NETWORK_MISSING=$detailMessage network(s) ${networkNames} are 
missing
+VAR__DETAIL__AFFINITY_FAILED_POSITIVE=$detailMessage it did not match positive 
affinity rules ${affinityRules}
+VAR__DETAIL__AFFINITY_FAILED_NEGATIVE=$detailMessage it matched negative 
affinity rules ${affinityRules}
+VAR__DETAIL__LOW_CPU_LEVEL=$detailMessage its CPU level ${hostCPULevel} is 
lower than the VM requires ${vmCPULevel}
+VAR__DETAIL__SWAP_VALUE_ILLEGAL=$detailMessage its swap value was illegal
+VAR__DETAIL__NOT_ENOUGH_MEMORY=$detailMessage it has insufficient free memory 
to run the VM
+SCHEDULING_NO_HOSTS=There are no hosts to use. Check that the cluster contains 
at least one host in Up state.
 VAR__FILTERTYPE__EXTERNAL=$filterType external
 VAR__FILTERTYPE__INTERNAL=$filterType internal
 POWER_MANAGEMENT_ACTION_ON_ENTITY_ALREADY_IN_PROGRESS=Another power management 
action, ${action}, is already in progress.


-- 
To view, visit http://gerrit.ovirt.org/26620
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0d3c4d50c3a7a8cd11b46b19c1167daace8461be
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Martin Sivák <msi...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to