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

Reply via email to