Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 5106 was 5106, checked in by cneumuel, 14 years ago

#1233

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