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