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
RevLine 
[5028]1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.ServiceModel;
[5375]5using HeuristicLab.Services.Hive.Common;
6using HeuristicLab.Services.Hive.Common.DataTransfer;
[5028]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>
[5106]14  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[5028]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    }
[5095]25    private ILifecycleManager lifecycleManager {
26      get { return ServiceLocator.Instance.LifecycleManager; }
[5028]27    }
[5405]28    private HeartbeatManager heartbeatManager {
29      get { return ServiceLocator.Instance.HeartbeatManager; }
30    }
[5028]31
32    #region Job Methods
[5526]33    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
34    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5511]35    public Guid AddJob(Job job, JobData jobData, IEnumerable<Guid> resourceIds) {
[5028]36      using (trans.OpenTransaction()) {
[5511]37        job.SetState(JobState.Waiting, auth.UserId);
[5155]38        job.Id = dao.AddJob(job);
39        jobData.JobId = job.Id;
[5106]40        jobData.LastUpdate = DateTime.Now;
[5511]41        if (resourceIds != null) {
42          foreach (Guid slaveGroupId in resourceIds) {
[5155]43            dao.AssignJobToResource(job.Id, slaveGroupId);
44          }
45        } else {
46          // todo: use default group
47        }
[5028]48        dao.AddJobData(jobData);
49        return jobData.JobId;
50      }
51    }
52
[5526]53    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
54    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]55    public Guid AddChildJob(Guid parentJobId, Job job, JobData jobData) {
56      using (trans.OpenTransaction()) {
57        job.ParentJobId = parentJobId;
[5155]58        return AddJob(job, jobData, dao.GetAssignedResources(parentJobId).Select(x => x.Id));
[5028]59      }
60    }
61
[5526]62    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
63    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
64    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5028]65    public Job GetJob(Guid jobId) {
66      return dao.GetJob(jobId);
67    }
68
[5526]69    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
70    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]71    public IEnumerable<Job> GetJobs() {
72      return dao.GetJobs(x => true);
73    }
74
[5526]75    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
76    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]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
[5526]81    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
82    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]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
[5526]87    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
88    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
89    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5028]90    public JobData GetJobData(Guid jobId) {
91      return dao.GetJobData(jobId);
92    }
93
[5526]94    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
95    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
96    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5511]97    public void UpdateJob(Job job) {
[5028]98      using (trans.OpenTransaction()) {
[5511]99        dao.UpdateJob(job);
100      }
101    }
102
[5526]103    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
104    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
105    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5511]106    public void UpdateJobData(Job job, JobData jobData) {
107      using (trans.OpenTransaction()) {
[5106]108        jobData.LastUpdate = DateTime.Now;
109        dao.UpdateJob(job);
110        dao.UpdateJobData(jobData);
[5028]111      }
112    }
113
[5526]114    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
115    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
116    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5106]117    public void DeleteJob(Guid jobId) {
[5028]118      using (trans.OpenTransaction()) {
[5106]119        dao.DeleteJob(jobId);
[5028]120      }
121    }
122
[5526]123    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
124    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
125    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5106]126    public void DeleteChildJobs(Guid parentJobId) {
[5028]127      using (trans.OpenTransaction()) {
[5106]128        var jobs = GetChildJobs(parentJobId, true, false);
[5028]129        foreach (var job in jobs) {
130          dao.DeleteJob(job.Id);
131          dao.DeleteJobData(job.Id);
132        };
133      }
134    }
[5102]135
[5028]136    #endregion
137
138    #region Job Control Methods
[5526]139    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
140    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
141    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5053]142    public void StopJob(Guid jobId) {
[5028]143      using (trans.OpenTransaction()) {
144        throw new NotImplementedException();
145      }
146    }
[5526]147
148    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
149    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
150    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5062]151    public void PauseJob(Guid jobId) {
[5028]152      using (trans.OpenTransaction()) {
153        throw new NotImplementedException();
154      }
155    }
156    #endregion
157
158    #region HiveExperiment Methods
[5526]159    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
160    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]161    public HiveExperiment GetHiveExperiment(Guid id) {
[5511]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();
[5028]166    }
167
[5526]168    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
169    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]170    public IEnumerable<HiveExperiment> GetHiveExperiments() {
[5511]171      return dao.GetHiveExperiments(x => x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0);
[5028]172    }
173
[5526]174    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
175    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]176    public Guid AddHiveExperiment(HiveExperiment hiveExperimentDto) {
177      using (trans.OpenTransaction()) {
[5511]178        hiveExperimentDto.OwnerUserId = auth.UserId;
[5106]179        hiveExperimentDto.DateCreated = DateTime.Now;
[5028]180        return dao.AddHiveExperiment(hiveExperimentDto);
181      }
182    }
183
[5526]184    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
185    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]186    public void UpdateHiveExperiment(HiveExperiment hiveExperimentDto) {
187      using (trans.OpenTransaction()) {
188        dao.UpdateHiveExperiment(hiveExperimentDto);
189      }
190    }
191
[5526]192    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
193    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]194    public void DeleteHiveExperiment(Guid hiveExperimentId) {
195      using (trans.OpenTransaction()) {
196        HiveExperiment he = dao.GetHiveExperiment(hiveExperimentId);
[5106]197        dao.DeleteHiveExperiment(hiveExperimentId); // child jobs will be deleted by db-trigger
[5028]198      }
199    }
200    #endregion
[5106]201
[5028]202    #region Login Methods
[5526]203    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5405]204    public void Hello(Slave slaveInfo) {
[5375]205      using (trans.OpenTransaction()) {
[5405]206        var slave = dao.GetSlave(slaveInfo.Id);
[5375]207
208        if (slave == null) {
[5405]209          dao.AddSlave(slaveInfo);
[5375]210        } else {
[5405]211          dao.UpdateSlave(slaveInfo);
[5375]212        }
213      }
[5053]214    }
[5028]215
[5526]216    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5375]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      }
[5053]225    }
[5028]226    #endregion
227
228    #region Heartbeat Methods
[5526]229    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5053]230    public List<MessageContainer> Heartbeat(Heartbeat heartbeat) {
[5028]231      using (trans.OpenTransaction()) {
[5405]232        return heartbeatManager.ProcessHeartbeat(heartbeat);
[5028]233      }
234    }
235    #endregion
236
237    #region Plugin Methods
[5526]238    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
239    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]240    public Guid AddPlugin(Plugin plugin, List<PluginData> pluginDatas) {
241      using (trans.OpenTransaction()) {
[5402]242        plugin.UserId = auth.UserId;
243        plugin.DateCreated = DateTime.Now;
[5028]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    }
[5526]252
253    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
254    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
255    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5053]256    public IEnumerable<Plugin> GetPlugins() {
257      return dao.GetPlugins(x => true);
[5028]258    }
[5375]259
[5526]260    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
261    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
262    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
[5053]263    public IEnumerable<PluginData> GetPluginDatas(List<Guid> pluginIds) {
[5375]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      }
[5028]277    }
[5375]278
[5028]279    #endregion
[5106]280
[5028]281    #region Slave Methods
[5526]282    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
283    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]284    public Guid AddSlave(Slave slave) {
285      using (trans.OpenTransaction()) {
286        return dao.AddSlave(slave);
287      }
288    }
289
[5526]290    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
291    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]292    public Guid AddSlaveGroup(SlaveGroup slaveGroup) {
293      using (trans.OpenTransaction()) {
294        return dao.AddSlaveGroup(slaveGroup);
295      }
296    }
297
[5526]298    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
299    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5106]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
[5526]308    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
309    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]310    public IEnumerable<Slave> GetSlaves() {
311      return dao.GetSlaves(x => true);
312    }
313
[5526]314    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
315    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5028]316    public IEnumerable<SlaveGroup> GetSlaveGroups() {
317      return dao.GetSlaveGroups(x => true);
318    }
319
[5526]320    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
321    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5106]322    public void UpdateSlave(Slave slave) {
[5028]323      using (trans.OpenTransaction()) {
[5106]324        dao.UpdateSlave(slave);
[5028]325      }
326    }
327
[5526]328    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
329    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5106]330    public void UpdateSlaveGroup(SlaveGroup slaveGroup) {
[5028]331      using (trans.OpenTransaction()) {
[5106]332        dao.UpdateSlaveGroup(slaveGroup);
[5028]333      }
334    }
335
[5526]336    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
337    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5106]338    public void DeleteSlave(Guid slaveId) {
[5028]339      using (trans.OpenTransaction()) {
[5106]340        dao.DeleteSlave(slaveId);
[5028]341      }
342    }
343
[5526]344    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
345    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5106]346    public void DeleteSlaveGroup(Guid slaveGroupId) {
[5028]347      using (trans.OpenTransaction()) {
[5106]348        dao.DeleteSlaveGroup(slaveGroupId);
[5028]349      }
350    }
[5106]351
[5526]352    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
353    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5106]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
[5526]362    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
363    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5106]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
[5526]372    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
373    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
[5458]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    }
[5028]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.