00001
00002
00003 #ifndef __ARC_SUBMITTERPLUGIN_H__
00004 #define __ARC_SUBMITTERPLUGIN_H__
00005
00006 #include <list>
00007 #include <map>
00008 #include <string>
00009
00010 #include <arc/URL.h>
00011 #include <arc/loader/Loader.h>
00012 #include <arc/loader/Plugin.h>
00013 #include <arc/client/EntityRetriever.h>
00014 #include <arc/client/Job.h>
00015 #include <arc/client/JobDescription.h>
00016
00017 namespace Arc {
00018
00019 class Config;
00020 class ExecutionTarget;
00021 class JobDescription;
00022 class Logger;
00023 class UserConfig;
00024
00026
00032 class SubmitterPlugin : public Plugin {
00033 protected:
00034 SubmitterPlugin(const UserConfig& usercfg, PluginArgument* parg)
00035 : Plugin(parg), usercfg(usercfg) {}
00036 public:
00037 virtual ~SubmitterPlugin() {}
00038
00040
00048 virtual bool Submit(const std::list<JobDescription>& jobdesc, const ExecutionTarget& et, EntityConsumer<Job>& jc, std::list<const JobDescription*>& notSubmitted) = 0;
00049
00051
00062 virtual bool Migrate(const URL& jobid, const JobDescription& jobdesc,
00063 const ExecutionTarget& et,
00064 bool forcemigration, Job& job);
00065
00066 virtual const std::list<std::string>& SupportedInterfaces() const { return supportedInterfaces; };
00067
00068 protected:
00069 bool PutFiles(const JobDescription& jobdesc, const URL& url) const;
00070 void AddJobDetails(const JobDescription& jobdesc, const URL& jobid,
00071 const URL& cluster, Job& job) const;
00072
00073 const UserConfig& usercfg;
00074 std::list<std::string> supportedInterfaces;
00075
00076 static Logger logger;
00077 };
00078
00082 class SubmitterPluginLoader : public Loader {
00083 public:
00086 SubmitterPluginLoader();
00087
00091 ~SubmitterPluginLoader();
00092
00097 SubmitterPlugin* load(const std::string& name, const UserConfig& usercfg);
00098
00099 SubmitterPlugin* loadByInterfaceName(const std::string& name, const UserConfig& usercfg);
00100
00101 private:
00102 void initialiseInterfacePluginMap(const UserConfig& uc);
00103
00104 std::multimap<std::string, SubmitterPlugin*> submitters;
00105 static std::map<std::string, std::string> interfacePluginMap;
00106 };
00107
00108 class SubmitterPluginArgument
00109 : public PluginArgument {
00110 public:
00111 SubmitterPluginArgument(const UserConfig& usercfg)
00112 : usercfg(usercfg) {}
00113 ~SubmitterPluginArgument() {}
00114 operator const UserConfig&() {
00115 return usercfg;
00116 }
00117 private:
00118 const UserConfig& usercfg;
00119 };
00120
00121 }
00122
00123 #endif // __ARC_SUBMITTERPLUGIN_H__