示例#1
0
        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");
        }
示例#2
0
        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;
            }
        }
示例#3
0
        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);
        }
示例#4
0
 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;
         }
     }
 }
示例#5
0
        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);
        }
示例#6
0
        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;
            }
        }
示例#7
0
        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;
            }
        }