tools/code/extractor/ProductPolicy.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 ExtractProductPolicies(ProductName productName, CancellationToken cancellationToken); public delegate IAsyncEnumerable<(ProductPolicyName Name, ProductPolicyDto Dto)> ListProductPolicies(ProductName productName, CancellationToken cancellationToken); public delegate ValueTask WriteProductPolicyArtifacts(ProductPolicyName name, ProductPolicyDto dto, ProductName productName, CancellationToken cancellationToken); public delegate ValueTask WriteProductPolicyFile(ProductPolicyName name, ProductPolicyDto dto, ProductName productName, CancellationToken cancellationToken); internal static class ProductPolicyModule { public static void ConfigureExtractProductPolicies(IHostApplicationBuilder builder) { ConfigureListProductPolicies(builder); ConfigureWriteProductPolicyArtifacts(builder); builder.Services.TryAddSingleton(GetExtractProductPolicies); } private static ExtractProductPolicies GetExtractProductPolicies(IServiceProvider provider) { var list = provider.GetRequiredService<ListProductPolicies>(); var writeArtifacts = provider.GetRequiredService<WriteProductPolicyArtifacts>(); var activitySource = provider.GetRequiredService<ActivitySource>(); var logger = provider.GetRequiredService<ILogger>(); return async (productName, cancellationToken) => { using var _ = activitySource.StartActivity(nameof(ExtractProductPolicies)); logger.LogInformation("Extracting policies for product {ProductName}...", productName); await list(productName, cancellationToken) .IterParallel(async policy => await writeArtifacts(policy.Name, policy.Dto, productName, cancellationToken), cancellationToken); }; } private static void ConfigureListProductPolicies(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceUri(builder); AzureModule.ConfigureHttpPipeline(builder); builder.Services.TryAddSingleton(GetListProductPolicies); } private static ListProductPolicies GetListProductPolicies(IServiceProvider provider) { var serviceUri = provider.GetRequiredService<ManagementServiceUri>(); var pipeline = provider.GetRequiredService<HttpPipeline>(); return (productName, cancellationToken) => ProductPoliciesUri.From(productName, serviceUri) .List(pipeline, cancellationToken); } private static void ConfigureWriteProductPolicyArtifacts(IHostApplicationBuilder builder) { ConfigureWriteProductPolicyFile(builder); builder.Services.TryAddSingleton(GetWriteProductPolicyArtifacts); } private static WriteProductPolicyArtifacts GetWriteProductPolicyArtifacts(IServiceProvider provider) { var writePolicyFile = provider.GetRequiredService<WriteProductPolicyFile>(); return async (name, dto, productName, cancellationToken) => await writePolicyFile(name, dto, productName, cancellationToken); } private static void ConfigureWriteProductPolicyFile(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceDirectory(builder); builder.Services.TryAddSingleton(GetWriteProductPolicyFile); } private static WriteProductPolicyFile GetWriteProductPolicyFile(IServiceProvider provider) { var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); var logger = provider.GetRequiredService<ILogger>(); return async (name, dto, productName, cancellationToken) => { var policyFile = ProductPolicyFile.From(name, productName, serviceDirectory); logger.LogInformation("Writing product policy file {PolicyFile}", policyFile); var policy = dto.Properties.Value ?? string.Empty; await policyFile.WritePolicy(policy, cancellationToken); }; } }