/**
* 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.refiner.createdir;
import edu.isi.pegasus.common.logging.LogManager;
import edu.isi.pegasus.planner.catalog.site.classes.SiteStore;
import edu.isi.pegasus.planner.classes.ADag;
import edu.isi.pegasus.planner.classes.Job;
import edu.isi.pegasus.planner.classes.PegasusBag;
import edu.isi.pegasus.planner.classes.TransferJob;
import edu.isi.pegasus.planner.partitioner.graph.Graph;
import edu.isi.pegasus.planner.partitioner.graph.GraphNode;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* The interface that defines how the cleanup job is invoked and created.
*
* @author Karan Vahi
* @version $Revision$
*/
public abstract class AbstractStrategy implements Strategy {
/**
* Constant suffix for the names of the create directory nodes.
*/
public static final String CREATE_DIR_SUFFIX = "_cdir";
/**
* Constant prefix for the names of the create directory nodes.
*/
public static final String CREATE_DIR_PREFIX = "create_dir_";
/**
* The handle to the logging object, that is used to log the messages.
*/
protected LogManager mLogger;
/**
* The job prefix that needs to be applied to the job file basenames.
*/
protected String mJobPrefix;
/**
* Whether we want to use dirmanager or mkdir directly.
*/
protected boolean mUseMkdir;
/**
* The implementation instance that is used to create a create dir job.
*/
protected Implementation mImpl;
/**
* The Site Store handle.
*/
protected SiteStore mSiteStore;
/**
* Intializes the class.
*
* @param bag bag of initialization objects
* @param impl the implementation instance that creates create dir job
*/
public void initialize( PegasusBag bag, Implementation impl ){
mImpl = impl;
mJobPrefix = bag.getPlannerOptions().getJobnamePrefix();
mLogger = bag.getLogger();
mSiteStore = bag.getHandleToSiteStore();
//in case of staging of executables/worker package
//we use mkdir directly
mUseMkdir = bag.getPegasusProperties().transferWorkerPackage();
}
/**
* It returns the name of the create directory job, that is to be assigned.
* The name takes into account the workflow name while constructing it, as
* that is thing that can guarentee uniqueness of name in case of deferred
* planning.
*
* @param dag the workflow to which the create dir jobs are being added.
* @param pool the execution pool for which the create directory job
* is responsible.
*
* @return String corresponding to the name of the job.
*/
public String getCreateDirJobName( ADag dag, String pool){
//sanity check
if( pool == null ){
return null;
}
StringBuffer sb = new StringBuffer();
sb.append( AbstractStrategy.CREATE_DIR_PREFIX );
//append the job prefix if specified in options at runtime
if ( mJobPrefix != null ) { sb.append( mJobPrefix ); }
sb.append( dag.getLabel() ).append("_").
append( dag.getIndex()).append("_");
//sb.append(pool).append(this.CREATE_DIR_SUFFIX);
sb.append( pool );
return sb.toString();
}
/**
* Retrieves the sites for which the create dir jobs need to be created.
* It returns all the sites where the compute jobs have been scheduled.
*
*
* @return a Set containing a list of siteID's of the sites where the
* dag has to be run.
*/
public static Set getCreateDirSites( ADag dag ){
Set set = new HashSet();
for( Iterator<GraphNode> it = dag.jobIterator();it.hasNext();){
GraphNode node = it.next();
Job job = (Job)node.getContent();
if( job.getJobType() == Job.CHMOD_JOB ){
//PM-845 staging site is always set to the associated
//compute jobs execution site
set.add( job.getStagingSiteHandle() );
//they are only created in the shared fs mode.
continue;
}
//add to the set only if the job is
//being run in the work directory
//this takes care of local site create dir
if( job.runInWorkDirectory()){
String site = job.getStagingSiteHandle();
//sanity check for remote transfer jobs
if( job instanceof TransferJob ){
site = ((TransferJob)job).getNonThirdPartySite();
}
//System.out.println( "Job staging site handle " + job.getID() + " " + site );
set.add( site );
}
}
//remove the stork pool
set.remove("stork");
return set;
}
}