Skip to content

Commit 00728f0

Browse files
Copilotdavidfowl
andauthored
Improve parameter resolution logging and exception handling in ParameterProcessor (#10320)
* Initial plan * Implement improved parameter resolution logging and exception handling Co-authored-by: davidfowl <[email protected]> --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: davidfowl <[email protected]>
1 parent 0df566a commit 00728f0

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

src/Aspire.Hosting/Orchestrator/ParameterProcessor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ await notificationService.PublishUpdateAsync(parameterResource, s =>
8686
_unresolvedParameters.Add(parameterResource);
8787

8888
loggerService.GetLogger(parameterResource)
89-
.LogWarning(ex, "Parameter resource {ResourceName} could not be initialized. Waiting for user input.", parameterResource.Name);
89+
.LogWarning("Parameter resource {ResourceName} could not be initialized. Waiting for user input.", parameterResource.Name);
9090
}
9191
else
9292
{
@@ -199,6 +199,10 @@ await notificationService.PublishUpdateAsync(parameter, s =>
199199
})
200200
.ConfigureAwait(false);
201201

202+
// Log that the parameter has been resolved
203+
loggerService.GetLogger(parameter)
204+
.LogInformation("Parameter resource {ResourceName} has been resolved via user interaction.", parameter.Name);
205+
202206
// Persist the parameter value to user secrets if requested.
203207
if (bool.TryParse(saveParameters.Value, out var saveToSecrets) && saveToSecrets)
204208
{

tests/Aspire.Hosting.Tests/Orchestrator/ParameterProcessorTests.cs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,100 @@ public async Task InitializeParametersAsync_WithEmptyParameterList_CompletesSucc
297297
await parameterProcessor.InitializeParametersAsync([]);
298298
}
299299

300+
[Fact]
301+
public async Task InitializeParametersAsync_WithMissingParameterValue_LogsWarningWithoutException()
302+
{
303+
// Arrange
304+
var loggerService = ConsoleLoggingTestHelpers.GetResourceLoggerService();
305+
var interactionService = CreateInteractionService();
306+
var parameterProcessor = CreateParameterProcessor(
307+
loggerService: loggerService,
308+
interactionService: interactionService);
309+
var parameterWithMissingValue = CreateParameterWithMissingValue("missingParam");
310+
311+
// Set up log watching
312+
var logsTask = ConsoleLoggingTestHelpers.WatchForLogsAsync(loggerService, 1, parameterWithMissingValue);
313+
314+
// Act
315+
await parameterProcessor.InitializeParametersAsync([parameterWithMissingValue]);
316+
317+
// Wait for logs to be written
318+
var logs = await logsTask.WaitAsync(TimeSpan.FromSeconds(5));
319+
320+
// Assert - Should log warning without exception details
321+
Assert.Single(logs);
322+
var logEntry = logs[0];
323+
Assert.Contains("Parameter resource missingParam could not be initialized. Waiting for user input.", logEntry.Content);
324+
Assert.False(logEntry.IsErrorMessage);
325+
}
326+
327+
[Fact]
328+
public async Task InitializeParametersAsync_WithNonMissingParameterException_LogsErrorWithException()
329+
{
330+
// Arrange
331+
var loggerService = ConsoleLoggingTestHelpers.GetResourceLoggerService();
332+
var parameterProcessor = CreateParameterProcessor(loggerService: loggerService);
333+
var parameterWithError = CreateParameterWithGenericError("errorParam");
334+
335+
// Set up log watching
336+
var logsTask = ConsoleLoggingTestHelpers.WatchForLogsAsync(loggerService, 1, parameterWithError);
337+
338+
// Act
339+
await parameterProcessor.InitializeParametersAsync([parameterWithError]);
340+
341+
// Wait for logs to be written
342+
var logs = await logsTask.WaitAsync(TimeSpan.FromSeconds(5));
343+
344+
// Assert - Should log error message
345+
Assert.Single(logs);
346+
var logEntry = logs[0];
347+
Assert.Contains("Failed to initialize parameter resource errorParam.", logEntry.Content);
348+
Assert.True(logEntry.IsErrorMessage);
349+
}
350+
351+
[Fact]
352+
public async Task HandleUnresolvedParametersAsync_WithResolvedParameter_LogsResolutionViaInteraction()
353+
{
354+
// Arrange
355+
var loggerService = ConsoleLoggingTestHelpers.GetResourceLoggerService();
356+
var testInteractionService = new TestInteractionService();
357+
var notificationService = ResourceNotificationServiceTestHelpers.Create();
358+
var parameterProcessor = CreateParameterProcessor(
359+
notificationService: notificationService,
360+
loggerService: loggerService,
361+
interactionService: testInteractionService);
362+
var parameter = CreateParameterWithMissingValue("testParam");
363+
364+
parameter.WaitForValueTcs = new TaskCompletionSource<string>(TaskCreationOptions.RunContinuationsAsynchronously);
365+
366+
// Set up log watching
367+
var logsTask = ConsoleLoggingTestHelpers.WatchForLogsAsync(loggerService, 1, parameter);
368+
369+
// Act - Start handling unresolved parameters
370+
var handleTask = parameterProcessor.HandleUnresolvedParametersAsync([parameter]);
371+
372+
// Wait for the message bar interaction
373+
var messageBarInteraction = await testInteractionService.Interactions.Reader.ReadAsync();
374+
messageBarInteraction.CompletionTcs.SetResult(InteractionResultFactory.Ok(true));
375+
376+
// Wait for the inputs interaction
377+
var inputsInteraction = await testInteractionService.Interactions.Reader.ReadAsync();
378+
inputsInteraction.Inputs[0].SetValue("testValue");
379+
inputsInteraction.CompletionTcs.SetResult(InteractionResultFactory.Ok(inputsInteraction.Inputs));
380+
381+
// Wait for the handle task to complete
382+
await handleTask;
383+
384+
// Wait for logs to be written
385+
var logs = await logsTask.WaitAsync(TimeSpan.FromSeconds(5));
386+
387+
// Assert - Should log that parameter was resolved via user interaction
388+
Assert.Single(logs);
389+
var logEntry = logs[0];
390+
Assert.Contains("Parameter resource testParam has been resolved via user interaction.", logEntry.Content);
391+
Assert.False(logEntry.IsErrorMessage);
392+
}
393+
300394
private static ParameterProcessor CreateParameterProcessor(
301395
ResourceNotificationService? notificationService = null,
302396
ResourceLoggerService? loggerService = null,

0 commit comments

Comments
 (0)