private async Task <(Guid, int)> GetSubscriptionCapacityAsync(ProjectType projectType, Guid subscriptionId)
        {
            var subscription = await azureResourceService
                               .GetSubscriptionAsync(subscriptionId)
                               .ConfigureAwait(false);

            if (subscription is null)
            {
                return(subscriptionId, 0);
            }

            var identity = await azureResourceService.AzureSessionService
                           .GetIdentityAsync()
                           .ConfigureAwait(false);

            var hasOwnership = await subscription
                               .HasRoleAssignmentAsync(identity.ObjectId, AzureRoleDefinition.Owner)
                               .ConfigureAwait(false);

            if (hasOwnership)
            {
                var instanceCount = await projectTypesRepository
                                    .GetInstanceCountAsync(projectType.Id, subscriptionId)
                                    .ConfigureAwait(false);

                return(subscriptionId, Math.Max(projectType.SubscriptionCapacity - instanceCount, 0));
            }

            return(subscriptionId, 0);
        }
Esempio n. 2
0
        protected async Task <AzureResourceGroup> GetResourceGroupAsync()
        {
            if (ResourceGroupSubscriptionId.HasValue)
            {
                var resourceGroup = await AzureResourceService
                                    .GetResourceGroupAsync(ResourceGroupSubscriptionId.Value, ResourceGroupName)
                                    .ConfigureAwait(false);

                if (resourceGroup is null)
                {
                    var subscription = await AzureResourceService
                                       .GetSubscriptionAsync(ResourceGroupSubscriptionId.Value, true)
                                       .ConfigureAwait(false);

                    resourceGroup = await subscription
                                    .CreateResourceGroupAsync(ResourceGroupName, AzureResourceLocation)
                                    .ConfigureAwait(false);
                }

                await resourceGroup
                .SetTagAsync("Test", Test.DisplayName)
                .ConfigureAwait(false);

                if (ProviderServicePrincipalId.HasValue)
                {
                    var roleAssignments = await resourceGroup
                                          .GetRoleAssignmentsAsync(ProviderServicePrincipalId.ToString())
                                          .ConfigureAwait(false);

                    if (!roleAssignments.Contains(AzureRoleDefinition.Contributor))
                    {
                        await resourceGroup
                        .AddRoleAssignmentAsync(ProviderServicePrincipalId.ToString(), AzureRoleDefinition.Contributor)
                        .ConfigureAwait(false);
                    }
                }

                return(new AzureResourceGroup()
                {
                    Id = resourceGroup.ResourceId.ToString(),
                    Name = ResourceGroupName,
                    Region = ResourceGroupLocation,
                    SubscriptionId = ResourceGroupSubscriptionId.GetValueOrDefault()
                });
            }
            else
            {
                throw new NotSupportedException("Missing configuration value 'subscriptionId'");
            }
        }
        public async Task <string> RunActivity(
            [ActivityTrigger] IDurableActivityContext functionContext)
        {
            const string SubscriptionVersionDefault = "0.0.0.0";
            const string SubscriptionVersionTag     = "TeamCloudVersion";

            if (functionContext is null)
            {
                throw new ArgumentNullException(nameof(functionContext));
            }

            var(subscriptionId, subscriptionVersion) = functionContext.GetInput <(Guid, string)>();

            var subscription = await azureResourceService
                               .GetSubscriptionAsync(subscriptionId, throwIfNotExists : true)
                               .ConfigureAwait(false);

            if (!string.IsNullOrEmpty(subscriptionVersion) && !subscriptionVersion.Equals(await GetCurrentSubscribtionVersionAsync().ConfigureAwait(false), StringComparison.OrdinalIgnoreCase))
            {
                await subscription
                .SetTagAsync(SubscriptionVersionTag, subscriptionVersion)
                .ConfigureAwait(false);

                return(subscriptionVersion);
            }

            return(await GetCurrentSubscribtionVersionAsync()
                   .ConfigureAwait(false));

            async Task <string> GetCurrentSubscribtionVersionAsync()
            {
                var subscriptionVersionTag = await subscription
                                             .GetTagAsync(SubscriptionVersionTag)
                                             .ConfigureAwait(false);

                if (Version.TryParse(subscriptionVersionTag, out var version))
                {
                    return(version.ToString(4));
                }

                return(SubscriptionVersionDefault);
            }
        }
    protected override async Task <Component> UpdateComponentAsync(Component component, Organization componentOrganization, DeploymentScope componentDeploymentScope, Project componentProject, User contextUser, IAsyncCollector <ICommand> commandQueue)
    {
        if (component is null)
        {
            throw new ArgumentNullException(nameof(component));
        }

        if (AzureResourceIdentifier.TryParse(component.ResourceId, out var componentResourceId))
        {
            var tasks = new Task[] {
                UpdateComponentRoleAssignmentsAsync(),
                UpdateComponentTagsAsync()
            };

            await Task.WhenAll(tasks).ConfigureAwait(false);
        }

        return(component);

        async Task UpdateComponentRoleAssignmentsAsync()
        {
            var roleAssignmentMap = await GetRoleAssignmentsAsync(component)
                                    .ConfigureAwait(false);

            if (AzureResourceIdentifier.TryParse(component.IdentityId, out var identityResourceId))
            {
                var session = await azureResourceService.AzureSessionService
                              .CreateSessionAsync(identityResourceId.SubscriptionId)
                              .ConfigureAwait(false);

                var identity = await session.Identities
                               .GetByIdAsync(identityResourceId.ToString())
                               .ConfigureAwait(false);

                roleAssignmentMap
                .Add(identity.PrincipalId, Enumerable.Repeat(AzureRoleDefinition.Contributor, 1));
            }

            if (string.IsNullOrEmpty(componentResourceId.ResourceGroup))
            {
                var subscription = await azureResourceService
                                   .GetSubscriptionAsync(componentResourceId.SubscriptionId, throwIfNotExists : true)
                                   .ConfigureAwait(false);

                if (subscription is not null)
                {
                    await subscription.SetRoleAssignmentsAsync(roleAssignmentMap).ConfigureAwait(false);
                }
            }
            else
            {
                var resourceGroup = await azureResourceService
                                    .GetResourceGroupAsync(componentResourceId.SubscriptionId, componentResourceId.ResourceGroup, throwIfNotExists : true)
                                    .ConfigureAwait(false);

                if (resourceGroup is not null)
                {
                    await resourceGroup.SetRoleAssignmentsAsync(roleAssignmentMap).ConfigureAwait(false);
                }
            }
        }

        async Task UpdateComponentTagsAsync()
        {
            var tenantId = await azureResourceService.AzureSessionService
                           .GetTenantIdAsync()
                           .ConfigureAwait(false);

            var organization = await organizationRepository
                               .GetAsync(tenantId.ToString(), component.Organization, true)
                               .ConfigureAwait(false);

            var project = await projectRepository
                          .GetAsync(component.Organization, component.ProjectId, true)
                          .ConfigureAwait(false);

            var tags = organization.Tags
                       .Union(project.Tags)
                       .GroupBy(kvp => kvp.Key)
                       .ToDictionary(g => g.Key, g => g.First().Value);

            if (string.IsNullOrEmpty(componentResourceId.ResourceGroup))
            {
                var subscription = await azureResourceService
                                   .GetSubscriptionAsync(componentResourceId.SubscriptionId)
                                   .ConfigureAwait(false);

                if (subscription is not null)
                {
                    await subscription.SetTagsAsync(tags, true).ConfigureAwait(false);
                }
            }
            else
            {
                var resourceGroup = await azureResourceService
                                    .GetResourceGroupAsync(componentResourceId.SubscriptionId, componentResourceId.ResourceGroup)
                                    .ConfigureAwait(false);

                if (resourceGroup is not null)
                {
                    await resourceGroup.SetTagsAsync(tags, true).ConfigureAwait(false);
                }
            }
        }
    }