/**
* 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.transfer;
import edu.isi.pegasus.planner.transfer.Refiner;
import edu.isi.pegasus.planner.classes.ADag;
import edu.isi.pegasus.planner.classes.PegasusBag;
import edu.isi.pegasus.planner.classes.Job;
import edu.isi.pegasus.planner.classes.PlannerOptions;
import edu.isi.pegasus.planner.common.PegasusProperties;
import edu.isi.pegasus.common.logging.LogManager;
import java.util.Collection;
import edu.isi.pegasus.planner.classes.FileTransfer;
import edu.isi.pegasus.planner.mapper.SubmitMapper;
import edu.isi.pegasus.planner.provenance.pasoa.XMLProducer;
import edu.isi.pegasus.planner.provenance.pasoa.producer.XMLProducerFactory;
/**
* An abstract implementation that implements some of the common functions
* in the Refiner Interface and member variables that are required by all the
* refiners.
*
* @author Karan Vahi
* @version $Revision$
*/
public abstract class AbstractRefiner implements Refiner{
/**
* The stage-in transfer implementation that the refiner requires.
*/
protected Implementation mTXStageInImplementation ;
/**
* The stage-in symbolic link transfer implementation that refiner requires.
*/
protected Implementation mTXSymbolicLinkImplementation;
/**
* The inter transfer implementation that the refiner requires.
*/
protected Implementation mTXInterImplementation ;
/**
* The stage-out transfer implementation that the refiner requires.
*/
protected Implementation mTXStageOutImplementation ;
/**
* The ADag object associated with the Dag. This is the object to
* which the transfer nodes are added. This object is initialised in the
* TransferEngine.
*/
protected ADag mDAG;
/**
* The handle to the properties object holding the properties relevant to
* Pegasus.
*/
protected PegasusProperties mProps;
/**
* The options passed to the planner at runtime.
*/
protected PlannerOptions mPOptions;
/**
* The logging object which is used to log all the messages.
*
*/
protected LogManager mLogger;
/**
* The handle to the Third Party State machinery.
*/
protected TPT mTPT;
/**
* The handle to the Remote Transfers State machinery.
*/
protected RemoteTransfer mRemoteTransfers;
/**
* The XML Producer object that records the actions.
*/
protected XMLProducer mXMLStore;
/**
* Handle to the Submit directory factory, that returns the relative
* submit directory for a job
*/
protected SubmitMapper mSubmitDirFactory;
/**
* The overloaded constructor.
*
* @param dag the workflow to which transfer nodes need to be added.
* @param bag the bag of initialization objects.
*/
public AbstractRefiner( ADag dag,
PegasusBag bag ){
mLogger = bag.getLogger();
mDAG = dag;
mProps = bag.getPegasusProperties();
mPOptions = bag.getPlannerOptions();
mTPT = new TPT( mProps );
mTPT.buildState();
mRemoteTransfers = new RemoteTransfer( mProps );
mRemoteTransfers.buildState();
mSubmitDirFactory = bag.getSubmitMapper();
mXMLStore = XMLProducerFactory.loadXMLProducer( mProps );
}
/**
* Returns a reference to the workflow that is being refined by the refiner.
*
*
* @return ADAG object.
*/
public ADag getWorkflow(){
return this.mDAG;
}
/**
* Default behaviour to preserve backward compatibility when the stage in
* and symbolic link jobs were not separated. The symlink transfer files
* are added back into the files collection and passed onto
* legacy implementations. Refiners that want to distinguish between
* symlink and stagein jobs should over ride this method.
*
* @param job <code>Job</code> object corresponding to the node to
* which the files are to be transferred to.
* @param files Collection of <code>FileTransfer</code> objects containing the
* information about source and destURL's.
* @param symlinkFiles Collection of <code>FileTransfer</code> objects containing
* source and destination file url's for symbolic linking
* on compute site.
*/
public void addStageInXFERNodes( Job job,
Collection<FileTransfer> files,
Collection<FileTransfer> symlinkFiles ){
files.addAll( symlinkFiles );
addStageInXFERNodes( job, files );
}
/**
* Default behaviour to preserve backward compatibility when the stage in
* and symbolic link jobs were not separated.
*
* @param job <code>Job</code> object corresponding to the node to
* which the files are to be transferred to.
* @param files Collection of <code>FileTransfer</code> objects containing the
* information about source and destURL's.
*/
public void addStageInXFERNodes( Job job,
Collection<FileTransfer> files ){
throw new UnsupportedOperationException(
"Refiner does not implement the function addStageInXFERNodes( SubInfo, Collection<FileTransfer>)");
}
/**
* Returns a reference to the XMLProducer, that generates the XML fragment
* capturing the actions of the refiner. This is used for provenace
* purposes.
*
* @return XMLProducer
*/
public XMLProducer getXMLProducer(){
return this.mXMLStore;
}
/**
* Boolean indicating whether the Transfer Refiner has a preference for
* where a transfer job is run. By default, Refiners dont advertise any
* preference as to where transfer jobs run.
*
* @return false
*/
public boolean refinerPreferenceForTransferJobLocation( ){
return false;
}
/**
* Boolean indicating Refiner preference for transfer jobs to run locally.
* This method should be called only if refinerPreferenceForTransferJobLocation
* is true for a refiner.
*
* @param type the type of transfer job for which the URL is being constructed.
* Should be one of the following:
* stage-in
* stage-out
* inter-pool transfer
*
* @return boolean refiner preference for transfer job to run locally or not.
*/
public boolean refinerPreferenceForLocalTransferJobs( int type ){
throw new UnsupportedOperationException( "Refiner does not advertise preference for local transfer jobs ");
}
/**
* Returns whether a Site prefers transfers to be run on it i.e remote transfers
* enabled.
*
* @param site the name of the site.
* @param type the type of transfer job for which the URL is being constructed.
* Should be one of the following:
* stage-in
* stage-out
* inter-pool transfer
*
* @return true if site is setup for remote transfers
*
* @see Job#STAGE_IN_JOB
* @see Job#INTER_POOL_JOB
* @see Job#STAGE_OUT_JOB
*/
public boolean runTransferRemotely( String site, int type ) {
Implementation implementation;
//the value from the properties file
//later on maybe picked up as profiles
boolean runTransferRemotely = false;
if(type == Job.STAGE_IN_JOB ){
implementation = mTXStageInImplementation;
runTransferRemotely = mRemoteTransfers.stageInOnRemoteSite( site );
}
else if(type == Job.INTER_POOL_JOB){
implementation = mTXInterImplementation;
runTransferRemotely = mRemoteTransfers.interOnRemoteSite( site );
}
else if(type == Job.STAGE_OUT_JOB){
implementation = mTXStageOutImplementation;
runTransferRemotely = mRemoteTransfers.stageOutOnRemoteSite( site );
}/*
else if(type == Job.SYMLINK_STAGE_IN_JOB){
implementation = mTXSymbolicLinkImplementation;
runTransferRemotely = true;
}*/
else{
throw new java.lang.IllegalArgumentException(
"Invalid implementation type passed " + type);
}
return runTransferRemotely;
}
/**
* Returns whether a Site is third party enabled or not.
*
* @param site the name of the site.
* @param type the type of transfer job for which the URL is being constructed.
* Should be one of the following:
* stage-in
* stage-out
* inter-pool transfer
*
* @return true pool is third party enabled
* false pool is not third party enabled.
*
* @see Job#STAGE_IN_JOB
* @see Job#INTER_POOL_JOB
* @see Job#STAGE_OUT_JOB
*
* @throws IllegalArgumentException
*/
public boolean isSiteThirdParty(String site,int type){
Implementation implementation;
//the value from the properties file
//later on maybe picked up as profiles
boolean useTPT = false;
if(type == Job.STAGE_IN_JOB ){
implementation = mTXStageInImplementation;
useTPT = mTPT.stageInThirdParty(site);
}
else if(type == Job.INTER_POOL_JOB){
implementation = mTXInterImplementation;
useTPT = mTPT.interThirdParty(site);
}
else if(type == Job.STAGE_OUT_JOB){
implementation = mTXStageOutImplementation;
useTPT = mTPT.stageOutThirdParty(site);
}/*
else if(type == Job.SYMLINK_STAGE_IN_JOB){
implementation = mTXSymbolicLinkImplementation;
useTPT = false;
}*/
else{
throw new java.lang.IllegalArgumentException(
"Invalid implementation type passed " + type);
}
return implementation.useThirdPartyTransferAlways()||
useTPT;
}
/**
* Returns whether the third party transfers for a particular site are to
* be run on the remote site or the submit host.
*
* @param site the name of the site.
* @param type the type of transfer job for which the URL is being constructed.
* Should be one of the following:
* stage-in
* stage-out
* inter-pool transfer
*
* @return true if the transfers are to be run on remote site, else false.
*
* @see Job#STAGE_IN_JOB
* @see Job#INTER_POOL_JOB
* @see Job#STAGE_OUT_JOB
*/
public boolean runTPTOnRemoteSite(String site,int type){
//Implementation implementation;
//the value from the properties file
//later on maybe picked up as profiles
boolean remoteTPT = false;
if(type == Job.STAGE_IN_JOB ){
//implementation = mTXStageInImplementation;
remoteTPT = mTPT.stageInThirdPartyRemote(site);
}
else if(type == Job.INTER_POOL_JOB){
//implementation = mTXInterImplementation;
remoteTPT = mTPT.interThirdPartyRemote(site);
}
else if(type == Job.STAGE_OUT_JOB){
//implementation = mTXStageOutImplementation;
remoteTPT = mTPT.stageOutThirdPartyRemote(site);
}
else{
throw new java.lang.IllegalArgumentException(
"Invalid implementation type passed " + type);
}
return remoteTPT;
}
/**
* Logs configuration messages regarding the type of implementations loaded
* for various type of transfer node creations.
*/
protected void logConfigMessages(){
//log a message
mLogger.log("Transfer Implementation loaded for Stage-In [" +
mTXStageInImplementation.getDescription() + "]",
LogManager.CONFIG_MESSAGE_LEVEL);
mLogger.log("Transfer Implementation loaded for symbolic linking Stage-In [" +
mTXSymbolicLinkImplementation.getDescription() + "]",
LogManager.CONFIG_MESSAGE_LEVEL);
mLogger.log("Transfer Implementation loaded for Inter Site [" +
mTXInterImplementation.getDescription() + "]",
LogManager.CONFIG_MESSAGE_LEVEL);
mLogger.log("Transfer Implementation loaded for Stage-Out [" +
mTXStageOutImplementation.getDescription() + "]",
LogManager.CONFIG_MESSAGE_LEVEL);
}
}