MigrateVmJob.php 3.2 KB

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