Skip to content

Commit 8fd92af

Browse files
authored
Fix console page not matching resource for non-running resources (#8917)
1 parent c109722 commit 8fd92af

File tree

5 files changed

+61
-36
lines changed

5 files changed

+61
-36
lines changed

src/Aspire.Dashboard/Components/Controls/ResourceSelectOptionTemplate.razor

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515
}
1616
else if (ViewModel.Id?.Type is OtlpApplicationType.Instance)
1717
{
18-
<div style="width: 20px;"></div>
19-
<span aria-label="@string.Format(@Loc[nameof(ControlsStrings.ResourceDropdownReplicaAccessibleTitle)], ViewModel.Name, ViewModel.Id.ReplicaSetName)">@ViewModel.Name</span>
18+
<span style="padding-left: 20px;" aria-label="@string.Format(@Loc[nameof(ControlsStrings.ResourceDropdownReplicaAccessibleTitle)], ViewModel.Name, ViewModel.Id.ReplicaSetName)">@ViewModel.Name</span>
2019
}
2120
else
2221
{

src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -726,9 +726,8 @@ public string GetUrlFromSerializableViewModel(ConsoleLogsPageState serializable)
726726

727727
public ConsoleLogsPageState ConvertViewModelToSerializable()
728728
{
729-
var selectedResourceName = PageViewModel.SelectedOption.Id is not null
730-
? PageViewModel.SelectedOption.Name
731-
// _noSelection, which doesn't have a resource attached to it
729+
var selectedResourceName = PageViewModel.SelectedResource is { } selectedResource
730+
? GetResourceName(selectedResource)
732731
: null;
733732
return new ConsoleLogsPageState(selectedResourceName);
734733
}

src/Aspire.Dashboard/Model/Otlp/ApplicationsSelectHelpers.cs

+30-7
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,39 @@ public static SelectViewModel<ResourceTypeDetails> GetApplication(this ICollecti
1414
return fallback;
1515
}
1616

17-
var matches = applications.Where(e => SupportType(e.Id?.Type, canSelectGrouping) && string.Equals(name, e.Name, StringComparisons.ResourceName)).ToList();
18-
if (matches.Count == 1)
17+
var allowedMatches = applications.Where(e => SupportType(e.Id?.Type, canSelectGrouping)).ToList();
18+
19+
// First attempt an exact match on the instance id.
20+
var instanceIdMatches = allowedMatches.Where(e => string.Equals(name, e.Id?.InstanceId, StringComparisons.ResourceName)).ToList();
21+
if (instanceIdMatches.Count == 1)
1922
{
20-
return matches[0];
23+
return instanceIdMatches[0];
2124
}
22-
else if (matches.Count == 0)
25+
else if (instanceIdMatches.Count == 0)
2326
{
24-
return fallback;
27+
// Fallback to matching on app name. This is commonly used when there is only one instance of the app.
28+
var replicaSetMatches = allowedMatches.Where(e => e.Id?.Type != OtlpApplicationType.Instance && string.Equals(name, e.Id?.ReplicaSetName, StringComparisons.ResourceName)).ToList();
29+
30+
if (replicaSetMatches.Count == 1)
31+
{
32+
return replicaSetMatches[0];
33+
}
34+
else if (replicaSetMatches.Count == 0)
35+
{
36+
// No matches found so return the passed in fallback.
37+
return fallback;
38+
}
39+
else
40+
{
41+
return MultipleMatches(allowedMatches, logger, name, replicaSetMatches);
42+
}
2543
}
2644
else
45+
{
46+
return MultipleMatches(allowedMatches, logger, name, instanceIdMatches);
47+
}
48+
49+
static SelectViewModel<ResourceTypeDetails> MultipleMatches(ICollection<SelectViewModel<ResourceTypeDetails>> applications, ILogger logger, string name, List<SelectViewModel<ResourceTypeDetails>> matches)
2750
{
2851
// There are multiple matches. Log as much information as possible about applications.
2952
logger.LogWarning(
@@ -54,7 +77,7 @@ public static List<SelectViewModel<ResourceTypeDetails>> CreateApplications(List
5477
var app = replicas.Single();
5578
selectViewModels.Add(new SelectViewModel<ResourceTypeDetails>
5679
{
57-
Id = ResourceTypeDetails.CreateSingleton(app.InstanceId, applicationName),
80+
Id = ResourceTypeDetails.CreateSingleton($"{applicationName}-{app.InstanceId}", applicationName),
5881
Name = applicationName
5982
});
6083

@@ -72,7 +95,7 @@ public static List<SelectViewModel<ResourceTypeDetails>> CreateApplications(List
7295
selectViewModels.AddRange(replicas.Select(replica =>
7396
new SelectViewModel<ResourceTypeDetails>
7497
{
75-
Id = ResourceTypeDetails.CreateReplicaInstance(replica.InstanceId, applicationName),
98+
Id = ResourceTypeDetails.CreateReplicaInstance($"{applicationName}-{replica.InstanceId}", applicationName),
7699
Name = OtlpApplication.GetResourceName(replica, applications)
77100
}));
78101
}

src/Aspire.Dashboard/Model/ResourceTypeDetails.cs

+4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ public ApplicationKey GetApplicationKey()
2727
{
2828
throw new InvalidOperationException($"Can't get ApplicationKey from resource type details '{ToString()}' because {nameof(ReplicaSetName)} is null.");
2929
}
30+
if (InstanceId != null)
31+
{
32+
return ApplicationKey.Create(InstanceId);
33+
}
3034

3135
return new ApplicationKey(ReplicaSetName, InstanceId);
3236
}

tests/Aspire.Dashboard.Tests/Model/ApplicationsSelectHelpersTests.cs

+24-24
Original file line numberDiff line numberDiff line change
@@ -22,42 +22,42 @@ public void GetApplication_SameNameAsReplica_GetInstance()
2222
// Arrange
2323
var appVMs = ApplicationsSelectHelpers.CreateApplications(new List<OtlpApplication>
2424
{
25-
CreateOtlpApplication(name: "app", instanceId: "app"),
26-
CreateOtlpApplication(name: "app", instanceId: "app-abc"),
27-
CreateOtlpApplication(name: "singleton", instanceId: "singleton-abc")
25+
CreateOtlpApplication(name: "multiple", instanceId: "instance"),
26+
CreateOtlpApplication(name: "multiple", instanceId: "instanceabc"),
27+
CreateOtlpApplication(name: "singleton", instanceId: "instanceabc")
2828
});
2929

3030
Assert.Collection(appVMs,
3131
app =>
3232
{
33-
Assert.Equal("app", app.Name);
33+
Assert.Equal("multiple", app.Name);
3434
Assert.Equal(OtlpApplicationType.ResourceGrouping, app.Id!.Type);
3535
Assert.Null(app.Id!.InstanceId);
3636
},
3737
app =>
3838
{
39-
Assert.Equal("app-app", app.Name);
39+
Assert.Equal("multiple-instance", app.Name);
4040
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
41-
Assert.Equal("app", app.Id!.InstanceId);
41+
Assert.Equal("multiple-instance", app.Id!.InstanceId);
4242
},
4343
app =>
4444
{
45-
Assert.Equal("app-app-abc", app.Name);
45+
Assert.Equal("multiple-instanceabc", app.Name);
4646
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
47-
Assert.Equal("app-abc", app.Id!.InstanceId);
47+
Assert.Equal("multiple-instanceabc", app.Id!.InstanceId);
4848
},
4949
app =>
5050
{
5151
Assert.Equal("singleton", app.Name);
5252
Assert.Equal(OtlpApplicationType.Singleton, app.Id!.Type);
53-
Assert.Equal("singleton-abc", app.Id!.InstanceId);
53+
Assert.Equal("singleton-instanceabc", app.Id!.InstanceId);
5454
});
5555

5656
// Act
57-
var app = appVMs.GetApplication(NullLogger.Instance, "app-app-abc", canSelectGrouping: false, null!);
57+
var app = appVMs.GetApplication(NullLogger.Instance, "multiple-instanceabc", canSelectGrouping: false, null!);
5858

5959
// Assert
60-
Assert.Equal("app-abc", app.Id!.InstanceId);
60+
Assert.Equal("multiple-instanceabc", app.Id!.InstanceId);
6161
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
6262
}
6363

@@ -67,38 +67,38 @@ public void GetApplication_NameDifferentByCase_Merge()
6767
// Arrange
6868
var appVMs = ApplicationsSelectHelpers.CreateApplications(new List<OtlpApplication>
6969
{
70-
CreateOtlpApplication(name: "app", instanceId: "app"),
71-
CreateOtlpApplication(name: "APP", instanceId: "app-abc")
70+
CreateOtlpApplication(name: "name", instanceId: "instance"),
71+
CreateOtlpApplication(name: "NAME", instanceId: "instanceabc")
7272
});
7373

7474
Assert.Collection(appVMs,
7575
app =>
7676
{
77-
Assert.Equal("app", app.Name);
77+
Assert.Equal("name", app.Name);
7878
Assert.Equal(OtlpApplicationType.ResourceGrouping, app.Id!.Type);
7979
Assert.Null(app.Id!.InstanceId);
8080
},
8181
app =>
8282
{
83-
Assert.Equal("APP-app", app.Name);
83+
Assert.Equal("NAME-instance", app.Name);
8484
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
85-
Assert.Equal("app", app.Id!.InstanceId);
85+
Assert.Equal("name-instance", app.Id!.InstanceId);
8686
},
8787
app =>
8888
{
89-
Assert.Equal("APP-app-abc", app.Name);
89+
Assert.Equal("NAME-instanceabc", app.Name);
9090
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
91-
Assert.Equal("app-abc", app.Id!.InstanceId);
91+
Assert.Equal("name-instanceabc", app.Id!.InstanceId);
9292
});
9393

9494
var testSink = new TestSink();
9595
var factory = LoggerFactory.Create(b => b.AddProvider(new TestLoggerProvider(testSink)));
9696

9797
// Act
98-
var app = appVMs.GetApplication(factory.CreateLogger("Test"), "app-app", canSelectGrouping: false, null!);
98+
var app = appVMs.GetApplication(factory.CreateLogger("Test"), "name-instance", canSelectGrouping: false, null!);
9999

100100
// Assert
101-
Assert.Equal("app", app.Id!.InstanceId);
101+
Assert.Equal("name-instance", app.Id!.InstanceId);
102102
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
103103
Assert.Empty(testSink.Writes);
104104
}
@@ -148,13 +148,13 @@ public void GetApplication_SelectGroup_NotEnabled_ReturnNull()
148148
{
149149
Assert.Equal("app-123", app.Name);
150150
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
151-
Assert.Equal("123", app.Id!.InstanceId);
151+
Assert.Equal("app-123", app.Id!.InstanceId);
152152
},
153153
app =>
154154
{
155155
Assert.Equal("app-456", app.Name);
156156
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
157-
Assert.Equal("456", app.Id!.InstanceId);
157+
Assert.Equal("app-456", app.Id!.InstanceId);
158158
});
159159

160160
// Act
@@ -185,13 +185,13 @@ public void GetApplication_SelectGroup_Enabled_ReturnGroup()
185185
{
186186
Assert.Equal("app-123", app.Name);
187187
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
188-
Assert.Equal("123", app.Id!.InstanceId);
188+
Assert.Equal("app-123", app.Id!.InstanceId);
189189
},
190190
app =>
191191
{
192192
Assert.Equal("app-456", app.Name);
193193
Assert.Equal(OtlpApplicationType.Instance, app.Id!.Type);
194-
Assert.Equal("456", app.Id!.InstanceId);
194+
Assert.Equal("app-456", app.Id!.InstanceId);
195195
});
196196

197197
// Act

0 commit comments

Comments
 (0)