On Thu, Jul 23, 2015 at 07:34:06PM +0200, 'Klaus Aehlig' via ganeti-devel wrote:
By filtering node indices to the allowed set, as well as
instances according to their primary and, if present, secondary
nodes.

Signed-off-by: Klaus Aehlig <[email protected]>
---
src/Ganeti/HTools/Cluster.hs | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/Ganeti/HTools/Cluster.hs b/src/Ganeti/HTools/Cluster.hs
index 198f862..490aca2 100644
--- a/src/Ganeti/HTools/Cluster.hs
+++ b/src/Ganeti/HTools/Cluster.hs
@@ -86,6 +86,7 @@ import Control.Applicative ((<$>), liftA2)
import Control.Arrow ((&&&))
import Control.Monad (unless)
import qualified Data.IntSet as IntSet
+import qualified Data.Set as Set
import Data.List
import Data.Maybe (fromJust, fromMaybe, isJust, isNothing)
import Data.Ord (comparing)
@@ -476,7 +477,13 @@ tryBalance opts ini_tbl =
        reloc_inst = filter (\i -> Instance.movable i &&
                                   Instance.autoBalance i) all_inst'
        node_idx = map Node.idx online_nodes
-        fin_tbl = checkMove opts node_idx ini_tbl reloc_inst
+        allowed_node = maybe (const True) (flip Set.member)
+                         $ algAllowedNodes opts
+        good_nidx = filter allowed_node node_idx
+        allowed_inst = liftA2 (&&) (allowed_node . Instance.pNode)
+                         (liftA2 (||) allowed_node (< 0) . Instance.sNode)
+        good_reloc_inst = filter allowed_inst reloc_inst
+        fin_tbl = checkMove opts good_nidx ini_tbl good_reloc_inst
        (Table _ _ fin_cv _) = fin_tbl
    in
      if fin_cv < ini_cv && (ini_cv > mg_limit || ini_cv - fin_cv >= min_gain)
--
2.4.3.573.g4eafbef


LGTM

Reply via email to