bool JobControllerPluginEMIES::GetURLToJobResource(const Job& job, Job::ResourceType resource, URL& url) const { if (resource == Job::JOBDESCRIPTION) { return false; } // Obtain information about staging urls EMIESJob ejob; ejob = job; URL stagein; URL stageout; URL session; // TODO: currently using first valid URL. Need support for multiple. for(std::list<URL>::iterator s = ejob.stagein.begin();s!=ejob.stagein.end();++s) { if(*s) { stagein = *s; break; } } for(std::list<URL>::iterator s = ejob.stageout.begin();s!=ejob.stageout.end();++s) { if(*s) { stageout = *s; break; } } for(std::list<URL>::iterator s = ejob.session.begin();s!=ejob.session.end();++s) { if(*s) { session = *s; break; } } if ((resource != Job::STAGEINDIR || !stagein) && (resource != Job::STAGEOUTDIR || !stageout) && (resource != Job::SESSIONDIR || !session)) { // If there is no needed URL provided try to fetch it from server MCCConfig cfg; usercfg.ApplyToConfig(cfg); Job tjob; AutoPointer<EMIESClient> ac(((EMIESClients&)clients).acquire(ejob.manager)); if (!ac->info(ejob, tjob)) { ((EMIESClients&)clients).release(ac.Release()); logger.msg(INFO, "Failed retrieving information for job: %s", job.JobID); return false; } for(std::list<URL>::iterator s = ejob.stagein.begin();s!=ejob.stagein.end();++s) { if(*s) { stagein = *s; break; } } for(std::list<URL>::iterator s = ejob.stageout.begin();s!=ejob.stageout.end();++s) { if(*s) { stageout = *s; break; } } for(std::list<URL>::iterator s = ejob.session.begin();s!=ejob.session.end();++s) { if(*s) { session = *s; break; } } // Choose url by state // TODO: maybe this method should somehow know what is purpose of URL // TODO: state attributes would be more suitable // TODO: library need to be etended to allow for multiple URLs if((tjob.State == JobState::ACCEPTED) || (tjob.State == JobState::PREPARING)) { url = stagein; } else if((tjob.State == JobState::DELETED) || (tjob.State == JobState::FAILED) || (tjob.State == JobState::KILLED) || (tjob.State == JobState::FINISHED) || (tjob.State == JobState::FINISHING)) { url = stageout; } else { url = session; } // If no url found by state still try to get something if(!url) { if(session) url = session; if(stagein) url = stagein; if(stageout) url = stageout; } ((EMIESClients&)clients).release(ac.Release()); } switch (resource) { case Job::STDIN: url.ChangePath(url.Path() + '/' + job.StdIn); break; case Job::STDOUT: url.ChangePath(url.Path() + '/' + job.StdOut); break; case Job::STDERR: url.ChangePath(url.Path() + '/' + job.StdErr); break; case Job::JOBLOG: url.ChangePath(url.Path() + "/" + job.LogDir + "/errors"); break; case Job::STAGEINDIR: if(stagein) url = stagein; break; case Job::STAGEOUTDIR: if(stageout) url = stageout; break; case Job::SESSIONDIR: if(session) url = session; break; default: break; } if(url && ((url.Protocol() == "https") || (url.Protocol() == "http"))) { url.AddOption("threads=2",false); url.AddOption("encryption=optional",false); // url.AddOption("httpputpartial=yes",false); - TODO: use for A-REX } return true; }