]> git.proxmox.com Git - pve-ha-manager.git/blame - src/PVE/HA/Sim/TestEnv.pm
Env: add sendmail
[pve-ha-manager.git] / src / PVE / HA / Sim / TestEnv.pm
CommitLineData
533d82ca 1package PVE::HA::Sim::TestEnv;
95ca6580
DM
2
3use strict;
4use warnings;
9ce193a0 5use POSIX qw(strftime EINTR);
91dab9ce 6use Data::Dumper;
158bd429 7use JSON;
9ce193a0
DM
8use IO::File;
9use Fcntl qw(:DEFAULT :flock);
95ca6580 10
17654a06 11use PVE::HA::Tools;
87b82b15
DM
12
13use base qw(PVE::HA::Sim::Env);
95ca6580 14
5a127c5f 15sub new {
bf93e2a2 16 my ($this, $nodename, $hardware, $log_id) = @_;
0bba8f60 17
733c8e5f 18 my $class = ref($this) || $this;
553197d3 19
87b82b15 20 my $self = $class->SUPER::new($nodename, $hardware, $log_id);
3c36cbca 21
f25a336a
DM
22 $self->{cur_time} = 0;
23 $self->{loop_delay} = 0;
24
8a6e5294
DM
25 my $statusdir = $self->{hardware}->statusdir();
26 my $logfile = "$statusdir/log";
27 $self->{logfh} = IO::File->new(">>$logfile") ||
28 die "unable to open '$logfile' - $!";
29
5a127c5f
DM
30 return $self;
31}
32
95ca6580
DM
33sub get_time {
34 my ($self) = @_;
35
f25a336a 36 return $self->{cur_time};
95ca6580
DM
37}
38
8a6e5294
DM
39sub log {
40 my ($self, $level, $msg) = @_;
41
9e115dd0
TL
42 return if $level eq 'debug';
43
8a6e5294
DM
44 chomp $msg;
45
46 my $time = $self->get_time();
41870e2b 47 $level = substr( $level, 0, 4 );
8a6e5294
DM
48
49 my $line = sprintf("%-5s %5d %12s: $msg\n", $level, $time, "$self->{nodename}/$self->{log_id}");
50 print $line;
51
52 $self->{logfh}->print($line);
53 $self->{logfh}->flush();
54}
55
95ca6580
DM
56sub sleep {
57 my ($self, $delay) = @_;
58
f25a336a
DM
59 $self->{loop_delay} += $delay;
60}
61
62sub sleep_until {
63 my ($self, $end_time) = @_;
64
65 my $cur_time = $self->{cur_time} + $self->{loop_delay};
66
67 return if $cur_time >= $end_time;
68
69 $self->{loop_delay} += $end_time - $cur_time;
95ca6580
DM
70}
71
0d00a7da
DM
72sub get_ha_manager_lock {
73 my ($self) = @_;
74
87b82b15 75 my $res = $self->SUPER::get_ha_manager_lock();
f25a336a 76 ++$self->{loop_delay};
158bd429 77 return $res;
95ca6580
DM
78}
79
3fed383d 80sub get_ha_agent_lock {
8a6e5294 81 my ($self, $node) = @_;
3fed383d 82
8a6e5294 83 my $res = $self->SUPER::get_ha_agent_lock($node);
3fed383d
DM
84 ++$self->{loop_delay};
85
86 return $res;
87}
88
95ca6580 89sub loop_start_hook {
733c8e5f 90 my ($self, $starttime) = @_;
95ca6580 91
f25a336a 92 $self->{loop_delay} = 0;
95ca6580 93
733c8e5f
DM
94 die "no starttime" if !defined($starttime);
95 die "strange start time" if $starttime < $self->{cur_time};
96
97 $self->{cur_time} = $starttime;
98
95ca6580
DM
99 # do nothing
100}
101
102sub loop_end_hook {
103 my ($self) = @_;
104
f25a336a
DM
105 my $delay = $self->{loop_delay};
106 $self->{loop_delay} = 0;
95ca6580 107
53a449bf 108 die "loop take too long ($delay seconds)\n" if $delay > 30;
95ca6580 109
17b5cf98
DM
110 # $self->{cur_time} += $delay;
111
112 $self->{cur_time} += 1; # easier for simulation
95ca6580
DM
113}
114
cde77779 115sub is_node_shutdown {
d42219a3
TL
116 my ($self) = @_;
117
118 my $node = $self->{nodename};
119 my $cstatus = $self->{hardware}->read_hardware_status_nolock();
120
121 die "undefined node status for node '$node'" if !defined($cstatus->{$node});
122
7987c18c 123 return defined($cstatus->{$node}->{shutdown}) ? 1 : 0;
d42219a3
TL
124}
125
a28fa330
TL
126# must be 0 as we do not want to fork in the regression tests
127sub get_max_workers {
128 my ($self) = @_;
129
130 return 0;
131}
132
1b3969b6
TL
133sub sendmail {
134 my ($self, $subject, $text) = @_;
135
136 # dismiss mails for regression tests
137}
138
95ca6580 1391;