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); }
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); } } } }