]> git.proxmox.com Git - pve-ha-manager.git/blob - src/PVE/HA/Config.pm
vm_is_ha_managed: allow check on service state
[pve-ha-manager.git] / src / PVE / HA / Config.pm
1 package PVE::HA::Config;
2
3 use strict;
4 use warnings;
5 use JSON;
6
7 use PVE::HA::Tools;
8 use PVE::HA::Groups;
9 use PVE::HA::Resources;
10 use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_write_file cfs_lock_file);
11
12 PVE::HA::Groups->register();
13
14 PVE::HA::Groups->init();
15
16 PVE::HA::Resources::PVEVM->register();
17 PVE::HA::Resources::PVECT->register();
18 #PVE::HA::Resources::IPAddr->register();
19
20 PVE::HA::Resources->init();
21
22 my $manager_status_filename = "ha/manager_status";
23 my $ha_groups_config = "ha/groups.cfg";
24 my $ha_resources_config = "ha/resources.cfg";
25 my $crm_commands_filename = "ha/crm_commands";
26
27 cfs_register_file($crm_commands_filename,
28 sub { my ($fn, $raw) = @_; return defined($raw) ? $raw : ''; },
29 sub { my ($fn, $raw) = @_; return $raw; });
30 cfs_register_file($ha_groups_config,
31 sub { PVE::HA::Groups->parse_config(@_); },
32 sub { PVE::HA::Groups->write_config(@_); });
33 cfs_register_file($ha_resources_config,
34 sub { PVE::HA::Resources->parse_config(@_); },
35 sub { PVE::HA::Resources->write_config(@_); });
36 cfs_register_file($manager_status_filename,
37 \&json_reader,
38 \&json_writer);
39
40 sub json_reader {
41 my ($filename, $data) = @_;
42
43 return defined($data) ? decode_json($data) : {};
44 }
45
46 sub json_writer {
47 my ($filename, $data) = @_;
48
49 return encode_json($data);
50 }
51
52 sub 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
62 sub 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
72 sub parse_groups_config {
73 my ($filename, $raw) = @_;
74
75 return PVE::HA::Groups->parse_config($filename, $raw);
76 }
77
78 sub parse_resources_config {
79 my ($filename, $raw) = @_;
80
81 return PVE::HA::Resources->parse_config($filename, $raw);
82 }
83
84 sub resources_config_exists {
85
86 return (-f "/etc/pve/$ha_resources_config") ? 1 : 0;
87 }
88
89 sub read_resources_config {
90
91 return cfs_read_file($ha_resources_config);
92 }
93
94 sub read_group_config {
95
96 return cfs_read_file($ha_groups_config);
97 }
98
99 sub write_group_config {
100 my ($cfg) = @_;
101
102 cfs_write_file($ha_groups_config, $cfg);
103 }
104
105 sub write_resources_config {
106 my ($cfg) = @_;
107
108 cfs_write_file($ha_resources_config, $cfg);
109 }
110
111 sub read_manager_status {
112 my () = @_;
113
114 return cfs_read_file($manager_status_filename);
115 }
116
117 sub write_manager_status {
118 my ($status_obj) = @_;
119
120 cfs_write_file($manager_status_filename, $status_obj);
121 }
122
123 sub lock_ha_config {
124 my ($code, $errmsg) = @_;
125
126 # fixme: do not use cfs_lock_storage (replace with cfs_lock_ha)
127 my $res = PVE::Cluster::cfs_lock_storage("_ha_crm_commands", undef, $code);
128 my $err = $@;
129 if ($err) {
130 $errmsg ? die "$errmsg: $err" : die $err;
131 }
132 return $res;
133 }
134
135 sub queue_crm_commands {
136 my ($cmd) = @_;
137
138 chomp $cmd;
139
140 my $code = sub {
141 my $data = cfs_read_file($crm_commands_filename);
142 $data .= "$cmd\n";
143 cfs_write_file($crm_commands_filename, $data);
144 };
145
146 return lock_ha_config($code);
147 }
148
149 sub read_crm_commands {
150
151 my $code = sub {
152 my $data = cfs_read_file($crm_commands_filename);
153 cfs_write_file($crm_commands_filename, '');
154 return $data;
155 };
156
157 return lock_ha_config($code);
158 }
159
160 sub vm_is_ha_managed {
161 my ($vmid, $has_state) = @_;
162
163 my $conf = cfs_read_file($ha_resources_config);
164
165 my $types = PVE::HA::Resources->lookup_types();
166 foreach my $type (@$types) {
167 my $sid = "$type:$vmid";
168
169 if (my $vm = $conf->{ids}->{$sid}) {
170 $vm->{state} = 'enabled' if !defined($vm->{state});
171 return !defined($has_state) || $vm->{state} eq $has_state;
172 }
173 }
174
175 return undef;
176 }
177
178 1;