]> git.proxmox.com Git - pve-ha-manager.git/blob - src/PVE/HA/Resources/PVEVM.pm
buildsys: don't pull qemu/lxc during doc-generation
[pve-ha-manager.git] / src / PVE / HA / Resources / PVEVM.pm
1 package PVE::HA::Resources::PVEVM;
2
3 use strict;
4 use warnings;
5
6 use PVE::HA::Tools;
7
8 BEGIN {
9 if (!$ENV{PVE_GENERATING_DOCS}) {
10 require PVE::QemuConfig;
11 import PVE::QemuConfig;
12 require PVE::QemuServer;
13 import PVE::QemuServer;
14 require PVE::API2::Qemu;
15 import PVE::API2::Qemu;
16 }
17 }
18
19 use base qw(PVE::HA::Resources);
20
21 sub type {
22 return 'vm';
23 }
24
25 sub verify_name {
26 my ($class, $name) = @_;
27
28 die "invalid VMID\n" if $name !~ m/^[1-9][0-9]+$/;
29 }
30
31 sub options {
32 return {
33 state => { optional => 1 },
34 group => { optional => 1 },
35 comment => { optional => 1 },
36 max_restart => { optional => 1 },
37 max_relocate => { optional => 1 },
38 };
39 }
40
41 sub config_file {
42 my ($class, $vmid, $nodename) = @_;
43
44 return PVE::QemuConfig->config_file($vmid, $nodename);
45 }
46
47 sub exists {
48 my ($class, $vmid, $noerr) = @_;
49
50 my $vmlist = PVE::Cluster::get_vmlist();
51
52 if(!defined($vmlist->{ids}->{$vmid})) {
53 die "resource 'vm:$vmid' does not exists in cluster\n" if !$noerr;
54 return undef;
55 } else {
56 return 1;
57 }
58 }
59
60 sub start {
61 my ($class, $haenv, $id) = @_;
62
63 my $nodename = $haenv->nodename();
64
65 my $params = {
66 node => $nodename,
67 vmid => $id
68 };
69
70 my $upid = PVE::API2::Qemu->vm_start($params);
71 PVE::HA::Tools::upid_wait($upid, $haenv);
72 }
73
74 sub shutdown {
75 my ($class, $haenv, $id) = @_;
76
77 my $nodename = $haenv->nodename();
78 my $shutdown_timeout = 60; # fixme: make this configurable
79
80 my $params = {
81 node => $nodename,
82 vmid => $id,
83 timeout => $shutdown_timeout,
84 forceStop => 1,
85 };
86
87 my $upid = PVE::API2::Qemu->vm_shutdown($params);
88 PVE::HA::Tools::upid_wait($upid, $haenv);
89 }
90
91
92 sub migrate {
93 my ($class, $haenv, $id, $target, $online) = @_;
94
95 my $nodename = $haenv->nodename();
96
97 my $params = {
98 node => $nodename,
99 vmid => $id,
100 target => $target,
101 online => $online,
102 };
103
104 # explicitly shutdown if $online isn't true (relocate)
105 if (!$online && $class->check_running($haenv, $id)) {
106 $class->shutdown($haenv, $id);
107 }
108
109 my $oldconfig = $class->config_file($id, $nodename);
110
111 my $upid = PVE::API2::Qemu->migrate_vm($params);
112 PVE::HA::Tools::upid_wait($upid, $haenv);
113
114 # check if vm really moved
115 return !(-f $oldconfig);
116 }
117
118 sub check_running {
119 my ($class, $haenv, $vmid) = @_;
120
121 my $nodename = $haenv->nodename();
122
123 return PVE::QemuServer::check_running($vmid, 1, $nodename);
124 }
125
126 sub remove_locks {
127 my ($self, $haenv, $id, $locks, $service_node) = @_;
128
129 $service_node = $service_node || $haenv->nodename();
130
131 my $conf = PVE::QemuConfig->load_config($id, $service_node);
132
133 return undef if !defined($conf->{lock});
134
135 foreach my $lock (@$locks) {
136 if ($conf->{lock} eq $lock) {
137 delete $conf->{lock};
138
139 my $cfspath = PVE::QemuConfig->cfs_config_path($id, $service_node);
140 PVE::Cluster::cfs_write_file($cfspath, $conf);
141
142 return $lock;
143 }
144 }
145
146 return undef;
147 }
148
149 1;