Skip to content

Commit

Permalink
Creates new options
Browse files Browse the repository at this point in the history
  • Loading branch information
MrHinsh committed Aug 28, 2024
1 parent cd3dc28 commit d11381c
Show file tree
Hide file tree
Showing 7 changed files with 244 additions and 213 deletions.
12 changes: 6 additions & 6 deletions docs/Reference/Generated/MigrationTools.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
},
"init Options-Reference": {
"commandName": "Project",
"commandLineArgs": "init --options Reference -c configuration-ref.json"
"commandLineArgs": "init --options Reference -c configuration-ref.json --overwrite"
},
"Upgrade": {
"commandName": "Project",
Expand Down
118 changes: 28 additions & 90 deletions src/MigrationTools.Host/Commands/InitMigrationCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Elmah.Io.Client;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
Expand All @@ -21,15 +22,19 @@ namespace MigrationTools.Host.Commands
{
internal class InitMigrationCommand : AsyncCommand<InitMigrationCommandSettings>
{
public IServiceProvider Services { get; }

private readonly ILogger _logger;
private readonly ITelemetryLogger Telemetery;
private readonly IHostApplicationLifetime _appLifetime;

public InitMigrationCommand(
IServiceProvider services,
ILogger<InitMigrationCommand> logger,
ITelemetryLogger telemetryLogger,
IHostApplicationLifetime appLifetime)
{
Services = services;
_logger = logger;
Telemetery = telemetryLogger;
_appLifetime = appLifetime;
Expand Down Expand Up @@ -66,72 +71,45 @@ public override async Task<int> ExecuteAsync(CommandContext context, InitMigrati
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
// get source IOptions bits
List<Type> allMigrationTypes = AppDomain.CurrentDomain.GetMigrationToolsTypes().ToList();
var allOptions = allMigrationTypes.WithInterface<IOptions>();
JObject configJson = new JObject();

_logger.LogInformation("Populating config with {Options}", settings.Options.ToString());
List<string> optionsToInclude = null;
Dictionary<string, string> endpointsToInclude = null;

OptionsConfigurationBuilder optionsBuilder = Services.GetService<OptionsConfigurationBuilder>();

switch (settings.Options)
{
case OptionsMode.Reference:

optionsBuilder.AddAllOptions();
break;
case OptionsMode.Basic:
optionsToInclude = new List<string>() { "TfsWorkItemMigrationProcessor", "FieldMappingTool", "FieldLiteralMap" };
endpointsToInclude = new Dictionary<string, string> () { { "Source", "TfsTeamProjectEndpoint" }, { "Target", "TfsTeamProjectEndpoint" } };
optionsBuilder.AddOption("TfsWorkItemMigrationProcessor");
optionsBuilder.AddOption("FieldMappingTool");
optionsBuilder.AddOption("FieldLiteralMap");
optionsBuilder.AddOption("TfsTeamProjectEndpoint", "Source");
optionsBuilder.AddOption("TfsTeamProjectEndpoint", "Target");
break;
case OptionsMode.WorkItemTracking:
optionsToInclude = new List<string>() { "TfsWorkItemMigrationProcessor", "FieldMappingTool", "FieldLiteralMap" };
endpointsToInclude = new Dictionary<string, string>() { { "Source", "TfsTeamProjectEndpoint" }, { "Target", "TfsTeamProjectEndpoint" } };
optionsBuilder.AddOption("TfsWorkItemMigrationProcessor");
optionsBuilder.AddOption("FieldMappingTool");
optionsBuilder.AddOption("FieldLiteralMap");
optionsBuilder.AddOption("TfsTeamProjectEndpoint", "Source");
optionsBuilder.AddOption("TfsTeamProjectEndpoint", "Target");
break;
case OptionsMode.PipelineProcessor:
optionsBuilder.AddOption("AzureDevOpsPipelineProcessor");
optionsBuilder.AddOption("AzureDevOpsEndpoint", "Source");
optionsBuilder.AddOption("AzureDevOpsEndpoint", "Target");
break;
case OptionsMode.PipelineProcessor:
default:
optionsToInclude = new List<string>() { "AzureDevOpsPipelineProcessor"};
endpointsToInclude = new Dictionary<string, string>() { { "Source", "AzureDevOpsEndpoint" }, { "Target", "AzureDevOpsEndpoint" } };
optionsBuilder.AddAllOptions();
break;
}

if (endpointsToInclude !=null)
{
foreach (var item in endpointsToInclude)
{
var item2 = allOptions.WithInterface<IEndpointOptions>().FirstOrDefault(x => x.Name.StartsWith(item.Value));
configJson = AddEndpointOptionToConfig(configuration, configJson, item.Key, item2);
}
} else
{
_logger.LogWarning($"You are adding all of the EndPoints, there may be some that cant be added and will cause an error...");
int epNo = 1;
foreach (var item in allOptions.WithInterface<IEndpointOptions>())
{
configJson = AddEndpointOptionToConfig(configuration, configJson, $"Endpoint{epNo}", item);
epNo++;
}
}
string json = optionsBuilder.Build();

if (optionsToInclude != null)
{
foreach (var item in optionsToInclude)
{
var item2 = allOptions.FirstOrDefault(x => x.Name.StartsWith(item));
configJson = AddOptionToConfig(configuration, configJson, item2);
}
} else
{
_logger.LogWarning($"You are adding all of the Options, there may be some that cant be added and will cause an error...");
foreach (var item in allOptions)
{
configJson = AddOptionToConfig(configuration, configJson, item);
}
}


File.WriteAllText(configFile, configJson.ToString(Formatting.Indented));
File.WriteAllText(configFile, json);
_logger.LogInformation("New {configFile} file has been created", configFile);
_logger.LogInformation(configJson.ToString(Formatting.Indented));
_logger.LogInformation(json);

}
_exitCode = 0;
Expand All @@ -149,45 +127,5 @@ public override async Task<int> ExecuteAsync(CommandContext context, InitMigrati
}
return _exitCode;
}

private JObject AddEndpointOptionToConfig(IConfigurationRoot configuration, JObject configJson, string key, Type endpointType)
{
IOptions instanceOfOption = (IOptions)Activator.CreateInstance(endpointType);
var section = configuration.GetSection(instanceOfOption.ConfigurationMetadata.PathToInstance);
section.Bind(instanceOfOption);
try
{
//instanceOfOption.ConfigurationMetadata.Path = $"MigrationTools:Endpoints:{key}";
var hardPath = $"MigrationTools:Endpoints:{key}";
configJson = Options.OptionsManager.AddOptionsToConfiguration(configJson, instanceOfOption, hardPath, true);
_logger.LogInformation("Adding Option: {item}", endpointType.Name);
}
catch (Exception)
{

_logger.LogInformation("FAILED!! Adding Option: {item}", endpointType.FullName);
}

return configJson;
}

private JObject AddOptionToConfig(IConfigurationRoot configuration, JObject configJson, Type item)
{
IOptions instanceOfOption = (IOptions)Activator.CreateInstance(item);
var section = configuration.GetSection(instanceOfOption.ConfigurationMetadata.PathToInstance);
section.Bind(instanceOfOption);
try
{
configJson = Options.OptionsManager.AddOptionsToConfiguration(configJson, instanceOfOption, false);
_logger.LogInformation("Adding Option: {item}", item.Name);
}
catch (Exception)
{

_logger.LogInformation("FAILED!! Adding Option: {item}", item.FullName);
}

return configJson;
}
}
}
2 changes: 2 additions & 0 deletions src/MigrationTools.Host/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MigrationTools.Options;

namespace MigrationTools
{
Expand All @@ -12,6 +13,7 @@ public static IServiceCollection AddConfiguredService(this IServiceCollection co
//collection.Configure
//collection.Configure<GreetingServiceOptions>(config);
//return collection.AddTransient<IGreetingService, GreetingService>();

return collection;
}
}
Expand Down
116 changes: 0 additions & 116 deletions src/MigrationTools/Options/OptionsBuilder.cs

This file was deleted.

Loading

0 comments on commit d11381c

Please sign in to comment.