]> git.proxmox.com Git - pve-ha-manager.git/blob - src/PVE/HA/Tools.pm
rename vm resource prefix: pvevm: => vm:
[pve-ha-manager.git] / src / PVE / HA / Tools.pm
1 package PVE::HA::Tools;
2
3 use strict;
4 use warnings;
5 use JSON;
6 use PVE::JSONSchema;
7 use PVE::Tools;
8
9 PVE::JSONSchema::register_format('pve-ha-resource-id', \&pve_verify_ha_resource_id);
10 sub pve_verify_ha_resource_id {
11 my ($sid, $noerr) = @_;
12
13 if ($sid !~ m/^[a-z]+:\S+$/) {
14 return undef if $noerr;
15 die "value does not look like a valid ha resource id\n";
16 }
17 return $sid;
18 }
19
20 PVE::JSONSchema::register_standard_option('pve-ha-resource-id', {
21 description => "HA resource ID. This consists of a resource type followed by a resource specific name, separated with collon (example: vm:100).",
22 typetext => "<type>:<name>",
23 type => 'string', format => 'pve-ha-resource-id',
24 });
25
26 PVE::JSONSchema::register_format('pve-ha-group-node', \&pve_verify_ha_group_node);
27 sub pve_verify_ha_group_node {
28 my ($node, $noerr) = @_;
29
30 if ($node !~ m/^([a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?)(:\d+)?$/) {
31 return undef if $noerr;
32 die "value does not look like a valid ha group node\n";
33 }
34 return $node;
35 }
36
37 PVE::JSONSchema::register_standard_option('pve-ha-group-node-list', {
38 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').",
39 type => 'string', format => 'pve-ha-group-node-list',
40 typetext => '<node>[:<pri>]{,<node>[:<pri>]}*',
41 });
42
43 PVE::JSONSchema::register_standard_option('pve-ha-group-id', {
44 description => "The HA group identifier.",
45 type => 'string', format => 'pve-configid',
46 });
47
48 sub parse_sid {
49 my ($sid) = @_;
50
51 my ($type, $name) = split(':', $sid, 2);
52
53 return wantarray ? ($type, $name) : $name;
54 }
55
56 sub read_json_from_file {
57 my ($filename, $default) = @_;
58
59 my $data;
60
61 if (defined($default) && (! -f $filename)) {
62 $data = $default;
63 } else {
64 my $raw = PVE::Tools::file_get_contents($filename);
65 $data = decode_json($raw);
66 }
67
68 return $data;
69 }
70
71 sub write_json_to_file {
72 my ($filename, $data) = @_;
73
74 my $raw = encode_json($data);
75
76 PVE::Tools::file_set_contents($filename, $raw);
77 }
78
79 sub count_fenced_services {
80 my ($ss, $node) = @_;
81
82 my $count = 0;
83
84 foreach my $sid (keys %$ss) {
85 my $sd = $ss->{$sid};
86 next if !$sd->{node};
87 next if $sd->{node} ne $node;
88 my $req_state = $sd->{state};
89 next if !defined($req_state);
90 if ($req_state eq 'fence') {
91 $count++;
92 next;
93 }
94 }
95
96 return $count;
97 }
98
99 1;