Added node and image view to manager. Made the data handling smoother and simpler

This commit is contained in:
Marcel Baumgartner
2023-05-17 22:35:55 +02:00
parent 5d186363e3
commit 70cac323fc
2 changed files with 112 additions and 61 deletions

View File

@@ -0,0 +1,10 @@
using Moonlight.App.ApiClients.Daemon.Resources;
using Moonlight.App.Database.Entities;
namespace Moonlight.App.Models.Misc;
public class RunningServer
{
public Server Server { get; set; }
public ContainerStats.Container Container { get; set; }
}

View File

@@ -9,6 +9,7 @@
@using Moonlight.App.ApiClients.Daemon.Resources @using Moonlight.App.ApiClients.Daemon.Resources
@using Moonlight.App.ApiClients.Wings @using Moonlight.App.ApiClients.Wings
@using Moonlight.App.Helpers @using Moonlight.App.Helpers
@using Moonlight.App.Models.Misc
@inject NodeRepository NodeRepository @inject NodeRepository NodeRepository
@inject NodeService NodeService @inject NodeService NodeService
@@ -23,7 +24,7 @@
<WButton Text="@(SmartTranslateService.Translate("Refresh"))" <WButton Text="@(SmartTranslateService.Translate("Refresh"))"
WorkingText="@(SmartTranslateService.Translate("Working"))" WorkingText="@(SmartTranslateService.Translate("Working"))"
CssClasses="btn-primary" CssClasses="btn-primary"
OnClick="() => LazyLoader.Reload()"> OnClick="() => Task.Run(Scan)">
</WButton> </WButton>
<WButton Text="@(SmartTranslateService.Translate("Stop all"))" <WButton Text="@(SmartTranslateService.Translate("Stop all"))"
WorkingText="@(SmartTranslateService.Translate("Working"))" WorkingText="@(SmartTranslateService.Translate("Working"))"
@@ -37,68 +38,97 @@
</WButton> </WButton>
</div> </div>
</div> </div>
<LazyLoader @ref="LazyLoader" Load="Load"> <div class="card mb-5 bg-secondary">
<div class="card-body d-flex align-items-center">
@if (IsRunning)
{
<h4><TL>Currently scanning</TL>: @(Node?.Name)</h4>
}
else
{
<TL>Scan complete</TL>
}
</div>
</div>
<div class="card card-body"> <div class="card card-body">
<div class="table-responsive"> <div class="table-responsive">
<Table TableItem="ContainerStats.Container" Items="Containers.Values" PageSize="25" TableClass="table table-row-bordered table-row-gray-100 align-middle gs-0 gy-3" TableHeadClass="fw-bold text-muted"> <Table TableItem="RunningServer" Items="RunningServers" PageSize="25" TableClass="table table-row-bordered table-row-gray-100 align-middle gs-0 gy-3" TableHeadClass="fw-bold text-muted">
<Column TableItem="ContainerStats.Container" Title="@(SmartTranslateService.Translate("Name"))" Field="@(x => x.Name)" Sortable="true" Filterable="true"> <Column TableItem="RunningServer" Title="@(SmartTranslateService.Translate("Name"))" Field="@(x => x.Server.Name)" Sortable="true" Filterable="true">
<Template> <Template>
@{ <a href="/server/@(context.Server.Uuid)">@(context.Server.Name)</a>
var server = Containers.First(x => x.Value == context).Key;
}
<a href="/server/@(server.Uuid)">@(server.Name)</a>
</Template> </Template>
</Column> </Column>
<Column TableItem="ContainerStats.Container" Title="@(SmartTranslateService.Translate("Cpu usage"))" Field="@(x => x.Cpu)" Sortable="true" Filterable="true"> <Column TableItem="RunningServer" Title="@(SmartTranslateService.Translate("Cpu usage"))" Field="@(x => x.Container.Cpu)" Sortable="true" Filterable="true">
<Template> <Template>
<span>@(context.Cpu)%</span> <span>@(context.Container.Cpu)%</span>
</Template> </Template>
</Column> </Column>
<Column TableItem="ContainerStats.Container" Title="@(SmartTranslateService.Translate("Memory usage"))" Field="@(x => x.Memory)" Sortable="true" Filterable="true"> <Column TableItem="RunningServer" Title="@(SmartTranslateService.Translate("Memory usage"))" Field="@(x => x.Container.Memory)" Sortable="true" Filterable="true">
<Template> <Template>
<span>@(Formatter.FormatSize(context.Memory))</span> <span>@(Formatter.FormatSize(context.Container.Memory))</span>
</Template> </Template>
</Column> </Column>
<Column TableItem="ContainerStats.Container" Title="@(SmartTranslateService.Translate("Network in"))" Field="@(x => x.NetworkIn)" Sortable="true" Filterable="true"> <Column TableItem="RunningServer" Title="@(SmartTranslateService.Translate("Network in"))" Field="@(x => x.Container.NetworkIn)" Sortable="true" Filterable="true">
<Template> <Template>
<span>@(Formatter.FormatSize(context.NetworkIn))</span> <span>@(Formatter.FormatSize(context.Container.NetworkIn))</span>
</Template> </Template>
</Column> </Column>
<Column TableItem="ContainerStats.Container" Title="@(SmartTranslateService.Translate("Network out"))" Field="@(x => x.NetworkOut)" Sortable="true" Filterable="true"> <Column TableItem="RunningServer" Title="@(SmartTranslateService.Translate("Network out"))" Field="@(x => x.Container.NetworkOut)" Sortable="true" Filterable="true">
<Template> <Template>
<span>@(Formatter.FormatSize(context.NetworkOut))</span> <span>@(Formatter.FormatSize(context.Container.NetworkOut))</span>
</Template> </Template>
</Column> </Column>
<Column TableItem="ContainerStats.Container" Title="@(SmartTranslateService.Translate("Owner"))" Field="@(x => x.Name)" Sortable="false" Filterable="false"> <Column TableItem="RunningServer" Title="@(SmartTranslateService.Translate("Image"))" Field="@(x => x.Server.Image.Name)" Sortable="true" Filterable="true">
<Template> <Template>
@{ <a href="/admin/servers/images/edit/@(context.Server.Image.Id)">@(context.Server.Image.Name)</a>
var server = Containers.First(x => x.Value == context).Key; </Template>
} </Column>
<Column TableItem="RunningServer" Title="@(SmartTranslateService.Translate("Node"))" Field="@(x => x.Server.Node.Name)" Sortable="true" Filterable="true">
<a href="/admin/users/view/@(server.Owner.Id)/">@server.Owner.Email</a> <Template>
<a href="/admin/nodes/view/@(context.Server.Node.Id)">@(context.Server.Node.Name)</a>
</Template>
</Column>
<Column TableItem="RunningServer" Title="@(SmartTranslateService.Translate("Owner"))" Field="@(x => x.Server.Owner.Email)" Sortable="true" Filterable="true">
<Template>
<a href="/admin/users/view/@(context.Server.Owner.Id)/">@context.Server.Owner.Email</a>
</Template> </Template>
</Column> </Column>
<Pager ShowPageNumber="true" ShowTotalCount="true"/> <Pager ShowPageNumber="true" ShowTotalCount="true"/>
</Table> </Table>
</div> </div>
</div> </div>
</LazyLoader>
</OnlyAdmin> </OnlyAdmin>
@code @code
{ {
private LazyLoader LazyLoader; private List<RunningServer> RunningServers = new();
private bool IsRunning;
private Node? Node;
private Dictionary<Server, ContainerStats.Container> Containers = new(); protected override async Task OnAfterRenderAsync(bool firstRender)
private async Task Load(LazyLoader lazyLoader)
{ {
Containers.Clear(); if (firstRender)
foreach (var node in NodeRepository.Get().ToArray())
{ {
await lazyLoader.SetText(node.Name); await Task.Run(Scan);
}
}
private async Task Scan()
{
IsRunning = true;
RunningServers.Clear();
await InvokeAsync(StateHasChanged);
var nodes = NodeRepository.Get().ToArray();
Node = nodes.First();
foreach (var node in nodes)
{
Node = node;
await InvokeAsync(StateHasChanged);
try try
{ {
@@ -111,11 +141,19 @@
var server = ServerRepository var server = ServerRepository
.Get() .Get()
.Include(x => x.Owner) .Include(x => x.Owner)
.Include(x => x.Node)
.Include(x => x.Image)
.FirstOrDefault(x => x.Uuid == uuid); .FirstOrDefault(x => x.Uuid == uuid);
if (server != null) if (server != null)
{ {
Containers.Add(server, container); RunningServers.Add(new()
{
Server = server,
Container = container
});
await InvokeAsync(StateHasChanged);
} }
} }
} }
@@ -125,6 +163,9 @@
// ignored // ignored
} }
} }
IsRunning = false;
await InvokeAsync(StateHasChanged);
} }
private async Task StopAll() private async Task StopAll()
@@ -138,9 +179,9 @@
if (b) if (b)
{ {
foreach (var containerData in Containers) foreach (var runningServer in RunningServers)
{ {
await ServerService.SetPowerState(containerData.Key, PowerSignal.Stop); await ServerService.SetPowerState(runningServer.Server, PowerSignal.Stop);
} }
} }
} }
@@ -156,9 +197,9 @@
if (b) if (b)
{ {
foreach (var containerData in Containers) foreach (var runningServer in RunningServers)
{ {
await ServerService.SetPowerState(containerData.Key, PowerSignal.Kill); await ServerService.SetPowerState(runningServer.Server, PowerSignal.Kill);
} }
} }
} }