CluPilotCloud/app/Actions/SuspendInstance.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,
]);
}
}