diff --git a/app/Enums/ServerResourceType.php b/app/Enums/ServerResourceType.php index 0d15dd806..35d3abd2c 100644 --- a/app/Enums/ServerResourceType.php +++ b/app/Enums/ServerResourceType.php @@ -2,9 +2,50 @@ namespace App\Enums; -enum ServerResourceType +use App\Models\Server; + +enum ServerResourceType: string { - case Unit; - case Percentage; - case Time; + case Uptime = 'uptime'; + case CPU = 'cpu_absolute'; + case Memory = 'memory_bytes'; + case Disk = 'disk_bytes'; + + case CPULimit = 'cpu'; + case MemoryLimit = 'memory'; + case DiskLimit = 'disk'; + + /** + * @return int resource amount in bytes + */ + public function getResourceAmount(Server $server): int + { + if ($this->isLimit()) { + $resourceAmount = $server->{$this->value} ?? 0; + + if (!$this->isPercentage()) { + // Our limits are entered as MiB/ MB so we need to convert them to bytes + $resourceAmount *= config('panel.use_binary_prefix') ? 1024 * 1024 : 1000 * 1000; + } + + return $resourceAmount; + } + + return $server->retrieveResources()[$this->value] ?? 0; + } + + public function isLimit(): bool + { + return $this === ServerResourceType::CPULimit || $this === ServerResourceType::MemoryLimit || $this === ServerResourceType::DiskLimit; + } + + public function isTime(): bool + { + return $this === ServerResourceType::Uptime; + } + + public function isPercentage(): bool + { + return $this === ServerResourceType::CPU || $this === ServerResourceType::CPULimit; + } } diff --git a/app/Enums/ServerState.php b/app/Enums/ServerState.php index 9ada541ad..e036bb922 100644 --- a/app/Enums/ServerState.php +++ b/app/Enums/ServerState.php @@ -8,7 +8,6 @@ use Filament\Support\Contracts\HasLabel; enum ServerState: string implements HasColor, HasIcon, HasLabel { - case Normal = 'normal'; case Installing = 'installing'; case InstallFailed = 'install_failed'; case ReinstallFailed = 'reinstall_failed'; @@ -18,7 +17,6 @@ enum ServerState: string implements HasColor, HasIcon, HasLabel public function getIcon(): string { return match ($this) { - self::Normal => 'tabler-heart', self::Installing => 'tabler-heart-bolt', self::InstallFailed => 'tabler-heart-x', self::ReinstallFailed => 'tabler-heart-x', @@ -31,14 +29,13 @@ enum ServerState: string implements HasColor, HasIcon, HasLabel { if ($hex) { return match ($this) { - self::Normal, self::Installing, self::RestoringBackup => '#2563EB', + self::Installing, self::RestoringBackup => '#2563EB', self::Suspended => '#D97706', self::InstallFailed, self::ReinstallFailed => '#EF4444', }; } return match ($this) { - self::Normal => 'primary', self::Installing => 'primary', self::InstallFailed => 'danger', self::ReinstallFailed => 'danger', diff --git a/app/Filament/App/Resources/ServerResource/Pages/ListServers.php b/app/Filament/App/Resources/ServerResource/Pages/ListServers.php index ce512f94c..e64300842 100644 --- a/app/Filament/App/Resources/ServerResource/Pages/ListServers.php +++ b/app/Filament/App/Resources/ServerResource/Pages/ListServers.php @@ -63,7 +63,7 @@ class ListServers extends ListRecords TextColumn::make('condition') ->label('Status') ->badge() - ->tooltip(fn (Server $server) => $server->formatResource('uptime', type: ServerResourceType::Time)) + ->tooltip(fn (Server $server) => $server->formatResource(ServerResourceType::Uptime)) ->icon(fn (Server $server) => $server->condition->getIcon()) ->color(fn (Server $server) => $server->condition->getColor()), TextColumn::make('name') @@ -80,20 +80,20 @@ class ListServers extends ListRecords TextColumn::make('cpuUsage') ->label('Resources') ->icon('tabler-cpu') - ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource('cpu', limit: true, type: ServerResourceType::Percentage, precision: 0)) - ->state(fn (Server $server) => $server->formatResource('cpu_absolute', type: ServerResourceType::Percentage)) + ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource(ServerResourceType::CPULimit)) + ->state(fn (Server $server) => $server->formatResource(ServerResourceType::CPU)) ->color(fn (Server $server) => $this->getResourceColor($server, 'cpu')), TextColumn::make('memoryUsage') ->label('') ->icon('tabler-device-desktop-analytics') - ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource('memory', limit: true)) - ->state(fn (Server $server) => $server->formatResource('memory_bytes')) + ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource(ServerResourceType::MemoryLimit)) + ->state(fn (Server $server) => $server->formatResource(ServerResourceType::Memory)) ->color(fn (Server $server) => $this->getResourceColor($server, 'memory')), TextColumn::make('diskUsage') ->label('') ->icon('tabler-device-sd-card') - ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource('disk', limit: true)) - ->state(fn (Server $server) => $server->formatResource('disk_bytes')) + ->tooltip(fn (Server $server) => 'Usage Limit: ' . $server->formatResource(ServerResourceType::DiskLimit)) + ->state(fn (Server $server) => $server->formatResource(ServerResourceType::Disk)) ->color(fn (Server $server) => $this->getResourceColor($server, 'disk')), ]; } diff --git a/app/Livewire/ServerEntry.php b/app/Livewire/ServerEntry.php index 958c6bbbc..12097890b 100644 --- a/app/Livewire/ServerEntry.php +++ b/app/Livewire/ServerEntry.php @@ -24,32 +24,35 @@ class ServerEntry extends Component style="background-color: #D97706;"> -
CPU
{{ Number::format(0, precision: 2, locale: auth()->user()->language ?? 'en') . '%' }}
{{ $server->formatResource('cpu', type: \App\Enums\ServerResourceType::Percentage, limit: true) }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::CPULimit) }}
Memory
{{ convert_bytes_to_readable(0, decimals: 2) }}
{{ $server->formatResource('memory', limit: true) }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::MemoryLimit) }}
Disk
{{ convert_bytes_to_readable(0, decimals: 2) }}
{{ $server->formatResource('disk', limit: true) }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::DiskLimit) }}
Network
diff --git a/app/Models/Server.php b/app/Models/Server.php index 58ad0e089..7c1c2205a 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -462,17 +462,15 @@ class Server extends Model implements Validatable }); } - public function formatResource(string $resourceKey, bool $limit = false, ServerResourceType $type = ServerResourceType::Unit, int $precision = 2): string + public function formatResource(ServerResourceType $resourceType): string { - $resourceAmount = $this->{$resourceKey} ?? 0; - if (!$limit) { - $resourceAmount = $this->retrieveResources()[$resourceKey] ?? 0; - } + $resourceAmount = $resourceType->getResourceAmount($this); - if ($type === ServerResourceType::Time) { - if ($this->isSuspended()) { - return 'Suspended'; + if ($resourceType->isTime()) { + if (!is_null($this->status)) { + return $this->status->getLabel(); } + if ($resourceAmount === 0) { return ContainerStatus::Offline->getLabel(); } @@ -480,20 +478,16 @@ class Server extends Model implements Validatable return now()->subMillis($resourceAmount)->diffForHumans(syntax: CarbonInterface::DIFF_ABSOLUTE, short: true, parts: 4); } - if ($resourceAmount === 0 & $limit) { + if ($resourceAmount === 0 & $resourceType->isLimit()) { + // Unlimited symbol return "\u{221E}"; } - if ($type === ServerResourceType::Percentage) { - return Number::format($resourceAmount, precision: $precision, locale: auth()->user()->language ?? 'en') . '%'; + if ($resourceType->isPercentage()) { + return Number::format($resourceAmount, precision: 2, locale: auth()->user()->language ?? 'en') . '%'; } - // Our current limits are set in MB - if ($limit) { - $resourceAmount *= 2 ** 20; - } - - return convert_bytes_to_readable($resourceAmount, decimals: $precision, base: 3); + return convert_bytes_to_readable($resourceAmount, base: 3); } public function condition(): Attribute diff --git a/resources/views/livewire/server-entry.blade.php b/resources/views/livewire/server-entry.blade.php index 2376a9e30..db53f6364 100644 --- a/resources/views/livewire/server-entry.blade.php +++ b/resources/views/livewire/server-entry.blade.php @@ -17,7 +17,7 @@CPU
-{{ $server->formatResource('cpu_absolute', type: \App\Enums\ServerResourceType::Percentage) }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::CPU) }}
{{ $server->formatResource('cpu', limit: true, type: \App\Enums\ServerResourceType::Percentage) }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::CPULimit) }}
Memory
-{{ $server->formatResource('memory_bytes') }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::Memory) }}
{{ $server->formatResource('memory', limit: true) }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::MemoryLimit) }}
Disk
-{{ $server->formatResource('disk_bytes') }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::Disk) }}
{{ $server->formatResource('disk', limit: true) }}
+{{ $server->formatResource(\App\Enums\ServerResourceType::DiskLimit) }}
Network