feat: Implement VM console access, display VM power state, and add VM statistics retrieval.

This commit is contained in:
pbao9
2026-02-14 16:28:13 +07:00
parent 449502e290
commit 498a57b499
6 changed files with 610 additions and 23 deletions
+89 -1
View File
@@ -37,8 +37,10 @@ use App\Http\Controllers\admin\UserController;
use App\Http\Controllers\admin\vm\VirtualMachineController;
use App\Http\Controllers\Api\VpsActionController;
use App\Http\Controllers\rest\ModuleController;
use App\Http\Services\vCenter;
use App\Models\ModuleVmware;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;
@@ -381,6 +383,92 @@ Route::prefix('')->group(function () {
Route::post('task-reinstall', 'Reinstall')->name('task.reinstall');
});
//Console Ticket API for Admin - using vm_id from VirtualMachines
Route::get('admin-get-console-ticket', function (Request $request, vCenter $serviceVCenter) {
$vm_id = $request->get('vm_id');
if (!$vm_id) {
return response()->json(['error' => true, 'message' => "Please provide vm_id"]);
}
$vm = \App\Models\VirtualMachines::with('datacenter.vCenter')->where('vm_id', $vm_id)->first();
if (!$vm) {
return response()->json(['error' => true, 'message' => "Can't find VM with vm_id: " . $vm_id]);
}
$vcenter = null;
if ($vm->datacenter && $vm->datacenter->vCenter) {
$vcenter = $vm->datacenter->vCenter;
}
if (!$vcenter) {
return response()->json(['error' => true, 'message' => "Can't find vCenter information"]);
}
if (!$serviceVCenter->loginServer($vcenter)) {
return response()->json([
'error' => true,
'message' => 'Không thể đăng nhập vào vCenter'
]);
}
$ConsoleTicket = $serviceVCenter->GetConsoleTickets($vm->vm_id);
if ($ConsoleTicket === 'Login_Again') {
if ($serviceVCenter->loginServer($vcenter)) {
$ConsoleTicket = $serviceVCenter->GetConsoleTickets($vm->vm_id);
} else {
return response()->json([
'error' => true,
'message' => 'Không thể đăng nhập lại vào vCenter'
]);
}
}
if (is_string($ConsoleTicket)) {
return response()->json([
'error' => true,
'message' => "Failed to get console ticket: $ConsoleTicket"
]);
}
if ($ConsoleTicket['error']) {
return response()->json([
'error' => true,
'message' => $ConsoleTicket['data']
]);
}
return response()->json([
'error' => false,
'data' => $ConsoleTicket['data'],
'host' => $vcenter->host,
'vmware-api-session-id' => $serviceVCenter->token
])->cookie('vmware-api-session-id', $serviceVCenter->token, 60, '/', null, false, false);
})->name('admin.getConsoleTicket');
//Admin VM Console View - using vm_id
Route::get('view-admin-console/{vm_id}', function (Request $request, $vm_id, vCenter $serviceVCenter) {
$vm = \App\Models\VirtualMachines::with('datacenter.vCenter', 'host')->where('vm_id', $vm_id)->first();
if (!$vm) {
return back()->withErrors("Can't find VM with vm_id: " . $vm_id);
}
$vmStats = null;
if ($vm->datacenter && $vm->datacenter->vCenter) {
$vcenter = $vm->datacenter->vCenter;
if ($serviceVCenter->loginServer($vcenter)) {
$vmStats = $serviceVCenter->GetVMStats($vm->vm_id);
if ($vmStats['error']) {
$vmStats = null;
} else {
$vmStats = $vmStats['data'];
}
}
}
$title = 'Console - ' . ($vm->name ?? 'VM ' . $vm_id);
return view('administrator.pages.vm_console', compact('title', 'vm', 'vmStats'));
})->name('admin.vm.console');
//Invoice
Route::controller(InvoiceController::class)->group(function () {
Route::get('list-all-invoice', 'index')->name('administrator.pages.invoice.index');