48 lines
1.5 KiB
PHP
48 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Actions;
|
|
|
|
use App\Models\Instance;
|
|
use App\Services\Proxmox\ProxmoxClient;
|
|
use Illuminate\Support\Carbon;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
/**
|
|
* Die Cloud eines Kunden abschalten, weil bezahlt werden muss.
|
|
*
|
|
* **Abschalten heisst abschalten.** Geordnet heruntergefahren, mit Zeitlimit,
|
|
* und NICHTS wird gelöscht: keine Platte angefasst, keine Instanz beendet, kein
|
|
* DNS-Eintrag entfernt, kein Backup verworfen. Alles kommt zurück, sobald
|
|
* bezahlt ist — das ist der Unterschied zwischen einer Sperre und einer
|
|
* Kündigung, und er darf im Code nicht verschwimmen.
|
|
*
|
|
* Ein Zustand, kein Ereignis: ein zweiter Tageslauf oder ein neu gestarteter
|
|
* Arbeiterprozess fährt nichts ein zweites Mal herunter.
|
|
*/
|
|
class SuspendInstance
|
|
{
|
|
public function __invoke(Instance $instance): void
|
|
{
|
|
if ($instance->suspended_at !== null) {
|
|
return;
|
|
}
|
|
|
|
$vmid = $instance->vmid;
|
|
$node = $instance->host?->node ?? 'pve';
|
|
|
|
if ($vmid !== null) {
|
|
// Geordnet, nicht abgewürgt: dem Kunden gehören die Daten darin,
|
|
// und ein hartes Ausschalten riskiert ein beschädigtes Dateisystem
|
|
// für einen Rückstand von ein paar Euro.
|
|
app(ProxmoxClient::class)->shutdownVm($node, (int) $vmid, 120);
|
|
}
|
|
|
|
$instance->update(['suspended_at' => Carbon::now()]);
|
|
|
|
Log::info('Cloud wegen offener Zahlung abgeschaltet', [
|
|
'instance' => $instance->uuid,
|
|
'vmid' => $vmid,
|
|
]);
|
|
}
|
|
}
|