Fix Vultr power controls for stopped instances

This commit is contained in:
Cornelis Terblanche 2026-06-03 21:20:56 +02:00
parent 94abbe1590
commit f7150a1d6c
4 changed files with 33 additions and 2 deletions

View file

@ -31,7 +31,7 @@ private function request(string $method, string $endpoint, array $data = []): ar
throw new \Exception('Vultr API error: '.$response->json('error', 'Unknown error'), $response->status());
}
return $response->json();
return $response->json() ?? [];
}
private function requestPaginated(string $endpoint, string $resourceKey, array $data = []): array

View file

@ -140,7 +140,7 @@ class="mx-1 dark:hover:fill-white fill-black dark:fill-warning">
</svg>
</button>
</div>
@if ($server->cloudProviderToken && !$server->isFunctional() && $vultrInstanceStatus === 'stopped')
@if ($server->cloudProviderToken && $vultrInstanceStatus === 'stopped')
<x-forms.button wire:click.prevent='startVultrInstance' isHighlighted canGate="update"
:canResource="$server">
Power On

View file

@ -236,6 +236,23 @@ function vultrLifecycleTestPrivateKey(): string
]);
});
it('shows Vultr power on button when stopped even if server was previously functional', function () {
$this->server->update([
'ip' => '1.2.3.5',
'vultr_instance_status' => 'stopped',
]);
$this->server->settings->update([
'is_reachable' => true,
'is_usable' => true,
'force_disabled' => false,
]);
expect($this->server->fresh()->isFunctional())->toBeTrue();
Livewire::test(Show::class, ['server_uuid' => $this->server->uuid])
->assertSee('Power On');
});
it('starts a Vultr instance', function () {
Http::fake([
'https://api.vultr.com/v2/instances/instance-1/start' => Http::response([], 204),

View file

@ -136,3 +136,17 @@
->and($service->findInstanceByIp('2001:db8::1')['id'])->toBe('instance-1')
->and($service->findInstanceByIp('1.2.3.4'))->toBeNull();
});
it('handles empty successful responses from Vultr API', function () {
Http::fake([
'https://api.vultr.com/v2/instances/instance-1/start' => Http::response(null, 204),
'https://api.vultr.com/v2/instances/instance-1' => Http::response(null, 204),
]);
$service = new VultrService('fake-token');
expect($service->startInstance('instance-1'))->toBe([]);
$service->deleteInstance('instance-1');
Http::assertSentCount(2);
});