tools/code/extractor/WorkspacePolicyFragment.cs (106 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 ExtractWorkspacePolicyFragments(WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate IAsyncEnumerable<(PolicyFragmentName Name, WorkspacePolicyFragmentDto Dto)> ListWorkspacePolicyFragments(WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask WriteWorkspacePolicyFragmentArtifacts(PolicyFragmentName name, WorkspacePolicyFragmentDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask WriteWorkspacePolicyFragmentInformationFile(PolicyFragmentName name, WorkspacePolicyFragmentDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask WriteWorkspacePolicyFragmentPolicyFile(PolicyFragmentName name, WorkspacePolicyFragmentDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken);
internal static class WorkspacePolicyFragmentModule
{
public static void ConfigureExtractWorkspacePolicyFragments(IHostApplicationBuilder builder)
{
ConfigureListWorkspacePolicyFragments(builder);
ConfigureWriteWorkspacePolicyFragmentArtifacts(builder);
ConfigureWriteWorkspacePolicyFragmentArtifacts(builder);
builder.Services.TryAddSingleton(GetExtractWorkspacePolicyFragments);
}
private static ExtractWorkspacePolicyFragments GetExtractWorkspacePolicyFragments(IServiceProvider provider)
{
var list = provider.GetRequiredService<ListWorkspacePolicyFragments>();
var writeArtifacts = provider.GetRequiredService<WriteWorkspacePolicyFragmentArtifacts>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async (workspaceName, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(ExtractWorkspacePolicyFragments));
logger.LogInformation("Extracting policy fragments for workspace {WorkspaceName}...", workspaceName);
await list(workspaceName, cancellationToken)
.IterParallel(async policyFragment => await writeArtifacts(policyFragment.Name, policyFragment.Dto, workspaceName, cancellationToken),
cancellationToken);
};
}
private static void ConfigureListWorkspacePolicyFragments(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetListWorkspacePolicyFragments);
}
private static ListWorkspacePolicyFragments GetListWorkspacePolicyFragments(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
return (workspaceName, cancellationToken) =>
WorkspacePolicyFragmentsUri.From(workspaceName, serviceUri)
.List(pipeline, cancellationToken);
}
private static void ConfigureWriteWorkspacePolicyFragmentArtifacts(IHostApplicationBuilder builder)
{
ConfigureWriteWorkspacePolicyFragmentInformationFile(builder);
ConfigureWriteWorkspacePolicyFragmentPolicyFile(builder);
builder.Services.TryAddSingleton(GetWriteWorkspacePolicyFragmentArtifacts);
}
private static WriteWorkspacePolicyFragmentArtifacts GetWriteWorkspacePolicyFragmentArtifacts(IServiceProvider provider)
{
var writeInformationFile = provider.GetRequiredService<WriteWorkspacePolicyFragmentInformationFile>();
var writePolicyFile = provider.GetRequiredService<WriteWorkspacePolicyFragmentPolicyFile>();
return async (name, dto, workspaceName, cancellationToken) =>
{
await writeInformationFile(name, dto, workspaceName, cancellationToken);
await writePolicyFile(name, dto, workspaceName, cancellationToken);
};
}
private static void ConfigureWriteWorkspacePolicyFragmentInformationFile(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetWriteWorkspacePolicyFragmentInformationFile);
}
private static WriteWorkspacePolicyFragmentInformationFile GetWriteWorkspacePolicyFragmentInformationFile(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, dto, workspaceName, cancellationToken) =>
{
var informationFile = WorkspacePolicyFragmentInformationFile.From(name, workspaceName, serviceDirectory);
logger.LogInformation("Writing workspace policy fragment information file {WorkspacePolicyFragmentInformationFile}...", informationFile);
// Remove policy contents from DTO, as these will be written to the policy file
var updatedDto = dto with { Properties = dto.Properties with { Format = null, Value = null } };
await informationFile.WriteDto(updatedDto, cancellationToken);
};
}
private static void ConfigureWriteWorkspacePolicyFragmentPolicyFile(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetWriteWorkspacePolicyFragmentPolicyFile);
}
private static WriteWorkspacePolicyFragmentPolicyFile GetWriteWorkspacePolicyFragmentPolicyFile(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, dto, workspaceName, cancellationToken) =>
{
var policyFile = WorkspacePolicyFragmentPolicyFile.From(name, workspaceName, serviceDirectory);
logger.LogInformation("Writing workspace policy fragment policy file {WorkspacePolicyFragmentPolicyFile}...", policyFile);
var policy = dto.Properties.Value ?? string.Empty;
await policyFile.WritePolicy(policy, cancellationToken);
};
}
}