Implement container statuses from wings

This commit is contained in:
Lance Pioch 2024-04-29 14:29:04 -04:00
parent 7df5f12c75
commit 5d2248ab1f
5 changed files with 49 additions and 15 deletions

View File

@ -27,12 +27,7 @@ class ListServers extends ListRecords
return $server->status;
}
$statuses = collect($server->retrieveStatus())
->mapWithKeys(function ($status) {
return [$status['configuration']['uuid'] => $status['state']];
})->all();
return $statuses[$server->uuid] ?? 'node_fail';
return $server->retrieveStatus() ?? 'node_fail';
})
->icon(fn ($state) => match ($state) {
'node_fail' => 'tabler-server-off',

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Api\Remote\Servers;
use Illuminate\Http\Request;
use App\Models\Server;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
class ServerContainersController extends Controller
{
/**
* Updates the server container's status on the Panel
*/
public function status(Server $server, Request $request): JsonResponse
{
$status = fluent($request->json()->all())->get('data.new_state');
cache()->set("servers.$server->uuid.container.status", $status, now()->addMinute());
return new JsonResponse([]);
}
}

View File

@ -292,13 +292,19 @@ class Node extends Model
public function serverStatuses(): array
{
return cache()->remember("nodes.$this->id.servers", now()->addMinute(), function () {
try {
return Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/servers')->json() ?? [];
} catch (Exception) {
return [];
}
});
$statuses = [];
try {
$statuses = Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/servers')->json() ?? [];
} catch (Exception $exception) {
report($exception);
}
foreach ($statuses as $status) {
$uuid = fluent($status)->get('configuration.uuid');
cache()->remember("servers.$uuid.container.status", now()->addMinute(), fn() => fluent($status)->get('state'));
}
return $statuses;
}
public function ipAddresses(): array

View File

@ -395,8 +395,16 @@ class Server extends Model
}
}
public function retrieveStatus()
public function retrieveStatus(): string
{
return $this->node->serverStatuses();
$status = cache()->get("servers.$this->uuid.container.status");
if ($status) {
return $status;
}
$this->node->serverStatuses();
return cache()->get("servers.$this->uuid.container.status") ?? 'missing';
}
}

View File

@ -19,6 +19,8 @@ Route::prefix('/servers/{server:uuid}')->group(function () {
Route::get('/transfer/success', [Remote\Servers\ServerTransferController::class, 'success']);
Route::post('/transfer/failure', [Remote\Servers\ServerTransferController::class, 'failure']);
Route::post('/transfer/success', [Remote\Servers\ServerTransferController::class, 'success']);
Route::post('/container/status', [Remote\Servers\ServerContainersController::class, 'status']);
});
Route::prefix('/backups')->group(function () {