]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/perl -w | |
2 | ||
3 | use lib qw(../../); | |
4 | use strict; | |
5 | use Storable qw(dclone); | |
6 | use Data::Dumper; | |
7 | use PVE::AutoBalloon; | |
8 | ||
9 | my $debug = 0; | |
10 | ||
11 | my $test_status1 = { | |
12 | 100 => { | |
13 | maxmem => GB(2), | |
14 | shares => 2000, | |
15 | balloon => GB(1), | |
16 | balloon_min => GB(1), | |
17 | freemem => MB(0), | |
18 | }, | |
19 | 101 => { | |
20 | maxmem => GB(2), | |
21 | shares => 1000, | |
22 | balloon => GB(1), | |
23 | balloon_min => GB(1), | |
24 | freemem => MB(0), | |
25 | }, | |
26 | }; | |
27 | ||
28 | abtest($test_status1, 0); | |
29 | abtest($test_status1, MB(90), 100 => MB(1060), 101 => MB(1030)); | |
30 | abtest($test_status1, MB(150), 100 => MB(1100), 101 => MB(1050)); | |
31 | abtest($test_status1, MB(270), 100 => MB(1100), 101 => MB(1090)); | |
32 | absim($test_status1, MB(180), 100 => MB(1120), 101 => MB(1060)); | |
33 | absim($test_status1, MB(270), 100 => MB(1180), 101 => MB(1090)); | |
34 | absim($test_status1, MB(600), 100 => MB(1300), 101 => MB(1300)); | |
35 | absim($test_status1, MB(900), 100 => MB(1600), 101 => MB(1300)); | |
36 | ||
37 | my $test_status2 = { | |
38 | 100 => { | |
39 | maxmem => GB(2), | |
40 | shares => 2000, | |
41 | balloon => GB(2), | |
42 | balloon_min => GB(2), | |
43 | freemem => MB(0), | |
44 | }, | |
45 | 101 => { | |
46 | maxmem => GB(2), | |
47 | shares => 1000, | |
48 | balloon => GB(1), | |
49 | balloon_min => GB(1), | |
50 | freemem => MB(0), | |
51 | }, | |
52 | }; | |
53 | ||
54 | abtest($test_status2, 0); | |
55 | abtest($test_status2, MB(18), 101 => MB(1018)); | |
56 | abtest($test_status2, MB(500), 101 => MB(1100)); | |
57 | ||
58 | my $test_status3 = { | |
59 | 100 => { | |
60 | maxmem => GB(2), | |
61 | shares => 2000, | |
62 | balloon => GB(2), | |
63 | balloon_min => GB(2), | |
64 | freemem => MB(0), | |
65 | }, | |
66 | 101 => { | |
67 | maxmem => GB(2), | |
68 | shares => 1000, | |
69 | balloon => GB(1)+MB(7), | |
70 | balloon_min => GB(1), | |
71 | freemem => MB(0), | |
72 | }, | |
73 | 102 => { | |
74 | maxmem => GB(2), | |
75 | shares => 1000, | |
76 | balloon => GB(1), | |
77 | balloon_min => GB(1), | |
78 | freemem => MB(512), | |
79 | }, | |
80 | }; | |
81 | ||
82 | abtest($test_status3, 0); | |
83 | abtest($test_status3, MB(11), 101 => MB(1018)); | |
84 | abtest($test_status3, MB(80), 101 => MB(1087)); | |
85 | abtest($test_status3, MB(200), 101 => MB(1107)); | |
86 | ||
87 | my $status = absim($test_status3, MB(593), 101 => MB(1300), 102 => MB(1300)); | |
88 | absim($status, -MB(200), 101 => MB(1200), 102 => MB(1200)); | |
89 | absim($status, -MB(400), 101 => MB(1200), 102 => GB(1)); | |
90 | absim($status, -MB(593), 101 => MB(1007), 102 => GB(1)); | |
91 | exit (0); | |
92 | ||
93 | sub abapply { | |
94 | my ($vmstatus, $res, $sum) = @_; | |
95 | ||
96 | my $changes = 0; | |
97 | my $abschanges = 0; | |
98 | foreach my $vmid (keys %$res) { | |
99 | my $diff = $res->{$vmid} - $vmstatus->{$vmid}->{balloon}; | |
100 | if ($diff != 0) { | |
101 | # fixme: adjust freemem ? | |
102 | $vmstatus->{$vmid}->{freemem} += $diff; | |
103 | $vmstatus->{$vmid}->{freemem} = 0 if $vmstatus->{$vmid}->{freemem} < 0; | |
104 | $vmstatus->{$vmid}->{balloon} = $res->{$vmid}; | |
105 | $sum->{$vmid} = $res->{$vmid}; | |
106 | $changes += $diff; | |
107 | $abschanges += $diff > 0 ? $diff : -$diff; | |
108 | } | |
109 | } | |
110 | ||
111 | return ($changes, $abschanges); | |
112 | } | |
113 | ||
114 | my $tcount = 0; | |
115 | sub absim { | |
116 | my ($vmstatus, $goal, %expect) = @_; | |
117 | ||
118 | $tcount++; | |
119 | ||
120 | print "BALLOON SIM $tcount\n" if $debug; | |
121 | ||
122 | $vmstatus = dclone($vmstatus); # do not change original | |
123 | ||
124 | my $changes = 0; | |
125 | my $abschanges = 0; | |
126 | my $sum = {}; | |
127 | do { | |
128 | my $res = PVE::AutoBalloon::compute_alg1($vmstatus, $goal, MB(100), $debug); | |
129 | print Dumper($res) if $debug; | |
130 | ($changes, $abschanges) = abapply($vmstatus, $res, $sum); | |
131 | $goal -= $changes; | |
132 | } while ($abschanges); | |
133 | ||
134 | abcheck($sum, %expect); | |
135 | ||
136 | print "BALLOON SIM END\n" if $debug; | |
137 | print Dumper($vmstatus) if $debug; | |
138 | ||
139 | return $vmstatus; | |
140 | } | |
141 | ||
142 | sub abcheck { | |
143 | my ($res, %expect) = @_; | |
144 | ||
145 | foreach my $vmid (keys %expect) { | |
146 | my $ev = $expect{$vmid}; | |
147 | if (defined ($res->{$vmid})) { | |
148 | die "T$tcount: wrong value for VM $vmid ($ev != $res->{$vmid})\n" | |
149 | if $ev != $res->{$vmid}; | |
150 | } else { | |
151 | die "T$tcount: missing value for VM $vmid (extected $ev)\n"; | |
152 | } | |
153 | } | |
154 | ||
155 | foreach my $vmid (keys %$res) { | |
156 | die "T$tcount: got unexpected result for $vmid\n" | |
157 | if (defined($res->{$vmid}) && | |
158 | !defined($expect{$vmid})); | |
159 | } | |
160 | } | |
161 | ||
162 | sub abtest { | |
163 | my ($vmstatus, $goal, %expect) = @_; | |
164 | ||
165 | $tcount++; | |
166 | ||
167 | print "BALLOON TEST $tcount\n" if $debug; | |
168 | my $res = PVE::AutoBalloon::compute_alg1($vmstatus, $goal, MB(100), $debug); | |
169 | print Dumper($res) if $debug; | |
170 | ||
171 | abcheck($res, %expect); | |
172 | ||
173 | print "\n\n" if $debug; | |
174 | ||
175 | return $res; | |
176 | } | |
177 | ||
178 | sub MB { | |
179 | my $mb = shift; | |
180 | return $mb*1000*1000; | |
181 | }; | |
182 | sub GB { | |
183 | my $gb = shift; | |
184 | return $gb*1000*1000*1000; | |
185 | }; |