00001
00002
00003 #ifndef __ARC_BROKER_H__
00004 #define __ARC_BROKER_H__
00005
00006 #include <algorithm>
00007 #include <set>
00008 #include <string>
00009
00010 #include <arc/URL.h>
00011 #include <arc/Utils.h>
00012 #include <arc/client/EntityRetriever.h>
00013 #include <arc/client/JobDescription.h>
00014 #include <arc/loader/Loader.h>
00015 #include <arc/loader/Plugin.h>
00016
00017 namespace Arc {
00018
00019 class ExecutionTarget;
00020 class Logger;
00021 class URL;
00022 class UserConfig;
00023
00024 class BrokerPluginArgument : public PluginArgument {
00025 public:
00026 BrokerPluginArgument(const UserConfig& uc) : uc(uc) {}
00027 ~BrokerPluginArgument() {}
00028 operator const UserConfig&() const { return uc; }
00029 private:
00030 const UserConfig& uc;
00031 };
00032
00033 class BrokerPlugin : public Plugin {
00034 public:
00035 BrokerPlugin(BrokerPluginArgument* arg) : Plugin(arg), uc(*arg), j(NULL) {}
00036 virtual bool operator() (const ExecutionTarget&, const ExecutionTarget&) const { return true; };
00037 virtual bool match(const ExecutionTarget&) const { return true; };
00038 virtual void set(const JobDescription& _j) { j = &_j; };
00039 protected:
00040 const UserConfig& uc;
00041 const JobDescription* j;
00042
00043 static Logger logger;
00044 };
00045
00046 class BrokerPluginLoader : public Loader {
00047 public:
00048 BrokerPluginLoader();
00049 ~BrokerPluginLoader();
00050 BrokerPlugin* load(const UserConfig& uc, const std::string& name = "", bool keep_ownerskip = true) { return load(uc, NULL, name, keep_ownerskip); };
00051 BrokerPlugin* load(const UserConfig& uc, const JobDescription& j, const std::string& name = "", bool keep_ownerskip = true) { return load(uc, &j, name, keep_ownerskip); };
00052 BrokerPlugin* copy(const BrokerPlugin* p, bool keep_ownerskip = true) { if (p) { BrokerPlugin* bp = new BrokerPlugin(*p); if (bp) { if (keep_ownerskip) { plugins.push_back(bp); }; return bp; }; }; return NULL; };
00053
00054 private:
00055 BrokerPlugin* load(const UserConfig& uc, const JobDescription* j, const std::string& name, bool keep_ownerskip);
00056
00057 std::list<BrokerPlugin*> plugins;
00058 };
00059
00060 class Broker {
00061 public:
00062 Broker(const UserConfig& uc, const std::string& name = "");
00063 Broker(const UserConfig& uc, const JobDescription& j, const std::string& name = "");
00064 Broker(const Broker& b) : uc(b.uc), j(b.j), proxyDN(b.proxyDN), proxyIssuerCA(b.proxyIssuerCA), p(b.p) { p = l.copy(p.Ptr(), false); }
00065 ~Broker() {};
00066
00067 Broker& operator=(const Broker& b) { j = b.j; proxyDN = b.proxyDN; proxyIssuerCA = b.proxyIssuerCA; p = l.copy(p.Ptr(), false); return *this; };
00068
00069 bool operator() (const ExecutionTarget& lhs, const ExecutionTarget& rhs) const { return (bool)p?(*p)(lhs, rhs):true; };
00070 bool match(const ExecutionTarget& et) const;
00071 bool isValid() const { return (bool)p; }
00072 void set(const JobDescription& _j) { if ((bool)p) { j = &_j; p->set(_j); }; };
00073
00074 private:
00075 const UserConfig& uc;
00076 const JobDescription* j;
00077
00078 std::string proxyDN;
00079 std::string proxyIssuerCA;
00080
00081 CountedPointer<BrokerPlugin> p;
00082
00083 static BrokerPluginLoader l;
00084
00085 static Logger logger;
00086 };
00087
00088 class CountedBroker : public CountedPointer<Broker> {
00089 public:
00090 CountedBroker(Broker* b) : CountedPointer<Broker>(b) {}
00091 CountedBroker(const CountedBroker& b) : CountedPointer<Broker>(b) {}
00092 bool operator()(const ExecutionTarget& lhs,const ExecutionTarget& rhs) const { return Ptr()->operator()(lhs, rhs); }
00093 };
00094
00095 class ExecutionTargetSet : public std::set<ExecutionTarget, CountedBroker>, public EntityConsumer<ComputingServiceType> {
00096 private:
00097 template<typename InputIterator> void insert(InputIterator first, InputIterator last) { return; };
00098
00099 public:
00100 ExecutionTargetSet(const Broker& b, const std::list<URL>& rejectEndpoints = std::list<URL>()) : std::set<ExecutionTarget, CountedBroker>(CountedBroker(new Broker(b))), rejectEndpoints(rejectEndpoints) {}
00101 ExecutionTargetSet(const Broker& b, const std::list<ComputingServiceType>& csList, const std::list<URL>& rejectEndpoints = std::list<URL>()) : std::set<ExecutionTarget, CountedBroker>(new Broker(b)), rejectEndpoints(rejectEndpoints) { addEntities(csList); }
00102
00103 std::pair<ExecutionTargetSet::iterator, bool> insert(const ExecutionTarget& et) { logger.msg(VERBOSE, "ExecutionTarget %s added to ExecutionTargetSet", et.ComputingEndpoint->URLString); if (!reject(et) && key_comp()->match(et)) { return std::set<ExecutionTarget, CountedBroker>::insert(et); }; return std::pair<ExecutionTargetSet::iterator, bool>(end(), false); };
00104 ExecutionTargetSet::iterator insert(ExecutionTargetSet::iterator it, const ExecutionTarget& et) { if (!reject(et) && key_comp()->match(et)) { logger.msg(VERBOSE, "ExecutionTarget %s added to ExecutionTargetSet", et.ComputingEndpoint->URLString); return std::set<ExecutionTarget, CountedBroker>::insert(it, et); }; return end(); };
00105 void addEntity(const ComputingServiceType& cs) { cs.GetExecutionTargets(*this); }
00106 void addEntities(const std::list<ComputingServiceType>&);
00107 void set(const JobDescription& j) { clear(); key_comp()->set(j);}
00108 private:
00109 bool reject(const ExecutionTarget& et) const { return !rejectEndpoints.empty() && (std::find(rejectEndpoints.begin(), rejectEndpoints.end(), et.ComputingEndpoint->URLString) != rejectEndpoints.end() || std::find(rejectEndpoints.begin(), rejectEndpoints.end(), et.ComputingService->Cluster) != rejectEndpoints.end()); }
00110
00111 std::list<URL> rejectEndpoints;
00112
00113 static Logger logger;
00114 };
00115
00116 }
00117
00118 #endif // __ARC_BROKER_H__