Safe Haskell  SafeInfered 

Implementation of clusterwide logic.
This module holds all pure clusterlogic; I/O related functionality goes into the Main module for the individual binaries.
 data AllocDetails = AllocDetails Int (Maybe String)
 data GenericAllocSolution a = AllocSolution {
 asFailures :: [FailMode]
 asAllocs :: Int
 asSolution :: Maybe (GenericAllocElement a)
 asLog :: [String]
 type AllocSolution = GenericAllocSolution Score
 type AllocResult = (FailStats, List, List, [Instance], [CStats])
 type GenericAllocSolutionList a = [(Instance, GenericAllocSolution a)]
 type AllocSolutionList = GenericAllocSolutionList Score
 type AllocNodes = Either [Ndx] [(Ndx, [Ndx])]
 emptyAllocSolution :: GenericAllocSolution a
 data Table = Table List List Score [Placement]
 data CStats = CStats {
 csFmem :: Integer
 csFdsk :: Integer
 csFspn :: Integer
 csAmem :: Integer
 csAdsk :: Integer
 csAcpu :: Integer
 csMmem :: Integer
 csMdsk :: Integer
 csMcpu :: Integer
 csImem :: Integer
 csIdsk :: Integer
 csIspn :: Integer
 csIcpu :: Integer
 csTmem :: Double
 csTdsk :: Double
 csTspn :: Double
 csTcpu :: Double
 csVcpu :: Integer
 csNcpu :: Double
 csXmem :: Integer
 csNmem :: Integer
 csScore :: Score
 csNinst :: Int
 type AllocMethod = List > List > Maybe Int > Instance > AllocNodes > [Instance] > [CStats] > Result AllocResult
 verifyN1 :: [Node] > [Node]
 computeBadItems :: List > List > ([Node], [Instance])
 emptyCStats :: CStats
 updateCStats :: CStats > Node > CStats
 totalResources :: List > CStats
 computeAllocationDelta :: CStats > CStats > AllocStats
 getOnline :: List > [Node]
 compareTables :: Table > Table > Table
 allocateOnSingle :: AlgorithmOptions > List > Instance > Ndx > OpResult AllocElement
 allocateOnPair :: AlgorithmOptions > [Statistics] > List > Instance > Ndx > Ndx > OpResult AllocElement
 checkSingleStep :: Bool > Table > Instance > Table > IMove > Table
 possibleMoves :: MirrorType > Bool > Bool > Bool > (Bool, Bool) > Ndx > [IMove]
 checkInstanceMove :: AlgorithmOptions > [Ndx] > Table > Instance > Table
 checkMove :: AlgorithmOptions > [Ndx] > Table > [Instance] > Table
 doNextBalance :: Table > Int > Score > Bool
 tryBalance :: AlgorithmOptions > Table > Maybe Table
 collapseFailures :: [FailMode] > FailStats
 bestAllocElement :: Ord a => Maybe (GenericAllocElement a) > Maybe (GenericAllocElement a) > Maybe (GenericAllocElement a)
 concatAllocs :: Ord a => GenericAllocSolution a > OpResult (GenericAllocElement a) > GenericAllocSolution a
 sumAllocs :: Ord a => GenericAllocSolution a > GenericAllocSolution a > GenericAllocSolution a
 genericDescribeSolution :: (a > String) > GenericAllocSolution a > String
 genericAnnotateSolution :: (a > String) > GenericAllocSolution a > GenericAllocSolution a
 annotateSolution :: AllocSolution > AllocSolution
 genAllocNodes :: List > List > Int > Bool > Result AllocNodes
 tryAlloc :: Monad m => AlgorithmOptions > List > List > Instance > AllocNodes > m AllocSolution
 solutionDescription :: (Group, Result (GenericAllocSolution a)) > [String]
 filterMGResults :: [(Group, Result (GenericAllocSolution a))] > [(Group, GenericAllocSolution a)]
 sortMGResults :: Ord a => [(Group, GenericAllocSolution a)] > [(Group, GenericAllocSolution a)]
 hasRequiredNetworks :: Group > Instance > Bool
 filterValidGroups :: [(Group, (List, List))] > Instance > ([(Group, (List, List))], [String])
 findAllocation :: AlgorithmOptions > List > List > List > Gdx > Instance > Int > Result (AllocSolution, [String])
 findBestAllocGroup :: AlgorithmOptions > List > List > List > Maybe [Gdx] > Instance > Int > Result (Group, AllocSolution, [String])
 tryMGAlloc :: AlgorithmOptions > List > List > List > Instance > Int > Result AllocSolution
 tryGroupAlloc :: AlgorithmOptions > List > List > List > String > Instance > Int > Result AllocSolution
 updateIl :: List > Maybe (GenericAllocElement a) > List
 extractNl :: List > Maybe (GenericAllocElement a) > List
 allocList :: AlgorithmOptions > List > List > List > [(Instance, AllocDetails)] > AllocSolutionList > Result (List, List, AllocSolutionList)
 tryChangeGroup :: AlgorithmOptions > List > List > List > [Gdx] > [Idx] > Result (List, List, EvacSolution)
 iterateAlloc :: AlgorithmOptions > AllocMethod
 sufficesShrinking :: (Instance > AllocSolution) > Instance > FailMode > Maybe Instance
 tieredAlloc :: AlgorithmOptions > AllocMethod
 computeMoves :: Instance > String > IMove > String > String > (String, [String])
 printSolutionLine :: List > List > Int > Int > Placement > Int > (String, [String])
 involvedNodes :: List > Placement > [Ndx]
 getMoves :: (Table, Table) > [MoveJob]
 mergeJobs :: ([JobSet], [Ndx]) > MoveJob > ([JobSet], [Ndx])
 splitJobs :: [MoveJob] > [JobSet]
 formatJob :: Int > Int > (Int, MoveJob) > [String]
 formatCmds :: [JobSet] > String
 printNodes :: List > [String] > String
 printInsts :: List > List > String
 instanceGroup :: List > Instance > Result Gdx
 findSplitInstances :: List > List > [Instance]
Types
data AllocDetails Source
Allocation details for an instance, specifying required number of nodes, and an optional group (name) to allocate to
AllocDetails Int (Maybe String) 
Show AllocDetails 
data GenericAllocSolution a Source
Allocation/relocation solution.
AllocSolution  

type AllocResult = (FailStats, List, List, [Instance], [CStats])Source
Allocation results, as used in iterateAlloc
and tieredAlloc
.
type GenericAllocSolutionList a = [(Instance, GenericAllocSolution a)]Source
Type alias for easier handling.
type AllocNodes = Either [Ndx] [(Ndx, [Ndx])]Source
A type denoting the valid allocation mode/pairs.
For a onenode allocation, this will be a Left [
, whereas
for a twonode allocation, this will be a Ndx
]Right [(
. In the latter case, the list is basically an
association list, grouped by primary node and holding the potential
secondary nodes in the sublist.
Ndx
,
[Ndx
])]
emptyAllocSolution :: GenericAllocSolution aSource
The empty solution we start with when computing allocations.
The complete state for the balancing solution.
Show Table 
Cluster statistics data type.
CStats  

Show CStats 
type AllocMethodSource
= List  Node list 
> List  Instance list 
> Maybe Int  Optional allocation limit 
> Instance  Instance spec for allocation 
> AllocNodes  Which nodes we should allocate on 
> [Instance]  Allocated instances 
> [CStats]  Running cluster stats 
> Result AllocResult  Allocation result 
A simple type for allocation functions.
Utility functions
computeBadItems :: List > List > ([Node], [Instance])Source
Computes the pair of bad nodes and instances.
The bad node list is computed via a simple verifyN1
check, and the
bad instance list is the list of primary and secondary instances of
those nodes.
updateCStats :: CStats > Node > CStatsSource
totalResources :: List > CStatsSource
Compute the total free disk and memory in the cluster.
computeAllocationDelta :: CStats > CStats > AllocStatsSource
Compute the delta between two cluster state.
This is used when doing allocations, to understand better the available cluster resources. The return value is a triple of the current used values, the delta that was still allocated, and what was left unallocated.
Balancing functions
compareTables :: Table > Table > TableSource
allocateOnSingle :: AlgorithmOptions > List > Instance > Ndx > OpResult AllocElementSource
allocateOnPair :: AlgorithmOptions > [Statistics] > List > Instance > Ndx > Ndx > OpResult AllocElementSource
possibleMoves :: MirrorType > Bool > Bool > Bool > (Bool, Bool) > Ndx > [IMove]Source
checkInstanceMove :: AlgorithmOptions > [Ndx] > Table > Instance > TableSource
:: Table  The starting table 
> Int  Remaining length 
> Score  Score at which to stop 
> Bool  The resulting table and commands 
Check if we are allowed to go deeper in the balancing.
:: AlgorithmOptions  Algorithmic options for balancing 
> Table  The starting table 
> Maybe Table  The resulting table and commands 
Run a balance move.
Allocation functions
collapseFailures :: [FailMode] > FailStatsSource
Build failure stats out of a list of failures.
bestAllocElement :: Ord a => Maybe (GenericAllocElement a) > Maybe (GenericAllocElement a) > Maybe (GenericAllocElement a)Source
concatAllocs :: Ord a => GenericAllocSolution a > OpResult (GenericAllocElement a) > GenericAllocSolution aSource
Update current Allocation solution and failure stats with new elements.
sumAllocs :: Ord a => GenericAllocSolution a > GenericAllocSolution a > GenericAllocSolution aSource
Sums two AllocSolution
structures.
genericDescribeSolution :: (a > String) > GenericAllocSolution a > StringSource
genericAnnotateSolution :: (a > String) > GenericAllocSolution a > GenericAllocSolution aSource
Annotates a solution with the appropriate string.
:: List  Group list 
> List  The node map 
> Int  The number of nodes required 
> Bool  Whether to drop or not unallocable nodes 
> Result AllocNodes  The (monadic) result 
Generate the valid node allocation singles or pairs for a new instance.
:: Monad m  
=> AlgorithmOptions  
> List  The node list 
> List  The instance list 
> Instance  The instance to allocate 
> AllocNodes  The allocation targets 
> m AllocSolution  Possible solution list 
Try to allocate an instance on the cluster.
solutionDescription :: (Group, Result (GenericAllocSolution a)) > [String]Source
Given a group/result, describe it as a nice (list of) messages.
filterMGResults :: [(Group, Result (GenericAllocSolution a))] > [(Group, GenericAllocSolution a)]Source
From a list of possibly bad and possibly empty solutions, filter only the groups with a valid result. Note that the result will be reversed compared to the original list.
sortMGResults :: Ord a => [(Group, GenericAllocSolution a)] > [(Group, GenericAllocSolution a)]Source
Sort multigroup results based on policy and score.
hasRequiredNetworks :: Group > Instance > BoolSource
Determines if a group is connected to the networks required by the  instance.
filterValidGroups :: [(Group, (List, List))] > Instance > ([(Group, (List, List))], [String])Source
findAllocation :: AlgorithmOptions > List > List > List > Gdx > Instance > Int > Result (AllocSolution, [String])Source
findBestAllocGroup :: AlgorithmOptions > List > List > List > Maybe [Gdx] > Instance > Int > Result (Group, AllocSolution, [String])Source
:: AlgorithmOptions  
> List  The group list 
> List  The node list 
> List  The instance list 
> Instance  The instance to allocate 
> Int  Required number of nodes 
> Result AllocSolution  Possible solution list 
Try to allocate an instance on a multigroup cluster.
:: AlgorithmOptions  
> List  The group list 
> List  The node list 
> List  The instance list 
> String  The allocation group (name) 
> Instance  The instance to allocate 
> Int  Required number of nodes 
> Result AllocSolution  Solution 
Try to allocate an instance to a group.
:: List  The original instance list 
> Maybe (GenericAllocElement a)  The result of the allocation attempt 
> List  The updated instance list 
Calculate the new instance list after allocation solution.
:: List  The original node list 
> Maybe (GenericAllocElement a)  The result of the allocation attempt 
> List  The new node list 
Extract the the new node list from the allocation solution.
:: AlgorithmOptions  
> List  The group list 
> List  The node list 
> List  The instance list 
> [(Instance, AllocDetails)]  The instance to allocate 
> AllocSolutionList  Possible solution list 
> Result (List, List, AllocSolutionList)  The final solution list 
Try to allocate a list of instances on a multigroup cluster.
:: AlgorithmOptions  
> List  The cluster groups 
> List  The node list (clusterwide) 
> List  Instance list (clusterwide) 
> [Gdx]  Target groups; if empty, any groups not being evacuated 
> [Idx]  List of instance (indices) to be evacuated 
> Result (List, List, EvacSolution) 
Changegroup IAllocator mode main function.
This is very similar to tryNodeEvac
, the only difference is that
we don't choose as target group the current instance group, but
instead:
 at the start of the function, we compute which are the target groups; either no groups were passed in, in which case we choose all groups out of which we don't evacuate instance, or there were some groups passed, in which case we use those
 for each instance, we use
findBestAllocGroup
to choose the best group to hold the instance, and then we do whattryNodeEvac
does, except for this group instead of the current instance group.
Note that the correct behaviour of this function relies on the
function nodeEvacInstance
to be able to do correctly both
intragroup and intergroup moves when passed the ChangeAll
mode.
iterateAlloc :: AlgorithmOptions > AllocMethodSource
Standardsized allocation method.
This places instances of the same size on the cluster until we're out of space. The result will be a list of identicallysized instances.
sufficesShrinking :: (Instance > AllocSolution) > Instance > FailMode > Maybe InstanceSource
tieredAlloc :: AlgorithmOptions > AllocMethodSource
Tiered allocation method.
This places instances on the cluster, and decreases the spec until we can allocate again. The result will be a list of decreasing instance specs.
Formatting functions
computeMoves :: Instance > String > IMove > String > String > (String, [String])Source
:: List  The node list 
> List  The instance list 
> Int  Maximum node name length 
> Int  Maximum instance name length 
> Placement  The current placement 
> Int  The index of the placement in the solution 
> (String, [String]) 
Converts a placement to string format.
:: List  Instance list, used for retrieving the instance from its index; note that this must be the original instance list, so that we can retrieve the old nodes 
> Placement  The placement we're investigating, containing the new nodes and instance index 
> [Ndx]  Resulting list of node indices 
Return the instance and involved nodes in an instance move.
Note that the output list length can vary, and is not required nor guaranteed to be of any specific length.
getMoves :: (Table, Table) > [MoveJob]Source
From two adjacent cluster tables get the list of moves that transitions from to the other
splitJobs :: [MoveJob] > [JobSet]Source
Break a list of moves into independent groups. Note that this will reverse the order of jobs.
formatCmds :: [JobSet] > StringSource
Given a list of commands, prefix them with gntinstance
and
also beautify the display a little.
printNodes :: List > [String] > StringSource
Print the node list.
printInsts :: List > List > StringSource
Print the instance list.
Node group functions
findSplitInstances :: List > List > [Instance]Source
Compute the list of badly allocated instances (split across node groups).