/**
* Copyright 2007-2008 University Of Southern California
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.isi.pegasus.planner.selector.site;
import edu.isi.pegasus.planner.classes.Job;
import edu.isi.pegasus.planner.classes.PegasusBag;
import edu.isi.pegasus.common.logging.LogManager;
import edu.isi.pegasus.planner.selector.site.heft.HeftBag;
import edu.isi.pegasus.planner.selector.site.heft.Algorithm;
import edu.isi.pegasus.planner.partitioner.graph.GraphNode;
import java.util.List;
import java.util.Iterator;
import edu.isi.pegasus.planner.classes.ADag;
/**
* The HEFT based site selector. The runtime for the job in seconds is picked
* from the pegasus profile key runtime in the transformation catalog for a
* transformation.
*
* The data communication costs between jobs if scheduled on different sites
* is assumed to be fixed. Later on if required, the ability to specify this
* value will be exposed via properties.
*
* The number of processors in a site is picked by the attribute idle-nodes
* associated with the vanilla jobmanager for a site in the site catalog.
*
* @author Karan Vahi
* @version $Revision$
*
* @see Algorithm#AVERAGE_BANDWIDTH
* @see Algorithm#RUNTIME_PROFILE_KEY
* @see Algorithm#DEFAULT_NUMBER_OF_FREE_NODES
* @see Algorithm#AVERAGE_DATA_SIZE_BETWEEN_JOBS
* @see org.griphyn.cPlanner.classes.JobManager#IDLE_NODES
*/
public class Heft extends Abstract {
/**
* An instance of the class that implements the HEFT algorithm.
*/
private Algorithm mHeftImpl;
/**
* The default constructor.
*/
public Heft() {
super();
}
/**
* Initializes the site selector.
*
* @param bag the bag of objects that is useful for initialization.
*/
public void initialize( PegasusBag bag ){
super.initialize( bag );
mHeftImpl = new Algorithm( bag );
}
/**
* Maps the jobs in the workflow to the various grid sites.
* The jobs are mapped by setting the site handle for the jobs.
*
* @param workflow the workflow.
*
* @param sites the list of <code>String</code> objects representing the
* execution sites that can be used.
*/
public void mapWorkflow( ADag workflow, List sites ){
//PM-747 no need for conversion as ADag now implements Graph interface
this.mapWorkflow( workflow, sites, workflow.getLabel() );
}
/**
* Maps the jobs in the workflow to the various grid sites.
* The jobs are mapped by setting the site handle for the jobs.
*
* @param workflow the workflow in a Graph form.
*
* @param sites the list of <code>String</code> objects representing the
* execution sites that can be used.
*
* @param label the label of the workflow
*/
public void mapWorkflow( ADag workflow, List sites, String label ){
//schedule the workflow, till i fix the interface
mHeftImpl.schedule( workflow, sites, label );
//get the makespan of the workflow
mLogger.log( "Makespan of scheduled workflow is " + mHeftImpl.getMakespan() ,
LogManager.DEBUG_MESSAGE_LEVEL );
//iterate through the jobs and just set the site handle
//accordingly
for( Iterator it = workflow.nodeIterator(); it.hasNext(); ){
GraphNode node = ( GraphNode ) it.next();
Job job = ( Job ) node.getContent();
job.setSiteHandle( (String)node.getBag().get( HeftBag.SCHEDULED_SITE ) );
}
}
/**
* This method returns a String describing the site selection technique
* that is being implemented by the implementing class.
*
* @return String
*/
public String description() {
return "Heft based Site Selector";
}
}