From c01401eb072a910293469b63c42ae4a225e2676a Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Tue, 28 Oct 2025 15:25:08 +0100 Subject: [PATCH 1/2] Logik um ServiceDiscovery Payload zu verarbeiten soweit gemacht, JSON Input wird aber nocht nicht geparsed --- Watcher/Controllers/MonitoringController.cs | 80 ++++++++++++++------- 1 file changed, 56 insertions(+), 24 deletions(-) diff --git a/Watcher/Controllers/MonitoringController.cs b/Watcher/Controllers/MonitoringController.cs index 9a61003..e5963a7 100644 --- a/Watcher/Controllers/MonitoringController.cs +++ b/Watcher/Controllers/MonitoringController.cs @@ -80,10 +80,8 @@ public class MetricDto public class ServiceDto { - public int ServerId { get; set; } // Vom Watcher-Server zugewiesene ID des Hosts - public String? ContainerId { get; set; } - public String? Image { get; set; } - public String? Name { get; set; } + public required int Server_id { get; set; } // Vom Watcher-Server zugewiesene ID des Hosts + public required JsonContent Containers { get; set; } } [ApiController] @@ -234,33 +232,59 @@ public class MonitoringController : Controller .Select(e => e.ErrorMessage) .ToList(); - _logger.LogError("Ungültiger ServiceDetection-Payload."); - return BadRequest(new { error = "Ungültiger Payload", details = errors }); + _logger.LogError("Invalid ServiceDetection-Payload."); + return BadRequest(new { error = "Invalid Payload", details = errors }); } - // Metrics für Container, die zu ServerId gehören, löschen + // Container Objekte erstellen + List newContainers = ParseServiceDiscoveryInput(dto.Server_id, dto.Containers); - // Container, die zu ServerId gehören löschen + // Liste aller Container, die bereits der übergebenen ServerId zugewiesen sind + List existingContainers = _context.Containers + .Where(c => c.ServerId == dto.Server_id) + .ToList(); - // Container neu in Datenbank einlesen - try + + // Logik, um Container, die mit dem Payload kamen zu verarbeiten + foreach (Container c in newContainers) { - Container container = new Container + // Überprüfen, ob ein übergebener Container bereits für den Host registriert ist + if (existingContainers.Contains(c)) { - ServerId = dto.ServerId, - ContainerId = dto.ContainerId, - Image = dto.Name, - Name = dto.Name - }; - - _logger.LogInformation(container.Name + " added for Host " + container.ServerId); - - _context.Containers.Add(container); - await _context.SaveChangesAsync(); + _logger.LogInformation("Container with id " + c.ContainerId + " already exists."); + } + // Container auf einen Host/Server registrieren + else + { + // Container in Datenbank einlesen + try + { + _context.Containers.Add(c); + await _context.SaveChangesAsync(); + _logger.LogInformation(c.Name + " added for Host " + c.ServerId); + } + catch (SqliteException e) + { + _logger.LogError("Error writing new Containers to Database: " + e.Message); + } + } } - catch (SqliteException e) + + // Logik um abgeschaltene Container aus der Datenbank zu entfernen + foreach (Container c in existingContainers) { - _logger.LogError("ServiceDiscovery failed: " + e.Message); + // Abfrage, ob bereits vorhandener Container im Payload vorhanden war + if (!newContainers.Contains(c)) + { + // Container entfernen + _context.Containers.Remove(c); + await _context.SaveChangesAsync(); + + // Metrics für den Container entfernen + //Todo + + _logger.LogInformation("Container " + c.Name + " (" + c.Id + ") on Host-Id " + c.ServerId + " was successfully removed from the database."); + } } return Ok(); @@ -268,7 +292,6 @@ public class MonitoringController : Controller } // Durchschnittliche Werte Berechnen - [HttpGet("median")] public async Task CalculateMedian(string Metric, int HoursToMonitor, int ServerId) { // Aktuelle Zeit - X Stunden = letzter Wert, der berücksichtigt werden soll @@ -368,4 +391,13 @@ public class MonitoringController : Controller return metric_input; } + private List ParseServiceDiscoveryInput(int server_id, JsonContent containers) + { + List containerList = new List(); + + // JSON-Objekt auslesen und Container-Objekte erstellen + + + return containerList; + } } \ No newline at end of file From 7c85e338fa349da2a6e8e431f6a04cb5c45336bb Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Wed, 29 Oct 2025 07:57:13 +0100 Subject: [PATCH 2/2] Json Parsing --- Watcher/Controllers/MonitoringController.cs | 23 +++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Watcher/Controllers/MonitoringController.cs b/Watcher/Controllers/MonitoringController.cs index e5963a7..0f4e2a3 100644 --- a/Watcher/Controllers/MonitoringController.cs +++ b/Watcher/Controllers/MonitoringController.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using System.Text.Json; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -236,8 +237,26 @@ public class MonitoringController : Controller return BadRequest(new { error = "Invalid Payload", details = errors }); } + // Json zu was brauchbarem machen + string containersJson = await dto.Containers.ReadAsStringAsync(); + List newContainers = JsonSerializer.Deserialize>(containersJson)?? new List();; + + foreach (Container c in newContainers) + { + c.ServerId = dto.Server_id; + // Debug Logs + // TODO entfernen wenn fertig getestet + Console.WriteLine("---------"); + Console.WriteLine("ServerId: " + c.ServerId); + Console.WriteLine("ContainerId: " + c.ContainerId); + Console.WriteLine("Name: " + c.Name); + Console.WriteLine("Image: " + c.Image); + Console.WriteLine("---------"); + + } + // Container Objekte erstellen - List newContainers = ParseServiceDiscoveryInput(dto.Server_id, dto.Containers); + //List newContainers = ParseServiceDiscoveryInput(dto.Server_id, containers); // Liste aller Container, die bereits der übergebenen ServerId zugewiesen sind List existingContainers = _context.Containers @@ -391,7 +410,7 @@ public class MonitoringController : Controller return metric_input; } - private List ParseServiceDiscoveryInput(int server_id, JsonContent containers) + private List ParseServiceDiscoveryInput(int server_id, List containers) { List containerList = new List();