refactor: implement centralized cache key management and add utility traits for vCenter SSH operations.
This commit is contained in:
@@ -10,8 +10,11 @@ use App\Http\Controllers\Api\Service\Concerns\ResolvesVm;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Services\Telegram;
|
||||
use App\Http\Services\vCenter;
|
||||
use App\Jobs\VirtualMachine\ChangeVmPasswordJob;
|
||||
use App\Models\ModuleVmware;
|
||||
use App\Models\Os;
|
||||
use App\Models\Service;
|
||||
use App\Services\VmProvisionService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
@@ -304,6 +307,94 @@ class VmController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Change Password
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* POST /v1/system/vm-change-password
|
||||
*
|
||||
* Body: { product, current_password, new_password }
|
||||
* Dispatches ChangeVmPasswordJob — returns immediately, runs async.
|
||||
*/
|
||||
public function changePassword(Request $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'product' => ['required'],
|
||||
'current_password' => ['required', 'string'],
|
||||
'new_password' => ['required', 'string', 'min:8'],
|
||||
]);
|
||||
|
||||
$vm = $this->resolveVmById($validated['product'], $request);
|
||||
if ($vm instanceof JsonResponse) {
|
||||
return $vm;
|
||||
}
|
||||
|
||||
// Detect OS family from VM's os_id record
|
||||
$os = $vm->os_id ? Os::with('osGroup')->find($vm->os_id) : null;
|
||||
$osGroupName = strtolower($os?->osGroup?->name ?? '');
|
||||
$osFamily = str_contains($osGroupName, 'windows')
|
||||
? VmProvisionService::OS_WINDOWS
|
||||
: VmProvisionService::OS_LINUX;
|
||||
|
||||
ChangeVmPasswordJob::dispatch(
|
||||
$vm->id,
|
||||
$vm->vmware_id,
|
||||
$osFamily,
|
||||
$validated['new_password'],
|
||||
$validated['current_password'],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Yêu cầu đổi mật khẩu đã được ghi nhận. Hệ thống sẽ xử lý trong vài phút.',
|
||||
]);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Power State
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* GET /v1/system/vm-power-state?product={id|uuid|vmware_id}
|
||||
*
|
||||
* Calls vSphere REST API directly: GET /rest/vcenter/vm/{vmware_id}/power
|
||||
* Returns: { success: true, data: { state: "POWERED_ON"|"POWERED_OFF"|"SUSPENDED", clean_power_off: bool } }
|
||||
*/
|
||||
public function powerState(Request $request, vCenter $serviceVCenter): JsonResponse
|
||||
{
|
||||
$productId = $request->input('product');
|
||||
if (!$productId) {
|
||||
return response()->json(['success' => false, 'message' => 'Thiếu product id.'], 422);
|
||||
}
|
||||
|
||||
$vm = $this->resolveVmById($productId, $request);
|
||||
if ($vm instanceof JsonResponse) {
|
||||
return $vm;
|
||||
}
|
||||
|
||||
$result = $serviceVCenter->getVmPowerState($vm, $vm->vmware_id);
|
||||
|
||||
if ($result === 'Login_Again') {
|
||||
return response()->json(['success' => false, 'message' => 'Không thể đăng nhập vào vCenter.'], 400);
|
||||
}
|
||||
|
||||
if (is_array($result) && ($result['error'] ?? true)) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => $result['data'] ?? 'Không thể lấy trạng thái VM.',
|
||||
], 400);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'state' => $result['data']['state'] ?? null,
|
||||
'clean_power_off' => $result['data']['clean_power_off'] ?? null,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Shared helpers
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user