Refactor service and resource deletion logic

This commit is contained in:
Andras Bacsai 2024-01-30 17:38:07 +01:00
parent cc641d8cba
commit 795c8abf64
3 changed files with 43 additions and 32 deletions

View File

@ -10,36 +10,43 @@ class DeleteService
use AsAction; use AsAction;
public function handle(Service $service) public function handle(Service $service)
{ {
$server = data_get($service, 'server'); try {
if ($server->isFunctional()) { $server = data_get($service, 'server');
StopService::run($service); if ($server->isFunctional()) {
} StopService::run($service);
$storagesToDelete = collect([]); $storagesToDelete = collect([]);
$service->environment_variables()->delete(); $service->environment_variables()->delete();
$commands = []; $commands = [];
foreach ($service->applications()->get() as $application) { foreach ($service->applications()->get() as $application) {
$storages = $application->persistentStorages()->get(); $storages = $application->persistentStorages()->get();
foreach ($storages as $storage) { foreach ($storages as $storage) {
$storagesToDelete->push($storage); $storagesToDelete->push($storage);
} }
$application->forceDelete(); }
} foreach ($service->databases()->get() as $database) {
foreach ($service->databases()->get() as $database) { $storages = $database->persistentStorages()->get();
$storages = $database->persistentStorages()->get(); foreach ($storages as $storage) {
foreach ($storages as $storage) { $storagesToDelete->push($storage);
$storagesToDelete->push($storage); }
} }
$database->forceDelete(); foreach ($storagesToDelete as $storage) {
} $commands[] = "docker volume rm -f $storage->name";
if ($server->isFunctional()) { }
foreach ($storagesToDelete as $storage) { $commands[] = "docker rm -f $service->uuid";
$commands[] = "docker volume rm -f $storage->name";
}
$commands[] = "docker rm -f $service->uuid";
instant_remote_process($commands, $server, false); instant_remote_process($commands, $server, false);
}
} catch (\Exception $e) {
throw new \Exception($e->getMessage());
} finally {
foreach ($service->applications()->get() as $application) {
$application->forceDelete();
}
foreach ($service->databases()->get() as $database) {
$database->forceDelete();
}
$service->forceDelete();
} }
$service->forceDelete();
} }
} }

View File

@ -30,25 +30,30 @@ class DeleteResourceJob implements ShouldQueue, ShouldBeEncrypted
public function handle() public function handle()
{ {
try { try {
$this->resource->delete();
switch ($this->resource->type()) { switch ($this->resource->type()) {
case 'application': case 'application':
StopApplication::run($this->resource); StopApplication::run($this->resource);
$this->resource->forceDelete();
break; break;
case 'standalone-postgresql': case 'standalone-postgresql':
StopDatabase::run($this->resource); StopDatabase::run($this->resource);
$this->resource->forceDelete();
break; break;
case 'standalone-redis': case 'standalone-redis':
StopDatabase::run($this->resource); StopDatabase::run($this->resource);
$this->resource->forceDelete();
break; break;
case 'standalone-mongodb': case 'standalone-mongodb':
StopDatabase::run($this->resource); StopDatabase::run($this->resource);
$this->resource->forceDelete();
break; break;
case 'standalone-mysql': case 'standalone-mysql':
StopDatabase::run($this->resource); StopDatabase::run($this->resource);
$this->resource->forceDelete();
break; break;
case 'standalone-mariadb': case 'standalone-mariadb':
StopDatabase::run($this->resource); StopDatabase::run($this->resource);
$this->resource->forceDelete();
break; break;
case 'service': case 'service':
DeleteService::dispatch($this->resource); DeleteService::dispatch($this->resource);
@ -57,8 +62,6 @@ class DeleteResourceJob implements ShouldQueue, ShouldBeEncrypted
} catch (\Throwable $e) { } catch (\Throwable $e) {
send_internal_notification('ContainerStoppingJob failed with: ' . $e->getMessage()); send_internal_notification('ContainerStoppingJob failed with: ' . $e->getMessage());
throw $e; throw $e;
} finally {
$this->resource->forceDelete();
} }
} }
} }

View File

@ -24,7 +24,8 @@ class Danger extends Component
public function delete() public function delete()
{ {
try { try {
DeleteResourceJob::dispatchSync($this->resource); $this->resource->delete();
DeleteResourceJob::dispatch($this->resource);
return redirect()->route('project.resource.index', [ return redirect()->route('project.resource.index', [
'project_uuid' => $this->projectUuid, 'project_uuid' => $this->projectUuid,
'environment_name' => $this->environmentName 'environment_name' => $this->environmentName