Noam Slomianko has uploaded a new change for review. Change subject: engine: ExternalScheduler change discover and balance ......................................................................
engine: ExternalScheduler change discover and balance Change the external scheduler integration to return the right types. Discover will now include a description and regex fields. A two new Class where created to represent the complex data. balance will also return a list of underutilised hosts. Change-Id: I98723ebd2dd73318acb9538d7cef595e1ff9912a Signed-off-by: Noam Slomianko <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBroker.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBrokerImpl.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerDiscoveryResult.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerDiscoveryUnit.java 4 files changed, 144 insertions(+), 25 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/23/17623/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBroker.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBroker.java index f91fc43..97fc455 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBroker.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBroker.java @@ -1,13 +1,12 @@ package org.ovirt.engine.core.bll.scheduling; -import java.util.HashMap; import java.util.List; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; public interface ExternalSchedulerBroker { - HashMap<String, List<String>> runDiscover(); + ExternalSchedulerDiscoveryResult runDiscover(); List<Guid> runFilters(List<String> filterNames, List<Guid> hostIDs, Guid vmID, String propertiesMap); @@ -16,6 +15,6 @@ Guid vmID, String propertiesMap); - Guid runBalance(String balanceName, List<Guid> hostIDs, String propertiesMap); + Pair<Guid, List<Guid>> runBalance(String balanceName, List<Guid> hostIDs, String propertiesMap); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBrokerImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBrokerImpl.java index 9167975..78cf7b4 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBrokerImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerBrokerImpl.java @@ -26,7 +26,7 @@ private static Object[] EMPTY = new Object[] {}; - private static Log log = LogFactory.getLog(LdapBrokerBase.class); + private static Log log = LogFactory.getLog(ExternalSchedulerBrokerImpl.class); private XmlRpcClient rpcClient = null; @@ -46,7 +46,7 @@ } @Override - public HashMap<String, List<String>> runDiscover() { + public ExternalSchedulerDiscoveryResult runDiscover() { try { Object result = rpcClient.execute(DISCOVER, EMPTY); return parseDiscoverResults(result); @@ -60,20 +60,10 @@ } } - private HashMap<String, List<String>> parseDiscoverResults(Object result) { - if (result == null || !(result instanceof HashMap)) { - log.error("External scheduler error, malformed discover results"); + private ExternalSchedulerDiscoveryResult parseDiscoverResults(Object result) { + ExternalSchedulerDiscoveryResult retValue = new ExternalSchedulerDiscoveryResult(); + if (!retValue.populate(result)) { return null; - } - HashMap<String, Object[]> castedResult = (HashMap<String, Object[]>) result; - // Its a list of host IDs - HashMap<String, List<String>> retValue = new HashMap<String, List<String>>(); - for (String key : castedResult.keySet()) { - List<String> values = new LinkedList<String>(); - for (Object o : castedResult.get(key)) { - values.add((String) o); - } - retValue.put(key, values); } return retValue; } @@ -185,7 +175,7 @@ } @Override - public Guid runBalance(String balanceName, List<Guid> hostIDs, String propertiesMap) { + public Pair<Guid, List<Guid>> runBalance(String balanceName, List<Guid> hostIDs, String propertiesMap) { // TODO Auto-generated method stub try { Object result = @@ -213,17 +203,21 @@ return sentObject; } - private Guid parseBalanceResults(Object result) { + private Pair<Guid, List<Guid>> parseBalanceResults(Object result) { if (result == null || !(result instanceof Object[])) { log.error("External scheduler error, malformed balance results"); return null; } Object[] castedResult = (Object[]) result; - if (castedResult.length != 1) { - // is it an error to get more then one vm to balance? - log.error("External scheduler error, malformed balance results"); - return null; + + List<Guid> hostIDs = new LinkedList<Guid>(); + for (Object hostID : (Object[]) castedResult[1]) { + hostIDs.add(new Guid(hostID.toString())); } - return new Guid(castedResult[0].toString()); + Pair<Guid, List<Guid>> retValue = new Pair<Guid, List<Guid>>(); + retValue.setFirst(new Guid(castedResult[0].toString())); + retValue.setSecond(hostIDs); + + return retValue; } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerDiscoveryResult.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerDiscoveryResult.java new file mode 100644 index 0000000..aa653d4 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerDiscoveryResult.java @@ -0,0 +1,94 @@ +package org.ovirt.engine.core.bll.scheduling; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; + +import org.ovirt.engine.core.utils.log.Log; +import org.ovirt.engine.core.utils.log.LogFactory; + + +public class ExternalSchedulerDiscoveryResult { + private static Log log = LogFactory.getLog(ExternalSchedulerDiscoveryResult.class); + private static final String FILTER = "filter"; + private static final String SCORE = "score"; + private static final String BALANCE = "balance"; + private List<ExternalSchedulerDiscoveryUnit> filters; + private List<ExternalSchedulerDiscoveryUnit> scores; + private List<ExternalSchedulerDiscoveryUnit> balance; + + ExternalSchedulerDiscoveryResult() { + filters = new LinkedList<ExternalSchedulerDiscoveryUnit>(); + scores = new LinkedList<ExternalSchedulerDiscoveryUnit>(); + balance = new LinkedList<ExternalSchedulerDiscoveryUnit>(); + } + + public boolean populate(Object xmlRpcRawResult) { + try { + if (xmlRpcRawResult == null || !(xmlRpcRawResult instanceof HashMap)) { + log.error("External scheduler error, malformed discover results"); + return false; + } + HashMap<String, HashMap<String, Object[]>> castedResult = (HashMap<String, HashMap<String, Object[]>>) xmlRpcRawResult; + + // keys will be filter, score and balance + for (String type : castedResult.keySet()) { + HashMap<String, Object[]> typeMap = castedResult.get(type); + List<ExternalSchedulerDiscoveryUnit> currentList = getRelevantList(type); + if (currentList == null) { + log.error("External scheduler error, got unknown type"); + return false; + } + // list of module names as keys and [description, regex] as value + for (String moduleName : typeMap.keySet()) { + Object[] singleModule = typeMap.get(moduleName); + ExternalSchedulerDiscoveryUnit currentUnit = new ExternalSchedulerDiscoveryUnit(moduleName, + singleModule[0].toString(), + singleModule[1].toString()); + currentList.add(currentUnit); + } + } + return true; + } catch (Exception e) { + log.error("External scheduler error, exception why parsing discovery results", e); + return false; + } + } + + private List<ExternalSchedulerDiscoveryUnit> getRelevantList(String type) { + switch (type) { + case FILTER: + return filters; + case SCORE: + return scores; + case BALANCE: + return balance; + default: + return null; + } + } + + List<ExternalSchedulerDiscoveryUnit> getFilters() { + return filters; + } + + void setFilters(List<ExternalSchedulerDiscoveryUnit> filters) { + this.filters = filters; + } + + List<ExternalSchedulerDiscoveryUnit> getScores() { + return scores; + } + + void setScores(List<ExternalSchedulerDiscoveryUnit> scores) { + this.scores = scores; + } + + List<ExternalSchedulerDiscoveryUnit> getBalance() { + return balance; + } + + void setBalance(List<ExternalSchedulerDiscoveryUnit> balance) { + this.balance = balance; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerDiscoveryUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerDiscoveryUnit.java new file mode 100644 index 0000000..7134861 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/ExternalSchedulerDiscoveryUnit.java @@ -0,0 +1,32 @@ +package org.ovirt.engine.core.bll.scheduling; + +public class ExternalSchedulerDiscoveryUnit{ + private String name; + private String description; + private String regex; + + public ExternalSchedulerDiscoveryUnit(String name, String description, String regex) { + this.name = name; + this.description = description; + this.regex = regex; + } + + FunctionType getType() { + return type; + } + + String getName() { + return name; + } + + String getDescription() { + return description; + } + + String getRegex() { + return regex; + } + +} + + -- To view, visit http://gerrit.ovirt.org/17623 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I98723ebd2dd73318acb9538d7cef595e1ff9912a Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Noam Slomianko <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
