Free cookie consent management tool by TermsFeed Policy Generator

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

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

#1233

  • implemented pause, stop for single jobs
  • introduced Command property for jobs (to distinguish between state and command (abort vs. aborted))
  • improved behaviour of ItemTreeView (double click opens new window, selected item stays marked)
  • fixed bugs in StateLogGanttChartListView and HiveJobView
  • fixed cloning of client-side dtos
File size: 19.4 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  /// We need 'IgnoreExtensionDataObject' Attribute for the slave to work.
14  /// </summary>
15  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, IgnoreExtensionDataObject = true)]
16  public class HiveService : IHiveService {
17    private DataAccess.IHiveDao dao {
18      get { return ServiceLocator.Instance.HiveDao; }
19    }
20    private HeuristicLab.Services.Hive.DataAccess.TransactionManager trans {
21      get { return ServiceLocator.Instance.TransactionManager; }
22    }
23    private IAuthorizationManager auth {
24      get { return ServiceLocator.Instance.AuthorizationManager; }
25    }
26    private ILifecycleManager lifecycleManager {
27      get { return ServiceLocator.Instance.LifecycleManager; }
28    }
29    private HeartbeatManager heartbeatManager {
30      get { return ServiceLocator.Instance.HeartbeatManager; }
31    }
32
33    #region Job Methods
34    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
35    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
36    public Guid AddJob(Job job, JobData jobData, IEnumerable<Guid> resourceIds) {
37      return trans.UseTransaction(() => {
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        dao.UpdateJobState(job.Id, JobState.Waiting, null, auth.UserId, null);
50        return jobData.JobId;
51      });
52    }
53
54    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
55    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
56    public Guid AddChildJob(Guid parentJobId, Job job, JobData jobData) {
57      return trans.UseTransaction(() => {
58        job.ParentJobId = parentJobId;
59        return AddJob(job, jobData, dao.GetAssignedResources(parentJobId).Select(x => x.Id));
60      });
61    }
62
63    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
64    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
65    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
66    public Job GetJob(Guid jobId) {
67      return dao.GetJob(jobId);
68    }
69
70    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
71    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
72    public IEnumerable<Job> GetJobs() {
73      return dao.GetJobs(x => true);
74    }
75
76    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
77    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
78    public IEnumerable<LightweightJob> GetLightweightJobs(IEnumerable<Guid> jobIds) {
79      return dao.GetJobs(x => jobIds.Contains(x.JobId)).Select(x => new LightweightJob(x)).ToArray();
80    }
81
82    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
83    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
84    public IEnumerable<LightweightJob> GetLightweightChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
85      return GetChildJobs(parentJobId, recursive, includeParent).Select(x => new LightweightJob(x)).ToArray();
86    }
87
88    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
89    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
90    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
91    public JobData GetJobData(Guid jobId) {
92      return dao.GetJobData(jobId);
93    }
94
95    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
96    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
97    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
98    public void UpdateJob(Job job) {
99      trans.UseTransaction(() => {
100        dao.UpdateJob(job);
101      });
102    }
103
104    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
105    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
106    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
107    public void UpdateJobData(Job job, JobData jobData) {
108      trans.UseTransaction(() => {
109        jobData.LastUpdate = DateTime.Now;
110        dao.UpdateJob(job);
111        dao.UpdateJobData(jobData);
112      });
113    }
114
115    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
116    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
117    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
118    public void DeleteJob(Guid jobId) {
119      trans.UseTransaction(() => {
120        dao.DeleteJob(jobId);
121      });
122    }
123
124    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
125    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
126    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
127    public void DeleteChildJobs(Guid parentJobId) {
128      trans.UseTransaction(() => {
129        var jobs = GetChildJobs(parentJobId, true, false);
130        foreach (var job in jobs) {
131          dao.DeleteJob(job.Id);
132          dao.DeleteJobData(job.Id);
133        };
134      });
135    }
136
137    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
138    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
139    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
140    public Job UpdateJobState(Guid jobId, JobState jobState, Guid? slaveId, Guid? userId, string exception) {
141      return trans.UseTransaction(() => {
142        Job job = dao.UpdateJobState(jobId, jobState, slaveId, userId, exception);
143        if (job.Command.HasValue && job.Command.Value == Command.Pause && job.State == JobState.Paused) {
144          job.Command = null;
145        } else if (job.Command.HasValue && job.Command.Value == Command.Abort && job.State == JobState.Aborted) {
146          job.Command = null;
147        } else if (job.Command.HasValue && job.Command.Value == Command.Stop && job.State == JobState.Aborted) {
148          job.Command = null;
149        }
150        dao.UpdateJob(job);
151        return job;
152      });
153    }
154    #endregion
155
156    #region Job Control Methods
157    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
158    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
159    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
160    public void StopJob(Guid jobId) {
161      trans.UseTransaction(() => {
162        //dao.UpdateJobState(jobId, JobState.Aborted, null, auth.UserId, string.Empty);
163        var job = dao.GetJob(jobId);
164        job.Command = Command.Stop;
165        dao.UpdateJob(job);
166      });
167    }
168
169    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
170    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
171    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
172    public void PauseJob(Guid jobId) {
173      trans.UseTransaction(() => {
174        //dao.UpdateJobState(jobId, JobState.Paused, null, auth.UserId, string.Empty);
175        var job = dao.GetJob(jobId);
176        job.Command = Command.Pause;
177        dao.UpdateJob(job);
178      });
179    }
180
181    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
182    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
183    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
184    public void RestartJob(Guid jobId) {
185      trans.UseTransaction(() => {
186        Job job = dao.UpdateJobState(jobId, JobState.Waiting, null, auth.UserId, string.Empty);
187        job.Command = null;
188        dao.UpdateJob(job);
189      });
190    }
191    #endregion
192
193    #region HiveExperiment Methods
194    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
195    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
196    public HiveExperiment GetHiveExperiment(Guid id) {
197      return dao.GetHiveExperiments(x =>
198             x.HiveExperimentId == id
199          && (x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0)
200          ).FirstOrDefault();
201    }
202
203    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
204    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
205    public IEnumerable<HiveExperiment> GetHiveExperiments() {
206      return dao.GetHiveExperiments(x => x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0);
207    }
208
209    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]   
210    public IEnumerable<HiveExperiment> GetAllHiveExperiments() {
211      return dao.GetHiveExperiments(x => true);
212    }
213
214    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
215    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
216    public Guid AddHiveExperiment(HiveExperiment hiveExperimentDto) {
217      return trans.UseTransaction(() => {
218        hiveExperimentDto.OwnerUserId = auth.UserId;
219        hiveExperimentDto.DateCreated = DateTime.Now;
220        return dao.AddHiveExperiment(hiveExperimentDto);
221      });
222    }
223
224    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
225    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
226    public void UpdateHiveExperiment(HiveExperiment hiveExperimentDto) {
227      trans.UseTransaction(() => {
228        dao.UpdateHiveExperiment(hiveExperimentDto);
229      });
230    }
231
232    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
233    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
234    public void DeleteHiveExperiment(Guid hiveExperimentId) {
235      trans.UseTransaction(() => {
236        HiveExperiment he = dao.GetHiveExperiment(hiveExperimentId);
237        dao.DeleteHiveExperiment(hiveExperimentId); // child jobs will be deleted by db-trigger
238      });
239    }
240    #endregion
241
242    #region Login Methods
243    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
244    public void Hello(Slave slaveInfo) {
245      trans.UseTransaction(() => {
246        var slave = dao.GetSlave(slaveInfo.Id);
247
248        if (slave == null) {
249          dao.AddSlave(slaveInfo);
250        } else {
251          dao.UpdateSlave(slaveInfo);
252        }
253      });
254    }
255
256    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
257    public void GoodBye(Guid slaveId) {
258      trans.UseTransaction(() => {
259        var slave = dao.GetSlave(slaveId);
260        if (slave != null) {
261          slave.SlaveState = SlaveState.Offline;
262          dao.UpdateSlave(slave);
263        }
264      });
265    }
266    #endregion
267
268    #region Heartbeat Methods
269    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
270    public List<MessageContainer> Heartbeat(Heartbeat heartbeat) {
271      TriggerLifecycle(false);
272      return trans.UseTransaction(() => heartbeatManager.ProcessHeartbeat(heartbeat));
273    }
274    #endregion
275
276    #region Plugin Methods
277    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
278    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
279    public Guid AddPlugin(Plugin plugin, List<PluginData> pluginDatas) {
280      return trans.UseTransaction(() => {
281        plugin.UserId = auth.UserId;
282        plugin.DateCreated = DateTime.Now;
283        Guid pluginId = dao.AddPlugin(plugin);
284        foreach (PluginData pluginData in pluginDatas) {
285          pluginData.PluginId = pluginId;
286          dao.AddPluginData(pluginData);
287        }
288        return pluginId;
289      });
290    }
291
292    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
293    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
294    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
295    public IEnumerable<Plugin> GetPlugins() {
296      return dao.GetPlugins(x => x.IsLocal == false);
297    }
298
299    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
300    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
301    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
302    public IEnumerable<PluginData> GetPluginDatas(List<Guid> pluginIds) {
303      List<PluginData> pluginDatas = new List<PluginData>();
304
305      return trans.UseTransaction(() => {
306        foreach (Guid guid in pluginIds) {
307          List<PluginData> pluginData = dao.GetPluginDatas(x => x.PluginId == guid).ToList();
308          if (pluginData != null) {
309            pluginDatas.AddRange(pluginData);
310          } else {
311            //ignore ?
312          }
313        }
314        return pluginDatas;
315      });
316    }
317
318    #endregion
319
320    #region Slave Methods
321    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
322    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
323    public Guid AddSlave(Slave slave) {
324      return trans.UseTransaction(() => dao.AddSlave(slave));
325    }
326
327    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
328    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
329    public Guid AddSlaveGroup(SlaveGroup slaveGroup) {
330      return trans.UseTransaction(() => dao.AddSlaveGroup(slaveGroup));
331    }
332
333    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
334    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
335    public Slave GetSlave(Guid slaveId) {
336      return dao.GetSlave(slaveId);
337    }
338
339    public SlaveGroup GetSlaveGroup(Guid slaveGroupId) {
340      return dao.GetSlaveGroup(slaveGroupId);
341    }
342
343    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
344    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
345    public IEnumerable<Slave> GetSlaves() {
346      return dao.GetSlaves(x => true);
347    }
348
349    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
350    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
351    public IEnumerable<SlaveGroup> GetSlaveGroups() {
352      return dao.GetSlaveGroups(x => true);
353    }
354
355    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
356    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
357    public void UpdateSlave(Slave slave) {
358      trans.UseTransaction(() => {
359        dao.UpdateSlave(slave);
360      });
361    }
362
363    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
364    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
365    public void UpdateSlaveGroup(SlaveGroup slaveGroup) {
366      trans.UseTransaction(() => {
367        dao.UpdateSlaveGroup(slaveGroup);
368      });
369    }
370
371    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
372    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
373    public void DeleteSlave(Guid slaveId) {
374      trans.UseTransaction(() => {
375        dao.DeleteSlave(slaveId);
376      });
377    }
378
379    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
380    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
381    public void DeleteSlaveGroup(Guid slaveGroupId) {
382      trans.UseTransaction(() => {
383        dao.DeleteSlaveGroup(slaveGroupId);
384      });
385    }
386
387    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
388    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
389    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
390      trans.UseTransaction(() => {
391        var resource = dao.GetResource(resourceId);
392        resource.ParentResourceId = slaveGroupId;
393        dao.UpdateResource(resource);
394      });
395    }
396
397    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
398    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
399    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
400      trans.UseTransaction(() => {
401        var resource = dao.GetResource(resourceId);
402        resource.ParentResourceId = null;
403        dao.UpdateResource(resource);
404      });
405    }
406
407    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
408    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
409    public Guid GetResourceId(string resourceName) {
410      return trans.UseTransaction(() => {
411        var resource = dao.GetResources(x => x.Name == resourceName).FirstOrDefault();
412        if (resource != null) {
413          return resource.Id;
414        } else {
415          return Guid.Empty;
416        }
417      });
418    }
419
420    public void TriggerLifecycle(bool force) {
421      trans.UseTransaction(() => {
422        DateTime lastCleanup = dao.GetLastCleanup();
423        if (force || DateTime.Now - lastCleanup > TimeSpan.FromSeconds(59)) {
424          dao.SetLastCleanup(DateTime.Now);
425          lifecycleManager.Cleanup();
426        }
427      });
428    }
429    #endregion
430
431    #region Helper Methods
432    private IEnumerable<Job> GetChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
433      var jobs = new List<Job>(dao.GetJobs(x => parentJobId == null ? !x.ParentJobId.HasValue : x.ParentJobId.Value == parentJobId));
434
435      if (recursive) {
436        var childs = new List<Job>();
437        foreach (var job in jobs) {
438          childs.AddRange(GetChildJobs(job.Id, recursive, false));
439        }
440        jobs.AddRange(childs);
441      }
442
443      if (includeParent) jobs.Add(GetJob(parentJobId.Value));
444
445      return jobs;
446    }
447
448    #endregion
449
450    #region Appointment Methods
451
452    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
453    public Guid AddAppointment(Appointment appointment) {
454      return trans.UseTransaction(() => dao.AddAppointment(appointment));
455    }
456
457    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
458    public void DeleteAppointment(Guid appointmentId) {
459      trans.UseTransaction(() => {
460        dao.DeleteAppointment(appointmentId);
461      });
462    }
463
464    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
465    public void UpdateAppointment(Appointment appointment) {
466      trans.UseTransaction(() => {
467        dao.UpdateAppointment(appointment);
468      });
469    }
470
471    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
472    public IEnumerable<Appointment> GetScheduleForResource(Guid resourceId) {
473      return trans.UseTransaction(() => dao.GetAppointments(x => x.ResourceId == resourceId));
474    }
475    #endregion
476  }
477}
Note: See TracBrowser for help on using the repository browser.