tools/code/extractor/ApiOperationPolicy.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 ExtractApiOperationPolicies(ApiOperationName apiOperationName, ApiName apiName, CancellationToken cancellationToken);
public delegate IAsyncEnumerable<(ApiOperationPolicyName Name, ApiOperationPolicyDto Dto)> ListApiOperationPolicies(ApiOperationName apiOperationName, ApiName apiName, CancellationToken cancellationToken);
public delegate ValueTask WriteApiOperationPolicyArtifacts(ApiOperationPolicyName name, ApiOperationPolicyDto dto, ApiOperationName apiOperationName, ApiName apiName, CancellationToken cancellationToken);
public delegate ValueTask WriteApiOperationPolicyFile(ApiOperationPolicyName name, ApiOperationPolicyDto dto, ApiOperationName apiOperationName, ApiName apiName, CancellationToken cancellationToken);
internal static class ApiOperationPolicyModule
{
public static void ConfigureExtractApiOperationPolicies(IHostApplicationBuilder builder)
{
ConfigureListApiOperationPolicies(builder);
ConfigureWriteApiOperationPolicyArtifacts(builder);
builder.Services.TryAddSingleton(GetExtractApiOperationPolicies);
}
private static ExtractApiOperationPolicies GetExtractApiOperationPolicies(IServiceProvider provider)
{
var list = provider.GetRequiredService<ListApiOperationPolicies>();
var writeArtifacts = provider.GetRequiredService<WriteApiOperationPolicyArtifacts>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async (operationName, apiName, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(ExtractApiOperationPolicies));
logger.LogInformation("Extracting policies for operation {ApiOperationName} in API {ApiName}...", operationName, apiName);
await list(operationName, apiName, cancellationToken)
.IterParallel(async policy => await writeArtifacts(policy.Name, policy.Dto, operationName, apiName, cancellationToken),
cancellationToken);
};
}
private static void ConfigureListApiOperationPolicies(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetListApiOperationPolicies);
}
private static ListApiOperationPolicies GetListApiOperationPolicies(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
return (operationName, apiName, cancellationToken) =>
ApiOperationPoliciesUri.From(operationName, apiName, serviceUri)
.List(pipeline, cancellationToken);
}
private static void ConfigureWriteApiOperationPolicyArtifacts(IHostApplicationBuilder builder)
{
ConfigureWriteApiOperationPolicyFile(builder);
builder.Services.TryAddSingleton(GetWriteApiOperationPolicyArtifacts);
}
private static WriteApiOperationPolicyArtifacts GetWriteApiOperationPolicyArtifacts(IServiceProvider provider)
{
var writePolicyFile = provider.GetRequiredService<WriteApiOperationPolicyFile>();
return async (name, dto, operationName, apiName, cancellationToken) =>
await writePolicyFile(name, dto, operationName, apiName, cancellationToken);
}
private static void ConfigureWriteApiOperationPolicyFile(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetWriteApiOperationPolicyFile);
}
private static WriteApiOperationPolicyFile GetWriteApiOperationPolicyFile(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, dto, operationName, apiName, cancellationToken) =>
{
var policyFile = ApiOperationPolicyFile.From(name, operationName, apiName, serviceDirectory);
logger.LogInformation("Writing API operation policy file {ApiOperationPolicyFile}...", policyFile);
var policy = dto.Properties.Value ?? string.Empty;
await policyFile.WritePolicy(policy, cancellationToken);
};
}
}