From 4e643c3226e8ca8353e7a78cfb938d0a29de1c80 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 11 Jan 2026 06:06:20 +0100 Subject: [PATCH] refactor(ResourceLimits): make all params optional and use defaults in DB; adjust UI placeholders for clarity --- .../Project/Shared/ResourceLimits.php | 123 +++++++++++------- .../project/shared/resource-limits.blade.php | 10 +- 2 files changed, 82 insertions(+), 51 deletions(-) diff --git a/app/Livewire/Project/Shared/ResourceLimits.php b/app/Livewire/Project/Shared/ResourceLimits.php index e03934845..e1e89c140 100644 --- a/app/Livewire/Project/Shared/ResourceLimits.php +++ b/app/Livewire/Project/Shared/ResourceLimits.php @@ -9,28 +9,30 @@ class ResourceLimits extends Component { use AuthorizesRequests; - public $resource; + // Default values for resource limits + private const DEFAULT_CPU_LIMIT = 0.0; + private const DEFAULT_CPU_SET = '0'; + private const DEFAULT_CPU_SHARES = 1024; + private const DEFAULT_MEMORY_SWAPPINESS = 60; + private const DEFAULT_MEMORY_LIMIT = '0'; + private const DEFAULT_MEMORY_SWAP = '0'; + private const DEFAULT_MEMORY_RESERVATION = '0'; - // Explicit properties - public ?string $limitsCpus = null; + public mixed $resource; + public ?float $limitsCpus = null; public ?string $limitsCpuset = null; - public ?int $limitsCpuShares = null; - - public string $limitsMemory; - - public string $limitsMemorySwap; - - public int $limitsMemorySwappiness; - - public string $limitsMemoryReservation; + public ?string $limitsMemory = null; + public ?string $limitsMemorySwap = null; + public ?int $limitsMemorySwappiness = null; + public ?string $limitsMemoryReservation = null; protected $rules = [ - 'limitsMemory' => 'required|string', - 'limitsMemorySwap' => 'required|string', - 'limitsMemorySwappiness' => 'required|integer|min:0|max:100', - 'limitsMemoryReservation' => 'required|string', + 'limitsMemory' => 'nullable|string', + 'limitsMemorySwap' => 'nullable|string', + 'limitsMemorySwappiness' => 'nullable|integer|min:0|max:100', + 'limitsMemoryReservation' => 'nullable|string', 'limitsCpus' => 'nullable|numeric|min:0|max:1024', 'limitsCpuset' => 'nullable|string', 'limitsCpuShares' => 'nullable|integer|min:0|max:8192', @@ -51,7 +53,7 @@ class ResourceLimits extends Component * * @param bool $toModel If true, sync FROM properties TO model. If false, sync FROM model TO properties. */ - private function syncData(bool $toModel = false): void + private function syncData(bool $toModel): void { if ($toModel) { // Sync TO model (before save) @@ -62,58 +64,87 @@ class ResourceLimits extends Component $this->resource->limits_memory_swap = $this->limitsMemorySwap; $this->resource->limits_memory_swappiness = $this->limitsMemorySwappiness; $this->resource->limits_memory_reservation = $this->limitsMemoryReservation; - } else { - // Sync FROM model (on load/refresh) - $this->limitsCpus = $this->resource->limits_cpus; - $this->limitsCpuset = $this->resource->limits_cpuset; - $this->limitsCpuShares = $this->resource->limits_cpu_shares; - $this->limitsMemory = $this->resource->limits_memory; - $this->limitsMemorySwap = $this->resource->limits_memory_swap; - $this->limitsMemorySwappiness = $this->resource->limits_memory_swappiness; - $this->limitsMemoryReservation = $this->resource->limits_memory_reservation; + + return; + } + + // Sync FROM model (on load/refresh) + $this->limitsCpus = $this->resource->limits_cpus; + $this->limitsCpuset = $this->resource->limits_cpuset; + $this->limitsCpuShares = $this->resource->limits_cpu_shares; + $this->limitsMemory = $this->resource->limits_memory; + $this->limitsMemorySwap = $this->resource->limits_memory_swap; + $this->limitsMemorySwappiness = $this->resource->limits_memory_swappiness; + $this->limitsMemoryReservation = $this->resource->limits_memory_reservation; + + // Convert default values to null so UI shows placeholders instead of defaults + if ($this->limitsCpus === self::DEFAULT_CPU_LIMIT) { + $this->limitsCpus = null; + } + if ($this->limitsCpuset === self::DEFAULT_CPU_SET) { + $this->limitsCpuset = null; + } + if ($this->limitsCpuShares === self::DEFAULT_CPU_SHARES) { + $this->limitsCpuShares = null; + } + if ($this->limitsMemorySwappiness === self::DEFAULT_MEMORY_SWAPPINESS) { + $this->limitsMemorySwappiness = null; + } + if ($this->limitsMemory === self::DEFAULT_MEMORY_LIMIT) { + $this->limitsMemory = null; + } + if ($this->limitsMemorySwap === self::DEFAULT_MEMORY_SWAP) { + $this->limitsMemorySwap = null; + } + if ($this->limitsMemoryReservation === self::DEFAULT_MEMORY_RESERVATION) { + $this->limitsMemoryReservation = null; } } - public function mount() + public function mount(): void { - $this->syncData(false); + $this->syncData(toModel: false); } - public function submit() + public function submit(): void { try { $this->authorize('update', $this->resource); - // Apply default values to properties - if (!$this->limitsMemory) { - $this->limitsMemory = '0'; + // Apply defaults for empty fields + if (empty($this->limitsMemory)) { + $this->limitsMemory = self::DEFAULT_MEMORY_LIMIT; } - if (!$this->limitsMemorySwap) { - $this->limitsMemorySwap = '0'; + if (empty($this->limitsMemorySwap)) { + $this->limitsMemorySwap = self::DEFAULT_MEMORY_SWAP; } - if (is_null($this->limitsMemorySwappiness)) { - $this->limitsMemorySwappiness = 60; + if (empty($this->limitsMemoryReservation)) { + $this->limitsMemoryReservation = self::DEFAULT_MEMORY_RESERVATION; } - if (!$this->limitsMemoryReservation) { - $this->limitsMemoryReservation = '0'; + if ($this->limitsCpus === null) { + $this->limitsCpus = self::DEFAULT_CPU_LIMIT; } - if (!$this->limitsCpus) { - $this->limitsCpus = '0'; + if (empty($this->limitsCpuset)) { + $this->limitsCpuset = self::DEFAULT_CPU_SET; } - if ($this->limitsCpuset === '') { - $this->limitsCpuset = null; + if ($this->limitsCpuShares === null) { + $this->limitsCpuShares = self::DEFAULT_CPU_SHARES; } - if (is_null($this->limitsCpuShares)) { - $this->limitsCpuShares = 1024; + if ($this->limitsMemorySwappiness === null) { + $this->limitsMemorySwappiness = self::DEFAULT_MEMORY_SWAPPINESS; } $this->validate(); - $this->syncData(true); + $this->syncData(toModel: true); $this->resource->save(); + + // Reload from model to convert defaults back to null for placeholder display + $this->syncData(toModel: false); + $this->dispatch('success', 'Resource limits updated.'); } catch (\Throwable $e) { - return handleError($e, $this); + handleError($e, $this); } } } diff --git a/resources/views/livewire/project/shared/resource-limits.blade.php b/resources/views/livewire/project/shared/resource-limits.blade.php index b88d1edee..01707218b 100644 --- a/resources/views/livewire/project/shared/resource-limits.blade.php +++ b/resources/views/livewire/project/shared/resource-limits.blade.php @@ -11,7 +11,7 @@
@@ -34,7 +34,7 @@
- @@ -74,7 +74,7 @@