private int monitoringInterval = 5000; // Monitoring interval 5 sec public void MonitorRequestQueue() { Log.Info(this, "Scaling Manager started"); while (Thread.CurrentThread.IsAlive) { LbGetRequestQueueResponse response = null; try { Log.Info(this, "Checking request queue status..."); LbGetRequestQueueRequest request = new LbGetRequestQueueRequest(Settings.Credentials); response = EndPoints.GetLbApplicationGridService().GetRequestQueue(request); } catch (Exception e) { Log.Error(this, e); } try { if (response != null) { ScaleApplications(response.RequestQueue); } Thread.Sleep(monitoringInterval); } catch (Exception e) { Log.Error(this, e); } } Log.Info(this, "Scaling Manager stopped"); }
public void UnSubscribeNode(ApUnSubscribeNodeRequest request) { Log.Debug(typeof(ApNodeControllerService), "UnSubscribeNode()"); try { Node node = Database.GetInstance().Nodes.Find(x => x.IpAddress.Equals(request.IpAddress)); if (node != null) { Database.GetInstance().Nodes.Remove(node); // Update routing mesh in the load balancer LbRemoveApplicationInstanceRequest request_ = new LbRemoveApplicationInstanceRequest(Credentials); request_.NodeId = node.Id; request_.ApplicationId = -1; request_.InstanceId = -1; EndPoints.GetLbApplicationGridService().RemoveApplicationInstances(request_); } Log.Debug(typeof(ApNodeControllerService), "Node " + node.IpAddress + " removed successfully"); } catch (Exception e) { Log.Error(this, e); throw e; } }
private bool ScaleDown(int applicationId, string tenantName, int scale) { Log.Info(this, "Scaling down application: " + applicationId); LbGetApplicationInstancesRequest request_ = new LbGetApplicationInstancesRequest(Settings.Credentials); request_.NodeId = -1; request_.ApplicationId = applicationId; LbGetApplicationInstancesResponse response_ = EndPoints.GetLbApplicationGridService().GetApplicationInstances(request_); List <ApplicationInstance> list = response_.ApplicationInstances.OrderBy(x => x.Id).ToList(); if ((list != null) && (list.Count >= scale)) { // Stop idling application instances List <ApplicationInstance> idlingInstances = list.FindAll(x => x.RequestCount == 0); // Keep one instance alive if (idlingInstances.Count == list.Count) { idlingInstances.Remove(idlingInstances.Last()); } if (idlingInstances.Count > 0) { foreach (ApplicationInstance instance in idlingInstances) { ApStopApplicationInstanceRequest request = new ApStopApplicationInstanceRequest(Settings.Credentials); request.NodeId = instance.NodeId; request.ApplicationId = instance.ApplicationId; request.InstanceId = instance.Id; GetApDashboardService().StopApplicationInstance(request); } return(true); } } return(false); }
private void UpdateApplications(List <Node> nodes) { foreach (Node node in nodes) { try { NcDescribeApplicationsRequest request = new NcDescribeApplicationsRequest(Settings.Credentials); var channel = EndPoints.GetNcApplicationGridService(node); NcDescribeApplicationsResponse response = channel.DescribeApplications(request); node.Applications = response.Applications; foreach (Application application in node.Applications) { LbGetApplicationInstancesRequest request1 = new LbGetApplicationInstancesRequest(Settings.Credentials); request1.NodeId = node.Id; request1.ApplicationId = application.Id; LbGetApplicationInstancesResponse response1 = EndPoints.GetLbApplicationGridService().GetApplicationInstances(request1); application.ApplicationInstances = response1.ApplicationInstances; } Log.Debug(this, "Updated applications of node " + node.ToString()); } catch (Exception e) { Log.Error(this, "Could not update applications of node " + node.ToString()); throw e; } } }
private int FindCurrentScale(int applicationId, int tenantId) { LbGetApplicationScaleRequest request = new LbGetApplicationScaleRequest(Settings.Credentials); request.ApplicationId = applicationId; request.TenantId = tenantId; LbGetApplicationScaleResponse response = EndPoints.GetLbApplicationGridService().GetApplicationScale(request); return(response.Scale); }
public ApStartApplicationResponse StartApplication(ApStartApplicationRequest request) { Log.Info(this, "StartApplication()"); try { Authenticate(request); ApStartApplicationResponse response = new ApStartApplicationResponse(); List <Node> nodes = FindAvailableNodes(); foreach (Node node in nodes) { if (!ApplicationExistsInNode(request.ApplicationId, node)) { // Upload application to node UploadApplicationToNode(request.ApplicationId, node); } NcStartApplicationInstancesRequest ncRequest = new NcStartApplicationInstancesRequest(Credentials); ncRequest.ApplicationId = request.ApplicationId; ncRequest.TenantName = request.TenantName; ncRequest.NumberOfInstances = request.NumberOfInstances; NcStartApplicationInstancesResponse ncResponse = EndPoints.GetNcApplicationGridService(node).StartApplicationInstances(ncRequest); response.Urls = ncResponse.Urls; // Update Routing Mesh in Load Balancer LbAddApplicationInstancesRequest request2 = new LbAddApplicationInstancesRequest(Credentials); request2.AppInstances = ncResponse.ApplicationInstances; EndPoints.GetLbApplicationGridService().AddApplicationInstances(request2); } return(response); } catch (Exception e) { Log.Error(this, e); throw e; } }
public ApStopApplicationInstanceResponse StopApplicationInstance(ApStopApplicationInstanceRequest request) { Log.Info(this, "StopApplicationInstance()"); try { Authenticate(request); ApStopApplicationInstanceResponse response = new ApStopApplicationInstanceResponse(); Node node = Database.GetInstance().Nodes.Where(x => x.Id == request.NodeId).FirstOrDefault(); if (node != null) { // Stop application instance in the node NcStopApplicationRequest ncRequest = new NcStopApplicationRequest(Credentials); ncRequest.ApplicationId = request.ApplicationId; ncRequest.InstanceId = request.InstanceId; EndPoints.GetNcApplicationGridService(node).StopApplicationInstance(ncRequest); // Update routing mesh in the load balancer LbRemoveApplicationInstanceRequest request_ = new LbRemoveApplicationInstanceRequest(Credentials); request_.NodeId = request.NodeId; request_.ApplicationId = request.ApplicationId; request_.InstanceId = request.InstanceId; EndPoints.GetLbApplicationGridService().RemoveApplicationInstances(request_); } else { throw new MonoscapeException("Node not found"); } return(response); } catch (Exception e) { Log.Error(this, e); throw e; } }