]>
git.proxmox.com Git - pve-ha-manager.git/blob - PVE/HA/Sim/RTEnv.pm
1 package PVE
::HA
::Sim
::RTEnv
;
5 use POSIX
qw(strftime EINTR);
9 use Fcntl
qw(:DEFAULT :flock);
13 use base
qw(PVE::HA::Sim::Env);
16 my ($this, $nodename, $hardware, $log_id) = @_;
18 my $class = ref($this) || $this;
20 my $self = $class->SUPER::new
($nodename, $hardware, $log_id);
32 my ($self, $level, $msg) = @_;
36 my $time = $self->get_time();
38 printf("%-5s %10s %12s: $msg\n", $level, strftime
("%H:%M:%S", localtime($time)),
39 "$self->{nodename}/$self->{log_id}");
43 my ($self, $delay) = @_;
49 my ($self, $end_time) = @_;
52 my $cur_time = time();
54 last if $cur_time >= $end_time;
63 $self->{loop_start
} = $self->get_time();
69 my $delay = $self->get_time() - $self->{loop_start
};
71 die "loop take too long ($delay seconds)\n" if $delay > 30;
74 sub exec_resource_agent
{
75 my ($self, $sid, $cmd, @params) = @_;
77 my $hardware = $self->{hardware
};
79 my $nodename = $self->{nodename
};
81 my $sc = $hardware->read_service_config($nodename);
83 # fixme: return valid_exit code (instead of using die)
85 die "no such service" if !$cd;
87 my $ss = $hardware->read_service_status($nodename);
89 if ($cmd eq 'started') {
91 # fixme: return valid_exit code
92 die "service '$sid' not on this node" if $cd->{node
} ne $nodename;
95 $self->log("info", "service status $sid: running");
98 $self->log("info", "starting service $sid");
103 $hardware->write_service_status($nodename, $ss);
105 $self->log("info", "service $sid started");
109 } elsif ($cmd eq 'request_stop' || $cmd eq 'stopped') {
111 # fixme: return valid_exit code
112 die "service '$sid' not on this node" if $cd->{node
} ne $nodename;
115 $self->log("info", "service status $sid: stopped");
118 $self->log("info", "stopping service $sid");
123 $hardware->write_service_status($nodename, $ss);
125 $self->log("info", "service $sid stopped");
129 } elsif ($cmd eq 'migrate') {
131 my $target = $params[0];
132 die "migrate '$sid' failed - missing target\n" if !defined($target);
134 if ($cd->{node
} eq $target) {
137 } elsif ($cd->{node
} eq $nodename) {
139 $self->log("info", "service $sid - start migrtaion to node '$target'");
141 $self->change_service_location($sid, $target);
142 $self->log("info", "service $sid - end migrtaion to node '$target'");
147 die "migrate '$sid' failed - service is not on this node\n";
153 die "implement me (cmd '$cmd')";