async Task OrderCreationOfStudySpecificDatasetStorageAccount(Study study, Dataset dataset, CloudResource resourceGroup, string clientIp, ProvisioningQueueParentDto queueParent, CancellationToken cancellationToken)
        {
            try
            {
                if (resourceGroup == null)
                {
                    throw new ArgumentNullException("resourceGroup", "Resource group entry is null");
                }

                _logger.LogInformation($"CreateResourcesForStudySpecificDataset - Dataset Id: {dataset.Id}");

                var currentUser = await _userService.GetCurrentUserAsync();

                var tagsForStorageAccount = ResourceTagFactory.StudySpecificDatasourceStorageAccountTags(_config, study, dataset.Name);
                var storageAccountName    = AzureResourceNameUtil.StudySpecificDataSetStorageAccount(dataset.Name);

                var resourceEntry = await _cloudResourceCreateService.CreateStudySpecificDatasetEntryAsync(dataset.Id, resourceGroup.Id, resourceGroup.Region, resourceGroup.ResourceGroupName, storageAccountName, tagsForStorageAccount);

                ProvisioningQueueUtil.CreateChildAndAdd(queueParent, resourceEntry);

                var serverPublicIp = await _publicIpService.GetIp();

                DatasetFirewallUtils.EnsureDatasetHasFirewallRules(_logger, currentUser, dataset, clientIp, serverPublicIp);

                await _db.SaveChangesAsync();

                var stateForFirewallOperation = DatasetFirewallUtils.TranslateAllowedIpsToOperationDesiredState(dataset.FirewallRules.ToList());

                var createStorageAccountOperation = CloudResourceOperationUtil.GetCreateOperation(resourceEntry);
                var firewallUpdateOperation       = await _cloudResourceOperationCreateService.CreateUpdateOperationAsync(resourceEntry.Id, CloudResourceOperationType.ENSURE_FIREWALL_RULES, dependsOn : createStorageAccountOperation.Id, desiredState : stateForFirewallOperation);

                ProvisioningQueueUtil.CreateChildAndAdd(queueParent, firewallUpdateOperation);

                var stateForCorsRules   = DatasetCorsUtils.CreateDatasetCorsRules(_config);
                var corsUpdateOperation = await _cloudResourceOperationCreateService.CreateUpdateOperationAsync(resourceEntry.Id, CloudResourceOperationType.ENSURE_CORS_RULES, dependsOn : firewallUpdateOperation.Id, desiredState : stateForCorsRules);

                ProvisioningQueueUtil.CreateChildAndAdd(queueParent, corsUpdateOperation);
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed to schedule creation of Azure Storage Account", ex);
            }
        }
        public async Task EnsureFirewallExistsAsync(Study study, Dataset dataset, string clientIp, CancellationToken cancellationToken = default)
        {
            var currentUser = await _userService.GetCurrentUserAsync();

            var serverPublicIp = await _publicIpService.GetIp();

            if (DatasetFirewallUtils.SetDatasetFirewallRules(currentUser, dataset, clientIp, serverPublicIp))
            {
                await _db.SaveChangesAsync(cancellationToken);

                var stateForFirewallOperation     = DatasetFirewallUtils.TranslateAllowedIpsToOperationDesiredState(dataset.FirewallRules.ToList());
                var datasetStorageAccountResource = DatasetUtils.GetStudySpecificStorageAccountResourceEntry(dataset);
                var firewallUpdateOperation       = await _cloudResourceOperationCreateService.CreateUpdateOperationAsync(datasetStorageAccountResource.Id,
                                                                                                                          CloudResourceOperationType.ENSURE_FIREWALL_RULES, desiredState : stateForFirewallOperation);

                await _provisioningQueueService.CreateItemAndEnqueue(firewallUpdateOperation);

                await WaitForOperationToCompleteAsync(firewallUpdateOperation.Id);
            }
        }
        public void SetDatasetFirewallRules_ShouldReturnException(string expectedResult, string clientIp, string serverIp)
        {
            var fireWallRules = new List <DatasetFirewallRule>()
            {
            };

            fireWallRules.Add(new DatasetFirewallRule {
                Id = 1, Address = "1", Created = DateTime.Today.AddYears(-1)
            });
            var user = new UserDto()
            {
                Id = 1
            };
            var dataset = new Dataset()
            {
                FirewallRules = fireWallRules
            };

            var ex = Assert.Throws <ArgumentException>(() => DatasetFirewallUtils.SetDatasetFirewallRules(user, dataset, clientIp, serverIp));

            Assert.Equal(expectedResult, ex.Message);
        }
        public void SetDatasetFirewallRules_ShouldReturnTrue(int expectedValue, string clientIp, string serverIp)
        {
            var fireWallRules = new List <DatasetFirewallRule>()
            {
            };

            fireWallRules.Add(new DatasetFirewallRule {
                Id = 1, Address = "1", Created = DateTime.Today.AddYears(-1)
            });
            var user = new UserDto()
            {
                Id = 1
            };
            var dataset = new Dataset()
            {
                FirewallRules = fireWallRules
            };
            var result = DatasetFirewallUtils.SetDatasetFirewallRules(user, dataset, clientIp, serverIp);

            Assert.True(result);
            Assert.Equal(expectedValue, dataset.FirewallRules.Count);
        }