]> git.proxmox.com Git - pve-ha-manager.git/blob - src/PVE/HA/Sim/TestEnv.pm
always queue service stop if node shuts down
[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 Data::Dumper;
7 use JSON;
8 use IO::File;
9 use Fcntl qw(:DEFAULT :flock);
10
11 use PVE::HA::Tools;
12
13 use base qw(PVE::HA::Sim::Env);
14
15 sub new {
16 my ($this, $nodename, $hardware, $log_id) = @_;
17
18 my $class = ref($this) || $this;
19
20 my $self = $class->SUPER::new($nodename, $hardware, $log_id);
21
22 $self->{cur_time} = 0;
23 $self->{loop_delay} = 0;
24
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
30 return $self;
31 }
32
33 sub get_time {
34 my ($self) = @_;
35
36 return $self->{cur_time};
37 }
38
39 sub log {
40 my ($self, $level, $msg) = @_;
41
42 return if $level eq 'debug';
43
44 chomp $msg;
45
46 my $time = $self->get_time();
47 $level = substr( $level, 0, 4 );
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
56 sub sleep {
57 my ($self, $delay) = @_;
58
59 $self->{loop_delay} += $delay;
60 }
61
62 sub 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;
70 }
71
72 sub get_ha_manager_lock {
73 my ($self) = @_;
74
75 my $res = $self->SUPER::get_ha_manager_lock();
76 ++$self->{loop_delay};
77 return $res;
78 }
79
80 sub get_ha_agent_lock {
81 my ($self, $node) = @_;
82
83 my $res = $self->SUPER::get_ha_agent_lock($node);
84 ++$self->{loop_delay};
85
86 return $res;
87 }
88
89 sub loop_start_hook {
90 my ($self, $starttime) = @_;
91
92 $self->{loop_delay} = 0;
93
94 die "no starttime" if !defined($starttime);
95 die "strange start time" if $starttime < $self->{cur_time};
96
97 $self->{cur_time} = $starttime;
98
99 # do nothing
100 }
101
102 sub loop_end_hook {
103 my ($self) = @_;
104
105 my $delay = $self->{loop_delay};
106 $self->{loop_delay} = 0;
107
108 die "loop take too long ($delay seconds)\n" if $delay > 30;
109
110 # $self->{cur_time} += $delay;
111
112 $self->{cur_time} += 1; # easier for simulation
113 }
114
115 # must be 0 as we do not want to fork in the regression tests
116 sub get_max_workers {
117 my ($self) = @_;
118
119 return 0;
120 }
121
122 sub sendmail {
123 my ($self, $subject, $text) = @_;
124
125 # dismiss mails for regression tests
126 }
127
128 1;