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 @@