tools/code/publisher/WorkspaceDiagnostic.cs (200 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 PutWorkspaceDiagnostics(CancellationToken cancellationToken);
public delegate Option<(DiagnosticName Name, WorkspaceName WorkspaceName)> TryParseWorkspaceDiagnosticName(FileInfo file);
public delegate bool IsWorkspaceDiagnosticNameInSourceControl(DiagnosticName name, WorkspaceName workspaceName);
public delegate ValueTask PutWorkspaceDiagnostic(DiagnosticName name, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask<Option<WorkspaceDiagnosticDto>> FindWorkspaceDiagnosticDto(DiagnosticName name, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask PutWorkspaceDiagnosticInApim(DiagnosticName name, WorkspaceDiagnosticDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask DeleteWorkspaceDiagnostics(CancellationToken cancellationToken);
public delegate ValueTask DeleteWorkspaceDiagnostic(DiagnosticName name, WorkspaceName workspaceName, CancellationToken cancellationToken);
public delegate ValueTask DeleteWorkspaceDiagnosticFromApim(DiagnosticName name, WorkspaceName workspaceName, CancellationToken cancellationToken);
internal static class WorkspaceDiagnosticModule
{
public static void ConfigurePutWorkspaceDiagnostics(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetPublisherFiles(builder);
ConfigureTryWorkspaceParseDiagnosticName(builder);
ConfigureIsWorkspaceDiagnosticNameInSourceControl(builder);
ConfigurePutWorkspaceDiagnostic(builder);
builder.Services.TryAddSingleton(GetPutWorkspaceDiagnostics);
}
private static PutWorkspaceDiagnostics GetPutWorkspaceDiagnostics(IServiceProvider provider)
{
var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>();
var tryParseName = provider.GetRequiredService<TryParseWorkspaceDiagnosticName>();
var isNameInSourceControl = provider.GetRequiredService<IsWorkspaceDiagnosticNameInSourceControl>();
var put = provider.GetRequiredService<PutWorkspaceDiagnostic>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async cancellationToken =>
{
using var _ = activitySource.StartActivity(nameof(PutWorkspaceDiagnostics));
logger.LogInformation("Putting workspace diagnostics...");
await getPublisherFiles()
.Choose(tryParseName.Invoke)
.Where(diagnostic => isNameInSourceControl(diagnostic.Name, diagnostic.WorkspaceName))
.Distinct()
.IterParallel(put.Invoke, cancellationToken);
};
}
private static void ConfigureTryWorkspaceParseDiagnosticName(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetTryParseWorkspaceDiagnosticName);
}
private static TryParseWorkspaceDiagnosticName GetTryParseWorkspaceDiagnosticName(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
return file => from informationFile in WorkspaceDiagnosticInformationFile.TryParse(file, serviceDirectory)
select (informationFile.Parent.Name, informationFile.Parent.Parent.Parent.Name);
}
private static void ConfigureIsWorkspaceDiagnosticNameInSourceControl(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetArtifactFiles(builder);
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetIsDiagnosticNameInSourceControl);
}
private static IsWorkspaceDiagnosticNameInSourceControl GetIsDiagnosticNameInSourceControl(IServiceProvider provider)
{
var getArtifactFiles = provider.GetRequiredService<GetArtifactFiles>();
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
return doesInformationFileExist;
bool doesInformationFileExist(DiagnosticName name, WorkspaceName workspaceName)
{
var artifactFiles = getArtifactFiles();
var diagnosticFile = WorkspaceDiagnosticInformationFile.From(name, workspaceName, serviceDirectory);
return artifactFiles.Contains(diagnosticFile.ToFileInfo());
}
}
private static void ConfigurePutWorkspaceDiagnostic(IHostApplicationBuilder builder)
{
ConfigureFindWorkspaceDiagnosticDto(builder);
ConfigurePutWorkspaceDiagnosticInApim(builder);
builder.Services.TryAddSingleton(GetPutWorkspaceDiagnostic);
}
private static PutWorkspaceDiagnostic GetPutWorkspaceDiagnostic(IServiceProvider provider)
{
var findDto = provider.GetRequiredService<FindWorkspaceDiagnosticDto>();
var putInApim = provider.GetRequiredService<PutWorkspaceDiagnosticInApim>();
var activitySource = provider.GetRequiredService<ActivitySource>();
return async (name, workspaceName, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(PutWorkspaceDiagnostic))
?.AddTag("workspace_diagnostic.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 ConfigureFindWorkspaceDiagnosticDto(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
CommonModule.ConfigureTryGetFileContents(builder);
builder.Services.TryAddSingleton(GetFindWorkspaceDiagnosticDto);
}
private static FindWorkspaceDiagnosticDto GetFindWorkspaceDiagnosticDto(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var tryGetFileContents = provider.GetRequiredService<TryGetFileContents>();
return async (name, workspaceName, cancellationToken) =>
{
var informationFile = WorkspaceDiagnosticInformationFile.From(name, workspaceName, serviceDirectory);
var contentsOption = await tryGetFileContents(informationFile.ToFileInfo(), cancellationToken);
return from contents in contentsOption
select contents.ToObjectFromJson<WorkspaceDiagnosticDto>();
};
}
private static void ConfigurePutWorkspaceDiagnosticInApim(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetPutWorkspaceDiagnosticInApim);
}
private static PutWorkspaceDiagnosticInApim GetPutWorkspaceDiagnosticInApim(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("Adding diagnostic {DiagnosticName} to workspace {WorkspaceName}...", name, workspaceName);
await WorkspaceDiagnosticUri.From(name, workspaceName, serviceUri)
.PutDto(dto, pipeline, cancellationToken);
};
}
public static void ConfigureDeleteWorkspaceDiagnostics(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetPublisherFiles(builder);
ConfigureTryWorkspaceParseDiagnosticName(builder);
ConfigureIsWorkspaceDiagnosticNameInSourceControl(builder);
ConfigureDeleteWorkspaceDiagnostic(builder);
builder.Services.TryAddSingleton(GetDeleteWorkspaceDiagnostics);
}
private static DeleteWorkspaceDiagnostics GetDeleteWorkspaceDiagnostics(IServiceProvider provider)
{
var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>();
var tryParseName = provider.GetRequiredService<TryParseWorkspaceDiagnosticName>();
var isNameInSourceControl = provider.GetRequiredService<IsWorkspaceDiagnosticNameInSourceControl>();
var delete = provider.GetRequiredService<DeleteWorkspaceDiagnostic>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async cancellationToken =>
{
using var _ = activitySource.StartActivity(nameof(DeleteWorkspaceDiagnostics));
logger.LogInformation("Deleting workspace diagnostics...");
await getPublisherFiles()
.Choose(tryParseName.Invoke)
.Where(diagnostic => isNameInSourceControl(diagnostic.Name, diagnostic.WorkspaceName) is false)
.Distinct()
.IterParallel(delete.Invoke, cancellationToken);
};
}
private static void ConfigureDeleteWorkspaceDiagnostic(IHostApplicationBuilder builder)
{
ConfigureDeleteWorkspaceDiagnosticFromApim(builder);
builder.Services.TryAddSingleton(GetDeleteWorkspaceDiagnostic);
}
private static DeleteWorkspaceDiagnostic GetDeleteWorkspaceDiagnostic(IServiceProvider provider)
{
var deleteFromApim = provider.GetRequiredService<DeleteWorkspaceDiagnosticFromApim>();
var activitySource = provider.GetRequiredService<ActivitySource>();
return async (name, workspaceName, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(DeleteWorkspaceDiagnostic))
?.AddTag("workspace_diagnostic.name", name)
?.AddTag("workspace.name", workspaceName);
await deleteFromApim(name, workspaceName, cancellationToken);
};
}
private static void ConfigureDeleteWorkspaceDiagnosticFromApim(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetDeleteWorkspaceDiagnosticFromApim);
}
private static DeleteWorkspaceDiagnosticFromApim GetDeleteWorkspaceDiagnosticFromApim(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, workspaceName, cancellationToken) =>
{
logger.LogInformation("Removing diagnostic {DiagnosticName} from workspace {WorkspaceName}...", name, workspaceName);
await WorkspaceDiagnosticUri.From(name, workspaceName, serviceUri)
.Delete(pipeline, cancellationToken);
};
}
}