Skip to content

Commit

Permalink
Add dataplicity events (#52)
Browse files Browse the repository at this point in the history
Signed-off-by: Dave Thaler <[email protected]>
  • Loading branch information
dthaler authored Jun 16, 2024
1 parent 49b4659 commit f730b2a
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 10 deletions.
61 changes: 57 additions & 4 deletions OrcanodeMonitor/Core/Fetcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using Microsoft.AspNetCore.Mvc;
using System.Net;
using OrcanodeMonitor.Api;
using Newtonsoft.Json.Linq;

namespace OrcanodeMonitor.Core
{
Expand Down Expand Up @@ -48,17 +49,26 @@ private static bool NameMatch(string name, string dataplicityName)
return false;
}

private static Orcanode FindOrCreateOrcanodeByDataplicitySerial(DbSet<Orcanode> nodeList, string serial)
/// <summary>
/// Find or create a node using the serial number value at Dataplicity.
/// </summary>
/// <param name="nodeList">Database table to look in and potentially update</param>
/// <param name="serial">Dataplicity serial number to look for</param>
/// <param name="connectionStatus">Dataplicity connection status</param>
/// <returns></returns>
private static Orcanode FindOrCreateOrcanodeByDataplicitySerial(DbSet<Orcanode> nodeList, string serial, out OrcanodeOnlineStatus connectionStatus)
{
List<Orcanode> nodes = nodeList.ToList();
foreach (Orcanode node in nodes)
{
if (node.DataplicitySerial == serial)
{
connectionStatus = node.DataplicityConnectionStatus;
return node;
}
}

connectionStatus = OrcanodeOnlineStatus.Absent;
var newNode = new Orcanode();
newNode.DataplicitySerial = serial;

Expand Down Expand Up @@ -220,7 +230,11 @@ public async static Task UpdateDataplicityDataAsync(OrcanodeMonitorContext conte
{
continue;
}
Orcanode node = FindOrCreateOrcanodeByDataplicitySerial(context.Orcanodes, serial.ToString());

Orcanode node = FindOrCreateOrcanodeByDataplicitySerial(context.Orcanodes, serial.ToString(), out OrcanodeOnlineStatus oldStatus);
OrcanodeUpgradeStatus oldAgentUpgradeStatus = node.DataplicityUpgradeStatus;
long oldDiskCapacityInGigs = node.DiskCapacityInGigs;

if (device.TryGetProperty("name", out var name))
{
string dataplicityName = name.ToString();
Expand Down Expand Up @@ -254,6 +268,24 @@ public async static Task UpdateDataplicityDataAsync(OrcanodeMonitorContext conte
{
node.DataplicityUpgradeAvailable = upgradeAvailable.GetBoolean();
}

// Trigger any event changes.
OrcanodeOnlineStatus newStatus = node.DataplicityConnectionStatus;
if (newStatus != oldStatus)
{
AddDataplicityConnectionStatusEvent(context, node);
}
if (oldStatus != OrcanodeOnlineStatus.Absent)
{
if (oldAgentUpgradeStatus != node.DataplicityUpgradeStatus)
{
AddDataplicityAgentUpgradeStatusChangeEvent(context, node);
}
if (oldDiskCapacityInGigs != node.DiskCapacityInGigs)
{
AddDiskCapacityChangeEvent(context, node);
}
}
}

MonitorState.GetFrom(context).LastUpdatedTimestampUtc = DateTime.UtcNow;
Expand Down Expand Up @@ -434,7 +466,28 @@ public static List<OrcanodeEvent> GetEvents(OrcanodeMonitorContext context, int
return orcanodeEvents;
}

private static void AddOrcanodeStreamStatusEvent(OrcanodeMonitorContext context, Orcanode node)
private static void AddDataplicityConnectionStatusEvent(OrcanodeMonitorContext context, Orcanode node)
{
string value = (node.DataplicityConnectionStatus == OrcanodeOnlineStatus.Online) ? "up" : "OFFLINE";
var orcanodeEvent = new OrcanodeEvent(node, "dataplicity connection", value, DateTime.UtcNow);
context.OrcanodeEvents.Add(orcanodeEvent);
}

private static void AddDataplicityAgentUpgradeStatusChangeEvent(OrcanodeMonitorContext context, Orcanode node)
{
string value = node.DataplicityUpgradeStatus.ToString();
var orcanodeEvent = new OrcanodeEvent(node, "agent upgrade status", value, DateTime.UtcNow);
context.OrcanodeEvents.Add(orcanodeEvent);
}

private static void AddDiskCapacityChangeEvent(OrcanodeMonitorContext context, Orcanode node)
{
string value = string.Format("{0}G", node.DiskCapacityInGigs);
var orcanodeEvent = new OrcanodeEvent(node, "SD card size", value, DateTime.UtcNow);
context.OrcanodeEvents.Add(orcanodeEvent);
}

private static void AddHydrophoneStreamStatusEvent(OrcanodeMonitorContext context, Orcanode node)
{
string value = (node.OrcasoundOnlineStatus == OrcanodeOnlineStatus.Online) ? "up" : "OFFLINE";
var orcanodeEvent = new OrcanodeEvent(node, "hydrophone stream", value, DateTime.UtcNow);
Expand Down Expand Up @@ -472,7 +525,7 @@ public async static Task UpdateManifestTimestampAsync(OrcanodeMonitorContext con
OrcanodeOnlineStatus newStatus = node.OrcasoundOnlineStatus;
if (newStatus != oldStatus)
{
AddOrcanodeStreamStatusEvent(context, node);
AddHydrophoneStreamStatusEvent(context, node);
}
}

Expand Down
2 changes: 1 addition & 1 deletion OrcanodeMonitor/Models/Orcanode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ public static string DataplicityNameToDisplayName(string dataplicityName)
public bool? DataplicityOnline { get; set; }
public bool? DataplicityUpgradeAvailable { get; set; }
public OrcanodeUpgradeStatus DataplicityUpgradeStatus => DataplicityUpgradeAvailable ?? false ? OrcanodeUpgradeStatus.UpgradeAvailable : OrcanodeUpgradeStatus.UpToDate;
public OrcanodeOnlineStatus DataplicityStatus => DataplicityOnline ?? false ? OrcanodeOnlineStatus.Online : OrcanodeOnlineStatus.Offline;
public OrcanodeOnlineStatus DataplicityConnectionStatus => DataplicityOnline ?? false ? OrcanodeOnlineStatus.Online : OrcanodeOnlineStatus.Offline;
#if ORCAHELLO
public string OrcaHelloName
{
Expand Down
20 changes: 17 additions & 3 deletions OrcanodeMonitor/Models/OrcanodeEvent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public OrcanodeEvent(Orcanode node, string type, string value, DateTime timestam
/// </summary>
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }

public string Slug { get; set; }
public string Type { get; set; }
public string Value { get; set; }
Expand All @@ -93,9 +93,23 @@ public OrcanodeEvent(Orcanode node, string type, string value, DateTime timestam

public override string ToString()
{
return string.Format("{0} {1} {2} at {3}", Slug, Type, Value, Fetcher.UtcToLocalDateTime(DateTimeUtc));
return string.Format("{0} {1} => {2} at {3}", Slug, Type, Value, Fetcher.UtcToLocalDateTime(DateTimeUtc));
}

public string Description => string.Format("{0} hydrophone stream was detected as {1}", NodeName, Value);
public string Description
{
get
{
// Convert type from old value to new value.
// TODO: do a migration in the database itself and remove this code.
string type = Type;
if (type == "stream status")
{
type = "hydrophone stream";
}

return string.Format("{0} {1} was detected as {2}", NodeName, type, Value);
}
}
}
}
2 changes: 1 addition & 1 deletion OrcanodeMonitor/Pages/Index.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
-->
<td style="background-color: @Model.NodeDataplicityColor(item)">
<a href="https://www.dataplicity.com/app/">
@Html.DisplayFor(modelItem => item.DataplicityStatus)
@Html.DisplayFor(modelItem => item.DataplicityConnectionStatus)
</a>
</td>
<td style="background-color: @Model.NodeDataplicityUpgradeColor(item)">
Expand Down
2 changes: 1 addition & 1 deletion OrcanodeMonitor/Pages/Index.cshtml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public string NodeOrcasoundColor(Orcanode node)

public string NodeDataplicityColor(Orcanode node)
{
OrcanodeOnlineStatus status = node.DataplicityStatus;
OrcanodeOnlineStatus status = node.DataplicityConnectionStatus;
if (status == OrcanodeOnlineStatus.Offline)
{
return ColorTranslator.ToHtml(Color.Red);
Expand Down

0 comments on commit f730b2a

Please sign in to comment.