/*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is available at http://www.abiquo.com/.....
*
* The Initial Developer of the Original Code is Soluciones Grid, S.L. (www.abiquo.com),
* Consell de Cent 296, Principal 2�, 08007 Barcelona, Spain.
*
* No portions of the Code have been created by third parties.
* All Rights Reserved.
*
* Contributor(s): ______________________________________.
*
* Graphical User Interface of this software may be used under the terms
* of the Common Public Attribution License Version 1.0 (the "CPAL License",
* available at http://cpal.abiquo.com/), in which case the
* provisions of CPAL License are applicable instead of those above. In relation
* of this portions of the Code, a Legal Notice according to Exhibits A and B of
* CPAL Licence should be provided in any distribution of the corresponding Code
* to Graphical User Interface.
*/
package com.abiquo.abiserver.scheduler.ranking;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.abiquo.abiserver.pojo.infrastructure.PhysicalMachine;
import org.apache.log4j.Logger;
import com.abiquo.abiserver.scheduler.SchedulerRestrictions;
/**
* Implements the abstract select using a PhysicalMachine heuristic ranking, for each
* PhysicalMachine on the candidate list is generated a ranking, then the highest ranking
* PhysicalMachine is selected.
*/
public abstract class RankingSchedulerRestriction extends SchedulerRestrictions
{
private final static Logger log = Logger.getLogger(RankingSchedulerRestriction.class);
private final static boolean isPrintRankEnable = true;
/**
* Generate an integer value representing PhysicalMachine goodness. Strategy pattern
* implementation.
*
* @param machine the PhysicalMachine to compute its rank
* @return an heuristic of the machine goodness (greater rank, better machine).
*/
abstract int computeRanking(PhysicalMachine machine);
@Override
public PhysicalMachine select(List<PhysicalMachine> candidateMachines)
{
return sortPhysicalMachines(candidateMachines).get(0).getMachine();
}
/**
* Compute rank for all candidate PhysicalMachines, the sort and return in decreasing order.
*/
private List<PhysicalMachineRanking> sortPhysicalMachines(
List<PhysicalMachine> candidateMachines)
{
List<PhysicalMachineRanking> ranking;
PhysicalMachineRanking rank;
ranking = new ArrayList<PhysicalMachineRanking>();
for (PhysicalMachine pm : candidateMachines)
{
rank = new PhysicalMachineRanking(pm);
rank.setRanking(computeRanking(pm));
ranking.add(rank);
}
Collections.sort(ranking);
if (isPrintRankEnable)
{
printRanking(ranking);
}
return ranking;
}
private void printRanking(List<PhysicalMachineRanking> ranking)
{
for (PhysicalMachineRanking nr : ranking)
{
log.debug(nr.getRanking() + "\t machine " + nr.getMachine().getName());
}
}
}
/**
* Maintains a PhysicalMachine and its rank (comparable throw rank property)
*/
class PhysicalMachineRanking implements Comparable<PhysicalMachineRanking>
{
PhysicalMachine machine;
int ranking;
public PhysicalMachineRanking(PhysicalMachine machine)
{
super();
this.machine = machine;
this.ranking = 0;
}
public PhysicalMachine getMachine()
{
return machine;
}
public int getRanking()
{
return ranking;
}
public void setRanking(int ranking)
{
this.ranking = ranking;
}
public int compareTo(PhysicalMachineRanking o)
{
return (o.getRanking() - ranking);
}
}