108 lines
3.9 KiB
PHP
108 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\Service;
|
|
|
|
use App\Http\Controllers\Api\Service\Concerns\ResolvesVm;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Services\vCenter;
|
|
use App\Models\ModuleVmware;
|
|
use App\Services\ActivityLogger;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use App\Http\Controllers\Api\Service\Concerns\ManagesVmPower;
|
|
use App\Http\Controllers\Api\Service\Concerns\ManagesVmNetwork;
|
|
use App\Http\Controllers\Api\Service\Concerns\ManagesVmAccess;
|
|
use App\Http\Controllers\Api\Service\Concerns\ManagesVmMetrics;
|
|
|
|
class VmController extends Controller
|
|
{
|
|
use ResolvesVm;
|
|
use ManagesVmPower;
|
|
use ManagesVmNetwork;
|
|
use ManagesVmAccess;
|
|
use ManagesVmMetrics;
|
|
|
|
public function __construct(protected ActivityLogger $activityLogger) {}
|
|
// -------------------------------------------------------------------------
|
|
// Power ON
|
|
// -------------------------------------------------------------------------
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Power OFF
|
|
// -------------------------------------------------------------------------
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Change IP
|
|
// -------------------------------------------------------------------------
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Change Port (RDP)
|
|
// -------------------------------------------------------------------------
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Console Ticket
|
|
// -------------------------------------------------------------------------
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Restart VM
|
|
// -------------------------------------------------------------------------
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Change Password
|
|
// -------------------------------------------------------------------------
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Power State
|
|
// -------------------------------------------------------------------------
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Shared helpers
|
|
// -------------------------------------------------------------------------
|
|
|
|
/** Try to acquire a per-VM operation lock. Returns null if already locked. */
|
|
private function acquireVmLock(ModuleVmware $vm, int $ttl = 60): ?\Illuminate\Contracts\Cache\Lock
|
|
{
|
|
$lock = Cache::lock("vm_op:{$vm->id}", $ttl);
|
|
return $lock->get() ? $lock : null;
|
|
}
|
|
|
|
private function vmLocked(): JsonResponse
|
|
{
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'VM đang có thao tác đang xử lý, vui lòng chờ rồi thử lại.',
|
|
], 429);
|
|
}
|
|
|
|
/**
|
|
* Normalise the array|string return value from Power ON/OFF actions.
|
|
*/
|
|
private function vmResponse(array|string $result, string $successMessage): JsonResponse
|
|
{
|
|
if ($result === 'Login_Again') {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Không thể đăng nhập vào vCenter.',
|
|
], 400);
|
|
}
|
|
|
|
if (is_string($result)) {
|
|
return response()->json(['success' => false, 'message' => $result], 400);
|
|
}
|
|
|
|
if ($result['error'] ?? true) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => $result['data'] ?? 'Thao tác thất bại.',
|
|
'data' => $result,
|
|
], 400);
|
|
}
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => $successMessage,
|
|
'data' => $result['data'] ?? 'success',
|
|
]);
|
|
}
|
|
}
|