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