From 892961d28c97f96f406422cb21c7b82a0c12c229 Mon Sep 17 00:00:00 2001 From: "Joseph.Rawlings" Date: Wed, 24 Dec 2025 09:54:17 -0500 Subject: [PATCH] feat: enhance VM status loading with retry logic and improved error handling --- .../Servers/Proxmox/Livewire/Component.php | 26 ++++++++-- .../Servers/Proxmox/Livewire/Server.php | 29 ++++++++++- .../Servers/Proxmox/Livewire/Statistics.php | 9 ++++ .../Servers/Proxmox/views/server.blade.php | 33 ++++++++++++ .../Proxmox/views/statistics.blade.php | 52 +++++++++++++++---- 5 files changed, 134 insertions(+), 15 deletions(-) diff --git a/extensions/Servers/Proxmox/Livewire/Component.php b/extensions/Servers/Proxmox/Livewire/Component.php index 32997a9c1..c4edb564d 100644 --- a/extensions/Servers/Proxmox/Livewire/Component.php +++ b/extensions/Servers/Proxmox/Livewire/Component.php @@ -259,12 +259,30 @@ class Component extends BaseComponent { try { $proxmox = new Proxmox; - $data = $proxmox->request( + $response = $proxmox->request( '/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/status/current' - )->json()['data'] ?? null; - - $this->status = $data ? (object) $data : null; + ); + + if ($response->successful()) { + $data = $response->json()['data'] ?? null; + $this->status = $data ? (object) $data : null; + } else { + \Log::warning('Failed to load VM status for server ' . $this->server->id, [ + 'server_id' => $this->server->id, + 'vm_id' => $this->server->vm_id, + 'node' => $this->server->node->name, + 'status_code' => $response->status(), + 'response' => $response->json(), + ]); + $this->status = null; + } } catch (\Throwable $e) { + \Log::error('Exception loading VM status for server ' . $this->server->id, [ + 'server_id' => $this->server->id, + 'vm_id' => $this->server->vm_id, + 'node' => $this->server->node->name ?? 'unknown', + 'error' => $e->getMessage(), + ]); $this->status = null; } } diff --git a/extensions/Servers/Proxmox/Livewire/Server.php b/extensions/Servers/Proxmox/Livewire/Server.php index e62ca7f63..a16107d76 100644 --- a/extensions/Servers/Proxmox/Livewire/Server.php +++ b/extensions/Servers/Proxmox/Livewire/Server.php @@ -4,17 +4,30 @@ namespace Paymenter\Extensions\Servers\Proxmox\Livewire; use Paymenter\Extensions\Servers\Proxmox\Models\Server as ServerModel; use Paymenter\Extensions\Servers\Proxmox\Models\ServerStatistics; +use Paymenter\Extensions\Servers\Proxmox\Proxmox; use Carbon\Carbon; use Illuminate\Support\Facades\Cache; class Server extends Component { + protected int $maxRetries = 3; + public function mount(ServerModel $server): void { parent::mount($server); - // Check and enforce bandwidth throttling if exceeded - $this->checkAndEnforceBandwidthLimit(); + // Retry loading VM status if initial load failed + $retries = 0; + while ($this->status === null && $retries < $this->maxRetries) { + usleep(100000); // 100ms delay between retries + $this->loadVmStatus(); + $retries++; + } + + // Check and enforce bandwidth throttling if exceeded (only if status loaded) + if ($this->status !== null) { + $this->checkAndEnforceBandwidthLimit(); + } } public function getMonthlyTrafficProperty() @@ -162,6 +175,18 @@ class Server extends Component } } + public function retryLoadStatus(): void + { + $retries = 0; + while ($this->status === null && $retries < $this->maxRetries) { + $this->loadVmStatus(); + if ($this->status === null) { + usleep(200000); // 200ms delay between retries + } + $retries++; + } + } + public function render() { return view('proxmox::server'); diff --git a/extensions/Servers/Proxmox/Livewire/Statistics.php b/extensions/Servers/Proxmox/Livewire/Statistics.php index 9de9d690a..df66a6baa 100644 --- a/extensions/Servers/Proxmox/Livewire/Statistics.php +++ b/extensions/Servers/Proxmox/Livewire/Statistics.php @@ -151,6 +151,15 @@ class Statistics extends Component public function mount(Server $server): void { parent::mount($server); + + // Retry loading VM status if initial load failed (important for chart rendering) + $retries = 0; + while ($this->status === null && $retries < 3) { + usleep(100000); // 100ms delay between retries + $this->loadVmStatus(); + $retries++; + } + $this->server->loadMissing('ipAddresses'); // Network Analysis is loaded lazily via JavaScript to improve page load speed // Initialize error state if not configured to prevent infinite loading diff --git a/extensions/Servers/Proxmox/views/server.blade.php b/extensions/Servers/Proxmox/views/server.blade.php index c766394f0..e7484f111 100644 --- a/extensions/Servers/Proxmox/views/server.blade.php +++ b/extensions/Servers/Proxmox/views/server.blade.php @@ -1,4 +1,36 @@
+ @if(!$status) + {{-- Show loading placeholder if status is not yet loaded --}} +
+
+
+
+ +
+ {{ $server->service->product->name ?? 'Server' }} +
+
+
+ +
+ Loading... +
+
+
+
+ IPv4 Address + {{ $server->primaryIpv4->ip ?? 'None' }} +
+
+ IPv6 Address + {{ $server->primaryIpv6->ip ?? 'None' }} +
+
+
+
Unable to fetch server status from Proxmox.
+
+
+ @else
@@ -169,4 +201,5 @@
+ @endif diff --git a/extensions/Servers/Proxmox/views/statistics.blade.php b/extensions/Servers/Proxmox/views/statistics.blade.php index 31088fc20..d60ddcca0 100644 --- a/extensions/Servers/Proxmox/views/statistics.blade.php +++ b/extensions/Servers/Proxmox/views/statistics.blade.php @@ -2,7 +2,7 @@ @once @endonce -
+