]> git.proxmox.com Git - pve-ha-manager.git/blob - PVE/HA/Env/PVE2.pm
add basic LRM functionality
[pve-ha-manager.git] / PVE / HA / Env / PVE2.pm
1 package PVE::HA::Env::PVE2;
2
3 use strict;
4 use warnings;
5
6 use PVE::SafeSyslog;
7 use PVE::Tools;
8 use PVE::Cluster;
9
10 use PVE::HA::Tools;
11 use PVE::HA::Env;
12
13 my $manager_status_filename = "/etc/pve/manager_status";
14
15 sub new {
16 my ($this, $nodename) = @_;
17
18 die "missing nodename" if !$nodename;
19
20 my $class = ref($this) || $this;
21
22 my $self = bless {}, $class;
23
24 $self->{nodename} = $nodename;
25
26 return $self;
27 }
28
29 sub nodename {
30 my ($self) = @_;
31
32 return $self->{nodename};
33 }
34
35 sub read_manager_status {
36 my ($self) = @_;
37
38 my $filename = $manager_status_filename;
39
40 return PVE::HA::Tools::read_json_from_file($filename, {});
41 }
42
43 sub write_manager_status {
44 my ($self, $status_obj) = @_;
45
46 my $filename = $manager_status_filename;
47
48 PVE::HA::Tools::write_json_to_file($filename, $status_obj);
49 }
50
51 sub read_lrm_status {
52 my ($self, $node) = @_;
53
54 $node = $self->{nodename} if !defined($node);
55
56 my $filename = "/etc/pve/nodes/$node/lrm_status";
57
58 return PVE::HA::Tools::read_json_from_file($filename, {});
59 }
60
61 sub write_lrm_status {
62 my ($self, $status_obj) = @_;
63
64 $node = $self->{nodename};
65
66 my $filename = "/etc/pve/nodes/$node/lrm_status";
67
68 PVE::HA::Tools::write_json_to_file($filename, $status_obj);
69 }
70
71 sub manager_status_exists {
72 my ($self) = @_;
73
74 return -f $manager_status_filename ? 1 : 0;
75 }
76
77 sub read_service_config {
78 my ($self) = @_;
79
80 die "implement me";
81 }
82
83 # this should return a hash containing info
84 # what nodes are members and online.
85 sub get_node_info {
86 my ($self) = @_;
87
88 die "implement me";
89 }
90
91 sub log {
92 my ($self, $level, $msg) = @_;
93
94 chomp $msg;
95
96 syslog($level, $msg);
97 }
98
99 sub get_ha_manager_lock {
100 my ($self) = @_;
101
102 my $lockid = "ha_manager";
103
104 my $lockdir = "/etc/pve/priv/lock";
105 my $filename = "$lockdir/$lockid";
106
107 my $res = 0;
108
109 eval {
110
111 mkdir $lockdir;
112
113 return if ! -d $lockdir; # pve cluster filesystem not online
114
115 # fixme: ?
116 };
117
118 return $res;
119 }
120
121 sub get_ha_agent_lock {
122 my ($self) = @_;
123
124 die "implement me";
125 }
126
127 sub test_ha_agent_lock {
128 my ($self, $node) = @_;
129
130 die "implement me";
131 }
132
133 sub quorate {
134 my ($self) = @_;
135
136 my $quorate = 0;
137 eval {
138 $quorate = PVE::Cluster::check_cfs_quorum();
139 };
140
141 return $quorate;
142 }
143
144 sub get_time {
145 my ($self) = @_;
146
147 return time();
148 }
149
150 sub sleep {
151 my ($self, $delay) = @_;
152
153 CORE::sleep($delay);
154 }
155
156 sub sleep_until {
157 my ($self, $end_time) = @_;
158
159 for (;;) {
160 my $cur_time = time();
161
162 last if $cur_time >= $end_time;
163
164 $self->sleep(1);
165 }
166 }
167
168 sub loop_start_hook {
169 my ($self) = @_;
170
171 PVE::Cluster::cfs_update();
172
173 $self->{loop_start} = $self->get_time();
174 }
175
176 sub loop_end_hook {
177 my ($self) = @_;
178
179 my $delay = $self->get_time() - $self->{loop_start};
180
181 warn "loop take too long ($delay seconds)\n" if $delay > 30;
182 }
183
184 sub watchdog_open {
185 my ($self) = @_;
186
187 # Note: when using /dev/watchdog, make sure perl does not close
188 # the handle automatically at exit!!
189
190 die "implement me";
191 }
192
193 sub watchdog_update {
194 my ($self, $wfh) = @_;
195
196 die "implement me";
197 }
198
199 sub watchdog_close {
200 my ($self, $wfh) = @_;
201
202 die "implement me";
203 }
204
205 sub exec_resource_agent {
206 my ($self, $sid, $cmd, @params) = @_;
207
208 die "implement me";
209 }
210
211 1;