]> git.proxmox.com Git - pve-ha-manager.git/blame - src/PVE/HA/Resources.pm
use helpers to enable advanced auto completion
[pve-ha-manager.git] / src / PVE / HA / Resources.pm
CommitLineData
a223f4cc
DM
1package PVE::HA::Resources;
2
3use strict;
4use warnings;
5
6use Data::Dumper;
7use PVE::JSONSchema qw(get_standard_option);
8use PVE::SectionConfig;
9use PVE::HA::Tools;
10
11use base qw(PVE::SectionConfig);
12
13my $defaultData = {
14 propertyList => {
95ea5d67 15 type => { description => "Resource type.", optional => 1 },
73bede9b
TL
16 sid => get_standard_option('pve-ha-resource-or-vm-id',
17 { completion => \&PVE::HA::Tools::complete_sid }),
7a19642e
DM
18 state => {
19 description => "Resource state.",
20 type => 'string',
21 enum => ['enabled', 'disabled'],
22 optional => 1,
95ea5d67 23 default => 'enabled',
7a19642e 24 },
73bede9b
TL
25 group => get_standard_option('pve-ha-group-id',
26 { optional => 1,
27 completion => \&PVE::HA::Tools::complete_group }),
a223f4cc
DM
28 comment => {
29 description => "Description.",
30 type => 'string',
31 optional => 1,
32 maxLength => 4096,
33 },
34 },
35};
36
37sub verify_name {
38 my ($class, $name) = @_;
39
40 die "implement this in subclass";
41}
42
43sub private {
44 return $defaultData;
45}
46
95ea5d67
DM
47sub format_section_header {
48 my ($class, $type, $sectionId) = @_;
49
50 my (undef, $name) = split(':', $sectionId, 2);
51
52 return "$type: $name\n";
53}
54
a223f4cc
DM
55sub parse_section_header {
56 my ($class, $line) = @_;
57
58 if ($line =~ m/^(\S+):\s*(\S+)\s*$/) {
59 my ($type, $name) = (lc($1), $2);
60 my $errmsg = undef; # set if you want to skip whole section
61 eval {
62 if (my $plugin = $defaultData->{plugins}->{$type}) {
63 $plugin->verify_name($name);
85d36c36
DM
64 } else {
65 die "no such resource type '$type'\n";
a223f4cc 66 }
a223f4cc
DM
67 };
68 $errmsg = $@ if $@;
95ea5d67 69 my $config = {}; # to return additional attributes
a223f4cc
DM
70 return ($type, "$type:$name", $errmsg, $config);
71 }
72 return undef;
73}
74
3d60e54f
TL
75sub start {
76 die "implement in subclass";
77}
78
79sub shutdown {
80 die "implement in subclass";
81}
82
83sub migrate {
84 die "implement in subclass";
85}
86
87sub config_file {
88 die "implement in subclass"
89}
90
91sub check_running {
92 die "implement in subclass";
93}
94
95
96# virtual machine resource class
a223f4cc
DM
97package PVE::HA::Resources::PVEVM;
98
99use strict;
100use warnings;
101
3d60e54f
TL
102use PVE::QemuServer;
103use PVE::API2::Qemu;
104
a223f4cc
DM
105use base qw(PVE::HA::Resources);
106
107sub type {
eda9314d 108 return 'vm';
a223f4cc
DM
109}
110
111sub verify_name {
112 my ($class, $name) = @_;
113
95ea5d67 114 die "invalid VMID\n" if $name !~ m/^[1-9][0-9]+$/;
a223f4cc
DM
115}
116
117sub options {
118 return {
95ea5d67 119 state => { optional => 1 },
a223f4cc
DM
120 group => { optional => 1 },
121 comment => { optional => 1 },
122 };
123}
124
3d60e54f
TL
125sub config_file {
126 my ($class, $vmid, $nodename) = @_;
127
128 return PVE::QemuServer::config_file($vmid, $nodename);
129}
130
131sub start {
132 my ($class, $haenv, $params) = @_;
133
134 my $upid = PVE::API2::Qemu->vm_start($params);
135 $haenv->upid_wait($upid);
136}
137
138sub shutdown {
139 my ($class, $haenv, $param) = @_;
140
141 my $upid = PVE::API2::Qemu->vm_shutdown($param);
142 $haenv->upid_wait($upid);
143}
144
145
146sub migrate {
147 my ($class, $haenv, $params) = @_;
148
149 my $upid = PVE::API2::Qemu->migrate_vm($params);
150 $haenv->upid_wait($upid);
151}
152
153sub check_running {
154 my ($class, $vmid) = @_;
155
156 return PVE::QemuServer::check_running($vmid, 1);
157}
158
159
160# container resource class
161package PVE::HA::Resources::PVECT;
162
163use strict;
164use warnings;
165
166use PVE::LXC;
167use PVE::API2::LXC::Status;
168
169use base qw(PVE::HA::Resources);
170
171sub type {
172 return 'ct';
173}
174
175sub verify_name {
176 my ($class, $name) = @_;
177
178 die "invalid VMID\n" if $name !~ m/^[1-9][0-9]+$/;
179}
180
181sub options {
182 return {
183 state => { optional => 1 },
184 group => { optional => 1 },
185 comment => { optional => 1 },
186 };
187}
188
189sub config_file {
190 my ($class, $vmid, $nodename) = @_;
191
192 return PVE::LXC::config_file($vmid, $nodename);
193}
194
195sub start {
196 my ($class, $haenv, $params) = @_;
197
198 my $upid = PVE::API2::LXC::Status->vm_start($params);
199 $haenv->upid_wait($upid);
200}
201
202sub shutdown {
203 my ($class, $haenv, $params) = @_;
204
205 my $upid = PVE::API2::LXC::Status->vm_shutdown($params);
206 $haenv->upid_wait($upid);
207}
208
209sub migrate {
210 my ($class, $haenv, $params) = @_;
211
212 my $upid = PVE::API2::LXC->migrate_vm($params);
213 $haenv->upid_wait($upid);
214}
215
216sub check_running {
217 my ($class, $vmid) = @_;
218
219 return PVE::LXC::check_running($vmid);
220}
221
222
85d36c36 223# package PVE::HA::Resources::IPAddr;
a223f4cc 224
85d36c36
DM
225# use strict;
226# use warnings;
227# use PVE::Tools qw($IPV4RE $IPV6RE);
a223f4cc 228
85d36c36 229# use base qw(PVE::HA::Resources);
a223f4cc 230
85d36c36
DM
231# sub type {
232# return 'ipaddr';
233# }
a223f4cc 234
85d36c36
DM
235# sub verify_name {
236# my ($class, $name) = @_;
a223f4cc 237
85d36c36
DM
238# die "invalid IP address\n" if $name !~ m!^$IPV6RE|$IPV4RE$!;
239# }
a223f4cc 240
85d36c36
DM
241# sub options {
242# return {
243# state => { optional => 1 },
244# group => { optional => 1 },
245# comment => { optional => 1 },
246# };
247# }
a223f4cc
DM
248
2491;