]> git.proxmox.com Git - pve-ha-manager.git/blob - PVE/HA/Sim/RTEnv.pm
add basic LRM functionality
[pve-ha-manager.git] / PVE / HA / Sim / RTEnv.pm
1 package PVE::HA::Sim::RTEnv;
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 return $self;
23 }
24
25 sub get_time {
26 my ($self) = @_;
27
28 return time();
29 }
30
31 sub log {
32 my ($self, $level, $msg) = @_;
33
34 chomp $msg;
35
36 my $time = $self->get_time();
37
38 printf("%-5s %10s %12s: $msg\n", $level, strftime("%H:%M:%S", localtime($time)),
39 "$self->{nodename}/$self->{log_id}");
40 }
41
42 sub sleep {
43 my ($self, $delay) = @_;
44
45 CORE::sleep($delay);
46 }
47
48 sub sleep_until {
49 my ($self, $end_time) = @_;
50
51 for (;;) {
52 my $cur_time = time();
53
54 last if $cur_time >= $end_time;
55
56 $self->sleep(1);
57 }
58 }
59
60 sub loop_start_hook {
61 my ($self) = @_;
62
63 $self->{loop_start} = $self->get_time();
64 }
65
66 sub loop_end_hook {
67 my ($self) = @_;
68
69 my $delay = $self->get_time() - $self->{loop_start};
70
71 die "loop take too long ($delay seconds)\n" if $delay > 30;
72 }
73
74 sub exec_resource_agent {
75 my ($self, $sid, $cmd, @params) = @_;
76
77 my $hardware = $self->{hardware};
78
79 my $ss = $hardware->read_service_status();
80
81 if ($cmd eq 'request_stop') {
82
83 if (!$ss->{$sid}) {
84 print "WORKER status $sid: stopped\n";
85 return 0;
86 } else {
87 print "WORKER status $sid: running\n";
88 return 1;
89 }
90
91 } elsif ($cmd eq 'start') {
92
93 if ($ss->{$sid}) {
94 print "WORKER status $sid: running\n";
95 return 0;
96 }
97 print "START WORKER $sid\n";
98
99 $self->sleep(2);
100
101 $ss->{$sid} = 1;
102 $hardware->write_service_status($ss);
103
104 print "END WORKER $sid\n";
105
106 return 0;
107
108 } elsif ($cmd eq 'stop') {
109
110 if (!$ss->{$sid}) {
111 print "WORKER status $sid: stopped\n";
112 return 0;
113 }
114 print "STOP WORKER $sid\n";
115
116 $self->sleep(2);
117
118 $ss->{$sid} = 0;
119 $hardware->write_service_status($ss);
120
121 print "END WORKER $sid\n";
122
123 return 0;
124 }
125
126 die "implement me";
127 }
128
129 1;