]> git.proxmox.com Git - pve-ha-manager.git/blob - src/PVE/HA/Sim/Resources.pm
fix 'change_service_location' misuse and recovery from fencing
[pve-ha-manager.git] / src / PVE / HA / Sim / Resources.pm
1 package PVE::HA::Sim::Resources;
2
3 use strict;
4 use warnings;
5
6 use base qw(PVE::HA::Resources);
7
8 # provides some base methods for virtual resources (used in simulation/testing).
9 # reduces code reuse and it's targeted for the main PVE service types, namely
10 # virtual machines (VM) and container (CT)
11
12 sub verify_name {
13 my ($class, $id) = @_;
14
15 die "invalid VMID '$id'\n" if $id !~ m/^[1-9][0-9]+$/;
16 }
17
18 sub options {
19 return {
20 state => { optional => 1 },
21 group => { optional => 1 },
22 comment => { optional => 1 },
23 max_restart => { optional => 1 },
24 max_relocate => { optional => 1 },
25 };
26 }
27
28 sub config_file {
29 my ($class, $id, $nodename) = @_;
30
31 my $service_type = $class->type();
32
33 # virtual path
34 return "$nodename/$service_type:$id";
35 }
36
37 sub start {
38 my ($class, $haenv, $id) = @_;
39
40 my $service_type = $class->type();
41 my $nodename = $haenv->nodename();
42 my $hardware = $haenv->hardware();
43 my $ss = $hardware->read_service_status($nodename);
44
45 $haenv->sleep(2);
46
47 $ss->{"$service_type:$id"} = 1;
48
49 $hardware->write_service_status($nodename, $ss);
50
51 }
52
53 sub shutdown {
54 my ($class, $haenv, $id) = @_;
55
56 my $service_type = $class->type();
57 my $nodename = $haenv->nodename();
58 my $hardware = $haenv->hardware();
59 my $ss = $hardware->read_service_status($nodename);
60
61 $haenv->sleep(2);
62
63 $ss->{"$service_type:$id"} = 0;
64
65 $hardware->write_service_status($nodename, $ss);
66 }
67
68 sub check_running {
69 my ($class, $haenv, $id) = @_;
70
71 my $service_type = $class->type();
72 my $nodename = $haenv->nodename();
73 my $hardware = $haenv->hardware();
74
75 my $ss = $hardware->read_service_status($nodename);
76
77 return ($ss->{"$service_type:$id"}) ? 1 : 0;
78 }
79
80
81 sub migrate {
82 my ($class, $haenv, $id, $target, $online) = @_;
83
84 my $sid = $class->type() . ":$id";
85 my $nodename = $haenv->nodename();
86 my $hardware = $haenv->hardware();
87 my $ss = $hardware->read_service_status($nodename);
88
89 my $cmd = $online ? "migrate" : "relocate";
90 $haenv->log("info", "service $sid - start $cmd to node '$target'");
91
92 # explicitly shutdown if $online isn't true (relocate)
93 if (!$online && $class->check_running($haenv, $id)) {
94 $haenv->log("info", "stopping service $sid (relocate)");
95 $class->shutdown($haenv, $id);
96 $haenv->log("info", "service status $sid stopped");
97 } else {
98 $haenv->sleep(2); # (live) migration time
99 }
100
101 $hardware->change_service_location($sid, $nodename, $target);
102 $haenv->log("info", "service $sid - end $cmd to node '$target'");
103 # ensure that the old node doesn't has the service anymore
104 delete $ss->{$sid};
105 $hardware->write_service_status($nodename, $ss);
106
107 # check if resource really moved
108 return defined($ss->{$sid}) ? 0 : 1;
109 }
110
111
112 1;