Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,62 +1,71 @@
namespace ServiceControl.Connector.MassTransit.Host.Commands;

using System.CommandLine;
using System.CommandLine.Parsing;

public static class ConnectorCommandOptions
{
static Option<string> ConnectionString { get; } = new(
"--connection-string",
"The connection string for the transport. Can also be set via CONNECTION_STRING environment variable.");
static Option<string> ConnectionString { get; } = new("--connection-string")
{
Description = "The connection string for the transport. Can also be set via CONNECTION_STRING environment variable."
};

static Option<string> TransportType { get; } = new(
"--transport-type",
"The transport type (AzureServiceBus, AzureServiceBusWithDeadLetter, RabbitMQ, AmazonSQS). Can also be set via TRANSPORT_TYPE environment variable.");
static Option<string> TransportType { get; } = new("--transport-type")
{
Description = "The transport type (AzureServiceBus, AzureServiceBusWithDeadLetter, RabbitMQ, AmazonSQS). Can also be set via TRANSPORT_TYPE environment variable."
};

static Option<string> QueuesFile { get; } = new(
"--queues-file",
"Path to the file containing the list of queues to monitor. Can also be set via QUEUES_FILE environment variable.");
static Option<string> QueuesFile { get; } = new("--queues-file")
{
Description = "Path to the file containing the list of queues to monitor. Can also be set via QUEUES_FILE environment variable."
};

static Option<string> ReturnQueue { get; } = new(
"--return-queue",
"The return queue name. Defaults to 'Particular.ServiceControl.Connector.MassTransit_return'. Can also be set via RETURN_QUEUE environment variable.");
static Option<string> ReturnQueue { get; } = new("--return-queue")
{
Description = "The return queue name. Defaults to 'Particular.ServiceControl.Connector.MassTransit_return'. Can also be set via RETURN_QUEUE environment variable."
};

static Option<string> ErrorQueue { get; } = new(
"--error-queue",
"The error queue name. Defaults to 'error'. Can also be set via ERROR_QUEUE environment variable.");
static Option<string> ErrorQueue { get; } = new("--error-queue")
{
Description = "The error queue name. Defaults to 'error'. Can also be set via ERROR_QUEUE environment variable."
};

static Option<string> ServiceControlQueue { get; } = new(
"--servicecontrol-queue",
"The ServiceControl queue name. Defaults to 'Particular.ServiceControl'. Can also be set via SERVICECONTROL_QUEUE environment variable.");
static Option<string> ServiceControlQueue { get; } = new("--servicecontrol-queue")
{
Description = "The ServiceControl queue name. Defaults to 'Particular.ServiceControl'. Can also be set via SERVICECONTROL_QUEUE environment variable."
};

static Option<string> RabbitMqManagementApiUrl { get; } = new(
"--rabbitmq-management-api-url",
"The RabbitMQ management API URL (required for RabbitMQ transport). Can also be set via RABBITMQ_MANAGEMENT_API_URL environment variable.");
static Option<string> RabbitMqManagementApiUrl { get; } = new("--rabbitmq-management-api-url")
{
Description = "The RabbitMQ management API URL (required for RabbitMQ transport). Can also be set via RABBITMQ_MANAGEMENT_API_URL environment variable."
};

static Option<string> RabbitMqManagementApiUsername { get; } = new(
"--rabbitmq-management-api-username",
"The RabbitMQ management API username. Can also be set via RABBITMQ_MANAGEMENT_API_USERNAME environment variable.");
static Option<string> RabbitMqManagementApiUsername { get; } = new("--rabbitmq-management-api-username")
{
Description = "The RabbitMQ management API username. Can also be set via RABBITMQ_MANAGEMENT_API_USERNAME environment variable."
};

static Option<string> RabbitMqManagementApiPassword { get; } = new(
"--rabbitmq-management-api-password",
"The RabbitMQ management API password. Can also be set via RABBITMQ_MANAGEMENT_API_PASSWORD environment variable.");
static Option<string> RabbitMqManagementApiPassword { get; } = new("--rabbitmq-management-api-password")
{
Description = "The RabbitMQ management API password. Can also be set via RABBITMQ_MANAGEMENT_API_PASSWORD environment variable."
};

static Option<string> RabbitMqQueueType { get; } = new(
"--rabbitmq-queue-type",
"The RabbitMQ queue type (Classic or Quorum). Defaults to Quorum. Can also be set via RABBITMQ_QUEUE_TYPE environment variable.");
static Option<string> RabbitMqQueueType { get; } = new("--rabbitmq-queue-type")
{
Description = "The RabbitMQ queue type (Classic or Quorum). Defaults to Quorum. Can also be set via RABBITMQ_QUEUE_TYPE environment variable."
};

public static void AddConnectorOptions(this Command command)
{
command.AddOption(ConnectionString);
command.AddOption(TransportType);
command.AddOption(QueuesFile);
command.AddOption(ReturnQueue);
command.AddOption(ErrorQueue);
command.AddOption(ServiceControlQueue);
command.AddOption(RabbitMqManagementApiUrl);
command.AddOption(RabbitMqManagementApiUsername);
command.AddOption(RabbitMqManagementApiPassword);
command.AddOption(RabbitMqQueueType);
command.Add(ConnectionString);
command.Add(TransportType);
command.Add(QueuesFile);
command.Add(ReturnQueue);
command.Add(ErrorQueue);
command.Add(ServiceControlQueue);
command.Add(RabbitMqManagementApiUrl);
command.Add(RabbitMqManagementApiUsername);
command.Add(RabbitMqManagementApiPassword);
command.Add(RabbitMqQueueType);
}

public static string[] BuildArgs(ParseResult parseResult)
Expand All @@ -80,16 +89,16 @@ void AddArgIfExplicit(Option<string> option, string configKey)
{
// Only forward options that the user explicitly provided on the command line.
// Omitting defaults lets environment variables take effect through normal config precedence.
if (parseResult.FindResultFor(option) == null)
var token = parseResult.GetValue(option);
if (token == null)
{
return;
}

var value = parseResult.GetValueForOption(option);
if (!string.IsNullOrEmpty(value))
if (!string.IsNullOrEmpty(token))
{
args.Add($"--{configKey}={value}");
args.Add($"--{configKey}={token}");
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
namespace ServiceControl.Connector.MassTransit.Host.Commands;

using System.CommandLine;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

Expand All @@ -11,22 +10,20 @@ public HealthCheckCommand() : base("health-check", "Performs a validation that t
{
this.AddConnectorOptions();

this.SetHandler(async context =>
SetAction(async (parseResult, cancellationToken) =>
{
var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);

context.ExitCode = await InternalHandler(connectorArgs, context.GetCancellationToken());
return await InternalHandler(connectorArgs, cancellationToken);
});
}

async Task<int> InternalHandler(string[] connectorArgs, CancellationToken cancellationToken)
{
var builder = Host.CreateEmptyApplicationBuilder(null);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(connectorArgs);
var builder = Host.CreateApplicationBuilder(connectorArgs);
builder.UseMassTransitConnector(true);

var host = builder.Build();
using var host = builder.Build();

var queueInformationProvider = host.Services.GetRequiredService<IHealthCheckerProvider>();
var (success, errorMessage) = await queueInformationProvider.TryCheck(cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,37 @@ namespace ServiceControl.Connector.MassTransit.Host.Commands;

using System.CommandLine;
using System.Text.RegularExpressions;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class QueuesCommand : Command
{
public QueuesCommand() : base("queues-list", "List queues")
{
var filterOption = new Option<string>("--filter", () => ".*_error$", "Use a regex to filter queues by name.");
AddOption(filterOption);
var filterOption = new Option<string>("--filter")
{
DefaultValueFactory = _ => ".*_error$",
Description = "Use a regex to filter queues by name.",
};
Add(filterOption);

this.AddConnectorOptions();

this.SetHandler(async context =>
SetAction(async (parseResult, cancellationToken) =>
{
var filter = context.ParseResult.GetValueForOption(filterOption);
var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
var filter = parseResult.GetValue(filterOption);
var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);

context.ExitCode = await InternalHandler(filter!, connectorArgs, context.GetCancellationToken());
return await InternalHandler(filter!, connectorArgs, cancellationToken);
});
}

async Task<int> InternalHandler(string filter, string[] connectorArgs, CancellationToken cancellationToken)
{
var builder = Host.CreateEmptyApplicationBuilder(null);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(connectorArgs);
var builder = Host.CreateApplicationBuilder(connectorArgs);
builder.UseMassTransitConnector(true);

var host = builder.Build();
using var host = builder.Build();

var queueInformationProvider = host.Services.GetRequiredService<IQueueInformationProvider>();
var queues = queueInformationProvider.GetQueues(cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,30 @@ public class StartupCommand : RootCommand
{
public StartupCommand(string[] args) : base("Particular Software ServiceControl Masstransit Connector")
{
var consoleOption = new Option<bool>(
"--console",
"Run in console mode.");
consoleOption.AddAlias("-c");

var runModeOption = new Option<RunMode>(
"--run-mode",
() => RunMode.SetupAndRun,
"Mode to run in.")
{ Arity = ArgumentArity.ExactlyOne };

AddOption(consoleOption);
AddOption(runModeOption);
this.AddConnectorOptions();
var consoleOption = new Option<bool>("--console")
{
Aliases = { "-c" },
Description = "Run in console mode."
};

var runModeOption = new Option<RunMode>("--run-mode")
{
Description = "Mode to run in.",
Arity = ArgumentArity.ExactlyOne,
DefaultValueFactory = _ => RunMode.SetupAndRun,
};

Add(consoleOption);
Add(runModeOption);

this.SetHandler(async context =>
this.AddConnectorOptions();
SetAction(async (parseResult, cancellationToken) =>
{
var isConsole = context.ParseResult.GetValueForOption(consoleOption);
var runMode = context.ParseResult.GetValueForOption(runModeOption);
var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
var isConsole = parseResult.GetValue(consoleOption);
var runMode = parseResult.GetValue(runModeOption);
var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);

context.ExitCode = await InternalHandler(runMode, isConsole, connectorArgs, context.GetCancellationToken());
return await InternalHandler(runMode, isConsole, connectorArgs, cancellationToken);
});
}

Expand Down
25 changes: 7 additions & 18 deletions src/ServiceControl.Connector.MassTransit.Host/Program.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,10 @@
using System.CommandLine.Builder;
using System.CommandLine.Parsing;
using ServiceControl.Connector.MassTransit.Host.Commands;

var startupCommand = new StartupCommand(args);
StartupCommand startupCommand = new(args)
{
new QueuesCommand(),
new HealthCheckCommand()
};

startupCommand.AddCommand(new QueuesCommand());
startupCommand.AddCommand(new HealthCheckCommand());

var commandLineBuilder = new CommandLineBuilder(startupCommand);

commandLineBuilder
.UseVersionOption()
.UseHelp()
.UseTypoCorrections()
.UseParseErrorReporting()
.UseExceptionHandler()
.CancelOnProcessTermination();

var parser = commandLineBuilder.Build();
return await parser.InvokeAsync(args);
var exitCode = await startupCommand.Parse(args).InvokeAsync();
return exitCode;
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.14" />
<PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="9.0.14" />
<PackageReference Include="NServiceBus.Extensions.Logging" Version="3.0.1" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageReference Include="System.CommandLine" Version="2.0.4" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading