tools/code/publisher/WorkspacePolicy.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 PutWorkspacePolicies(CancellationToken cancellationToken);
public delegate Option<(WorkspacePolicyName Name, WorkspaceName WorkspaceName)> TryParseWorkspacePolicyName(FileInfo file);
public delegate bool IsWorkspacePolicyNameInSourceControl(WorkspacePolicyName name, WorkspaceName workspaceName);
public delegate ValueTask PutWorkspacePolicy(WorkspacePolicyName name, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask<Option<WorkspacePolicyDto>> FindWorkspacePolicyDto(WorkspacePolicyName name, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask PutWorkspacePolicyInApim(WorkspacePolicyName name, WorkspacePolicyDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask DeleteWorkspacePolicies(CancellationToken cancellationToken);
public delegate ValueTask DeleteWorkspacePolicy(WorkspacePolicyName name, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask DeleteWorkspacePolicyFromApim(WorkspacePolicyName name, WorkspaceName workspaceName, CancellationToken cancellationToken);
internal static class WorkspacePolicyModule
{
public static void ConfigurePutWorkspacePolicies(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetPublisherFiles(builder);
ConfigureTryParseWorkspacePolicyName(builder);
ConfigureIsWorkspacePolicyNameInSourceControl(builder);
ConfigurePutWorkspacePolicy(builder);
builder.Services.TryAddSingleton(GetPutWorkspacePolicies);
}
private static PutWorkspacePolicies GetPutWorkspacePolicies(IServiceProvider provider)
{
var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>();
var tryParseName = provider.GetRequiredService<TryParseWorkspacePolicyName>();
var isNameInSourceControl = provider.GetRequiredService<IsWorkspacePolicyNameInSourceControl>();
var put = provider.GetRequiredService<PutWorkspacePolicy>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async cancellationToken =>
{
using var _ = activitySource.StartActivity(nameof(PutWorkspacePolicies));
logger.LogInformation("Putting workspace policies...");
await getPublisherFiles()
.Choose(tryParseName.Invoke)
.Where(policy => isNameInSourceControl(policy.Name, policy.WorkspaceName))
.Distinct()
.IterParallel(put.Invoke, cancellationToken);
};
}
private static void ConfigureTryParseWorkspacePolicyName(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetTryParseWorkspacePolicyName);
}
private static TryParseWorkspacePolicyName GetTryParseWorkspacePolicyName(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
return file => from policyFile in WorkspacePolicyFile.TryParse(file, serviceDirectory)
select (policyFile.Name, policyFile.Parent.Name);
}
private static void ConfigureIsWorkspacePolicyNameInSourceControl(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetArtifactFiles(builder);
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetIsWorkspacePolicyNameInSourceControl);
}
private static IsWorkspacePolicyNameInSourceControl GetIsWorkspacePolicyNameInSourceControl(IServiceProvider provider)
{
var getArtifactFiles = provider.GetRequiredService<GetArtifactFiles>();
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
return doesPolicyFileExist;
bool doesPolicyFileExist(WorkspacePolicyName name, WorkspaceName workspaceName)
{
var artifactFiles = getArtifactFiles();
var policyFile = WorkspacePolicyFile.From(name, workspaceName, serviceDirectory);
return artifactFiles.Contains(policyFile.ToFileInfo());
}
}
private static void ConfigurePutWorkspacePolicy(IHostApplicationBuilder builder)
{
ConfigureFindWorkspacePolicyDto(builder);
ConfigurePutWorkspacePolicyInApim(builder);
builder.Services.TryAddSingleton(GetPutWorkspacePolicy);
}
private static PutWorkspacePolicy GetPutWorkspacePolicy(IServiceProvider provider)
{
var findDto = provider.GetRequiredService<FindWorkspacePolicyDto>();
var putInApim = provider.GetRequiredService<PutWorkspacePolicyInApim>();
var activitySource = provider.GetRequiredService<ActivitySource>();
return async (name, workspaceName, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(PutWorkspacePolicy))
?.AddTag("workspace_policy.name", name)
?.AddTag("workspace.name", workspaceName);
var dtoOption = await findDto(name, workspaceName, cancellationToken);
await dtoOption.IterTask(async dto => await putInApim(name, dto, workspaceName, cancellationToken));
};
}
private static void ConfigureFindWorkspacePolicyDto(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
CommonModule.ConfigureTryGetFileContents(builder);
builder.Services.TryAddSingleton(GetFindWorkspacePolicyDto);
}
private static FindWorkspacePolicyDto GetFindWorkspacePolicyDto(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var tryGetFileContents = provider.GetRequiredService<TryGetFileContents>();
return async (name, workspaceName, cancellationToken) =>
{
var contentsOption = await tryGetPolicyContents(name, workspaceName, cancellationToken);
return from contents in contentsOption
select new WorkspacePolicyDto
{
Properties = new WorkspacePolicyDto.WorkspacePolicyContract
{
Format = "rawxml",
Value = contents.ToString()
}
};
};
async ValueTask<Option<BinaryData>> tryGetPolicyContents(WorkspacePolicyName name, WorkspaceName workspaceName, CancellationToken cancellationToken)
{
var policyFile = WorkspacePolicyFile.From(name, workspaceName, serviceDirectory);
return await tryGetFileContents(policyFile.ToFileInfo(), cancellationToken);
}
}
private static void ConfigurePutWorkspacePolicyInApim(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetPutWorkspacePolicyInApim);
}
private static PutWorkspacePolicyInApim GetPutWorkspacePolicyInApim(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, dto, workspaceName, cancellationToken) =>
{
logger.LogInformation("Putting policy {WorkspacePolicyName} for workspace {WorkspaceName}...", name, workspaceName);
await WorkspacePolicyUri.From(name, workspaceName, serviceUri)
.PutDto(dto, pipeline, cancellationToken);
};
}
public static void ConfigureDeleteWorkspacePolicies(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetPublisherFiles(builder);
ConfigureTryParseWorkspacePolicyName(builder);
ConfigureIsWorkspacePolicyNameInSourceControl(builder);
ConfigureDeleteWorkspacePolicy(builder);
builder.Services.TryAddSingleton(GetDeleteWorkspacePolicies);
}
private static DeleteWorkspacePolicies GetDeleteWorkspacePolicies(IServiceProvider provider)
{
var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>();
var tryParseName = provider.GetRequiredService<TryParseWorkspacePolicyName>();
var isNameInSourceControl = provider.GetRequiredService<IsWorkspacePolicyNameInSourceControl>();
var delete = provider.GetRequiredService<DeleteWorkspacePolicy>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async cancellationToken =>
{
using var _ = activitySource.StartActivity(nameof(DeleteWorkspacePolicies));
logger.LogInformation("Deleting workspace policies...");
await getPublisherFiles()
.Choose(tryParseName.Invoke)
.Where(policy => isNameInSourceControl(policy.Name, policy.WorkspaceName) is false)
.Distinct()
.IterParallel(delete.Invoke, cancellationToken);
};
}
private static void ConfigureDeleteWorkspacePolicy(IHostApplicationBuilder builder)
{
ConfigureDeleteWorkspacePolicyFromApim(builder);
builder.Services.TryAddSingleton(GetDeleteWorkspacePolicy);
}
private static DeleteWorkspacePolicy GetDeleteWorkspacePolicy(IServiceProvider provider)
{
var deleteFromApim = provider.GetRequiredService<DeleteWorkspacePolicyFromApim>();
var activitySource = provider.GetRequiredService<ActivitySource>();
return async (name, workspaceName, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(DeleteWorkspacePolicy))
?.AddTag("workspace_policy.name", name)
?.AddTag("workspace.name", workspaceName);
await deleteFromApim(name, workspaceName, cancellationToken);
};
}
private static void ConfigureDeleteWorkspacePolicyFromApim(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetDeleteWorkspacePolicyFromApim);
}
private static DeleteWorkspacePolicyFromApim GetDeleteWorkspacePolicyFromApim(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, workspaceName, cancellationToken) =>
{
logger.LogInformation("Deleting policy {WorkspacePolicyName} from workspace {WorkspaceName}...", name, workspaceName);
await WorkspacePolicyUri.From(name, workspaceName, serviceUri)
.Delete(pipeline, cancellationToken);
};
}
}