Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApi/DataController.cs @ 12419

Last change on this file since 12419 was 12419, checked in by dglaser, 9 years ago

#2388: Added WebApp and WebApp.Status plugin

File size: 4.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Web.Http;
5using HeuristicLab.Services.Hive;
6using HeuristicLab.Services.Hive.DataAccess;
7using DAL = HeuristicLab.Services.Hive.DataAccess;
8using DTO = HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer;
9
10namespace HeuristicLab.Services.WebApp.Status.WebApi {
11  public class DataController : ApiController {
12
13    // start temporary quickfix
14    private const string SQL_USER_TASK_STATUS =
15      @"WITH UserTasks AS (
16          SELECT Job.OwnerUserId AS UserId, TaskState, COUNT(Task.TaskId) AS Count
17          FROM Task, Job
18          WHERE Task.JobId = Job.JobId AND TaskState IN ('Calculating', 'Waiting')
19          GROUP BY Job.OwnerUserId, TaskState
20        )
21        SELECT
22          DISTINCT UserId,
23          (SELECT Count FROM UserTasks WHERE TaskState = 'Calculating' AND UserId = ut.UserId) AS CalculatingTasks,
24          (SELECT Count FROM UserTasks WHERE TaskState = 'Waiting' AND UserId = ut.UserId) AS WaitingTasks
25        FROM UserTasks ut;";
26
27
28    private class UserTaskStatus {
29      public Guid UserId { get; set; }
30      public int CalculatingTasks { get; set; }
31      public int WaitingTasks { get; set; }
32    }
33
34    public IEnumerable<DTO.TaskStatus> GetTaskStatus(HiveDataContext db) {
35      var query = db.ExecuteQuery<UserTaskStatus>(SQL_USER_TASK_STATUS).ToList();
36      return query.Select(uts => new DTO.TaskStatus {
37        User = new DTO.User {
38          Id = uts.UserId.ToString(),
39          Name = ServiceLocator.Instance.UserManager.GetUserById(uts.UserId).UserName
40        },
41        CalculatingTasks = uts.CalculatingTasks,
42        WaitingTasks = uts.WaitingTasks
43      });
44    }
45    // end temporary quickfix
46
47    public DTO.Status GetStatus() {
48      using (var db = new HiveDataContext()) {
49        var onlineSlaves = (from slave in db.Resources.OfType<DAL.Slave>()
50                            where slave.SlaveState == SlaveState.Calculating || slave.SlaveState == SlaveState.Idle
51                            select slave).ToList();
52        return new DTO.Status {
53          CoreStatus = new DTO.CoreStatus {
54            TotalCores = onlineSlaves.Sum(s => s.Cores ?? 0),
55            AvailableCores = onlineSlaves.Where(s => s.IsAllowedToCalculate).Sum(s => s.Cores ?? 0),
56            FreeCores = onlineSlaves.Sum(s => s.FreeCores ?? 0)
57          },
58          CpuUtilizationStatus = new DTO.CpuUtilizationStatus {
59            TotalCpuUtilization = onlineSlaves.Any()
60                                  ? Math.Round(onlineSlaves.Average(s => s.CpuUtilization), 2)
61                                  : 0.0,
62            UsedCpuUtilization = onlineSlaves.Any(x => x.IsAllowedToCalculate)
63                                 ? Math.Round(onlineSlaves.Where(x => x.IsAllowedToCalculate).Average(s => s.CpuUtilization), 2)
64                                 : 0.0
65          },
66          MemoryStatus = new DTO.MemoryStatus {
67            TotalMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.Memory) / 1024 : 0,
68            FreeMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.FreeMemory) / 1024 : 0
69          },
70          TasksStatus = GetTaskStatus(db),
71          SlavesCpuStatus = onlineSlaves.Select(x => new DTO.SlaveCpuStatus {
72            CpuUtilization = Math.Round(x.CpuUtilization, 2),
73            Slave = new DTO.Slave {
74              Id = x.ResourceId.ToString(),
75              Name = x.Name
76            }
77          }),
78          Timestamp = JavascriptUtils.ToTimestamp(DateTime.Now)
79        };
80      }
81    }
82
83    public IEnumerable<DTO.Status> GetStatusHistory(DateTime start, DateTime end) {
84      using (var db = new HiveDataContext()) {
85        var statistics = db.Statistics.Where(s => s.Timestamp >= start && s.Timestamp <= end);
86        foreach (var statistic in statistics) {
87          yield return new DTO.Status {
88            CoreStatus = new DTO.CoreStatus {
89              TotalCores = statistic.SlaveStatistics.Sum(x => x.Cores),
90              AvailableCores = 0,
91              FreeCores = statistic.SlaveStatistics.Sum(x => x.FreeCores)
92            },
93            CpuUtilizationStatus = new DTO.CpuUtilizationStatus {
94              TotalCpuUtilization = statistic.SlaveStatistics.Any() ? statistic.SlaveStatistics.Average(x => x.CpuUtilization) : 0.0,
95              UsedCpuUtilization = statistic.SlaveStatistics.Sum(x => x.CpuUtilization)
96            },
97            MemoryStatus = new DTO.MemoryStatus {
98              TotalMemory = statistic.SlaveStatistics.Sum(x => x.Memory) / 1024,
99              FreeMemory = statistic.SlaveStatistics.Sum(x => x.FreeMemory) / 1024
100            },
101            Timestamp = JavascriptUtils.ToTimestamp(statistic.Timestamp)
102          };
103        }
104      }
105    }
106  }
107}
Note: See TracBrowser for help on using the repository browser.