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