Skip to content

Commit 668e4c6

Browse files
committed
Fix PassThroughOptions mapping
1 parent fd7cb5c commit 668e4c6

File tree

5 files changed

+65
-20
lines changed

5 files changed

+65
-20
lines changed

src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
<Compile Include="..\..\Tools\dotnet-monitor\CollectionRules\Options\Triggers\EventMeterOptions.cs" Link="Options\CollectionRules\Triggers\EventMeterOptions.cs" />
7272
<Compile Include="..\..\Tools\dotnet-monitor\CollectionRules\Options\Triggers\IAspNetActionPathFilters.cs" Link="Options\CollectionRules\Triggers\IAspNetActionPathFilters.cs" />
7373
<Compile Include="..\..\Tools\dotnet-monitor\CollectionRules\Options\Triggers\TriggerOptionsConstants.cs" Link="Options\CollectionRules\Triggers\TriggerOptionsConstants.cs" />
74-
<Compile Include="..\..\Tools\dotnet-monitor\CommonOptionsExtensions.cs" Link="Options\CommonOptionsExtensions.cs" />
74+
<Compile Include="..\..\Tools\dotnet-monitor\CommonOptionsMapper.cs" Link="Options\CommonOptionsMapper.cs" />
7575
<Compile Include="..\..\Tools\dotnet-monitor\LoggingEventIds.cs" Link="LoggingEventIds.cs" />
7676
<Compile Include="..\..\Tools\dotnet-monitor\OutputFormat.cs" Link="Options\OutputFormat.cs" />
7777
<Compile Include="..\..\Tools\dotnet-monitor\RootOptions.cs" Link="Options\RootOptions.cs" />

src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/Runners/MonitorRunner.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ public virtual async Task StartAsync(string command, string[] args, Cancellation
165165
_adapter.Environment.Add("ASPNETCORE_HOSTINGSTARTUPASSEMBLIES", TestHostingStartupAssemblyName);
166166

167167
// Set configuration via environment variables
168-
var configurationViaEnvironment = ConfigurationFromEnvironment.ToEnvironmentConfiguration(useDotnetMonitorPrefix: true);
168+
var optionsMapper = new CommonOptionsMapper();
169+
var configurationViaEnvironment = optionsMapper.ToEnvironmentConfiguration(ConfigurationFromEnvironment, useDotnetMonitorPrefix: true);
169170
if (configurationViaEnvironment.Count > 0)
170171
{
171172
// Set additional environment variables from configuration
@@ -197,7 +198,8 @@ protected virtual void StandardOutputCallback(string line)
197198

198199
public void WriteKeyPerValueConfiguration(RootOptions options)
199200
{
200-
foreach (KeyValuePair<string, string> entry in options.ToKeyPerFileConfiguration())
201+
CommonOptionsMapper optionsMapper = new();
202+
foreach (KeyValuePair<string, string> entry in optionsMapper.ToKeyPerFileConfiguration(options))
201203
{
202204
File.WriteAllText(
203205
Path.Combine(SharedConfigDirectoryPath, entry.Key),

src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTestCommon/TestHostHelper.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Microsoft.Extensions.Logging;
1111
using System;
1212
using System.Collections.Generic;
13+
using System.Globalization;
1314
using System.Threading.Tasks;
1415
using Xunit.Abstractions;
1516

@@ -73,7 +74,9 @@ public static IHost CreateHost(
7374
RootOptions options = new();
7475
setup(options);
7576

76-
IDictionary<string, string> configurationValues = options.ToConfigurationValues();
77+
CommonOptionsMapper optionsMapper = new();
78+
optionsMapper.AddActionSettings<PassThroughOptions>(nameof(PassThroughAction), MapPassThroughOptions);
79+
IDictionary<string, string> configurationValues = optionsMapper.ToConfigurationValues(options);
7780
outputHelper.WriteLine("Begin Configuration:");
7881
foreach ((string key, string value) in configurationValues)
7982
{
@@ -128,5 +131,21 @@ public static IHost CreateHost(
128131
})
129132
.Build();
130133
}
134+
135+
private static void MapPassThroughOptions(PassThroughOptions obj, string valueName, string separator, IDictionary<string, string> map)
136+
{
137+
if (null != obj)
138+
{
139+
string prefix = FormattableString.Invariant($"{valueName}{separator}");
140+
MapString(obj.Input1, FormattableString.Invariant($"{prefix}{nameof(obj.Input1)}"));
141+
MapString(obj.Input2, FormattableString.Invariant($"{prefix}{nameof(obj.Input2)}"));
142+
MapString(obj.Input3, FormattableString.Invariant($"{prefix}{nameof(obj.Input3)}"));
143+
}
144+
145+
void MapString(string value, string valueName)
146+
{
147+
map.Add(valueName, ConvertUtils.ToString(value, CultureInfo.InvariantCulture));
148+
}
149+
}
131150
}
132151
}

src/Tools/dotnet-monitor/Commands/GenerateApiKeyCommandHandler.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ public static void Invoke(OutputFormat output, TimeSpan expiration, TextWriter o
6868
{
6969
// Create configuration from object model.
7070
MemoryConfigurationSource source = new();
71-
source.InitialData = (IDictionary<string, string?>)opts.ToConfigurationValues(); // Cast the values as nullable, since they are reference types we can safely do this.
71+
CommonOptionsMapper optionsMapper = new();
72+
source.InitialData = (IDictionary<string, string?>)optionsMapper.ToConfigurationValues(opts); // Cast the values as nullable, since they are reference types we can safely do this.
7273
ConfigurationBuilder builder = new();
7374
builder.Add(source);
7475
IConfigurationRoot configuration = builder.Build();
@@ -100,11 +101,14 @@ public static void Invoke(OutputFormat output, TimeSpan expiration, TextWriter o
100101
case OutputFormat.Cmd:
101102
case OutputFormat.PowerShell:
102103
case OutputFormat.Shell:
103-
IDictionary<string, string> optList = opts.ToEnvironmentConfiguration();
104-
foreach ((string name, string value) in optList)
105104
{
106-
outputBldr.AppendFormat(CultureInfo.InvariantCulture, GetFormatString(output), name, value);
107-
outputBldr.AppendLine();
105+
CommonOptionsMapper optionsMapper = new();
106+
IDictionary<string, string> optList = optionsMapper.ToEnvironmentConfiguration(opts);
107+
foreach ((string name, string value) in optList)
108+
{
109+
outputBldr.AppendFormat(CultureInfo.InvariantCulture, GetFormatString(output), name, value);
110+
outputBldr.AppendLine();
111+
}
108112
}
109113
break;
110114
}

src/Tools/dotnet-monitor/CommonOptionsExtensions.cs renamed to src/Tools/dotnet-monitor/CommonOptionsMapper.cs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
namespace Microsoft.Diagnostics.Tools.Monitor
2222
{
23-
internal static class CommonOptionsExtensions
23+
internal class CommonOptionsMapper
2424
{
2525
private const string KeySegmentSeparator = "__";
2626

@@ -30,7 +30,7 @@ internal static class CommonOptionsExtensions
3030
/// <remarks>
3131
/// Each key is the configuration path; each value is the configuration path value.
3232
/// </remarks>
33-
public static IDictionary<string, string> ToConfigurationValues(this RootOptions options)
33+
public IDictionary<string, string> ToConfigurationValues(RootOptions options)
3434
{
3535
Dictionary<string, string> variables = new(StringComparer.OrdinalIgnoreCase);
3636
MapRootOptions(options, string.Empty, ConfigurationPath.KeyDelimiter, variables);
@@ -43,7 +43,7 @@ public static IDictionary<string, string> ToConfigurationValues(this RootOptions
4343
/// <remarks>
4444
/// Each key is the variable name; each value is the variable value.
4545
/// </remarks>
46-
public static IDictionary<string, string> ToEnvironmentConfiguration(this RootOptions options, bool useDotnetMonitorPrefix = false)
46+
public IDictionary<string, string> ToEnvironmentConfiguration(RootOptions options, bool useDotnetMonitorPrefix = false)
4747
{
4848
Dictionary<string, string> variables = new(StringComparer.OrdinalIgnoreCase);
4949
MapRootOptions(options, useDotnetMonitorPrefix ? ToolIdentifiers.StandardPrefix : string.Empty, KeySegmentSeparator, variables);
@@ -56,7 +56,7 @@ public static IDictionary<string, string> ToEnvironmentConfiguration(this RootOp
5656
/// <remarks>
5757
/// Each key is the file name; each value is the file content.
5858
/// </remarks>
59-
public static IDictionary<string, string> ToKeyPerFileConfiguration(this RootOptions options)
59+
public IDictionary<string, string> ToKeyPerFileConfiguration(RootOptions options)
6060
{
6161
Dictionary<string, string> variables = new(StringComparer.OrdinalIgnoreCase);
6262
MapRootOptions(options, string.Empty, KeySegmentSeparator, variables);
@@ -97,7 +97,7 @@ public static IDictionary<string, string> ToKeyPerFileConfiguration(this RootOpt
9797
// }
9898
// }
9999

100-
private static void MapRootOptions(RootOptions obj, string prefix, string separator, IDictionary<string, string> map)
100+
private void MapRootOptions(RootOptions obj, string prefix, string separator, IDictionary<string, string> map)
101101
{
102102
// TODO: in Tests, it has an additional property. Weird.
103103
MapAuthenticationOptions(obj.Authentication, FormattableString.Invariant($"{prefix}{nameof(obj.Authentication)}"), separator, map);
@@ -134,7 +134,7 @@ private static void MapRootOptions(RootOptions obj, string prefix, string separa
134134
// }
135135
// }
136136

137-
private static void MapDictionary_String_CollectionRuleOptions(IDictionary<string, CollectionRuleOptions>? obj, string valueName, string separator, IDictionary<string, string> map)
137+
private void MapDictionary_String_CollectionRuleOptions(IDictionary<string, CollectionRuleOptions>? obj, string valueName, string separator, IDictionary<string, string> map)
138138
{
139139
if (null != obj)
140140
{
@@ -147,7 +147,7 @@ private static void MapDictionary_String_CollectionRuleOptions(IDictionary<strin
147147
}
148148
}
149149

150-
private static void MapCollectionRuleOptions(CollectionRuleOptions obj, string valueName, string separator, IDictionary<string, string> map)
150+
private void MapCollectionRuleOptions(CollectionRuleOptions obj, string valueName, string separator, IDictionary<string, string> map)
151151
{
152152
string prefix = FormattableString.Invariant($"{valueName}{separator}");
153153
// MapFilters(obj.Filters, FormattableString.Invariant($"{prefix}{nameof(obj.Filters)}"), separator, map);
@@ -156,7 +156,7 @@ private static void MapCollectionRuleOptions(CollectionRuleOptions obj, string v
156156
// MapLimits(obj.Limits, FormattableString.Invariant($"{prefix}{nameof(obj.Limits)}"), separator, map);
157157
}
158158

159-
private static void MapActions(List<CollectionRuleActionOptions> obj, string valueName, string separator, IDictionary<string, string> map)
159+
private void MapActions(List<CollectionRuleActionOptions> obj, string valueName, string separator, IDictionary<string, string> map)
160160
{
161161
string prefix = FormattableString.Invariant($"{valueName}{separator}");
162162
for (int index = 0; index < obj.Count; index++)
@@ -166,7 +166,7 @@ private static void MapActions(List<CollectionRuleActionOptions> obj, string val
166166
}
167167
}
168168

169-
private static void MapCollectionRuleActionOptions(CollectionRuleActionOptions obj, string valueName, string separator, IDictionary<string, string> map)
169+
private void MapCollectionRuleActionOptions(CollectionRuleActionOptions obj, string valueName, string separator, IDictionary<string, string> map)
170170
{
171171
string prefix = FormattableString.Invariant($"{valueName}{separator}");
172172
MapString(obj.Name, FormattableString.Invariant($"{prefix}{nameof(obj.Name)}"), map);
@@ -175,10 +175,21 @@ private static void MapCollectionRuleActionOptions(CollectionRuleActionOptions o
175175
MapBool(obj.WaitForCompletion, FormattableString.Invariant($"{prefix}{nameof(obj.WaitForCompletion)}"), map);
176176
}
177177

178-
private static void MapCollectionRuleActionOptions_Settings(string type, object? settings, string valueName, string separator, IDictionary<string, string> map)
178+
private Dictionary<string, Action<object, string, string, IDictionary<string, string>>>? _actionSettingsMap;
179+
180+
public void AddActionSettings<TSettings>(string type, Action<TSettings, string, string, IDictionary<string, string>> mapAction)
181+
{
182+
(_actionSettingsMap ??= new()).Add(type, (obj, valueName, separator, map) =>
183+
{
184+
mapAction((TSettings)obj, valueName, separator, map);
185+
});
186+
}
187+
188+
private void MapCollectionRuleActionOptions_Settings(string type, object? settings, string valueName, string separator, IDictionary<string, string> map)
179189
{
180190
if (null != settings)
181191
{
192+
// TODO: inline the well-known ones to avoid a dictionary lookup.
182193
switch (type)
183194
{
184195
case KnownCollectionRuleActions.CollectDump:
@@ -206,6 +217,7 @@ private static void MapCollectionRuleActionOptions_Settings(string type, object?
206217
// MapExecuteOptions(settings as ExecuteOptions, valueName, separator, map);
207218
// break;
208219
// case KnownCollectionRuleActions.LoadProfiler:
220+
209221
// MapLoadProfilerOptions(settings as LoadProfilerOptions, valueName, separator, map);
210222
// break;
211223
// case KnownCollectionRuleActions.SetEnvironmentVariable:
@@ -215,7 +227,15 @@ private static void MapCollectionRuleActionOptions_Settings(string type, object?
215227
// MapGetEnvironmentVariableOptions(settings as GetEnvironmentVariableOptions, valueName, separator, map);
216228
// break;
217229
default:
218-
throw new NotSupportedException($"Unknown action type: {type}");
230+
if (_actionSettingsMap?.TryGetValue(type, out Action<object, string, string, IDictionary<string, string>>? mapAction) == true)
231+
{
232+
mapAction(settings, valueName, separator, map);
233+
}
234+
else
235+
{
236+
throw new NotSupportedException($"Unknown action type: {type}");
237+
}
238+
break;
219239
}
220240
}
221241
}

0 commit comments

Comments
 (0)