Free cookie consent management tool by TermsFeed Policy Generator

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

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

#1233

  • fixed handling of StateLog in DataLayer
  • extended unit tests
  • changed style of service calls to OKB-like style (using delegates)
  • added possibility that parent jobs can be finished immediately when child jobs are finished
File size: 16.1 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    private HeartbeatManager heartbeatManager {
29      get { return ServiceLocator.Instance.HeartbeatManager; }
30    }
31
32    #region Job Methods
33    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
34    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
35    public Guid AddJob(Job job, JobData jobData, IEnumerable<Guid> resourceIds) {
36      using (trans.OpenTransaction()) {
37        job.SetState(JobState.Waiting, auth.UserId);
38        job.Id = dao.AddJob(job);
39        jobData.JobId = job.Id;
40        jobData.LastUpdate = DateTime.Now;
41        if (resourceIds != null) {
42          foreach (Guid slaveGroupId in resourceIds) {
43            dao.AssignJobToResource(job.Id, slaveGroupId);
44          }
45        } else {
46          // todo: use default group
47        }
48        dao.AddJobData(jobData);
49        return jobData.JobId;
50      }
51    }
52
53    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
54    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
55    public Guid AddChildJob(Guid parentJobId, Job job, JobData jobData) {
56      using (trans.OpenTransaction()) {
57        job.ParentJobId = parentJobId;
58        return AddJob(job, jobData, dao.GetAssignedResources(parentJobId).Select(x => x.Id));
59      }
60    }
61
62    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
63    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
64    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
65    public Job GetJob(Guid jobId) {
66      return dao.GetJob(jobId);
67    }
68
69    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
70    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
71    public IEnumerable<Job> GetJobs() {
72      return dao.GetJobs(x => true);
73    }
74
75    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
76    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
77    public IEnumerable<LightweightJob> GetLightweightJobs(IEnumerable<Guid> jobIds) {
78      return dao.GetJobs(x => jobIds.Contains(x.JobId)).Select(x => new LightweightJob(x)).ToArray();
79    }
80
81    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
82    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
83    public IEnumerable<LightweightJob> GetLightweightChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
84      return GetChildJobs(parentJobId, recursive, includeParent).Select(x => new LightweightJob(x)).ToArray();
85    }
86
87    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
88    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
89    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
90    public JobData GetJobData(Guid jobId) {
91      return dao.GetJobData(jobId);
92    }
93
94    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
95    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
96    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
97    public void UpdateJob(Job job) {
98      using (trans.OpenTransaction()) {
99        dao.UpdateJob(job);
100      }
101    }
102
103    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
104    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
105    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
106    public void UpdateJobData(Job job, JobData jobData) {
107      using (trans.OpenTransaction()) {
108        jobData.LastUpdate = DateTime.Now;
109        dao.UpdateJob(job);
110        dao.UpdateJobData(jobData);
111      }
112    }
113
114    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
115    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
116    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
117    public void DeleteJob(Guid jobId) {
118      using (trans.OpenTransaction()) {
119        dao.DeleteJob(jobId);
120      }
121    }
122
123    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
124    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
125    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
126    public void DeleteChildJobs(Guid parentJobId) {
127      using (trans.OpenTransaction()) {
128        var jobs = GetChildJobs(parentJobId, true, false);
129        foreach (var job in jobs) {
130          dao.DeleteJob(job.Id);
131          dao.DeleteJobData(job.Id);
132        };
133      }
134    }
135
136    #endregion
137
138    #region Job Control Methods
139    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
140    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
141    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
142    public void StopJob(Guid jobId) {
143      using (trans.OpenTransaction()) {
144        throw new NotImplementedException();
145      }
146    }
147
148    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
149    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
150    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
151    public void PauseJob(Guid jobId) {
152      using (trans.OpenTransaction()) {
153        throw new NotImplementedException();
154      }
155    }
156    #endregion
157
158    #region HiveExperiment Methods
159    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
160    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
161    public HiveExperiment GetHiveExperiment(Guid id) {
162      return dao.GetHiveExperiments(x =>
163             x.HiveExperimentId == id
164          && (x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0)
165          ).FirstOrDefault();
166    }
167
168    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
169    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
170    public IEnumerable<HiveExperiment> GetHiveExperiments() {
171      return dao.GetHiveExperiments(x => x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0);
172    }
173
174    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
175    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
176    public Guid AddHiveExperiment(HiveExperiment hiveExperimentDto) {
177      using (trans.OpenTransaction()) {
178        hiveExperimentDto.OwnerUserId = auth.UserId;
179        hiveExperimentDto.DateCreated = DateTime.Now;
180        return dao.AddHiveExperiment(hiveExperimentDto);
181      }
182    }
183
184    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
185    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
186    public void UpdateHiveExperiment(HiveExperiment hiveExperimentDto) {
187      using (trans.OpenTransaction()) {
188        dao.UpdateHiveExperiment(hiveExperimentDto);
189      }
190    }
191
192    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
193    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
194    public void DeleteHiveExperiment(Guid hiveExperimentId) {
195      using (trans.OpenTransaction()) {
196        HiveExperiment he = dao.GetHiveExperiment(hiveExperimentId);
197        dao.DeleteHiveExperiment(hiveExperimentId); // child jobs will be deleted by db-trigger
198      }
199    }
200    #endregion
201
202    #region Login Methods
203    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
204    public void Hello(Slave slaveInfo) {
205      using (trans.OpenTransaction()) {
206        var slave = dao.GetSlave(slaveInfo.Id);
207
208        if (slave == null) {
209          dao.AddSlave(slaveInfo);
210        } else {
211          dao.UpdateSlave(slaveInfo);
212        }
213      }
214    }
215
216    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
217    public void GoodBye(Guid slaveId) {
218      using (trans.OpenTransaction()) {
219        var slave = dao.GetSlave(slaveId);
220        if (slave != null) {
221          slave.SlaveState = SlaveState.Offline;
222          dao.UpdateSlave(slave);
223        }
224      }
225    }
226    #endregion
227
228    #region Heartbeat Methods
229    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
230    public List<MessageContainer> Heartbeat(Heartbeat heartbeat) {
231      using (trans.OpenTransaction()) {
232        return heartbeatManager.ProcessHeartbeat(heartbeat);
233      }
234    }
235    #endregion
236
237    #region Plugin Methods
238    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
239    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
240    public Guid AddPlugin(Plugin plugin, List<PluginData> pluginDatas) {
241      using (trans.OpenTransaction()) {
242        plugin.UserId = auth.UserId;
243        plugin.DateCreated = DateTime.Now;
244        Guid pluginId = dao.AddPlugin(plugin);
245        foreach (PluginData pluginData in pluginDatas) {
246          pluginData.PluginId = pluginId;
247          dao.AddPluginData(pluginData);
248        }
249        return pluginId;
250      }
251    }
252
253    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
254    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
255    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
256    public IEnumerable<Plugin> GetPlugins() {
257      return dao.GetPlugins(x => true);
258    }
259
260    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
261    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
262    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
263    public IEnumerable<PluginData> GetPluginDatas(List<Guid> pluginIds) {
264      List<PluginData> pluginDatas = new List<PluginData>();
265
266      using (trans.OpenTransaction()) {
267        foreach (Guid guid in pluginIds) {
268          List<PluginData> pluginData = dao.GetPluginDatas(x => x.PluginId == guid).ToList();
269          if (pluginData != null) {
270            pluginDatas.AddRange(pluginData);
271          } else {
272            //ignore ?
273          }
274        }
275        return pluginDatas;
276      }
277    }
278
279    #endregion
280
281    #region Slave Methods
282    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
283    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
284    public Guid AddSlave(Slave slave) {
285      using (trans.OpenTransaction()) {
286        return dao.AddSlave(slave);
287      }
288    }
289
290    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
291    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
292    public Guid AddSlaveGroup(SlaveGroup slaveGroup) {
293      using (trans.OpenTransaction()) {
294        return dao.AddSlaveGroup(slaveGroup);
295      }
296    }
297
298    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
299    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
300    public Slave GetSlave(Guid slaveId) {
301      return dao.GetSlave(slaveId);
302    }
303
304    public SlaveGroup GetSlaveGroup(Guid slaveGroupId) {
305      return dao.GetSlaveGroup(slaveGroupId);
306    }
307
308    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
309    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
310    public IEnumerable<Slave> GetSlaves() {
311      return dao.GetSlaves(x => true);
312    }
313
314    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
315    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
316    public IEnumerable<SlaveGroup> GetSlaveGroups() {
317      return dao.GetSlaveGroups(x => true);
318    }
319
320    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
321    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
322    public void UpdateSlave(Slave slave) {
323      using (trans.OpenTransaction()) {
324        dao.UpdateSlave(slave);
325      }
326    }
327
328    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
329    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
330    public void UpdateSlaveGroup(SlaveGroup slaveGroup) {
331      using (trans.OpenTransaction()) {
332        dao.UpdateSlaveGroup(slaveGroup);
333      }
334    }
335
336    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
337    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
338    public void DeleteSlave(Guid slaveId) {
339      using (trans.OpenTransaction()) {
340        dao.DeleteSlave(slaveId);
341      }
342    }
343
344    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
345    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
346    public void DeleteSlaveGroup(Guid slaveGroupId) {
347      using (trans.OpenTransaction()) {
348        dao.DeleteSlaveGroup(slaveGroupId);
349      }
350    }
351
352    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
353    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
354    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
355      using (trans.OpenTransaction()) {
356        var resource = dao.GetResource(resourceId);
357        resource.ParentResourceId = slaveGroupId;
358        dao.UpdateResource(resource);
359      }
360    }
361
362    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
363    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
364    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
365      using (trans.OpenTransaction()) {
366        var resource = dao.GetResource(resourceId);
367        resource.ParentResourceId = null;
368        dao.UpdateResource(resource);
369      }
370    }
371
372    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
373    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
374    public Guid GetResourceId(string resourceName) {
375      using (trans.OpenTransaction()) {
376        var resource = dao.GetResources(x => x.Name == resourceName).FirstOrDefault();
377        if (resource != null) {
378          return resource.Id;
379        } else {
380          return Guid.Empty;
381        }
382      }
383    }
384    #endregion
385
386    #region Helper Methods
387    private IEnumerable<Job> GetChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
388      var jobs = new List<Job>(dao.GetJobs(x => parentJobId == null ? !x.ParentJobId.HasValue : x.ParentJobId.Value == parentJobId));
389
390      if (includeParent) {
391        jobs.Add(GetJob(parentJobId.Value));
392      }
393
394      if (recursive) {
395        var childs = new List<Job>();
396        foreach (var job in jobs) {
397          childs.AddRange(GetChildJobs(job.Id, recursive, false));
398        }
399        jobs.AddRange(childs);
400      }
401      return jobs;
402    }
403
404    #endregion
405  }
406}
Note: See TracBrowser for help on using the repository browser.