diff --git a/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php b/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php index f00c8d667..7a16fab01 100644 --- a/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php +++ b/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php @@ -24,8 +24,8 @@ class NodeDeploymentController extends ApplicationApiController $data = $request->validated(); $nodes = $this->viableNodesService->handle( - $data['disk'] ?? 0, $data['memory'] ?? 0, + $data['disk'] ?? 0, $data['cpu'] ?? 0, $data['tags'] ?? $data['location_ids'] ?? [], ); diff --git a/app/Models/Node.php b/app/Models/Node.php index c693c5b0d..8f1c42bdb 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -63,10 +63,6 @@ class Node extends Model */ protected $hidden = ['daemon_token_id', 'daemon_token']; - public int $sum_memory; - public int $sum_disk; - public int $sum_cpu; - /** * Fields that are mass assignable. */ @@ -250,11 +246,28 @@ class Node extends Model */ public function isViable(int $memory, int $disk, int $cpu): bool { - $memoryLimit = $this->memory * (1 + ($this->memory_overallocate / 100)); - $diskLimit = $this->disk * (1 + ($this->disk_overallocate / 100)); - $cpuLimit = $this->cpu * (1 + ($this->cpu_overallocate / 100)); + if ($this->memory_overallocate >= 0) { + $memoryLimit = $this->memory * (1 + ($this->memory_overallocate / 100)); + if ($this->servers_sum_memory + $memory > $memoryLimit) { + return false; + } + } - return ($this->sum_memory + $memory) <= $memoryLimit && ($this->sum_disk + $disk) <= $diskLimit && ($this->sum_cpu + $cpu) <= $cpuLimit; + if ($this->disk_overallocate >= 0) { + $diskLimit = $this->disk * (1 + ($this->disk_overallocate / 100)); + if ($this->servers_sum_disk + $disk > $diskLimit) { + return false; + } + } + + if ($this->cpu_overallocate >= 0) { + $cpuLimit = $this->cpu * (1 + ($this->cpu_overallocate / 100)); + if ($this->servers_sum_cpu + $cpu > $cpuLimit) { + return false; + } + } + + return true; } public static function getForServerCreation() diff --git a/app/Services/Deployment/FindViableNodesService.php b/app/Services/Deployment/FindViableNodesService.php index 9a51d1c6f..4cffc71d2 100644 --- a/app/Services/Deployment/FindViableNodesService.php +++ b/app/Services/Deployment/FindViableNodesService.php @@ -17,19 +17,17 @@ class FindViableNodesService * are tossed out, as are any nodes marked as non-public, meaning automatic * deployments should not be done against them. */ - public function handle(int $disk = 0, int $memory = 0, int $cpu = 0, $tags = []): Collection + public function handle(int $memory = 0, int $disk = 0, int $cpu = 0, $tags = []): Collection { $nodes = Node::query() - ->withSum('servers', 'disk') ->withSum('servers', 'memory') + ->withSum('servers', 'disk') ->withSum('servers', 'cpu') ->where('public', true) ->get(); return $nodes ->filter(fn (Node $node) => !$tags || collect($node->tags)->intersect($tags)) - ->filter(fn (Node $node) => $node->servers_sum_disk + $disk <= $node->disk * (1 + $node->disk_overallocate / 100)) - ->filter(fn (Node $node) => $node->servers_sum_memory + $memory <= $node->memory * (1 + $node->memory_overallocate / 100)) - ->filter(fn (Node $node) => $node->servers_sum_cpu + $cpu <= $node->cpu * (1 + $node->cpu_overallocate / 100)); + ->filter(fn (Node $node) => $node->isViable($memory, $disk, $cpu)); } } diff --git a/app/Services/Servers/ServerCreationService.php b/app/Services/Servers/ServerCreationService.php index 8953b1325..57d8ad086 100644 --- a/app/Services/Servers/ServerCreationService.php +++ b/app/Services/Servers/ServerCreationService.php @@ -109,8 +109,8 @@ class ServerCreationService { /** @var Collection<\App\Models\Node> $nodes */ $nodes = $this->findViableNodesService->handle( - Arr::get($data, 'disk', 0), Arr::get($data, 'memory', 0), + Arr::get($data, 'disk', 0), Arr::get($data, 'cpu', 0), Arr::get($data, 'tags', []), ); diff --git a/app/Services/Servers/TransferServerService.php b/app/Services/Servers/TransferServerService.php index 2cc34db70..72bac7dda 100644 --- a/app/Services/Servers/TransferServerService.php +++ b/app/Services/Servers/TransferServerService.php @@ -58,7 +58,9 @@ class TransferServerService // Check if the node is viable for the transfer. $node = Node::query() ->select(['nodes.id', 'nodes.fqdn', 'nodes.scheme', 'nodes.daemon_token', 'nodes.daemon_listen', 'nodes.memory', 'nodes.disk', 'nodes.cpu', 'nodes.memory_overallocate', 'nodes.disk_overallocate', 'nodes.cpu_overallocate']) - ->selectRaw('IFNULL(SUM(servers.memory), 0) as sum_memory, IFNULL(SUM(servers.disk), 0) as sum_disk, IFNULL(SUM(servers.cpu), 0) as sum_cpu') + ->withSum('servers', 'disk') + ->withSum('servers', 'memory') + ->withSum('servers', 'cpu') ->leftJoin('servers', 'servers.node_id', '=', 'nodes.id') ->where('nodes.id', $node_id) ->first();