diff --git a/extensions/Servers/Proxmox/Models/Node.php b/extensions/Servers/Proxmox/Models/Node.php index 7094833cd..6d0e35d0d 100644 --- a/extensions/Servers/Proxmox/Models/Node.php +++ b/extensions/Servers/Proxmox/Models/Node.php @@ -3,6 +3,7 @@ namespace Paymenter\Extensions\Servers\Proxmox\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Cache; class Node extends Model { @@ -56,25 +57,33 @@ class Node extends Model public function resourcesAvailable() { - $servers = $this->servers()->with('service.product')->get(); + return Cache::remember('proxmox-node-resources-' . $this->id, 30, function () { + $servers = $this->servers()->with('service.product.settings')->get(); - $totalMemory = $this->memory; - $totalDisk = $this->disk; - $totalCpu = $this->cpu; - $usedMemory = 0; - $usedDisk = 0; - $usedCpu = 0; - foreach ($servers as $server) { - $usedMemory += (int) ($server->service->product->settings()->where('key', 'memory')->first()?->value ?? 0); - $usedDisk += (int) ($server->service->product->settings()->where('key', 'disk')->first()?->value ?? 0); - $usedCpu += (int) ($server->service->product->settings()->where('key', 'cpu')->first()?->value ?? 0); - } + $totalMemory = $this->memory; + $totalDisk = $this->disk; + $totalCpu = $this->cpu; + $usedMemory = 0; + $usedDisk = 0; + $usedCpu = 0; + foreach ($servers as $server) { + $productSettings = $server->service->product->settings->keyBy('key'); + $usedMemory += (int) ($productSettings->get('memory')?->value ?? 0); + $usedDisk += (int) ($productSettings->get('disk')?->value ?? 0); + $usedCpu += (int) ($productSettings->get('cpu')?->value ?? 0); + } - return [ - 'memory' => $totalMemory == 0 ? null : $totalMemory - $usedMemory, - 'disk' => $totalDisk == 0 ? null : $totalDisk - $usedDisk, - 'cpu' => $totalCpu == 0 ? null : $totalCpu - $usedCpu, - ]; + return [ + 'memory' => $totalMemory == 0 ? null : $totalMemory - $usedMemory, + 'disk' => $totalDisk == 0 ? null : $totalDisk - $usedDisk, + 'cpu' => $totalCpu == 0 ? null : $totalCpu - $usedCpu, + ]; + }); + } + + public function forgetResourceCache(): void + { + Cache::forget('proxmox-node-resources-' . $this->id); } public function canStoreServer($memory, $disk, $cpu) diff --git a/extensions/Servers/Proxmox/Proxmox.php b/extensions/Servers/Proxmox/Proxmox.php index 92571b2d0..14e669e3f 100644 --- a/extensions/Servers/Proxmox/Proxmox.php +++ b/extensions/Servers/Proxmox/Proxmox.php @@ -1040,6 +1040,7 @@ class Proxmox extends ClassServer $server->hostname = $properties['hostname']; $server->password = $password; $server->save(); + $node->forgetResourceCache(); // Update the IPs foreach ($ipv4->ips as $ip) { @@ -1162,7 +1163,9 @@ class Proxmox extends ClassServer // Release IP addresses so they can be reallocated $server->ipAddresses()->update(['server_id' => null]); // Delete server + $node = $server->node; $server->delete(); + $node->forgetResourceCache(); return true; } @@ -1193,6 +1196,7 @@ class Proxmox extends ClassServer } else { $this->syncServerSettings($server, $settings, null); } + $server->node->forgetResourceCache(); return true; }