Added node and image view to manager. Made the data handling smoother and simpler
This commit is contained in:
10
Moonlight/App/Models/Misc/RunningServer.cs
Normal file
10
Moonlight/App/Models/Misc/RunningServer.cs
Normal 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; }
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user