WMS.h
1 
10 #ifndef WRENCH_WMS_H
11 #define WRENCH_WMS_H
12 
13 #include <wrench/managers/EnergyMeter.h>
14 #include "wrench/services/Service.h"
15 #include "wrench/wms/DynamicOptimization.h"
16 #include "wrench/wms/StaticOptimization.h"
17 #include "wrench/wms/scheduler/PilotJobScheduler.h"
18 #include "wrench/wms/scheduler/StandardJobScheduler.h"
19 #include "wrench/services/compute/cloud/CloudComputeService.h"
20 #include "wrench/workflow/Workflow.h"
21 
22 namespace wrench {
23 
24  class Simulation;
25  class ComputeService;
26  class CloudComputeService;
27  class VirtualizedClusterComputeService;
28  class StorageService;
29  class NetworkProximityService;
30  class FileRegistryService;
31 
35  class WMS : public Service {
36 
37  public:
38  void addWorkflow(Workflow *workflow, double start_time = 0);
42 
43  void addStaticOptimization(std::unique_ptr<StaticOptimization>);
44 
45  void addDynamicOptimization(std::unique_ptr<DynamicOptimization>);
46 
47 
48  protected:
49 
50  /***********************/
52  /***********************/
53 
54  WMS(std::unique_ptr<StandardJobScheduler> standard_job_scheduler,
55  std::unique_ptr<PilotJobScheduler> pilot_job_scheduler,
56  const std::set<std::shared_ptr<ComputeService>> &compute_services,
57  const std::set<std::shared_ptr<StorageService>> &storage_services,
58  const std::set<std::shared_ptr<NetworkProximityService>> &network_proximity_services,
59  std::shared_ptr<FileRegistryService> file_registry_service,
60  const std::string &hostname,
61  const std::string suffix);
62 
63 
64  void checkDeferredStart();
65 
66  void setTimer(double date, std::string message);
67 
68  std::shared_ptr<JobManager> createJobManager();
69  std::shared_ptr<DataMovementManager> createDataMovementManager();
70  std::shared_ptr<EnergyMeter> createEnergyMeter(const std::map<std::string, double> &measurement_periods);
71  std::shared_ptr<EnergyMeter> createEnergyMeter(const std::vector<std::string> &hostnames, double measurement_period);
72 
73  void runDynamicOptimizations();
74 
75  void runStaticOptimizations();
76 
82  template <class T>
83  std::set<std::shared_ptr<T>> getAvailableComputeServices() {
84  bool is_cloud = (std::type_index(typeid(T)) == std::type_index(typeid(CloudComputeService)));
85  std::set<std::shared_ptr<T>> to_return;
86  for (auto const &h : this->compute_services) {
87  if (not is_cloud) {
88  auto shared_ptr = std::dynamic_pointer_cast<T>(h);
89  if (shared_ptr) {
90  to_return.insert(shared_ptr);
91  }
92  } else {
93  auto shared_ptr_cloud = std::dynamic_pointer_cast<T>(h);
94  auto shared_ptr_vc = std::dynamic_pointer_cast<VirtualizedClusterComputeService>(h);
95  if (shared_ptr_cloud and (not shared_ptr_vc)) {
96  to_return.insert(shared_ptr_cloud);
97  }
98  }
99  }
100  return to_return;
101  }
102 
103  // The template specialization below does not compile with gcc, hence the above method!
104 
105 // /**
106 // * @brief Obtain the list of compute services available to the WMS
107 // * @tparam CloudComputeService
108 // * @return a set of compute services
109 // * @return
110 // */
111 // template <>
112 // std::set<std::shared_ptr<CloudComputeService>> getAvailableComputeServices<CloudComputeService>() {
113 // std::set<std::shared_ptr<CloudComputeService>> to_return;
114 // for (auto const &h : this->compute_services) {
115 // auto shared_ptr_cloud = std::dynamic_pointer_cast<CloudComputeService>(h);
116 // auto shared_ptr_vc = std::dynamic_pointer_cast<VirtualizedClusterComputeService>(h);
117 // if (shared_ptr_cloud and (not shared_ptr_vc)) {
118 // to_return.insert(shared_ptr_cloud);
119 // }
120 // }
121 // return to_return;
122 // }
123 
124 
125  std::set<std::shared_ptr<StorageService>> getAvailableStorageServices();
126  std::set<std::shared_ptr<NetworkProximityService>> getAvailableNetworkProximityServices();
127  std::shared_ptr<FileRegistryService> getAvailableFileRegistryService();
128 
129  void waitForAndProcessNextEvent();
130  bool waitForAndProcessNextEvent(double timeout);
131 
132  virtual void processEventStandardJobCompletion(std::shared_ptr<StandardJobCompletedEvent>);
133 
134  virtual void processEventStandardJobFailure(std::shared_ptr<StandardJobFailedEvent>);
135 
136  virtual void processEventPilotJobStart(std::shared_ptr<PilotJobStartedEvent>);
137 
138  virtual void processEventPilotJobExpiration(std::shared_ptr<PilotJobExpiredEvent>);
139 
140  virtual void processEventFileCopyCompletion(std::shared_ptr<FileCopyCompletedEvent>);
141 
142  virtual void processEventFileCopyFailure(std::shared_ptr<FileCopyFailedEvent>);
143 
144  virtual void processEventTimer(std::shared_ptr<TimerEvent>);
145 
146  /***********************/
148  /***********************/
149 
150  /***********************/
152  /***********************/
153 
154  private:
155  friend class Simulation;
156  friend class DataMovementManager;
157  friend class JobManager;
158 
160  Workflow *workflow;
162  double start_time;
164  std::set<std::shared_ptr<ComputeService>> compute_services;
166  std::set<std::shared_ptr<StorageService>> storage_services;
168  std::set<std::shared_ptr<NetworkProximityService>> network_proximity_services;
170  std::shared_ptr<FileRegistryService> file_registry_service;
171 
173  std::shared_ptr<StandardJobScheduler> standard_job_scheduler;
175  std::shared_ptr<PilotJobScheduler> pilot_job_scheduler;
176 
178  std::vector<std::unique_ptr<DynamicOptimization>> dynamic_optimizations;
180  std::vector<std::unique_ptr<StaticOptimization>> static_optimizations;
181 
182  /***********************/
184  /***********************/
185 
186  private:
187  virtual int main() = 0;
188 
189  };
190 
191 };
192 
193 
194 #endif //WRENCH_WMS_H
PilotJobScheduler * getPilotJobScheduler()
Get the WMS&#39;s pilot scheduler.
Definition: WMS.cpp:381
A (mostly virtual) base class for implementing PilotJob scheduling algorithms to be used by a WMS...
Definition: PilotJobScheduler.h:26
A service that can be added to the simulation and that can be used by a WMS when executing a workflow...
Definition: Service.h:26
A cloud-based compute service that manages a set of physical hosts and controls access to their resou...
Definition: CloudComputeService.h:37
A virtualized cluster-based compute service.
Definition: VirtualizedClusterComputeService.h:28
A workflow (to be executed by a WMS)
Definition: Workflow.h:30
StandardJobScheduler * getStandardJobScheduler()
Get the WMS&#39;s pilot scheduler.
Definition: WMS.cpp:390
void addWorkflow(Workflow *workflow, double start_time=0)
Assign a workflow to the WMS.
Definition: WMS.cpp:272
A class that provides basic simulation methods. Once the simulation object has been explicitly or imp...
Definition: Simulation.h:45
void addDynamicOptimization(std::unique_ptr< DynamicOptimization >)
Add a dynamic optimization to the list of optimizations. Optimizations are executed in order of inser...
Definition: WMS.cpp:67
A (mostly virtual) base class for implementing StandardJob scheduling algorithms to be used by a WMS...
Definition: StandardJobScheduler.h:31
Workflow * getWorkflow()
Get the workflow that was assigned to the WMS.
Definition: WMS.cpp:297
A workflow management system (WMS)
Definition: WMS.h:35
void addStaticOptimization(std::unique_ptr< StaticOptimization >)
Add a static optimization to the list of optimizations. Optimizations are executed in order of insert...
Definition: WMS.cpp:77
Definition: Alarm.cpp:19