Revision 97936d51 htools/Ganeti/HTools/Cluster.hs
b/htools/Ganeti/HTools/Cluster.hs | ||
---|---|---|
113 | 113 |
type AllocNodes = Either [Ndx] [(Ndx, Ndx)] |
114 | 114 |
|
115 | 115 |
-- | The empty solution we start with when computing allocations. |
116 |
emptySolution :: AllocSolution |
|
117 |
emptySolution = AllocSolution { asFailures = [], asAllocs = 0 |
|
118 |
, asSolutions = [], asLog = [] } |
|
116 |
emptyAllocSolution :: AllocSolution
|
|
117 |
emptyAllocSolution = AllocSolution { asFailures = [], asAllocs = 0
|
|
118 |
, asSolutions = [], asLog = [] }
|
|
119 | 119 |
|
120 | 120 |
-- | The complete state for the balancing solution. |
121 | 121 |
data Table = Table Node.List Instance.List Score [Placement] |
... | ... | |
665 | 665 |
tryAlloc nl _ inst (Right ok_pairs) = |
666 | 666 |
let sols = foldl' (\cstate (p, s) -> |
667 | 667 |
concatAllocs cstate $ allocateOnPair nl inst p s |
668 |
) emptySolution ok_pairs |
|
668 |
) emptyAllocSolution ok_pairs
|
|
669 | 669 |
|
670 | 670 |
in if null ok_pairs -- means we have just one node |
671 | 671 |
then fail "Not enough online nodes" |
... | ... | |
674 | 674 |
tryAlloc nl _ inst (Left all_nodes) = |
675 | 675 |
let sols = foldl' (\cstate -> |
676 | 676 |
concatAllocs cstate . allocateOnSingle nl inst |
677 |
) emptySolution all_nodes |
|
677 |
) emptyAllocSolution all_nodes
|
|
678 | 678 |
in if null all_nodes |
679 | 679 |
then fail "No online nodes" |
680 | 680 |
else return $ annotateSolution sols |
... | ... | |
758 | 758 |
return (mnl, i, [Container.find x mnl], |
759 | 759 |
compCV mnl) |
760 | 760 |
in concatAllocs cstate em |
761 |
) emptySolution valid_idxes |
|
761 |
) emptyAllocSolution valid_idxes
|
|
762 | 762 |
in return sols1 |
763 | 763 |
|
764 | 764 |
tryReloc _ _ _ reqn _ = fail $ "Unsupported number of relocation \ |
... | ... | |
819 | 819 |
-> [Ndx] -- ^ Restricted nodes (the ones being evacuated) |
820 | 820 |
-> m AllocSolution -- ^ Solution list |
821 | 821 |
tryEvac nl il idxs ex_ndx = do |
822 |
(_, sol) <- foldM (evacInstance ex_ndx il) (nl, emptySolution) idxs |
|
822 |
(_, sol) <- foldM (evacInstance ex_ndx il) (nl, emptyAllocSolution) idxs
|
|
823 | 823 |
return sol |
824 | 824 |
|
825 | 825 |
-- | Multi-group evacuation of a list of nodes. |
... | ... | |
836 | 836 |
in do |
837 | 837 |
results <- mapM (\(_, (gnl, gil, idxs)) -> tryEvac gnl gil idxs ex_ndx) |
838 | 838 |
all_insts' |
839 |
let sol = foldl' sumAllocs emptySolution results |
|
839 |
let sol = foldl' sumAllocs emptyAllocSolution results
|
|
840 | 840 |
return $ annotateSolution sol |
841 | 841 |
|
842 | 842 |
-- | Recursively place instances on the cluster until we're out of space. |
Also available in: Unified diff