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