diff --git a/app/Livewire/Admin/EditDatacenter.php b/app/Livewire/Admin/EditDatacenter.php index bc8f7da..006c38f 100644 --- a/app/Livewire/Admin/EditDatacenter.php +++ b/app/Livewire/Admin/EditDatacenter.php @@ -20,11 +20,8 @@ class EditDatacenter extends ModalComponent #[Validate('required|string|max:255')] public string $name = ''; - #[Validate('nullable|string|max:2|in:'.self::COUNTRY_KEYS)] public string $location = ''; - private const COUNTRY_KEYS = 'DE,AT,CH,FI,SE,NO,DK,NL,BE,LU,FR,GB,IE,ES,PT,IT,PL,CZ,SK,HU,SI,HR,RO,BG,GR,EE,LV,LT,US,CA'; - public function mount(string $uuid): void { $dc = Datacenter::query()->where('uuid', $uuid)->firstOrFail(); @@ -37,7 +34,11 @@ class EditDatacenter extends ModalComponent public function save() { $this->authorize('datacenters.manage'); - $data = $this->validate(); + // Validate the country against the configured list so add + edit stay in sync. + $data = $this->validate([ + 'name' => 'required|string|max:255', + 'location' => 'nullable|in:'.implode(',', array_keys((array) config('countries'))), + ]); Datacenter::query()->where('uuid', $this->uuid)->update([ 'name' => $data['name'], diff --git a/app/Livewire/Admin/Provisioning.php b/app/Livewire/Admin/Provisioning.php index 20abbeb..2bf4bf2 100644 --- a/app/Livewire/Admin/Provisioning.php +++ b/app/Livewire/Admin/Provisioning.php @@ -60,12 +60,21 @@ class Provisioning extends Component $this->dispatch('notify', message: __('admin.run_retried')); } - /** A run that claims to be in progress but hasn't advanced in a while looks stuck. */ + /** + * A run that claims to be in progress but hasn't advanced in a while looks + * stuck — unless it is in a legitimate scheduled backoff (next_attempt_at in + * the future, e.g. RunRunner's retry delay of up to 300 s). + */ private function isStale(ProvisioningRun $run): bool { - return in_array($run->status, ['running', 'waiting'], true) - && $run->updated_at !== null - && $run->updated_at->lt(now()->subMinutes(2)); + if (! in_array($run->status, ['running', 'waiting'], true)) { + return false; + } + if ($run->next_attempt_at !== null && $run->next_attempt_at->isFuture()) { + return false; // waiting out a scheduled retry/poll — not stuck + } + + return $run->updated_at !== null && $run->updated_at->lt(now()->subMinutes(2)); } private function subjectLabel(ProvisioningRun $run): string