ln.skyscanner/http/CheckerApi.cs

131 lines
4.4 KiB
C#

// /**
// * 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<SkyCheckState>("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<string> 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<Resource> 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;
}
}
}
}
}