Skip to content

Commit 3efe940

Browse files
Implement progress state reporting via mgmt hub
1 parent 75115cf commit 3efe940

File tree

7 files changed

+97
-34
lines changed

7 files changed

+97
-34
lines changed

src/Certify.Client/ManagementServerClient.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,24 @@ public void SendInstanceInfo(Guid commandId, bool isCommandResponse = true)
137137
result.ObjectValue = _instanceInfo;
138138
_connection.SendAsync(ManagementHubMessages.ReceiveCommandResult, result);
139139
}
140+
141+
/// <summary>
142+
/// Send mgmt hub a general notification message to be actioned
143+
/// </summary>
144+
public void SendNotificationToManagementHub(string msgCommandType, object updateMsg)
145+
{
146+
var result = new InstanceCommandResult
147+
{
148+
CommandId = Guid.NewGuid(),
149+
InstanceId = _instanceInfo.InstanceId,
150+
CommandType = msgCommandType,
151+
Value = System.Text.Json.JsonSerializer.Serialize(updateMsg),
152+
ObjectValue = updateMsg,
153+
IsCommandResponse = false
154+
};
155+
156+
result.ObjectValue = updateMsg;
157+
_connection.SendAsync(ManagementHubMessages.ReceiveCommandResult, result);
158+
}
140159
}
141160
}

src/Certify.Core/Management/CertifyManager/CertifyManager.ManagementHub.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,15 +129,26 @@ private async Task<InstanceCommandResult> _managementServerClient_OnGetCommandRe
129129
var managedCertArg = args.FirstOrDefault(a => a.Key == "managedCert");
130130
var managedCert = JsonSerializer.Deserialize<ManagedCertificate>(managedCertArg.Value);
131131

132-
val = await UpdateManagedCertificate(managedCert);
132+
var item = await UpdateManagedCertificate(managedCert);
133+
134+
val = item;
135+
136+
ReportManagedItemUpdateToMgmtHub(item);
133137
}
134-
else if (arg.CommandType == ManagementHubCommands.RemoveDeleteManagedItem)
138+
else if (arg.CommandType == ManagementHubCommands.RemoveManagedItem)
135139
{
136140
// delete a single managed item
137141
var args = JsonSerializer.Deserialize<KeyValuePair<string, string>[]>(arg.Value);
138142
var managedCertIdArg = args.FirstOrDefault(a => a.Key == "managedCertId");
139143

140-
await DeleteManagedCertificate(managedCertIdArg.Value);
144+
var actionResult = await DeleteManagedCertificate(managedCertIdArg.Value);
145+
146+
val = actionResult;
147+
148+
if (actionResult.IsSuccess)
149+
{
150+
ReportManagedItemDeleteToMgmtHub(managedCertIdArg.Value);
151+
}
141152
}
142153
else if (arg.CommandType == ManagementHubCommands.TestManagedItemConfiguration)
143154
{
@@ -264,9 +275,26 @@ private async Task<InstanceCommandResult> _managementServerClient_OnGetCommandRe
264275
return result;
265276
}
266277

278+
private void ReportManagedItemUpdateToMgmtHub(ManagedCertificate item)
279+
{
280+
if (item != null)
281+
{
282+
_managementServerClient?.SendNotificationToManagementHub(ManagementHubCommands.NotificationUpdatedManagedItem, item);
283+
}
284+
}
285+
private void ReportManagedItemDeleteToMgmtHub(string id)
286+
{
287+
_managementServerClient?.SendNotificationToManagementHub(ManagementHubCommands.NotificationRemovedManagedItem, id);
288+
}
289+
290+
private void ReportRequestProgressToMgmtHub(RequestProgressState progress)
291+
{
292+
_managementServerClient?.SendNotificationToManagementHub(ManagementHubCommands.NotificationManagedItemRequestProgress, progress);
293+
}
294+
267295
private void _managementServerClient_OnConnectionReconnecting()
268296
{
269-
_serviceLog.Warning("Reconnecting to Management.");
297+
_serviceLog.Warning("Reconnecting to Management Hub.");
270298
}
271299

272300
private void GenerateDemoItems()

src/Certify.Core/Management/CertifyManager/CertifyManager.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Concurrent;
33
using System.Collections.Generic;
44
using System.IO;
@@ -325,7 +325,7 @@ private async Task InitDataStore()
325325
{
326326
_itemManager = new SQLiteManagedItemStore("", _serviceLog);
327327
_credentialsManager = new SQLiteCredentialStore("", _serviceLog);
328-
328+
329329
_configStore = new SQLiteConfigurationStore("", _serviceLog);
330330
_accessControl = new AccessControl(_serviceLog, _configStore);
331331
}
@@ -425,10 +425,12 @@ public void ReportProgress(IProgress<RequestProgressState> progress, RequestProg
425425
progress.Report(state);
426426
}
427427

428-
// report request state to status hub clients
428+
// report request state to status hub clients and optionally mgmt hub
429429

430430
_statusReporting?.ReportRequestProgress(state);
431431

432+
ReportRequestProgressToMgmtHub(state);
433+
432434
if (state.ManagedCertificate != null && logThisEvent)
433435
{
434436
if (state.CurrentState == RequestState.Error)

src/Certify.Models/Hub/ManagementHubMessages.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class ManagementHubMessages
77
{
88
public const string SendCommandRequest = "SendCommandRequest";
99
public const string ReceiveCommandResult = "ReceiveCommandResult";
10+
public const string Notification = "Notification";
1011
public const string GetCommandResult = "GetCommandResult";
1112
}
1213

@@ -20,7 +21,7 @@ public class ManagementHubCommands
2021
public const string GetManagedItemRenewalPreview = "GetManagedItemRenewalPreview";
2122

2223
public const string UpdateManagedItem = "UpdateManagedItem";
23-
public const string RemoveDeleteManagedItem = "RemoveManagedItem";
24+
public const string RemoveManagedItem = "RemoveManagedItem";
2425
public const string TestManagedItemConfiguration = "TestManagedItemConfiguration";
2526
public const string PerformManagedItemRequest = "PerformManagedItemRequest";
2627

@@ -43,6 +44,13 @@ public class ManagementHubCommands
4344
public const string ExecuteDeploymentTask = "ExecuteDeploymentTask";
4445

4546
public const string Reconnect = "Reconnect";
47+
48+
/// <summary>
49+
/// Notification messages are used to send topic specific info ad-hoc back to the mgmt hub
50+
/// </summary>
51+
public const string NotificationRemovedManagedItem = "NotificationRemovedManagedItem";
52+
public const string NotificationUpdatedManagedItem = "NotificationUpdatedManagedItem";
53+
public const string NotificationManagedItemRequestProgress = "NotificationManagedItemRequestProgress";
4654
}
4755

4856
/// <summary>

src/Certify.Server/Certify.Server.Api.Public/SignalR/ManagementHub/InstanceManagementHub.cs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,18 @@ public class InstanceManagementHub : Hub<IInstanceManagementHub>, IInstanceManag
3939
{
4040
private IInstanceManagementStateProvider _stateProvider;
4141
private ILogger<InstanceManagementHub> _logger;
42+
private IHubContext<UserInterfaceStatusHub> _uiStatusHub;
4243

4344
/// <summary>
4445
/// Set up instance management hub
4546
/// </summary>
4647
/// <param name="stateProvider"></param>
4748
/// <param name="logger"></param>
48-
public InstanceManagementHub(IInstanceManagementStateProvider stateProvider, ILogger<InstanceManagementHub> logger)
49+
public InstanceManagementHub(IInstanceManagementStateProvider stateProvider, ILogger<InstanceManagementHub> logger, IHubContext<UserInterfaceStatusHub> uiStatusHub)
4950
{
5051
_stateProvider = stateProvider;
5152
_logger = logger;
53+
_uiStatusHub = uiStatusHub;
5254
}
5355

5456
/// <summary>
@@ -170,7 +172,7 @@ public Task ReceiveCommandResult(InstanceCommandResult result)
170172
if (!string.IsNullOrWhiteSpace(instanceId))
171173
{
172174
// action this message from this instance
173-
_logger?.LogInformation("Received instance command result {result}", result);
175+
_logger?.LogInformation("Received instance command result {result}", result.CommandType);
174176

175177
if (cmd.CommandType == ManagementHubCommands.GetManagedItems)
176178
{
@@ -189,12 +191,32 @@ public Task ReceiveCommandResult(InstanceCommandResult result)
189191
else
190192
{
191193
// store for something else to consume
192-
_stateProvider.AddAwaitedCommandResult(result);
194+
if (result.IsCommandResponse)
195+
{
196+
_stateProvider.AddAwaitedCommandResult(result);
197+
}
198+
else
199+
{
200+
// item was not requested, queue for processing
201+
if (result.CommandType == ManagementHubCommands.NotificationUpdatedManagedItem)
202+
{
203+
_uiStatusHub.Clients.All.SendAsync(Providers.StatusHubMessages.SendManagedCertificateUpdateMsg, System.Text.Json.JsonSerializer.Deserialize<Models.ManagedCertificate>(result.Value));
204+
}
205+
else if (result.CommandType == ManagementHubCommands.NotificationManagedItemRequestProgress)
206+
{
207+
_uiStatusHub.Clients.All.SendAsync(Providers.StatusHubMessages.SendProgressStateMsg, System.Text.Json.JsonSerializer.Deserialize<Models.RequestProgressState>(result.Value));
208+
}
209+
else if (result.CommandType == ManagementHubCommands.NotificationRemovedManagedItem)
210+
{
211+
// deleted :TODO
212+
_uiStatusHub.Clients.All.SendAsync(Providers.StatusHubMessages.SendMsg, $"Deleted item {result.Value}");
213+
}
214+
}
193215
}
194216
}
195217
else
196218
{
197-
_logger?.LogError("Received instance command result for an unknown instance {result}", result);
219+
_logger?.LogError("Received instance command result for an unknown instance {result}", result.CommandType);
198220
}
199221
}
200222
}

src/Certify.Server/Certify.Server.Api.Public/SignalR/ManagementHub/InstanceManagementStateProvider.cs

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -189,19 +189,10 @@ public ConcurrentDictionary<string, StatusSummary> GetManagedInstanceStatusSumma
189189
public void UpdateCachedManagedInstanceItem(string instanceId, ManagedCertificate managedCertificate)
190190
{
191191
_managedInstanceItems.TryGetValue(instanceId, out var instance);
192-
193-
if (instance != null)
192+
if (instance?.Items != null)
194193
{
195-
foreach (var item in instance.Items)
196-
{
197-
if (item.Id == managedCertificate.Id)
198-
{
199-
instance.Items.Remove(item);
200-
managedCertificate.InstanceId = instanceId;
201-
instance.Items.Add(managedCertificate);
202-
return;
203-
}
204-
}
194+
instance.Items.RemoveAll(r => r.Id == managedCertificate.Id);
195+
instance.Items.Add(managedCertificate);
205196
}
206197
}
207198

@@ -219,16 +210,9 @@ public void DeleteCachedManagedInstanceItem(string instanceId, string managedCer
219210
{
220211
_managedInstanceItems.TryGetValue(instanceId, out var instance);
221212

222-
if (instance != null)
213+
if (instance?.Items != null)
223214
{
224-
foreach (var item in instance.Items)
225-
{
226-
if (item.Id == managedCertificateId)
227-
{
228-
instance.Items.Remove(item);
229-
return;
230-
}
231-
}
215+
instance.Items.RemoveAll(r => r.Id == managedCertificateId);
232216
}
233217
}
234218
}

src/Certify.Server/Certify.Server.Core/Certify.Server.Core/Controllers/ManagedCertificateController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Certify.Config;
1+
using Certify.Config;
22
using Certify.Models.Hub;
33
using Certify.Management;
44
using Certify.Models;

0 commit comments

Comments
 (0)