tools/code/extractor/ServicePolicy.cs (83 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 ExtractServicePolicies(CancellationToken cancellationToken);
public delegate IAsyncEnumerable<(ServicePolicyName Name, ServicePolicyDto Dto)> ListServicePolicies(CancellationToken cancellationToken);
public delegate ValueTask WriteServicePolicyArtifacts(ServicePolicyName name, ServicePolicyDto dto, CancellationToken cancellationToken);
public delegate ValueTask WriteServicePolicyFile(ServicePolicyName name, ServicePolicyDto dto, CancellationToken cancellationToken);
internal static class ServicePolicyModule
{
public static void ConfigureExtractServicePolicies(IHostApplicationBuilder builder)
{
ConfigureListServicePolicies(builder);
ConfigureWriteServicePolicyArtifacts(builder);
builder.Services.TryAddSingleton(GetExtractServicePolicies);
}
private static ExtractServicePolicies GetExtractServicePolicies(IServiceProvider provider)
{
var list = provider.GetRequiredService<ListServicePolicies>();
var writeArtifacts = provider.GetRequiredService<WriteServicePolicyArtifacts>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async cancellationToken =>
{
using var _ = activitySource.StartActivity(nameof(ExtractServicePolicies));
logger.LogInformation("Extracting service policies...");
await list(cancellationToken)
.IterParallel(async servicepolicy => await writeArtifacts(servicepolicy.Name, servicepolicy.Dto, cancellationToken),
cancellationToken);
};
}
private static void ConfigureListServicePolicies(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetListServicePolicies);
}
private static ListServicePolicies GetListServicePolicies(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
return cancellationToken =>
ServicePoliciesUri.From(serviceUri)
.List(pipeline, cancellationToken);
}
private static void ConfigureWriteServicePolicyArtifacts(IHostApplicationBuilder builder)
{
ConfigureWriteServicePolicyFile(builder);
builder.Services.TryAddSingleton(GetWriteServicePolicyArtifacts);
}
private static WriteServicePolicyArtifacts GetWriteServicePolicyArtifacts(IServiceProvider provider)
{
var writePolicyFile = provider.GetRequiredService<WriteServicePolicyFile>();
return async (ServicePolicyName name, ServicePolicyDto dto, CancellationToken cancellationToken) =>
{
await writePolicyFile(name, dto, cancellationToken);
};
}
private static void ConfigureWriteServicePolicyFile(IHostApplicationBuilder builder)
{
builder.Services.TryAddSingleton(GetWriteServicePolicyFile);
}
private static WriteServicePolicyFile GetWriteServicePolicyFile(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var logger = provider.GetRequiredService<ILogger>();
return async (ServicePolicyName name, ServicePolicyDto dto, CancellationToken cancellationToken) =>
{
var policyFile = ServicePolicyFile.From(name, serviceDirectory);
logger.LogInformation("Writing service policy file {ServicePolicyFile}...", policyFile);
var policy = dto.Properties.Value ?? string.Empty;
await policyFile.WritePolicy(policy, cancellationToken);
};
}
}