-
Notifications
You must be signed in to change notification settings - Fork 321
/
ResourceOutgoingPeerResolver.cs
87 lines (76 loc) · 2.74 KB
/
ResourceOutgoingPeerResolver.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Aspire.Dashboard.Model;
public sealed class ResourceOutgoingPeerResolver : IOutgoingPeerResolver, IAsyncDisposable
{
private readonly IDashboardViewModelService _dashboardViewModelService;
private readonly Dictionary<string, ResourceViewModel> _resourceNameMapping = new();
private readonly CancellationTokenSource _watchContainersTokenSource = new();
private readonly Task _watchTask;
private readonly object _lock = new object();
public ResourceOutgoingPeerResolver(IDashboardViewModelService dashboardViewModelService)
{
_dashboardViewModelService = dashboardViewModelService;
var viewModelMonitor = _dashboardViewModelService.GetResources();
var initialList = viewModelMonitor.Snapshot;
var watch = viewModelMonitor.Watch;
foreach (var result in initialList)
{
_resourceNameMapping[result.Name] = result;
}
_watchTask = Task.Run(async () =>
{
await foreach (var resourceChanged in watch.WithCancellation(_watchContainersTokenSource.Token))
{
OnResourceListChanged(resourceChanged.ObjectChangeType, resourceChanged.Resource);
}
});
}
private void OnResourceListChanged(ObjectChangeType changeType, ResourceViewModel resourceViewModel)
{
lock (_lock)
{
if (changeType == ObjectChangeType.Added)
{
_resourceNameMapping[resourceViewModel.Name] = resourceViewModel;
}
else if (changeType == ObjectChangeType.Modified)
{
_resourceNameMapping[resourceViewModel.Name] = resourceViewModel;
}
else if (changeType == ObjectChangeType.Deleted)
{
_resourceNameMapping.Remove(resourceViewModel.Name);
}
}
}
public string ResolvePeerName(string networkAddress)
{
lock (_lock)
{
foreach (var resource in _resourceNameMapping.Values)
{
foreach (var service in resource.Services)
{
if (service.AddressAndPort == networkAddress)
{
return resource.Name;
}
}
}
}
return networkAddress;
}
public async ValueTask DisposeAsync()
{
_watchContainersTokenSource.Cancel();
_watchContainersTokenSource.Dispose();
try
{
await _watchTask.ConfigureAwait(false);
}
catch (OperationCanceledException)
{
}
}
}