/** * 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.code.generator.condor.style; import edu.isi.pegasus.planner.code.generator.condor.CondorStyle; import edu.isi.pegasus.planner.code.generator.condor.CondorStyleException; import edu.isi.pegasus.common.logging.LogManager; import edu.isi.pegasus.planner.classes.Job; import edu.isi.pegasus.planner.classes.TransferJob; import edu.isi.pegasus.planner.namespace.Pegasus; import edu.isi.pegasus.planner.namespace.Condor; import edu.isi.pegasus.planner.namespace.ENV; /** * Enables a job to be submitted to nodes that are logically part of the local pool, * but physically are not. * * This style is applied for jobs to be run * - on the nodes that have been glided into the local pool * - on the nodes that have been flocked to the local pool (NOT TESTED) * * @author Karan Vahi * @version $Revision$ */ public class CondorGlideIN extends Abstract { /** * The name of the style being implemented. */ public static final String STYLE_NAME = "CondorGlideIN"; /** * The default constructor. */ public CondorGlideIN() { super(); } /** * Applies the style to the job to be run in a condor glide in environment. * condor style to the job. Changes the job so that it results * in generation of a submit file that can be directly submitted to the * underlying condor scheduler on the submit host, without * going through CondorG and the jobs run only on the nodes that have * been glided in from a particular remote pool. * Please note that GlideIn only works if all the application jobs are * being run via kickstart, as it relies heavily on the ability of the * launcher to change the directory before running the application job * on the remote end. * * This applies to the case of * - nodes glided in to a local pool * - jobs flocking to remote pools? * * @param job the job on which the style needs to be applied. * * @throws CondorStyleException in case of any error occuring code generation. */ public void apply( Job job ) throws CondorStyleException{ // Removed for JIRA PM-543 // String execSiteWorkDir = mSiteStore.getInternalWorkDirectory( job ); // String workdir = (String) job.globusRSL.removeKey( "directory" ); // returns old value // workdir = (workdir == null)?execSiteWorkDir:workdir; String workdir = job.getDirectory(); String universe = job.condorVariables.containsKey( Condor.UNIVERSE_KEY )? (String)job.condorVariables.get( Condor.UNIVERSE_KEY ): //default is vanilla universe for glidein style Condor.VANILLA_UNIVERSE; if( universe.equalsIgnoreCase( Condor.VANILLA_UNIVERSE ) || universe.equalsIgnoreCase( Condor.STANDARD_UNIVERSE ) || universe.equalsIgnoreCase( Condor.PARALLEL_UNIVERSE ) ){ //the glide in/ flocking case //submitting directly to condor //set the vds change dir key to trigger -w //to kickstart invocation for all non transfer jobs if( !( job instanceof TransferJob ) ){ job.vdsNS.checkKeyInNS( Pegasus.CHANGE_DIR_KEY, "true" ); //set remote_initialdir for the job only for non transfer jobs //this is removed later when kickstart is enabling. if( workdir != null ){ job.condorVariables.construct( "remote_initialdir", workdir ); //PM-961 also associate the value as an environment variable job.envVariables.construct( ENV.PEGASUS_SCRATCH_DIR_KEY, workdir); } } //we want the stdout and stderr to be transferred back //by Condor to the submit host always job.condorVariables.construct( "should_transfer_files", "YES" ); job.condorVariables.construct( "when_to_transfer_output", "ON_EXIT" ); //isGlobus = false; } else{ //Is invalid state throw new CondorStyleException( errorMessage( job, STYLE_NAME, universe ) ); } //the condor universe that is determined //should be set back in the job. job.condorVariables.construct( Condor.UNIVERSE_KEY, universe ); applyCredentialsForRemoteExec(job); } }