Implement VM deletion functionality and update related services; add confirmation check and logging
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Services\vCenter;
|
||||
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class DeleteVMService
|
||||
{
|
||||
protected Client $client;
|
||||
protected PowerShellService $powerShellService;
|
||||
|
||||
public function __construct(Client $client, PowerShellService $powerShellService)
|
||||
{
|
||||
$this->client = $client;
|
||||
$this->powerShellService = $powerShellService;
|
||||
}
|
||||
|
||||
protected function resolveVCenterFromProduct($product): ?\App\Models\vCenter
|
||||
{
|
||||
if ($product->vCenter) {
|
||||
return $product->vCenter;
|
||||
}
|
||||
|
||||
if ($product->ipaddress?->host?->datacenter?->vCenter) {
|
||||
return $product->ipaddress->host->datacenter->vCenter;
|
||||
}
|
||||
|
||||
$service = $product->services()->first();
|
||||
if ($service) {
|
||||
$service->load('vmware.vCenter');
|
||||
if ($service->vmware?->vCenter) {
|
||||
return $service->vmware->vCenter;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function deleteVM($product, string $confirmName): array
|
||||
{
|
||||
$vmName = (string) $product->name;
|
||||
|
||||
// ponytail: confirm guard — caller must pass exact vm name to proceed
|
||||
if ($confirmName !== $vmName) {
|
||||
return ['error' => true, 'message' => "Tên server xác nhận không khớp. Vui lòng nhập đúng: $vmName"];
|
||||
}
|
||||
|
||||
$vcenter = $this->resolveVCenterFromProduct($product);
|
||||
if (!$vcenter) {
|
||||
return ['error' => true, 'message' => 'Không tìm thấy thông tin vCenter cho VM'];
|
||||
}
|
||||
|
||||
$loginResult = $this->client->loginServer($vcenter);
|
||||
if (!$loginResult) {
|
||||
return ['error' => true, 'message' => 'Login_Again'];
|
||||
}
|
||||
|
||||
$check = $this->client->checkApiExits();
|
||||
if (!$check) {
|
||||
return ['error' => true, 'message' => 'Login_Again'];
|
||||
}
|
||||
|
||||
$host = $this->client->apiUri;
|
||||
$user = $this->client->getUsername();
|
||||
$password = $this->client->getPassword();
|
||||
|
||||
try {
|
||||
Log::channel('Custom')->info("===================================================================");
|
||||
Log::channel('Custom')->info("Delete VM - $vmName");
|
||||
|
||||
$command = "& 'C:\CLISave\DeleteVM\deleteVM.ps1' -VmName '$vmName' -VCenterHost '$host' -VCenterUser '$user' -VCenterPassword '$password'";
|
||||
Log::channel('Custom')->info("Executing deleteVM command for: $vmName");
|
||||
|
||||
$cmdResult = $this->powerShellService->executePowerCLI($command);
|
||||
Log::channel('Custom')->info("Command Result: " . $cmdResult);
|
||||
|
||||
if (strpos($cmdResult, 'Login_Fail') !== false) {
|
||||
return ['error' => true, 'message' => 'SSH Login to PowerShell server failed'];
|
||||
}
|
||||
|
||||
if (strpos($cmdResult, 'SUCCESS') === false) {
|
||||
return ['error' => true, 'message' => 'PowerShell command failed: ' . $cmdResult];
|
||||
}
|
||||
|
||||
Log::channel('Custom')->info("After run Command |" . now());
|
||||
Log::channel('Custom')->info("===================================================================");
|
||||
|
||||
return ['error' => false];
|
||||
} catch (\Exception $error) {
|
||||
Log::channel('Custom')->error("Delete VM error: " . $error->getMessage());
|
||||
return ['error' => true, 'message' => $error->getMessage()];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user