// /** // * File: CheckerApi.cs // * Author: haraldwolff // * // * This file and it's content is copyrighted by the Author and / or copyright holder. // * Any use wihtout proper permission is illegal and may lead to legal actions. // * // * // **/ using System; using System.Collections.Generic; using ln.http; using ln.http.resources; using ln.types.threads; using ln.perfdb.storage; using System.Net; using ln.skyscanner.checks; using ln.types.odb; using System.Linq; using ln.json.mapping; namespace ln.skyscanner.http { public class CheckerApi : JsonCallResource { public CheckerApi(Resource container) : base(container, "checker") { new Checks(this); } [Callable] public PoolJob[] CurrentPoolJobs => SkyScanner.Instance.Checker.CurrentJobs; [Callable] public PoolJob[] QueuedPoolJobs => SkyScanner.Instance.Checker.QueuedJobs; [Callable] public SkyCheckState[] Issues { get { Query issueQuery = Query.EqualsNot("CheckState", CheckState.OK); return SkyScanner.Instance.Entities.SkyCheckStates.Query(issueQuery).ToArray(); } } class Checks : BaseResource { public Checks(CheckerApi container) :base(container,"checks") { } public override bool HandlesDispatching => true; public override bool Contains(string name) { return base.Contains(name) || SkyScanner.Instance.Checker.ContainsPerfFile(name); } public override Resource GetResource(string name) { if (base.Contains(name)) return base.GetResource(name); if (SkyScanner.Instance.Checker.ContainsPerfFile(name)) { return new Check(this, name); } throw new KeyNotFoundException(); } public override HttpResponse GetResponse(HttpRequest httpRequest, Queue pathStack) { if (pathStack.Count == 0) return GetResponse(httpRequest); string perfName = WebUtility.UrlDecode(String.Join("/", pathStack)); Resource perfResource = GetResource(perfName); return perfResource.GetResponse(httpRequest); } public override HttpResponse GetResponse(HttpRequest httpRequest) { HttpResponse response = new HttpResponse(httpRequest); response.SetHeader("content-type", "application/json"); response.ContentWriter.Write(JSONMapper.DefaultMapper.ToJson(SkyScanner.Instance.Checker.PerfNames)); return response; } class Check : Resource { public Check(Checks container,String perfName) :base(container,perfName) {} public override void AddResource(Resource resource) => throw new NotImplementedException(); public override bool Contains(string name) => throw new NotImplementedException(); public override IEnumerable GetResources() => throw new NotImplementedException(); public override void RemoveResource(Resource resource) => throw new NotImplementedException(); public override HttpResponse GetResponse(HttpRequest httpRequest) { PerfFile perfFile = SkyScanner.Instance.Checker.GetPerfFile(Name); PerfValue[] perfValues = null; int interval = 3600; if (httpRequest.Query.ContainsKey("interval")) interval = int.Parse(httpRequest.Query["interval"]); lock (perfFile) { perfFile.EnsureOpen(); perfValues = perfFile.QueryTime(interval, 0); perfFile.Close(); } HttpResponse response = new HttpResponse(httpRequest); response.SetHeader("content-type", "application/json"); response.ContentWriter.Write(JSONMapper.DefaultMapper.ToJson(perfValues).ToString()); return response; } } } } }