feat: compose parser v2
This commit is contained in:
parent
858ae1266f
commit
62b84add36
@ -94,6 +94,7 @@
|
|||||||
'created_at' => ['type' => 'string', 'format' => 'date-time', 'description' => 'The date and time when the application was created.'],
|
'created_at' => ['type' => 'string', 'format' => 'date-time', 'description' => 'The date and time when the application was created.'],
|
||||||
'updated_at' => ['type' => 'string', 'format' => 'date-time', 'description' => 'The date and time when the application was last updated.'],
|
'updated_at' => ['type' => 'string', 'format' => 'date-time', 'description' => 'The date and time when the application was last updated.'],
|
||||||
'deleted_at' => ['type' => 'string', 'format' => 'date-time', 'nullable' => true, 'description' => 'The date and time when the application was deleted.'],
|
'deleted_at' => ['type' => 'string', 'format' => 'date-time', 'nullable' => true, 'description' => 'The date and time when the application was deleted.'],
|
||||||
|
'compose_parsing_version' => ['type' => 'string', 'description' => 'How Coolify parse the compose file.'],
|
||||||
]
|
]
|
||||||
)]
|
)]
|
||||||
|
|
||||||
@ -122,6 +123,8 @@ protected static function booted()
|
|||||||
ApplicationSetting::create([
|
ApplicationSetting::create([
|
||||||
'application_id' => $application->id,
|
'application_id' => $application->id,
|
||||||
]);
|
]);
|
||||||
|
$application->compose_parsing_version = '2';
|
||||||
|
$application->save();
|
||||||
});
|
});
|
||||||
static::deleting(function ($application) {
|
static::deleting(function ($application) {
|
||||||
$application->update(['fqdn' => null]);
|
$application->update(['fqdn' => null]);
|
||||||
|
@ -1482,128 +1482,263 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
|
|||||||
|
|
||||||
$baseName = generateApplicationContainerName($resource, $pull_request_id);
|
$baseName = generateApplicationContainerName($resource, $pull_request_id);
|
||||||
$containerName = "$serviceName-$baseName";
|
$containerName = "$serviceName-$baseName";
|
||||||
if (count($serviceVolumes) > 0) {
|
if ($resource->compose_parsing_version === '1') {
|
||||||
$serviceVolumes = $serviceVolumes->map(function ($volume) use ($resource, $topLevelVolumes, $pull_request_id) {
|
if (count($serviceVolumes) > 0) {
|
||||||
if (is_string($volume)) {
|
$serviceVolumes = $serviceVolumes->map(function ($volume) use ($resource, $topLevelVolumes, $pull_request_id) {
|
||||||
$volume = str($volume);
|
if (is_string($volume)) {
|
||||||
if ($volume->contains(':') && ! $volume->startsWith('/')) {
|
$volume = str($volume);
|
||||||
$name = $volume->before(':');
|
if ($volume->contains(':') && ! $volume->startsWith('/')) {
|
||||||
$mount = $volume->after(':');
|
|
||||||
if ($name->startsWith('.') || $name->startsWith('~')) {
|
|
||||||
$dir = base_configuration_dir().'/applications/'.$resource->uuid;
|
|
||||||
if ($name->startsWith('.')) {
|
|
||||||
$name = $name->replaceFirst('.', $dir);
|
|
||||||
}
|
|
||||||
if ($name->startsWith('~')) {
|
|
||||||
$name = $name->replaceFirst('~', $dir);
|
|
||||||
}
|
|
||||||
if ($pull_request_id !== 0) {
|
|
||||||
$name = $name."-pr-$pull_request_id";
|
|
||||||
}
|
|
||||||
$volume = str("$name:$mount");
|
|
||||||
} else {
|
|
||||||
if ($pull_request_id !== 0) {
|
|
||||||
$name = $name."-pr-$pull_request_id";
|
|
||||||
$volume = str("$name:$mount");
|
|
||||||
if ($topLevelVolumes->has($name)) {
|
|
||||||
$v = $topLevelVolumes->get($name);
|
|
||||||
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
|
||||||
// Do nothing
|
|
||||||
} else {
|
|
||||||
if (is_null(data_get($v, 'name'))) {
|
|
||||||
data_set($v, 'name', $name);
|
|
||||||
data_set($topLevelVolumes, $name, $v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$topLevelVolumes->put($name, [
|
|
||||||
'name' => $name,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($topLevelVolumes->has($name->value())) {
|
|
||||||
$v = $topLevelVolumes->get($name->value());
|
|
||||||
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
|
||||||
// Do nothing
|
|
||||||
} else {
|
|
||||||
if (is_null(data_get($v, 'name'))) {
|
|
||||||
data_set($topLevelVolumes, $name->value(), $v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$topLevelVolumes->put($name->value(), [
|
|
||||||
'name' => $name->value(),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($volume->startsWith('/')) {
|
|
||||||
$name = $volume->before(':');
|
$name = $volume->before(':');
|
||||||
$mount = $volume->after(':');
|
$mount = $volume->after(':');
|
||||||
if ($pull_request_id !== 0) {
|
if ($name->startsWith('.') || $name->startsWith('~')) {
|
||||||
$name = $name."-pr-$pull_request_id";
|
$dir = base_configuration_dir().'/applications/'.$resource->uuid;
|
||||||
}
|
if ($name->startsWith('.')) {
|
||||||
$volume = str("$name:$mount");
|
$name = $name->replaceFirst('.', $dir);
|
||||||
}
|
}
|
||||||
}
|
if ($name->startsWith('~')) {
|
||||||
} elseif (is_array($volume)) {
|
$name = $name->replaceFirst('~', $dir);
|
||||||
$source = data_get($volume, 'source');
|
}
|
||||||
$target = data_get($volume, 'target');
|
if ($pull_request_id !== 0) {
|
||||||
$read_only = data_get($volume, 'read_only');
|
$name = $name."-pr-$pull_request_id";
|
||||||
if ($source && $target) {
|
}
|
||||||
if ((str($source)->startsWith('.') || str($source)->startsWith('~'))) {
|
$volume = str("$name:$mount");
|
||||||
$dir = base_configuration_dir().'/applications/'.$resource->uuid;
|
|
||||||
if (str($source, '.')) {
|
|
||||||
$source = str($source)->replaceFirst('.', $dir);
|
|
||||||
}
|
|
||||||
if (str($source, '~')) {
|
|
||||||
$source = str($source)->replaceFirst('~', $dir);
|
|
||||||
}
|
|
||||||
if ($pull_request_id !== 0) {
|
|
||||||
$source = $source."-pr-$pull_request_id";
|
|
||||||
}
|
|
||||||
if ($read_only) {
|
|
||||||
data_set($volume, 'source', $source.':'.$target.':ro');
|
|
||||||
} else {
|
} else {
|
||||||
data_set($volume, 'source', $source.':'.$target);
|
if ($pull_request_id !== 0) {
|
||||||
}
|
$name = $name."-pr-$pull_request_id";
|
||||||
} else {
|
$volume = str("$name:$mount");
|
||||||
if ($pull_request_id !== 0) {
|
if ($topLevelVolumes->has($name)) {
|
||||||
$source = $source."-pr-$pull_request_id";
|
$v = $topLevelVolumes->get($name);
|
||||||
}
|
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
||||||
if ($read_only) {
|
// Do nothing
|
||||||
data_set($volume, 'source', $source.':'.$target.':ro');
|
} else {
|
||||||
} else {
|
if (is_null(data_get($v, 'name'))) {
|
||||||
data_set($volume, 'source', $source.':'.$target);
|
data_set($v, 'name', $name);
|
||||||
}
|
data_set($topLevelVolumes, $name, $v);
|
||||||
if (! str($source)->startsWith('/')) {
|
}
|
||||||
if ($topLevelVolumes->has($source)) {
|
|
||||||
$v = $topLevelVolumes->get($source);
|
|
||||||
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
|
||||||
// Do nothing
|
|
||||||
} else {
|
|
||||||
if (is_null(data_get($v, 'name'))) {
|
|
||||||
data_set($v, 'name', $source);
|
|
||||||
data_set($topLevelVolumes, $source, $v);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$topLevelVolumes->put($name, [
|
||||||
|
'name' => $name,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$topLevelVolumes->put($source, [
|
if ($topLevelVolumes->has($name->value())) {
|
||||||
'name' => $source,
|
$v = $topLevelVolumes->get($name->value());
|
||||||
]);
|
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
||||||
|
// Do nothing
|
||||||
|
} else {
|
||||||
|
if (is_null(data_get($v, 'name'))) {
|
||||||
|
data_set($topLevelVolumes, $name->value(), $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$topLevelVolumes->put($name->value(), [
|
||||||
|
'name' => $name->value(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($volume->startsWith('/')) {
|
||||||
|
$name = $volume->before(':');
|
||||||
|
$mount = $volume->after(':');
|
||||||
|
if ($pull_request_id !== 0) {
|
||||||
|
$name = $name."-pr-$pull_request_id";
|
||||||
|
}
|
||||||
|
$volume = str("$name:$mount");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif (is_array($volume)) {
|
||||||
|
$source = data_get($volume, 'source');
|
||||||
|
$target = data_get($volume, 'target');
|
||||||
|
$read_only = data_get($volume, 'read_only');
|
||||||
|
if ($source && $target) {
|
||||||
|
if ((str($source)->startsWith('.') || str($source)->startsWith('~'))) {
|
||||||
|
$dir = base_configuration_dir().'/applications/'.$resource->uuid;
|
||||||
|
if (str($source, '.')) {
|
||||||
|
$source = str($source)->replaceFirst('.', $dir);
|
||||||
|
}
|
||||||
|
if (str($source, '~')) {
|
||||||
|
$source = str($source)->replaceFirst('~', $dir);
|
||||||
|
}
|
||||||
|
if ($pull_request_id !== 0) {
|
||||||
|
$source = $source."-pr-$pull_request_id";
|
||||||
|
}
|
||||||
|
if ($read_only) {
|
||||||
|
data_set($volume, 'source', $source.':'.$target.':ro');
|
||||||
|
} else {
|
||||||
|
data_set($volume, 'source', $source.':'.$target);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($pull_request_id !== 0) {
|
||||||
|
$source = $source."-pr-$pull_request_id";
|
||||||
|
}
|
||||||
|
if ($read_only) {
|
||||||
|
data_set($volume, 'source', $source.':'.$target.':ro');
|
||||||
|
} else {
|
||||||
|
data_set($volume, 'source', $source.':'.$target);
|
||||||
|
}
|
||||||
|
if (! str($source)->startsWith('/')) {
|
||||||
|
if ($topLevelVolumes->has($source)) {
|
||||||
|
$v = $topLevelVolumes->get($source);
|
||||||
|
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
||||||
|
// Do nothing
|
||||||
|
} else {
|
||||||
|
if (is_null(data_get($v, 'name'))) {
|
||||||
|
data_set($v, 'name', $source);
|
||||||
|
data_set($topLevelVolumes, $source, $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$topLevelVolumes->put($source, [
|
||||||
|
'name' => $source,
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
if (is_array($volume)) {
|
||||||
if (is_array($volume)) {
|
return data_get($volume, 'source');
|
||||||
return data_get($volume, 'source');
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return $volume->value();
|
return $volume->value();
|
||||||
});
|
});
|
||||||
data_set($service, 'volumes', $serviceVolumes->toArray());
|
data_set($service, 'volumes', $serviceVolumes->toArray());
|
||||||
|
}
|
||||||
|
} elseif ($resource->compose_parsing_version === '2') {
|
||||||
|
if (count($serviceVolumes) > 0) {
|
||||||
|
$serviceVolumes = $serviceVolumes->map(function ($volume) use ($resource, $topLevelVolumes, $pull_request_id) {
|
||||||
|
if (is_string($volume)) {
|
||||||
|
$volume = str($volume);
|
||||||
|
if ($volume->contains(':') && ! $volume->startsWith('/')) {
|
||||||
|
$name = $volume->before(':');
|
||||||
|
$mount = $volume->after(':');
|
||||||
|
if ($name->startsWith('.') || $name->startsWith('~')) {
|
||||||
|
$dir = base_configuration_dir().'/applications/'.$resource->uuid;
|
||||||
|
if ($name->startsWith('.')) {
|
||||||
|
$name = $name->replaceFirst('.', $dir);
|
||||||
|
}
|
||||||
|
if ($name->startsWith('~')) {
|
||||||
|
$name = $name->replaceFirst('~', $dir);
|
||||||
|
}
|
||||||
|
if ($pull_request_id !== 0) {
|
||||||
|
$name = $name."-pr-$pull_request_id";
|
||||||
|
}
|
||||||
|
$volume = str("$name:$mount");
|
||||||
|
} else {
|
||||||
|
if ($pull_request_id !== 0) {
|
||||||
|
$uuid = $resource->uuid;
|
||||||
|
$name = $uuid."-$name-pr-$pull_request_id";
|
||||||
|
$volume = str("$name:$mount");
|
||||||
|
if ($topLevelVolumes->has($name)) {
|
||||||
|
$v = $topLevelVolumes->get($name);
|
||||||
|
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
||||||
|
// Do nothing
|
||||||
|
} else {
|
||||||
|
if (is_null(data_get($v, 'name'))) {
|
||||||
|
data_set($v, 'name', $name);
|
||||||
|
data_set($topLevelVolumes, $name, $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$topLevelVolumes->put($name, [
|
||||||
|
'name' => $name,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$uuid = $resource->uuid;
|
||||||
|
$name = str($uuid."-$name");
|
||||||
|
$volume = str("$name:$mount");
|
||||||
|
if ($topLevelVolumes->has($name->value())) {
|
||||||
|
$v = $topLevelVolumes->get($name->value());
|
||||||
|
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
||||||
|
// Do nothing
|
||||||
|
} else {
|
||||||
|
if (is_null(data_get($v, 'name'))) {
|
||||||
|
data_set($topLevelVolumes, $name->value(), $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$topLevelVolumes->put($name->value(), [
|
||||||
|
'name' => $name->value(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($volume->startsWith('/')) {
|
||||||
|
$name = $volume->before(':');
|
||||||
|
$mount = $volume->after(':');
|
||||||
|
if ($pull_request_id !== 0) {
|
||||||
|
$name = $name."-pr-$pull_request_id";
|
||||||
|
}
|
||||||
|
$volume = str("$name:$mount");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif (is_array($volume)) {
|
||||||
|
$source = data_get($volume, 'source');
|
||||||
|
$target = data_get($volume, 'target');
|
||||||
|
$read_only = data_get($volume, 'read_only');
|
||||||
|
if ($source && $target) {
|
||||||
|
$uuid = $resource->uuid;
|
||||||
|
if ((str($source)->startsWith('.') || str($source)->startsWith('~'))) {
|
||||||
|
$dir = base_configuration_dir().'/applications/'.$resource->uuid;
|
||||||
|
if (str($source, '.')) {
|
||||||
|
$source = str($source)->replaceFirst('.', $dir);
|
||||||
|
}
|
||||||
|
if (str($source, '~')) {
|
||||||
|
$source = str($source)->replaceFirst('~', $dir);
|
||||||
|
}
|
||||||
|
if ($pull_request_id === 0) {
|
||||||
|
$source = $uuid."-$source";
|
||||||
|
} else {
|
||||||
|
$source = $uuid."-$source-pr-$pull_request_id";
|
||||||
|
}
|
||||||
|
if ($read_only) {
|
||||||
|
data_set($volume, 'source', $source.':'.$target.':ro');
|
||||||
|
} else {
|
||||||
|
data_set($volume, 'source', $source.':'.$target);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($pull_request_id === 0) {
|
||||||
|
$source = $uuid."-$source";
|
||||||
|
} else {
|
||||||
|
$source = $uuid."-$source-pr-$pull_request_id";
|
||||||
|
}
|
||||||
|
if ($read_only) {
|
||||||
|
data_set($volume, 'source', $source.':'.$target.':ro');
|
||||||
|
} else {
|
||||||
|
data_set($volume, 'source', $source.':'.$target);
|
||||||
|
}
|
||||||
|
if (! str($source)->startsWith('/')) {
|
||||||
|
if ($topLevelVolumes->has($source)) {
|
||||||
|
$v = $topLevelVolumes->get($source);
|
||||||
|
if (data_get($v, 'driver_opts.type') === 'cifs') {
|
||||||
|
// Do nothing
|
||||||
|
} else {
|
||||||
|
if (is_null(data_get($v, 'name'))) {
|
||||||
|
data_set($v, 'name', $source);
|
||||||
|
data_set($topLevelVolumes, $source, $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$topLevelVolumes->put($source, [
|
||||||
|
'name' => $source,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_array($volume)) {
|
||||||
|
return data_get($volume, 'source');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $volume->value();
|
||||||
|
});
|
||||||
|
data_set($service, 'volumes', $serviceVolumes->toArray());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($pull_request_id !== 0 && count($serviceDependencies) > 0) {
|
if ($pull_request_id !== 0 && count($serviceDependencies) > 0) {
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('applications', function (Blueprint $table) {
|
||||||
|
$table->string('compose_parsing_version')->default('1');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('applications', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('compose_parsing_version');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user