LinuxCommunicator/CallbackController.cs (106 lines of code) (raw):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Microsoft.Hpc.Activation;
using Microsoft.Hpc.Scheduler.Communicator;
namespace Microsoft.Hpc.Communicators.LinuxCommunicator
{
public class CallbackController : ApiController
{
/// <summary>
/// The Http header UpdateId
/// </summary>
public const string UpdateIdHeaderName = "UpdateId";
[HttpPost]
[Route("api/{nodename}/computenodereported")]
public int ComputeNodeReported(string nodeName, [FromBody] ComputeClusterNodeInformation nodeInfo)
{
try
{
var arg = new ComputeNodeInfoEventArg(nodeInfo.Name, nodeInfo);
LinuxCommunicator.Instance.Tracer.TraceInfo("Linux ComputeNodeReported. NodeName {0}, JobCount {1}", arg.NodeName, arg.NodeInfo.Jobs.Count);
int nextPing = LinuxCommunicator.Instance.SchedulerCallbacks.ComputeNodeReported(arg);
return nextPing;
}
catch (Exception ex)
{
LinuxCommunicator.Instance.Tracer.TraceException(ex);
}
return 5000;
}
[HttpPost]
[Route("api/{nodename}/taskcompleted")]
public NextOperation TaskCompleted(string nodeName, [FromBody] ComputeNodeTaskCompletionEventArg taskInfo)
{
try
{
LinuxCommunicator.Instance.Tracer.TraceInfo("Linux TaskCompleted. NodeName {0}, TaskId {1} ExitCode {2} TaskMessage {3}", taskInfo.NodeName, taskInfo.TaskInfo.TaskId, taskInfo.TaskInfo.ExitCode, taskInfo.TaskInfo.Message);
return LinuxCommunicator.Instance.SchedulerCallbacks.TaskCompleted(taskInfo);
}
catch (Exception ex)
{
LinuxCommunicator.Instance.Tracer.TraceException(ex);
return NextOperation.CancelJob;
}
}
[HttpPost]
[Route("api/{nodename}/registerrequested")]
public int RegisterRequested(string nodeName, [FromBody] RegisterEventArgs registerInfo)
{
try
{
if (!nodeName.Equals(registerInfo.NodeName, StringComparison.OrdinalIgnoreCase))
{
LinuxCommunicator.Instance.Tracer.TraceError("Linux RegisterRequested: the node name '{0}' in register info mismatches the expected node name {1}.", nodeName, registerInfo.NodeName);
LinuxCommunicator.Instance.Tracer.TraceInfo("The IP address(es) of the node {0}: {1}.", registerInfo.NodeName, string.Join(",", registerInfo.NetworksInfo.Select(ni => ni.IpV4)));
}
else
{
LinuxCommunicator.Instance.Tracer.TraceInfo("Linux RegisterRequested. NodeName {0}, Distro {1} ", registerInfo.NodeName, registerInfo.DistroInfo);
LinuxCommunicator.Instance.OnRegisterRequested(registerInfo);
}
return -1;
}
catch (Exception ex)
{
LinuxCommunicator.Instance.Tracer.TraceException(ex);
}
return 5000;
}
[HttpPost]
[Route("api/{nodename}/getinstanceids")]
public int[] GetInstanceIds(string nodeName, [FromBody] string[] instanceNames)
{
try
{
LinuxCommunicator.Instance.Tracer.TraceInfo("Linux GetInstanceIds. NodeName {0}, instanceNames {1}, {2}", nodeName, instanceNames.Length, string.Join(",", instanceNames));
return LinuxCommunicator.Instance.MonitoringConfigManager.Store.GetMetricInstanceIds(instanceNames);
}
catch (Exception ex)
{
LinuxCommunicator.Instance.Tracer.TraceException(ex);
}
return null;
}
[HttpGet]
[Route("api/hostsfile")]
public HttpResponseMessage GetHosts()
{
Guid curUpdateId = LinuxCommunicator.Instance.HostsManager.UpdateId;
IEnumerable<string> updateIds;
bool hasUpdateId = Request.Headers.TryGetValues(UpdateIdHeaderName, out updateIds);
HttpResponseMessage response = null;
Guid guid;
if (hasUpdateId && Guid.TryParse(updateIds.FirstOrDefault(), out guid) && guid == curUpdateId)
{
response = Request.CreateResponse(HttpStatusCode.NoContent);
}
else
{
response = Request.CreateResponse(HttpStatusCode.OK, LinuxCommunicator.Instance.HostsManager.ManagedEntries);
}
response.Headers.Add(UpdateIdHeaderName, curUpdateId.ToString());
return response;
}
}
}