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:
81
MoonlightServers.Daemon/Services/DockerEventService.cs
Normal file
81
MoonlightServers.Daemon/Services/DockerEventService.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user