1 package PVE
::HA
::Tools
;
10 PVE
::JSONSchema
::register_format
('pve-ha-resource-id', \
&pve_verify_ha_resource_id
);
11 sub pve_verify_ha_resource_id
{
12 my ($sid, $noerr) = @_;
14 if ($sid !~ m/^[a-z]+:\S+$/) {
15 return undef if $noerr;
16 die "value does not look like a valid ha resource id\n";
21 PVE
::JSONSchema
::register_standard_option
('pve-ha-resource-id', {
22 description
=> "HA resource ID. This consists of a resource type followed by a resource specific name, separated with colon (example: vm:100 / ct:100).",
23 typetext
=> "<type>:<name>",
24 type
=> 'string', format
=> 'pve-ha-resource-id',
27 PVE
::JSONSchema
::register_format
('pve-ha-resource-or-vm-id', \
&pve_verify_ha_resource_or_vm_id
);
28 sub pve_verify_ha_resource_or_vm_id
{
29 my ($sid, $noerr) = @_;
31 if ($sid !~ m/^([a-z]+:\S+|\d+)$/) {
32 return undef if $noerr;
33 die "value does not look like a valid ha resource id\n";
38 PVE
::JSONSchema
::register_standard_option
('pve-ha-resource-or-vm-id', {
39 description
=> "HA resource ID. This consists of a resource type followed by a resource specific name, separated with colon (example: vm:100 / ct:100). For virtual machines and containers, you can simply use the VM or CT id as a shortcut (example: 100).",
40 typetext
=> "<type>:<name>",
41 type
=> 'string', format
=> 'pve-ha-resource-or-vm-id',
44 PVE
::JSONSchema
::register_format
('pve-ha-group-node', \
&pve_verify_ha_group_node
);
45 sub pve_verify_ha_group_node
{
46 my ($node, $noerr) = @_;
48 if ($node !~ m/^([a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?)(:\d+)?$/) {
49 return undef if $noerr;
50 die "value does not look like a valid ha group node\n";
55 PVE
::JSONSchema
::register_standard_option
('pve-ha-group-node-list', {
56 description
=> "List of cluster node names with optional priority. We use priority '0' as default. The CRM tries to run services on the node with higest priority (also see option 'nofailback').",
57 type
=> 'string', format
=> 'pve-ha-group-node-list',
58 typetext
=> '<node>[:<pri>]{,<node>[:<pri>]}*',
61 PVE
::JSONSchema
::register_standard_option
('pve-ha-group-id', {
62 description
=> "The HA group identifier.",
63 type
=> 'string', format
=> 'pve-configid',
71 if ($sid =~ m/^(\d+)$/) {
73 my $vmlist = PVE
::Cluster
::get_vmlist
();
74 if (defined($vmlist->{ids
}->{$name})) {
75 my $vm_type = $vmlist->{ids
}->{$name}->{type
};
76 if ($vm_type eq 'lxc') {
78 } elsif ($vm_type eq 'qemu') {
86 die "unable do add resource - VM/CT $1 does not exist\n";
88 } elsif ($sid =~m/^(\S+):(\S+)$/) {
92 die "unable to parse service id '$sid'\n";
95 return wantarray ?
($sid, $type, $name) : $sid;
98 sub read_json_from_file
{
99 my ($filename, $default) = @_;
103 if (defined($default) && (! -f
$filename)) {
106 my $raw = PVE
::Tools
::file_get_contents
($filename);
107 $data = decode_json
($raw);
113 sub write_json_to_file
{
114 my ($filename, $data) = @_;
116 my $raw = encode_json
($data);
118 PVE
::Tools
::file_set_contents
($filename, $raw);
121 sub count_fenced_services
{
122 my ($ss, $node) = @_;
126 foreach my $sid (keys %$ss) {
127 my $sd = $ss->{$sid};
128 next if !$sd->{node
};
129 next if $sd->{node
} ne $node;
130 my $req_state = $sd->{state};
131 next if !defined($req_state);
132 if ($req_state eq 'fence') {