tools/code/extractor/WorkspacePolicy.cs (82 lines of code) (raw):

using Azure.Core.Pipeline; using common; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace extractor; public delegate ValueTask ExtractWorkspacePolicies(WorkspaceName workspaceName, CancellationToken cancellationToken); public delegate IAsyncEnumerable<(WorkspacePolicyName Name, WorkspacePolicyDto Dto)> ListWorkspacePolicies(WorkspaceName workspaceName, CancellationToken cancellationToken); public delegate ValueTask WriteWorkspacePolicyArtifacts(WorkspacePolicyName name, WorkspacePolicyDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken); public delegate ValueTask WriteWorkspacePolicyFile(WorkspacePolicyName name, WorkspacePolicyDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken); internal static class WorkspacePolicyModule { public static void ConfigureExtractWorkspacePolicies(IHostApplicationBuilder builder) { ConfigureListWorkspacePolicies(builder); ConfigureWriteWorkspacePolicyArtifacts(builder); builder.Services.TryAddSingleton(GetExtractWorkspacePolicies); } private static ExtractWorkspacePolicies GetExtractWorkspacePolicies(IServiceProvider provider) { var list = provider.GetRequiredService<ListWorkspacePolicies>(); var writeArtifacts = provider.GetRequiredService<WriteWorkspacePolicyArtifacts>(); var activitySource = provider.GetRequiredService<ActivitySource>(); var logger = provider.GetRequiredService<ILogger>(); return async (workspaceName, cancellationToken) => { using var _ = activitySource.StartActivity(nameof(ExtractWorkspacePolicies)); logger.LogInformation("Extracting policies for workspace {WorkspaceName}...", workspaceName); await list(workspaceName, cancellationToken) .IterParallel(async policy => await writeArtifacts(policy.Name, policy.Dto, workspaceName, cancellationToken), cancellationToken); }; } private static void ConfigureListWorkspacePolicies(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceUri(builder); AzureModule.ConfigureHttpPipeline(builder); builder.Services.TryAddSingleton(GetListWorkspacePolicies); } private static ListWorkspacePolicies GetListWorkspacePolicies(IServiceProvider provider) { var serviceUri = provider.GetRequiredService<ManagementServiceUri>(); var pipeline = provider.GetRequiredService<HttpPipeline>(); return (workspaceName, cancellationToken) => WorkspacePoliciesUri.From(workspaceName, serviceUri) .List(pipeline, cancellationToken); } private static void ConfigureWriteWorkspacePolicyArtifacts(IHostApplicationBuilder builder) { ConfigureWriteWorkspacePolicyFile(builder); builder.Services.TryAddSingleton(GetWriteWorkspacePolicyArtifacts); } private static WriteWorkspacePolicyArtifacts GetWriteWorkspacePolicyArtifacts(IServiceProvider provider) { var writePolicyFile = provider.GetRequiredService<WriteWorkspacePolicyFile>(); return async (name, dto, workspaceName, cancellationToken) => await writePolicyFile(name, dto, workspaceName, cancellationToken); } private static void ConfigureWriteWorkspacePolicyFile(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceDirectory(builder); builder.Services.TryAddSingleton(GetWriteWorkspacePolicyFile); } private static WriteWorkspacePolicyFile GetWriteWorkspacePolicyFile(IServiceProvider provider) { var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); var logger = provider.GetRequiredService<ILogger>(); return async (name, dto, workspaceName, cancellationToken) => { var policyFile = WorkspacePolicyFile.From(name, workspaceName, serviceDirectory); logger.LogInformation("Writing workspace policy file {PolicyFile}", policyFile); var policy = dto.Properties.Value ?? string.Empty; await policyFile.WritePolicy(policy, cancellationToken); }; } }