ARC SDK
Submitter.h
1 // -*- indent-tabs-mode: nil -*-
2 
3 #ifndef __ARC_SUBMITTER_H__
4 #define __ARC_SUBMITTER_H__
5 
6 #include <arc/UserConfig.h>
7 
8 #include <arc/compute/Endpoint.h>
9 #include <arc/compute/EndpointQueryingStatus.h>
10 #include <arc/compute/JobDescription.h>
11 #include <arc/compute/Job.h>
12 #include <arc/compute/SubmitterPlugin.h>
13 #include <arc/compute/ExecutionTarget.h>
14 #include <arc/compute/EntityRetriever.h>
15 
16 
17 namespace Arc {
18 
93  public:
96  UNKNOWN,
97  NOPLUGIN,
98  SUCCESSFUL
99  };
100 
102  static std::string str(EndpointSubmissionStatusType status);
103 
105  EndpointSubmissionStatus(EndpointSubmissionStatusType status = UNKNOWN, const std::string& description = "") : status(status), description(description) {};
106 
108  bool operator==(EndpointSubmissionStatusType s) const { return status == s; };
112  bool operator==(const EndpointSubmissionStatus& s) const { return status == s.status; };
114  bool operator!=(EndpointSubmissionStatusType s) const { return status != s; };
116  bool operator!=(const EndpointSubmissionStatus& s) const { return status != s.status; };
118  bool operator!() const { return status != SUCCESSFUL; };
120  operator bool() const { return status == SUCCESSFUL; };
121 
129  EndpointSubmissionStatus& operator=(const EndpointSubmissionStatus& s) { status = s.status; description = s.description; return *this; };
130 
132  EndpointSubmissionStatusType getStatus() const { return status; };
134  const std::string& getDescription() const { return description; };
138  std::string str() const { return str(status); };
139 
140  private:
142  std::string description;
143  };
144 
145  class SubmissionStatus;
146 
148 
217  class Submitter {
218  public:
220 
226  Submitter(const UserConfig& uc) : uc(uc) {}
227  ~Submitter() {}
228 
229  // === Using the consumer concept as in the EntityRetriever ===
231 
238  void addConsumer(EntityConsumer<Job>& addConsumer_consumer /* The name 'addConsumer_consumer' is important for Swig when matching methods */) { consumers.push_back(&addConsumer_consumer); }
240 
244  void removeConsumer(EntityConsumer<Job>& removeConsumer_consumer /* The name 'removeConsumer_consumer' is important for Swig when matching methods */);
245  // ===
246 
247  // === No brokering ===
248 
250 
274  SubmissionStatus Submit(const Endpoint& endpoint, const JobDescription& desc) { return Submit(endpoint, std::list<JobDescription>(1, desc)); }
276 
287  SubmissionStatus Submit(const Endpoint& endpoint, const JobDescription& desc, Job& job);
289 
297  SubmissionStatus Submit(const Endpoint& endpoint, const std::list<JobDescription>& descs);
299 
308  SubmissionStatus Submit(const Endpoint& endpoint, const std::list<JobDescription>& descs, std::list<Job>& jobs);
310 
327  SubmissionStatus Submit(const std::list<Endpoint>& endpoint, const std::list<JobDescription>& descs);
329 
337  SubmissionStatus Submit(const std::list<Endpoint>& endpoint, const std::list<JobDescription>& descs, std::list<Job>& jobs);
338 
339  // ==== Submission to single configuration (adaption of job description) ====
340  // ===== Single job =====
342 
364  SubmissionStatus Submit(const ExecutionTarget& et, const JobDescription& desc) { return Submit(et, std::list<JobDescription>(1, desc)); }
366 
378  SubmissionStatus Submit(const ExecutionTarget& et, const JobDescription& desc, Job& job);
379  // =====
380  // ===== Multiple jobs =====
382 
394  SubmissionStatus Submit(const ExecutionTarget& et, const std::list<JobDescription>& descs);
396 
409  SubmissionStatus Submit(const ExecutionTarget& et, const std::list<JobDescription>& descs, std::list<Job>& jobs);
410  // =====
411  // ====
412  // ===
413 
414  // === Brokering with service discovery (multiple endpoints) ===
415  // ==== Using provided JobDescription objects for brokering ====
417 
457  SubmissionStatus BrokeredSubmit(const std::list<std::string>& endpoints, const std::list<JobDescription>& descs, const std::list<std::string>& requestedSubmissionInterfaces = std::list<std::string>());
459 
480  SubmissionStatus BrokeredSubmit(const std::list<std::string>& endpoints, const std::list<JobDescription>& descs, std::list<Job>& jobs, const std::list<std::string>& requestedSubmissionInterfaces = std::list<std::string>());
482 
502  SubmissionStatus BrokeredSubmit(const std::list<Endpoint>& endpoints, const std::list<JobDescription>& descs, const std::list<std::string>& requestedSubmissionInterfaces = std::list<std::string>());
504 
527  SubmissionStatus BrokeredSubmit(const std::list<Endpoint>& endpoints, const std::list<JobDescription>& descs, std::list<Job>& jobs, const std::list<std::string>& requestedSubmissionInterfaces = std::list<std::string>());
528  // ====
529  // ===
530 
531  // === Methods for handling errors ===
533 
537  const std::list<const JobDescription*>& GetDescriptionsNotSubmitted() const { return notsubmitted; }
539  void ClearNotSubmittedDescriptions() { notsubmitted.clear(); }
541 
548  const EndpointStatusMap& GetEndpointQueryingStatuses() const { return queryingStatusMap; }
550 
553  void ClearEndpointQueryingStatuses() { queryingStatusMap.clear(); }
555 
562  const std::map<Endpoint, EndpointSubmissionStatus>& GetEndpointSubmissionStatuses() const { return submissionStatusMap; }
564 
567  void ClearEndpointSubmissionStatuses() { submissionStatusMap.clear(); }
568 
570 
575  void ClearAllStatuses() { queryingStatusMap.clear(); submissionStatusMap.clear(); }
577 
584  void ClearAll() { notsubmitted.clear(); queryingStatusMap.clear(); submissionStatusMap.clear(); }
585  // ===
586 
587  private:
588  class ConsumerWrapper : public EntityConsumer<Job> {
589  public:
590  ConsumerWrapper(Submitter& s) : s(s) {}
591  void addEntity(const Job& j) {
592  for (std::list<EntityConsumer<Job>*>::iterator it = s.consumers.begin(); it != s.consumers.end(); ++it) {
593  (*it)->addEntity(j);
594  }
595  }
596  private:
597  Submitter& s;
598  };
599 
600  SubmissionStatus SubmitNoClear(const Endpoint& endpoint, const std::list<JobDescription>& descs);
601 
602  const UserConfig& uc;
603 
604  EndpointStatusMap queryingStatusMap;
605  std::map<Endpoint, EndpointSubmissionStatus> submissionStatusMap;
606 
607  std::list<const JobDescription*> notsubmitted;
608 
609  std::list<EntityConsumer<Job>*> consumers;
610 
611  static SubmitterPluginLoader& getLoader();
612 
613  static Logger logger;
614  };
615 }
616 
617 #endif // __ARC_SUBMITTER_H__