]> git.proxmox.com Git - pve-ha-manager.git/blob - src/PVE/HA/Sim/TestEnv.pm
sim: show sent emails in regression tests
[pve-ha-manager.git] / src / PVE / HA / Sim / TestEnv.pm
1 package PVE::HA::Sim::TestEnv;
2
3 use strict;
4 use warnings;
5 use POSIX qw(strftime EINTR);
6 use JSON;
7 use IO::File;
8 use Fcntl qw(:DEFAULT :flock);
9
10 use PVE::HA::Tools;
11
12 use base qw(PVE::HA::Sim::Env);
13
14 sub new {
15 my ($this, $nodename, $hardware, $log_id) = @_;
16
17 my $class = ref($this) || $this;
18
19 my $self = $class->SUPER::new($nodename, $hardware, $log_id);
20
21 $self->{cur_time} = 0;
22 $self->{loop_delay} = 0;
23
24 my $statusdir = $self->{hardware}->statusdir();
25 my $logfile = "$statusdir/log";
26 $self->{logfh} = IO::File->new(">>$logfile") ||
27 die "unable to open '$logfile' - $!";
28
29 return $self;
30 }
31
32 sub get_time {
33 my ($self) = @_;
34
35 return $self->{cur_time};
36 }
37
38 sub log {
39 my ($self, $level, $msg) = @_;
40
41 return if $level eq 'debug';
42
43 chomp $msg;
44
45 my $time = $self->get_time();
46 $level = substr( $level, 0, 4 );
47
48 my $line = sprintf("%-5s %5d %12s: $msg\n", $level, $time, "$self->{nodename}/$self->{log_id}");
49 print $line;
50
51 $self->{logfh}->print($line);
52 $self->{logfh}->flush();
53 }
54
55 sub sleep {
56 my ($self, $delay) = @_;
57
58 $self->{loop_delay} += $delay;
59 }
60
61 sub sleep_until {
62 my ($self, $end_time) = @_;
63
64 my $cur_time = $self->{cur_time} + $self->{loop_delay};
65
66 return if $cur_time >= $end_time;
67
68 $self->{loop_delay} += $end_time - $cur_time;
69 }
70
71 sub get_ha_manager_lock {
72 my ($self) = @_;
73
74 my $res = $self->SUPER::get_ha_manager_lock();
75 ++$self->{loop_delay};
76 return $res;
77 }
78
79 sub get_ha_agent_lock {
80 my ($self, $node) = @_;
81
82 my $res = $self->SUPER::get_ha_agent_lock($node);
83 ++$self->{loop_delay};
84
85 return $res;
86 }
87
88 sub loop_start_hook {
89 my ($self) = @_;
90
91 $self->{loop_delay} = 0;
92
93 my $starttime = $self->{hardware}->get_time();
94 die "strange start time" if $starttime < $self->{cur_time};
95
96 $self->{cur_time} = $starttime;
97
98 # do nothing
99 }
100
101 sub loop_end_hook {
102 my ($self) = @_;
103
104 my $delay = $self->{loop_delay};
105 $self->{loop_delay} = 0;
106
107 die "loop take too long ($delay seconds)\n" if $delay > 30;
108
109 # $self->{cur_time} += $delay;
110
111 $self->{cur_time} += 1; # easier for simulation
112 }
113
114 # must be 0 as we do not want to fork in the regression tests
115 sub get_max_workers {
116 my ($self) = @_;
117
118 return 0;
119 }
120
121 1;