Working control of Docker containers

This commit is contained in:
Pat Hartl 2025-03-25 20:48:19 -05:00
parent c9ffb1eac3
commit 0d8cfaf423
3 changed files with 30 additions and 15 deletions

View file

@ -53,9 +53,11 @@ public static class IServiceCollectionExtensions
services.AddScoped<IImporter<Data.Models.Server>, ServerImporter>();
services.AddScoped<IImporter<Data.Models.Redistributable>, RedistributableImporter>();
// Register server engine
// Register server engines
services.AddSingleton<IServerEngine, LocalServerEngine>();
services.AddSingleton<IServerEngine, DockerServerEngine>();
services.AddSingleton<DockerServerEngine>();
services.AddSingleton<IServerEngine>(provider => provider.GetService<DockerServerEngine>());
services.AddSingleton<IPXRelayService>();

View file

@ -22,7 +22,7 @@ public class DockerServerEngine(
{
private ServerEngineConfiguration _config;
private Dictionary<Guid, DockerClient> _dockerClients = new();
private Dictionary<Guid, (Guid HostId, string ContainerId)> _tracked { get; set; } = new();
private Dictionary<Guid, DockerContainer> _tracked { get; set; } = new();
public event EventHandler<ServerStatusUpdateEventArgs>? OnServerStatusUpdate;
public event EventHandler<ServerLogEventArgs>? OnServerLog;
@ -46,22 +46,32 @@ public class DockerServerEngine(
foreach (var server in servers)
{
if (server.DockerHostId.HasValue && _dockerClients.ContainsKey(server.DockerHostId.Value))
_tracked[server.Id] = (server.DockerHostId.Value, server.ContainerId);
_tracked[server.Id] = new DockerContainer
{
HostId = server.DockerHostId.Value,
Id = server.ContainerId,
Name = server.Name,
};
}
}
}
public async Task<IEnumerable<ContainerListResponse>> GetContainersAsync(Guid dockerHostId)
public async Task<IEnumerable<DockerContainer>> GetContainersAsync(Guid dockerHostId)
{
if (!_dockerClients.ContainsKey(dockerHostId))
return Enumerable.Empty<ContainerListResponse>();
return Enumerable.Empty<DockerContainer>();
var response = await _dockerClients[dockerHostId].Containers.ListContainersAsync(new ContainersListParameters()
{
All = true
});
return response;
return response.Where(i => i != null).Select(i => new DockerContainer
{
Id = i.ID,
HostId = dockerHostId,
Name = i.Names.FirstOrDefault()
});
}
public bool IsManaging(Guid serverId)
@ -193,12 +203,17 @@ public class DockerServerEngine(
if (String.IsNullOrWhiteSpace(server.ContainerId))
return ServerProcessStatus.Stopped;
_tracked[serverId] = (server.DockerHostId.Value, server.ContainerId);
_tracked[serverId] = new DockerContainer
{
Id = server.ContainerId,
HostId = server.DockerHostId.Value,
Name = server.Name,
};
}
try
{
var container = await _dockerClients[_tracked[serverId].HostId].Containers.InspectContainerAsync(_tracked[serverId].ContainerId);
var container = await _dockerClients[_tracked[serverId].HostId].Containers.InspectContainerAsync(_tracked[serverId].Id);
if (container.State.Running)
return ServerProcessStatus.Running;

View file

@ -11,10 +11,10 @@
@using LANCommander.Server.UI.Pages.Servers.Components
@inject ServerService ServerService
@inject GameService GameService
@inject DockerServerEngine DockerServerEngine
@inject NavigationManager NavigationManager
@inject IMessageService MessageService
@inject ILogger<General> Logger
@inject IServiceProvider ServiceProvider
<ServerEditView Id="Id">
<TitleTemplate>
@ -89,7 +89,7 @@
<FormItem Label="Container">
<Select
TItem="ContainerListResponse"
TItem="DockerContainer"
TItemValue="string"
DataSource="Containers"
Disabled="!Containers.Any()"
@ -139,9 +139,8 @@
[Parameter] public Guid Id { get; set; }
IEnumerable<Game> Games = new List<Game>();
IEnumerable<ContainerListResponse> Containers = new List<ContainerListResponse>();
DockerServerEngine DockerServerEngine;
IEnumerable<DockerContainer> Containers = new List<DockerContainer>();
Settings Settings = SettingService.GetSettings();
Guid GameId;
@ -177,7 +176,6 @@
async Task ChangeDockerHost(ServerEngineConfiguration hostConfiguration)
{
DockerServerEngine = ServiceProvider.GetService<DockerServerEngine>();
Containers = await DockerServerEngine.GetContainersAsync(hostConfiguration.Id);
}