Exemplo n.º 1
0
 private void AddOperation <T>(BackgroundOperation <T> operation)
 {
     if (BackgroundInternalOperations.Count > SimpleSettings.BackGroundQueueSize)
     {
         Task.Run(async() =>
         {
             await Task.Delay(rand.Next(1000, 5000));
             AddOperation(operation);
         });
     }
     else
     {
         BackgroundInternalOperations.TryAdd(operation.OperationId, operation);
         operation.Task.ContinueWith(_ => HandleBackgroundOperation(operation)).ConfigureAwait(false);
     }
 }
Exemplo n.º 2
0
        private void HandleBackgroundOperation(BackgroundOperation operation)
        {
            BackgroundOperation temp;

            if (!BackgroundInternalOperations.TryRemove(operation.OperationId, out temp))
            {
                return;
            }

            var subTask           = temp as BackgroundOperation <Subscription>;
            var resourceGroupTask = temp as BackgroundOperation <ResourceGroup>;

            if ((subTask != null && subTask.Task.IsFaulted) ||
                (resourceGroupTask != null && resourceGroupTask.Task.IsFaulted))
            {
                //temp.RetryAction();
                SimpleTrace.Diagnostics.Fatal("Losing ResourceGroup with {@exception}", resourceGroupTask?.Task?.Exception);
                return;
            }

            switch (operation.Type)
            {
            case OperationType.SubscriptionLoad:
                var subscription = subTask.Task.Result;
                var result       = subscription.MakeTrialSubscription();
                foreach (var resourceGroup in result.Ready)
                {
                    PutResourceGroupInDesiredStateOperation(resourceGroup);
                }
                foreach (var geoRegion in result.ToCreateInRegions)
                {
                    CreateResourceGroupOperation(subscription.SubscriptionId, geoRegion);
                }
                foreach (var resourceGroup in result.ToDelete)
                {
                    DeleteResourceGroupOperation(resourceGroup);
                }
                break;

            case OperationType.ResourceGroupPutInDesiredState:
            case OperationType.ResourceGroupDeleteThenCreate:
                var readyToAddRg = resourceGroupTask.Task.Result;
                if (readyToAddRg.UserId != null)
                {
                    if (!ResourceGroupsInUse.TryAdd(readyToAddRg.UserId, readyToAddRg))
                    {
                        DeleteAndCreateResourceGroupOperation(readyToAddRg);
                    }
                }
                else
                {
                    FreeResourceGroups.Enqueue(readyToAddRg);
                }
                break;

            case OperationType.ResourceGroupCreate:
                PutResourceGroupInDesiredStateOperation(resourceGroupTask.Task.Result);
                break;

            case OperationType.LogUsageStatistics:
                DeleteAndCreateResourceGroupOperation(resourceGroupTask.Task.Result);
                break;

            case OperationType.ResourceGroupDelete:
            default:
                break;
            }
        }
Exemplo n.º 3
0
 private void AddOperation <T>(BackgroundOperation <T> operation)
 {
     BackgroundInternalOperations.TryAdd(operation.OperationId, operation);
     operation.Task.ContinueWith(_ => HandleBackgroundOperation(operation)).ConfigureAwait(false);
 }
        private async Task HandleBackgroundOperation(BackgroundOperation operation)
        {
            BackgroundOperation temp;

            if (!BackgroundInternalOperations.TryRemove(operation.OperationId, out temp))
            {
                return;
            }

            var subTask           = temp as BackgroundOperation <Subscription>;
            var resourceGroupTask = temp as BackgroundOperation <ResourceGroup>;

            if ((subTask != null && subTask.Task.IsFaulted) ||
                (resourceGroupTask != null && resourceGroupTask.Task.IsFaulted))
            {
                //temp.RetryAction();
                SimpleTrace.Diagnostics.Fatal("Losing ResourceGroup with {@exception}", resourceGroupTask?.Task?.Exception);
                return;
            }

            switch (operation.Type)
            {
            case OperationType.SubscriptionLoad:
                var subscription = subTask.Task.Result;
                var result       = subscription.GetSubscriptionStats();
                foreach (var resourceGroup in result.Ready)
                {
                    PutResourceGroupInDesiredStateOperation(resourceGroup);
                }
                foreach (var resourceGroup in result.ToDelete)
                {
                    DeleteResourceGroupOperation(resourceGroup);
                }
                break;

            case OperationType.ResourceGroupDeleteThenCreate:
                var readyToDeleteThenCreateRg = resourceGroupTask.Task.Result;
                if (readyToDeleteThenCreateRg.UserId != null)
                {
                    if (!await StorageHelper.AssignResourceGroup(readyToDeleteThenCreateRg.UserId, readyToDeleteThenCreateRg))
                    {
                        DeleteAndCreateResourceGroupOperation(readyToDeleteThenCreateRg);
                    }
                }
                break;

            case OperationType.ResourceGroupPutInDesiredState:
                var readyToAddRg = resourceGroupTask.Task.Result;
                if (String.IsNullOrEmpty(readyToAddRg.UserId))
                {
                    if (!string.IsNullOrEmpty(readyToAddRg.DeployedTemplateName) && !string.IsNullOrEmpty(readyToAddRg.SiteGuid))
                    {
                        //if (!FreeResourceGroups.ContainsKey(readyToAddRg.DeployedTemplateName))
                        //{
                        //    readyToAddRg.TemplateName = readyToAddRg.DeployedTemplateName;
                        //    FreeResourceGroups.GetOrAdd(readyToAddRg.DeployedTemplateName, new ConcurrentQueue<ResourceGroup>());
                        //}
                        readyToAddRg.TemplateName = readyToAddRg.DeployedTemplateName;
                        await StorageHelper.AddQueueMessage(readyToAddRg.QueueName, readyToAddRg);
                    }
                }
                break;

            case OperationType.ResourceGroupCreate:
                PutResourceGroupInDesiredStateOperation(resourceGroupTask.Task.Result);
                break;

            case OperationType.LogUsageStatistics:
                DeleteAndCreateResourceGroupOperation(resourceGroupTask.Task.Result);
                break;

            case OperationType.ResourceGroupDelete:
            default:
                break;
            }
        }
Exemplo n.º 5
0
        private void HandleBackgroundOperation(BackgroundOperation operation)
        {
            BackgroundOperation temp;

            if (!BackgroundInternalOperations.TryRemove(operation.OperationId, out temp))
            {
                return;
            }

            var subTask           = temp as BackgroundOperation <Subscription>;
            var resourceGroupTask = temp as BackgroundOperation <ResourceGroup>;

            if ((subTask != null && subTask.Task.IsFaulted) ||
                (resourceGroupTask != null && resourceGroupTask.Task.IsFaulted))
            {
                //temp.RetryAction();
                SimpleTrace.Diagnostics.Fatal("Losing ResourceGroup with {@exception}", resourceGroupTask?.Task?.Exception);
                return;
            }

            switch (operation.Type)
            {
            case OperationType.LoadMonitoringToolSubscription:
                var monitoringToolsSubscription = subTask.Task.Result;
                var monitoringToolsResource     = monitoringToolsSubscription.GetMonitoringToolsResource();
                MonitoringResourceGroup = monitoringToolsResource.Ready.First();
                break;

            case OperationType.SubscriptionLoad:
                var subscription = subTask.Task.Result;
                var result       = subscription.MakeTrialSubscription();
                foreach (var resourceGroup in result.Ready)
                {
                    PutResourceGroupInDesiredStateOperation(resourceGroup);
                }
                if (result.ToCreateInRegions != null)
                {
                    foreach (var geoRegion in result.ToCreateInRegions)
                    {
                        CreateResourceGroupOperation(subscription.SubscriptionId, geoRegion);
                    }
                }
                if (result.ToCreateTemplates != null)
                {
                    var rand = new Random();
                    foreach (var template in result.ToCreateTemplates)
                    {
                        for (int i = 0; i < template.RemainingCount; i++)
                        {
                            CreateResourceGroupOperation(subscription.SubscriptionId, subscription.GeoRegions.ElementAt(rand.Next(subscription.GeoRegions.Count())), template.TemplateName);
                        }
                    }
                }
                foreach (var resourceGroup in result.ToDelete)
                {
                    DeleteResourceGroupOperation(resourceGroup);
                }
                break;

            case OperationType.ResourceGroupPutInDesiredState:
            case OperationType.ResourceGroupDeleteThenCreate:
                var readyToAddRg = resourceGroupTask.Task.Result;
                if (readyToAddRg.UserId != null)
                {
                    if (!ResourceGroupsInUse.TryAdd(readyToAddRg.UserId, readyToAddRg))
                    {
                        DeleteAndCreateResourceGroupOperation(readyToAddRg);
                    }
                }
                else
                {
                    if (readyToAddRg.SubscriptionType == SubscriptionType.AppService || readyToAddRg.SubscriptionType == SubscriptionType.MonitoringTools)
                    {
                        FreeResourceGroups.Enqueue(readyToAddRg);
                    }
                    else if (readyToAddRg.SubscriptionType == SubscriptionType.VSCodeLinux)
                    {
                        if (!FreeVSCodeLinuxResourceGroups.ContainsKey(readyToAddRg.DeployedTemplateName))
                        {
                            readyToAddRg.TemplateName = readyToAddRg.DeployedTemplateName;
                            FreeVSCodeLinuxResourceGroups.GetOrAdd(readyToAddRg.DeployedTemplateName, new ConcurrentQueue <ResourceGroup>());
                        }
                        readyToAddRg.TemplateName = readyToAddRg.DeployedTemplateName;
                        FreeVSCodeLinuxResourceGroups[readyToAddRg.DeployedTemplateName].Enqueue(readyToAddRg);
                    }
                    else if (readyToAddRg.SubscriptionType == SubscriptionType.Linux)
                    {
                        FreeLinuxResourceGroups.Enqueue(readyToAddRg);
                    }
                }
                break;

            case OperationType.ResourceGroupCreate:
                PutResourceGroupInDesiredStateOperation(resourceGroupTask.Task.Result);
                break;

            case OperationType.LogUsageStatistics:
                DeleteAndCreateResourceGroupOperation(resourceGroupTask.Task.Result);
                break;

            case OperationType.ResourceGroupDelete:
            default:
                break;
            }
        }