diff --git a/app/Filament/Resources/ServerResource.php b/app/Filament/Resources/ServerResource.php index 96d3708ee..bfb2ae7a1 100644 --- a/app/Filament/Resources/ServerResource.php +++ b/app/Filament/Resources/ServerResource.php @@ -2,6 +2,8 @@ namespace App\Filament\Resources; +use App\Enums\ContainerStatus; +use App\Enums\ServerState; use App\Filament\Resources\ServerResource\Pages; use App\Models\Allocation; use App\Models\Egg; @@ -511,6 +513,40 @@ class ServerResource extends Resource return $table ->searchable(false) ->columns([ + Tables\Columns\TextColumn::make('status') + ->default('unknown') + ->badge() + ->default(function (Server $server) { + if ($server->status !== null) { + return $server->status; + } + + $statuses = collect($server->retrieveStatus()) + ->mapWithKeys(function ($status) { + return [$status['configuration']['uuid'] => $status['state']]; + })->all(); + + return $statuses[$server->uuid] ?? 'node_fail'; + }) + ->icon(fn ($state) => match ($state) { + 'node_fail' => 'tabler-server-off', + 'running' => 'tabler-heartbeat', + 'removing' => 'tabler-heart-x', + 'offline' => 'tabler-heart-off', + 'paused' => 'tabler-heart-pause', + 'installing' => 'tabler-heart-bolt', + 'suspended' => 'tabler-heart-cancel', + default => 'tabler-heart-question', + }) + ->color(fn (string $state): string => match ($state) { + 'running' => 'success', + 'installing', 'restarting' => 'primary', + 'paused', 'removing' => 'warning', + 'node_fail', 'install_failed', 'suspended' => 'danger', + default => 'gray', + }) + , + Tables\Columns\TextColumn::make('uuid') ->hidden() ->label('UUID') diff --git a/app/Models/Node.php b/app/Models/Node.php index e3dc97b41..1402547f8 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Exceptions\Service\HasActiveServersException; use App\Repositories\Daemon\DaemonConfigurationRepository; use Exception; +use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; use Symfony\Component\Yaml\Yaml; use Illuminate\Notifications\Notifiable; @@ -288,4 +289,17 @@ class Node extends Model } }); } + + public function serverStatuses(): array + { + try { + /** @var \Illuminate\Http\Client\Response $response */ + $response = Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/servers'); + $statuses = $response->json(); + } catch (Exception) { + $statuses = []; + } + + return cache()->remember("nodes.$this->id.servers", now()->addSeconds(2), fn () => $statuses); + } } diff --git a/app/Models/Server.php b/app/Models/Server.php index e6896d16d..cb125f880 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -394,4 +394,9 @@ class Server extends Model throw new DaemonConnectionException($exception); } } + + public function retrieveStatus() + { + return $this->node->serverStatuses(); + } }