]> git.proxmox.com Git - pve-ha-manager.git/blame - src/PVE/HA/Config.pm
add test to for previous commit
[pve-ha-manager.git] / src / PVE / HA / Config.pm
CommitLineData
cc32b737
DM
1package PVE::HA::Config;
2
3use strict;
4use warnings;
139a9b90 5use JSON;
cc32b737 6
139a9b90 7use PVE::HA::Tools;
cc32b737
DM
8use PVE::HA::Groups;
9use PVE::HA::Resources;
139a9b90 10use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_write_file cfs_lock_file);
cc32b737
DM
11
12PVE::HA::Groups->register();
13
14PVE::HA::Groups->init();
15
16PVE::HA::Resources::PVEVM->register();
8facb786 17PVE::HA::Resources::PVECT->register();
85d36c36 18#PVE::HA::Resources::IPAddr->register();
cc32b737
DM
19
20PVE::HA::Resources->init();
21
139a9b90
DM
22my $manager_status_filename = "ha/manager_status";
23my $ha_groups_config = "ha/groups.cfg";
24my $ha_resources_config = "ha/resources.cfg";
25my $crm_commands_filename = "ha/crm_commands";
26
27cfs_register_file($crm_commands_filename,
28 sub { my ($fn, $raw) = @_; return defined($raw) ? $raw : ''; },
29 sub { my ($fn, $raw) = @_; return $raw; });
30cfs_register_file($ha_groups_config,
31 sub { PVE::HA::Groups->parse_config(@_); },
32 sub { PVE::HA::Groups->write_config(@_); });
33cfs_register_file($ha_resources_config,
34 sub { PVE::HA::Resources->parse_config(@_); },
35 sub { PVE::HA::Resources->write_config(@_); });
36cfs_register_file($manager_status_filename,
37 \&json_reader,
38 \&json_writer);
39
40sub json_reader {
41 my ($filename, $data) = @_;
42
b96c37ec 43 return defined($data) ? decode_json($data) : {};
139a9b90
DM
44}
45
46sub json_writer {
47 my ($filename, $data) = @_;
48
49 return encode_json($data);
50}
51
52sub read_lrm_status {
53 my ($node) = @_;
54
55 die "undefined node" if !defined($node);
56
57 my $filename = "/etc/pve/nodes/$node/lrm_status";
58
59 return PVE::HA::Tools::read_json_from_file($filename, {});
60}
61
62sub write_lrm_status {
63 my ($node, $status_obj) = @_;
64
65 die "undefined node" if !defined($node);
66
67 my $filename = "/etc/pve/nodes/$node/lrm_status";
68
69 PVE::HA::Tools::write_json_to_file($filename, $status_obj);
70}
71
cc32b737
DM
72sub parse_groups_config {
73 my ($filename, $raw) = @_;
74
139a9b90 75 return PVE::HA::Groups->parse_config($filename, $raw);
cc32b737
DM
76}
77
ce216792 78sub parse_resources_config {
cc32b737
DM
79 my ($filename, $raw) = @_;
80
81 return PVE::HA::Resources->parse_config($filename, $raw);
82}
83
b83b4ae8
DM
84sub resources_config_exists {
85
86 return (-f "/etc/pve/$ha_resources_config") ? 1 : 0;
87}
88
139a9b90
DM
89sub read_resources_config {
90
91 return cfs_read_file($ha_resources_config);
92}
93
94sub read_group_config {
139a9b90
DM
95
96 return cfs_read_file($ha_groups_config);
97}
98
9eb0f126
DM
99sub write_group_config {
100 my ($cfg) = @_;
101
102 cfs_write_file($ha_groups_config, $cfg);
103}
104
139a9b90
DM
105sub write_resources_config {
106 my ($cfg) = @_;
107
108 cfs_write_file($ha_resources_config, $cfg);
109}
110
111sub read_manager_status {
112 my () = @_;
113
114 return cfs_read_file($manager_status_filename);
115}
116
117sub write_manager_status {
118 my ($status_obj) = @_;
119
120 cfs_write_file($manager_status_filename, $status_obj);
121}
122
66c7e7ef 123sub lock_ha_domain {
139a9b90
DM
124 my ($code, $errmsg) = @_;
125
66c7e7ef 126 my $res = PVE::Cluster::cfs_lock_domain("ha", undef, $code);
139a9b90
DM
127 my $err = $@;
128 if ($err) {
129 $errmsg ? die "$errmsg: $err" : die $err;
130 }
131 return $res;
132}
133
134sub queue_crm_commands {
135 my ($cmd) = @_;
136
137 chomp $cmd;
138
139 my $code = sub {
140 my $data = cfs_read_file($crm_commands_filename);
141 $data .= "$cmd\n";
142 cfs_write_file($crm_commands_filename, $data);
143 };
144
66c7e7ef 145 return lock_ha_domain($code);
139a9b90
DM
146}
147
148sub read_crm_commands {
149
150 my $code = sub {
151 my $data = cfs_read_file($crm_commands_filename);
152 cfs_write_file($crm_commands_filename, '');
153 return $data;
154 };
155
66c7e7ef 156 return lock_ha_domain($code);
139a9b90
DM
157}
158
e709d3d0
DM
159my $servive_check_ha_state = sub {
160 my ($conf, $sid, $has_state) = @_;
161
162 if (my $d = $conf->{ids}->{$sid}) {
163 return 1 if !defined($has_state);
164
165 $d->{state} = 'enabled' if !defined($d->{state});
166 return 1 if $d->{state} eq $has_state;
167 }
168
169 return undef;
170};
171
139a9b90 172sub vm_is_ha_managed {
55c82a65 173 my ($vmid, $has_state) = @_;
139a9b90
DM
174
175 my $conf = cfs_read_file($ha_resources_config);
176
8facb786 177 my $types = PVE::HA::Resources->lookup_types();
e709d3d0
DM
178 foreach my $type ('vm', 'ct') {
179 return 1 if &$servive_check_ha_state($conf, "$type:$vmid", $has_state);
180 }
8facb786
TL
181
182 return undef;
139a9b90
DM
183}
184
9e03f787
TL
185sub service_is_ha_managed {
186 my ($sid, $has_state, $noerr) = @_;
187
188 my $conf = cfs_read_file($ha_resources_config);
189
e709d3d0 190 return 1 if &$servive_check_ha_state($conf, $sid, $has_state);
9e03f787
TL
191
192 die "resource '$sid' is not HA managed\n" if !$noerr;
193
194 return undef;
195}
cc32b737 1961;