From 73e64d9052f3aba94358d6d9295a83cc58fba8d6 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 14 Feb 2024 15:00:24 +0100 Subject: [PATCH] fix: file volume creation fix: network_mode host compose --- app/Livewire/Project/Service/FileStorage.php | 2 +- app/Models/LocalFileVolume.php | 32 ++++++--- bootstrap/helpers/shared.php | 69 +++++++++++--------- 3 files changed, 60 insertions(+), 43 deletions(-) diff --git a/app/Livewire/Project/Service/FileStorage.php b/app/Livewire/Project/Service/FileStorage.php index ab7736c97..da85a1a6e 100644 --- a/app/Livewire/Project/Service/FileStorage.php +++ b/app/Livewire/Project/Service/FileStorage.php @@ -41,7 +41,7 @@ class FileStorage extends Component $this->fileStorage->content = null; } $this->fileStorage->save(); - $this->fileStorage->saveStorageOnServer($this->service); + $this->fileStorage->saveStorageOnServer(); $this->dispatch('success', 'File updated successfully.'); } catch (\Throwable $e) { $this->fileStorage->setRawAttributes($original); diff --git a/app/Models/LocalFileVolume.php b/app/Models/LocalFileVolume.php index 27ce5c5b5..76a15f655 100644 --- a/app/Models/LocalFileVolume.php +++ b/app/Models/LocalFileVolume.php @@ -13,23 +13,34 @@ class LocalFileVolume extends BaseModel protected static function booted() { static::created(function (LocalFileVolume $fileVolume) { - $fileVolume->saveStorageOnServer($fileVolume->service); + $fileVolume->load(['service']); + $fileVolume->saveStorageOnServer(); }); } public function service() { return $this->morphTo('resource'); } - public function saveStorageOnServer(ServiceApplication|ServiceDatabase $service) + public function saveStorageOnServer() { - $workdir = $service->service->workdir(); - $server = $service->service->server; + $workdir = $this->resource->service->workdir(); + $server = $this->resource->service->server; $commands = collect([ "mkdir -p $workdir > /dev/null 2>&1 || true", "cd $workdir" ]); + $is_directory = $this->is_directory; + if ($is_directory) { + $commands->push("mkdir -p $this->fs_path > /dev/null 2>&1 || true"); + } + if (str($this->fs_path)->startsWith('.') || str($this->fs_path)->startsWith('/') || str($this->fs_path)->startsWith('~')) { + $parent_dir = str($this->fs_path)->beforeLast('/'); + if ($parent_dir != '') { + $commands->push("mkdir -p $parent_dir > /dev/null 2>&1 || true"); + } + } $fileVolume = $this; - $path = Str::of(data_get($fileVolume, 'fs_path')); + $path = str(data_get($fileVolume, 'fs_path')); $content = data_get($fileVolume, 'content'); if ($path->startsWith('.')) { $path = $path->after('.'); @@ -38,17 +49,18 @@ class LocalFileVolume extends BaseModel $isFile = instant_remote_process(["test -f $path && echo OK || echo NOK"], $server); $isDir = instant_remote_process(["test -d $path && echo OK || echo NOK"], $server); if ($isFile == 'OK' && $fileVolume->is_directory) { - throw new \Exception("File $path is a file on the server, but you are trying to mark it as a directory. Please delete the file on the server or mark it as directory."); + throw new \Exception("The following file is a file on the server, but you are trying to mark it as a directory. Please delete the file on the server or mark it as directory."); } else if ($isDir == 'OK' && !$fileVolume->is_directory) { - throw new \Exception("File $path is a directory on the server, but you are trying to mark it as a file. Please delete the directory on the server or mark it as directory."); + throw new \Exception("The following file is a directory on the server, but you are trying to mark it as a file.

Please delete the directory on the server or mark it as directory."); } if (!$fileVolume->is_directory && $isDir == 'NOK') { - $content = base64_encode($content); - $commands->push("echo '$content' | base64 -d > $path"); + if ($content) { + $content = base64_encode($content); + $commands->push("echo '$content' | base64 -d > $path"); + } } else if ($isDir == 'NOK' && $fileVolume->is_directory) { $commands->push("mkdir -p $path > /dev/null 2>&1 || true"); } - ray($commands->toArray()); return instant_remote_process($commands, $server); } } diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 6ebf2efda..9ab26e59a 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -125,6 +125,9 @@ function handleError(?Throwable $error = null, ?Livewire\Component $livewire = n } if (isset($livewire)) { + if (str($message)->length() > 20) { + return $livewire->dispatch('error', 'Error occured', $message); + } return $livewire->dispatch('error', $message); } throw new Exception($message); @@ -527,10 +530,10 @@ function getTopLevelNetworks(Service|Application $resource) $definedNetwork = collect([$resource->uuid]); $services = collect($services)->map(function ($service, $_) use ($topLevelNetworks, $definedNetwork) { $serviceNetworks = collect(data_get($service, 'networks', [])); - $hasNetworkMode = data_get($service, 'network_mode'); + $hasHostNetworkMode = data_get($service, 'network_mode') === 'host' ? true : false; - // Only add 'networks' key if 'network_mode' is absent - if (!$hasNetworkMode) { + // Only add 'networks' key if 'network_mode' is not 'host' + if (!$hasHostNetworkMode) { // Collect/create/update networks if ($serviceNetworks->count() > 0) { foreach ($serviceNetworks as $networkName => $networkDetails) { @@ -632,6 +635,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal $serviceNetworks = collect(data_get($service, 'networks', [])); $serviceVariables = collect(data_get($service, 'environment', [])); $serviceLabels = collect(data_get($service, 'labels', [])); + $hasHostNetworkMode = data_get($service, 'network_mode') === 'host' ? true : false; if ($serviceLabels->count() > 0) { $removedLabels = collect([]); $serviceLabels = $serviceLabels->filter(function ($serviceLabel, $serviceLabelName) use ($removedLabels) { @@ -702,7 +706,6 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal $savedService->image = $image; $savedService->save(); } - // Collect/create/update networks if ($serviceNetworks->count() > 0) { foreach ($serviceNetworks as $networkName => $networkDetails) { @@ -733,37 +736,39 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal $savedService->ports = $collectedPorts->implode(','); $savedService->save(); - // Add Coolify specific networks - $definedNetworkExists = $topLevelNetworks->contains(function ($value, $_) use ($definedNetwork) { - return $value == $definedNetwork; - }); - if (!$definedNetworkExists) { - foreach ($definedNetwork as $network) { - $topLevelNetworks->put($network, [ - 'name' => $network, - 'external' => true - ]); + if (!$hasHostNetworkMode) { + // Add Coolify specific networks + $definedNetworkExists = $topLevelNetworks->contains(function ($value, $_) use ($definedNetwork) { + return $value == $definedNetwork; + }); + if (!$definedNetworkExists) { + foreach ($definedNetwork as $network) { + $topLevelNetworks->put($network, [ + 'name' => $network, + 'external' => true + ]); + } } - } - $networks = collect(); - foreach ($serviceNetworks as $key => $serviceNetwork) { - if (gettype($serviceNetwork) === 'string') { - // networks: - // - appwrite - $networks->put($serviceNetwork, null); - } else if (gettype($serviceNetwork) === 'array') { - // networks: - // default: - // ipv4_address: 192.168.203.254 - // $networks->put($serviceNetwork, null); - ray($key); - $networks->put($key, $serviceNetwork); + $networks = collect(); + foreach ($serviceNetworks as $key => $serviceNetwork) { + if (gettype($serviceNetwork) === 'string') { + // networks: + // - appwrite + $networks->put($serviceNetwork, null); + } else if (gettype($serviceNetwork) === 'array') { + // networks: + // default: + // ipv4_address: 192.168.203.254 + // $networks->put($serviceNetwork, null); + ray($key); + $networks->put($key, $serviceNetwork); + } } + foreach ($definedNetwork as $key => $network) { + $networks->put($network, null); + } + data_set($service, 'networks', $networks->toArray()); } - foreach ($definedNetwork as $key => $network) { - $networks->put($network, null); - } - data_set($service, 'networks', $networks->toArray()); // Collect/create/update volumes if ($serviceVolumes->count() > 0) {