Back to index

nordugrid-arc-nox  1.1.0~rc6
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Static Private Attributes
Arc::SubmitterARC0 Class Reference

#include <SubmitterARC0.h>

Inheritance diagram for Arc::SubmitterARC0:
Inheritance graph
[legend]
Collaboration diagram for Arc::SubmitterARC0:
Collaboration graph
[legend]

List of all members.

Public Member Functions

URL Submit (const JobDescription &jobdesc, const ExecutionTarget &et) const
 This virtual method should be overridden by plugins which should be capable of submitting jobs, defined in the JobDescription jobdesc, to the ExecutionTarget et.
URL Migrate (const URL &jobid, const JobDescription &jobdesc, const ExecutionTarget &et, bool forcemigration) const
 This virtual method should be overridden by plugins which should be capable of migrating jobs.
bool ModifyJobDescription (JobDescription &jobdesc, const ExecutionTarget &et) const
std::string GetCksum (const std::string &file) const

Static Public Member Functions

static PluginInstance (PluginArgument *arg)
static std::string GetCksum (const std::string &file, const UserConfig &usercfg)

Protected Member Functions

bool PutFiles (const JobDescription &jobdesc, const URL &url) const
void AddJob (const JobDescription &job, const URL &jobid, const URL &cluster, const URL &infoendpoint) const
void AddJob (const JobDescription &job, const URL &jobid, const URL &cluster, const URL &infoendpoint, const std::map< std::string, std::string > &additionalInfo) const

Protected Attributes

const std::string flavour
const UserConfigusercfg

Private Member Functions

 SubmitterARC0 (const UserConfig &usercfg)
 ~SubmitterARC0 ()

Static Private Attributes

static Logger logger

Detailed Description

Definition at line 17 of file SubmitterARC0.h.


Constructor & Destructor Documentation

Arc::SubmitterARC0::SubmitterARC0 ( const UserConfig usercfg) [private]

Definition at line 22 of file SubmitterARC0.cpp.

    : Submitter(usercfg, "ARC0") {}

Here is the caller graph for this function:

Definition at line 25 of file SubmitterARC0.cpp.

{}

Member Function Documentation

void Arc::Submitter::AddJob ( const JobDescription job,
const URL jobid,
const URL cluster,
const URL infoendpoint 
) const [inline, protected, inherited]

Definition at line 69 of file Submitter.h.

                                               {
      std::map<std::string, std::string> additionalInfo;
      AddJob(job, jobid, cluster, infoendpoint, additionalInfo);
    }

Here is the caller graph for this function:

void Arc::Submitter::AddJob ( const JobDescription job,
const URL jobid,
const URL cluster,
const URL infoendpoint,
const std::map< std::string, std::string > &  additionalInfo 
) const [protected, inherited]

Definition at line 72 of file Submitter.cpp.

                                                                                   {
    NS ns;
    XMLNode info(ns, "Job");
    info.NewChild("JobID") = jobid.str();
    if (!job.Identification.JobName.empty())
      info.NewChild("Name") = job.Identification.JobName;
    info.NewChild("Flavour") = flavour;
    info.NewChild("Cluster") = cluster.str();
    info.NewChild("InfoEndpoint") = infoendpoint.str();
    info.NewChild("LocalSubmissionTime") = (std::string)Arc::Time();

    for (std::map<std::string, std::string>::const_iterator it = additionalInfo.begin();
         it != additionalInfo.end(); it++)
      info.NewChild(it->first) = it->second;

    for (std::list<std::string>::const_iterator
           it = job.Identification.ActivityOldId.begin();
         it != job.Identification.ActivityOldId.end(); it++)
      info.NewChild("OldJobID") = *it;

    std::string rep = job.UnParse("arcjsdl");
    info.NewChild("JobDescription") = (std::string)rep;

    for (std::list<FileType>::const_iterator it = job.DataStaging.File.begin();
         it != job.DataStaging.File.end(); it++)
      if (!it->Source.empty())
        if (it->Source.begin()->URI.Protocol() == "file") {
          if (!info["LocalInputFiles"])
            info.NewChild("LocalInputFiles");
          XMLNode File = info["LocalInputFiles"].NewChild("File");
          File.NewChild("Source") = it->Name;
          File.NewChild("CheckSum") = GetCksum(it->Source.begin()->URI.Path());
        }

    FileLock lock(usercfg.JobListFile());
    Config jobstorage;
    jobstorage.ReadFromFile(usercfg.JobListFile());
    jobstorage.NewChild(info);
    jobstorage.SaveToFile(usercfg.JobListFile());
  }

Here is the call graph for this function:

std::string Arc::Submitter::GetCksum ( const std::string &  file) const [inline, inherited]

Definition at line 65 of file Submitter.h.

{ return GetCksum(file, usercfg); }

Here is the call graph for this function:

Here is the caller graph for this function:

std::string Arc::Submitter::GetCksum ( const std::string &  file,
const UserConfig usercfg 
) [static, inherited]

Definition at line 116 of file Submitter.cpp.

                                                                                {
    DataHandle source(file, usercfg);
    DataBuffer buffer;

    MD5Sum md5sum;
    buffer.set(&md5sum);

    if (!source->StartReading(buffer))
      return "";

    int handle;
    unsigned int length;
    unsigned long long int offset;

    while (buffer.for_write() || !buffer.eof_read())
      if (buffer.for_write(handle, length, offset, true))
        buffer.is_written(handle);

    if (!source->StopReading())
      return "";

    if (!buffer.checksum_valid())
      return "";

    char buf[100];
    md5sum.print(buf, 100);
    return buf;
  }

Here is the call graph for this function:

Definition at line 27 of file SubmitterARC0.cpp.

                                                     {
    SubmitterPluginArgument *subarg =
      dynamic_cast<SubmitterPluginArgument*>(arg);
    if (!subarg)
      return NULL;
    return new SubmitterARC0(*subarg);
  }

Here is the call graph for this function:

URL Arc::SubmitterARC0::Migrate ( const URL jobid,
const JobDescription jobdesc,
const ExecutionTarget et,
bool  forcemigration 
) const [virtual]

This virtual method should be overridden by plugins which should be capable of migrating jobs.

The active job which should be migrated is pointed to by the URL jobid, and is represented by the JobDescription jobdesc. The forcemigration boolean specifies if the migration should succeed if the active job cannot be terminated. The protected method AddJob can be used to save job information. This method should return the URL of the migrated job. In case migration fails an empty URL should be returned.

Implements Arc::Submitter.

Definition at line 106 of file SubmitterARC0.cpp.

                                                                                   {
    logger.msg(INFO, "Trying to migrate to %s: Migration to a ARC0 cluster is not supported.", et.url.str());
    return URL();
  }

Here is the call graph for this function:

bool Arc::SubmitterARC0::ModifyJobDescription ( JobDescription jobdesc,
const ExecutionTarget et 
) const [virtual]

Implements Arc::Submitter.

Definition at line 112 of file SubmitterARC0.cpp.

                                                                                                   {
    if (jobdesc.XRSL_elements["clientxrsl"].empty())
      jobdesc.XRSL_elements["clientxrsl"] = jobdesc.UnParse("XRSL");

    // Check for identical file names.
    // Check if executable and input is contained in the file list.
    bool inputIsAdded(false), executableIsAdded(false), outputIsAdded(false), errorIsAdded(false), logDirIsAdded(false);
    for (std::list<FileType>::const_iterator it1 = jobdesc.DataStaging.File.begin();
         it1 != jobdesc.DataStaging.File.end(); it1++) {
      for (std::list<FileType>::const_iterator it2 = it1;
           it2 != jobdesc.DataStaging.File.end(); it2++) {
        if (it1 == it2) continue;

        if (it1->Name == it2->Name && (!it1->Source.empty() && !it2->Source.empty() ||
                                       !it1->Target.empty() && !it2->Target.empty())) {
          logger.msg(VERBOSE, "Two files have identical file name '%s'.", it1->Name);
          return false;
        }
      }

      executableIsAdded  |= (it1->Name == jobdesc.Application.Executable.Name);
      inputIsAdded       |= (it1->Name == jobdesc.Application.Input);
      outputIsAdded      |= (it1->Name == jobdesc.Application.Output);
      errorIsAdded       |= (it1->Name == jobdesc.Application.Error);
      logDirIsAdded      |= (it1->Name == jobdesc.Application.LogDir);
    }

    if (!executableIsAdded &&
        !Glib::path_is_absolute(jobdesc.Application.Executable.Name)) {
      FileType file;
      file.Name = jobdesc.Application.Executable.Name;
      DataSourceType s;
      s.URI = file.Name;
      file.KeepData = false;
      file.IsExecutable = true;
      file.DownloadToCache = false;
      jobdesc.DataStaging.File.push_back(file);
    }

    if (!jobdesc.Application.Input.empty() && !inputIsAdded) {
      FileType file;
      file.Name = jobdesc.Application.Input;
      DataSourceType s;
      s.URI = file.Name;
      file.Source.push_back(s);
      file.Source.push_back(s);
      file.KeepData = false;
      file.IsExecutable = false;
      file.DownloadToCache = false;
      jobdesc.DataStaging.File.push_back(file);
    }

    if (!jobdesc.Application.Output.empty() && !outputIsAdded) {
      FileType file;
      file.Name = jobdesc.Application.Output;
      file.KeepData = true;
      file.IsExecutable = false;
      file.DownloadToCache = false;
      jobdesc.DataStaging.File.push_back(file);
    }

    if (!jobdesc.Application.Error.empty() && !errorIsAdded) {
      FileType file;
      file.Name = jobdesc.Application.Error;
      file.KeepData = true;
      file.IsExecutable = false;
      file.DownloadToCache = false;
      jobdesc.DataStaging.File.push_back(file);
    }

    if (!jobdesc.Application.LogDir.empty() && !logDirIsAdded) {
      FileType file;
      file.Name = jobdesc.Application.LogDir;
      file.KeepData = true;
      file.IsExecutable = false;
      file.DownloadToCache = false;
      jobdesc.DataStaging.File.push_back(file);
    }

    if (!jobdesc.Resources.RunTimeEnvironment.empty() &&
        !jobdesc.Resources.RunTimeEnvironment.selectSoftware(et.ApplicationEnvironments)) {
      // This error should never happen since RTE is checked in the Broker.
      logger.msg(VERBOSE, "Unable to select run time environment");
      return false;
    }

    if (!jobdesc.Resources.CEType.empty() &&
        !jobdesc.Resources.CEType.selectSoftware(et.Implementation)) {
      // This error should never happen since Middleware is checked in the Broker.
      logger.msg(VERBOSE, "Unable to select middleware");
      return false;
    }

    if (!jobdesc.Resources.OperatingSystem.empty() &&
        !jobdesc.Resources.OperatingSystem.selectSoftware(et.Implementation)) {
      // This error should never happen since OS is checked in the Broker.
      logger.msg(VERBOSE, "Unable to select operating system.");
      return false;
    }

    if (jobdesc.Resources.CandidateTarget.empty()) {
      ResourceTargetType candidateTarget;
      candidateTarget.EndPointURL = URL();
      candidateTarget.QueueName = et.ComputingShareName;
      jobdesc.Resources.CandidateTarget.push_back(candidateTarget);
    }
    else if (jobdesc.Resources.CandidateTarget.front().QueueName.empty())
      jobdesc.Resources.CandidateTarget.front().QueueName = et.ComputingShareName;

    jobdesc.XRSL_elements["action"] = "request";
    jobdesc.XRSL_elements["savestate"] = "yes";
    jobdesc.XRSL_elements["clientsoftware"] = "arclibclient-" VERSION;
#ifdef HAVE_GETHOSTNAME
    char hostname[1024];
    gethostname(hostname, 1024);
    jobdesc.XRSL_elements["hostname"] = hostname;
#endif

    jobdesc.AddHint("TARGETDIALECT","GRIDMANAGER");

    return true;
  }

Here is the call graph for this function:

Here is the caller graph for this function:

bool Arc::Submitter::PutFiles ( const JobDescription jobdesc,
const URL url 
) const [protected, inherited]

Definition at line 35 of file Submitter.cpp.

                                                                          {

    FileCache cache;
    DataMover mover;
    mover.retry(true);
    mover.secure(false);
    mover.passive(true);
    mover.verbose(false);

    for (std::list<FileType>::const_iterator it = job.DataStaging.File.begin();
         it != job.DataStaging.File.end(); it++)
      if (!it->Source.empty()) {
        const URL& src = it->Source.begin()->URI;
        if (src.Protocol() == "file") {
          URL dst(std::string(url.str() + '/' + it->Name));
          DataHandle source(src, usercfg);
          DataHandle destination(dst, usercfg);
          DataStatus res =
            mover.Transfer(*source, *destination, cache, URLMap(), 0, 0, 0,
                           usercfg.Timeout());
          if (!res.Passed()) {
            if (!res.GetDesc().empty())
              logger.msg(ERROR, "Failed uploading file: %s - %s",
                         std::string(res), res.GetDesc());
            else
              logger.msg(ERROR, "Failed uploading file: %s", std::string(res));
            return false;
          }
        }
      }

    return true;
  }

Here is the call graph for this function:

Here is the caller graph for this function:

URL Arc::SubmitterARC0::Submit ( const JobDescription jobdesc,
const ExecutionTarget et 
) const [virtual]

This virtual method should be overridden by plugins which should be capable of submitting jobs, defined in the JobDescription jobdesc, to the ExecutionTarget et.

The protected convenience method AddJob can be used to save job information. This method should return the URL of the submitted job. In case submission fails an empty URL should be returned.

Implements Arc::Submitter.

Definition at line 35 of file SubmitterARC0.cpp.

                                                             {

    FTPControl ctrl;

    if (!ctrl.Connect(et.url,
                      usercfg.ProxyPath(), usercfg.CertificatePath(),
                      usercfg.KeyPath(), usercfg.Timeout())) {
      logger.msg(INFO, "Submit: Failed to connect");
      return URL();
    }

    if (!ctrl.SendCommand("CWD " + et.url.Path(), usercfg.Timeout())) {
      logger.msg(INFO, "Submit: Failed sending CWD command");
      ctrl.Disconnect(usercfg.Timeout());
      return URL();
    }

    std::string response;

    if (!ctrl.SendCommand("CWD new", response, usercfg.Timeout())) {
      logger.msg(INFO, "Submit: Failed sending CWD new command");
      ctrl.Disconnect(usercfg.Timeout());
      return URL();
    }

    std::string::size_type pos2 = response.rfind('"');
    std::string::size_type pos1 = response.rfind('/', pos2 - 1);
    std::string jobnumber = response.substr(pos1 + 1, pos2 - pos1 - 1);

    JobDescription job(jobdesc);

    if (!ModifyJobDescription(job, et)) {
      logger.msg(INFO, "Submit: Failed to modify job description "
                        "to be sent to target.");
      ctrl.Disconnect(usercfg.Timeout());
      return URL();
    }

    std::string jobdescstring = job.UnParse("XRSL");

    if (!ctrl.SendData(jobdescstring, "job", usercfg.Timeout())) {
      logger.msg(INFO, "Submit: Failed sending job description");
      ctrl.Disconnect(usercfg.Timeout());
      return URL();
    }

    if (!ctrl.Disconnect(usercfg.Timeout())) {
      logger.msg(INFO, "Submit: Failed to disconnect after submission");
      return URL();
    }

    URL jobid(et.url);
    jobid.ChangePath(jobid.Path() + '/' + jobnumber);

    if (!PutFiles(job, jobid)) {
      logger.msg(INFO, "Submit: Failed uploading local input files");
      return URL();
    }

    // Prepare contact url for information about this job
    URL infoEndpoint(et.Cluster);
    infoEndpoint.ChangeLDAPFilter("(nordugrid-job-globalid=" +
                                  jobid.str() + ")");
    infoEndpoint.ChangeLDAPScope(URL::subtree);

    AddJob(job, jobid, et.Cluster, infoEndpoint);

    return jobid;
  }

Here is the call graph for this function:


Member Data Documentation

const std::string Arc::Submitter::flavour [protected, inherited]

Definition at line 82 of file Submitter.h.

Reimplemented from Arc::Submitter.

Definition at line 24 of file SubmitterARC0.h.

const UserConfig& Arc::Submitter::usercfg [protected, inherited]

Definition at line 83 of file Submitter.h.


The documentation for this class was generated from the following files: