]> git.proxmox.com Git - pve-ha-manager.git/blame - src/PVE/HA/Resources/PVEVM.pm
cleanup backup & mounted locks after recovery (fixes #1100)
[pve-ha-manager.git] / src / PVE / HA / Resources / PVEVM.pm
CommitLineData
21ce53c3
TL
1package PVE::HA::Resources::PVEVM;
2
3use strict;
4use warnings;
5
33783485
TL
6use PVE::HA::Tools;
7
94cedf0f 8use PVE::QemuConfig;
21ce53c3
TL
9use PVE::QemuServer;
10use PVE::API2::Qemu;
11
12use base qw(PVE::HA::Resources);
13
14sub type {
15 return 'vm';
16}
17
18sub verify_name {
19 my ($class, $name) = @_;
20
21 die "invalid VMID\n" if $name !~ m/^[1-9][0-9]+$/;
22}
23
24sub 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
34sub config_file {
35 my ($class, $vmid, $nodename) = @_;
36
94cedf0f 37 return PVE::QemuConfig->config_file($vmid, $nodename);
21ce53c3
TL
38}
39
40sub 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
53sub 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);
33783485 64 PVE::HA::Tools::upid_wait($upid, $haenv);
21ce53c3
TL
65}
66
67sub 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);
33783485 81 PVE::HA::Tools::upid_wait($upid, $haenv);
21ce53c3
TL
82}
83
84
85sub 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)
0d5906f3 98 if (!$online && $class->check_running($haenv, $id)) {
21ce53c3
TL
99 $class->shutdown($haenv, $id);
100 }
101
ea28f873
TL
102 my $oldconfig = $class->config_file($id, $nodename);
103
21ce53c3 104 my $upid = PVE::API2::Qemu->migrate_vm($params);
33783485 105 PVE::HA::Tools::upid_wait($upid, $haenv);
ea28f873
TL
106
107 # check if vm really moved
108 return !(-f $oldconfig);
21ce53c3
TL
109}
110
111sub check_running {
0d5906f3 112 my ($class, $haenv, $vmid) = @_;
21ce53c3 113
0d5906f3
TL
114 my $nodename = $haenv->nodename();
115
116 return PVE::QemuServer::check_running($vmid, 1, $nodename);
21ce53c3
TL
117}
118
5dd3ed86
TL
119sub 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
21ce53c3 1421;