tools/code/publisher/ProductPolicy.cs (211 lines of code) (raw):

using Azure.Core.Pipeline; using common; using LanguageExt; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace publisher; public delegate ValueTask PutProductPolicies(CancellationToken cancellationToken); public delegate Option<(ProductPolicyName Name, ProductName ProductName)> TryParseProductPolicyName(FileInfo file); public delegate bool IsProductPolicyNameInSourceControl(ProductPolicyName name, ProductName productName); public delegate ValueTask PutProductPolicy(ProductPolicyName name, ProductName productName, CancellationToken cancellationToken); public delegate ValueTask<Option<ProductPolicyDto>> FindProductPolicyDto(ProductPolicyName name, ProductName productName, CancellationToken cancellationToken); public delegate ValueTask PutProductPolicyInApim(ProductPolicyName name, ProductPolicyDto dto, ProductName productName, CancellationToken cancellationToken); public delegate ValueTask DeleteProductPolicies(CancellationToken cancellationToken); public delegate ValueTask DeleteProductPolicy(ProductPolicyName name, ProductName productName, CancellationToken cancellationToken); public delegate ValueTask DeleteProductPolicyFromApim(ProductPolicyName name, ProductName productName, CancellationToken cancellationToken); internal static class ProductPolicyModule { public static void ConfigurePutProductPolicies(IHostApplicationBuilder builder) { CommonModule.ConfigureGetPublisherFiles(builder); ConfigureTryParseProductPolicyName(builder); ConfigureIsProductPolicyNameInSourceControl(builder); ConfigurePutProductPolicy(builder); builder.Services.TryAddSingleton(GetPutProductPolicies); } private static PutProductPolicies GetPutProductPolicies(IServiceProvider provider) { var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>(); var tryParseName = provider.GetRequiredService<TryParseProductPolicyName>(); var isNameInSourceControl = provider.GetRequiredService<IsProductPolicyNameInSourceControl>(); var put = provider.GetRequiredService<PutProductPolicy>(); var activitySource = provider.GetRequiredService<ActivitySource>(); var logger = provider.GetRequiredService<ILogger>(); return async cancellationToken => { using var _ = activitySource.StartActivity(nameof(PutProductPolicies)); logger.LogInformation("Putting product policies..."); await getPublisherFiles() .Choose(tryParseName.Invoke) .Where(policy => isNameInSourceControl(policy.Name, policy.ProductName)) .Distinct() .IterParallel(put.Invoke, cancellationToken); }; } private static void ConfigureTryParseProductPolicyName(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceDirectory(builder); builder.Services.TryAddSingleton(GetTryParseProductPolicyName); } private static TryParseProductPolicyName GetTryParseProductPolicyName(IServiceProvider provider) { var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); return file => from policyFile in ProductPolicyFile.TryParse(file, serviceDirectory) select (policyFile.Name, policyFile.Parent.Name); } private static void ConfigureIsProductPolicyNameInSourceControl(IHostApplicationBuilder builder) { CommonModule.ConfigureGetArtifactFiles(builder); AzureModule.ConfigureManagementServiceDirectory(builder); builder.Services.TryAddSingleton(GetIsProductPolicyNameInSourceControl); } private static IsProductPolicyNameInSourceControl GetIsProductPolicyNameInSourceControl(IServiceProvider provider) { var getArtifactFiles = provider.GetRequiredService<GetArtifactFiles>(); var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); return doesPolicyFileExist; bool doesPolicyFileExist(ProductPolicyName name, ProductName productName) { var artifactFiles = getArtifactFiles(); var policyFile = ProductPolicyFile.From(name, productName, serviceDirectory); return artifactFiles.Contains(policyFile.ToFileInfo()); } } private static void ConfigurePutProductPolicy(IHostApplicationBuilder builder) { ConfigureFindProductPolicyDto(builder); ConfigurePutProductPolicyInApim(builder); builder.Services.TryAddSingleton(GetPutProductPolicy); } private static PutProductPolicy GetPutProductPolicy(IServiceProvider provider) { var findDto = provider.GetRequiredService<FindProductPolicyDto>(); var putInApim = provider.GetRequiredService<PutProductPolicyInApim>(); var activitySource = provider.GetRequiredService<ActivitySource>(); return async (name, productName, cancellationToken) => { using var _ = activitySource.StartActivity(nameof(PutProductPolicy)) ?.AddTag("product_policy.name", name) ?.AddTag("product.name", productName); var dtoOption = await findDto(name, productName, cancellationToken); await dtoOption.IterTask(async dto => await putInApim(name, dto, productName, cancellationToken)); }; } private static void ConfigureFindProductPolicyDto(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceDirectory(builder); CommonModule.ConfigureTryGetFileContents(builder); builder.Services.TryAddSingleton(GetFindProductPolicyDto); } private static FindProductPolicyDto GetFindProductPolicyDto(IServiceProvider provider) { var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); var tryGetFileContents = provider.GetRequiredService<TryGetFileContents>(); return async (name, productName, cancellationToken) => { var contentsOption = await tryGetPolicyContents(name, productName, cancellationToken); return from contents in contentsOption select new ProductPolicyDto { Properties = new ProductPolicyDto.ProductPolicyContract { Format = "rawxml", Value = contents.ToString() } }; }; async ValueTask<Option<BinaryData>> tryGetPolicyContents(ProductPolicyName name, ProductName productName, CancellationToken cancellationToken) { var policyFile = ProductPolicyFile.From(name, productName, serviceDirectory); return await tryGetFileContents(policyFile.ToFileInfo(), cancellationToken); } } private static void ConfigurePutProductPolicyInApim(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceUri(builder); AzureModule.ConfigureHttpPipeline(builder); builder.Services.TryAddSingleton(GetPutProductPolicyInApim); } private static PutProductPolicyInApim GetPutProductPolicyInApim(IServiceProvider provider) { var serviceUri = provider.GetRequiredService<ManagementServiceUri>(); var pipeline = provider.GetRequiredService<HttpPipeline>(); var logger = provider.GetRequiredService<ILogger>(); return async (name, dto, productName, cancellationToken) => { logger.LogInformation("Putting policy {ProductPolicyName} for product {ProductName}...", name, productName); await ProductPolicyUri.From(name, productName, serviceUri) .PutDto(dto, pipeline, cancellationToken); }; } public static void ConfigureDeleteProductPolicies(IHostApplicationBuilder builder) { CommonModule.ConfigureGetPublisherFiles(builder); ConfigureTryParseProductPolicyName(builder); ConfigureIsProductPolicyNameInSourceControl(builder); ConfigureDeleteProductPolicy(builder); builder.Services.TryAddSingleton(GetDeleteProductPolicies); } private static DeleteProductPolicies GetDeleteProductPolicies(IServiceProvider provider) { var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>(); var tryParseName = provider.GetRequiredService<TryParseProductPolicyName>(); var isNameInSourceControl = provider.GetRequiredService<IsProductPolicyNameInSourceControl>(); var delete = provider.GetRequiredService<DeleteProductPolicy>(); var activitySource = provider.GetRequiredService<ActivitySource>(); var logger = provider.GetRequiredService<ILogger>(); return async cancellationToken => { using var _ = activitySource.StartActivity(nameof(DeleteProductPolicies)); logger.LogInformation("Deleting product policies..."); await getPublisherFiles() .Choose(tryParseName.Invoke) .Where(policy => isNameInSourceControl(policy.Name, policy.ProductName) is false) .Distinct() .IterParallel(delete.Invoke, cancellationToken); }; } private static void ConfigureDeleteProductPolicy(IHostApplicationBuilder builder) { ConfigureDeleteProductPolicyFromApim(builder); builder.Services.TryAddSingleton(GetDeleteProductPolicy); } private static DeleteProductPolicy GetDeleteProductPolicy(IServiceProvider provider) { var deleteFromApim = provider.GetRequiredService<DeleteProductPolicyFromApim>(); var activitySource = provider.GetRequiredService<ActivitySource>(); return async (name, productName, cancellationToken) => { using var _ = activitySource.StartActivity(nameof(DeleteProductPolicy)) ?.AddTag("product_policy.name", name) ?.AddTag("product.name", productName); await deleteFromApim(name, productName, cancellationToken); }; } private static void ConfigureDeleteProductPolicyFromApim(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceUri(builder); AzureModule.ConfigureHttpPipeline(builder); builder.Services.TryAddSingleton(GetDeleteProductPolicyFromApim); } private static DeleteProductPolicyFromApim GetDeleteProductPolicyFromApim(IServiceProvider provider) { var serviceUri = provider.GetRequiredService<ManagementServiceUri>(); var pipeline = provider.GetRequiredService<HttpPipeline>(); var logger = provider.GetRequiredService<ILogger>(); return async (name, productName, cancellationToken) => { logger.LogInformation("Deleting policy {ProductPolicyName} from product {ProductName}...", name, productName); await ProductPolicyUri.From(name, productName, serviceUri) .Delete(pipeline, cancellationToken); }; } }