Implemented factory pattern for server abstraction creation. Implemented raw fs and docker provisioner. Implemented docker event service with observer pattern

This commit is contained in:
2025-07-26 19:14:02 +02:00
parent 0bef60dbc8
commit 84b3d1caf6
13 changed files with 956 additions and 51 deletions

View File

@@ -0,0 +1,81 @@
using System.Reactive.Linq;
using System.Reactive.Subjects;
using Docker.DotNet;
using Docker.DotNet.Models;
namespace MoonlightServers.Daemon.Services;
public class DockerEventService : BackgroundService
{
private readonly ILogger<DockerEventService> Logger;
private readonly DockerClient DockerClient;
public IAsyncObservable<Message> OnContainerEvent => OnContainerSubject.ToAsyncObservable();
public IAsyncObservable<Message> OnImageEvent => OnImageSubject.ToAsyncObservable();
public IAsyncObservable<Message> OnNetworkEvent => OnNetworkSubject.ToAsyncObservable();
private readonly AsyncSubject<Message> OnContainerSubject = new();
private readonly AsyncSubject<Message> OnImageSubject = new();
private readonly AsyncSubject<Message> OnNetworkSubject = new();
public DockerEventService(
ILogger<DockerEventService> logger,
DockerClient dockerClient
)
{
Logger = logger;
DockerClient = dockerClient;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
Logger.LogInformation("Starting docker event service");
while (!stoppingToken.IsCancellationRequested)
{
try
{
await DockerClient.System.MonitorEventsAsync(
new ContainerEventsParameters(),
new Progress<Message>(message =>
{
switch (message.Type)
{
case "container":
OnContainerSubject.OnNext(message);
break;
case "image":
OnImageSubject.OnNext(message);
break;
case "network":
OnNetworkSubject.OnNext(message);
break;
}
}),
stoppingToken
);
}
catch (TaskCanceledException)
{
// ignored
}
catch (Exception e)
{
Logger.LogError(e, "An error occured while listening for docker events: {message}", e.Message);
}
}
Logger.LogInformation("Stopping docker event service");
}
public override void Dispose()
{
base.Dispose();
OnContainerSubject.Dispose();
OnImageSubject.Dispose();
OnNetworkSubject.Dispose();
}
}