/**
* 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.cleanup;
import edu.isi.pegasus.planner.catalog.site.classes.SiteStore;
import edu.isi.pegasus.planner.classes.Job;
import edu.isi.pegasus.planner.classes.PegasusFile;
import edu.isi.pegasus.planner.common.PegasusProperties;
import edu.isi.pegasus.planner.namespace.Condor;
import edu.isi.pegasus.planner.catalog.TransformationCatalog;
import edu.isi.pegasus.planner.catalog.transformation.TransformationCatalogEntry;
import edu.isi.pegasus.planner.catalog.transformation.classes.TCType;
import java.util.List;
import java.util.Iterator;
import java.util.HashSet;
import edu.isi.pegasus.planner.classes.PegasusBag;
/**
* Use's RM to do removal of the files on the remote sites.
*
* @author Karan Vahi
* @version $Revision$
*/
public class RM implements CleanupImplementation{
/**
* The default logical name to rm executable.
*/
public static final String DEFAULT_RM_LOGICAL_NAME = "rm";
/**
* The default path to rm executable.
*/
public static final String DEFAULT_RM_LOCATION = "/bin/rm";
/**
* The default priority key associated with the cleanup jobs.
*/
public static final String DEFAULT_PRIORITY_KEY = "1000";
/**
* The handle to the transformation catalog.
*/
protected TransformationCatalog mTCHandle;
/**
* Handle to the site catalog.
*/
// protected PoolInfoProvider mSiteHandle;
protected SiteStore mSiteStore;
/**
* The handle to the properties passed to Pegasus.
*/
private PegasusProperties mProps;
/**
* The default constructor.
*/
public RM( ){
}
/**
* Intializes the class.
*
* @param bag bag of initialization objects
*/
public void initialize( PegasusBag bag ) {
mSiteStore = bag.getHandleToSiteStore();
mTCHandle = bag.getHandleToTransformationCatalog();
mProps = bag.getPegasusProperties();
}
/**
* Creates a cleanup job that removes the files from remote working directory.
* This will eventually make way to it's own interface.
*
* @param id the identifier to be assigned to the job.
* @param files the list of <code>PegasusFile</code> that need to be
* cleaned up.
* @param job the primary compute job with which this cleanup job is associated.
*
* @return the cleanup job.
*/
public Job createCleanupJob( String id, List files, Job job ){
//we want to run the clnjob in the same directory
//as the compute job. We cannot clone as then the
//the cleanup jobs for clustered jobs appears as
//a clustered job. PM-368
Job cJob = new Job( job );
//we dont want notifications to be inherited
cJob.resetNotifications();
cJob.setJobType( Job.CLEANUP_JOB );
cJob.setName( id );
cJob.setSiteHandle( job.getStagingSiteHandle() );
//bug fix for JIRA PM-311
//we dont want cleanup job to inherit any stdout or stderr
//specified in the DAX for compute job
cJob.setStdOut( "" );
cJob.setStdErr( "" );
//inconsistency between job name and logical name for now
cJob.setTXVersion( null );
cJob.setTXName( "rm" );
cJob.setTXNamespace( null );
cJob.setLogicalID( id );
//the compute job of the VDS supernode is this job itself
cJob.setVDSSuperNode( job.getID() );
//set the list of files as input files
//to change function signature to reflect a set only.
cJob.setInputFiles( new HashSet( files) );
//set the path to the rm executable
TransformationCatalogEntry entry = this.getTCEntry( job.getSiteHandle() );
cJob.setRemoteExecutable( entry.getPhysicalTransformation() );
//set the arguments for the cleanup job
StringBuffer arguments = new StringBuffer();
for( Iterator it = files.iterator(); it.hasNext(); ){
PegasusFile file = (PegasusFile)it.next();
arguments.append( " " ).append( file.getLFN() );
}
cJob.setArguments( arguments.toString() );
//the cleanup job is a clone of compute
//need to reset the profiles first
cJob.resetProfiles();
//the profile information from the pool catalog needs to be
//assimilated into the job.
cJob.updateProfiles( mSiteStore.lookup( job.getSiteHandle() ).getProfiles() );
//add any notifications specified in the transformation
//catalog for the job. JIRA PM-391
cJob.addNotifications( entry );
//the profile information from the transformation
//catalog needs to be assimilated into the job
//overriding the one from pool catalog.
cJob.updateProfiles( entry );
//the profile information from the properties file
//is assimilated overidding the one from transformation
//catalog.
cJob.updateProfiles( mProps );
//let us put some priority for the cleaunup jobs
cJob.condorVariables.construct( Condor.PRIORITY_KEY,
DEFAULT_PRIORITY_KEY );
return cJob;
}
/**
* Returns the TCEntry object for the rm executable on a grid site.
*
* @param site the site corresponding to which the entry is required.
*
* @return the TransformationCatalogEntry corresponding to the site.
*/
protected TransformationCatalogEntry getTCEntry( String site ){
List tcentries = null;
TransformationCatalogEntry entry = null;
try {
tcentries = mTCHandle.lookup( null,
DEFAULT_RM_LOGICAL_NAME,
null,
site,
TCType.INSTALLED );
} catch (Exception e) { /* empty catch */ }
//see if any record is returned or not
entry = (tcentries == null)?
defaultTCEntry() :
(TransformationCatalogEntry) tcentries.get(0);
return entry;
}
/**
* Returns a default TransformationCatalogEntry object for the rm executable.
*
* @return default <code>TransformationCatalogEntry</code>
*/
private static TransformationCatalogEntry defaultTCEntry(){
TransformationCatalogEntry entry = new TransformationCatalogEntry( null, DEFAULT_RM_LOGICAL_NAME, null);
entry.setPhysicalTransformation( DEFAULT_RM_LOCATION );
return entry;
}
}