tools/code/publisher/ServicePolicy.cs (214 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 PutServicePolicies(CancellationToken cancellationToken); public delegate Option<ServicePolicyName> TryParseServicePolicyName(FileInfo file); public delegate bool IsServicePolicyNameInSourceControl(ServicePolicyName name); public delegate ValueTask PutServicePolicy(ServicePolicyName name, CancellationToken cancellationToken); public delegate ValueTask<Option<ServicePolicyDto>> FindServicePolicyDto(ServicePolicyName name, CancellationToken cancellationToken); public delegate ValueTask PutServicePolicyInApim(ServicePolicyName name, ServicePolicyDto dto, CancellationToken cancellationToken); public delegate ValueTask DeleteServicePolicies(CancellationToken cancellationToken); public delegate ValueTask DeleteServicePolicy(ServicePolicyName name, CancellationToken cancellationToken); public delegate ValueTask DeleteServicePolicyFromApim(ServicePolicyName name, CancellationToken cancellationToken); internal static class ServicePolicyModule { public static void ConfigurePutServicePolicies(IHostApplicationBuilder builder) { CommonModule.ConfigureGetPublisherFiles(builder); ConfigureTryParseServicePolicyName(builder); ConfigureIsServicePolicyNameInSourceControl(builder); ConfigurePutServicePolicy(builder); builder.Services.TryAddSingleton(GetPutServicePolicies); } private static PutServicePolicies GetPutServicePolicies(IServiceProvider provider) { var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>(); var tryParseName = provider.GetRequiredService<TryParseServicePolicyName>(); var isNameInSourceControl = provider.GetRequiredService<IsServicePolicyNameInSourceControl>(); var put = provider.GetRequiredService<PutServicePolicy>(); var activitySource = provider.GetRequiredService<ActivitySource>(); var logger = provider.GetRequiredService<ILogger>(); return async cancellationToken => { using var _ = activitySource.StartActivity(nameof(PutServicePolicies)); logger.LogInformation("Putting service policies..."); await getPublisherFiles() .Choose(tryParseName.Invoke) .Where(isNameInSourceControl.Invoke) .Distinct() .IterParallel(put.Invoke, cancellationToken); }; } private static void ConfigureTryParseServicePolicyName(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceDirectory(builder); builder.Services.TryAddSingleton(GetTryParseServicePolicyName); } private static TryParseServicePolicyName GetTryParseServicePolicyName(IServiceProvider provider) { var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); return file => from policyFile in ServicePolicyFile.TryParse(file, serviceDirectory) select policyFile.Name; } private static void ConfigureIsServicePolicyNameInSourceControl(IHostApplicationBuilder builder) { CommonModule.ConfigureGetArtifactFiles(builder); AzureModule.ConfigureManagementServiceDirectory(builder); builder.Services.TryAddSingleton(GetIsServicePolicyNameInSourceControl); } private static IsServicePolicyNameInSourceControl GetIsServicePolicyNameInSourceControl(IServiceProvider provider) { var getArtifactFiles = provider.GetRequiredService<GetArtifactFiles>(); var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); return doesPolicyFileExist; bool doesPolicyFileExist(ServicePolicyName name) { var artifactFiles = getArtifactFiles(); var policyFile = ServicePolicyFile.From(name, serviceDirectory); return artifactFiles.Contains(policyFile.ToFileInfo()); } } private static void ConfigurePutServicePolicy(IHostApplicationBuilder builder) { ConfigureFindServicePolicyDto(builder); ConfigurePutServicePolicyInApim(builder); builder.Services.TryAddSingleton(GetPutServicePolicy); } private static PutServicePolicy GetPutServicePolicy(IServiceProvider provider) { var findDto = provider.GetRequiredService<FindServicePolicyDto>(); var putInApim = provider.GetRequiredService<PutServicePolicyInApim>(); var activitySource = provider.GetRequiredService<ActivitySource>(); return async (name, cancellationToken) => { using var _ = activitySource.StartActivity(nameof(PutServicePolicy)) ?.AddTag("service_policy.name", name); var dtoOption = await findDto(name, cancellationToken); await dtoOption.IterTask(async dto => await putInApim(name, dto, cancellationToken)); }; } private static void ConfigureFindServicePolicyDto(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceDirectory(builder); CommonModule.ConfigureTryGetFileContents(builder); OverrideDtoModule.ConfigureOverrideDtoFactory(builder); builder.Services.TryAddSingleton(GetFindServicePolicyDto); } private static FindServicePolicyDto GetFindServicePolicyDto(IServiceProvider provider) { var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); var tryGetFileContents = provider.GetRequiredService<TryGetFileContents>(); var overrideFactory = provider.GetRequiredService<OverrideDtoFactory>(); var overrideDto = overrideFactory.Create<ServicePolicyName, ServicePolicyDto>(); return async (name, cancellationToken) => { var contentsOption = await tryGetPolicyContents(name, cancellationToken); return from contents in contentsOption let dto = new ServicePolicyDto { Properties = new ServicePolicyDto.ServicePolicyContract { Format = "rawxml", Value = contents.ToString() } } let overrideDto = overrideFactory.Create<ServicePolicyName, ServicePolicyDto>() select overrideDto(name, dto); }; async ValueTask<Option<BinaryData>> tryGetPolicyContents(ServicePolicyName name, CancellationToken cancellationToken) { var policyFile = ServicePolicyFile.From(name, serviceDirectory); return await tryGetFileContents(policyFile.ToFileInfo(), cancellationToken); } } private static void ConfigurePutServicePolicyInApim(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceUri(builder); AzureModule.ConfigureHttpPipeline(builder); builder.Services.TryAddSingleton(GetPutServicePolicyInApim); } private static PutServicePolicyInApim GetPutServicePolicyInApim(IServiceProvider provider) { var serviceUri = provider.GetRequiredService<ManagementServiceUri>(); var pipeline = provider.GetRequiredService<HttpPipeline>(); var logger = provider.GetRequiredService<ILogger>(); return async (name, dto, cancellationToken) => { logger.LogInformation("Putting service policy {ServicePolicyName}...", name); await ServicePolicyUri.From(name, serviceUri) .PutDto(dto, pipeline, cancellationToken); }; } public static void ConfigureDeleteServicePolicies(IHostApplicationBuilder builder) { CommonModule.ConfigureGetPublisherFiles(builder); ConfigureTryParseServicePolicyName(builder); ConfigureIsServicePolicyNameInSourceControl(builder); ConfigureDeleteServicePolicy(builder); builder.Services.TryAddSingleton(GetDeleteServicePolicies); } private static DeleteServicePolicies GetDeleteServicePolicies(IServiceProvider provider) { var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>(); var tryParseName = provider.GetRequiredService<TryParseServicePolicyName>(); var isNameInSourceControl = provider.GetRequiredService<IsServicePolicyNameInSourceControl>(); var delete = provider.GetRequiredService<DeleteServicePolicy>(); var activitySource = provider.GetRequiredService<ActivitySource>(); var logger = provider.GetRequiredService<ILogger>(); return async cancellationToken => { using var _ = activitySource.StartActivity(nameof(DeleteServicePolicies)); logger.LogInformation("Deleting service policies..."); await getPublisherFiles() .Choose(tryParseName.Invoke) .Where(name => isNameInSourceControl(name) is false) .Distinct() .IterParallel(delete.Invoke, cancellationToken); }; } private static void ConfigureDeleteServicePolicy(IHostApplicationBuilder builder) { ConfigureDeleteServicePolicyFromApim(builder); builder.Services.TryAddSingleton(GetDeleteServicePolicy); } private static DeleteServicePolicy GetDeleteServicePolicy(IServiceProvider provider) { var deleteFromApim = provider.GetRequiredService<DeleteServicePolicyFromApim>(); var activitySource = provider.GetRequiredService<ActivitySource>(); return async (name, cancellationToken) => { using var _ = activitySource.StartActivity(nameof(DeleteServicePolicy)) ?.AddTag("service_policy.name", name); await deleteFromApim(name, cancellationToken); }; } private static void ConfigureDeleteServicePolicyFromApim(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceUri(builder); AzureModule.ConfigureHttpPipeline(builder); builder.Services.TryAddSingleton(GetDeleteServicePolicyFromApim); } private static DeleteServicePolicyFromApim GetDeleteServicePolicyFromApim(IServiceProvider provider) { var serviceUri = provider.GetRequiredService<ManagementServiceUri>(); var pipeline = provider.GetRequiredService<HttpPipeline>(); var logger = provider.GetRequiredService<ILogger>(); return async (name, cancellationToken) => { logger.LogInformation("Deleting service policy {ServicePolicyName}...", name); await ServicePolicyUri.From(name, serviceUri) .Delete(pipeline, cancellationToken); }; } }