Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 5599 was 5599, checked in by ascheibe, 14 years ago

#1233

  • rename 'Slave' namespace to 'SlaveCore' (and assemblies etc) to avoid problems with 'Slave' class
  • use svcutil (OKB-style)
File size: 16.5 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      using (trans.OpenTransaction()) {
38        job.SetState(JobState.Waiting, auth.UserId);
39        job.Id = dao.AddJob(job);
40        jobData.JobId = job.Id;
41        jobData.LastUpdate = DateTime.Now;
42        if (resourceIds != null) {
43          foreach (Guid slaveGroupId in resourceIds) {
44            dao.AssignJobToResource(job.Id, slaveGroupId);
45          }
46        } else {
47          // todo: use default group
48        }
49        dao.AddJobData(jobData);
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      using (trans.OpenTransaction()) {
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      using (trans.OpenTransaction()) {
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      using (trans.OpenTransaction()) {
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      using (trans.OpenTransaction()) {
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      using (trans.OpenTransaction()) {
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    #endregion
138
139    #region Job Control Methods
140    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
141    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
142    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
143    public void StopJob(Guid jobId) {
144      using (trans.OpenTransaction()) {
145        throw new NotImplementedException();
146      }
147    }
148
149    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
150    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
151    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
152    public void PauseJob(Guid jobId) {
153      using (trans.OpenTransaction()) {
154        throw new NotImplementedException();
155      }
156    }
157    #endregion
158
159    #region HiveExperiment Methods
160    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
161    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
162    public HiveExperiment GetHiveExperiment(Guid id) {
163      return dao.GetHiveExperiments(x =>
164             x.HiveExperimentId == id
165          && (x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0)
166          ).FirstOrDefault();
167    }
168
169    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
170    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
171    public IEnumerable<HiveExperiment> GetHiveExperiments() {
172      return dao.GetHiveExperiments(x => x.OwnerUserId == auth.UserId || x.HiveExperimentPermissions.Count(hep => hep.Permission != Permission.NotAllowed && hep.GrantedUserId == auth.UserId) > 0);
173    }
174
175    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
176    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
177    public Guid AddHiveExperiment(HiveExperiment hiveExperimentDto) {
178      using (trans.OpenTransaction()) {
179        hiveExperimentDto.OwnerUserId = auth.UserId;
180        hiveExperimentDto.DateCreated = DateTime.Now;
181        return dao.AddHiveExperiment(hiveExperimentDto);
182      }
183    }
184
185    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
186    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
187    public void UpdateHiveExperiment(HiveExperiment hiveExperimentDto) {
188      using (trans.OpenTransaction()) {
189        dao.UpdateHiveExperiment(hiveExperimentDto);
190      }
191    }
192
193    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
194    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
195    public void DeleteHiveExperiment(Guid hiveExperimentId) {
196      using (trans.OpenTransaction()) {
197        HiveExperiment he = dao.GetHiveExperiment(hiveExperimentId);
198        dao.DeleteHiveExperiment(hiveExperimentId); // child jobs will be deleted by db-trigger
199      }
200    }
201    #endregion
202
203    #region Login Methods
204    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
205    public void Hello(Slave slaveInfo) {
206      using (trans.OpenTransaction()) {
207        var slave = dao.GetSlave(slaveInfo.Id);
208
209        if (slave == null) {
210          dao.AddSlave(slaveInfo);
211        } else {
212          dao.UpdateSlave(slaveInfo);
213        }
214      }
215    }
216
217    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
218    public void GoodBye(Guid slaveId) {
219      using (trans.OpenTransaction()) {
220        var slave = dao.GetSlave(slaveId);
221        if (slave != null) {
222          slave.SlaveState = SlaveState.Offline;
223          dao.UpdateSlave(slave);
224        }
225      }
226    }
227    #endregion
228
229    #region Heartbeat Methods
230    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
231    public List<MessageContainer> Heartbeat(Heartbeat heartbeat) {
232      TriggerLifecycle();
233
234      using (trans.OpenTransaction()) {
235        return heartbeatManager.ProcessHeartbeat(heartbeat);
236      }
237    }
238    #endregion
239
240    #region Plugin Methods
241    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
242    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
243    public Guid AddPlugin(Plugin plugin, List<PluginData> pluginDatas) {
244      using (trans.OpenTransaction()) {
245        plugin.UserId = auth.UserId;
246        plugin.DateCreated = DateTime.Now;
247        Guid pluginId = dao.AddPlugin(plugin);
248        foreach (PluginData pluginData in pluginDatas) {
249          pluginData.PluginId = pluginId;
250          dao.AddPluginData(pluginData);
251        }
252        return pluginId;
253      }
254    }
255
256    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
257    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
258    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
259    public IEnumerable<Plugin> GetPlugins() {
260      return dao.GetPlugins(x => x.IsLocal == false);
261    }
262
263    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
264    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
265    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
266    public IEnumerable<PluginData> GetPluginDatas(List<Guid> pluginIds) {
267      List<PluginData> pluginDatas = new List<PluginData>();
268
269      using (trans.OpenTransaction()) {
270        foreach (Guid guid in pluginIds) {
271          List<PluginData> pluginData = dao.GetPluginDatas(x => x.PluginId == guid).ToList();
272          if (pluginData != null) {
273            pluginDatas.AddRange(pluginData);
274          } else {
275            //ignore ?
276          }
277        }
278        return pluginDatas;
279      }
280    }
281
282    #endregion
283
284    #region Slave Methods
285    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
286    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
287    public Guid AddSlave(Slave slave) {
288      using (trans.OpenTransaction()) {
289        return dao.AddSlave(slave);
290      }
291    }
292
293    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
294    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
295    public Guid AddSlaveGroup(SlaveGroup slaveGroup) {
296      using (trans.OpenTransaction()) {
297        return dao.AddSlaveGroup(slaveGroup);
298      }
299    }
300
301    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
302    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
303    public Slave GetSlave(Guid slaveId) {
304      return dao.GetSlave(slaveId);
305    }
306
307    public SlaveGroup GetSlaveGroup(Guid slaveGroupId) {
308      return dao.GetSlaveGroup(slaveGroupId);
309    }
310
311    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
312    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
313    public IEnumerable<Slave> GetSlaves() {
314      return dao.GetSlaves(x => true);
315    }
316
317    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
318    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
319    public IEnumerable<SlaveGroup> GetSlaveGroups() {
320      return dao.GetSlaveGroups(x => true);
321    }
322
323    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
324    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
325    public void UpdateSlave(Slave slave) {
326      using (trans.OpenTransaction()) {
327        dao.UpdateSlave(slave);
328      }
329    }
330
331    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
332    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
333    public void UpdateSlaveGroup(SlaveGroup slaveGroup) {
334      using (trans.OpenTransaction()) {
335        dao.UpdateSlaveGroup(slaveGroup);
336      }
337    }
338
339    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
340    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
341    public void DeleteSlave(Guid slaveId) {
342      using (trans.OpenTransaction()) {
343        dao.DeleteSlave(slaveId);
344      }
345    }
346
347    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
348    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
349    public void DeleteSlaveGroup(Guid slaveGroupId) {
350      using (trans.OpenTransaction()) {
351        dao.DeleteSlaveGroup(slaveGroupId);
352      }
353    }
354
355    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
356    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
357    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
358      using (trans.OpenTransaction()) {
359        var resource = dao.GetResource(resourceId);
360        resource.ParentResourceId = slaveGroupId;
361        dao.UpdateResource(resource);
362      }
363    }
364
365    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
366    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
367    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
368      using (trans.OpenTransaction()) {
369        var resource = dao.GetResource(resourceId);
370        resource.ParentResourceId = null;
371        dao.UpdateResource(resource);
372      }
373    }
374
375    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
376    // [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
377    public Guid GetResourceId(string resourceName) {
378      using (trans.OpenTransaction()) {
379        var resource = dao.GetResources(x => x.Name == resourceName).FirstOrDefault();
380        if (resource != null) {
381          return resource.Id;
382        } else {
383          return Guid.Empty;
384        }
385      }
386    }
387
388    public void TriggerLifecycle() {
389      using (trans.OpenTransaction()) {
390        DateTime lastCleanup = dao.GetLastCleanup();
391        if (DateTime.Now - lastCleanup > TimeSpan.FromSeconds(59)) {
392          dao.SetLastCleanup(DateTime.Now);
393          lifecycleManager.Cleanup();
394        }
395      }
396    }
397    #endregion
398
399    #region Helper Methods
400    private IEnumerable<Job> GetChildJobs(Guid? parentJobId, bool recursive, bool includeParent) {
401      var jobs = new List<Job>(dao.GetJobs(x => parentJobId == null ? !x.ParentJobId.HasValue : x.ParentJobId.Value == parentJobId));
402
403      if (recursive) {
404        var childs = new List<Job>();
405        foreach (var job in jobs) {
406          childs.AddRange(GetChildJobs(job.Id, recursive, false));
407        }
408        jobs.AddRange(childs);
409      }
410
411      if (includeParent) jobs.Add(GetJob(parentJobId.Value));
412
413      return jobs;
414    }
415
416    #endregion
417  }
418}
Note: See TracBrowser for help on using the repository browser.