MigrateVmJob.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace ModulesGarden\ProxmoxAddon\App\Jobs\Cloud;
  3. use MGProvision\Proxmox\v2\models\Kvm;
  4. use ModulesGarden\ProxmoxAddon\App\Jobs\BaseJob;
  5. use ModulesGarden\ProxmoxAddon\App\Services\Cloud\HighAvailabilityClusterService;
  6. use ModulesGarden\ProxmoxAddon\App\Services\Cloud\HostingService;
  7. use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
  8. use function ModulesGarden\ProxmoxAddon\Core\Helper\sl;
  9. class MigrateVmJob extends BaseJob
  10. {
  11. use ProductService;
  12. use HostingService;
  13. /**
  14. * @var HighAvailabilityClusterService
  15. */
  16. protected $highAvailabilityClusterService;
  17. public function handle($text = null)
  18. {
  19. $this->initParams();
  20. $this->initServices();
  21. $this->initVm();
  22. $this->setHostingId($this->getWhmcsParamByKey("serviceid"));
  23. $this->highAvailabilityClusterService = new HighAvailabilityClusterService();
  24. //Migrate
  25. if (!$this->getModelData()['taskId'] || ($this->isTask() && !$this->isTaskRunning() && $this->isFailed())) {
  26. if($this->isTask() && $this->isFailed()){
  27. $this->log->error(ucfirst($this->getTask()->getExitstatus()));
  28. }
  29. $this->highAvailabilityClusterService->delete();
  30. //delete config
  31. $delete = (array)$this->getModelData()['config']['delete'];
  32. foreach (sl('Vm')->getVm()->config() as $k => $v) {
  33. if (preg_match('/cloudinit/', $v)) {
  34. sl('Vm')->getVm()->deleteConfig($k);
  35. $delete[$k] = $v;
  36. }
  37. }
  38. $taskId = sl('Vm')->getVm()->migrate([
  39. "target" => $this->getModelData()['targetNode'],
  40. "online" => $this->getModelData()['online'],
  41. ]);
  42. //save task id
  43. $this->putModelDataAndSave(["taskId" => $taskId, "node" => sl('Vm')->getVm()->getNode(), "migrate" => true, "config" => ["delete" => $delete]]);
  44. $this->log->info(sprintf("VM %s - Migrate", sl('Vm')->getVm()->getVmid()));
  45. //sleep
  46. $this->sleep(5);
  47. return false;
  48. } else if ($this->isDone()) {
  49. $this->getVmModel()->node = $this->getModelData()['targetNode'];
  50. $this->getVmModel()->save();
  51. sl('Vm')->getVm()->setNode($this->getModelData()['targetNode']);
  52. //restore config
  53. if(sl('Vm')->getVm() instanceof Kvm && !sl('Vm')->getVm()->hasCloudInit()){
  54. $delete = (array)$this->getModelData()['config']['delete'];
  55. foreach ($delete as $k => $v) {
  56. if (preg_match('/cloudinit/', $v)) {
  57. $ex = explode(":", $v);
  58. $storage = $ex[0];
  59. sl('Vm')->getVm()->updateConfig([$k => "{$storage}:cloudinit,format=raw"]);
  60. unset($delete[$k]);
  61. }
  62. }
  63. }
  64. if ($this->highAvailabilityClusterService->isConfigured()) {
  65. $this->highAvailabilityClusterService->create();
  66. }
  67. return true;
  68. } else if ($this->isTaskRunning()) {
  69. //sleep
  70. $this->sleep(5);
  71. return false;
  72. }
  73. }
  74. }