Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs @ 15411

Last change on this file since 15411 was 15411, checked in by jkarder, 7 years ago

#2839: worked on database model

File size: 44.3 KB
RevLine 
[12691]1#region License Information
2/* HeuristicLab
[14185]3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[12691]4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
[12584]23using System.Collections.Generic;
24using System.Linq;
[12691]25using System.Security;
26using System.ServiceModel;
[12584]27using HeuristicLab.Services.Access;
28using HeuristicLab.Services.Hive.DataAccess.Interfaces;
29using HeuristicLab.Services.Hive.DataTransfer;
[12691]30using HeuristicLab.Services.Hive.Manager;
[12584]31using HeuristicLab.Services.Hive.ServiceContracts;
32using DA = HeuristicLab.Services.Hive.DataAccess;
33using DT = HeuristicLab.Services.Hive.DataTransfer;
34
35namespace HeuristicLab.Services.Hive {
[12691]36  /// <summary>
37  /// Implementation of the Hive service (interface <see cref="IHiveService"/>).
38  /// We need 'IgnoreExtensionDataObject' Attribute for the slave to work.
39  /// </summary>
40  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, IgnoreExtensionDataObject = true)]
41  [HiveOperationContextBehavior]
[12861]42  public class HiveService : IHiveService {
[12584]43    private static readonly DA.TaskState[] CompletedStates = { DA.TaskState.Finished, DA.TaskState.Aborted, DA.TaskState.Failed };
44
45    private IPersistenceManager PersistenceManager {
46      get { return ServiceLocator.Instance.PersistenceManager; }
47    }
48
49    private IUserManager UserManager {
50      get { return ServiceLocator.Instance.UserManager; }
51    }
52
53    private IRoleVerifier RoleVerifier {
54      get { return ServiceLocator.Instance.RoleVerifier; }
55    }
56
57    private IAuthorizationManager AuthorizationManager {
58      get { return ServiceLocator.Instance.AuthorizationManager; }
59    }
[12691]60    private IEventManager EventManager {
61      get { return ServiceLocator.Instance.EventManager; }
62    }
[12861]63    private HeartbeatManager HeartbeatManager {
64      get { return ServiceLocator.Instance.HeartbeatManager; }
[12691]65    }
[12584]66
[12691]67    #region Task Methods
[12584]68    public Guid AddTask(DT.Task task, DT.TaskData taskData, IEnumerable<Guid> resourceIds) {
69      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]70      var pm = PersistenceManager;
[12691]71      using (new PerformanceLogger("AddTask")) {
[12584]72        var taskDao = pm.TaskDao;
73        var stateLogDao = pm.StateLogDao;
74        var newTask = task.ToEntity();
75        newTask.JobData = taskData.ToEntity();
76        newTask.JobData.LastUpdate = DateTime.Now;
[15411]77        newTask.AssignedTaskResources.AddRange(resourceIds.Select(
78          x => new DA.AssignedTaskResource {
[12584]79            ResourceId = x
80          }));
81        newTask.State = DA.TaskState.Waiting;
82        return pm.UseTransaction(() => {
83          taskDao.Save(newTask);
84          pm.SubmitChanges();
85          stateLogDao.Save(new DA.StateLog {
86            State = DA.TaskState.Waiting,
87            DateTime = DateTime.Now,
88            TaskId = newTask.TaskId,
89            UserId = UserManager.CurrentUserId,
90            SlaveId = null,
91            Exception = null
92          });
93          pm.SubmitChanges();
94          return newTask.TaskId;
95        }, false, true);
96      }
97    }
98
99    public Guid AddChildTask(Guid parentTaskId, DT.Task task, DT.TaskData taskData) {
100      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
101      IEnumerable<Guid> resourceIds;
[12857]102      var pm = PersistenceManager;
[12691]103      using (new PerformanceLogger("AddChildTask")) {
[15411]104        var assignedTaskResourceDao = pm.AssignedTaskResourceDao;
[12584]105        resourceIds = pm.UseTransaction(() => {
[15411]106          return assignedTaskResourceDao.GetByTaskId(parentTaskId)
[12584]107            .Select(x => x.ResourceId)
108            .ToList();
109        });
110      }
111      task.ParentTaskId = parentTaskId;
112      return AddTask(task, taskData, resourceIds);
113    }
114
115    public DT.Task GetTask(Guid taskId) {
116      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
117      AuthorizationManager.AuthorizeForTask(taskId, Permission.Read);
[12857]118      var pm = PersistenceManager;
[12691]119      using (new PerformanceLogger("GetTask")) {
[12584]120        var taskDao = pm.TaskDao;
121        return pm.UseTransaction(() => {
122          var task = taskDao.GetById(taskId);
123          return task.ToDto();
124        });
125      }
126    }
127
128    public IEnumerable<DT.LightweightTask> GetLightweightJobTasks(Guid jobId) {
129      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
130      AuthorizationManager.AuthorizeForJob(jobId, Permission.Read);
[12857]131      var pm = PersistenceManager;
[12691]132      using (new PerformanceLogger("GetLightweightJobTasks")) {
[12584]133        var taskDao = pm.TaskDao;
134        return pm.UseTransaction(() => {
135          return taskDao.GetByJobId(jobId)
[12691]136            .ToList()
[12584]137            .Select(x => new DT.LightweightTask {
138              Id = x.TaskId,
139              ExecutionTime = TimeSpan.FromMilliseconds(x.ExecutionTimeMs),
140              ParentTaskId = x.ParentTaskId,
141              StateLog = x.StateLogs.OrderBy(y => y.DateTime)
142                                    .Select(z => z.ToDto())
143                                    .ToList(),
144              State = x.State.ToDto(),
145              Command = x.Command.ToDto(),
146              LastTaskDataUpdate = x.JobData.LastUpdate
[12691]147            })
148            .ToList();
[12584]149        }, false, true);
150      }
151    }
152
153    public IEnumerable<DT.LightweightTask> GetLightweightJobTasksWithoutStateLog(Guid jobId) {
154      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
155      AuthorizationManager.AuthorizeForJob(jobId, Permission.Read);
[12857]156      var pm = PersistenceManager;
[12691]157      using (new PerformanceLogger("GetLightweightJobTasksWithoutStateLog")) {
[12584]158        var taskDao = pm.TaskDao;
159        return pm.UseTransaction(() => {
160          return taskDao.GetByJobId(jobId)
[12691]161            .ToList()
[12584]162            .Select(x => new DT.LightweightTask {
163              Id = x.TaskId,
164              ExecutionTime = TimeSpan.FromMilliseconds(x.ExecutionTimeMs),
165              ParentTaskId = x.ParentTaskId,
166              StateLog = new List<DT.StateLog>(),
167              State = x.State.ToDto(),
168              Command = x.Command.ToDto(),
169              LastTaskDataUpdate = x.JobData.LastUpdate
[12691]170            })
171            .ToList();
[12584]172        }, false, true);
173      }
174    }
175
176    public DT.TaskData GetTaskData(Guid taskId) {
177      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
178      AuthorizationManager.AuthorizeForTask(taskId, Permission.Read);
[12857]179      var pm = PersistenceManager;
[12691]180      using (new PerformanceLogger("GetTaskData")) {
[12584]181        var taskDataDao = pm.TaskDataDao;
182        return pm.UseTransaction(() => taskDataDao.GetById(taskId).ToDto());
183      }
184    }
185
186    public void UpdateTask(DT.Task taskDto) {
187      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
188      AuthorizationManager.AuthorizeForTask(taskDto.Id, Permission.Full);
[12857]189      var pm = PersistenceManager;
[12691]190      using (new PerformanceLogger("UpdateTask")) {
[12584]191        var taskDao = pm.TaskDao;
192        pm.UseTransaction(() => {
193          var task = taskDao.GetById(taskDto.Id);
194          taskDto.CopyToEntity(task);
195          pm.SubmitChanges();
196        });
197      }
198    }
199
200    public void UpdateTaskData(DT.Task taskDto, DT.TaskData taskDataDto) {
201      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
202      AuthorizationManager.AuthorizeForTask(taskDto.Id, Permission.Full);
[12857]203      var pm = PersistenceManager;
[12691]204      using (new PerformanceLogger("UpdateTaskData")) {
[12584]205        var taskDao = pm.TaskDao;
206        var taskDataDao = pm.TaskDataDao;
207        pm.UseTransaction(() => {
208          var task = taskDao.GetById(taskDto.Id);
209          var taskData = taskDataDao.GetById(taskDataDto.TaskId);
210          taskDto.CopyToEntity(task);
211          taskDataDto.CopyToEntity(taskData);
212          taskData.LastUpdate = DateTime.Now;
213          pm.SubmitChanges();
214        });
215      }
216    }
217
218    public DT.Task UpdateTaskState(Guid taskId, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
219      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
220      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
[12857]221      var pm = PersistenceManager;
[12691]222      using (new PerformanceLogger("UpdateTaskState")) {
[12584]223        var taskDao = pm.TaskDao;
224        return pm.UseTransaction(() => {
225          var task = taskDao.GetById(taskId);
226          UpdateTaskState(pm, task, taskState, slaveId, userId, exception);
227          pm.SubmitChanges();
228          return task.ToDto();
229        });
230      }
231    }
[12691]232    #endregion
[12584]233
[12691]234    #region Task Control Methods
[12584]235    public void StopTask(Guid taskId) {
236      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
237      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
[12857]238      var pm = PersistenceManager;
[12691]239      using (new PerformanceLogger("StopTask")) {
[12584]240        var taskDao = pm.TaskDao;
241        pm.UseTransaction(() => {
242          var task = taskDao.GetById(taskId);
243          if (task.State == DA.TaskState.Calculating || task.State == DA.TaskState.Transferring) {
244            task.Command = DA.Command.Stop;
245          } else if (task.State != DA.TaskState.Aborted
246                     && task.State != DA.TaskState.Finished
247                     && task.State != DA.TaskState.Failed) {
248            UpdateTaskState(pm, task, DT.TaskState.Aborted, null, null, string.Empty);
249          }
250          pm.SubmitChanges();
251        });
252      }
253    }
254
255    public void PauseTask(Guid taskId) {
256      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
257      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
[12857]258      var pm = PersistenceManager;
[12691]259      using (new PerformanceLogger("PauseTask")) {
[12584]260        var taskDao = pm.TaskDao;
261        pm.UseTransaction(() => {
262          var task = taskDao.GetById(taskId);
263          if (task.State == DA.TaskState.Calculating || task.State == DA.TaskState.Transferring) {
264            task.Command = DA.Command.Pause;
[15121]265          } else if (task.State != DA.TaskState.Paused
266                     && task.State != DA.TaskState.Aborted
[14901]267                     && task.State != DA.TaskState.Finished
268                     && task.State != DA.TaskState.Failed) {
269            UpdateTaskState(pm, task, DT.TaskState.Paused, null, null, string.Empty);
[12584]270          }
271          pm.SubmitChanges();
272        });
273      }
274    }
275
276    public void RestartTask(Guid taskId) {
277      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
278      AuthorizationManager.AuthorizeForTask(taskId, Permission.Full);
[12857]279      var pm = PersistenceManager;
[12691]280      using (new PerformanceLogger("RestartTask")) {
[12584]281        var taskDao = pm.TaskDao;
282        pm.UseTransaction(() => {
283          var task = taskDao.GetById(taskId);
284          task.Command = null;
285          UpdateTaskState(pm, task, DT.TaskState.Waiting, null, UserManager.CurrentUserId, string.Empty);
286          pm.SubmitChanges();
287        });
288      }
289    }
[12691]290    #endregion
[12584]291
[12691]292    #region Job Methods
293    public DT.Job GetJob(Guid id) {
[12584]294      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12691]295      AuthorizationManager.AuthorizeForJob(id, DT.Permission.Read);
[12857]296      var pm = PersistenceManager;
[12691]297      using (new PerformanceLogger("GetJob")) {
[12584]298        var jobDao = pm.JobDao;
299        var jobPermissionDao = pm.JobPermissionDao;
300        var taskDao = pm.TaskDao;
[12691]301        var currentUserId = UserManager.CurrentUserId;
[12584]302        return pm.UseTransaction(() => {
303          var job = jobDao.GetById(id).ToDto();
304          if (job != null) {
305            var statistics = taskDao.GetByJobId(job.Id)
306              .GroupBy(x => x.JobId)
307              .Select(x => new {
308                TotalCount = x.Count(),
309                CalculatingCount = x.Count(y => y.State == DA.TaskState.Calculating),
310                FinishedCount = x.Count(y => CompletedStates.Contains(y.State))
311              }).FirstOrDefault();
312            if (statistics != null) {
313              job.JobCount = statistics.TotalCount;
314              job.CalculatingCount = statistics.CalculatingCount;
315              job.FinishedCount = statistics.FinishedCount;
316            }
[12932]317            job.OwnerUsername = UserManager.GetUserNameById(job.OwnerUserId);
[12691]318            if (currentUserId == job.OwnerUserId) {
319              job.Permission = Permission.Full;
320            } else {
321              var jobPermission = jobPermissionDao.GetByJobAndUserId(job.Id, currentUserId);
322              job.Permission = jobPermission == null ? Permission.NotAllowed : jobPermission.Permission.ToDto();
323            }
[12584]324          }
325          return job;
326        });
327      }
328    }
329
[12691]330    public IEnumerable<DT.Job> GetJobs() {
331      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]332      var pm = PersistenceManager;
[12691]333      using (new PerformanceLogger("GetJobs")) {
334        var jobDao = pm.JobDao;
335        var jobPermissionDao = pm.JobPermissionDao;
336        var taskDao = pm.TaskDao;
337        var currentUserId = UserManager.CurrentUserId;
338        return pm.UseTransaction(() => {
339          var jobs = jobDao.GetAll()
340            .Where(x => x.OwnerUserId == currentUserId
341                     || x.JobPermissions.Count(y => y.Permission != DA.Permission.NotAllowed
342                                                 && y.GrantedUserId == currentUserId) > 0)
343            .Select(x => x.ToDto())
344            .ToList();
345          var statistics = taskDao.GetAll()
346              .GroupBy(x => x.JobId)
347              .Select(x => new {
348                x.Key,
349                TotalCount = x.Count(),
350                CalculatingCount = x.Count(y => y.State == DA.TaskState.Calculating),
351                FinishedCount = x.Count(y => CompletedStates.Contains(y.State))
352              })
353              .ToList();
354          foreach (var job in jobs) {
355            var statistic = statistics.FirstOrDefault(x => x.Key == job.Id);
356            if (statistic != null) {
357              job.JobCount = statistic.TotalCount;
358              job.CalculatingCount = statistic.CalculatingCount;
359              job.FinishedCount = statistic.FinishedCount;
360            }
[12932]361            job.OwnerUsername = UserManager.GetUserNameById(job.OwnerUserId);
[12691]362            if (currentUserId == job.OwnerUserId) {
363              job.Permission = Permission.Full;
364            } else {
365              var jobPermission = jobPermissionDao.GetByJobAndUserId(job.Id, currentUserId);
366              job.Permission = jobPermission == null ? Permission.NotAllowed : jobPermission.Permission.ToDto();
367            }
368          }
369          return jobs;
370        });
371      }
[12584]372    }
373
[12776]374    public Guid AddJob(DT.Job jobDto) {
[12691]375      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]376      var pm = PersistenceManager;
[12691]377      using (new PerformanceLogger("AddJob")) {
378        var jobDao = pm.JobDao;
[12776]379        var userPriorityDao = pm.UserPriorityDao;
[12691]380        return pm.UseTransaction(() => {
381          jobDto.OwnerUserId = UserManager.CurrentUserId;
382          jobDto.DateCreated = DateTime.Now;
383          var job = jobDao.Save(jobDto.ToEntity());
[12776]384          if (userPriorityDao.GetById(jobDto.OwnerUserId) == null) {
385            userPriorityDao.Save(new DA.UserPriority {
386              UserId = jobDto.OwnerUserId,
387              DateEnqueued = jobDto.DateCreated
388            });
389          }
[12691]390          pm.SubmitChanges();
391          return job.JobId;
392        });
393      }
[12584]394    }
395
[12691]396    public void UpdateJob(DT.Job jobDto) {
397      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
398      AuthorizationManager.AuthorizeForJob(jobDto.Id, DT.Permission.Full);
[12857]399      var pm = PersistenceManager;
[12691]400      using (new PerformanceLogger("UpdateJob")) {
401        bool exists = true;
402        var jobDao = pm.JobDao;
403        pm.UseTransaction(() => {
404          var job = jobDao.GetById(jobDto.Id);
405          if (job == null) {
406            exists = false;
407            job = new DA.Job();
408          }
409          jobDto.CopyToEntity(job);
410          if (!exists) {
411            jobDao.Save(job);
412          }
413          pm.SubmitChanges();
414        });
415      }
[12584]416    }
417
[12691]418    public void DeleteJob(Guid jobId) {
419      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
420      AuthorizationManager.AuthorizeForJob(jobId, DT.Permission.Full);
[12857]421      var pm = PersistenceManager;
[12691]422      using (new PerformanceLogger("DeleteJob")) {
423        var jobDao = pm.JobDao;
424        pm.UseTransaction(() => {
[12776]425          // child task will be deleted by db-trigger
[12691]426          jobDao.Delete(jobId);
427          pm.SubmitChanges();
428        });
429      }
[12584]430    }
[12691]431    #endregion
[12584]432
[12691]433    #region JobPermission Methods
434    public void GrantPermission(Guid jobId, Guid grantedUserId, DT.Permission permission) {
435      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
436      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
[12857]437      var pm = PersistenceManager;
[12691]438      using (new PerformanceLogger("GrantPermission")) {
439        var jobPermissionDao = pm.JobPermissionDao;
440        var currentUserId = UserManager.CurrentUserId;
441        pm.UseTransaction(() => {
442          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, permission.ToEntity());
443          pm.SubmitChanges();
444        });
445      }
[12584]446    }
447
[12691]448    public void RevokePermission(Guid jobId, Guid grantedUserId) {
449      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
450      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
[12857]451      var pm = PersistenceManager;
[12691]452      using (new PerformanceLogger("RevokePermission")) {
453        var jobPermissionDao = pm.JobPermissionDao;
454        var currentUserId = UserManager.CurrentUserId;
455        pm.UseTransaction(() => {
456          jobPermissionDao.SetJobPermission(jobId, currentUserId, grantedUserId, DA.Permission.NotAllowed);
457          pm.SubmitChanges();
458        });
459      }
[12584]460    }
461
462    public IEnumerable<JobPermission> GetJobPermissions(Guid jobId) {
[12691]463      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
464      AuthorizationManager.AuthorizeForJob(jobId, Permission.Full);
[12857]465      var pm = PersistenceManager;
[12691]466      using (new PerformanceLogger("GetJobPermissions")) {
467        var jobPermissionDao = pm.JobPermissionDao;
468        return pm.UseTransaction(() => jobPermissionDao.GetByJobId(jobId)
469          .Select(x => x.ToDto())
470          .ToList()
471        );
472      }
[12584]473    }
474
[12926]475    // BackwardsCompatibility3.3
476    #region Backwards compatible code, remove with 3.4
[12584]477    public bool IsAllowedPrivileged() {
[12926]478      return true;
[12584]479    }
[12691]480    #endregion
[12926]481    #endregion
[12584]482
[12691]483    #region Login Methods
484    public void Hello(DT.Slave slaveInfo) {
485      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
486      if (UserManager.CurrentUser.UserName != "hiveslave") {
487        slaveInfo.OwnerUserId = UserManager.CurrentUserId;
488      }
[12857]489      var pm = PersistenceManager;
[12691]490      using (new PerformanceLogger("Hello")) {
491        var slaveDao = pm.SlaveDao;
492        pm.UseTransaction(() => {
493          var slave = slaveDao.GetById(slaveInfo.Id);
494          if (slave == null) {
495            slaveDao.Save(slaveInfo.ToEntity());
496          } else {
497            bool oldIsAllowedToCalculate = slave.IsAllowedToCalculate;
498            Guid? oldParentResourceId = slave.ParentResourceId;
499            slaveInfo.CopyToEntity(slave);
500            slave.IsAllowedToCalculate = oldIsAllowedToCalculate;
501            slave.ParentResourceId = oldParentResourceId;
502            slave.LastHeartbeat = DateTime.Now;
503            slave.SlaveState = DA.SlaveState.Idle;
504          }
505          pm.SubmitChanges();
506        });
507      }
[12584]508    }
509
510    public void GoodBye(Guid slaveId) {
[12691]511      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
[12857]512      var pm = PersistenceManager;
[12691]513      using (new PerformanceLogger("GoodBye")) {
514        var slaveDao = pm.SlaveDao;
515        pm.UseTransaction(() => {
516          var slave = slaveDao.GetById(slaveId);
517          if (slave != null) {
518            slave.SlaveState = DA.SlaveState.Offline;
519            pm.SubmitChanges();
520          }
521        });
522      }
[12584]523    }
[12691]524    #endregion
[12584]525
[12691]526    #region Heartbeat Methods
[12776]527    public List<MessageContainer> Heartbeat(DT.Heartbeat heartbeat) {
[12691]528      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
529      List<MessageContainer> result = new List<MessageContainer>();
530      try {
531        using (new PerformanceLogger("ProcessHeartbeat")) {
532          result = HeartbeatManager.ProcessHeartbeat(heartbeat);
533        }
[15379]534      } catch (Exception ex) {
[12691]535        DA.LogFactory.GetLogger(this.GetType().Namespace).Log(string.Format("Exception processing Heartbeat: {0}", ex));
536      }
537      if (HeuristicLab.Services.Hive.Properties.Settings.Default.TriggerEventManagerInHeartbeat) {
538        TriggerEventManager(false);
539      }
540      return result;
[12584]541    }
[12691]542    #endregion
[12584]543
[12691]544    #region Plugin Methods
[12776]545    public DT.Plugin GetPlugin(Guid pluginId) {
[12691]546      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
[12857]547      var pm = PersistenceManager;
[12691]548      using (new PerformanceLogger("GetPlugin")) {
549        var pluginDao = pm.PluginDao;
550        return pm.UseTransaction(() => pluginDao.GetById(pluginId).ToDto());
551      }
[12584]552    }
553
[12776]554    public Guid AddPlugin(DT.Plugin plugin, List<DT.PluginData> pluginData) {
[12691]555      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]556      var pm = PersistenceManager;
[12691]557      using (new PerformanceLogger("AddPlugin")) {
558        var pluginDao = pm.PluginDao;
559        plugin.UserId = UserManager.CurrentUserId;
560        plugin.DateCreated = DateTime.Now;
561        return pm.UseTransaction(() => {
562          var pluginEntity = pluginDao.GetByHash(plugin.Hash).SingleOrDefault();
563          if (pluginEntity != null) {
564            throw new FaultException<PluginAlreadyExistsFault>(new PluginAlreadyExistsFault(pluginEntity.PluginId));
565          }
566          pluginEntity = plugin.ToEntity();
567          foreach (var data in pluginData) {
[12776]568            data.PluginId = default(Guid); // real id will be assigned from linq2sql
[12691]569            pluginEntity.PluginData.Add(data.ToEntity());
570          }
571          pluginDao.Save(pluginEntity);
572          pm.SubmitChanges();
573          return pluginEntity.PluginId;
574        });
575      }
[12584]576    }
577
[12776]578    public IEnumerable<DT.Plugin> GetPlugins() {
[12691]579      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
[12857]580      var pm = PersistenceManager;
[12691]581      using (new PerformanceLogger("GetPlugins")) {
582        var pluginDao = pm.PluginDao;
583        return pm.UseTransaction(() => pluginDao.GetAll()
584          .Where(x => x.Hash != null)
585          .Select(x => x.ToDto())
586          .ToList()
587        );
588      }
[12584]589    }
590
[12776]591    public IEnumerable<DT.PluginData> GetPluginDatas(List<Guid> pluginIds) {
[12691]592      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
[12857]593      var pm = PersistenceManager;
[12691]594      using (new PerformanceLogger("GetPluginDatas")) {
595        var pluginDataDao = pm.PluginDataDao;
596        return pm.UseTransaction(() => pluginDataDao.GetAll()
597            .Where(x => pluginIds.Contains(x.PluginId))
598            .Select(x => x.ToDto())
599            .ToList()
600        );
601      }
[12584]602    }
[12691]603    #endregion
[12584]604
[15379]605    #region Project Methods
606    public Guid AddProject(DT.Project projectDto) {
607      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
608      var pm = PersistenceManager;
609      using (new PerformanceLogger("AddProject")) {
610        var projectDao = pm.ProjectDao;
611        return pm.UseTransaction(() => {
612          var project = projectDao.Save(projectDto.ToEntity());
613          pm.SubmitChanges();
614          return project.ProjectId;
615        });
616      }
617    }
618
619    public void UpdateProject(DT.Project projectDto) {
620      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
621      var pm = PersistenceManager;
622      using (new PerformanceLogger("UpdateProject")) {
623        var projectDao = pm.ProjectDao;
624        pm.UseTransaction(() => {
625          var project = projectDao.GetById(projectDto.Id);
626          if (project != null) {
627            projectDto.CopyToEntity(project);
628          } else {
629            projectDao.Save(projectDto.ToEntity());
630          }
631          pm.SubmitChanges();
632        });
633      }
634    }
635
636    public void DeleteProject(Guid projectId) {
637      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[15380]638      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
[15379]639      var pm = PersistenceManager;
640      using (new PerformanceLogger("DeleteProject")) {
641        var projectDao = pm.ProjectDao;
642        pm.UseTransaction(() => {
643          projectDao.Delete(projectId);
644          pm.SubmitChanges();
645        });
646      }
647    }
648
649    public DT.Project GetProject(Guid projectId) {
650      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
651      var pm = PersistenceManager;
652      using (new PerformanceLogger("GetProject")) {
653        var projectDao = pm.ProjectDao;
654        return pm.UseTransaction(() => projectDao.GetById(projectId).ToDto());
655      }
656    }
657
658    public IEnumerable<DT.Project> GetProjects() {
[12691]659      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[15379]660      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
[12857]661      var pm = PersistenceManager;
[15379]662      using (new PerformanceLogger("GetProjects")) {
663        var projectDao = pm.ProjectDao;
664        var projectPermissionDao = pm.ProjectPermissionDao;
665        var currentUserId = UserManager.CurrentUserId;
666        return pm.UseTransaction(() => {
[15380]667          var projectPermissions = projectPermissionDao.GetAll();
[15379]668          return projectDao.GetAll().ToList()
669            .Where(x => isAdministrator
670              || x.OwnerUserId == currentUserId
[15380]671              || UserManager.VerifyUser(currentUserId, projectPermissions
[15379]672                  .Where(y => y.ProjectId == x.ProjectId)
673                  .Select(z => z.GrantedUserId)
674                  .ToList())
675              )
676            .Select(x => x.ToDto())
677            .ToList();
678        });
679      }
680    }
681    #endregion
682
683    #region ProjectPermission Methods
684    public void GrantProjectPermissions(Guid projectId, Guid[] grantedUserIds) {
685      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[15380]686      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
[15379]687      var pm = PersistenceManager;
688      using (new PerformanceLogger("GrantProjectPermissions")) {
[12691]689        pm.UseTransaction(() => {
[15379]690          var project = AuthorizeForProject(pm, projectId);
691          var projectPermissions = project.ProjectPermissions.ToList();
[12691]692          foreach (var id in grantedUserIds) {
[15379]693            if (projectPermissions.All(x => x.GrantedUserId != id)) {
694              project.ProjectPermissions.Add(new DA.ProjectPermission {
[12691]695                GrantedUserId = id,
696                GrantedByUserId = UserManager.CurrentUserId
697              });
698            }
699          }
700          pm.SubmitChanges();
701        });
702      }
[12584]703    }
704
[15379]705    public void RevokeProjectPermissions(Guid projectId, Guid[] grantedUserIds) {
[12691]706      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[15380]707      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
[12857]708      var pm = PersistenceManager;
[15379]709      using (new PerformanceLogger("RevokeProjectPermissions")) {
710        var projectPermissionDao = pm.ProjectPermissionDao;
[12691]711        pm.UseTransaction(() => {
[15379]712          projectPermissionDao.DeleteByProjectAndGrantedUserId(projectId, grantedUserIds);
[12972]713          pm.SubmitChanges();
[12691]714        });
715      }
[12584]716    }
717
[15379]718    public IEnumerable<DT.ProjectPermission> GetProjectPermissions(Guid projectId) {
[12691]719      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]720      var pm = PersistenceManager;
[15379]721      using (new PerformanceLogger("GetProjectPermissions")) {
722        var projectPermissionDao = pm.ProjectPermissionDao;
723        return pm.UseTransaction(() => projectPermissionDao.GetByProjectId(projectId)
[12691]724          .Select(x => x.ToDto())
725          .ToList()
726        );
727      }
[12584]728    }
[12691]729    #endregion
[12584]730
[15411]731    #region AssignedProjectResource Methods
732    public void AssignProjectResources(Guid projectId, Guid[] resourceIds) {
733      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
734      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
735      var pm = PersistenceManager;
736      using (new PerformanceLogger("AssignProjectResources")) {
737        pm.UseTransaction(() => {
738          var project = AuthorizeForProject(pm, projectId);
739          var assignedProjectResources = project.AssignedProjectResources.ToList();
740          foreach (var id in resourceIds) {
741            if (assignedProjectResources.All(x => x.ResourceId != id)) {
742              project.AssignedProjectResources.Add(new DA.AssignedProjectResource {
743                ResourceId = id
744              });
745            }
746          }
747          pm.SubmitChanges();
748        });
749      }
750    }
751
752    public void UnassignProjectResources(Guid projectId, Guid[] resourceIds) {
753      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
754      AuthorizationManager.AuthorizeForProjectAdministration(projectId);
755      var pm = PersistenceManager;
756      using (new PerformanceLogger("UnassignProjectResources")) {
757        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
758        pm.UseTransaction(() => {
759          assignedProjectResourceDao.DeleteByProjectAndGrantedUserId(projectId, resourceIds);
760          pm.SubmitChanges();
761        });
762      }
763    }
764
765    public IEnumerable<AssignedProjectResource> GetAssignedResourcesForProject(Guid projectId) {
766      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
767      var pm = PersistenceManager;
768      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
769        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
770        return pm.UseTransaction(() => assignedProjectResourceDao.GetByProjectId(projectId)
771          .Select(x => x.ToDto())
772          .ToList()
773        );
774      }
775    }
776    #endregion
777
[12691]778    #region Slave Methods
779    public Guid AddSlave(DT.Slave slaveDto) {
780      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12857]781      var pm = PersistenceManager;
[12691]782      using (new PerformanceLogger("AddSlave")) {
783        var slaveDao = pm.SlaveDao;
784        return pm.UseTransaction(() => {
785          var slave = slaveDao.Save(slaveDto.ToEntity());
786          pm.SubmitChanges();
787          return slave.ResourceId;
788        });
789      }
[12584]790    }
791
[12691]792    public Guid AddSlaveGroup(DT.SlaveGroup slaveGroupDto) {
793      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]794      var pm = PersistenceManager;
[12691]795      using (new PerformanceLogger("AddSlaveGroup")) {
796        var slaveGroupDao = pm.SlaveGroupDao;
797        return pm.UseTransaction(() => {
798          if (slaveGroupDto.Id == Guid.Empty) {
799            slaveGroupDto.Id = Guid.NewGuid();
800          }
801          var slaveGroup = slaveGroupDao.Save(slaveGroupDto.ToEntity());
802          pm.SubmitChanges();
803          return slaveGroup.ResourceId;
804        });
805      }
[12584]806    }
807
[12776]808    public DT.Slave GetSlave(Guid slaveId) {
[12691]809      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12857]810      var pm = PersistenceManager;
[12691]811      using (new PerformanceLogger("GetSlave")) {
812        var slaveDao = pm.SlaveDao;
813        return pm.UseTransaction(() => slaveDao.GetById(slaveId).ToDto());
814      }
[12584]815    }
816
[12776]817    public IEnumerable<DT.Slave> GetSlaves() {
[12691]818      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
819      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
[12857]820      var pm = PersistenceManager;
[12691]821      using (new PerformanceLogger("GetSlaves")) {
822        var slaveDao = pm.SlaveDao;
[15379]823        var resourcePermissionDao = pm.ProjectPermissionDao;
[12691]824        var currentUserId = UserManager.CurrentUserId;
825        return pm.UseTransaction(() => {
826          var resourcePermissions = resourcePermissionDao.GetAll();
[13142]827          return slaveDao.GetAll().ToList()
[12691]828            .Where(x => isAdministrator
829              || x.OwnerUserId == null
830              || x.OwnerUserId == currentUserId
831              || UserManager.VerifyUser(currentUserId, resourcePermissions
832                  .Where(y => y.ResourceId == x.ResourceId)
833                  .Select(z => z.GrantedUserId)
834                  .ToList())
835              )
836            .Select(x => x.ToDto())
837            .ToList();
838        });
839      }
[12584]840    }
841
[12776]842    public IEnumerable<DT.SlaveGroup> GetSlaveGroups() {
[12691]843      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
844      bool isAdministrator = RoleVerifier.IsInRole(HiveRoles.Administrator);
[12857]845      var pm = PersistenceManager;
[12691]846      using (new PerformanceLogger("GetSlaveGroups")) {
847        var slaveGroupDao = pm.SlaveGroupDao;
[15379]848        var resourcePermissionDao = pm.ProjectPermissionDao;
[12691]849        var currentUserId = UserManager.CurrentUserId;
850        return pm.UseTransaction(() => {
851          var resourcePermissions = resourcePermissionDao.GetAll();
[13142]852          return slaveGroupDao.GetAll().ToList()
[12691]853            .Where(x => isAdministrator
854              || x.OwnerUserId == null
855              || x.OwnerUserId == currentUserId
856              || UserManager.VerifyUser(currentUserId, resourcePermissions
857                  .Where(y => y.ResourceId == x.ResourceId)
858                  .Select(z => z.GrantedUserId)
859                  .ToList())
860              )
861            .Select(x => x.ToDto())
862            .ToList();
863        });
864      }
[12584]865    }
866
[12691]867    public void UpdateSlave(DT.Slave slaveDto) {
868      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]869      var pm = PersistenceManager;
[12691]870      using (new PerformanceLogger("UpdateSlave")) {
871        var slaveDao = pm.SlaveDao;
872        pm.UseTransaction(() => {
873          var slave = slaveDao.GetById(slaveDto.Id);
874          if (slave != null) {
875            slaveDto.CopyToEntity(slave);
876          } else {
877            slaveDao.Save(slaveDto.ToEntity());
878          }
879          pm.SubmitChanges();
880        });
881      }
[12584]882    }
883
[12691]884    public void UpdateSlaveGroup(DT.SlaveGroup slaveGroupDto) {
885      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]886      var pm = PersistenceManager;
[12691]887      using (new PerformanceLogger("UpdateSlaveGroup")) {
888        var slaveGroupDao = pm.SlaveGroupDao;
889        pm.UseTransaction(() => {
890          var slaveGroup = slaveGroupDao.GetById(slaveGroupDto.Id);
891          if (slaveGroup != null) {
892            slaveGroupDto.CopyToEntity(slaveGroup);
893          } else {
894            slaveGroupDao.Save(slaveGroupDto.ToEntity());
895          }
896          pm.SubmitChanges();
897        });
898      }
[12584]899    }
900
901    public void DeleteSlave(Guid slaveId) {
[12691]902      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
903      AuthorizationManager.AuthorizeForResourceAdministration(slaveId);
[12857]904      var pm = PersistenceManager;
[12691]905      using (new PerformanceLogger("DeleteSlave")) {
906        var slaveDao = pm.SlaveDao;
907        pm.UseTransaction(() => {
908          slaveDao.Delete(slaveId);
[12972]909          pm.SubmitChanges();
[12691]910        });
911      }
[12584]912    }
913
914    public void DeleteSlaveGroup(Guid slaveGroupId) {
[12691]915      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
916      AuthorizationManager.AuthorizeForResourceAdministration(slaveGroupId);
[12857]917      var pm = PersistenceManager;
[12691]918      using (new PerformanceLogger("DeleteSlaveGroup")) {
919        var slaveGroupDao = pm.SlaveGroupDao;
920        pm.UseTransaction(() => {
921          slaveGroupDao.Delete(slaveGroupId);
[12972]922          pm.SubmitChanges();
[12691]923        });
924      }
[12584]925    }
926
927    public void AddResourceToGroup(Guid slaveGroupId, Guid resourceId) {
[12691]928      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12857]929      var pm = PersistenceManager;
[12691]930      using (new PerformanceLogger("AddResourceToGroup")) {
931        var resourceDao = pm.ResourceDao;
932        pm.UseTransaction(() => {
933          var resource = resourceDao.GetById(resourceId);
934          resource.ParentResourceId = slaveGroupId;
935          pm.SubmitChanges();
936        });
937      }
[12584]938    }
939
940    public void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId) {
[12691]941      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12857]942      var pm = PersistenceManager;
[12691]943      using (new PerformanceLogger("RemoveResourceFromGroup")) {
944        var resourceDao = pm.ResourceDao;
945        pm.UseTransaction(() => {
946          var resource = resourceDao.GetById(resourceId);
947          resource.ParentResourceId = null;
948          pm.SubmitChanges();
949        });
950      }
[12584]951    }
952
953    public Guid GetResourceId(string resourceName) {
[12691]954      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]955      var pm = PersistenceManager;
[12691]956      using (new PerformanceLogger("GetResourceId")) {
957        var resourceDao = pm.ResourceDao;
958        return pm.UseTransaction(() => {
959          var resource = resourceDao.GetByName(resourceName);
960          return resource != null ? resource.ResourceId : Guid.Empty;
961        });
962      }
[12584]963    }
964
965    public void TriggerEventManager(bool force) {
[12857]966      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
[12691]967      // use a serializable transaction here to ensure not two threads execute this simultaniously (mutex-lock would not work since IIS may use multiple AppDomains)
968      bool cleanup;
[12857]969      var pm = PersistenceManager;
[12691]970      using (new PerformanceLogger("TriggerEventManager")) {
971        cleanup = false;
972        var lifecycleDao = pm.LifecycleDao;
973        pm.UseTransaction(() => {
974          var lastLifecycle = lifecycleDao.GetLastLifecycle();
975          DateTime lastCleanup = lastLifecycle != null ? lastLifecycle.LastCleanup : DateTime.MinValue;
976          if (force || DateTime.Now - lastCleanup > HeuristicLab.Services.Hive.Properties.Settings.Default.CleanupInterval) {
977            lifecycleDao.UpdateLifecycle();
978            cleanup = true;
979            pm.SubmitChanges();
980          }
981        }, true);
982      }
983      if (cleanup) {
984        EventManager.Cleanup();
985      }
[12584]986    }
987
988    public int GetNewHeartbeatInterval(Guid slaveId) {
[12691]989      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Slave);
[12857]990      var pm = PersistenceManager;
[12691]991      using (new PerformanceLogger("GetNewHeartbeatInterval")) {
992        var slaveDao = pm.SlaveDao;
993        return pm.UseTransaction(() => {
994          var slave = slaveDao.GetById(slaveId);
995          if (slave != null) {
996            return slave.HbInterval;
997          }
998          return -1;
999        });
1000      }
[12584]1001    }
[12691]1002    #endregion
[12584]1003
[12691]1004    #region Downtime Methods
1005    public Guid AddDowntime(DT.Downtime downtimeDto) {
1006      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1007      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
[12857]1008      var pm = PersistenceManager;
[12691]1009      using (new PerformanceLogger("AddDowntime")) {
1010        var downtimeDao = pm.DowntimeDao;
1011        return pm.UseTransaction(() => {
1012          var downtime = downtimeDao.Save(downtimeDto.ToEntity());
1013          pm.SubmitChanges();
1014          return downtime.ResourceId;
1015        });
1016      }
[12584]1017    }
1018
1019    public void DeleteDowntime(Guid downtimeId) {
[12691]1020      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]1021      var pm = PersistenceManager;
[12691]1022      using (new PerformanceLogger("DeleteDowntime")) {
1023        var downtimeDao = pm.DowntimeDao;
1024        pm.UseTransaction(() => {
1025          downtimeDao.Delete(downtimeId);
1026          pm.SubmitChanges();
1027        });
1028      }
[12584]1029    }
1030
[12691]1031    public void UpdateDowntime(DT.Downtime downtimeDto) {
1032      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1033      AuthorizationManager.AuthorizeForResourceAdministration(downtimeDto.ResourceId);
[12857]1034      var pm = PersistenceManager;
[12691]1035      using (new PerformanceLogger("UpdateDowntime")) {
1036        var downtimeDao = pm.DowntimeDao;
1037        pm.UseTransaction(() => {
1038          var downtime = downtimeDao.GetById(downtimeDto.Id);
1039          if (downtime != null) {
1040            downtimeDto.CopyToEntity(downtime);
1041          } else {
1042            downtimeDao.Save(downtimeDto.ToEntity());
1043          }
1044          pm.SubmitChanges();
1045        });
1046      }
[12584]1047    }
1048
[12776]1049    public IEnumerable<DT.Downtime> GetDowntimesForResource(Guid resourceId) {
[12691]1050      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
[12857]1051      var pm = PersistenceManager;
[12691]1052      using (new PerformanceLogger("GetDowntimesForResource")) {
1053        var downtimeDao = pm.DowntimeDao;
1054        return pm.UseTransaction(() => downtimeDao.GetByResourceId(resourceId)
1055          .Select(x => x.ToDto())
1056          .ToList()
1057        );
1058      }
[12584]1059    }
[12691]1060    #endregion
[12584]1061
[12691]1062    #region User Methods
[12584]1063    public string GetUsernameByUserId(Guid userId) {
[12691]1064      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1065      var user = UserManager.GetUserById(userId);
1066      return user != null ? user.UserName : null;
[12584]1067    }
1068
1069    public Guid GetUserIdByUsername(string username) {
[12691]1070      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
1071      var user = ServiceLocator.Instance.UserManager.GetUserByName(username);
1072      return user != null ? (Guid?)user.ProviderUserKey ?? Guid.Empty : Guid.Empty;
[12584]1073    }
[12691]1074    #endregion
[12584]1075
[12691]1076    #region UserPriorities Methods
[12776]1077    public IEnumerable<DT.UserPriority> GetUserPriorities() {
[12857]1078      var pm = PersistenceManager;
[12691]1079      using (new PerformanceLogger("GetUserPriorities")) {
1080        var userPriorityDao = pm.UserPriorityDao;
1081        return pm.UseTransaction(() => userPriorityDao.GetAll()
1082          .Select(x => x.ToDto())
1083          .ToList()
1084        );
1085      }
[12584]1086    }
[12691]1087    #endregion
[12584]1088
[12691]1089    #region Private Helper Methods
1090    private void UpdateTaskState(IPersistenceManager pm, DA.Task task, DT.TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
1091      var stateLogDao = pm.StateLogDao;
1092      var taskStateEntity = taskState.ToEntity();
[14901]1093
[15358]1094      if (task.State == DA.TaskState.Transferring && taskStateEntity == DA.TaskState.Paused && task.Command == null) {
[12857]1095        // slave paused and uploaded the task (no user-command) -> set waiting.
[12691]1096        taskStateEntity = DA.TaskState.Waiting;
1097      }
[14901]1098
[12691]1099      stateLogDao.Save(new DA.StateLog {
1100        State = taskStateEntity,
1101        DateTime = DateTime.Now,
1102        TaskId = task.TaskId,
1103        UserId = userId,
1104        SlaveId = slaveId,
1105        Exception = exception
1106      });
[14901]1107
[12691]1108      task.State = taskStateEntity;
[14901]1109
1110      if (task.Command == DA.Command.Pause && task.State == DA.TaskState.Paused
1111          || task.Command == DA.Command.Abort && task.State == DA.TaskState.Aborted
1112          || task.Command == DA.Command.Stop && task.State == DA.TaskState.Aborted) {
1113        task.Command = null;
1114      }
[12691]1115    }
1116
[15379]1117    private DA.Project AuthorizeForProject(IPersistenceManager pm, Guid projectId) {
1118      var projectDao = pm.ProjectDao;
1119      var project = projectDao.GetById(projectId);
1120      if (project == null) throw new SecurityException("Not authorized");
1121      if (project.OwnerUserId != UserManager.CurrentUserId
[12691]1122          && !RoleVerifier.IsInRole(HiveRoles.Administrator)) {
1123        throw new SecurityException("Not authorized");
1124      }
[15379]1125      return project;
[12691]1126    }
1127    #endregion
[12584]1128  }
1129}
Note: See TracBrowser for help on using the repository browser.