Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive/3.4/HiveService.cs @ 5402

Last change on this file since 5402 was 5402, checked in by cneumuel, 13 years ago

#1233

  • single sign on with HL
  • local plugins are uploaded if not available online (user can force the useage of local plugins)
  • changed plugin and plugindata db-schema
  • plugin dao tests
File size: 10.3 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.ServiceModel;
5using HeuristicLab.Services.Hive.Common;
6using HeuristicLab.Services.Hive.Common.DataTransfer;
7using HeuristicLab.Services.Hive.Common.ServiceContracts;
8
9namespace HeuristicLab.Services.Hive {
10
11  /// <summary>
12  /// Implementation of the Hive service (interface <see cref="IHiveService"/>).
13  /// </summary>
14  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
15  public class HiveService : IHiveService {
16    private DataAccess.IHiveDao dao {
17      get { return ServiceLocator.Instance.HiveDao; }
18    }
19    private HeuristicLab.Services.Hive.DataAccess.TransactionManager trans {
20      get { return ServiceLocator.Instance.TransactionManager; }
21    }
22    private IAuthorizationManager auth {
23      get { return ServiceLocator.Instance.AuthorizationManager; }
24    }
25    private ILifecycleManager lifecycleManager {
26      get { return ServiceLocator.Instance.LifecycleManager; }
27    }
28
29    #region Job Methods
30    //[PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
31    //[PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
32    public Guid AddJob(Job job, JobData jobData, IEnumerable<Guid> slaveGroupIds) {
33      using (trans.OpenTransaction()) {
34        job.UserId = auth.UserId;
35        job.DateCreated = DateTime.Now;
36        job.JobState = JobState.Waiting;
37        job.Id = dao.AddJob(job);
38        jobData.JobId = job.Id;
39        jobData.LastUpdate = DateTime.Now;
40        if (slaveGroupIds != null) {
41          foreach (Guid slaveGroupId in slaveGroupIds) {
42            dao.AssignJobToResource(job.Id, slaveGroupId);
43          }
44        } else {
45          // todo: use default group
46        }
47        dao.AddJobData(jobData);
48        return jobData.JobId;
49      }
50    }
51
52    public Guid AddChildJob(Guid parentJobId, Job job, JobData jobData) {
53      using (trans.OpenTransaction()) {
54        job.ParentJobId = parentJobId;
55        return AddJob(job, jobData, dao.GetAssignedResources(parentJobId).Select(x => x.Id));
56      }
57    }
58
59    public Job GetJob(Guid jobId) {
60      return dao.GetJob(jobId);
61    }
62
63    public IEnumerable<Job> GetJobs() {
64      return dao.GetJobs(x => true);
65    }
66
67    public IEnumerable<LightweightJob> GetLightweightJobs(IEnumerable<Guid> jobIds) {
68      return dao.GetJobs(x => jobIds.Contains(x.JobId)).Select(x => new LightweightJob(x)).ToArray();
69    }
70
71    public IEnumerable<LightweightJob> GetLightweightChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
72      return GetChildJobs(parentJobId, recursive, includeParent).Select(x => new LightweightJob(x)).ToArray();
73    }
74
75    public JobData GetJobData(Guid jobId) {
76      return dao.GetJobData(jobId);
77    }
78
79    public void UpdateJob(Job job, JobData jobData) {
80      using (trans.OpenTransaction()) {
81        jobData.LastUpdate = DateTime.Now;
82        dao.UpdateJob(job);
83        dao.UpdateJobData(jobData);
84      }
85    }
86
87    public void DeleteJob(Guid jobId) {
88      using (trans.OpenTransaction()) {
89        dao.DeleteJob(jobId);
90      }
91    }
92
93    public void DeleteChildJobs(Guid parentJobId) {
94      using (trans.OpenTransaction()) {
95        var jobs = GetChildJobs(parentJobId, true, false);
96        foreach (var job in jobs) {
97          dao.DeleteJob(job.Id);
98          dao.DeleteJobData(job.Id);
99        };
100      }
101    }
102
103    public Job AquireJob(Guid slaveId) {
104      using (trans.OpenTransaction()) {
105        var slave = dao.GetSlave(slaveId);
106        var availableJobs = dao.GetWaitingJobs(slave);
107        var job = availableJobs.FirstOrDefault();
108
109        if (job != null) {
110          job.SlaveId = slaveId;
111          job.JobState = JobState.Calculating;
112        }
113        return job;
114      }
115    }
116
117    public PluginData GetConfigurationFile() {
118      using (trans.OpenTransaction()) {
119        //TODO: move filename to app.config
120        PluginData configFile = dao.GetPluginDatas(x => x.FileName == "HeuristicLab 3.3.exe.config").SingleOrDefault();
121        if (configFile == null) {
122          //TODO: error handling
123          return null;
124        } else {
125          return configFile;
126        }
127      }
128    }
129
130    #endregion
131
132    #region Job Control Methods
133    public void StopJob(Guid jobId) {
134      using (trans.OpenTransaction()) {
135        throw new NotImplementedException();
136      }
137    }
138    public void PauseJob(Guid jobId) {
139      using (trans.OpenTransaction()) {
140        throw new NotImplementedException();
141      }
142    }
143    #endregion
144
145    #region HiveExperiment Methods
146
147    public HiveExperiment GetHiveExperiment(Guid id) {
148      return dao.GetHiveExperiments(x => x.UserId == auth.UserId && x.HiveExperimentId == id).FirstOrDefault();
149    }
150
151    public IEnumerable<HiveExperiment> GetHiveExperiments() {
152      return dao.GetHiveExperiments(x => x.UserId == auth.UserId);
153    }
154
155    public Guid AddHiveExperiment(HiveExperiment hiveExperimentDto) {
156      using (trans.OpenTransaction()) {
157        hiveExperimentDto.UserId = auth.UserId;
158        hiveExperimentDto.DateCreated = DateTime.Now;
159        return dao.AddHiveExperiment(hiveExperimentDto);
160      }
161    }
162
163    public void UpdateHiveExperiment(HiveExperiment hiveExperimentDto) {
164      using (trans.OpenTransaction()) {
165        dao.UpdateHiveExperiment(hiveExperimentDto);
166      }
167    }
168
169    public void DeleteHiveExperiment(Guid hiveExperimentId) {
170      using (trans.OpenTransaction()) {
171        HiveExperiment he = dao.GetHiveExperiment(hiveExperimentId);
172        dao.DeleteHiveExperiment(hiveExperimentId); // child jobs will be deleted by db-trigger
173      }
174    }
175    #endregion
176
177    #region Login Methods
178    public void Hello(Guid slaveId, string name, int cores, int memory) {
179      using (trans.OpenTransaction()) {
180        var slave = dao.GetSlave(slaveId);
181
182        if (slave == null) {
183          slave = new Slave { Id = slaveId, Name = name, Cores = cores, Memory = memory };
184          slave.IsAllowedToCalculate = true; //a little bit to optimistic?
185          slave.SlaveState = SlaveState.Idle;
186          dao.AddSlave(slave);
187        } else {
188          //TODO: error handling?
189        }
190      }
191    }
192
193    public void GoodBye(Guid slaveId) {
194      using (trans.OpenTransaction()) {
195        var slave = dao.GetSlave(slaveId);
196        if (slave != null) {
197          slave.SlaveState = SlaveState.Offline;
198          dao.UpdateSlave(slave);
199        }
200      }
201    }
202    #endregion
203
204    #region Heartbeat Methods
205    public List<MessageContainer> Heartbeat(Heartbeat heartbeat) {
206      using (trans.OpenTransaction()) {
207        return lifecycleManager.ProcessHeartbeat(heartbeat);
208      }
209    }
210    #endregion
211
212    #region Plugin Methods
213    public Guid AddPlugin(Plugin plugin, List<PluginData> pluginDatas) {
214      using (trans.OpenTransaction()) {
215        plugin.UserId = auth.UserId;
216        plugin.DateCreated = DateTime.Now;
217        Guid pluginId = dao.AddPlugin(plugin);
218        foreach (PluginData pluginData in pluginDatas) {
219          pluginData.PluginId = pluginId;
220          dao.AddPluginData(pluginData);
221        }
222        return pluginId;
223      }
224    }
225    public IEnumerable<Plugin> GetPlugins() {
226      return dao.GetPlugins(x => true);
227    }
228
229    public IEnumerable<PluginData> GetPluginDatas(List<Guid> pluginIds) {
230      List<PluginData> pluginDatas = new List<PluginData>();
231
232      using (trans.OpenTransaction()) {
233        foreach (Guid guid in pluginIds) {
234          List<PluginData> pluginData = dao.GetPluginDatas(x => x.PluginId == guid).ToList();
235          if (pluginData != null) {
236            pluginDatas.AddRange(pluginData);
237          } else {
238            //ignore ?
239          }
240        }
241        return pluginDatas;
242      }
243    }
244
245    #endregion
246
247    #region Slave Methods
248    public Guid AddSlave(Slave slave) {
249      using (trans.OpenTransaction()) {
250        return dao.AddSlave(slave);
251      }
252    }
253
254    public Guid AddSlaveGroup(SlaveGroup slaveGroup) {
255      using (trans.OpenTransaction()) {
256        return dao.AddSlaveGroup(slaveGroup);
257      }
258    }
259
260    public Slave GetSlave(Guid slaveId) {
261      return dao.GetSlave(slaveId);
262    }
263
264    public SlaveGroup GetSlaveGroup(Guid slaveGroupId) {
265      return dao.GetSlaveGroup(slaveGroupId);
266    }
267
268    public IEnumerable<Slave> GetSlaves() {
269      return dao.GetSlaves(x => true);
270    }
271
272    public IEnumerable<SlaveGroup> GetSlaveGroups() {
273      return dao.GetSlaveGroups(x => true);
274    }
275
276    public void UpdateSlave(Slave slave) {
277      using (trans.OpenTransaction()) {
278        dao.UpdateSlave(slave);
279      }
280    }
281
282    public void UpdateSlaveGroup(SlaveGroup slaveGroup) {
283      using (trans.OpenTransaction()) {
284        dao.UpdateSlaveGroup(slaveGroup);
285      }
286    }
287
288    public void DeleteSlave(Guid slaveId) {
289      using (trans.OpenTransaction()) {
290        dao.DeleteSlave(slaveId);
291      }
292    }
293
294    public void DeleteSlaveGroup(Guid slaveGroupId) {
295      using (trans.OpenTransaction()) {
296        dao.DeleteSlaveGroup(slaveGroupId);
297      }
298    }
299
300    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
301      using (trans.OpenTransaction()) {
302        var resource = dao.GetResource(resourceId);
303        resource.ParentResourceId = slaveGroupId;
304        dao.UpdateResource(resource);
305      }
306    }
307
308    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
309      using (trans.OpenTransaction()) {
310        var resource = dao.GetResource(resourceId);
311        resource.ParentResourceId = null;
312        dao.UpdateResource(resource);
313      }
314    }
315
316    #endregion
317
318    #region Helper Methods
319    private IEnumerable<Job> GetChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
320      var jobs = new List<Job>(dao.GetJobs(x => parentJobId == null ? !x.ParentJobId.HasValue : x.ParentJobId.Value == parentJobId));
321
322      if (includeParent) {
323        jobs.Add(GetJob(parentJobId.Value));
324      }
325
326      if (recursive) {
327        var childs = new List<Job>();
328        foreach (var job in jobs) {
329          childs.AddRange(GetChildJobs(job.Id, recursive, false));
330        }
331        jobs.AddRange(childs);
332      }
333      return jobs;
334    }
335
336    #endregion
337
338  }
339}
Note: See TracBrowser for help on using the repository browser.