SnapshotVmJob.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace ModulesGarden\ProxmoxAddon\App\Jobs\Cloud;
  3. use MGProvision\Proxmox\v2\models\Kvm;
  4. use MGProvision\Proxmox\v2\models\Snapshot;
  5. use MGProvision\Proxmox\v2\repository\SnapshotRepository;
  6. use ModulesGarden\ProxmoxAddon\App\Jobs\BaseJob;
  7. use ModulesGarden\ProxmoxAddon\App\Models\SnapshotJob;
  8. use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
  9. use ModulesGarden\ProxmoxAddon\App\Enum\Cloud\ConfigurableOption;
  10. use function ModulesGarden\ProxmoxAddon\Core\Helper\sl;
  11. class SnapshotVmJob extends BaseJob
  12. {
  13. use ProductService;
  14. /**
  15. * @var SnapshotJob
  16. */
  17. private $snapshotJob;
  18. public function handle($text = null)
  19. {
  20. $this->initParams();
  21. $this->setHostingId($this->getWhmcsParamByKey("serviceid"));
  22. $this->initVm();
  23. if ($this->isDone())
  24. {
  25. return true;
  26. }
  27. elseif ($this->isTaskRunning())
  28. {
  29. //sleep
  30. $this->sleep(5);
  31. return false;
  32. }
  33. $this->clean();
  34. $snapshot = new Snapshot();
  35. $snapshot->setApi($this->api());
  36. $snapshot->setPath(sl('Vm')->getVm()->getPath() . "/snapshot");
  37. $snapshot->setAttributes([
  38. "name" => $this->getSnapshotJob()->name."_".$this->model->id,
  39. "description" => $this->snapshotJob->description,
  40. ]);
  41. if (!is_null($this->snapshotJob->vmstate ) && sl('Vm')->getVm() instanceof Kvm)
  42. {
  43. $snapshot->setVmstate($this->snapshotJob->vmstate );
  44. }
  45. $taskId = $snapshot->create();
  46. //save task id
  47. $this->putModelDataAndSave(["taskId" => $taskId, "node" => sl('Vm')->getVm()->getNode()]);
  48. //sleep
  49. $this->sleep(5);
  50. return false;
  51. }
  52. /**
  53. * @return SnapshotJob
  54. */
  55. private function getSnapshotJob(){
  56. return $this->snapshotJob = SnapshotJob::findOrFail($this->getModelData()['snapshotJobId']);
  57. }
  58. private function clean(){
  59. $limit = $this->getWhmcsConfigOption(ConfigurableOption::SNAPSHOTS, $this->configuration()->getSnapshotMaxFiles());
  60. if($limit=="-1"){
  61. return;
  62. }
  63. if(!$limit || !is_numeric($limit)){
  64. throw new \InvalidArgumentException("Snapshot limit cannot be empty");
  65. }
  66. $snapshotRepository = new SnapshotRepository();
  67. $snapshotRepository->setApi($this->api());
  68. $snapshotRepository->findByVm(sl('Vm')->getVm());
  69. $snapshotRepository->ignoreCurrent(true);
  70. if($snapshotRepository->count() < $limit){
  71. return;
  72. }
  73. $toDelete = (int) $snapshotRepository->count() - $limit;
  74. foreach ($snapshotRepository->sortBySnaptime()->fetch() as $entity)
  75. {
  76. if($toDelete <=0){
  77. break;
  78. }
  79. $entity->delete();
  80. $toDelete --;
  81. }
  82. }
  83. }