diff --git a/app/Filament/Resources/ServerResource/Pages/ListServers.php b/app/Filament/Resources/ServerResource/Pages/ListServers.php index 8cd1eac86..bdb2673ac 100644 --- a/app/Filament/Resources/ServerResource/Pages/ListServers.php +++ b/app/Filament/Resources/ServerResource/Pages/ListServers.php @@ -27,12 +27,7 @@ class ListServers extends ListRecords return $server->status; } - $statuses = collect($server->retrieveStatus()) - ->mapWithKeys(function ($status) { - return [$status['configuration']['uuid'] => $status['state']]; - })->all(); - - return $statuses[$server->uuid] ?? 'node_fail'; + return $server->retrieveStatus() ?? 'node_fail'; }) ->icon(fn ($state) => match ($state) { 'node_fail' => 'tabler-server-off', diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php b/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php new file mode 100644 index 000000000..284a66eb5 --- /dev/null +++ b/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php @@ -0,0 +1,23 @@ +json()->all())->get('data.new_state'); + + cache()->set("servers.$server->uuid.container.status", $status, now()->addMinute()); + + return new JsonResponse([]); + } +} diff --git a/app/Models/Node.php b/app/Models/Node.php index 44398f0fc..124bc33ba 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -292,13 +292,19 @@ class Node extends Model public function serverStatuses(): array { - return cache()->remember("nodes.$this->id.servers", now()->addMinute(), function () { - try { - return Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/servers')->json() ?? []; - } catch (Exception) { - return []; - } - }); + $statuses = []; + try { + $statuses = Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/servers')->json() ?? []; + } catch (Exception $exception) { + report($exception); + } + + foreach ($statuses as $status) { + $uuid = fluent($status)->get('configuration.uuid'); + cache()->remember("servers.$uuid.container.status", now()->addMinute(), fn() => fluent($status)->get('state')); + } + + return $statuses; } public function ipAddresses(): array diff --git a/app/Models/Server.php b/app/Models/Server.php index 0aacf3ad4..a044709c2 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -395,8 +395,16 @@ class Server extends Model } } - public function retrieveStatus() + public function retrieveStatus(): string { - return $this->node->serverStatuses(); + $status = cache()->get("servers.$this->uuid.container.status"); + + if ($status) { + return $status; + } + + $this->node->serverStatuses(); + + return cache()->get("servers.$this->uuid.container.status") ?? 'missing'; } } diff --git a/routes/api-remote.php b/routes/api-remote.php index d7b63c097..d2c9a893d 100644 --- a/routes/api-remote.php +++ b/routes/api-remote.php @@ -19,6 +19,8 @@ Route::prefix('/servers/{server:uuid}')->group(function () { Route::get('/transfer/success', [Remote\Servers\ServerTransferController::class, 'success']); Route::post('/transfer/failure', [Remote\Servers\ServerTransferController::class, 'failure']); Route::post('/transfer/success', [Remote\Servers\ServerTransferController::class, 'success']); + + Route::post('/container/status', [Remote\Servers\ServerContainersController::class, 'status']); }); Route::prefix('/backups')->group(function () {