tools/code/extractor/Workspace.cs (108 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.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace extractor;
public delegate ValueTask ExtractWorkspaces(CancellationToken cancellationToken);
public delegate IAsyncEnumerable<(WorkspaceName Name, WorkspaceDto Dto)> ListWorkspaces(CancellationToken cancellationToken);
internal static class WorkspaceModule
{
public static void ConfigureExtractWorkspaces(IHostApplicationBuilder builder)
{
ConfigureListWorkspaces(builder);
WorkspaceNamedValueModule.ConfigureExtractWorkspaceNamedValues(builder);
WorkspaceBackendModule.ConfigureExtractWorkspaceBackends(builder);
WorkspaceTagModule.ConfigureExtractWorkspaceTags(builder);
WorkspaceVersionSetModule.ConfigureExtractWorkspaceVersionSets(builder);
WorkspaceLoggerModule.ConfigureExtractWorkspaceLoggers(builder);
WorkspaceDiagnosticModule.ConfigureExtractWorkspaceDiagnostics(builder);
WorkspacePolicyFragmentModule.ConfigureExtractWorkspacePolicyFragments(builder);
WorkspacePolicyModule.ConfigureExtractWorkspacePolicies(builder);
WorkspaceProductModule.ConfigureExtractWorkspaceProducts(builder);
WorkspaceGroupModule.ConfigureExtractWorkspaceGroups(builder);
WorkspaceApiModule.ConfigureExtractWorkspaceApis(builder);
WorkspaceSubscriptionModule.ConfigureExtractWorkspaceSubscriptions(builder);
builder.Services.TryAddSingleton(GetExtractWorkspaces);
}
private static ExtractWorkspaces GetExtractWorkspaces(IServiceProvider provider)
{
var list = provider.GetRequiredService<ListWorkspaces>();
var extractWorkspaceNamedValues = provider.GetRequiredService<ExtractWorkspaceNamedValues>();
var extractWorkspaceBackends = provider.GetRequiredService<ExtractWorkspaceBackends>();
var extractWorkspaceTags = provider.GetRequiredService<ExtractWorkspaceTags>();
var extractWorkspaceVersionSets = provider.GetRequiredService<ExtractWorkspaceVersionSets>();
var extractWorkspaceLoggers = provider.GetRequiredService<ExtractWorkspaceLoggers>();
var extractWorkspaceDiagnostics = provider.GetRequiredService<ExtractWorkspaceDiagnostics>();
var extractWorkspacePolicyFragments = provider.GetRequiredService<ExtractWorkspacePolicyFragments>();
var extractWorkspacePolicies = provider.GetRequiredService<ExtractWorkspacePolicies>();
var extractWorkspaceProducts = provider.GetRequiredService<ExtractWorkspaceProducts>();
var extractWorkspaceGroups = provider.GetRequiredService<ExtractWorkspaceGroups>();
var extractWorkspaceApis = provider.GetRequiredService<ExtractWorkspaceApis>();
var extractWorkspaceSubscriptions = provider.GetRequiredService<ExtractWorkspaceSubscriptions>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async cancellationToken =>
{
using var _ = activitySource.StartActivity(nameof(ExtractWorkspaces));
logger.LogInformation("Extracting workspaces...");
await list(cancellationToken)
.IterParallel(async workspace => await extractWorkspace(workspace.Name, workspace.Dto, cancellationToken),
cancellationToken);
};
async ValueTask extractWorkspace(WorkspaceName name, WorkspaceDto dto, CancellationToken cancellationToken)
{
await extractWorkspaceNamedValues(name, cancellationToken);
await extractWorkspaceBackends(name, cancellationToken);
await extractWorkspaceTags(name, cancellationToken);
await extractWorkspaceVersionSets(name, cancellationToken);
await extractWorkspaceLoggers(name, cancellationToken);
await extractWorkspaceDiagnostics(name, cancellationToken);
await extractWorkspacePolicyFragments(name, cancellationToken);
await extractWorkspacePolicies(name, cancellationToken);
await extractWorkspaceProducts(name, cancellationToken);
await extractWorkspaceGroups(name, cancellationToken);
await extractWorkspaceApis(name, cancellationToken);
await extractWorkspaceSubscriptions(name, cancellationToken);
}
}
private static void ConfigureListWorkspaces(IHostApplicationBuilder builder)
{
ConfigurationModule.ConfigureFindConfigurationNamesFactory(builder);
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetListWorkspaces);
}
private static ListWorkspaces GetListWorkspaces(IServiceProvider provider)
{
var findConfigurationNamesFactory = provider.GetRequiredService<FindConfigurationNamesFactory>();
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
var findConfigurationNames = findConfigurationNamesFactory.Create<WorkspaceName>();
return cancellationToken =>
findConfigurationNames()
.Map(names => listFromSet(names, cancellationToken))
.IfNone(() => listAll(cancellationToken));
IAsyncEnumerable<(WorkspaceName, WorkspaceDto)> listFromSet(IEnumerable<WorkspaceName> names, CancellationToken cancellationToken) =>
names.Select(name => WorkspaceUri.From(name, serviceUri))
.ToAsyncEnumerable()
.Choose(async uri =>
{
var dtoOption = await uri.TryGetDto(pipeline, cancellationToken);
return dtoOption.Map(dto => (uri.Name, dto));
});
IAsyncEnumerable<(WorkspaceName, WorkspaceDto)> listAll(CancellationToken cancellationToken)
{
var workspacesUri = WorkspacesUri.From(serviceUri);
return workspacesUri.List(pipeline, cancellationToken);
}
}
}