]> git.proxmox.com Git - pve-ha-manager.git/blob - src/PVE/HA/Sim/TestEnv.pm
replace can_fork with get_max_workers
[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 chomp $msg;
43
44 my $time = $self->get_time();
45
46 my $line = sprintf("%-5s %5d %12s: $msg\n", $level, $time, "$self->{nodename}/$self->{log_id}");
47 print $line;
48
49 $self->{logfh}->print($line);
50 $self->{logfh}->flush();
51 }
52
53 sub sleep {
54 my ($self, $delay) = @_;
55
56 $self->{loop_delay} += $delay;
57 }
58
59 sub sleep_until {
60 my ($self, $end_time) = @_;
61
62 my $cur_time = $self->{cur_time} + $self->{loop_delay};
63
64 return if $cur_time >= $end_time;
65
66 $self->{loop_delay} += $end_time - $cur_time;
67 }
68
69 sub get_ha_manager_lock {
70 my ($self) = @_;
71
72 my $res = $self->SUPER::get_ha_manager_lock();
73 ++$self->{loop_delay};
74 return $res;
75 }
76
77 sub get_ha_agent_lock {
78 my ($self, $node) = @_;
79
80 my $res = $self->SUPER::get_ha_agent_lock($node);
81 ++$self->{loop_delay};
82
83 return $res;
84 }
85
86 sub loop_start_hook {
87 my ($self, $starttime) = @_;
88
89 $self->{loop_delay} = 0;
90
91 die "no starttime" if !defined($starttime);
92 die "strange start time" if $starttime < $self->{cur_time};
93
94 $self->{cur_time} = $starttime;
95
96 # do nothing
97 }
98
99 sub loop_end_hook {
100 my ($self) = @_;
101
102 my $delay = $self->{loop_delay};
103 $self->{loop_delay} = 0;
104
105 die "loop take too long ($delay seconds)\n" if $delay > 30;
106
107 # $self->{cur_time} += $delay;
108
109 $self->{cur_time} += 1; # easier for simulation
110 }
111
112 sub is_node_shutdown {
113 my ($self) = @_;
114
115 my $node = $self->{nodename};
116 my $cstatus = $self->{hardware}->read_hardware_status_nolock();
117
118 die "undefined node status for node '$node'" if !defined($cstatus->{$node});
119
120 return defined($cstatus->{$node}->{shutdown}) ? 1 : 0;
121 }
122
123 # must be 0 as we do not want to fork in the regression tests
124 sub get_max_workers {
125 my ($self) = @_;
126
127 return 0;
128 }
129
130 1;