in src/dsc/Commands/Connect/ConnectCommand.cs [94:233]
public override void Configure(CommandLineApplication app)
{
this._command = app;
this._command.ShowInHelpText = true;
this._command.AllowArgumentSeparator = true;
base.ConfigureHelp(
description: "Redirect traffic from a service, deployment or pod running in your cluster to your local machine.",
extendedHelpText: @"
Additional Arguments
Any arguments passed following the argument separator ""--"" will be interpreted as a command to execute in the Bridge
environment. This can be used to connect to Kubernetes and start a service in one command line invocation.
Example:
dsc connect --service my-service --local-port 8000 --routing me -y -- dotnet watch --project MyService.API
");
base.Configure(app);
var localPortOption = _cliCommandOptionFactory.CreateConnectLocalPortOption();
var updateScriptOption = _cliCommandOptionFactory.CreateConnectUpdateScriptOption();
var envOption = _cliCommandOptionFactory.CreateConnectEnvOption();
var waitPpidOption = _cliCommandOptionFactory.CreateParentProcessIdOption();
var controlPortOption = _cliCommandOptionFactory.CreateControlPortOption();
var elevationRequestsOption = _cliCommandOptionFactory.CreateConnectElevationRequestsOptions();
var routingOption = _cliCommandOptionFactory.CreateConnectRoutingHeaderOption();
var useKubernetesServiceEnvironmentVariablesOption = _cliCommandOptionFactory.CreateUseKubernetesServiceEnvironmentVariablesOption();
var runContainerizedOption = _cliCommandOptionFactory.CreateRunContainerizedOption();
var yesOption = _cliCommandOptionFactory.CreateYesOption();
var routingManagerFeatureFlagsOption = _cliCommandOptionFactory.CreateRoutingManagerFeatureFlagOption();
this._command.Options.Add(localPortOption);
this._command.Options.Add(updateScriptOption);
this._command.Options.Add(envOption);
this._command.Options.Add(waitPpidOption);
this._command.Options.Add(controlPortOption);
this._command.Options.Add(elevationRequestsOption);
this._command.Options.Add(routingOption);
this._command.Options.Add(useKubernetesServiceEnvironmentVariablesOption);
this._command.Options.Add(runContainerizedOption);
this._command.Options.Add(yesOption);
this._command.Options.Add(routingManagerFeatureFlagsOption);
this._command.OnExecute(() =>
{
try
{
this.ParseTargetOptions();
}
catch (Exception ex)
{
_out.Error(ex.Message);
this._command.ShowHelp();
return 1;
}
if (localPortOption.HasValue())
{
try
{
_localPorts = localPortOption.Values.Select(s => int.Parse(s)).ToArray();
if (_localPorts.Any(s => s < 0 || s >= 65536))
{
throw new InvalidUsageException(_operationContext, string.Format(Resources.Error_InvalidPort, localPortOption.Template));
}
}
catch (FormatException ex)
{
_out.Error(string.Format(Resources.Error_IncorrectOption, CommandConstants.Options.ConnectLocalPort.Option, ex.Message));
this._command.ShowHelp();
return 1;
}
}
if (updateScriptOption.HasValue())
{
_updateScript = updateScriptOption.Value();
}
if (envOption.HasValue())
{
_envJsonPath = envOption.Value();
}
if (waitPpidOption.HasValue())
{
if (int.TryParse(waitPpidOption.Value(), out var pid) && pid > 0)
{
try
{
_waitProcesses.Add(Process.GetProcessById(pid));
}
catch (Exception ex)
{
throw new InvalidUsageException(_operationContext, string.Format(Resources.Error_FailedToGetProcess, pid, ex.Message));
}
}
}
if (controlPortOption.HasValue())
{
if (!int.TryParse(controlPortOption.Value(), out _controlPort) || _controlPort <= 0 || _controlPort >= 65536)
{
throw new InvalidUsageException(_operationContext, string.Format(Resources.Error_InvalidPort, controlPortOption.Template));
}
}
if (elevationRequestsOption.HasValue())
{
try
{
var jsonElevationRequests = elevationRequestsOption.Value();
var elevationRequestsData = JsonHelpers.DeserializeObjectCaseInsensitive<IEnumerable<ElevationRequestData>>(jsonElevationRequests);
this._elevationRequests = elevationRequestsData.Select(erd => erd.ConvertToElevationRequest()).ToList();
}
catch (Exception)
{
throw new InvalidUsageException(_operationContext, string.Format(Resources.Error_InvalidElevationRequestsValue, elevationRequestsOption.Template));
}
}
this._operationContext.LoggingProperties[LoggingConstants.Property.IsRoutingEnabled] = routingOption.HasValue();
if (routingOption.HasValue())
{
try
{
KubernetesUtilities.IsValidRoutingValue(routingOption.Value());
this._routingHeaderValue = routingOption.Value();
}
catch (Exception e)
{
throw new InvalidUsageException(_operationContext, e.Message);
}
}
if (routingManagerFeatureFlagsOption.HasValue())
{
_routingManagerFeatureFlags = routingManagerFeatureFlagsOption.Values;
}
this._useKubernetesServiceEnvironmentVariables = useKubernetesServiceEnvironmentVariablesOption.HasValue();
this._yesFlag = yesOption.HasValue();
this._runContainerized = runContainerizedOption.HasValue();
this.SetCommand();
return 0;
});
}